{"version":3,"sources":["webpack:///./node_modules/jspreadsheet-ce/dist/index.js","webpack:///./node_modules/jsuites/dist/jsuites.js"],"names":["jSuites","global","factory","module","exports","this","Version","info","title","version","type","host","license","print","join","jexcel","el","options","obj","Element","HTMLDocument","console","error","tagName","createFromTable","div","document","createElement","parentNode","insertBefore","remove","defaults","url","method","requestVariables","data","sorting","copyCompatibility","root","rows","columns","colHeaders","colWidths","colAlignments","nestedHeaders","defaultColWidth","defaultColAlign","minSpareRows","minSpareCols","minDimensions","allowExport","includeHeadersOnDownload","includeHeadersOnCopy","columnSorting","columnDrag","columnResize","rowResize","rowDrag","editable","allowInsertRow","allowManualInsertRow","allowInsertColumn","allowManualInsertColumn","allowDeleteRow","allowDeletingAllRows","allowDeleteColumn","allowRenameColumn","allowComments","wordWrap","imageOptions","csv","csvFileName","csvHeaders","csvDelimiter","parseTableFirstRowAsHeader","parseTableAutoCellType","selectionCopy","mergeCells","toolbar","search","pagination","paginationOptions","fullscreen","lazyLoading","loadingSpin","tableOverflow","tableHeight","tableWidth","textOverflow","meta","style","classes","parseFormulas","autoIncrement","autoCasting","secureFormulas","stripHTML","stripHTMLOnCopy","filters","footers","onundo","onredo","onload","onchange","oncomments","onbeforechange","onafterchanges","onbeforeinsertrow","oninsertrow","onbeforeinsertcolumn","oninsertcolumn","onbeforedeleterow","ondeleterow","onbeforedeletecolumn","ondeletecolumn","onmoverow","onmovecolumn","onresizerow","onresizecolumn","onsort","onselection","oncopy","onpaste","onbeforepaste","onmerge","onfocus","onblur","onchangeheader","oncreateeditor","oneditionstart","oneditionend","onchangestyle","onchangemeta","onchangepage","onbeforesave","onsave","onevent","persistance","updateTable","detachForUpdates","freezeColumns","text","noRecordsFound","showingPage","show","entries","columnName","insertANewColumnBefore","insertANewColumnAfter","deleteSelectedColumns","renameThisColumn","orderAscending","orderDescending","insertANewRowBefore","insertANewRowAfter","deleteSelectedRows","editComments","addComments","comments","clearComments","copy","paste","saveAs","about","areYouSureToDeleteTheSelectedRows","areYouSureToDeleteTheSelectedColumns","thisActionWillDestroyAnyExistingMergedCellsAreYouSure","thisActionWillClearYourSearchResultsAreYouSure","thereIsAConflictWithAnotherMergedCell","invalidMergeProperties","cellAlreadyMerged","noCellsSelected","property","hasOwnProperty","textKey","corner","contextMenu","textarea","ads","content","table","thead","tbody","results","searchInput","pageNumber","headerContainer","colgroupContainer","headers","records","history","formula","colgroup","selection","highlighted","selectedCell","selectedContainer","filter","cursor","historyIndex","ignoreEvents","ignoreHistory","edition","hashString","resizing","dragging","activate","classList","add","dispatch","event","ret","apply","arguments","Array","prototype","slice","call","prepareJson","save","prepareTable","size","length","keys","Object","multiple","i","name","source","editor","allowEmpty","width","align","push","index","dataType","success","format","ajax","createTable","onscroll","e","scrollControls","onwheel","wheelControls","searchContainer","searchText","createTextNode","appendChild","resetSelection","paginationUpdateContainer","paginationDropdown","parseInt","value","page","temp","innerHTML","tempCol","setAttribute","j","createNestedHeader","createCellHeader","td","className","display","id","tabIndex","contextmenu","onclick","close","sessionStorage","getItem","setItem","img","src","exception","span","container","paginationInfo","paginationPages","createToolbar","maxHeight","setData","setStyle","k","cell","getIdFromColumnName","refresh","loading","result","hide","JSON","parse","isArray","row","size_i","size_j","min_i","min_j","max_i","max_j","undefined","startNumber","finalNumber","tr","createRow","updatePagination","num","setMerge","getData","dataOnly","dataset","px","py","x","y","contains","getJsonRow","rowNumber","rowData","getJson","newValue","stringify","getRowData","setRowData","getColumnNameFromId","setValue","getColumnData","columnNumber","setColumnData","colNumber","height","createCell","parseValue","substr","executeFormula","mask","decimal","run","val","secureFormula","innerText","element","checked","readOnly","formatted","calendar","extractDateFromString","getDateString","getDropDownValue","render","color","backgroundColor","stripScript","colAlign","textAlign","whiteSpace","overflow","colWidth","getColumnName","updateNestedHeader","children","nestedInformation","headerIndex","colspan","numberOfColumns","column","toolbarItem","v","tooltip","a","b","getAttribute","toolbarDropdownOption","o","cellName","rowspan","ignoreHistoryAndEvents","test","alert","x1","y1","x2","y2","updateCell","updateSelection","setHistory","action","getMerge","removeMerge","keepOptions","removeAttribute","destroyMerged","isColMerged","cols","isRowMerged","openFilter","columnId","optionsFiltered","hasBlanks","paddingLeft","paddingRight","opt","autocomplete","opened","position","onclose","resetFilters","dropdown","getValue","getText","closeFilter","refreshSelection","log","query","updateResult","openEditor","empty","createEditor","getBoundingClientRect","minHeight","split","closeEditor","focus","rect","rectContent","window","innerHeight","bottom","top","image","scrollLeft","scrollWidth","getCell","getCellFromCoords","getLabel","getLabelFromCoords","processedValue","getValueFromCoords","force","updateFormulaChain","setValueFromCoords","setCheckRadioValue","Option","c","getElementsByTagName","removeChild","record","col","oldValue","copyData","d","h","breakControl","posx","posy","tokens","match","affectedTokens","token","updateFormula","Number","date","Date","setDate","getDate","getFullYear","doubleDigitFormat","getMonth","updateSelectionFromCoords","conditionalSelectionUpdate","blur","previousStatus","ux","uy","left","el1","el2","origin","previousState","borderLeft","borderRight","borderTop","borderBottom","removeCopyingSelection","updateCornerPosition","removeCopySelection","updateCopySelection","x3","y3","last","contentRect","lastRect","w2","h2","scrollTop","getFreezeWidth","updateScroll","direction","w1","h1","reference","referenceRect","freezed","getWidth","$","setWidth","oldWidth","w","setHeight","oldHeight","getHeight","setFooter","tfoot","getHeader","setHeader","prompt","getHeaders","asArray","getMeta","key","setMeta","prop","updateMeta","affectedCells","newMeta","getStyle","resetStyle","applyStyle","cellId","currentValue","oneApplication","trim","getComments","withAuthor","setComments","author","getConfig","orderBy","order","confirm","toLowerCase","valueA","valueB","sort","updateOrderArrow","updateOrder","updateTableReferences","loadPage","moveRow","ignoreDom","resetSearch","indexOf","nextSibling","splice","insertRow","mixed","numOfRows","lastRow","rowIndex","currentRecords","currentData","currentRows","rowRecords","rowNode","deleteRow","number","getSelectedRows","mergeExists","moveColumn","insertColumn","properties","numOfColumns","lastColumn","columnIndex","injectArray","currentHeaders","currentColgroup","historyHeaders","historyColgroup","historyRecords","historyData","historyFooters","currentRecord","deleteColumn","getSelectedColumns","asIds","getHighlighted","mergeCellUpdates","updatePosition","columnIdFrom","columnIdTo","totalX","totalY","updateFormulas","numBlankRows","numBlankCols","setTimeout","isReadOnly","setReadOnly","state","showRow","hideRow","showColumn","hideColumn","showIndex","hideIndex","chainLoopProtection","referencesToUpdate","newFormula","letter","testLetter","testNumber","exec","inside","toUpperCase","expression","formulaResults","formulaLoopProtection","execute","parentId","tokensUpdate","f","e1","e2","replace","evalstring","eval","parseNumber","res","up","shiftKey","ctrlKey","visible","loadValidation","item","firstChild","loadUp","whichPage","group","get","down","lastChild","loadDown","right","first","selectAll","quantityPerPage","Math","ceil","startRow","finalRow","currentPage","selectedPage","totalPages","addToResult","total","oldPage","quantyOfPages","paginationItem","args","download","includeHeaders","blob","Blob","navigator","msSaveOrOpenBlob","pom","URL","createObjectURL","href","body","click","changes","delimiter","returnData","RegExp","header","colLabel","rowLabel","tmp","copyHeader","numOfCols","nested","label","str","strLabel","select","execCommand","hash","parseCSV","newStyle","oldStyle","styleIndex","colIndex","copying","querySelectorAll","historyProcessRow","historyRecord","historyProcessColumn","undo","redo","combo","charCodeAt","arr","quote","cc","nc","chr","destroy","init","current","build","addEventListener","newData","shift","items","comment","shortcut","clipboard","readText","then","updateFreezePosition","target","timeControlLoading","clientHeight","scrollHeight","shifted","jspreadsheet","timeControl","destroyEventHandlers","removeEventListener","mouseUpControls","mouseDownControls","mouseMoveControls","mouseOverControls","doubleClickControls","pasteControls","contextMenuControls","touchStartControls","touchEndControls","keyDownControls","which","preventDefault","altKey","editorTextarea","editorValue","editorIndexOf","selectionStart","selectionEnd","selectedRow","selectedHeader","metaKey","rowId","keyCode","String","fromCharCode","validLetter","cutControls","copyControls","clearTimeout","isMouseAction","buttons","mouseButton","button","jexcelTable","getElement","selectedCorner","offsetX","mousePosition","pageX","offsetY","destination","c1","c2","pageY","clientWidth","getCellCoords","newWidth","currentWidth","newHeight","previousSibling","tempWidth","tempHeight","clientX","clientY","enabled","clipboardData","open","tmpElement","tabs","instances","spreadsheet","link","worksheet","sheetName","createTabs","fromSpreadsheet","file","__callback","oReq","convert","workbook","spreadsheets","SheetNames","forEach","Sheets","wpx","hpx","s","r","max_x","max_y","fgColor","rgb","numColumns","XMLHttpRequest","Uint8Array","responseType","arraybuffer","response","wb","XLSX","read","cellFormula","cellStyles","setRequestHeader","onreadystatechange","readyState","status","ff","convertResponseBodyToText","responseBody","send","regex","idx","concat","t","code","pow","jexcelSection","jexcelElement","path","parseHeader","cells","mergedColspan","mergedRowspan","footer","pattern","testCalendar","fn","spreadsheetContainer","jQuery","nil","Error","div0","ref","na","utils","array","reduce","aIsArray","bIsArray","argsToArray","isFlat","flattenShallow","arrayEach","possibleNumbers","flatten","power","round","bool","isNaN","string","parseFloat","len","parsed","matrix","pnarr","parseNumberArray","d1900","UTC","parseDate","getTime","parseDateArray","anyIsError","n","arrayValuesToNumbers","rest","initial","iteratee","transpose","map","methods","datetime","WEEK_TYPES","serial","addOn","DATE","year","month","day","DATEVALUE","date_text","DAY","serial_number","DAYS","end_date","start_date","DAYS360","EDATE","months","setMonth","EOMONTH","HOUR","getHours","INTERVAL","second","floor","hour","min","sec","ISOWEEKNUM","setHours","getDay","yearStart","MINUTE","getMinutes","MONTH","NETWORKDAYS","holidays","INTL","weekend","NOW","SECOND","getSeconds","TIME","minute","TIMEVALUE","time_text","TODAY","WEEKDAY","return_type","WEEKNUM","WORKDAY","days","YEAR","YEARFRAC","basis","database","compact","findResultIndex","criterias","matches","maxCriteriaLength","l","currentCriteriaResult","hasMatchingCriteria","criteria","criteriaField","p","FINDFIELD","DAVERAGE","field","resultIndexes","targetFields","sum","DCOUNT","DCOUNTA","DGET","DMAX","maxValue","DMIN","minValue","DPRODUCT","targetValues","DSTDEV","DSTDEVP","DSUM","DVAR","DVARP","MATCH","lookupValue","lookupArray","matchType","indexValue","engineering","isValidBinaryNumber","BESSELI","BESSELJ","BESSELK","BESSELY","BIN2DEC","stringified","toString","substring","BIN2HEX","places","REPT","BIN2OCT","BITAND","number1","number2","BITLSHIFT","abs","BITOR","BITRSHIFT","BITXOR","COMPLEX","real","imaginary","suffix","sign","CONVERT","from_unit","to_unit","alt","units","binary_prefixes","Yi","Zi","Ei","Pi","Ti","Gi","Mi","ki","unit_prefixes","Y","Z","E","P","T","G","M","m","u","z","from","to","base_from_unit","base_to_unit","from_multiplier","to_multiplier","from_binary_prefix","from_unit_prefix","to_binary_prefix","to_unit_prefix","DEC2BIN","DEC2HEX","DEC2OCT","DELTA","ERF","lower_bound","upper_bound","PRECISE","ERFC","GESTEP","step","HEX2BIN","negative","HEX2DEC","HEX2OCT","IMABS","inumber","IMREAL","IMAGINARY","sqrt","plus","minus","unit","IMARGUMENT","PI","atan","IMCONJUGATE","IMCOS","cos","exp","sin","IMCOSH","IMCOT","IMDIV","IMSIN","inumber1","inumber2","unit1","unit2","den","IMEXP","IMLN","IMLOG10","IMLOG2","IMPOWER","IMPRODUCT","IMSEC","IMSECH","IMSINH","IMSQRT","IMCSC","IMCSCH","IMSUB","IMSUM","IMTAN","OCT2BIN","OCT2DEC","OCT2HEX","financial","validDate","ensureDate","ACCRINT","issue","settlement","rate","par","frequency","ACCRINTM","AMORDEGRC","AMORLINC","COUPDAYBS","COUPDAYS","COUPDAYSNC","COUPNCD","COUPNUM","COUPPCD","CUMIPMT","periods","start","end","payment","PMT","interest","FV","CUMPRINC","principal","DB","cost","salvage","life","period","toFixed","ceiling","DDB","factor","DISC","DOLLARDE","dollar","fraction","LN10","LN2","DOLLARFR","DURATION","EFFECT","term","FVSCHEDULE","schedule","future","INTRATE","IPMT","present","IRR","values","guess","irrResult","dates","irrResultDeriv","frac","positive","newRate","epsRate","resultValue","resultRate","epsMax","contLoop","ISPMT","MDURATION","MIRR","finance_rate","reinvest_rate","payments","incomes","NPV","NOMINAL","NPER","ODDFPRICE","ODDFYIELD","ODDLPRICE","ODDLYIELD","PDURATION","PPMT","PRICE","PRICEDISC","PRICEMAT","PV","RATE","iterMax","iter","t1","t2","f1","f2","f3","NaN","RECEIVED","RRI","SLN","SYD","TBILLEQ","maturity","discount","TBILLPRICE","TBILLYIELD","price","VDB","XIRR","XNPV","YIELD","YIELDDISC","YIELDMAT","information","ERROR","TYPE","error_val","INFO","ISBLANK","ISBINARY","ISERR","isFinite","ISERROR","ISEVEN","ISFORMULA","ISLOGICAL","ISNA","ISNONTEXT","ISNUMBER","ISODD","ISREF","ISTEXT","N","NA","SHEET","SHEETS","logical","then_value","otherwise_value","valueIfError","value_if_na","targetValue","argc","switchCount","switchSatisfied","defaultClause","math","acos","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I","asin","number_x","number_y","atan2","radix","min_length","max","significance","mode","CEILING","MATH","COMBIN","number_chosen","FACT","COMBINA","COS","COSH","COT","tan","COTH","CSC","CSCH","DECIMAL","DEGREES","EVEN","EXP","MEMOIZED_FACT","FACTDOUBLE","FLOOR","GCD","INT","LCM","pop","LN","LOG","base","LOG10","MDETERM","MINVERSE","MMULT","MOD","dividend","divisor","modulus","MROUND","MULTINOMIAL","MUNIT","ODD","POWER","PRODUCT","QUOTIENT","numerator","denominator","RADIANS","RAND","random","RANDBETWEEN","ROMAN","ROUND","digits","ROUNDDOWN","ROUNDUP","SEC","SECH","SERIESSUM","coefficients","SIGN","SIN","SINH","SQRT","SQRTPI","SUBTOTAL","ADD","num1","num2","MINUS","DIVIDE","MULTIPLY","factor1","factor2","GTE","LT","LTE","EQ","value1","value2","NE","POW","exponent","SUM","argsKeys","elt","SUMIF","range","SUMIFS","n_range_elements","n_criterias","condition","SUMPRODUCT","SUMSQ","numbers","SUMX2MY2","array_x","array_y","SUMX2PY2","SUMXMY2","TAN","TANH","TRUNC","misc","hasElement","FLATTEN","ARGS2ARRAY","REFERENCE","context","opening","JOIN","separator","NUMBERS","NUMERAL","re","trueFound","falseFound","text1","text2","find_text","within_text","line","begin","txt","charAt","regular_expression","full","replacement","new_text","foundAt","old_text","occurrence","UNICHAR","CHAR","UNICODE","CODE","UPPER","VALUE","stats","SQRT2PI","AVEDEV","AVERAGE","count","AVERAGEA","AVERAGEIF","average_range","average_count","AVERAGEIFS","COUNT","COUNTA","COUNTBLANK","COUNTIN","blanks","COUNTIF","COUNTIFS","COUNTUNIQUE","UNIQUE","FISHER","FISHERINV","e2y","FREQUENCY","bins","LARGE","MAX","MAXA","MIN","MINA","MODE","MULT","currentItem","maxItems","SNGL","PERCENTILE","EXC","fl","cleanFloat","INC","PERCENTRANK","uniques","PERMUT","PERMUTATIONA","PHI","PROB","probability","lower","upper","sorted","QUARTILE","quart","RANK","AVG","RSQ","data_x","data_y","PEARSON","SMALL","STANDARDIZE","mean","sd","STDEV","VAR","S","STDEVA","VARA","STDEVPA","VARPA","sigma","WEIBULL","DIST","alpha","beta","cumulative","TEST","NORM","html","find","DOMElement","component","isOpened","tracking","complete","instance","parseData","vars","encodeURIComponent","httpRequest","cache","withCredentials","beforeSend","responseText","err","queue","requests","oncomplete","exists","http","pending","message","getWindowWidth","dialog","animation","slideLeft","done","slideRight","slideTop","slideBottom","fadeIn","fadeOut","setOptions","reset","validRange","startingDay","readonly","today","time","resetButton","placeholder","monthsFull","weekdays","weekdays_short","textDone","textReset","textUpdate","onopen","onupdate","calendarReset","calendarConfirm","calendarControlsUpdateButton","now","getDays","getMonths","calendarSelectHour","calendarSelectMin","calendarContent","calendarContainer","innerWidth","update","querySelector","getYears","toISOString","setLabel","two","elements","updateActions","isNumeric","calendarLabelYear","calendarLabelMonth","isCurrentMonthAndYear","currentDay","numberOfDays","firstDay","calendarBody","emptyRow","fontWeight","test1","test2","calendarControlsTime","currentYear","currentMonth","selectedYear","selectedMonth","findElement","prev","next","keyUpControls","calendarTable","calendarControls","calendarControlsUpdate","calendarTableContainer","calendarHeaderPrev","calendarHeaderTitle","calendarHeaderNext","calendarHeader","calendarHeaderRow","calendarControlsFooter","maxWidth","flexGrow","calendarBackdrop","stopPropagation","onmouseup","documentElement","hasEvents","keydown","change","prettify","texts","justNow","xMinutesAgo","xHoursAgo","xDaysAgo","xWeeksAgo","xMonthsAgo","xYearsAgo","d1","d2","prettifyAll","dateOnly","toArray","v1","v2","splitStr","pieces","getMilliseconds","backdrop","closeButton","jsuitesTabs","closeOnChange","palette","doneLabel","resetLabel","updateContent","setBorder","getActive","HexToRgb","rgbInputs","rgbInput","dispatchEvent","Event","slidersResult","selected","backdropClickControl","decToHex","hex","rgbToHex","g","hexToDec","tableContainer","canvas","getContext","resizeCanvas","gradient","createLinearGradient","addColorStop","fillStyle","fillRect","hsl","point","pixel","getImageData","changedTouches","changeInputColors","currentColor","newGradient","backgroundImage","sliders","slidersElement","slidersBody","createSliderInput","inputContainer","subContainer","input","slidersResultColor","resultElement","visibility","resultColor","removeProperty","controls","contentElement","createItemElement","itemContainer","itemText","icon","disabled","submenu","itemIconSubmenu","el_submenu","itemContainerSubMenu","itemShortCut","create","foundId","applyValue","resetValue","Value","Text","remoteSearch","newOptions","oninsert","minWidth","containerHeader","keyTimer","extractFromDom","groups","numOfItems","onkeyup","mouseup","getUrl","setUrl","callback","setId","guid","newItem","createItem","groupName","node","appendData","groupNames","groupArrow","groupContent","getPosition","resetSelected","selectIndex","setCursor","selectItem","currentIndex","synonym","rectContainer","setPosition","offsetTop","clientTop","resetCursor","updateCursor","firstVisible","newIndex","numberOfItems","offsetWidth","snippet","remoteParser","parseURL","filterPaste","dropZone","dropAsAttachment","acceptImages","acceptFiles","maxFileSize","allowImageResize","border","padding","onkeydown","editorTimer","editorAction","overflowY","extractImageFromHtml","addImage","insertNodeAtCaret","newNode","sel","getSelection","rangeCount","getRangeAt","deleteContents","insertNode","setStartAfter","setEndAfter","removeAllRanges","addRange","appendElement","description","verifyEditor","thumbsContainer","detectUrl","getDomain","location","hostname","importImage","youtubeParser","parseWebsite","parseContent","youtubeId","encodeURI","json","tagged","users","userId","addPdf","Image","ctx","drawImage","toBlob","newImage","getFiles","files","handler","extension","lastIndexOf","toDataURL","addFile","reader","FileReader","lastModified","readAsDataURL","editorMouseUp","editorMouseDown","editorMouseMove","editorKeyUp","editorKeyDown","editorDragStart","editorDragEnter","editorDragOver","editorDrop","editorPaste","editorBlur","editorFocus","removeRange","HTMLUnknownElement","validStyle","attributes","elementStyle","numAttributes","constructor","originalEvent","caretRangeFromPoint","rangeParent","createRange","setStart","rangeOffset","anchorNode","dataTransfer","getDefaultToolbar","startContainer","endContainer","setEnd","links","regExp","queryCommandState","getNames","folder","updateNames","set","form","ignore","currentHash","submitButton","validations","onbeforeload","onbeforeremove","onremove","onerror","email","required","load","setElements","validate","getElements","addError","delError","validateElement","validation","getError","setHash","getHash","isChanged","resetTracker","setIgnore","ignoreFlag","confirmationMessage","returnValue","tracker","childNodes","collapse","getNode","nodeType","randomColor","lum","getWindowHeight","evt","MouseEvent","bubbles","cancelable","view","foundElement","sha512","int64","msint_32","lsint_32","highOrder","lowOrder","T1","T2","H","K","W","charsize","utf8_encode","unescape","str2binb","bin","binb2hex","binarray","srcByte","hex_tab","safe_add_2","lsw","msw","safe_add_4","safe_add_5","maj","ch","rotr","sigma0","rotr28","rotr34","rotr39","sigma1","rotr14","rotr18","rotr41","gamma0","rotr1","rotr8","shr7","shr","gamma1","rotr19","rotr61","shr6","strlen","login","upload","maxJpegSizeBytes","extensionNotAllowed","addFromFile","readFile","srcElement","lastmodified","addFromUrl","mime","timer","valueDecimal","prepare","process","anchorOffset","focusOffset","offset","reverse","modal","closed","resetPosition","isOpen","notification","timeout","autoHide","closeable","notificationContainer","notificationHeader","notificationImage","notificationIcon","notificationName","notificationClose","notificationDate","notificationContent","notificationTitle","notificationMessage","notificationTimeout","isVisible","material","picker","dropdownHeader","dropdownContent","createContent","dropdownItem","onselect","rectHeader","marginTop","marginLeft","progressbar","bar","rating","createList","terms","keyup","onmousedown","slider","currentImage","cover","addFiles","allowAttachment","attachmentInput","attachmentIcon","longTouchTimer","mouseDown","mouseUp","pointer","ondragstart","ondragend","ondrop","dragElement","opacity","hasAttribute","allowCreate","allowChangePosition","oncreate","ondelete","onbeforecreate","onchangeposition","hideHeaders","offsetLeft","updateControls","scrollTo","behavior","previous","r1","r2","rename","deleteElement","nextNumber","newContent","contentItem","replaceChild","move","titleElement","headerItem","iconContainer","loadingRemoteData","tags","limit","limitMessage","colors","setFocus","extractTags","isValid","tagsMouseUp","tagsKeyDown","tagsKeyUp","tagsPaste","tagsFocus","tagsBlur","isEmpty","word","app","badge","toolbarArrow","toolbarFloating","toolbarContent","setBadge","toggleState","active","toolbarIcon","class","toolbarBadge","toolbarBadgeContent","toolbarTitle","route","pages","bind","resize","reg","isNumber"],"mappings":"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WAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,WACzD,IAAIA,EAAM,UAAY,YAAa,IAAIA,EAAM,UAAY,YACzD,IAAIA,EAAM,UAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,WACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,UAAY,YAAa,IAAIA,EAAM,UAAY,WACzD,IAAIA,EAAM,UAAY,YAAa,IAAIA,EAAM,UAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,WACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,WACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,UAAY,WACzD,IAAIA,EAAM,UAAY,YAAa,IAAIA,EAAM,UAAY,YACzD,IAAIA,EAAM,UAAY,YAAa,IAAIA,EAAM,UAAY,YACzD,IAAIA,EAAM,UAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,WACzD,IAAIA,EAAM,WAAY,WAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,WACzD,IAAIA,EAAM,WAAY,YAAa,IAAIA,EAAM,WAAY,YACzD,IAAIA,EAAM,UAAY,YAAa,IAAIA,EAAM,UAAY,YACzD,IAAIA,EAAM,U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","file":"js/chunk-2df64cee.5007a364.js","sourcesContent":["/**\r\n * Jspreadsheet v4.7.3\r\n *\r\n * Website: https://bossanova.uk/jspreadsheet/\r\n * Description: Create amazing web based spreadsheets.\r\n *\r\n * This software is distribute under MIT License\r\n */\r\n\r\nif (! jSuites && typeof(require) === 'function') {\r\n var jSuites = require('jsuites');\r\n}\r\n\r\n;(function (global, factory) {\r\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n typeof define === 'function' && define.amd ? define(factory) :\r\n global.jspreadsheet = global.jexcel = factory();\r\n}(this, (function () {\r\n\r\n 'use strict';\r\n\r\n // Basic version information\r\n var Version = function() {\r\n // Information\r\n var info = {\r\n title: 'Jspreadsheet',\r\n version: '4.7.3',\r\n type: 'CE',\r\n host: 'https://bossanova.uk/jspreadsheet',\r\n license: 'MIT',\r\n print: function() {\r\n return [ this.title + ' ' + this.type + ' ' + this.version, this.host, this.license ].join('\\r\\n'); \r\n }\r\n }\r\n\r\n return function() {\r\n return info;\r\n };\r\n }();\r\n\r\n // Jspreadsheet core object\r\n var jexcel = (function(el, options) {\r\n // Create jspreadsheet object\r\n var obj = {};\r\n obj.options = {};\r\n\r\n if (! (el instanceof Element || el instanceof HTMLDocument)) {\r\n console.error('Jspreadsheet: el is not a valid DOM element');\r\n return false;\r\n } else if (el.tagName == 'TABLE') {\r\n if (options = jexcel.createFromTable(el, options)) {\r\n var div = document.createElement('div');\r\n el.parentNode.insertBefore(div, el);\r\n el.remove();\r\n el = div;\r\n } else {\r\n console.error('Jspreadsheet: el is not a valid DOM element');\r\n return false;\r\n }\r\n }\r\n\r\n // Loading default configuration\r\n var defaults = {\r\n // External data\r\n url:null,\r\n // Ajax options\r\n method: 'GET',\r\n requestVariables: null,\r\n // Data\r\n data:null,\r\n // Custom sorting handler\r\n sorting:null,\r\n // Copy behavior\r\n copyCompatibility:false,\r\n root:null,\r\n // Rows and columns definitions\r\n rows:[],\r\n columns:[],\r\n // Deprected legacy options\r\n colHeaders:[],\r\n colWidths:[],\r\n colAlignments:[],\r\n nestedHeaders:null,\r\n // Column width that is used by default\r\n defaultColWidth:50,\r\n defaultColAlign:'center',\r\n // Spare rows and columns\r\n minSpareRows:0,\r\n minSpareCols:0,\r\n // Minimal table dimensions\r\n minDimensions:[0,0],\r\n // Allow Export\r\n allowExport:true,\r\n // @type {boolean} - Include the header titles on download\r\n includeHeadersOnDownload:false,\r\n // @type {boolean} - Include the header titles on copy\r\n includeHeadersOnCopy:false,\r\n // Allow column sorting\r\n columnSorting:true,\r\n // Allow column dragging\r\n columnDrag:false,\r\n // Allow column resizing\r\n columnResize:true,\r\n // Allow row resizing\r\n rowResize:false,\r\n // Allow row dragging\r\n rowDrag:true,\r\n // Allow table edition\r\n editable:true,\r\n // Allow new rows\r\n allowInsertRow:true,\r\n // Allow new rows\r\n allowManualInsertRow:true,\r\n // Allow new columns\r\n allowInsertColumn:true,\r\n // Allow new rows\r\n allowManualInsertColumn:true,\r\n // Allow row delete\r\n allowDeleteRow:true,\r\n // Allow deleting of all rows\r\n allowDeletingAllRows:false,\r\n // Allow column delete\r\n allowDeleteColumn:true,\r\n // Allow rename column\r\n allowRenameColumn:true,\r\n // Allow comments\r\n allowComments:false,\r\n // Global wrap\r\n wordWrap:false,\r\n // Image options\r\n imageOptions: null,\r\n // CSV source\r\n csv:null,\r\n // Filename\r\n csvFileName:'jspreadsheet',\r\n // Consider first line as header\r\n csvHeaders:true,\r\n // Delimiters\r\n csvDelimiter:',',\r\n // First row as header\r\n parseTableFirstRowAsHeader:false,\r\n parseTableAutoCellType:false,\r\n // Disable corner selection\r\n selectionCopy:true,\r\n // Merged cells\r\n mergeCells:{},\r\n // Create toolbar\r\n toolbar:null,\r\n // Allow search\r\n search:false,\r\n // Create pagination\r\n pagination:false,\r\n paginationOptions:null,\r\n // Full screen\r\n fullscreen:false,\r\n // Lazy loading\r\n lazyLoading:false,\r\n loadingSpin:false,\r\n // Table overflow\r\n tableOverflow:false,\r\n tableHeight:'300px',\r\n tableWidth:null,\r\n textOverflow:false,\r\n // Meta\r\n meta: null,\r\n // Style\r\n style:null,\r\n classes:null,\r\n // Execute formulas\r\n parseFormulas:true,\r\n autoIncrement:true,\r\n autoCasting:true,\r\n // Security\r\n secureFormulas:true,\r\n stripHTML:true,\r\n stripHTMLOnCopy:false,\r\n // Filters\r\n filters:false,\r\n footers:null,\r\n // Event handles\r\n onundo:null,\r\n onredo:null,\r\n onload:null,\r\n onchange:null,\r\n oncomments:null,\r\n onbeforechange:null,\r\n onafterchanges:null,\r\n onbeforeinsertrow: null,\r\n oninsertrow:null,\r\n onbeforeinsertcolumn: null,\r\n oninsertcolumn:null,\r\n onbeforedeleterow:null,\r\n ondeleterow:null,\r\n onbeforedeletecolumn:null,\r\n ondeletecolumn:null,\r\n onmoverow:null,\r\n onmovecolumn:null,\r\n onresizerow:null,\r\n onresizecolumn:null,\r\n onsort:null,\r\n onselection:null,\r\n oncopy:null,\r\n onpaste:null,\r\n onbeforepaste:null,\r\n onmerge:null,\r\n onfocus:null,\r\n onblur:null,\r\n onchangeheader:null,\r\n oncreateeditor:null,\r\n oneditionstart:null,\r\n oneditionend:null,\r\n onchangestyle:null,\r\n onchangemeta:null,\r\n onchangepage:null,\r\n onbeforesave:null,\r\n onsave:null,\r\n // Global event dispatcher\r\n onevent:null,\r\n // Persistance\r\n persistance:false,\r\n // Customize any cell behavior\r\n updateTable:null,\r\n // Detach the HTML table when calling updateTable\r\n detachForUpdates: false,\r\n freezeColumns:null,\r\n // Texts\r\n text:{\r\n noRecordsFound: 'No records found',\r\n showingPage: 'Showing page {0} of {1} entries',\r\n show: 'Show ',\r\n search: 'Search',\r\n entries: ' entries',\r\n columnName: 'Column name',\r\n insertANewColumnBefore: 'Insert a new column before',\r\n insertANewColumnAfter: 'Insert a new column after',\r\n deleteSelectedColumns: 'Delete selected columns',\r\n renameThisColumn: 'Rename this column',\r\n orderAscending: 'Order ascending',\r\n orderDescending: 'Order descending',\r\n insertANewRowBefore: 'Insert a new row before',\r\n insertANewRowAfter: 'Insert a new row after',\r\n deleteSelectedRows: 'Delete selected rows',\r\n editComments: 'Edit comments',\r\n addComments: 'Add comments',\r\n comments: 'Comments',\r\n clearComments: 'Clear comments',\r\n copy: 'Copy...',\r\n paste: 'Paste...',\r\n saveAs: 'Save as...',\r\n about: 'About',\r\n areYouSureToDeleteTheSelectedRows: 'Are you sure to delete the selected rows?',\r\n areYouSureToDeleteTheSelectedColumns: 'Are you sure to delete the selected columns?',\r\n thisActionWillDestroyAnyExistingMergedCellsAreYouSure: 'This action will destroy any existing merged cells. Are you sure?',\r\n thisActionWillClearYourSearchResultsAreYouSure: 'This action will clear your search results. Are you sure?',\r\n thereIsAConflictWithAnotherMergedCell: 'There is a conflict with another merged cell',\r\n invalidMergeProperties: 'Invalid merged properties',\r\n cellAlreadyMerged: 'Cell already merged',\r\n noCellsSelected: 'No cells selected',\r\n },\r\n // About message\r\n about: true,\r\n };\r\n \r\n // Loading initial configuration from user\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n if (property === 'text') {\r\n obj.options[property] = defaults[property];\r\n for (var textKey in options[property]) {\r\n if (options[property].hasOwnProperty(textKey)){\r\n obj.options[property][textKey] = options[property][textKey];\r\n }\r\n }\r\n } else {\r\n obj.options[property] = options[property];\r\n }\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Global elements\r\n obj.el = el;\r\n obj.corner = null;\r\n obj.contextMenu = null;\r\n obj.textarea = null;\r\n obj.ads = null;\r\n obj.content = null;\r\n obj.table = null;\r\n obj.thead = null;\r\n obj.tbody = null;\r\n obj.rows = [];\r\n obj.results = null;\r\n obj.searchInput = null;\r\n obj.toolbar = null;\r\n obj.pagination = null;\r\n obj.pageNumber = null;\r\n obj.headerContainer = null;\r\n obj.colgroupContainer = null;\r\n \r\n // Containers\r\n obj.headers = [];\r\n obj.records = [];\r\n obj.history = [];\r\n obj.formula = [];\r\n obj.colgroup = [];\r\n obj.selection = [];\r\n obj.highlighted = [];\r\n obj.selectedCell = null;\r\n obj.selectedContainer = null;\r\n obj.style = [];\r\n obj.data = null;\r\n obj.filter = null;\r\n obj.filters = [];\r\n\r\n // Internal controllers\r\n obj.cursor = null;\r\n obj.historyIndex = -1;\r\n obj.ignoreEvents = false;\r\n obj.ignoreHistory = false;\r\n obj.edition = null;\r\n obj.hashString = null;\r\n obj.resizing = null;\r\n obj.dragging = null;\r\n \r\n // Lazy loading\r\n if (obj.options.lazyLoading == true && (obj.options.tableOverflow == false && obj.options.fullscreen == false)) {\r\n console.error('Jspreadsheet: The lazyloading only works when tableOverflow = yes or fullscreen = yes');\r\n obj.options.lazyLoading = false;\r\n }\r\n \r\n /**\r\n * Activate/Disable fullscreen \r\n * use programmatically : table.fullscreen(); or table.fullscreen(true); or table.fullscreen(false);\r\n * @Param {boolean} activate\r\n */\r\n obj.fullscreen = function(activate) {\r\n // If activate not defined, get reverse options.fullscreen\r\n if (activate == null) {\r\n activate = ! obj.options.fullscreen;\r\n }\r\n \r\n // If change\r\n if (obj.options.fullscreen != activate) {\r\n obj.options.fullscreen = activate;\r\n \r\n // Test LazyLoading conflict\r\n if (activate == true) {\r\n el.classList.add('fullscreen');\r\n } else {\r\n el.classList.remove('fullscreen');\r\n }\r\n } \r\n }\r\n\r\n /**\r\n * Trigger events\r\n */\r\n obj.dispatch = function(event) {\r\n // Dispatch events\r\n if (! obj.ignoreEvents) {\r\n // Call global event\r\n if (typeof(obj.options.onevent) == 'function') {\r\n var ret = obj.options.onevent.apply(this, arguments);\r\n }\r\n // Call specific events\r\n if (typeof(obj.options[event]) == 'function') {\r\n var ret = obj.options[event].apply(this, Array.prototype.slice.call(arguments, 1));\r\n }\r\n }\r\n\r\n // Persistance\r\n if (event == 'onafterchanges' && obj.options.persistance) {\r\n var url = obj.options.persistance == true ? obj.options.url : obj.options.persistance;\r\n var data = obj.prepareJson(arguments[2]);\r\n obj.save(url, data);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Prepare the jspreadsheet table\r\n * \r\n * @Param config\r\n */\r\n obj.prepareTable = function() {\r\n // Loading initial data from remote sources\r\n var results = [];\r\n \r\n // Number of columns\r\n var size = obj.options.columns.length;\r\n \r\n if (obj.options.data && typeof(obj.options.data[0]) !== 'undefined') {\r\n // Data keys\r\n var keys = Object.keys(obj.options.data[0]);\r\n \r\n if (keys.length > size) {\r\n size = keys.length;\r\n }\r\n }\r\n \r\n // Minimal dimensions\r\n if (obj.options.minDimensions[0] > size) {\r\n size = obj.options.minDimensions[0];\r\n }\r\n \r\n // Requests\r\n var multiple = [];\r\n \r\n // Preparations\r\n for (var i = 0; i < size; i++) {\r\n // Deprected options. You should use only columns\r\n if (! obj.options.colHeaders[i]) {\r\n obj.options.colHeaders[i] = '';\r\n }\r\n if (! obj.options.colWidths[i]) {\r\n obj.options.colWidths[i] = obj.options.defaultColWidth;\r\n }\r\n if (! obj.options.colAlignments[i]) {\r\n obj.options.colAlignments[i] = obj.options.defaultColAlign;\r\n }\r\n \r\n // Default column description\r\n if (! obj.options.columns[i]) {\r\n obj.options.columns[i] = { type:'text' };\r\n } else if (! obj.options.columns[i].type) {\r\n obj.options.columns[i].type = 'text';\r\n }\r\n if (! obj.options.columns[i].name) {\r\n obj.options.columns[i].name = keys && keys[i] ? keys[i] : i;\r\n }\r\n if (! obj.options.columns[i].source) {\r\n obj.options.columns[i].source = [];\r\n }\r\n if (! obj.options.columns[i].options) {\r\n obj.options.columns[i].options = [];\r\n }\r\n if (! obj.options.columns[i].editor) {\r\n obj.options.columns[i].editor = null;\r\n }\r\n if (! obj.options.columns[i].allowEmpty) {\r\n obj.options.columns[i].allowEmpty = false;\r\n }\r\n if (! obj.options.columns[i].title) {\r\n obj.options.columns[i].title = obj.options.colHeaders[i] ? obj.options.colHeaders[i] : '';\r\n }\r\n if (! obj.options.columns[i].width) {\r\n obj.options.columns[i].width = obj.options.colWidths[i] ? obj.options.colWidths[i] : obj.options.defaultColWidth;\r\n }\r\n if (! obj.options.columns[i].align) {\r\n obj.options.columns[i].align = obj.options.colAlignments[i] ? obj.options.colAlignments[i] : 'center';\r\n }\r\n \r\n // Pre-load initial source for json autocomplete\r\n if (obj.options.columns[i].type == 'autocomplete' || obj.options.columns[i].type == 'dropdown') {\r\n // if remote content\r\n if (obj.options.columns[i].url) {\r\n multiple.push({\r\n url: obj.options.columns[i].url,\r\n index: i,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function(data) {\r\n var source = [];\r\n for (var i = 0; i < data.length; i++) {\r\n obj.options.columns[this.index].source.push(data[i]);\r\n }\r\n }\r\n });\r\n }\r\n } else if (obj.options.columns[i].type == 'calendar') {\r\n // Default format for date columns\r\n if (! obj.options.columns[i].options.format) {\r\n obj.options.columns[i].options.format = 'DD/MM/YYYY';\r\n }\r\n }\r\n }\r\n // Create the table when is ready\r\n if (! multiple.length) {\r\n obj.createTable();\r\n } else {\r\n jSuites.ajax(multiple, function() {\r\n obj.createTable();\r\n });\r\n }\r\n }\r\n \r\n obj.createTable = function() {\r\n // Elements\r\n obj.table = document.createElement('table');\r\n obj.thead = document.createElement('thead');\r\n obj.tbody = document.createElement('tbody');\r\n\r\n // Create headers controllers\r\n obj.headers = [];\r\n obj.colgroup = [];\r\n \r\n // Create table container\r\n obj.content = document.createElement('div');\r\n obj.content.classList.add('jexcel_content');\r\n obj.content.onscroll = function(e) {\r\n obj.scrollControls(e);\r\n }\r\n obj.content.onwheel = function(e) {\r\n obj.wheelControls(e);\r\n }\r\n\r\n // Create toolbar object\r\n obj.toolbar = document.createElement('div');\r\n obj.toolbar.classList.add('jexcel_toolbar');\r\n \r\n // Search\r\n var searchContainer = document.createElement('div');\r\n var searchText = document.createTextNode((obj.options.text.search) + ': ');\r\n obj.searchInput = document.createElement('input');\r\n obj.searchInput.classList.add('jexcel_search');\r\n searchContainer.appendChild(searchText);\r\n searchContainer.appendChild(obj.searchInput);\r\n obj.searchInput.onfocus = function() {\r\n obj.resetSelection();\r\n }\r\n \r\n // Pagination select option\r\n var paginationUpdateContainer = document.createElement('div');\r\n \r\n if (obj.options.pagination > 0 && obj.options.paginationOptions && obj.options.paginationOptions.length > 0) {\r\n obj.paginationDropdown = document.createElement('select');\r\n obj.paginationDropdown.classList.add('jexcel_pagination_dropdown');\r\n obj.paginationDropdown.onchange = function() {\r\n obj.options.pagination = parseInt(this.value);\r\n obj.page(0);\r\n }\r\n \r\n for (var i = 0; i < obj.options.paginationOptions.length; i++) {\r\n var temp = document.createElement('option');\r\n temp.value = obj.options.paginationOptions[i];\r\n temp.innerHTML = obj.options.paginationOptions[i];\r\n obj.paginationDropdown.appendChild(temp);\r\n }\r\n \r\n // Set initial pagination value\r\n obj.paginationDropdown.value = obj.options.pagination;\r\n\r\n paginationUpdateContainer.appendChild(document.createTextNode(obj.options.text.show));\r\n paginationUpdateContainer.appendChild(obj.paginationDropdown);\r\n paginationUpdateContainer.appendChild(document.createTextNode(obj.options.text.entries));\r\n }\r\n \r\n // Filter and pagination container\r\n var filter = document.createElement('div');\r\n filter.classList.add('jexcel_filter');\r\n filter.appendChild(paginationUpdateContainer);\r\n filter.appendChild(searchContainer);\r\n \r\n // Colsgroup\r\n obj.colgroupContainer = document.createElement('colgroup');\r\n var tempCol = document.createElement('col');\r\n tempCol.setAttribute('width', '50');\r\n obj.colgroupContainer.appendChild(tempCol);\r\n \r\n // Nested\r\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0) {\r\n // Flexible way to handle nestedheaders\r\n if (obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\r\n for (var j = 0; j < obj.options.nestedHeaders.length; j++) {\r\n obj.thead.appendChild(obj.createNestedHeader(obj.options.nestedHeaders[j]));\r\n }\r\n } else {\r\n obj.thead.appendChild(obj.createNestedHeader(obj.options.nestedHeaders));\r\n }\r\n }\r\n \r\n // Row\r\n obj.headerContainer = document.createElement('tr');\r\n var tempCol = document.createElement('td');\r\n tempCol.classList.add('jexcel_selectall');\r\n obj.headerContainer.appendChild(tempCol);\r\n \r\n for (var i = 0; i < obj.options.columns.length; i++) {\r\n // Create header\r\n obj.createCellHeader(i);\r\n // Append cell to the container\r\n obj.headerContainer.appendChild(obj.headers[i]);\r\n obj.colgroupContainer.appendChild(obj.colgroup[i]);\r\n }\r\n\r\n obj.thead.appendChild(obj.headerContainer);\r\n\r\n // Filters\r\n if (obj.options.filters == true) {\r\n obj.filter = document.createElement('tr');\r\n var td = document.createElement('td');\r\n obj.filter.appendChild(td);\r\n\r\n for (var i = 0; i < obj.options.columns.length; i++) {\r\n var td = document.createElement('td');\r\n td.innerHTML = ' ';\r\n td.setAttribute('data-x', i);\r\n td.className = 'jexcel_column_filter';\r\n if (obj.options.columns[i].type == 'hidden') {\r\n td.style.display = 'none';\r\n }\r\n obj.filter.appendChild(td);\r\n }\r\n\r\n obj.thead.appendChild(obj.filter);\r\n }\r\n\r\n // Content table\r\n obj.table = document.createElement('table');\r\n obj.table.classList.add('jexcel');\r\n obj.table.setAttribute('cellpadding', '0');\r\n obj.table.setAttribute('cellspacing', '0');\r\n obj.table.setAttribute('unselectable', 'yes');\r\n //obj.table.setAttribute('onselectstart', 'return false');\r\n obj.table.appendChild(obj.colgroupContainer);\r\n obj.table.appendChild(obj.thead);\r\n obj.table.appendChild(obj.tbody);\r\n\r\n if (! obj.options.textOverflow) {\r\n obj.table.classList.add('jexcel_overflow');\r\n }\r\n\r\n // Spreadsheet corner\r\n obj.corner = document.createElement('div');\r\n obj.corner.className = 'jexcel_corner';\r\n obj.corner.setAttribute('unselectable', 'on');\r\n obj.corner.setAttribute('onselectstart', 'return false');\r\n \r\n if (obj.options.selectionCopy == false) {\r\n obj.corner.style.display = 'none';\r\n }\r\n \r\n // Textarea helper\r\n obj.textarea = document.createElement('textarea');\r\n obj.textarea.className = 'jexcel_textarea';\r\n obj.textarea.id = 'jexcel_textarea';\r\n obj.textarea.tabIndex = '-1';\r\n\r\n // Contextmenu container\r\n obj.contextMenu = document.createElement('div');\r\n obj.contextMenu.className = 'jexcel_contextmenu';\r\n \r\n // Create element\r\n jSuites.contextmenu(obj.contextMenu, {\r\n onclick:function() {\r\n obj.contextMenu.contextmenu.close(false);\r\n }\r\n });\r\n \r\n // Powered by Jspreadsheet\r\n var ads = document.createElement('a');\r\n ads.setAttribute('href', 'https://bossanova.uk/jspreadsheet/');\r\n obj.ads = document.createElement('div');\r\n obj.ads.className = 'jexcel_about';\r\n try {\r\n if (typeof(sessionStorage) !== \"undefined\" && ! sessionStorage.getItem('jexcel')) {\r\n sessionStorage.setItem('jexcel', true);\r\n var img = document.createElement('img');\r\n img.src = '//bossanova.uk/jspreadsheet/logo.png';\r\n ads.appendChild(img);\r\n }\r\n } catch (exception) {\r\n }\r\n var span = document.createElement('span');\r\n span.innerHTML = 'Jspreadsheet CE';\r\n ads.appendChild(span);\r\n obj.ads.appendChild(ads);\r\n\r\n // Create table container TODO: frozen columns\r\n var container = document.createElement('div');\r\n container.classList.add('jexcel_table');\r\n \r\n // Pagination\r\n obj.pagination = document.createElement('div');\r\n obj.pagination.classList.add('jexcel_pagination');\r\n var paginationInfo = document.createElement('div');\r\n var paginationPages = document.createElement('div');\r\n obj.pagination.appendChild(paginationInfo);\r\n obj.pagination.appendChild(paginationPages);\r\n\r\n // Hide pagination if not in use\r\n if (! obj.options.pagination) {\r\n obj.pagination.style.display = 'none';\r\n }\r\n\r\n // Append containers to the table\r\n if (obj.options.search == true) {\r\n el.appendChild(filter);\r\n }\r\n \r\n // Elements\r\n obj.content.appendChild(obj.table);\r\n obj.content.appendChild(obj.corner);\r\n obj.content.appendChild(obj.textarea);\r\n \r\n el.appendChild(obj.toolbar);\r\n el.appendChild(obj.content);\r\n el.appendChild(obj.pagination);\r\n el.appendChild(obj.contextMenu);\r\n el.appendChild(obj.ads);\r\n el.classList.add('jexcel_container');\r\n \r\n // Create toolbar\r\n if (obj.options.toolbar && obj.options.toolbar.length) {\r\n obj.createToolbar();\r\n }\r\n \r\n // Fullscreen\r\n if (obj.options.fullscreen == true) {\r\n el.classList.add('fullscreen');\r\n } else {\r\n // Overflow\r\n if (obj.options.tableOverflow == true) {\r\n if (obj.options.tableHeight) {\r\n obj.content.style['overflow-y'] = 'auto';\r\n obj.content.style['box-shadow'] = 'rgb(221 221 221) 2px 2px 5px 0.1px';\r\n obj.content.style.maxHeight = obj.options.tableHeight;\r\n }\r\n if (obj.options.tableWidth) {\r\n obj.content.style['overflow-x'] = 'auto';\r\n obj.content.style.width = obj.options.tableWidth;\r\n }\r\n }\r\n }\r\n \r\n // With toolbars\r\n if (obj.options.tableOverflow != true && obj.options.toolbar) {\r\n el.classList.add('with-toolbar');\r\n }\r\n \r\n // Actions\r\n if (obj.options.columnDrag == true) {\r\n obj.thead.classList.add('draggable');\r\n }\r\n if (obj.options.columnResize == true) {\r\n obj.thead.classList.add('resizable');\r\n }\r\n if (obj.options.rowDrag == true) {\r\n obj.tbody.classList.add('draggable');\r\n }\r\n if (obj.options.rowResize == true) {\r\n obj.tbody.classList.add('resizable');\r\n }\r\n \r\n // Load data\r\n obj.setData();\r\n \r\n // Style\r\n if (obj.options.style) {\r\n obj.setStyle(obj.options.style, null, null, 1, 1);\r\n }\r\n\r\n // Classes\r\n if (obj.options.classes) {\r\n var k = Object.keys(obj.options.classes);\r\n for (var i = 0; i < k.length; i++) {\r\n var cell = jexcel.getIdFromColumnName(k[i], true);\r\n obj.records[cell[1]][cell[0]].classList.add(obj.options.classes[k[i]]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Refresh the data\r\n * \r\n * @return void\r\n */\r\n obj.refresh = function() {\r\n if (obj.options.url) {\r\n // Loading\r\n if (obj.options.loadingSpin == true) {\r\n jSuites.loading.show();\r\n }\r\n \r\n jSuites.ajax({\r\n url: obj.options.url,\r\n method: obj.options.method,\r\n data: obj.options.requestVariables,\r\n dataType: 'json',\r\n success: function(result) {\r\n // Data\r\n obj.options.data = (result.data) ? result.data : result;\r\n // Prepare table\r\n obj.setData();\r\n // Hide spin\r\n if (obj.options.loadingSpin == true) {\r\n jSuites.loading.hide();\r\n }\r\n }\r\n });\r\n } else {\r\n obj.setData();\r\n }\r\n }\r\n\r\n /**\r\n * Set data\r\n * \r\n * @param array data In case no data is sent, default is reloaded\r\n * @return void\r\n */\r\n obj.setData = function(data) {\r\n // Update data\r\n if (data) {\r\n if (typeof(data) == 'string') {\r\n data = JSON.parse(data);\r\n }\r\n \r\n obj.options.data = data;\r\n }\r\n \r\n // Data\r\n if (! obj.options.data) {\r\n obj.options.data = [];\r\n }\r\n \r\n // Prepare data\r\n if (obj.options.data && obj.options.data[0]) {\r\n if (! Array.isArray(obj.options.data[0])) {\r\n var data = [];\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n var row = [];\r\n for (var i = 0; i < obj.options.columns.length; i++) {\r\n row[i] = obj.options.data[j][obj.options.columns[i].name];\r\n }\r\n data.push(row);\r\n }\r\n\r\n obj.options.data = data;\r\n }\r\n }\r\n\r\n // Adjust minimal dimensions\r\n var j = 0;\r\n var i = 0;\r\n var size_i = obj.options.columns.length;\r\n var size_j = obj.options.data.length;\r\n var min_i = obj.options.minDimensions[0];\r\n var min_j = obj.options.minDimensions[1];\r\n var max_i = min_i > size_i ? min_i : size_i;\r\n var max_j = min_j > size_j ? min_j : size_j;\r\n \r\n for (j = 0; j < max_j; j++) {\r\n for (i = 0; i < max_i; i++) {\r\n if (obj.options.data[j] == undefined) {\r\n obj.options.data[j] = [];\r\n }\r\n \r\n if (obj.options.data[j][i] == undefined) {\r\n obj.options.data[j][i] = '';\r\n }\r\n }\r\n }\r\n \r\n // Reset containers\r\n obj.rows = [];\r\n obj.results = null;\r\n obj.records = [];\r\n obj.history = [];\r\n \r\n // Reset internal controllers\r\n obj.historyIndex = -1;\r\n \r\n // Reset data\r\n obj.tbody.innerHTML = '';\r\n \r\n // Lazy loading\r\n if (obj.options.lazyLoading == true) {\r\n // Load only 100 records\r\n var startNumber = 0\r\n var finalNumber = obj.options.data.length < 100 ? obj.options.data.length : 100;\r\n \r\n if (obj.options.pagination) {\r\n obj.options.pagination = false;\r\n console.error('Jspreadsheet: Pagination will be disable due the lazyLoading');\r\n }\r\n } else if (obj.options.pagination) {\r\n // Pagination\r\n if (! obj.pageNumber) {\r\n obj.pageNumber = 0;\r\n }\r\n var quantityPerPage = obj.options.pagination;\r\n startNumber = (obj.options.pagination * obj.pageNumber);\r\n finalNumber = (obj.options.pagination * obj.pageNumber) + obj.options.pagination;\r\n \r\n if (obj.options.data.length < finalNumber) {\r\n finalNumber = obj.options.data.length;\r\n }\r\n } else {\r\n var startNumber = 0;\r\n var finalNumber = obj.options.data.length;\r\n }\r\n \r\n // Append nodes to the HTML\r\n for (j = 0; j < obj.options.data.length; j++) {\r\n // Create row\r\n var tr = obj.createRow(j, obj.options.data[j]);\r\n // Append line to the table\r\n if (j >= startNumber && j < finalNumber) {\r\n obj.tbody.appendChild(tr);\r\n }\r\n }\r\n \r\n if (obj.options.lazyLoading == true) {\r\n // Do not create pagination with lazyloading activated\r\n } else if (obj.options.pagination) {\r\n obj.updatePagination();\r\n }\r\n \r\n // Merge cells\r\n if (obj.options.mergeCells) {\r\n var keys = Object.keys(obj.options.mergeCells);\r\n for (var i = 0; i < keys.length; i++) {\r\n var num = obj.options.mergeCells[keys[i]];\r\n obj.setMerge(keys[i], num[0], num[1], 1);\r\n }\r\n }\r\n\r\n // Updata table with custom configurations if applicable\r\n obj.updateTable();\r\n\r\n // Onload\r\n obj.dispatch('onload', el, obj);\r\n }\r\n\r\n /**\r\n * Get the whole table data\r\n * \r\n * @param bool get highlighted cells only\r\n * @return array data\r\n */\r\n obj.getData = function(highlighted, dataOnly) {\r\n // Control vars\r\n var dataset = [];\r\n var px = 0;\r\n var py = 0;\r\n\r\n // Data type\r\n var dataType = dataOnly == true || obj.options.copyCompatibility == false ? true : false;\r\n\r\n // Column and row length\r\n var x = obj.options.columns.length\r\n var y = obj.options.data.length\r\n \r\n // Go through the columns to get the data\r\n for (var j = 0; j < y; j++) {\r\n px = 0;\r\n for (var i = 0; i < x; i++) {\r\n // Cell selected or fullset\r\n if (! highlighted || obj.records[j][i].classList.contains('highlight')) {\r\n // Get value\r\n if (! dataset[py]) {\r\n dataset[py] = [];\r\n }\r\n if (! dataType) {\r\n dataset[py][px] = obj.records[j][i].innerHTML;\r\n } else {\r\n dataset[py][px] = obj.options.data[j][i];\r\n }\r\n px++;\r\n }\r\n }\r\n if (px > 0) {\r\n py++;\r\n }\r\n }\r\n \r\n return dataset;\r\n }\r\n\r\n /**\r\n * Get json data by row number\r\n *\r\n * @param integer row number\r\n * @return object\r\n */\r\n obj.getJsonRow = function(rowNumber) {\r\n var rowData = obj.options.data[rowNumber];\r\n var x = obj.options.columns.length\r\n\r\n var row = {};\r\n for (var i = 0; i < x; i++) {\r\n if (! obj.options.columns[i].name) {\r\n obj.options.columns[i].name = i;\r\n }\r\n row[obj.options.columns[i].name] = rowData[i];\r\n }\r\n\r\n return row;\r\n }\r\n\r\n /**\r\n * Get the whole table data\r\n * \r\n * @param bool highlighted cells only\r\n * @return string value\r\n */\r\n obj.getJson = function(highlighted) {\r\n // Control vars\r\n var data = [];\r\n \r\n // Column and row length\r\n var x = obj.options.columns.length\r\n var y = obj.options.data.length\r\n \r\n // Go through the columns to get the data\r\n for (var j = 0; j < y; j++) {\r\n var row = null;\r\n for (var i = 0; i < x; i++) {\r\n if (! highlighted || obj.records[j][i].classList.contains('highlight')) {\r\n if (row == null) {\r\n row = {};\r\n }\r\n if (! obj.options.columns[i].name) {\r\n obj.options.columns[i].name = i;\r\n }\r\n row[obj.options.columns[i].name] = obj.options.data[j][i];\r\n }\r\n }\r\n \r\n if (row != null) {\r\n data.push(row);\r\n }\r\n }\r\n \r\n return data;\r\n }\r\n\r\n /**\r\n * Prepare JSON in the correct format\r\n */\r\n obj.prepareJson = function(data) {\r\n var rows = [];\r\n for (var i = 0; i < data.length; i++) {\r\n var x = data[i].x;\r\n var y = data[i].y;\r\n var k = obj.options.columns[x].name ? obj.options.columns[x].name : x;\r\n\r\n // Create row\r\n if (! rows[y]) {\r\n rows[y] = {\r\n row: y,\r\n data: {},\r\n };\r\n }\r\n rows[y].data[k] = data[i].newValue;\r\n }\r\n\r\n // Filter rows\r\n return rows.filter(function (el) {\r\n return el != null;\r\n });\r\n }\r\n\r\n /**\r\n * Post json to a remote server\r\n */\r\n obj.save = function(url, data) {\r\n // Parse anything in the data before sending to the server\r\n var ret = obj.dispatch('onbeforesave', el, obj, data);\r\n if (ret) {\r\n var data = ret;\r\n } else {\r\n if (ret === false) {\r\n return false;\r\n }\r\n }\r\n\r\n // Remove update\r\n jSuites.ajax({\r\n url: url,\r\n method: 'POST',\r\n dataType: 'json',\r\n data: { data: JSON.stringify(data) },\r\n success: function(result) {\r\n // Event\r\n obj.dispatch('onsave', el, obj, data);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Get a row data by rowNumber\r\n */\r\n obj.getRowData = function(rowNumber) {\r\n return obj.options.data[rowNumber];\r\n }\r\n \r\n /**\r\n * Set a row data by rowNumber\r\n */\r\n obj.setRowData = function(rowNumber, data) {\r\n for (var i = 0; i < obj.headers.length; i++) {\r\n // Update cell\r\n var columnName = jexcel.getColumnNameFromId([ i, rowNumber ]);\r\n // Set value\r\n if (data[i] != null) {\r\n obj.setValue(columnName, data[i]);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Get a column data by columnNumber\r\n */\r\n obj.getColumnData = function(columnNumber) {\r\n var dataset = [];\r\n // Go through the rows to get the data\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n dataset.push(obj.options.data[j][columnNumber]);\r\n }\r\n return dataset;\r\n }\r\n \r\n /**\r\n * Set a column data by colNumber\r\n */\r\n obj.setColumnData = function(colNumber, data) {\r\n for (var j = 0; j < obj.rows.length; j++) {\r\n // Update cell\r\n var columnName = jexcel.getColumnNameFromId([ colNumber, j ]);\r\n // Set value\r\n if (data[j] != null) {\r\n obj.setValue(columnName, data[j]);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Create row\r\n */\r\n obj.createRow = function(j, data) {\r\n // Create container\r\n if (! obj.records[j]) {\r\n obj.records[j] = [];\r\n }\r\n // Default data\r\n if (! data) {\r\n var data = obj.options.data[j];\r\n }\r\n // New line of data to be append in the table\r\n obj.rows[j] = document.createElement('tr');\r\n obj.rows[j].setAttribute('data-y', j);\r\n // Index\r\n var index = null;\r\n // Definitions\r\n if (obj.options.rows[j]) {\r\n if (obj.options.rows[j].height) {\r\n obj.rows[j].style.height = obj.options.rows[j].height;\r\n }\r\n if (obj.options.rows[j].title) {\r\n index = obj.options.rows[j].title;\r\n }\r\n }\r\n if (! index) {\r\n index = parseInt(j + 1);\r\n }\r\n // Row number label\r\n var td = document.createElement('td');\r\n td.innerHTML = index;\r\n td.setAttribute('data-y', j);\r\n td.className = 'jexcel_row';\r\n obj.rows[j].appendChild(td);\r\n \r\n // Data columns\r\n for (var i = 0; i < obj.options.columns.length; i++) {\r\n // New column of data to be append in the line\r\n obj.records[j][i] = obj.createCell(i, j, data[i]);\r\n // Add column to the row\r\n obj.rows[j].appendChild(obj.records[j][i]);\r\n }\r\n \r\n // Add row to the table body\r\n return obj.rows[j];\r\n }\r\n \r\n obj.parseValue = function(i, j, value) {\r\n if ((''+value).substr(0,1) == '=' && obj.options.parseFormulas == true) {\r\n value = obj.executeFormula(value, i, j)\r\n }\r\n if (obj.options.columns[i].mask) {\r\n var decimal = obj.options.columns[i].decimal || '.';\r\n value = '' + jSuites.mask.run(value, obj.options.columns[i].mask, decimal);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * Create cell\r\n */\r\n obj.createCell = function(i, j, value) {\r\n // Create cell and properties\r\n var td = document.createElement('td');\r\n td.setAttribute('data-x', i);\r\n td.setAttribute('data-y', j);\r\n\r\n // Security\r\n if ((''+value).substr(0,1) == '=' && obj.options.secureFormulas == true) {\r\n var val = secureFormula(value);\r\n if (val != value) {\r\n // Update the data container\r\n value = val;\r\n }\r\n }\r\n\r\n // Custom column\r\n if (obj.options.columns[i].editor) {\r\n if (obj.options.stripHTML === false || obj.options.columns[i].stripHTML === false) {\r\n td.innerHTML = value;\r\n } else {\r\n td.innerText = value;\r\n }\r\n if (typeof(obj.options.columns[i].editor.createCell) == 'function') {\r\n td = obj.options.columns[i].editor.createCell(td);\r\n }\r\n } else {\r\n // Hidden column\r\n if (obj.options.columns[i].type == 'hidden') {\r\n td.style.display = 'none';\r\n td.innerText = value;\r\n } else if (obj.options.columns[i].type == 'checkbox' || obj.options.columns[i].type == 'radio') {\r\n // Create input\r\n var element = document.createElement('input');\r\n element.type = obj.options.columns[i].type;\r\n element.name = 'c' + i;\r\n element.checked = (value == 1 || value == true || value == 'true') ? true : false;\r\n element.onclick = function() {\r\n obj.setValue(td, this.checked);\r\n }\r\n\r\n if (obj.options.columns[i].readOnly == true || obj.options.editable == false) {\r\n element.setAttribute('disabled', 'disabled');\r\n }\r\n\r\n // Append to the table\r\n td.appendChild(element);\r\n // Make sure the values are correct\r\n obj.options.data[j][i] = element.checked;\r\n } else if (obj.options.columns[i].type == 'calendar') {\r\n // Try formatted date\r\n var formatted = jSuites.calendar.extractDateFromString(value, obj.options.columns[i].options.format);\r\n // Create calendar cell\r\n td.innerText = jSuites.calendar.getDateString(formatted ? formatted : value, obj.options.columns[i].options.format);\r\n } else if (obj.options.columns[i].type == 'dropdown' || obj.options.columns[i].type == 'autocomplete') {\r\n // Create dropdown cell\r\n td.classList.add('jexcel_dropdown');\r\n td.innerText = obj.getDropDownValue(i, value);\r\n } else if (obj.options.columns[i].type == 'color') {\r\n if (obj.options.columns[i].render == 'square') {\r\n var color = document.createElement('div');\r\n color.className = 'color';\r\n color.style.backgroundColor = value;\r\n td.appendChild(color);\r\n } else {\r\n td.style.color = value;\r\n td.innerText = value;\r\n }\r\n } else if (obj.options.columns[i].type == 'image') {\r\n if (value && value.substr(0, 10) == 'data:image') {\r\n var img = document.createElement('img');\r\n img.src = value;\r\n td.appendChild(img);\r\n }\r\n } else {\r\n if (obj.options.columns[i].type == 'html') {\r\n td.innerHTML = stripScript(obj.parseValue(i, j, value));\r\n } else {\r\n if (obj.options.stripHTML === false || obj.options.columns[i].stripHTML === false) {\r\n td.innerHTML = stripScript(obj.parseValue(i, j, value));\r\n } else {\r\n td.innerText = obj.parseValue(i, j, value);\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Readonly\r\n if (obj.options.columns[i].readOnly == true) {\r\n td.className = 'readonly';\r\n }\r\n \r\n // Text align\r\n var colAlign = obj.options.columns[i].align ? obj.options.columns[i].align : 'center';\r\n td.style.textAlign = colAlign;\r\n \r\n // Wrap option\r\n if (obj.options.columns[i].wordWrap != false && (obj.options.wordWrap == true || obj.options.columns[i].wordWrap == true || td.innerHTML.length > 200)) {\r\n td.style.whiteSpace = 'pre-wrap';\r\n }\r\n \r\n // Overflow\r\n if (i > 0) {\r\n if (this.options.textOverflow == true) {\r\n if (value || td.innerHTML) {\r\n obj.records[j][i-1].style.overflow = 'hidden';\r\n } else {\r\n if (i == obj.options.columns.length - 1) {\r\n td.style.overflow = 'hidden';\r\n }\r\n }\r\n }\r\n }\r\n return td;\r\n }\r\n \r\n obj.createCellHeader = function(colNumber) {\r\n // Create col global control\r\n var colWidth = obj.options.columns[colNumber].width ? obj.options.columns[colNumber].width : obj.options.defaultColWidth;\r\n var colAlign = obj.options.columns[colNumber].align ? obj.options.columns[colNumber].align : obj.options.defaultColAlign;\r\n \r\n // Create header cell\r\n obj.headers[colNumber] = document.createElement('td');\r\n if (obj.options.stripHTML) {\r\n obj.headers[colNumber].innerText = obj.options.columns[colNumber].title ? obj.options.columns[colNumber].title : jexcel.getColumnName(colNumber);\r\n } else {\r\n obj.headers[colNumber].innerHTML = obj.options.columns[colNumber].title ? obj.options.columns[colNumber].title : jexcel.getColumnName(colNumber);\r\n }\r\n obj.headers[colNumber].setAttribute('data-x', colNumber);\r\n obj.headers[colNumber].style.textAlign = colAlign;\r\n if (obj.options.columns[colNumber].title) {\r\n obj.headers[colNumber].setAttribute('title', obj.options.columns[colNumber].title);\r\n }\r\n if (obj.options.columns[colNumber].id) {\r\n obj.headers[colNumber].setAttribute('id', obj.options.columns[colNumber].id);\r\n }\r\n \r\n // Width control\r\n obj.colgroup[colNumber] = document.createElement('col');\r\n obj.colgroup[colNumber].setAttribute('width', colWidth);\r\n \r\n // Hidden column\r\n if (obj.options.columns[colNumber].type == 'hidden') {\r\n obj.headers[colNumber].style.display = 'none';\r\n obj.colgroup[colNumber].style.display = 'none';\r\n }\r\n }\r\n\r\n /**\r\n * Update a nested header title\r\n */\r\n obj.updateNestedHeader = function(x, y, title) {\r\n if (obj.options.nestedHeaders[y][x].title) {\r\n obj.options.nestedHeaders[y][x].title = title;\r\n obj.options.nestedHeaders[y].element.children[x+1].innerText = title;\r\n }\r\n }\r\n\r\n /**\r\n * Create a nested header object\r\n */\r\n obj.createNestedHeader = function(nestedInformation) {\r\n var tr = document.createElement('tr');\r\n tr.classList.add('jexcel_nested');\r\n var td = document.createElement('td');\r\n tr.appendChild(td);\r\n // Element\r\n nestedInformation.element = tr;\r\n \r\n var headerIndex = 0;\r\n for (var i = 0; i < nestedInformation.length; i++) {\r\n // Default values\r\n if (! nestedInformation[i].colspan) {\r\n nestedInformation[i].colspan = 1;\r\n }\r\n if (! nestedInformation[i].align) {\r\n nestedInformation[i].align = 'center';\r\n }\r\n if (! nestedInformation[i].title) {\r\n nestedInformation[i].title = '';\r\n }\r\n \r\n // Number of columns\r\n var numberOfColumns = nestedInformation[i].colspan;\r\n \r\n // Classes container\r\n var column = [];\r\n // Header classes for this cell\r\n for (var x = 0; x < numberOfColumns; x++) {\r\n if (obj.options.columns[headerIndex] && obj.options.columns[headerIndex].type == 'hidden') {\r\n numberOfColumns++;\r\n }\r\n column.push(headerIndex);\r\n headerIndex++;\r\n }\r\n \r\n // Created the nested cell\r\n var td = document.createElement('td');\r\n td.setAttribute('data-column', column.join(','));\r\n td.setAttribute('colspan', nestedInformation[i].colspan);\r\n td.setAttribute('align', nestedInformation[i].align);\r\n td.innerText = nestedInformation[i].title;\r\n tr.appendChild(td);\r\n }\r\n \r\n return tr;\r\n }\r\n \r\n /**\r\n * Create toolbar\r\n */\r\n obj.createToolbar = function(toolbar) {\r\n if (toolbar) {\r\n obj.options.toolbar = toolbar;\r\n } else {\r\n var toolbar = obj.options.toolbar;\r\n }\r\n for (var i = 0; i < toolbar.length; i++) {\r\n if (toolbar[i].type == 'i') {\r\n var toolbarItem = document.createElement('i');\r\n toolbarItem.classList.add('jexcel_toolbar_item');\r\n toolbarItem.classList.add('material-icons');\r\n toolbarItem.setAttribute('data-k', toolbar[i].k);\r\n toolbarItem.setAttribute('data-v', toolbar[i].v);\r\n toolbarItem.setAttribute('id', toolbar[i].id);\r\n\r\n // Tooltip\r\n if (toolbar[i].tooltip) {\r\n toolbarItem.setAttribute('title', toolbar[i].tooltip);\r\n }\r\n // Handle click\r\n if (toolbar[i].onclick && typeof(toolbar[i].onclick)) {\r\n toolbarItem.onclick = (function (a) {\r\n var b = a;\r\n return function () {\r\n toolbar[b].onclick(el, obj, this);\r\n };\r\n })(i);\r\n } else {\r\n toolbarItem.onclick = function() {\r\n var k = this.getAttribute('data-k');\r\n var v = this.getAttribute('data-v');\r\n obj.setStyle(obj.highlighted, k, v);\r\n }\r\n }\r\n // Append element\r\n toolbarItem.innerText = toolbar[i].content;\r\n obj.toolbar.appendChild(toolbarItem);\r\n } else if (toolbar[i].type == 'select') {\r\n var toolbarItem = document.createElement('select');\r\n toolbarItem.classList.add('jexcel_toolbar_item');\r\n toolbarItem.setAttribute('data-k', toolbar[i].k);\r\n // Tooltip\r\n if (toolbar[i].tooltip) {\r\n toolbarItem.setAttribute('title', toolbar[i].tooltip);\r\n }\r\n // Handle onchange\r\n if (toolbar[i].onchange && typeof(toolbar[i].onchange)) {\r\n toolbarItem.onchange = toolbar[i].onchange;\r\n } else {\r\n toolbarItem.onchange = function() {\r\n var k = this.getAttribute('data-k');\r\n obj.setStyle(obj.highlighted, k, this.value);\r\n }\r\n }\r\n // Add options to the dropdown\r\n for(var j = 0; j < toolbar[i].v.length; j++) {\r\n var toolbarDropdownOption = document.createElement('option');\r\n toolbarDropdownOption.value = toolbar[i].v[j];\r\n toolbarDropdownOption.innerText = toolbar[i].v[j];\r\n toolbarItem.appendChild(toolbarDropdownOption);\r\n }\r\n obj.toolbar.appendChild(toolbarItem);\r\n } else if (toolbar[i].type == 'color') {\r\n var toolbarItem = document.createElement('i');\r\n toolbarItem.classList.add('jexcel_toolbar_item');\r\n toolbarItem.classList.add('material-icons');\r\n toolbarItem.setAttribute('data-k', toolbar[i].k);\r\n toolbarItem.setAttribute('data-v', '');\r\n // Tooltip\r\n if (toolbar[i].tooltip) {\r\n toolbarItem.setAttribute('title', toolbar[i].tooltip);\r\n }\r\n obj.toolbar.appendChild(toolbarItem);\r\n toolbarItem.innerText = toolbar[i].content;\r\n jSuites.color(toolbarItem, {\r\n onchange:function(o, v) {\r\n var k = o.getAttribute('data-k');\r\n obj.setStyle(obj.highlighted, k, v);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Merge cells\r\n * @param cellName\r\n * @param colspan\r\n * @param rowspan\r\n * @param ignoreHistoryAndEvents\r\n */\r\n obj.setMerge = function(cellName, colspan, rowspan, ignoreHistoryAndEvents) {\r\n var test = false;\r\n \r\n if (! cellName) {\r\n if (! obj.highlighted.length) {\r\n alert(obj.options.text.noCellsSelected);\r\n return null;\r\n } else {\r\n var x1 = parseInt(obj.highlighted[0].getAttribute('data-x'));\r\n var y1 = parseInt(obj.highlighted[0].getAttribute('data-y'));\r\n var x2 = parseInt(obj.highlighted[obj.highlighted.length-1].getAttribute('data-x'));\r\n var y2 = parseInt(obj.highlighted[obj.highlighted.length-1].getAttribute('data-y'));\r\n var cellName = jexcel.getColumnNameFromId([ x1, y1 ]);\r\n var colspan = (x2 - x1) + 1;\r\n var rowspan = (y2 - y1) + 1;\r\n }\r\n }\r\n \r\n var cell = jexcel.getIdFromColumnName(cellName, true);\r\n \r\n if (obj.options.mergeCells[cellName]) {\r\n if (obj.records[cell[1]][cell[0]].getAttribute('data-merged')) {\r\n test = obj.options.text.cellAlreadyMerged;\r\n }\r\n } else if ((! colspan || colspan < 2) && (! rowspan || rowspan < 2)) {\r\n test = obj.options.text.invalidMergeProperties;\r\n } else {\r\n var cells = [];\r\n for (var j = cell[1]; j < cell[1] + rowspan; j++) {\r\n for (var i = cell[0]; i < cell[0] + colspan; i++) {\r\n var columnName = jexcel.getColumnNameFromId([i, j]);\r\n if (obj.records[j][i].getAttribute('data-merged')) {\r\n test = obj.options.text.thereIsAConflictWithAnotherMergedCell;\r\n }\r\n }\r\n }\r\n }\r\n \r\n if (test) {\r\n alert(test);\r\n } else {\r\n // Add property\r\n if (colspan > 1) {\r\n obj.records[cell[1]][cell[0]].setAttribute('colspan', colspan);\r\n } else {\r\n colspan = 1;\r\n }\r\n if (rowspan > 1) {\r\n obj.records[cell[1]][cell[0]].setAttribute('rowspan', rowspan);\r\n } else {\r\n rowspan = 1;\r\n }\r\n // Keep links to the existing nodes\r\n obj.options.mergeCells[cellName] = [ colspan, rowspan, [] ];\r\n // Mark cell as merged\r\n obj.records[cell[1]][cell[0]].setAttribute('data-merged', 'true');\r\n // Overflow\r\n obj.records[cell[1]][cell[0]].style.overflow = 'hidden';\r\n // History data\r\n var data = [];\r\n // Adjust the nodes\r\n for (var y = cell[1]; y < cell[1] + rowspan; y++) {\r\n for (var x = cell[0]; x < cell[0] + colspan; x++) {\r\n if (! (cell[0] == x && cell[1] == y)) {\r\n data.push(obj.options.data[y][x]);\r\n obj.updateCell(x, y, '', true);\r\n obj.options.mergeCells[cellName][2].push(obj.records[y][x]);\r\n obj.records[y][x].style.display = 'none';\r\n obj.records[y][x] = obj.records[cell[1]][cell[0]];\r\n }\r\n }\r\n }\r\n // In the initialization is not necessary keep the history\r\n obj.updateSelection(obj.records[cell[1]][cell[0]]);\r\n \r\n if (! ignoreHistoryAndEvents) {\r\n obj.setHistory({\r\n action:'setMerge',\r\n column:cellName,\r\n colspan:colspan,\r\n rowspan:rowspan,\r\n data:data,\r\n });\r\n \r\n obj.dispatch('onmerge', el, cellName, colspan, rowspan);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Merge cells\r\n * @param cellName\r\n * @param colspan\r\n * @param rowspan\r\n * @param ignoreHistoryAndEvents\r\n */\r\n obj.getMerge = function(cellName) {\r\n var data = {};\r\n if (cellName) {\r\n if (obj.options.mergeCells[cellName]) {\r\n data = [ obj.options.mergeCells[cellName][0], obj.options.mergeCells[cellName][1] ];\r\n } else {\r\n data = null;\r\n }\r\n } else {\r\n if (obj.options.mergeCells) {\r\n var mergedCells = obj.options.mergeCells;\r\n var keys = Object.keys(obj.options.mergeCells);\r\n for (var i = 0; i < keys.length; i++) {\r\n data[keys[i]] = [ obj.options.mergeCells[keys[i]][0], obj.options.mergeCells[keys[i]][1] ];\r\n }\r\n }\r\n }\r\n \r\n return data;\r\n }\r\n \r\n /**\r\n * Remove merge by cellname\r\n * @param cellName\r\n */\r\n obj.removeMerge = function(cellName, data, keepOptions) {\r\n if (obj.options.mergeCells[cellName]) {\r\n var cell = jexcel.getIdFromColumnName(cellName, true);\r\n obj.records[cell[1]][cell[0]].removeAttribute('colspan');\r\n obj.records[cell[1]][cell[0]].removeAttribute('rowspan');\r\n obj.records[cell[1]][cell[0]].removeAttribute('data-merged');\r\n var info = obj.options.mergeCells[cellName];\r\n \r\n var index = 0;\r\n for (var j = 0; j < info[1]; j++) {\r\n for (var i = 0; i < info[0]; i++) {\r\n if (j > 0 || i > 0) {\r\n obj.records[cell[1]+j][cell[0]+i] = info[2][index];\r\n obj.records[cell[1]+j][cell[0]+i].style.display = '';\r\n // Recover data\r\n if (data && data[index]) {\r\n obj.updateCell(cell[0]+i, cell[1]+j, data[index]);\r\n }\r\n index++;\r\n }\r\n }\r\n }\r\n \r\n // Update selection\r\n obj.updateSelection(obj.records[cell[1]][cell[0]], obj.records[cell[1]+j-1][cell[0]+i-1]);\r\n \r\n if (! keepOptions) {\r\n delete(obj.options.mergeCells[cellName]);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Remove all merged cells\r\n */\r\n obj.destroyMerged = function(keepOptions) {\r\n // Remove any merged cells\r\n if (obj.options.mergeCells) {\r\n var mergedCells = obj.options.mergeCells;\r\n var keys = Object.keys(obj.options.mergeCells);\r\n for (var i = 0; i < keys.length; i++) {\r\n obj.removeMerge(keys[i], null, keepOptions);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Is column merged\r\n */\r\n obj.isColMerged = function(x, insertBefore) {\r\n var cols = [];\r\n // Remove any merged cells\r\n if (obj.options.mergeCells) {\r\n var keys = Object.keys(obj.options.mergeCells);\r\n for (var i = 0; i < keys.length; i++) {\r\n var info = jexcel.getIdFromColumnName(keys[i], true);\r\n var colspan = obj.options.mergeCells[keys[i]][0];\r\n var x1 = info[0];\r\n var x2 = info[0] + (colspan > 1 ? colspan - 1 : 0);\r\n \r\n if (insertBefore == null) {\r\n if ((x1 <= x && x2 >= x)) {\r\n cols.push(keys[i]);\r\n }\r\n } else {\r\n if (insertBefore) {\r\n if ((x1 < x && x2 >= x)) {\r\n cols.push(keys[i]);\r\n }\r\n } else {\r\n if ((x1 <= x && x2 > x)) {\r\n cols.push(keys[i]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n return cols;\r\n }\r\n \r\n /**\r\n * Is rows merged\r\n */\r\n obj.isRowMerged = function(y, insertBefore) {\r\n var rows = [];\r\n // Remove any merged cells\r\n if (obj.options.mergeCells) {\r\n var keys = Object.keys(obj.options.mergeCells);\r\n for (var i = 0; i < keys.length; i++) {\r\n var info = jexcel.getIdFromColumnName(keys[i], true);\r\n var rowspan = obj.options.mergeCells[keys[i]][1];\r\n var y1 = info[1];\r\n var y2 = info[1] + (rowspan > 1 ? rowspan - 1 : 0);\r\n \r\n if (insertBefore == null) {\r\n if ((y1 <= y && y2 >= y)) {\r\n rows.push(keys[i]);\r\n }\r\n } else {\r\n if (insertBefore) {\r\n if ((y1 < y && y2 >= y)) {\r\n rows.push(keys[i]);\r\n }\r\n } else {\r\n if ((y1 <= y && y2 > y)) {\r\n rows.push(keys[i]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n return rows;\r\n }\r\n\r\n /**\r\n * Open the column filter\r\n */\r\n obj.openFilter = function(columnId) {\r\n if (! obj.options.filters) {\r\n console.log('Jspreadsheet: filters not enabled.');\r\n } else {\r\n // Make sure is integer\r\n columnId = parseInt(columnId);\r\n // Reset selection\r\n obj.resetSelection();\r\n // Load options\r\n var optionsFiltered = [];\r\n if (obj.options.columns[columnId].type == 'checkbox') {\r\n optionsFiltered.push({ id: 'true', name: 'True' });\r\n optionsFiltered.push({ id: 'false', name: 'False' });\r\n } else {\r\n var options = [];\r\n var hasBlanks = false;\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n var k = obj.options.data[j][columnId];\r\n var v = obj.records[j][columnId].innerHTML;\r\n if (k && v) {\r\n options[k] = v;\r\n } else {\r\n var hasBlanks = true;\r\n }\r\n }\r\n var keys = Object.keys(options);\r\n var optionsFiltered = [];\r\n for (var j = 0; j < keys.length; j++) {\r\n optionsFiltered.push({ id: keys[j], name: options[keys[j]] });\r\n }\r\n // Has blank options\r\n if (hasBlanks) {\r\n optionsFiltered.push({ value: '', id: '', name: '(Blanks)' });\r\n }\r\n }\r\n\r\n // Create dropdown\r\n var div = document.createElement('div');\r\n obj.filter.children[columnId + 1].innerHTML = '';\r\n obj.filter.children[columnId + 1].appendChild(div);\r\n obj.filter.children[columnId + 1].style.paddingLeft = '0px';\r\n obj.filter.children[columnId + 1].style.paddingRight = '0px';\r\n obj.filter.children[columnId + 1].style.overflow = 'initial';\r\n\r\n var opt = {\r\n data: optionsFiltered,\r\n multiple: true,\r\n autocomplete: true,\r\n opened: true,\r\n value: obj.filters[columnId] !== undefined ? obj.filters[columnId] : null,\r\n width:'100%',\r\n position: (obj.options.tableOverflow == true || obj.options.fullscreen == true) ? true : false,\r\n onclose: function(o) {\r\n obj.resetFilters();\r\n obj.filters[columnId] = o.dropdown.getValue(true);\r\n obj.filter.children[columnId + 1].innerHTML = o.dropdown.getText();\r\n obj.filter.children[columnId + 1].style.paddingLeft = '';\r\n obj.filter.children[columnId + 1].style.paddingRight = '';\r\n obj.filter.children[columnId + 1].style.overflow = '';\r\n obj.closeFilter(columnId);\r\n obj.refreshSelection();\r\n }\r\n };\r\n\r\n // Dynamic dropdown\r\n jSuites.dropdown(div, opt);\r\n }\r\n }\r\n\r\n obj.resetFilters = function() {\r\n if (obj.options.filters) {\r\n for (var i = 0; i < obj.filter.children.length; i++) {\r\n obj.filter.children[i].innerHTML = ' ';\r\n obj.filters[i] = null;\r\n }\r\n }\r\n }\r\n\r\n obj.closeFilter = function(columnId) {\r\n if (! columnId) {\r\n for (var i = 0; i < obj.filter.children.length; i++) {\r\n if (obj.filters[i]) {\r\n columnId = i;\r\n }\r\n }\r\n }\r\n\r\n // Search filter\r\n var search = function(query, x, y) {\r\n for (var i = 0; i < query.length; i++) {\r\n if ((query[i] == '' && // Blank matching\r\n ((obj.options.data[y][x] === false) || // Unchecked checkbox\r\n (''+obj.options.data[y][x]) == '')) || // Blank non-checkbox value\r\n ((query[i] != '' && // Normal non-blank filtering\r\n ((''+obj.options.data[y][x]).search(query[i]) >= 0 ||\r\n (''+obj.records[y][x].innerHTML).search(query[i]) >= 0)))) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n var query = obj.filters[columnId];\r\n obj.results = [];\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n if (search(query, columnId, j)) {\r\n obj.results.push(j);\r\n }\r\n }\r\n if (! obj.results.length) {\r\n obj.results = null;\r\n }\r\n\r\n obj.updateResult();\r\n }\r\n\r\n /**\r\n * Open the editor\r\n * \r\n * @param object cell\r\n * @return void\r\n */\r\n obj.openEditor = function(cell, empty, e) {\r\n // Get cell position\r\n var y = cell.getAttribute('data-y');\r\n var x = cell.getAttribute('data-x');\r\n \r\n // On edition start\r\n obj.dispatch('oneditionstart', el, cell, x, y);\r\n \r\n // Overflow\r\n if (x > 0) {\r\n obj.records[y][x-1].style.overflow = 'hidden';\r\n }\r\n \r\n // Create editor\r\n var createEditor = function(type) {\r\n // Cell information\r\n var info = cell.getBoundingClientRect();\r\n \r\n // Create dropdown\r\n var editor = document.createElement(type);\r\n editor.style.width = (info.width) + 'px';\r\n editor.style.height = (info.height - 2) + 'px';\r\n editor.style.minHeight = (info.height - 2) + 'px';\r\n \r\n // Edit cell\r\n cell.classList.add('editor');\r\n cell.innerHTML = '';\r\n cell.appendChild(editor);\r\n \r\n // On edition start\r\n obj.dispatch('oncreateeditor', el, cell, x, y, editor);\r\n\r\n return editor;\r\n }\r\n \r\n // Readonly\r\n if (cell.classList.contains('readonly') == true) {\r\n // Do nothing\r\n } else {\r\n // Holder\r\n obj.edition = [ obj.records[y][x], obj.records[y][x].innerHTML, x, y ];\r\n \r\n // If there is a custom editor for it\r\n if (obj.options.columns[x].editor) {\r\n // Custom editors\r\n obj.options.columns[x].editor.openEditor(cell, el, empty, e);\r\n } else {\r\n // Native functions\r\n if (obj.options.columns[x].type == 'hidden') {\r\n // Do nothing\r\n } else if (obj.options.columns[x].type == 'checkbox' || obj.options.columns[x].type == 'radio') {\r\n // Get value\r\n var value = cell.children[0].checked ? false : true;\r\n // Toogle value\r\n obj.setValue(cell, value);\r\n // Do not keep edition open\r\n obj.edition = null;\r\n } else if (obj.options.columns[x].type == 'dropdown' || obj.options.columns[x].type == 'autocomplete') {\r\n // Get current value\r\n var value = obj.options.data[y][x];\r\n if (obj.options.columns[x].multiple && !Array.isArray(value)) {\r\n value = value.split(';');\r\n }\r\n \r\n // Create dropdown\r\n if (typeof(obj.options.columns[x].filter) == 'function') {\r\n var source = obj.options.columns[x].filter(el, cell, x, y, obj.options.columns[x].source);\r\n } else {\r\n var source = obj.options.columns[x].source;\r\n }\r\n \r\n // Do not change the original source\r\n var data = [];\r\n for (var j = 0; j < source.length; j++) {\r\n data.push(source[j]);\r\n }\r\n\r\n // Create editor\r\n var editor = createEditor('div');\r\n var options = {\r\n data: data,\r\n multiple: obj.options.columns[x].multiple ? true : false,\r\n autocomplete: obj.options.columns[x].autocomplete || obj.options.columns[x].type == 'autocomplete' ? true : false,\r\n opened:true,\r\n value: value,\r\n width:'100%',\r\n height:editor.style.minHeight,\r\n position: (obj.options.tableOverflow == true || obj.options.fullscreen == true) ? true : false,\r\n onclose:function() {\r\n obj.closeEditor(cell, true);\r\n }\r\n };\r\n if (obj.options.columns[x].options && obj.options.columns[x].options.type) {\r\n options.type = obj.options.columns[x].options.type;\r\n }\r\n jSuites.dropdown(editor, options);\r\n } else if (obj.options.columns[x].type == 'calendar' || obj.options.columns[x].type == 'color') {\r\n // Value\r\n var value = obj.options.data[y][x];\r\n // Create editor\r\n var editor = createEditor('input');\r\n editor.value = value;\r\n \r\n if (obj.options.tableOverflow == true || obj.options.fullscreen == true) {\r\n obj.options.columns[x].options.position = true;\r\n }\r\n obj.options.columns[x].options.value = obj.options.data[y][x];\r\n obj.options.columns[x].options.opened = true;\r\n obj.options.columns[x].options.onclose = function(el, value) {\r\n obj.closeEditor(cell, true);\r\n }\r\n // Current value\r\n if (obj.options.columns[x].type == 'color') {\r\n jSuites.color(editor, obj.options.columns[x].options);\r\n } else {\r\n jSuites.calendar(editor, obj.options.columns[x].options);\r\n }\r\n // Focus on editor\r\n editor.focus();\r\n } else if (obj.options.columns[x].type == 'html') {\r\n var value = obj.options.data[y][x];\r\n // Create editor\r\n var editor = createEditor('div');\r\n editor.style.position = 'relative';\r\n var div = document.createElement('div');\r\n div.classList.add('jexcel_richtext');\r\n editor.appendChild(div);\r\n jSuites.editor(div, {\r\n focus: true,\r\n value: value,\r\n });\r\n var rect = cell.getBoundingClientRect();\r\n var rectContent = div.getBoundingClientRect();\r\n if (window.innerHeight < rect.bottom + rectContent.height) {\r\n div.style.top = (rect.top - (rectContent.height + 2)) + 'px';\r\n } else {\r\n div.style.top = (rect.top) + 'px';\r\n }\r\n } else if (obj.options.columns[x].type == 'image') {\r\n // Value\r\n var img = cell.children[0];\r\n // Create editor\r\n var editor = createEditor('div');\r\n editor.style.position = 'relative';\r\n var div = document.createElement('div');\r\n div.classList.add('jclose');\r\n if (img && img.src) {\r\n div.appendChild(img);\r\n }\r\n editor.appendChild(div);\r\n jSuites.image(div, obj.options.imageOptions);\r\n var rect = cell.getBoundingClientRect();\r\n var rectContent = div.getBoundingClientRect();\r\n if (window.innerHeight < rect.bottom + rectContent.height) {\r\n div.style.top = (rect.top - (rectContent.height + 2)) + 'px';\r\n } else {\r\n div.style.top = (rect.top) + 'px';\r\n }\r\n } else {\r\n // Value\r\n var value = empty == true ? '' : obj.options.data[y][x];\r\n \r\n // Basic editor\r\n if (obj.options.columns[x].wordWrap != false && (obj.options.wordWrap == true || obj.options.columns[x].wordWrap == true)) {\r\n var editor = createEditor('textarea');\r\n } else {\r\n var editor = createEditor('input');\r\n // Mask\r\n if (obj.options.columns[x].mask) {\r\n editor.setAttribute('data-mask', obj.options.columns[x].mask);\r\n }\r\n }\r\n \r\n editor.onblur = function() {\r\n obj.closeEditor(cell, true);\r\n };\r\n editor.focus();\r\n editor.value = value;\r\n editor.scrollLeft = editor.scrollWidth;\r\n }\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Close the editor and save the information\r\n * \r\n * @param object cell\r\n * @param boolean save\r\n * @return void\r\n */\r\n obj.closeEditor = function(cell, save) {\r\n var x = parseInt(cell.getAttribute('data-x'));\r\n var y = parseInt(cell.getAttribute('data-y'));\r\n\r\n // Get cell properties\r\n if (save == true) {\r\n // If custom editor\r\n if (obj.options.columns[x].editor) {\r\n // Custom editor\r\n var value = obj.options.columns[x].editor.closeEditor(cell, save);\r\n } else {\r\n // Native functions\r\n if (obj.options.columns[x].type == 'checkbox' || obj.options.columns[x].type == 'radio' || obj.options.columns[x].type == 'hidden') {\r\n // Do nothing\r\n } else if (obj.options.columns[x].type == 'dropdown' || obj.options.columns[x].type == 'autocomplete') {\r\n var value = cell.children[0].dropdown.close(true);\r\n } else if (obj.options.columns[x].type == 'calendar') {\r\n var value = cell.children[0].calendar.close(true);\r\n } else if (obj.options.columns[x].type == 'color') {\r\n var value = cell.children[0].color.close(true);\r\n } else if (obj.options.columns[x].type == 'html') {\r\n var value = cell.children[0].children[0].editor.getData();\r\n } else if (obj.options.columns[x].type == 'image') {\r\n var img = cell.children[0].children[0].children[0];\r\n var value = img && img.tagName == 'IMG' ? img.src : '';\r\n } else if (obj.options.columns[x].type == 'numeric') {\r\n var value = cell.children[0].value;\r\n if (value.substr(0,1) != '=') {\r\n if (value == '') {\r\n value = obj.options.columns[x].allowEmpty ? '' : 0;\r\n }\r\n }\r\n cell.children[0].onblur = null;\r\n } else {\r\n var value = cell.children[0].value;\r\n cell.children[0].onblur = null;\r\n }\r\n }\r\n\r\n // Ignore changes if the value is the same\r\n if (obj.options.data[y][x] == value) {\r\n cell.innerHTML = obj.edition[1];\r\n } else {\r\n obj.setValue(cell, value);\r\n }\r\n } else {\r\n if (obj.options.columns[x].editor) {\r\n // Custom editor\r\n obj.options.columns[x].editor.closeEditor(cell, save);\r\n } else {\r\n if (obj.options.columns[x].type == 'dropdown' || obj.options.columns[x].type == 'autocomplete') {\r\n cell.children[0].dropdown.close(true);\r\n } else if (obj.options.columns[x].type == 'calendar') {\r\n cell.children[0].calendar.close(true);\r\n } else if (obj.options.columns[x].type == 'color') {\r\n cell.children[0].color.close(true);\r\n } else {\r\n cell.children[0].onblur = null;\r\n }\r\n }\r\n \r\n // Restore value\r\n cell.innerHTML = obj.edition && obj.edition[1] ? obj.edition[1] : '';\r\n }\r\n \r\n // On edition end\r\n obj.dispatch('oneditionend', el, cell, x, y, value, save);\r\n\r\n // Remove editor class\r\n cell.classList.remove('editor');\r\n \r\n // Finish edition\r\n obj.edition = null;\r\n }\r\n \r\n /**\r\n * Get the cell object\r\n * \r\n * @param object cell\r\n * @return string value\r\n */\r\n obj.getCell = function(cell) {\r\n // Convert in case name is excel liked ex. A10, BB92\r\n cell = jexcel.getIdFromColumnName(cell, true);\r\n var x = cell[0];\r\n var y = cell[1];\r\n \r\n return obj.records[y][x];\r\n }\r\n \r\n /**\r\n * Get the cell object from coords\r\n * \r\n * @param object cell\r\n * @return string value\r\n */\r\n obj.getCellFromCoords = function(x, y) {\r\n return obj.records[y][x];\r\n }\r\n \r\n /**\r\n * Get label\r\n * \r\n * @param object cell\r\n * @return string value\r\n */\r\n obj.getLabel = function(cell) {\r\n // Convert in case name is excel liked ex. A10, BB92\r\n cell = jexcel.getIdFromColumnName(cell, true);\r\n var x = cell[0];\r\n var y = cell[1];\r\n \r\n return obj.records[y][x].innerHTML;\r\n }\r\n \r\n /**\r\n * Get labelfrom coords\r\n * \r\n * @param object cell\r\n * @return string value\r\n */\r\n obj.getLabelFromCoords = function(x, y) {\r\n return obj.records[y][x].innerHTML;\r\n }\r\n \r\n /**\r\n * Get the value from a cell\r\n * \r\n * @param object cell\r\n * @return string value\r\n */\r\n obj.getValue = function(cell, processedValue) {\r\n if (typeof(cell) == 'object') {\r\n var x = cell.getAttribute('data-x');\r\n var y = cell.getAttribute('data-y');\r\n } else {\r\n cell = jexcel.getIdFromColumnName(cell, true);\r\n var x = cell[0];\r\n var y = cell[1];\r\n }\r\n \r\n var value = null;\r\n \r\n if (x != null && y != null) {\r\n if (obj.records[y] && obj.records[y][x] && (processedValue || obj.options.copyCompatibility == true)) {\r\n value = obj.records[y][x].innerHTML;\r\n } else {\r\n if (obj.options.data[y] && obj.options.data[y][x] != 'undefined') {\r\n value = obj.options.data[y][x];\r\n }\r\n }\r\n }\r\n \r\n return value;\r\n }\r\n \r\n /**\r\n * Get the value from a coords\r\n * \r\n * @param int x\r\n * @param int y\r\n * @return string value\r\n */\r\n obj.getValueFromCoords = function(x, y, processedValue) {\r\n var value = null;\r\n \r\n if (x != null && y != null) {\r\n if ((obj.records[y] && obj.records[y][x]) && processedValue || obj.options.copyCompatibility == true) {\r\n value = obj.records[y][x].innerHTML;\r\n } else {\r\n if (obj.options.data[y] && obj.options.data[y][x] != 'undefined') {\r\n value = obj.options.data[y][x];\r\n }\r\n }\r\n }\r\n \r\n return value;\r\n }\r\n \r\n /**\r\n * Set a cell value\r\n * \r\n * @param mixed cell destination cell\r\n * @param string value value\r\n * @return void\r\n */\r\n obj.setValue = function(cell, value, force) {\r\n var records = [];\r\n \r\n if (typeof(cell) == 'string') {\r\n var columnId = jexcel.getIdFromColumnName(cell, true);\r\n var x = columnId[0];\r\n var y = columnId[1];\r\n \r\n // Update cell\r\n records.push(obj.updateCell(x, y, value, force));\r\n \r\n // Update all formulas in the chain\r\n obj.updateFormulaChain(x, y, records);\r\n } else {\r\n var x = null;\r\n var y = null;\r\n if (cell && cell.getAttribute) {\r\n var x = cell.getAttribute('data-x');\r\n var y = cell.getAttribute('data-y');\r\n }\r\n \r\n // Update cell\r\n if (x != null && y != null) {\r\n records.push(obj.updateCell(x, y, value, force));\r\n \r\n // Update all formulas in the chain\r\n obj.updateFormulaChain(x, y, records);\r\n } else {\r\n var keys = Object.keys(cell);\r\n if (keys.length > 0) {\r\n for (var i = 0; i < keys.length; i++) {\r\n if (typeof(cell[i]) == 'string') {\r\n var columnId = jexcel.getIdFromColumnName(cell[i], true);\r\n var x = columnId[0];\r\n var y = columnId[1];\r\n } else {\r\n if (cell[i].x != null && cell[i].y != null) {\r\n var x = cell[i].x;\r\n var y = cell[i].y;\r\n // Flexible setup\r\n if (cell[i].newValue != null) {\r\n value = cell[i].newValue;\r\n } else if (cell[i].value != null) {\r\n value = cell[i].value;\r\n }\r\n } else {\r\n var x = cell[i].getAttribute('data-x');\r\n var y = cell[i].getAttribute('data-y');\r\n }\r\n }\r\n \r\n // Update cell\r\n if (x != null && y != null) {\r\n records.push(obj.updateCell(x, y, value, force));\r\n \r\n // Update all formulas in the chain\r\n obj.updateFormulaChain(x, y, records);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Update history\r\n obj.setHistory({\r\n action:'setValue',\r\n records:records,\r\n selection:obj.selectedCell,\r\n });\r\n \r\n // Update table with custom configurations if applicable\r\n obj.updateTable();\r\n \r\n // On after changes\r\n obj.onafterchanges(el, records);\r\n }\r\n \r\n /**\r\n * Set a cell value based on coordinates\r\n * \r\n * @param int x destination cell\r\n * @param int y destination cell\r\n * @param string value\r\n * @return void\r\n */\r\n obj.setValueFromCoords = function(x, y, value, force) {\r\n var records = [];\r\n records.push(obj.updateCell(x, y, value, force));\r\n \r\n // Update all formulas in the chain\r\n obj.updateFormulaChain(x, y, records);\r\n \r\n // Update history\r\n obj.setHistory({\r\n action:'setValue',\r\n records:records,\r\n selection:obj.selectedCell,\r\n });\r\n \r\n // Update table with custom configurations if applicable\r\n obj.updateTable();\r\n \r\n // On after changes\r\n obj.onafterchanges(el, records);\r\n }\r\n \r\n /**\r\n * Toogle\r\n */\r\n obj.setCheckRadioValue = function() {\r\n var records = [];\r\n var keys = Object.keys(obj.highlighted);\r\n for (var i = 0; i < keys.length; i++) {\r\n var x = obj.highlighted[i].getAttribute('data-x');\r\n var y = obj.highlighted[i].getAttribute('data-y');\r\n \r\n if (obj.options.columns[x].type == 'checkbox' || obj.options.columns[x].type == 'radio') {\r\n // Update cell\r\n records.push(obj.updateCell(x, y, ! obj.options.data[y][x]));\r\n }\r\n }\r\n \r\n if (records.length) {\r\n // Update history\r\n obj.setHistory({\r\n action:'setValue',\r\n records:records,\r\n selection:obj.selectedCell,\r\n });\r\n \r\n // On after changes\r\n obj.onafterchanges(el, records);\r\n }\r\n }\r\n /**\r\n * Strip tags\r\n */\r\n var stripScript = function(a) {\r\n var b = new Option;\r\n b.innerHTML = a;\r\n var c = null;\r\n for (a = b.getElementsByTagName('script'); c=a[0];) c.parentNode.removeChild(c);\r\n return b.innerHTML;\r\n }\r\n\r\n /**\r\n * Update cell content\r\n * \r\n * @param object cell\r\n * @return void\r\n */\r\n obj.updateCell = function(x, y, value, force) {\r\n // Changing value depending on the column type\r\n if (obj.records[y][x].classList.contains('readonly') == true && ! force) {\r\n // Do nothing\r\n var record = {\r\n x: x,\r\n y: y,\r\n col: x,\r\n row: y\r\n }\r\n } else {\r\n // Security\r\n if ((''+value).substr(0,1) == '=' && obj.options.secureFormulas == true) {\r\n var val = secureFormula(value);\r\n if (val != value) {\r\n // Update the data container\r\n value = val;\r\n }\r\n }\r\n\r\n // On change\r\n var val = obj.dispatch('onbeforechange', el, obj.records[y][x], x, y, value);\r\n\r\n // If you return something this will overwrite the value\r\n if (val != undefined) {\r\n value = val;\r\n }\r\n\r\n if (obj.options.columns[x].editor && typeof(obj.options.columns[x].editor.updateCell) == 'function') {\r\n value = obj.options.columns[x].editor.updateCell(obj.records[y][x], value, force);\r\n }\r\n\r\n // History format\r\n var record = {\r\n x: x,\r\n y: y,\r\n col: x,\r\n row: y,\r\n newValue: value,\r\n oldValue: obj.options.data[y][x],\r\n }\r\n\r\n if (obj.options.columns[x].editor) {\r\n // Update data and cell\r\n obj.options.data[y][x] = value;\r\n } else {\r\n // Native functions\r\n if (obj.options.columns[x].type == 'checkbox' || obj.options.columns[x].type == 'radio') {\r\n // Unchecked all options\r\n if (obj.options.columns[x].type == 'radio') {\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n obj.options.data[j][x] = false;\r\n }\r\n }\r\n\r\n // Update data and cell\r\n obj.records[y][x].children[0].checked = (value == 1 || value == true || value == 'true' || value == 'TRUE') ? true : false;\r\n obj.options.data[y][x] = obj.records[y][x].children[0].checked;\r\n } else if (obj.options.columns[x].type == 'dropdown' || obj.options.columns[x].type == 'autocomplete') {\r\n // Update data and cell\r\n obj.options.data[y][x] = value;\r\n obj.records[y][x].innerText = obj.getDropDownValue(x, value);\r\n } else if (obj.options.columns[x].type == 'calendar') {\r\n // Update calendar\r\n var formatted = jSuites.calendar.extractDateFromString(value, obj.options.columns[x].options.format);\r\n // Update data and cell\r\n obj.options.data[y][x] = value;\r\n obj.records[y][x].innerText = jSuites.calendar.getDateString(formatted ? formatted : value, obj.options.columns[x].options.format);\r\n } else if (obj.options.columns[x].type == 'color') {\r\n // Update color\r\n obj.options.data[y][x] = value;\r\n // Render\r\n if (obj.options.columns[x].render == 'square') {\r\n var color = document.createElement('div');\r\n color.className = 'color';\r\n color.style.backgroundColor = value;\r\n obj.records[y][x].innerText = '';\r\n obj.records[y][x].appendChild(color);\r\n } else {\r\n obj.records[y][x].style.color = value;\r\n obj.records[y][x].innerText = value;\r\n }\r\n } else if (obj.options.columns[x].type == 'image') {\r\n value = ''+value;\r\n obj.options.data[y][x] = value;\r\n obj.records[y][x].innerHTML = '';\r\n if (value && value.substr(0, 10) == 'data:image') {\r\n var img = document.createElement('img');\r\n img.src = value;\r\n obj.records[y][x].appendChild(img);\r\n }\r\n } else {\r\n // Update data and cell\r\n obj.options.data[y][x] = value;\r\n // Label\r\n if (obj.options.columns[x].type == 'html') {\r\n obj.records[y][x].innerHTML = stripScript(obj.parseValue(x, y, value));\r\n } else {\r\n if (obj.options.stripHTML === false || obj.options.columns[x].stripHTML === false) {\r\n obj.records[y][x].innerHTML = stripScript(obj.parseValue(x, y, value));\r\n } else {\r\n obj.records[y][x].innerText = obj.parseValue(x, y, value);\r\n }\r\n }\r\n // Handle big text inside a cell\r\n if (obj.options.columns[x].wordWrap != false && (obj.options.wordWrap == true || obj.options.columns[x].wordWrap == true || obj.records[y][x].innerHTML.length > 200)) {\r\n obj.records[y][x].style.whiteSpace = 'pre-wrap';\r\n } else {\r\n obj.records[y][x].style.whiteSpace = '';\r\n }\r\n }\r\n }\r\n\r\n // Overflow\r\n if (x > 0) {\r\n if (value) {\r\n obj.records[y][x-1].style.overflow = 'hidden';\r\n } else {\r\n obj.records[y][x-1].style.overflow = '';\r\n }\r\n }\r\n\r\n // On change\r\n obj.dispatch('onchange', el, (obj.records[y] && obj.records[y][x] ? obj.records[y][x] : null), x, y, value, record.oldValue);\r\n }\r\n\r\n return record;\r\n }\r\n\r\n /**\r\n * Helper function to copy data using the corner icon\r\n */\r\n obj.copyData = function(o, d) {\r\n // Get data from all selected cells\r\n var data = obj.getData(true, true);\r\n\r\n // Selected cells\r\n var h = obj.selectedContainer;\r\n\r\n // Cells\r\n var x1 = parseInt(o.getAttribute('data-x'));\r\n var y1 = parseInt(o.getAttribute('data-y'));\r\n var x2 = parseInt(d.getAttribute('data-x'));\r\n var y2 = parseInt(d.getAttribute('data-y'));\r\n\r\n // Records\r\n var records = [];\r\n var breakControl = false;\r\n\r\n if (h[0] == x1) {\r\n // Vertical copy\r\n if (y1 < h[1]) {\r\n var rowNumber = y1 - h[1];\r\n } else {\r\n var rowNumber = 1;\r\n }\r\n var colNumber = 0;\r\n } else {\r\n if (x1 < h[0]) {\r\n var colNumber = x1 - h[0];\r\n } else {\r\n var colNumber = 1;\r\n }\r\n var rowNumber = 0;\r\n }\r\n\r\n // Copy data procedure\r\n var posx = 0;\r\n var posy = 0;\r\n\r\n for (var j = y1; j <= y2; j++) {\r\n // Skip hidden rows\r\n if (obj.rows[j] && obj.rows[j].style.display == 'none') {\r\n continue;\r\n }\r\n\r\n // Controls\r\n if (data[posy] == undefined) {\r\n posy = 0;\r\n }\r\n posx = 0;\r\n\r\n // Data columns\r\n if (h[0] != x1) {\r\n if (x1 < h[0]) {\r\n var colNumber = x1 - h[0];\r\n } else {\r\n var colNumber = 1;\r\n }\r\n }\r\n // Data columns\r\n for (var i = x1; i <= x2; i++) {\r\n // Update non-readonly\r\n if (obj.records[j][i] && ! obj.records[j][i].classList.contains('readonly') && obj.records[j][i].style.display != 'none' && breakControl == false) {\r\n // Stop if contains value\r\n if (! obj.selection.length) {\r\n if (obj.options.data[j][i] != '') {\r\n breakControl = true;\r\n continue;\r\n }\r\n }\r\n \r\n // Column\r\n if (data[posy] == undefined) {\r\n posx = 0;\r\n } else if (data[posy][posx] == undefined) {\r\n posx = 0;\r\n }\r\n\r\n // Value\r\n var value = data[posy][posx];\r\n \r\n if (value && ! data[1] && obj.options.autoIncrement == true) {\r\n if (obj.options.columns[i].type == 'text' || obj.options.columns[i].type == 'number') {\r\n if ((''+value).substr(0,1) == '=') {\r\n var tokens = value.match(/([A-Z]+[0-9]+)/g);\r\n \r\n if (tokens) {\r\n var affectedTokens = [];\r\n for (var index = 0; index < tokens.length; index++) {\r\n var position = jexcel.getIdFromColumnName(tokens[index], 1);\r\n position[0] += colNumber;\r\n position[1] += rowNumber;\r\n if (position[1] < 0) {\r\n position[1] = 0;\r\n }\r\n var token = jexcel.getColumnNameFromId([position[0], position[1]]);\r\n \r\n if (token != tokens[index]) {\r\n affectedTokens[tokens[index]] = token;\r\n }\r\n }\r\n // Update formula\r\n if (affectedTokens) {\r\n value = obj.updateFormula(value, affectedTokens)\r\n }\r\n }\r\n } else {\r\n if (value == Number(value)) {\r\n value = Number(value) + rowNumber;\r\n }\r\n }\r\n } else if (obj.options.columns[i].type == 'calendar') {\r\n var date = new Date(value);\r\n date.setDate(date.getDate() + rowNumber);\r\n value = date.getFullYear() + '-' + jexcel.doubleDigitFormat(parseInt(date.getMonth() + 1)) + '-' + jexcel.doubleDigitFormat(date.getDate()) + ' ' + '00:00:00';\r\n }\r\n }\r\n \r\n records.push(obj.updateCell(i, j, value));\r\n \r\n // Update all formulas in the chain\r\n obj.updateFormulaChain(i, j, records);\r\n }\r\n posx++;\r\n if (h[0] != x1) {\r\n colNumber++;\r\n }\r\n }\r\n posy++;\r\n rowNumber++;\r\n }\r\n \r\n // Update history\r\n obj.setHistory({\r\n action:'setValue',\r\n records:records,\r\n selection:obj.selectedCell,\r\n });\r\n \r\n // Update table with custom configuration if applicable\r\n obj.updateTable();\r\n \r\n // On after changes\r\n obj.onafterchanges(el, records);\r\n }\r\n \r\n /**\r\n * Refresh current selection\r\n */\r\n obj.refreshSelection = function() {\r\n if (obj.selectedCell) {\r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n }\r\n }\r\n \r\n /**\r\n * Move coords to A1 in case ovelaps with an excluded cell\r\n */\r\n obj.conditionalSelectionUpdate = function(type, o, d) {\r\n if (type == 1) {\r\n if (obj.selectedCell && ((o >= obj.selectedCell[1] && o <= obj.selectedCell[3]) || (d >= obj.selectedCell[1] && d <= obj.selectedCell[3]))) {\r\n obj.resetSelection();\r\n return;\r\n }\r\n } else {\r\n if (obj.selectedCell && ((o >= obj.selectedCell[0] && o <= obj.selectedCell[2]) || (d >= obj.selectedCell[0] && d <= obj.selectedCell[2]))) {\r\n obj.resetSelection();\r\n return;\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Clear table selection\r\n */\r\n obj.resetSelection = function(blur) {\r\n // Remove style\r\n if (! obj.highlighted.length) {\r\n var previousStatus = 0;\r\n } else {\r\n var previousStatus = 1;\r\n \r\n for (var i = 0; i < obj.highlighted.length; i++) {\r\n obj.highlighted[i].classList.remove('highlight');\r\n obj.highlighted[i].classList.remove('highlight-left');\r\n obj.highlighted[i].classList.remove('highlight-right');\r\n obj.highlighted[i].classList.remove('highlight-top');\r\n obj.highlighted[i].classList.remove('highlight-bottom');\r\n obj.highlighted[i].classList.remove('highlight-selected');\r\n \r\n var px = parseInt(obj.highlighted[i].getAttribute('data-x'));\r\n var py = parseInt(obj.highlighted[i].getAttribute('data-y'));\r\n \r\n // Check for merged cells\r\n if (obj.highlighted[i].getAttribute('data-merged')) {\r\n var colspan = parseInt(obj.highlighted[i].getAttribute('colspan'));\r\n var rowspan = parseInt(obj.highlighted[i].getAttribute('rowspan'));\r\n var ux = colspan > 0 ? px + (colspan - 1) : px;\r\n var uy = rowspan > 0 ? py + (rowspan - 1): py;\r\n } else {\r\n var ux = px;\r\n var uy = py;\r\n }\r\n \r\n // Remove selected from headers\r\n for (var j = px; j <= ux; j++) {\r\n if (obj.headers[j]) {\r\n obj.headers[j].classList.remove('selected');\r\n }\r\n }\r\n \r\n // Remove selected from rows\r\n for (var j = py; j <= uy; j++) {\r\n if (obj.rows[j]) {\r\n obj.rows[j].classList.remove('selected');\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Reset highlighed cells\r\n obj.highlighted = [];\r\n \r\n // Reset\r\n obj.selectedCell = null;\r\n \r\n // Hide corner\r\n obj.corner.style.top = '-2000px';\r\n obj.corner.style.left = '-2000px';\r\n \r\n if (blur == true && previousStatus == 1) {\r\n obj.dispatch('onblur', el);\r\n }\r\n \r\n return previousStatus;\r\n }\r\n \r\n /**\r\n * Update selection based on two cells\r\n */\r\n obj.updateSelection = function(el1, el2, origin) {\r\n var x1 = el1.getAttribute('data-x');\r\n var y1 = el1.getAttribute('data-y');\r\n if (el2) {\r\n var x2 = el2.getAttribute('data-x');\r\n var y2 = el2.getAttribute('data-y');\r\n } else {\r\n var x2 = x1;\r\n var y2 = y1;\r\n }\r\n \r\n obj.updateSelectionFromCoords(x1, y1, x2, y2, origin);\r\n }\r\n \r\n /**\r\n * Update selection from coords\r\n */\r\n obj.updateSelectionFromCoords = function(x1, y1, x2, y2, origin) {\r\n // Reset Selection\r\n var updated = null;\r\n var previousState = obj.resetSelection();\r\n \r\n // select column\r\n if (y1 == null) {\r\n y1 = 0;\r\n y2 = obj.rows.length - 1; \r\n }\r\n\r\n // Same element\r\n if (x2 == null) {\r\n x2 = x1;\r\n }\r\n if (y2 == null) {\r\n y2 = y1;\r\n }\r\n \r\n // Selection must be within the existing data\r\n if (x1 >= obj.headers.length) {\r\n x1 = obj.headers.length - 1;\r\n }\r\n if (y1 >= obj.rows.length) {\r\n y1 = obj.rows.length - 1;\r\n }\r\n if (x2 >= obj.headers.length) {\r\n x2 = obj.headers.length - 1;\r\n }\r\n if (y2 >= obj.rows.length) {\r\n y2 = obj.rows.length - 1;\r\n }\r\n \r\n // Keep selected cell\r\n obj.selectedCell = [x1, y1, x2, y2];\r\n \r\n // Select cells\r\n if (x1 != null) {\r\n // Add selected cell\r\n if (obj.records[y1][x1]) {\r\n obj.records[y1][x1].classList.add('highlight-selected');\r\n }\r\n \r\n // Origin & Destination\r\n if (parseInt(x1) < parseInt(x2)) {\r\n var px = parseInt(x1);\r\n var ux = parseInt(x2);\r\n } else {\r\n var px = parseInt(x2);\r\n var ux = parseInt(x1);\r\n }\r\n \r\n if (parseInt(y1) < parseInt(y2)) {\r\n var py = parseInt(y1);\r\n var uy = parseInt(y2);\r\n } else {\r\n var py = parseInt(y2);\r\n var uy = parseInt(y1);\r\n }\r\n \r\n // Verify merged columns\r\n for (var i = px; i <= ux; i++) {\r\n for (var j = py; j <= uy; j++) {\r\n if (obj.records[j][i] && obj.records[j][i].getAttribute('data-merged')) {\r\n var x = parseInt(obj.records[j][i].getAttribute('data-x'));\r\n var y = parseInt(obj.records[j][i].getAttribute('data-y'));\r\n var colspan = parseInt(obj.records[j][i].getAttribute('colspan'));\r\n var rowspan = parseInt(obj.records[j][i].getAttribute('rowspan'));\r\n \r\n if (colspan > 1) {\r\n if (x < px) {\r\n px = x;\r\n }\r\n if (x + colspan > ux) {\r\n ux = x + colspan - 1;\r\n }\r\n }\r\n \r\n if (rowspan) {\r\n if (y < py) {\r\n py = y;\r\n \r\n }\r\n if (y + rowspan > uy) {\r\n uy = y + rowspan - 1;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Limits\r\n var borderLeft = null;\r\n var borderRight = null;\r\n var borderTop = null;\r\n var borderBottom = null;\r\n \r\n // Vertical limits\r\n for (var j = py; j <= uy; j++) {\r\n if (obj.rows[j].style.display != 'none') {\r\n if (borderTop == null) {\r\n borderTop = j;\r\n }\r\n borderBottom = j;\r\n }\r\n }\r\n \r\n // Redefining styles\r\n for (var i = px; i <= ux; i++) {\r\n for (var j = py; j <= uy; j++) {\r\n if (obj.rows[j].style.display != 'none' && obj.records[j][i].style.display != 'none') {\r\n obj.records[j][i].classList.add('highlight');\r\n obj.highlighted.push(obj.records[j][i]);\r\n }\r\n }\r\n \r\n // Horizontal limits\r\n if (obj.options.columns[i].type != 'hidden') {\r\n if (borderLeft == null) {\r\n borderLeft = i;\r\n }\r\n borderRight = i;\r\n }\r\n }\r\n \r\n // Create borders\r\n if (! borderLeft) {\r\n borderLeft = 0;\r\n }\r\n if (! borderRight) {\r\n borderRight = 0;\r\n }\r\n for (var i = borderLeft; i <= borderRight; i++) {\r\n if (obj.options.columns[i].type != 'hidden') {\r\n // Top border\r\n if (obj.records[borderTop] && obj.records[borderTop][i]) {\r\n obj.records[borderTop][i].classList.add('highlight-top');\r\n }\r\n // Bottom border\r\n if (obj.records[borderBottom] && obj.records[borderBottom][i]) {\r\n obj.records[borderBottom][i].classList.add('highlight-bottom');\r\n }\r\n // Add selected from headers\r\n obj.headers[i].classList.add('selected');\r\n }\r\n }\r\n \r\n for (var j = borderTop; j <= borderBottom; j++) {\r\n if (obj.rows[j] && obj.rows[j].style.display != 'none') {\r\n // Left border\r\n obj.records[j][borderLeft].classList.add('highlight-left');\r\n // Right border\r\n obj.records[j][borderRight].classList.add('highlight-right');\r\n // Add selected from rows\r\n obj.rows[j].classList.add('selected');\r\n }\r\n }\r\n \r\n obj.selectedContainer = [ borderLeft, borderTop, borderRight, borderBottom ];\r\n }\r\n \r\n // Handle events\r\n if (previousState == 0) {\r\n obj.dispatch('onfocus', el);\r\n\r\n obj.removeCopyingSelection();\r\n }\r\n\r\n obj.dispatch('onselection', el, borderLeft, borderTop, borderRight, borderBottom, origin);\r\n\r\n // Find corner cell\r\n obj.updateCornerPosition();\r\n }\r\n \r\n /**\r\n * Remove copy selection\r\n * \r\n * @return void\r\n */\r\n obj.removeCopySelection = function() {\r\n // Remove current selection\r\n for (var i = 0; i < obj.selection.length; i++) {\r\n obj.selection[i].classList.remove('selection');\r\n obj.selection[i].classList.remove('selection-left');\r\n obj.selection[i].classList.remove('selection-right');\r\n obj.selection[i].classList.remove('selection-top');\r\n obj.selection[i].classList.remove('selection-bottom');\r\n }\r\n \r\n obj.selection = [];\r\n }\r\n \r\n /**\r\n * Update copy selection\r\n * \r\n * @param int x, y\r\n * @return void\r\n */\r\n obj.updateCopySelection = function(x3, y3) {\r\n // Remove selection\r\n obj.removeCopySelection();\r\n \r\n // Get elements first and last\r\n var x1 = obj.selectedContainer[0];\r\n var y1 = obj.selectedContainer[1];\r\n var x2 = obj.selectedContainer[2];\r\n var y2 = obj.selectedContainer[3];\r\n \r\n if (x3 != null && y3 != null) {\r\n if (x3 - x2 > 0) {\r\n var px = parseInt(x2) + 1;\r\n var ux = parseInt(x3);\r\n } else {\r\n var px = parseInt(x3);\r\n var ux = parseInt(x1) - 1;\r\n }\r\n \r\n if (y3 - y2 > 0) {\r\n var py = parseInt(y2) + 1;\r\n var uy = parseInt(y3);\r\n } else {\r\n var py = parseInt(y3);\r\n var uy = parseInt(y1) - 1;\r\n }\r\n \r\n if (ux - px <= uy - py) {\r\n var px = parseInt(x1);\r\n var ux = parseInt(x2);\r\n } else {\r\n var py = parseInt(y1);\r\n var uy = parseInt(y2);\r\n }\r\n \r\n for (var j = py; j <= uy; j++) {\r\n for (var i = px; i <= ux; i++) {\r\n if (obj.records[j][i] && obj.rows[j].style.display != 'none' && obj.records[j][i].style.display != 'none') {\r\n obj.records[j][i].classList.add('selection');\r\n obj.records[py][i].classList.add('selection-top');\r\n obj.records[uy][i].classList.add('selection-bottom');\r\n obj.records[j][px].classList.add('selection-left');\r\n obj.records[j][ux].classList.add('selection-right');\r\n \r\n // Persist selected elements\r\n obj.selection.push(obj.records[j][i]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Update corner position\r\n * \r\n * @return void\r\n */\r\n obj.updateCornerPosition = function() {\r\n // If any selected cells\r\n if (! obj.highlighted.length) {\r\n obj.corner.style.top = '-2000px';\r\n obj.corner.style.left = '-2000px';\r\n } else {\r\n // Get last cell\r\n var last = obj.highlighted[obj.highlighted.length-1];\r\n\r\n var contentRect = obj.content.getBoundingClientRect();\r\n var x1 = contentRect.left;\r\n var y1 = contentRect.top;\r\n\r\n var lastRect = last.getBoundingClientRect();\r\n var x2 = lastRect.left;\r\n var y2 = lastRect.top;\r\n var w2 = lastRect.width;\r\n var h2 = lastRect.height;\r\n\r\n var x = (x2 - x1) + obj.content.scrollLeft + w2 - 4;\r\n var y = (y2 - y1) + obj.content.scrollTop + h2 - 4;\r\n\r\n // Place the corner in the correct place\r\n obj.corner.style.top = y + 'px';\r\n obj.corner.style.left = x + 'px';\r\n\r\n if (obj.options.freezeColumns) {\r\n var width = obj.getFreezeWidth();\r\n if (x2 - x1 + w2 < width) {\r\n obj.corner.style.display = 'none';\r\n } else {\r\n if (obj.options.selectionCopy == true) {\r\n obj.corner.style.display = '';\r\n }\r\n }\r\n } else {\r\n if (obj.options.selectionCopy == true) {\r\n obj.corner.style.display = '';\r\n }\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Update scroll position based on the selection\r\n */\r\n obj.updateScroll = function(direction) {\r\n // Jspreadsheet Container information\r\n var contentRect = obj.content.getBoundingClientRect();\r\n var x1 = contentRect.left;\r\n var y1 = contentRect.top;\r\n var w1 = contentRect.width;\r\n var h1 = contentRect.height;\r\n\r\n // Direction Left or Up\r\n var reference = obj.records[obj.selectedCell[3]][obj.selectedCell[2]];\r\n \r\n // Reference\r\n var referenceRect = reference.getBoundingClientRect();\r\n var x2 = referenceRect.left;\r\n var y2 = referenceRect.top;\r\n var w2 = referenceRect.width;\r\n var h2 = referenceRect.height;\r\n \r\n // Direction\r\n if (direction == 0 || direction == 1) {\r\n var x = (x2 - x1) + obj.content.scrollLeft;\r\n var y = (y2 - y1) + obj.content.scrollTop - 2;\r\n } else {\r\n var x = (x2 - x1) + obj.content.scrollLeft + w2;\r\n var y = (y2 - y1) + obj.content.scrollTop + h2;\r\n }\r\n \r\n // Top position check\r\n if (y > (obj.content.scrollTop + 30) && y < (obj.content.scrollTop + h1)) {\r\n // In the viewport\r\n } else {\r\n // Out of viewport\r\n if (y < obj.content.scrollTop + 30) {\r\n obj.content.scrollTop = y - h2;\r\n } else {\r\n obj.content.scrollTop = y - (h1 - 2);\r\n }\r\n }\r\n \r\n // Freeze columns? \r\n var freezed = obj.getFreezeWidth();\r\n\r\n // Left position check - TODO: change that to the bottom border of the element\r\n if (x > (obj.content.scrollLeft + freezed) && x < (obj.content.scrollLeft + w1)) {\r\n // In the viewport\r\n } else {\r\n // Out of viewport\r\n if (x < obj.content.scrollLeft + 30) {\r\n obj.content.scrollLeft = x;\r\n if (obj.content.scrollLeft < 50) {\r\n obj.content.scrollLeft = 0;\r\n }\r\n } else if (x < obj.content.scrollLeft + freezed) {\r\n obj.content.scrollLeft = x - freezed - 1;\r\n } else {\r\n obj.content.scrollLeft = x - (w1 - 20);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Get the column width\r\n * \r\n * @param int column column number (first column is: 0)\r\n * @return int current width\r\n */\r\n obj.getWidth = function(column) {\r\n if (! column) {\r\n // Get all headers\r\n var data = [];\r\n for (var i = 0; i < obj.headers.length; i++) {\r\n data.push(obj.options.columns[i].width);\r\n }\r\n } else {\r\n // In case the column is an object\r\n if (typeof(column) == 'object') {\r\n column = $(column).getAttribute('data-x');\r\n }\r\n \r\n data = obj.colgroup[column].getAttribute('width')\r\n }\r\n \r\n return data;\r\n }\r\n\r\n\r\n /**\r\n * Set the column width\r\n * \r\n * @param int column number (first column is: 0)\r\n * @param int new column width\r\n * @param int old column width\r\n */\r\n obj.setWidth = function (column, width, oldWidth) {\r\n if (width) {\r\n if (Array.isArray(column)) {\r\n // Oldwidth\r\n if (! oldWidth) {\r\n var oldWidth = [];\r\n }\r\n // Set width\r\n for (var i = 0; i < column.length; i++) {\r\n if (! oldWidth[i]) {\r\n oldWidth[i] = obj.colgroup[column[i]].getAttribute('width');\r\n }\r\n var w = Array.isArray(width) && width[i] ? width[i] : width;\r\n obj.colgroup[column[i]].setAttribute('width', w);\r\n obj.options.columns[column[i]].width = w;\r\n }\r\n } else {\r\n // Oldwidth\r\n if (! oldWidth) {\r\n oldWidth = obj.colgroup[column].getAttribute('width');\r\n }\r\n // Set width\r\n obj.colgroup[column].setAttribute('width', width);\r\n obj.options.columns[column].width = width;\r\n }\r\n\r\n // Keeping history of changes\r\n obj.setHistory({\r\n action:'setWidth',\r\n column:column,\r\n oldValue:oldWidth,\r\n newValue:width,\r\n });\r\n\r\n // On resize column\r\n obj.dispatch('onresizecolumn', el, column, width, oldWidth);\r\n\r\n // Update corner position\r\n obj.updateCornerPosition();\r\n }\r\n }\r\n\r\n /**\r\n * Set the row height\r\n * \r\n * @param row - row number (first row is: 0)\r\n * @param height - new row height\r\n * @param oldHeight - old row height\r\n */\r\n obj.setHeight = function (row, height, oldHeight) {\r\n if (height > 0) {\r\n // In case the column is an object\r\n if (typeof(row) == 'object') {\r\n row = row.getAttribute('data-y');\r\n }\r\n \r\n // Oldwidth\r\n if (! oldHeight) {\r\n oldHeight = obj.rows[row].getAttribute('height');\r\n\r\n if (! oldHeight) {\r\n var rect = obj.rows[row].getBoundingClientRect();\r\n oldHeight = rect.height;\r\n }\r\n }\r\n\r\n // Integer\r\n height = parseInt(height);\r\n\r\n // Set width\r\n obj.rows[row].style.height = height + 'px';\r\n \r\n // Keep options updated\r\n if (! obj.options.rows[row]) {\r\n obj.options.rows[row] = {};\r\n }\r\n obj.options.rows[row].height = height;\r\n \r\n // Keeping history of changes\r\n obj.setHistory({\r\n action:'setHeight',\r\n row:row,\r\n oldValue:oldHeight,\r\n newValue:height,\r\n });\r\n\r\n // On resize column\r\n obj.dispatch('onresizerow', el, row, height, oldHeight);\r\n\r\n // Update corner position\r\n obj.updateCornerPosition();\r\n }\r\n }\r\n \r\n /**\r\n * Get the row height\r\n * \r\n * @param row - row number (first row is: 0)\r\n * @return height - current row height\r\n */\r\n obj.getHeight = function(row) {\r\n if (! row) {\r\n // Get height of all rows\r\n var data = [];\r\n for (var j = 0; j < obj.rows.length; j++) {\r\n var h = obj.rows[j].style.height;\r\n if (h) {\r\n data[j] = h;\r\n }\r\n }\r\n } else {\r\n // In case the row is an object\r\n if (typeof(row) == 'object') {\r\n row = $(row).getAttribute('data-y');\r\n }\r\n \r\n var data = obj.rows[row].style.height;\r\n }\r\n \r\n return data;\r\n }\r\n \r\n obj.setFooter = function(data) {\r\n if (data) {\r\n obj.options.footers = data;\r\n }\r\n\r\n if (obj.options.footers) {\r\n if (! obj.tfoot) {\r\n obj.tfoot = document.createElement('tfoot');\r\n obj.table.appendChild(obj.tfoot);\r\n } \r\n\r\n for (var j = 0; j < obj.options.footers.length; j++) {\r\n if (obj.tfoot.children[j]) {\r\n var tr = obj.tfoot.children[j];\r\n } else {\r\n var tr = document.createElement('tr');\r\n var td = document.createElement('td');\r\n tr.appendChild(td);\r\n obj.tfoot.appendChild(tr);\r\n }\r\n for (var i = 0; i < obj.headers.length; i++) {\r\n if (! obj.options.footers[j][i]) {\r\n obj.options.footers[j][i] = '';\r\n }\r\n if (obj.tfoot.children[j].children[i+1]) {\r\n var td = obj.tfoot.children[j].children[i+1];\r\n } else {\r\n var td = document.createElement('td');\r\n tr.appendChild(td);\r\n\r\n // Text align\r\n var colAlign = obj.options.columns[i].align ? obj.options.columns[i].align : 'center';\r\n td.style.textAlign = colAlign;\r\n }\r\n td.innerText = obj.parseValue(i, j, obj.options.footers[j][i]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the column title\r\n * \r\n * @param column - column number (first column is: 0)\r\n * @param title - new column title\r\n */\r\n obj.getHeader = function(column) {\r\n return obj.headers[column].innerText;\r\n }\r\n \r\n /**\r\n * Set the column title\r\n * \r\n * @param column - column number (first column is: 0)\r\n * @param title - new column title\r\n */\r\n obj.setHeader = function(column, newValue) {\r\n if (obj.headers[column]) {\r\n var oldValue = obj.headers[column].innerText;\r\n \r\n if (! newValue) {\r\n newValue = prompt(obj.options.text.columnName, oldValue)\r\n }\r\n \r\n if (newValue) {\r\n obj.headers[column].innerText = newValue;\r\n // Keep the title property\r\n obj.headers[column].setAttribute('title', newValue);\r\n // Update title\r\n obj.options.columns[column].title = newValue;\r\n }\r\n \r\n obj.setHistory({\r\n action: 'setHeader',\r\n column: column,\r\n oldValue: oldValue,\r\n newValue: newValue\r\n });\r\n \r\n // On onchange header\r\n obj.dispatch('onchangeheader', el, column, oldValue, newValue);\r\n }\r\n }\r\n \r\n /**\r\n * Get the headers\r\n * \r\n * @param asArray\r\n * @return mixed\r\n */\r\n obj.getHeaders = function (asArray) {\r\n var title = [];\r\n \r\n for (var i = 0; i < obj.headers.length; i++) {\r\n title.push(obj.getHeader(i));\r\n }\r\n \r\n return asArray ? title : title.join(obj.options.csvDelimiter);\r\n }\r\n \r\n /**\r\n * Get meta information from cell(s)\r\n * \r\n * @return integer\r\n */\r\n obj.getMeta = function(cell, key) {\r\n if (! cell) {\r\n return obj.options.meta;\r\n } else {\r\n if (key) {\r\n return obj.options.meta[cell] && obj.options.meta[cell][key] ? obj.options.meta[cell][key] : null;\r\n } else {\r\n return obj.options.meta[cell] ? obj.options.meta[cell] : null;\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Set meta information to cell(s)\r\n * \r\n * @return integer\r\n */\r\n obj.setMeta = function(o, k, v) {\r\n if (! obj.options.meta) {\r\n obj.options.meta = {}\r\n }\r\n \r\n if (k && v) {\r\n // Set data value\r\n if (! obj.options.meta[o]) {\r\n obj.options.meta[o] = {};\r\n }\r\n obj.options.meta[o][k] = v;\r\n } else {\r\n // Apply that for all cells\r\n var keys = Object.keys(o);\r\n for (var i = 0; i < keys.length; i++) {\r\n if (! obj.options.meta[keys[i]]) {\r\n obj.options.meta[keys[i]] = {};\r\n }\r\n \r\n var prop = Object.keys(o[keys[i]]);\r\n for (var j = 0; j < prop.length; j++) {\r\n obj.options.meta[keys[i]][prop[j]] = o[keys[i]][prop[j]];\r\n }\r\n }\r\n }\r\n \r\n obj.dispatch('onchangemeta', el, o, k, v);\r\n }\r\n \r\n /**\r\n * Update meta information\r\n * \r\n * @return integer\r\n */\r\n obj.updateMeta = function(affectedCells) {\r\n if (obj.options.meta) {\r\n var newMeta = {};\r\n var keys = Object.keys(obj.options.meta);\r\n for (var i = 0; i < keys.length; i++) {\r\n if (affectedCells[keys[i]]) {\r\n newMeta[affectedCells[keys[i]]] = obj.options.meta[keys[i]];\r\n } else {\r\n newMeta[keys[i]] = obj.options.meta[keys[i]];\r\n }\r\n }\r\n // Update meta information\r\n obj.options.meta = newMeta;\r\n }\r\n }\r\n \r\n /**\r\n * Get style information from cell(s)\r\n * \r\n * @return integer\r\n */\r\n obj.getStyle = function(cell, key) {\r\n // Cell\r\n if (! cell) {\r\n // Control vars\r\n var data = {};\r\n \r\n // Column and row length\r\n var x = obj.options.data[0].length;\r\n var y = obj.options.data.length;\r\n \r\n // Go through the columns to get the data\r\n for (var j = 0; j < y; j++) {\r\n for (var i = 0; i < x; i++) {\r\n // Value\r\n var v = key ? obj.records[j][i].style[key] : obj.records[j][i].getAttribute('style');\r\n \r\n // Any meta data for this column?\r\n if (v) {\r\n // Column name\r\n var k = jexcel.getColumnNameFromId([i, j]);\r\n // Value\r\n data[k] = v;\r\n }\r\n }\r\n }\r\n \r\n return data;\r\n } else {\r\n cell = jexcel.getIdFromColumnName(cell, true);\r\n \r\n return key ? obj.records[cell[1]][cell[0]].style[key] : obj.records[cell[1]][cell[0]].getAttribute('style');\r\n }\r\n },\r\n \r\n obj.resetStyle = function(o, ignoreHistoryAndEvents) {\r\n var keys = Object.keys(o);\r\n for (var i = 0; i < keys.length; i++) {\r\n // Position\r\n var cell = jexcel.getIdFromColumnName(keys[i], true);\r\n if (obj.records[cell[1]] && obj.records[cell[1]][cell[0]]) {\r\n obj.records[cell[1]][cell[0]].setAttribute('style', '');\r\n }\r\n }\r\n obj.setStyle(o, null, null, null, ignoreHistoryAndEvents);\r\n }\r\n \r\n /**\r\n * Set meta information to cell(s)\r\n * \r\n * @return integer\r\n */\r\n obj.setStyle = function(o, k, v, force, ignoreHistoryAndEvents) {\r\n var newValue = {};\r\n var oldValue = {};\r\n \r\n // Apply style\r\n var applyStyle = function(cellId, key, value) {\r\n // Position\r\n var cell = jexcel.getIdFromColumnName(cellId, true);\r\n \r\n if (obj.records[cell[1]] && obj.records[cell[1]][cell[0]] && (obj.records[cell[1]][cell[0]].classList.contains('readonly')==false || force)) {\r\n // Current value\r\n var currentValue = obj.records[cell[1]][cell[0]].style[key];\r\n \r\n // Change layout\r\n if (currentValue == value && ! force) {\r\n value = '';\r\n obj.records[cell[1]][cell[0]].style[key] = '';\r\n } else {\r\n obj.records[cell[1]][cell[0]].style[key] = value;\r\n }\r\n \r\n // History\r\n if (! oldValue[cellId]) {\r\n oldValue[cellId] = [];\r\n }\r\n if (! newValue[cellId]) {\r\n newValue[cellId] = [];\r\n }\r\n \r\n oldValue[cellId].push([key + ':' + currentValue]);\r\n newValue[cellId].push([key + ':' + value]);\r\n }\r\n }\r\n \r\n if (k && v) {\r\n // Get object from string\r\n if (typeof(o) == 'string') {\r\n applyStyle(o, k, v);\r\n } else {\r\n // Avoid duplications\r\n var oneApplication = [];\r\n // Apply that for all cells\r\n for (var i = 0; i < o.length; i++) {\r\n var x = o[i].getAttribute('data-x');\r\n var y = o[i].getAttribute('data-y');\r\n var cellName = jexcel.getColumnNameFromId([x, y]);\r\n // This happens when is a merged cell\r\n if (! oneApplication[cellName]) {\r\n applyStyle(cellName, k, v);\r\n oneApplication[cellName] = true;\r\n }\r\n }\r\n }\r\n } else {\r\n var keys = Object.keys(o);\r\n for (var i = 0; i < keys.length; i++) {\r\n var style = o[keys[i]];\r\n if (typeof(style) == 'string') {\r\n style = style.split(';');\r\n }\r\n for (var j = 0; j < style.length; j++) {\r\n if (typeof(style[j]) == 'string') {\r\n style[j] = style[j].split(':');\r\n }\r\n // Apply value\r\n if (style[j][0].trim()) {\r\n applyStyle(keys[i], style[j][0].trim(), style[j][1]);\r\n }\r\n }\r\n }\r\n }\r\n \r\n var keys = Object.keys(oldValue);\r\n for (var i = 0; i < keys.length; i++) {\r\n oldValue[keys[i]] = oldValue[keys[i]].join(';');\r\n }\r\n var keys = Object.keys(newValue);\r\n for (var i = 0; i < keys.length; i++) {\r\n newValue[keys[i]] = newValue[keys[i]].join(';');\r\n }\r\n \r\n if (! ignoreHistoryAndEvents) {\r\n // Keeping history of changes\r\n obj.setHistory({\r\n action: 'setStyle',\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n });\r\n }\r\n\r\n obj.dispatch('onchangestyle', el, o, k, v);\r\n }\r\n\r\n /**\r\n * Get cell comments, null cell for all\r\n */\r\n obj.getComments = function(cell, withAuthor) {\r\n if (cell) {\r\n if (typeof(cell) == 'string') {\r\n var cell = jexcel.getIdFromColumnName(cell, true);\r\n }\r\n\r\n if (withAuthor) {\r\n return [obj.records[cell[1]][cell[0]].getAttribute('title'), obj.records[cell[1]][cell[0]].getAttribute('author')];\r\n } else {\r\n return obj.records[cell[1]][cell[0]].getAttribute('title') || '';\r\n }\r\n } else {\r\n var data = {};\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n for (var i = 0; i < obj.options.columns.length; i++) {\r\n var comments = obj.records[j][i].getAttribute('title');\r\n if (comments) {\r\n var cell = jexcel.getColumnNameFromId([i, j]);\r\n data[cell] = comments;\r\n }\r\n }\r\n }\r\n return data;\r\n }\r\n }\r\n\r\n /**\r\n * Set cell comments\r\n */\r\n obj.setComments = function(cellId, comments, author) {\r\n if (typeof(cellId) == 'string') {\r\n var cell = jexcel.getIdFromColumnName(cellId, true);\r\n } else {\r\n var cell = cellId;\r\n }\r\n \r\n // Keep old value\r\n var title = obj.records[cell[1]][cell[0]].getAttribute('title');\r\n var author = obj.records[cell[1]][cell[0]].getAttribute('data-author');\r\n var oldValue = [ title, author ];\r\n \r\n // Set new values\r\n obj.records[cell[1]][cell[0]].setAttribute('title', comments ? comments : '');\r\n obj.records[cell[1]][cell[0]].setAttribute('data-author', author ? author : '');\r\n \r\n // Remove class if there is no comment\r\n if (comments) {\r\n obj.records[cell[1]][cell[0]].classList.add('jexcel_comments');\r\n } else {\r\n obj.records[cell[1]][cell[0]].classList.remove('jexcel_comments');\r\n }\r\n \r\n // Save history\r\n obj.setHistory({\r\n action:'setComments',\r\n column: cellId,\r\n newValue: [ comments, author ],\r\n oldValue: oldValue,\r\n });\r\n // Set comments\r\n obj.dispatch('oncomments', el, comments, title);\r\n }\r\n \r\n /**\r\n * Get table config information\r\n */\r\n obj.getConfig = function() {\r\n var options = obj.options;\r\n options.style = obj.getStyle();\r\n options.mergeCells = obj.getMerge();\r\n options.comments = obj.getComments();\r\n \r\n return options;\r\n }\r\n \r\n /**\r\n * Sort data and reload table\r\n */\r\n obj.orderBy = function(column, order) {\r\n if (column >= 0) {\r\n // Merged cells\r\n if (Object.keys(obj.options.mergeCells).length > 0) {\r\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\r\n return false;\r\n } else {\r\n // Remove merged cells\r\n obj.destroyMerged();\r\n }\r\n }\r\n \r\n // Direction\r\n if (order == null) {\r\n order = obj.headers[column].classList.contains('arrow-down') ? 1 : 0;\r\n } else {\r\n order = order ? 1 : 0;\r\n }\r\n \r\n // Test order\r\n var temp = [];\r\n if (obj.options.columns[column].type == 'number' || obj.options.columns[column].type == 'percentage' || obj.options.columns[column].type == 'autonumber' || obj.options.columns[column].type == 'color') {\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n temp[j] = [ j, Number(obj.options.data[j][column]) ];\r\n }\r\n } else if (obj.options.columns[column].type == 'calendar' || obj.options.columns[column].type == 'checkbox' || obj.options.columns[column].type == 'radio') {\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n temp[j] = [ j, obj.options.data[j][column] ];\r\n }\r\n } else {\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n temp[j] = [ j, obj.records[j][column].innerText.toLowerCase() ];\r\n }\r\n }\r\n \r\n // Default sorting method\r\n if (typeof(obj.options.sorting) !== 'function') {\r\n obj.options.sorting = function(direction) {\r\n return function(a, b) {\r\n var valueA = a[1];\r\n var valueB = b[1];\r\n\r\n if (! direction) {\r\n return (valueA === '' && valueB !== '') ? 1 : (valueA !== '' && valueB === '') ? -1 : (valueA > valueB) ? 1 : (valueA < valueB) ? -1 : 0;\r\n } else {\r\n return (valueA === '' && valueB !== '') ? 1 : (valueA !== '' && valueB === '') ? -1 : (valueA > valueB) ? -1 : (valueA < valueB) ? 1 : 0;\r\n }\r\n }\r\n }\r\n }\r\n\r\n temp = temp.sort(obj.options.sorting(order));\r\n \r\n // Save history\r\n var newValue = [];\r\n for (var j = 0; j < temp.length; j++) {\r\n newValue[j] = temp[j][0];\r\n }\r\n \r\n // Save history\r\n obj.setHistory({\r\n action: 'orderBy',\r\n rows: newValue,\r\n column: column,\r\n order: order,\r\n });\r\n \r\n // Update order\r\n obj.updateOrderArrow(column, order);\r\n obj.updateOrder(newValue);\r\n \r\n // On sort event\r\n obj.dispatch('onsort', el, column, order);\r\n \r\n return true;\r\n }\r\n }\r\n \r\n /**\r\n * Update order arrow\r\n */\r\n obj.updateOrderArrow = function(column, order) {\r\n // Remove order\r\n for (var i = 0; i < obj.headers.length; i++) {\r\n obj.headers[i].classList.remove('arrow-up');\r\n obj.headers[i].classList.remove('arrow-down');\r\n }\r\n \r\n // No order specified then toggle order\r\n if (order) {\r\n obj.headers[column].classList.add('arrow-up');\r\n } else {\r\n obj.headers[column].classList.add('arrow-down');\r\n }\r\n }\r\n \r\n /**\r\n * Update rows position\r\n */\r\n obj.updateOrder = function(rows) {\r\n // History\r\n var data = []\r\n for (var j = 0; j < rows.length; j++) {\r\n data[j] = obj.options.data[rows[j]];\r\n }\r\n obj.options.data = data;\r\n \r\n var data = []\r\n for (var j = 0; j < rows.length; j++) {\r\n data[j] = obj.records[rows[j]];\r\n }\r\n obj.records = data;\r\n \r\n var data = []\r\n for (var j = 0; j < rows.length; j++) {\r\n data[j] = obj.rows[rows[j]];\r\n }\r\n obj.rows = data;\r\n \r\n // Update references\r\n obj.updateTableReferences();\r\n \r\n // Redo search\r\n if (obj.results && obj.results.length) {\r\n if (obj.searchInput.value) {\r\n obj.search(obj.searchInput.value);\r\n } else {\r\n obj.closeFilter();\r\n }\r\n } else {\r\n // Create page\r\n obj.results = null;\r\n obj.pageNumber = 0;\r\n \r\n if (obj.options.pagination > 0) {\r\n obj.page(0);\r\n } else if (obj.options.lazyLoading == true) {\r\n obj.loadPage(0);\r\n } else {\r\n for (var j = 0; j < obj.rows.length; j++) {\r\n obj.tbody.appendChild(obj.rows[j]);\r\n }\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Move row\r\n * \r\n * @return void\r\n */\r\n obj.moveRow = function(o, d, ignoreDom) {\r\n if (Object.keys(obj.options.mergeCells).length > 0) {\r\n if (o > d) {\r\n var insertBefore = 1;\r\n } else {\r\n var insertBefore = 0;\r\n }\r\n\r\n if (obj.isRowMerged(o).length || obj.isRowMerged(d, insertBefore).length) {\r\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\r\n return false;\r\n } else {\r\n obj.destroyMerged();\r\n }\r\n }\r\n }\r\n \r\n if (obj.options.search == true) {\r\n if (obj.results && obj.results.length != obj.rows.length) {\r\n if (confirm(obj.options.text.thisActionWillClearYourSearchResultsAreYouSure)) {\r\n obj.resetSearch();\r\n } else {\r\n return false;\r\n }\r\n }\r\n \r\n obj.results = null;\r\n }\r\n \r\n if (! ignoreDom) {\r\n if (Array.prototype.indexOf.call(obj.tbody.children, obj.rows[d]) >= 0) {\r\n if (o > d) {\r\n obj.tbody.insertBefore(obj.rows[o], obj.rows[d]);\r\n } else {\r\n obj.tbody.insertBefore(obj.rows[o], obj.rows[d].nextSibling);\r\n }\r\n } else {\r\n obj.tbody.removeChild(obj.rows[o]);\r\n }\r\n }\r\n \r\n // Place references in the correct position\r\n obj.rows.splice(d, 0, obj.rows.splice(o, 1)[0]);\r\n obj.records.splice(d, 0, obj.records.splice(o, 1)[0]);\r\n obj.options.data.splice(d, 0, obj.options.data.splice(o, 1)[0]);\r\n \r\n // Respect pagination\r\n if (obj.options.pagination > 0 && obj.tbody.children.length != obj.options.pagination) {\r\n obj.page(obj.pageNumber);\r\n }\r\n \r\n // Keeping history of changes\r\n obj.setHistory({\r\n action:'moveRow',\r\n oldValue: o,\r\n newValue: d,\r\n });\r\n \r\n // Update table references\r\n obj.updateTableReferences();\r\n \r\n // Events\r\n obj.dispatch('onmoverow', el, o, d);\r\n }\r\n\r\n /**\r\n * Insert a new row\r\n * \r\n * @param mixed - number of blank lines to be insert or a single array with the data of the new row\r\n * @param rowNumber\r\n * @param insertBefore\r\n * @return void\r\n */\r\n obj.insertRow = function(mixed, rowNumber, insertBefore) {\r\n // Configuration\r\n if (obj.options.allowInsertRow == true) {\r\n // Records\r\n var records = [];\r\n \r\n // Data to be insert\r\n var data = [];\r\n \r\n // The insert could be lead by number of rows or the array of data\r\n if (mixed > 0) {\r\n var numOfRows = mixed;\r\n } else {\r\n var numOfRows = 1;\r\n \r\n if (mixed) {\r\n data = mixed;\r\n }\r\n }\r\n \r\n // Direction\r\n var insertBefore = insertBefore ? true : false;\r\n \r\n // Current column number\r\n var lastRow = obj.options.data.length - 1;\r\n \r\n if (rowNumber == undefined || rowNumber >= parseInt(lastRow) || rowNumber < 0) {\r\n rowNumber = lastRow;\r\n }\r\n \r\n // Onbeforeinsertrow\r\n if (obj.dispatch('onbeforeinsertrow', el, rowNumber, numOfRows, insertBefore) === false) {\r\n console.log('onbeforeinsertrow returned false');\r\n\r\n return false;\r\n }\r\n \r\n // Merged cells\r\n if (Object.keys(obj.options.mergeCells).length > 0) {\r\n if (obj.isRowMerged(rowNumber, insertBefore).length) {\r\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\r\n return false;\r\n } else {\r\n obj.destroyMerged();\r\n }\r\n }\r\n }\r\n \r\n // Clear any search\r\n if (obj.options.search == true) {\r\n if (obj.results && obj.results.length != obj.rows.length) {\r\n if (confirm(obj.options.text.thisActionWillClearYourSearchResultsAreYouSure)) {\r\n obj.resetSearch();\r\n } else {\r\n return false;\r\n }\r\n }\r\n \r\n obj.results = null;\r\n }\r\n \r\n // Insertbefore\r\n var rowIndex = (! insertBefore) ? rowNumber + 1 : rowNumber;\r\n\r\n // Keep the current data\r\n var currentRecords = obj.records.splice(rowIndex);\r\n var currentData = obj.options.data.splice(rowIndex);\r\n var currentRows = obj.rows.splice(rowIndex);\r\n \r\n // Adding lines\r\n var rowRecords = [];\r\n var rowData = [];\r\n var rowNode = [];\r\n\r\n for (var row = rowIndex; row < (numOfRows + rowIndex); row++) {\r\n // Push data to the data container\r\n obj.options.data[row] = [];\r\n for (var col = 0; col < obj.options.columns.length; col++) {\r\n obj.options.data[row][col] = data[col] ? data[col] : '';\r\n }\r\n // Create row\r\n var tr = obj.createRow(row, obj.options.data[row]);\r\n // Append node\r\n if (currentRows[0]) {\r\n if (Array.prototype.indexOf.call(obj.tbody.children, currentRows[0]) >= 0) {\r\n obj.tbody.insertBefore(tr, currentRows[0]);\r\n }\r\n } else {\r\n if (Array.prototype.indexOf.call(obj.tbody.children, obj.rows[rowNumber]) >= 0) {\r\n obj.tbody.appendChild(tr);\r\n }\r\n }\r\n // Record History\r\n rowRecords.push(obj.records[row]);\r\n rowData.push(obj.options.data[row]);\r\n rowNode.push(tr);\r\n }\r\n \r\n // Copy the data back to the main data\r\n Array.prototype.push.apply(obj.records, currentRecords);\r\n Array.prototype.push.apply(obj.options.data, currentData);\r\n Array.prototype.push.apply(obj.rows, currentRows);\r\n \r\n // Respect pagination\r\n if (obj.options.pagination > 0) {\r\n obj.page(obj.pageNumber);\r\n }\r\n \r\n // Keep history\r\n obj.setHistory({\r\n action: 'insertRow',\r\n rowNumber: rowNumber,\r\n numOfRows: numOfRows,\r\n insertBefore: insertBefore,\r\n rowRecords: rowRecords,\r\n rowData: rowData,\r\n rowNode: rowNode,\r\n });\r\n \r\n // Remove table references\r\n obj.updateTableReferences();\r\n \r\n // Events\r\n obj.dispatch('oninsertrow', el, rowNumber, numOfRows, rowRecords, insertBefore);\r\n }\r\n }\r\n \r\n /**\r\n * Delete a row by number\r\n * \r\n * @param integer rowNumber - row number to be excluded\r\n * @param integer numOfRows - number of lines\r\n * @return void\r\n */\r\n obj.deleteRow = function(rowNumber, numOfRows) {\r\n // Global Configuration\r\n if (obj.options.allowDeleteRow == true) {\r\n if (obj.options.allowDeletingAllRows == true || obj.options.data.length > 1) {\r\n // Delete row definitions\r\n if (rowNumber == undefined) {\r\n var number = obj.getSelectedRows();\r\n \r\n if (! number[0]) {\r\n rowNumber = obj.options.data.length - 1;\r\n numOfRows = 1;\r\n } else {\r\n rowNumber = parseInt(number[0].getAttribute('data-y'));\r\n numOfRows = number.length;\r\n }\r\n }\r\n \r\n // Last column\r\n var lastRow = obj.options.data.length - 1;\r\n \r\n if (rowNumber == undefined || rowNumber > lastRow || rowNumber < 0) {\r\n rowNumber = lastRow;\r\n }\r\n \r\n if (! numOfRows) {\r\n numOfRows = 1;\r\n }\r\n \r\n // Do not delete more than the number of recoreds\r\n if (rowNumber + numOfRows >= obj.options.data.length) {\r\n numOfRows = obj.options.data.length - rowNumber;\r\n }\r\n\r\n // Onbeforedeleterow\r\n if (obj.dispatch('onbeforedeleterow', el, rowNumber, numOfRows) === false) {\r\n console.log('onbeforedeleterow returned false');\r\n return false;\r\n }\r\n \r\n if (parseInt(rowNumber) > -1) {\r\n // Merged cells\r\n var mergeExists = false;\r\n if (Object.keys(obj.options.mergeCells).length > 0) {\r\n for (var row = rowNumber; row < rowNumber + numOfRows; row++) {\r\n if (obj.isRowMerged(row, false).length) {\r\n mergeExists = true;\r\n }\r\n }\r\n }\r\n if (mergeExists) {\r\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\r\n return false;\r\n } else {\r\n obj.destroyMerged();\r\n }\r\n }\r\n \r\n // Clear any search\r\n if (obj.options.search == true) {\r\n if (obj.results && obj.results.length != obj.rows.length) {\r\n if (confirm(obj.options.text.thisActionWillClearYourSearchResultsAreYouSure)) {\r\n obj.resetSearch();\r\n } else {\r\n return false;\r\n }\r\n }\r\n \r\n obj.results = null;\r\n }\r\n \r\n // If delete all rows, and set allowDeletingAllRows false, will stay one row\r\n if (obj.options.allowDeletingAllRows == false && lastRow + 1 === numOfRows) {\r\n numOfRows--;\r\n console.error('Jspreadsheet: It is not possible to delete the last row');\r\n }\r\n \r\n // Remove node\r\n for (var row = rowNumber; row < rowNumber + numOfRows; row++) {\r\n if (Array.prototype.indexOf.call(obj.tbody.children, obj.rows[row]) >= 0) {\r\n obj.rows[row].className = '';\r\n obj.rows[row].parentNode.removeChild(obj.rows[row]);\r\n }\r\n }\r\n \r\n // Remove data\r\n var rowRecords = obj.records.splice(rowNumber, numOfRows);\r\n var rowData = obj.options.data.splice(rowNumber, numOfRows);\r\n var rowNode = obj.rows.splice(rowNumber, numOfRows);\r\n \r\n // Respect pagination\r\n if (obj.options.pagination > 0 && obj.tbody.children.length != obj.options.pagination) {\r\n obj.page(obj.pageNumber);\r\n }\r\n \r\n // Remove selection\r\n obj.conditionalSelectionUpdate(1, rowNumber, (rowNumber + numOfRows) - 1);\r\n \r\n // Keep history\r\n obj.setHistory({\r\n action: 'deleteRow',\r\n rowNumber: rowNumber,\r\n numOfRows: numOfRows,\r\n insertBefore: 1,\r\n rowRecords: rowRecords,\r\n rowData: rowData,\r\n rowNode: rowNode\r\n });\r\n \r\n // Remove table references\r\n obj.updateTableReferences();\r\n \r\n // Events\r\n obj.dispatch('ondeleterow', el, rowNumber, numOfRows, rowRecords);\r\n }\r\n } else {\r\n console.error('Jspreadsheet: It is not possible to delete the last row');\r\n }\r\n }\r\n }\r\n \r\n \r\n /**\r\n * Move column\r\n * \r\n * @return void\r\n */\r\n obj.moveColumn = function(o, d) {\r\n if (Object.keys(obj.options.mergeCells).length > 0) {\r\n if (o > d) {\r\n var insertBefore = 1;\r\n } else {\r\n var insertBefore = 0;\r\n }\r\n\r\n if (obj.isColMerged(o).length || obj.isColMerged(d, insertBefore).length) {\r\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\r\n return false;\r\n } else {\r\n obj.destroyMerged();\r\n }\r\n }\r\n }\r\n \r\n var o = parseInt(o);\r\n var d = parseInt(d);\r\n \r\n if (o > d) {\r\n obj.headerContainer.insertBefore(obj.headers[o], obj.headers[d]);\r\n obj.colgroupContainer.insertBefore(obj.colgroup[o], obj.colgroup[d]);\r\n \r\n for (var j = 0; j < obj.rows.length; j++) {\r\n obj.rows[j].insertBefore(obj.records[j][o], obj.records[j][d]);\r\n }\r\n } else {\r\n obj.headerContainer.insertBefore(obj.headers[o], obj.headers[d].nextSibling);\r\n obj.colgroupContainer.insertBefore(obj.colgroup[o], obj.colgroup[d].nextSibling);\r\n \r\n for (var j = 0; j < obj.rows.length; j++) {\r\n obj.rows[j].insertBefore(obj.records[j][o], obj.records[j][d].nextSibling);\r\n }\r\n }\r\n \r\n obj.options.columns.splice(d, 0, obj.options.columns.splice(o, 1)[0]);\r\n obj.headers.splice(d, 0, obj.headers.splice(o, 1)[0]);\r\n obj.colgroup.splice(d, 0, obj.colgroup.splice(o, 1)[0]);\r\n \r\n for (var j = 0; j < obj.rows.length; j++) {\r\n obj.options.data[j].splice(d, 0, obj.options.data[j].splice(o, 1)[0]);\r\n obj.records[j].splice(d, 0, obj.records[j].splice(o, 1)[0]);\r\n }\r\n \r\n // Update footers position\r\n if (obj.options.footers) {\r\n for (var j = 0; j < obj.options.footers.length; j++) {\r\n obj.options.footers[j].splice(d, 0, obj.options.footers[j].splice(o, 1)[0]);\r\n }\r\n }\r\n\r\n // Keeping history of changes\r\n obj.setHistory({\r\n action:'moveColumn',\r\n oldValue: o,\r\n newValue: d,\r\n });\r\n \r\n // Update table references\r\n obj.updateTableReferences();\r\n \r\n // Events\r\n obj.dispatch('onmovecolumn', el, o, d);\r\n }\r\n\r\n /**\r\n * Insert a new column\r\n * \r\n * @param mixed - num of columns to be added or data to be added in one single column\r\n * @param int columnNumber - number of columns to be created\r\n * @param bool insertBefore\r\n * @param object properties - column properties\r\n * @return void\r\n */\r\n obj.insertColumn = function(mixed, columnNumber, insertBefore, properties) {\r\n // Configuration\r\n if (obj.options.allowInsertColumn == true) {\r\n // Records\r\n var records = [];\r\n \r\n // Data to be insert\r\n var data = [];\r\n \r\n // The insert could be lead by number of rows or the array of data\r\n if (mixed > 0) {\r\n var numOfColumns = mixed;\r\n } else {\r\n var numOfColumns = 1;\r\n \r\n if (mixed) {\r\n data = mixed;\r\n }\r\n }\r\n \r\n // Direction\r\n var insertBefore = insertBefore ? true : false;\r\n \r\n // Current column number\r\n var lastColumn = obj.options.columns.length - 1;\r\n \r\n // Confirm position\r\n if (columnNumber == undefined || columnNumber >= parseInt(lastColumn) || columnNumber < 0) {\r\n columnNumber = lastColumn;\r\n }\r\n \r\n // Onbeforeinsertcolumn\r\n if (obj.dispatch('onbeforeinsertcolumn', el, columnNumber, numOfColumns, insertBefore) === false) {\r\n console.log('onbeforeinsertcolumn returned false');\r\n\r\n return false;\r\n }\r\n \r\n // Merged cells\r\n if (Object.keys(obj.options.mergeCells).length > 0) {\r\n if (obj.isColMerged(columnNumber, insertBefore).length) {\r\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\r\n return false;\r\n } else {\r\n obj.destroyMerged();\r\n }\r\n }\r\n }\r\n \r\n // Create default properties\r\n if (! properties) {\r\n properties = [];\r\n }\r\n \r\n for (var i = 0; i < numOfColumns; i++) {\r\n if (! properties[i]) {\r\n properties[i] = { type:'text', source:[], options:[], width:obj.options.defaultColWidth, align:obj.options.defaultColAlign };\r\n }\r\n }\r\n \r\n // Insert before\r\n var columnIndex = (! insertBefore) ? columnNumber + 1 : columnNumber;\r\n obj.options.columns = jexcel.injectArray(obj.options.columns, columnIndex, properties);\r\n \r\n // Open space in the containers\r\n var currentHeaders = obj.headers.splice(columnIndex);\r\n var currentColgroup = obj.colgroup.splice(columnIndex);\r\n \r\n // History\r\n var historyHeaders = [];\r\n var historyColgroup = [];\r\n var historyRecords = [];\r\n var historyData = [];\r\n var historyFooters = [];\r\n \r\n // Add new headers\r\n for (var col = columnIndex; col < (numOfColumns + columnIndex); col++) {\r\n obj.createCellHeader(col);\r\n obj.headerContainer.insertBefore(obj.headers[col], obj.headerContainer.children[col+1]);\r\n obj.colgroupContainer.insertBefore(obj.colgroup[col], obj.colgroupContainer.children[col+1]);\r\n \r\n historyHeaders.push(obj.headers[col]);\r\n historyColgroup.push(obj.colgroup[col]);\r\n }\r\n \r\n // Add new footer cells\r\n if (obj.options.footers) {\r\n for (var j = 0; j < obj.options.footers.length; j++) {\r\n historyFooters[j] = [];\r\n for (var i = 0; i < numOfColumns; i++) {\r\n historyFooters[j].push('');\r\n }\r\n obj.options.footers[j].splice(columnIndex, 0, historyFooters[j]);\r\n }\r\n }\r\n\r\n // Adding visual columns\r\n for (var row = 0; row < obj.options.data.length; row++) {\r\n // Keep the current data\r\n var currentData = obj.options.data[row].splice(columnIndex);\r\n var currentRecord = obj.records[row].splice(columnIndex);\r\n \r\n // History\r\n historyData[row] = [];\r\n historyRecords[row] = [];\r\n \r\n for (var col = columnIndex; col < (numOfColumns + columnIndex); col++) {\r\n // New value\r\n var value = data[row] ? data[row] : '';\r\n obj.options.data[row][col] = value;\r\n // New cell\r\n var td = obj.createCell(col, row, obj.options.data[row][col]);\r\n obj.records[row][col] = td;\r\n // Add cell to the row\r\n if (obj.rows[row]) {\r\n obj.rows[row].insertBefore(td, obj.rows[row].children[col+1]);\r\n }\r\n \r\n // Record History\r\n historyData[row].push(value);\r\n historyRecords[row].push(td);\r\n }\r\n \r\n // Copy the data back to the main data\r\n Array.prototype.push.apply(obj.options.data[row], currentData);\r\n Array.prototype.push.apply(obj.records[row], currentRecord);\r\n }\r\n \r\n Array.prototype.push.apply(obj.headers, currentHeaders);\r\n Array.prototype.push.apply(obj.colgroup, currentColgroup);\r\n \r\n // Adjust nested headers\r\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0) {\r\n // Flexible way to handle nestedheaders\r\n if (obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\r\n for (var j = 0; j < obj.options.nestedHeaders.length; j++) {\r\n var colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan) + numOfColumns;\r\n obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan = colspan;\r\n obj.thead.children[j].children[obj.thead.children[j].children.length-1].setAttribute('colspan', colspan);\r\n var o = obj.thead.children[j].children[obj.thead.children[j].children.length-1].getAttribute('data-column');\r\n o = o.split(',');\r\n for (var col = columnIndex; col < (numOfColumns + columnIndex); col++) {\r\n o.push(col);\r\n }\r\n obj.thead.children[j].children[obj.thead.children[j].children.length-1].setAttribute('data-column', o);\r\n }\r\n } else {\r\n var colspan = parseInt(obj.options.nestedHeaders[0].colspan) + numOfColumns;\r\n obj.options.nestedHeaders[0].colspan = colspan;\r\n obj.thead.children[0].children[obj.thead.children[0].children.length-1].setAttribute('colspan', colspan);\r\n }\r\n }\r\n \r\n // Keep history\r\n obj.setHistory({\r\n action: 'insertColumn',\r\n columnNumber:columnNumber,\r\n numOfColumns:numOfColumns,\r\n insertBefore:insertBefore,\r\n columns:properties,\r\n headers:historyHeaders,\r\n colgroup:historyColgroup,\r\n records:historyRecords,\r\n footers:historyFooters,\r\n data:historyData,\r\n });\r\n \r\n // Remove table references\r\n obj.updateTableReferences();\r\n \r\n // Events\r\n obj.dispatch('oninsertcolumn', el, columnNumber, numOfColumns, historyRecords, insertBefore);\r\n }\r\n }\r\n \r\n /**\r\n * Delete a column by number\r\n * \r\n * @param integer columnNumber - reference column to be excluded\r\n * @param integer numOfColumns - number of columns to be excluded from the reference column\r\n * @return void\r\n */\r\n obj.deleteColumn = function(columnNumber, numOfColumns) {\r\n // Global Configuration\r\n if (obj.options.allowDeleteColumn == true) {\r\n if (obj.headers.length > 1) {\r\n // Delete column definitions\r\n if (columnNumber == undefined) {\r\n var number = obj.getSelectedColumns(true);\r\n \r\n if (! number.length) {\r\n // Remove last column\r\n columnNumber = obj.headers.length - 1;\r\n numOfColumns = 1;\r\n } else {\r\n // Remove selected\r\n columnNumber = parseInt(number[0]);\r\n numOfColumns = parseInt(number.length);\r\n }\r\n }\r\n \r\n // Lasat column\r\n var lastColumn = obj.options.data[0].length - 1;\r\n \r\n if (columnNumber == undefined || columnNumber > lastColumn || columnNumber < 0) {\r\n columnNumber = lastColumn;\r\n }\r\n \r\n // Minimum of columns to be delete is 1\r\n if (! numOfColumns) {\r\n numOfColumns = 1;\r\n }\r\n \r\n // Can't delete more than the limit of the table\r\n if (numOfColumns > obj.options.data[0].length - columnNumber) {\r\n numOfColumns = obj.options.data[0].length - columnNumber;\r\n }\r\n \r\n // onbeforedeletecolumn\r\n if (obj.dispatch('onbeforedeletecolumn', el, columnNumber, numOfColumns) === false) {\r\n console.log('onbeforedeletecolumn returned false');\r\n return false;\r\n }\r\n \r\n // Can't remove the last column\r\n if (parseInt(columnNumber) > -1) {\r\n // Merged cells\r\n var mergeExists = false;\r\n if (Object.keys(obj.options.mergeCells).length > 0) {\r\n for (var col = columnNumber; col < columnNumber + numOfColumns; col++) {\r\n if (obj.isColMerged(col, false).length) {\r\n mergeExists = true;\r\n }\r\n }\r\n }\r\n if (mergeExists) {\r\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\r\n return false;\r\n } else {\r\n obj.destroyMerged();\r\n }\r\n }\r\n \r\n // Delete the column properties\r\n var columns = obj.options.columns.splice(columnNumber, numOfColumns);\r\n \r\n for (var col = columnNumber; col < columnNumber + numOfColumns; col++) {\r\n obj.colgroup[col].className = '';\r\n obj.headers[col].className = '';\r\n obj.colgroup[col].parentNode.removeChild(obj.colgroup[col]);\r\n obj.headers[col].parentNode.removeChild(obj.headers[col]);\r\n }\r\n \r\n var historyHeaders = obj.headers.splice(columnNumber, numOfColumns);\r\n var historyColgroup = obj.colgroup.splice(columnNumber, numOfColumns);\r\n var historyRecords = [];\r\n var historyData = [];\r\n var historyFooters = [];\r\n\r\n for (var row = 0; row < obj.options.data.length; row++) {\r\n for (var col = columnNumber; col < columnNumber + numOfColumns; col++) {\r\n obj.records[row][col].className = '';\r\n obj.records[row][col].parentNode.removeChild(obj.records[row][col]);\r\n }\r\n }\r\n \r\n // Delete headers\r\n for (var row = 0; row < obj.options.data.length; row++) {\r\n // History\r\n historyData[row] = obj.options.data[row].splice(columnNumber, numOfColumns);\r\n historyRecords[row] = obj.records[row].splice(columnNumber, numOfColumns);\r\n }\r\n\r\n // Delete footers\r\n if (obj.options.footers) {\r\n for (var row = 0; row < obj.options.footers.length; row++) {\r\n historyFooters[row] = obj.options.footers[row].splice(columnNumber, numOfColumns);\r\n }\r\n }\r\n\r\n // Remove selection\r\n obj.conditionalSelectionUpdate(0, columnNumber, (columnNumber + numOfColumns) - 1);\r\n \r\n // Adjust nested headers\r\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0) {\r\n // Flexible way to handle nestedheaders\r\n if (obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\r\n for (var j = 0; j < obj.options.nestedHeaders.length; j++) {\r\n var colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan) - numOfColumns;\r\n obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan = colspan;\r\n obj.thead.children[j].children[obj.thead.children[j].children.length-1].setAttribute('colspan', colspan);\r\n }\r\n } else {\r\n var colspan = parseInt(obj.options.nestedHeaders[0].colspan) - numOfColumns;\r\n obj.options.nestedHeaders[0].colspan = colspan;\r\n obj.thead.children[0].children[obj.thead.children[0].children.length-1].setAttribute('colspan', colspan);\r\n }\r\n }\r\n \r\n // Keeping history of changes\r\n obj.setHistory({\r\n action:'deleteColumn',\r\n columnNumber:columnNumber,\r\n numOfColumns:numOfColumns,\r\n insertBefore: 1,\r\n columns:columns,\r\n headers:historyHeaders,\r\n colgroup:historyColgroup,\r\n records:historyRecords,\r\n footers:historyFooters,\r\n data:historyData,\r\n });\r\n \r\n // Update table references\r\n obj.updateTableReferences();\r\n \r\n // Delete\r\n obj.dispatch('ondeletecolumn', el, columnNumber, numOfColumns, historyRecords);\r\n }\r\n } else {\r\n console.error('Jspreadsheet: It is not possible to delete the last column');\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Get seleted rows numbers\r\n * \r\n * @return array\r\n */\r\n obj.getSelectedRows = function(asIds) {\r\n var rows = [];\r\n // Get all selected rows\r\n for (var j = 0; j < obj.rows.length; j++) {\r\n if (obj.rows[j].classList.contains('selected')) {\r\n if (asIds) {\r\n rows.push(j);\r\n } else {\r\n rows.push(obj.rows[j]);\r\n }\r\n }\r\n }\r\n \r\n return rows;\r\n },\r\n \r\n /**\r\n * Get seleted column numbers\r\n * \r\n * @return array\r\n */\r\n obj.getSelectedColumns = function() {\r\n var cols = [];\r\n // Get all selected cols\r\n for (var i = 0; i < obj.headers.length; i++) {\r\n if (obj.headers[i].classList.contains('selected')) {\r\n cols.push(i);\r\n }\r\n }\r\n \r\n return cols;\r\n }\r\n \r\n /**\r\n * Get highlighted\r\n * \r\n * @return array\r\n */\r\n obj.getHighlighted = function() {\r\n return obj.highlighted;\r\n }\r\n \r\n /**\r\n * Update cell references\r\n * \r\n * @return void\r\n */\r\n obj.updateTableReferences = function() {\r\n // Update headers\r\n for (var i = 0; i < obj.headers.length; i++) {\r\n var x = obj.headers[i].getAttribute('data-x');\r\n \r\n if (x != i) {\r\n // Update coords\r\n obj.headers[i].setAttribute('data-x', i);\r\n // Title\r\n if (! obj.headers[i].getAttribute('title')) {\r\n obj.headers[i].innerHTML = jexcel.getColumnName(i);\r\n }\r\n }\r\n }\r\n \r\n // Update all rows\r\n for (var j = 0; j < obj.rows.length; j++) {\r\n if (obj.rows[j]) {\r\n var y = obj.rows[j].getAttribute('data-y');\r\n \r\n if (y != j) {\r\n // Update coords\r\n obj.rows[j].setAttribute('data-y', j);\r\n obj.rows[j].children[0].setAttribute('data-y', j);\r\n // Row number\r\n obj.rows[j].children[0].innerHTML = j + 1;\r\n }\r\n }\r\n }\r\n \r\n // Regular cells affected by this change\r\n var affectedTokens = [];\r\n var mergeCellUpdates = [];\r\n \r\n // Update cell\r\n var updatePosition = function(x,y,i,j) {\r\n if (x != i) {\r\n obj.records[j][i].setAttribute('data-x', i);\r\n }\r\n if (y != j) {\r\n obj.records[j][i].setAttribute('data-y', j);\r\n }\r\n \r\n // Other updates\r\n if (x != i || y != j) {\r\n var columnIdFrom = jexcel.getColumnNameFromId([x, y]);\r\n var columnIdTo = jexcel.getColumnNameFromId([i, j]);\r\n affectedTokens[columnIdFrom] = columnIdTo;\r\n }\r\n }\r\n \r\n for (var j = 0; j < obj.records.length; j++) {\r\n for (var i = 0; i < obj.records[0].length; i++) {\r\n if (obj.records[j][i]) {\r\n // Current values\r\n var x = obj.records[j][i].getAttribute('data-x');\r\n var y = obj.records[j][i].getAttribute('data-y');\r\n \r\n // Update column\r\n if (obj.records[j][i].getAttribute('data-merged')) {\r\n var columnIdFrom = jexcel.getColumnNameFromId([x, y]);\r\n var columnIdTo = jexcel.getColumnNameFromId([i, j]);\r\n if (mergeCellUpdates[columnIdFrom] == null) {\r\n if (columnIdFrom == columnIdTo) {\r\n mergeCellUpdates[columnIdFrom] = false;\r\n } else {\r\n var totalX = parseInt(i - x);\r\n var totalY = parseInt(j - y);\r\n mergeCellUpdates[columnIdFrom] = [ columnIdTo, totalX, totalY ];\r\n }\r\n }\r\n } else {\r\n updatePosition(x,y,i,j);\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Update merged if applicable\r\n var keys = Object.keys(mergeCellUpdates);\r\n if (keys.length) {\r\n for (var i = 0; i < keys.length; i++) {\r\n if (mergeCellUpdates[keys[i]]) {\r\n var info = jexcel.getIdFromColumnName(keys[i], true)\r\n var x = info[0];\r\n var y = info[1];\r\n updatePosition(x,y,x + mergeCellUpdates[keys[i]][1],y + mergeCellUpdates[keys[i]][2]);\r\n \r\n var columnIdFrom = keys[i];\r\n var columnIdTo = mergeCellUpdates[keys[i]][0];\r\n for (var j = 0; j < obj.options.mergeCells[columnIdFrom][2].length; j++) {\r\n var x = parseInt(obj.options.mergeCells[columnIdFrom][2][j].getAttribute('data-x'));\r\n var y = parseInt(obj.options.mergeCells[columnIdFrom][2][j].getAttribute('data-y'));\r\n obj.options.mergeCells[columnIdFrom][2][j].setAttribute('data-x', x + mergeCellUpdates[keys[i]][1]);\r\n obj.options.mergeCells[columnIdFrom][2][j].setAttribute('data-y', y + mergeCellUpdates[keys[i]][2]);\r\n }\r\n \r\n obj.options.mergeCells[columnIdTo] = obj.options.mergeCells[columnIdFrom];\r\n delete(obj.options.mergeCells[columnIdFrom]);\r\n }\r\n }\r\n }\r\n \r\n // Update formulas\r\n obj.updateFormulas(affectedTokens);\r\n \r\n // Update meta data\r\n obj.updateMeta(affectedTokens);\r\n \r\n // Refresh selection\r\n obj.refreshSelection();\r\n \r\n // Update table with custom configuration if applicable\r\n obj.updateTable();\r\n }\r\n \r\n /**\r\n * Custom settings for the cells\r\n */\r\n obj.updateTable = function() {\r\n // Check for spare\r\n if (obj.options.minSpareRows > 0) {\r\n var numBlankRows = 0;\r\n for (var j = obj.rows.length - 1; j >= 0; j--) {\r\n var test = false;\r\n for (var i = 0; i < obj.headers.length; i++) {\r\n if (obj.options.data[j][i]) {\r\n test = true;\r\n }\r\n }\r\n if (test) {\r\n break;\r\n } else {\r\n numBlankRows++;\r\n }\r\n }\r\n \r\n if (obj.options.minSpareRows - numBlankRows > 0) {\r\n obj.insertRow(obj.options.minSpareRows - numBlankRows)\r\n }\r\n }\r\n \r\n if (obj.options.minSpareCols > 0) {\r\n var numBlankCols = 0;\r\n for (var i = obj.headers.length - 1; i >= 0 ; i--) {\r\n var test = false;\r\n for (var j = 0; j < obj.rows.length; j++) {\r\n if (obj.options.data[j][i]) {\r\n test = true;\r\n }\r\n }\r\n if (test) {\r\n break;\r\n } else {\r\n numBlankCols++;\r\n }\r\n }\r\n \r\n if (obj.options.minSpareCols - numBlankCols > 0) {\r\n obj.insertColumn(obj.options.minSpareCols - numBlankCols)\r\n }\r\n }\r\n \r\n // Customizations by the developer\r\n if (typeof(obj.options.updateTable) == 'function') {\r\n if (obj.options.detachForUpdates) {\r\n el.removeChild(obj.content);\r\n }\r\n\r\n for (var j = 0; j < obj.rows.length; j++) {\r\n for (var i = 0; i < obj.headers.length; i++) {\r\n obj.options.updateTable(el, obj.records[j][i], i, j, obj.options.data[j][i], obj.records[j][i].innerText, jexcel.getColumnNameFromId([i, j]));\r\n }\r\n }\r\n\r\n if (obj.options.detachForUpdates) {\r\n el.insertBefore(obj.content, obj.pagination);\r\n }\r\n }\r\n \r\n // Update footers\r\n if (obj.options.footers) {\r\n obj.setFooter();\r\n }\r\n\r\n // Update corner position\r\n setTimeout(function() {\r\n obj.updateCornerPosition();\r\n },0);\r\n }\r\n\r\n /**\r\n * Readonly\r\n */\r\n obj.isReadOnly = function(cell) {\r\n if (cell = obj.getCell(cell)) {\r\n return cell.classList.contains('readonly') ? true : false;\r\n }\r\n }\r\n\r\n /**\r\n * Readonly\r\n */\r\n obj.setReadOnly = function(cell, state) {\r\n if (cell = obj.getCell(cell)) {\r\n if (state) {\r\n cell.classList.add('readonly');\r\n } else {\r\n cell.classList.remove('readonly');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Show row\r\n */\r\n obj.showRow = function(rowNumber) {\r\n obj.rows[rowNumber].style.display = '';\r\n }\r\n\r\n /**\r\n * Hide row\r\n */\r\n obj.hideRow = function(rowNumber) {\r\n obj.rows[rowNumber].style.display = 'none';\r\n }\r\n\r\n /**\r\n * Show column\r\n */\r\n obj.showColumn = function(colNumber) {\r\n obj.headers[colNumber].style.display = '';\r\n obj.colgroup[colNumber].style.display = '';\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n obj.records[j][colNumber].style.display = '';\r\n }\r\n }\r\n\r\n /**\r\n * Hide column\r\n */\r\n obj.hideColumn = function(colNumber) {\r\n obj.headers[colNumber].style.display = 'none';\r\n obj.colgroup[colNumber].style.display = 'none';\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n obj.records[j][colNumber].style.display = 'none';\r\n }\r\n }\r\n\r\n /**\r\n * Show index column\r\n */\r\n obj.showIndex = function() {\r\n obj.table.classList.remove('jexcel_hidden_index');\r\n }\r\n \r\n /**\r\n * Hide index column\r\n */\r\n obj.hideIndex = function() {\r\n obj.table.classList.add('jexcel_hidden_index');\r\n }\r\n \r\n /**\r\n * Update all related cells in the chain\r\n */\r\n var chainLoopProtection = [];\r\n \r\n obj.updateFormulaChain = function(x, y, records) {\r\n var cellId = jexcel.getColumnNameFromId([x, y]);\r\n if (obj.formula[cellId] && obj.formula[cellId].length > 0) {\r\n if (chainLoopProtection[cellId]) {\r\n obj.records[y][x].innerHTML = '#ERROR';\r\n obj.formula[cellId] = '';\r\n } else {\r\n // Protection\r\n chainLoopProtection[cellId] = true;\r\n \r\n for (var i = 0; i < obj.formula[cellId].length; i++) {\r\n var cell = jexcel.getIdFromColumnName(obj.formula[cellId][i], true);\r\n // Update cell\r\n var value = ''+obj.options.data[cell[1]][cell[0]];\r\n if (value.substr(0,1) == '=') {\r\n records.push(obj.updateCell(cell[0], cell[1], value, true));\r\n } else {\r\n // No longer a formula, remove from the chain\r\n Object.keys(obj.formula)[i] = null;\r\n }\r\n obj.updateFormulaChain(cell[0], cell[1], records);\r\n }\r\n }\r\n }\r\n \r\n chainLoopProtection = [];\r\n }\r\n \r\n /**\r\n * Update formulas\r\n */\r\n obj.updateFormulas = function(referencesToUpdate) {\r\n // Update formulas\r\n for (var j = 0; j < obj.options.data.length; j++) {\r\n for (var i = 0; i < obj.options.data[0].length; i++) {\r\n var value = '' + obj.options.data[j][i];\r\n // Is formula\r\n if (value.substr(0,1) == '=') {\r\n // Replace tokens\r\n var newFormula = obj.updateFormula(value, referencesToUpdate);\r\n if (newFormula != value) {\r\n obj.options.data[j][i] = newFormula;\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Update formula chain\r\n var formula = [];\r\n var keys = Object.keys(obj.formula);\r\n for (var j = 0; j < keys.length; j++) {\r\n // Current key and values\r\n var key = keys[j];\r\n var value = obj.formula[key];\r\n // Update key\r\n if (referencesToUpdate[key]) {\r\n key = referencesToUpdate[key];\r\n }\r\n // Update values\r\n formula[key] = [];\r\n for (var i = 0; i < value.length; i++) {\r\n var letter = value[i];\r\n if (referencesToUpdate[letter]) {\r\n letter = referencesToUpdate[letter];\r\n }\r\n formula[key].push(letter);\r\n }\r\n }\r\n obj.formula = formula;\r\n }\r\n \r\n /**\r\n * Update formula\r\n */\r\n obj.updateFormula = function(formula, referencesToUpdate) {\r\n var testLetter = /[A-Z]/;\r\n var testNumber = /[0-9]/;\r\n \r\n var newFormula = '';\r\n var letter = null;\r\n var number = null;\r\n var token = '';\r\n \r\n for (var index = 0; index < formula.length; index++) {\r\n if (testLetter.exec(formula[index])) {\r\n letter = 1;\r\n number = 0;\r\n token += formula[index];\r\n } else if (testNumber.exec(formula[index])) {\r\n number = letter ? 1 : 0;\r\n token += formula[index];\r\n } else {\r\n if (letter && number) {\r\n token = referencesToUpdate[token] ? referencesToUpdate[token] : token;\r\n }\r\n newFormula += token;\r\n newFormula += formula[index];\r\n letter = 0;\r\n number = 0;\r\n token = '';\r\n }\r\n }\r\n \r\n if (token) {\r\n if (letter && number) {\r\n token = referencesToUpdate[token] ? referencesToUpdate[token] : token;\r\n }\r\n newFormula += token;\r\n }\r\n \r\n return newFormula;\r\n }\r\n \r\n /**\r\n * Secure formula\r\n */\r\n var secureFormula = function(oldValue) {\r\n var newValue = '';\r\n var inside = 0;\r\n\r\n for (var i = 0; i < oldValue.length; i++) {\r\n if (oldValue[i] == '\"') {\r\n if (inside == 0) {\r\n inside = 1;\r\n } else {\r\n inside = 0;\r\n }\r\n }\r\n\r\n if (inside == 1) {\r\n newValue += oldValue[i];\r\n } else {\r\n newValue += oldValue[i].toUpperCase();\r\n }\r\n }\r\n\r\n return newValue;\r\n }\r\n\r\n /**\r\n * Parse formulas\r\n */\r\n obj.executeFormula = function(expression, x, y) {\r\n \r\n var formulaResults = [];\r\n var formulaLoopProtection = [];\r\n \r\n // Execute formula with loop protection\r\n var execute = function(expression, x, y) {\r\n // Parent column identification\r\n var parentId = jexcel.getColumnNameFromId([x, y]);\r\n \r\n // Code protection\r\n if (formulaLoopProtection[parentId]) {\r\n console.error('Reference loop detected');\r\n return '#ERROR';\r\n }\r\n \r\n formulaLoopProtection[parentId] = true;\r\n \r\n // Convert range tokens\r\n var tokensUpdate = function(tokens) {\r\n for (var index = 0; index < tokens.length; index++) {\r\n var f = [];\r\n var token = tokens[index].split(':');\r\n var e1 = jexcel.getIdFromColumnName(token[0], true);\r\n var e2 = jexcel.getIdFromColumnName(token[1], true);\r\n \r\n if (e1[0] <= e2[0]) {\r\n var x1 = e1[0];\r\n var x2 = e2[0];\r\n } else {\r\n var x1 = e2[0];\r\n var x2 = e1[0];\r\n }\r\n \r\n if (e1[1] <= e2[1]) {\r\n var y1 = e1[1];\r\n var y2 = e2[1];\r\n } else {\r\n var y1 = e2[1];\r\n var y2 = e1[1];\r\n }\r\n \r\n for (var j = y1; j <= y2; j++) {\r\n for (var i = x1; i <= x2; i++) {\r\n f.push(jexcel.getColumnNameFromId([i, j]));\r\n }\r\n }\r\n \r\n expression = expression.replace(tokens[index], f.join(','));\r\n }\r\n }\r\n \r\n // Range with $ remove $\r\n expression = expression.replace(/\\$?([A-Z]+)\\$?([0-9]+)/g, \"$1$2\");\r\n\r\n var tokens = expression.match(/([A-Z]+[0-9]+)\\:([A-Z]+[0-9]+)/g);\r\n if (tokens && tokens.length) {\r\n tokensUpdate(tokens);\r\n }\r\n \r\n // String\r\n var evalstring = '';\r\n \r\n // Get tokens\r\n var tokens = expression.match(/([A-Z]+[0-9]+)/g);\r\n \r\n // Direct self-reference protection\r\n if (tokens && tokens.indexOf(parentId) > -1) {\r\n console.error('Self Reference detected');\r\n return '#ERROR';\r\n } else {\r\n if (tokens) {\r\n for (var i = 0; i < tokens.length; i++) {\r\n // Keep chain\r\n if (! obj.formula[tokens[i]]) {\r\n obj.formula[tokens[i]] = [];\r\n }\r\n // Is already in the register\r\n if (obj.formula[tokens[i]].indexOf(parentId) < 0) {\r\n obj.formula[tokens[i]].push(parentId);\r\n }\r\n \r\n // Do not calculate again\r\n if (eval('typeof(' + tokens[i] + ') == \"undefined\"')) {\r\n // Coords\r\n var position = jexcel.getIdFromColumnName(tokens[i], 1);\r\n // Get value\r\n if (typeof(obj.options.data[position[1]]) != 'undefined' && typeof(obj.options.data[position[1]][position[0]]) != 'undefined') {\r\n var value = obj.options.data[position[1]][position[0]];\r\n } else {\r\n var value = '';\r\n }\r\n // Get column data\r\n if ((''+value).substr(0,1) == '=') {\r\n if (formulaResults[tokens[i]]) {\r\n value = formulaResults[tokens[i]];\r\n } else {\r\n value = execute(value, position[0], position[1]);\r\n formulaResults[tokens[i]] = value;\r\n }\r\n }\r\n // Type!\r\n if ((''+value).trim() == '') {\r\n // Null\r\n evalstring += \"var \" + tokens[i] + \" = null;\";\r\n } else {\r\n if (value == Number(value) && obj.options.autoCasting == true) {\r\n // Number\r\n evalstring += \"var \" + tokens[i] + \" = \" + Number(value) + \";\";\r\n } else {\r\n // Trying any formatted number\r\n var number = obj.parseNumber(value, position[0])\r\n if (obj.options.autoCasting == true && number) {\r\n // Render as number\r\n evalstring += \"var \" + tokens[i] + \" = \" + number + \";\";\r\n } else {\r\n // Render as string\r\n evalstring += \"var \" + tokens[i] + \" = '\" + value + \"';\";\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Convert formula to javascript\r\n try {\r\n evalstring += \"function COLUMN() { return parseInt(x) + 1; }; function ROW() { return parseInt(y) + 1; }; function CELL() { return parentId; }; function TABLE() { return obj; }; function VALUE(col, row) { return obj.records[row-1][col-1].innerHTML; }; function THISROWCELL(col) { var id = jexcel.getIdFromColumnName(col+(parseInt(y)+1), true); return obj.records[id[1]][id[0]].innerHTML; }\";\r\n \r\n var res = eval(evalstring + expression.substr(1));\r\n } catch (e) {\r\n var res = '#ERROR';\r\n }\r\n \r\n return res;\r\n }\r\n }\r\n \r\n return execute(expression, x, y);\r\n }\r\n \r\n /**\r\n * Trying to extract a number from a string\r\n */\r\n obj.parseNumber = function(value, columnNumber) {\r\n // Decimal point\r\n var decimal = columnNumber && obj.options.columns[columnNumber].decimal ? obj.options.columns[columnNumber].decimal : '.';\r\n \r\n // Parse both parts of the number\r\n var number = ('' + value);\r\n number = number.split(decimal);\r\n number[0] = number[0].match(/[+-]?[0-9]/g);\r\n if (number[0]) {\r\n number[0] = number[0].join('');\r\n }\r\n if (number[1]) {\r\n number[1] = number[1].match(/[0-9]*/g).join('');\r\n }\r\n \r\n // Is a valid number\r\n if (number[0] && Number(number[0]) >= 0) {\r\n if (! number[1]) {\r\n var value = Number(number[0] + '.00');\r\n } else {\r\n var value = Number(number[0] + '.' + number[1]);\r\n }\r\n } else {\r\n var value = null;\r\n }\r\n \r\n return value;\r\n }\r\n \r\n /**\r\n * Get row number\r\n */\r\n obj.row = function(cell) {\r\n }\r\n \r\n /**\r\n * Get col number\r\n */\r\n obj.col = function(cell) {\r\n }\r\n \r\n obj.up = function(shiftKey, ctrlKey) {\r\n if (shiftKey) {\r\n if (obj.selectedCell[3] > 0) {\r\n obj.up.visible(1, ctrlKey ? 0 : 1)\r\n }\r\n } else {\r\n if (obj.selectedCell[1] > 0) {\r\n obj.up.visible(0, ctrlKey ? 0 : 1)\r\n }\r\n obj.selectedCell[2] = obj.selectedCell[0];\r\n obj.selectedCell[3] = obj.selectedCell[1];\r\n }\r\n \r\n // Update selection\r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n \r\n // Change page\r\n if (obj.options.lazyLoading == true) {\r\n if (obj.selectedCell[1] == 0 || obj.selectedCell[3] == 0) {\r\n obj.loadPage(0);\r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n } else {\r\n if (obj.loadValidation()) {\r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n } else {\r\n var item = parseInt(obj.tbody.firstChild.getAttribute('data-y'));\r\n if (obj.selectedCell[1] - item < 30) {\r\n obj.loadUp();\r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n }\r\n }\r\n }\r\n } else if (obj.options.pagination > 0) {\r\n var pageNumber = obj.whichPage(obj.selectedCell[3]);\r\n if (pageNumber != obj.pageNumber) {\r\n obj.page(pageNumber);\r\n }\r\n }\r\n \r\n obj.updateScroll(1);\r\n }\r\n \r\n obj.up.visible = function(group, direction) {\r\n if (group == 0) {\r\n var x = parseInt(obj.selectedCell[0]);\r\n var y = parseInt(obj.selectedCell[1]);\r\n } else {\r\n var x = parseInt(obj.selectedCell[2]);\r\n var y = parseInt(obj.selectedCell[3]);\r\n }\r\n \r\n if (direction == 0) {\r\n for (var j = 0; j < y; j++) {\r\n if (obj.records[j][x].style.display != 'none' && obj.rows[j].style.display != 'none') {\r\n y = j;\r\n break;\r\n }\r\n }\r\n } else {\r\n y = obj.up.get(x, y);\r\n }\r\n \r\n if (group == 0) {\r\n obj.selectedCell[0] = x;\r\n obj.selectedCell[1] = y;\r\n } else {\r\n obj.selectedCell[2] = x;\r\n obj.selectedCell[3] = y;\r\n }\r\n }\r\n \r\n obj.up.get = function(x, y) {\r\n var x = parseInt(x);\r\n var y = parseInt(y);\r\n for (var j = (y - 1); j >= 0; j--) {\r\n if (obj.records[j][x].style.display != 'none' && obj.rows[j].style.display != 'none') {\r\n if (obj.records[j][x].getAttribute('data-merged')) {\r\n if (obj.records[j][x] == obj.records[y][x]) {\r\n continue;\r\n }\r\n }\r\n y = j;\r\n break;\r\n }\r\n }\r\n \r\n return y;\r\n }\r\n \r\n obj.down = function(shiftKey, ctrlKey) {\r\n if (shiftKey) {\r\n if (obj.selectedCell[3] < obj.records.length - 1) {\r\n obj.down.visible(1, ctrlKey ? 0 : 1)\r\n }\r\n } else {\r\n if (obj.selectedCell[1] < obj.records.length - 1) {\r\n obj.down.visible(0, ctrlKey ? 0 : 1)\r\n }\r\n obj.selectedCell[2] = obj.selectedCell[0];\r\n obj.selectedCell[3] = obj.selectedCell[1];\r\n }\r\n \r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n \r\n // Change page\r\n if (obj.options.lazyLoading == true) {\r\n if ((obj.selectedCell[1] == obj.records.length - 1 || obj.selectedCell[3] == obj.records.length - 1)) {\r\n obj.loadPage(-1);\r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n } else {\r\n if (obj.loadValidation()) {\r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n } else {\r\n var item = parseInt(obj.tbody.lastChild.getAttribute('data-y'));\r\n if (item - obj.selectedCell[3] < 30) {\r\n obj.loadDown();\r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n }\r\n }\r\n }\r\n } else if (obj.options.pagination > 0) {\r\n var pageNumber = obj.whichPage(obj.selectedCell[3]);\r\n if (pageNumber != obj.pageNumber) {\r\n obj.page(pageNumber);\r\n }\r\n }\r\n \r\n obj.updateScroll(3);\r\n }\r\n \r\n obj.down.visible = function(group, direction) {\r\n if (group == 0) {\r\n var x = parseInt(obj.selectedCell[0]);\r\n var y = parseInt(obj.selectedCell[1]);\r\n } else {\r\n var x = parseInt(obj.selectedCell[2]);\r\n var y = parseInt(obj.selectedCell[3]);\r\n }\r\n \r\n if (direction == 0) {\r\n for (var j = obj.rows.length - 1; j > y; j--) {\r\n if (obj.records[j][x].style.display != 'none' && obj.rows[j].style.display != 'none') {\r\n y = j;\r\n break;\r\n }\r\n }\r\n } else {\r\n y = obj.down.get(x, y);\r\n }\r\n \r\n if (group == 0) {\r\n obj.selectedCell[0] = x;\r\n obj.selectedCell[1] = y;\r\n } else {\r\n obj.selectedCell[2] = x;\r\n obj.selectedCell[3] = y;\r\n }\r\n }\r\n \r\n obj.down.get = function(x, y) {\r\n var x = parseInt(x);\r\n var y = parseInt(y);\r\n for (var j = (y + 1); j < obj.rows.length; j++) {\r\n if (obj.records[j][x].style.display != 'none' && obj.rows[j].style.display != 'none') {\r\n if (obj.records[j][x].getAttribute('data-merged')) {\r\n if (obj.records[j][x] == obj.records[y][x]) {\r\n continue;\r\n }\r\n }\r\n y = j;\r\n break;\r\n }\r\n }\r\n \r\n return y;\r\n }\r\n \r\n obj.right = function(shiftKey, ctrlKey) {\r\n if (shiftKey) {\r\n if (obj.selectedCell[2] < obj.headers.length - 1) {\r\n obj.right.visible(1, ctrlKey ? 0 : 1)\r\n }\r\n } else {\r\n if (obj.selectedCell[0] < obj.headers.length - 1) {\r\n obj.right.visible(0, ctrlKey ? 0 : 1)\r\n }\r\n obj.selectedCell[2] = obj.selectedCell[0];\r\n obj.selectedCell[3] = obj.selectedCell[1];\r\n }\r\n \r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n obj.updateScroll(2);\r\n }\r\n \r\n obj.right.visible = function(group, direction) {\r\n if (group == 0) {\r\n var x = parseInt(obj.selectedCell[0]);\r\n var y = parseInt(obj.selectedCell[1]);\r\n } else {\r\n var x = parseInt(obj.selectedCell[2]);\r\n var y = parseInt(obj.selectedCell[3]);\r\n }\r\n \r\n if (direction == 0) {\r\n for (var i = obj.headers.length - 1; i > x; i--) {\r\n if (obj.records[y][i].style.display != 'none') {\r\n x = i;\r\n break;\r\n }\r\n }\r\n } else {\r\n x = obj.right.get(x, y);\r\n }\r\n \r\n if (group == 0) {\r\n obj.selectedCell[0] = x;\r\n obj.selectedCell[1] = y;\r\n } else {\r\n obj.selectedCell[2] = x;\r\n obj.selectedCell[3] = y;\r\n }\r\n }\r\n \r\n obj.right.get = function(x, y) {\r\n var x = parseInt(x);\r\n var y = parseInt(y);\r\n \r\n for (var i = (x + 1); i < obj.headers.length; i++) {\r\n if (obj.records[y][i].style.display != 'none') {\r\n if (obj.records[y][i].getAttribute('data-merged')) {\r\n if (obj.records[y][i] == obj.records[y][x]) {\r\n continue;\r\n }\r\n }\r\n x = i;\r\n break;\r\n }\r\n }\r\n \r\n return x;\r\n }\r\n \r\n obj.left = function(shiftKey, ctrlKey) {\r\n if (shiftKey) {\r\n if (obj.selectedCell[2] > 0) {\r\n obj.left.visible(1, ctrlKey ? 0 : 1)\r\n }\r\n } else {\r\n if (obj.selectedCell[0] > 0) {\r\n obj.left.visible(0, ctrlKey ? 0 : 1)\r\n }\r\n obj.selectedCell[2] = obj.selectedCell[0];\r\n obj.selectedCell[3] = obj.selectedCell[1];\r\n }\r\n \r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n obj.updateScroll(0);\r\n }\r\n \r\n obj.left.visible = function(group, direction) {\r\n if (group == 0) {\r\n var x = parseInt(obj.selectedCell[0]);\r\n var y = parseInt(obj.selectedCell[1]);\r\n } else {\r\n var x = parseInt(obj.selectedCell[2]);\r\n var y = parseInt(obj.selectedCell[3]);\r\n }\r\n \r\n if (direction == 0) {\r\n for (var i = 0; i < x; i++) {\r\n if (obj.records[y][i].style.display != 'none') {\r\n x = i;\r\n break;\r\n }\r\n }\r\n } else {\r\n x = obj.left.get(x, y);\r\n }\r\n \r\n if (group == 0) {\r\n obj.selectedCell[0] = x;\r\n obj.selectedCell[1] = y;\r\n } else {\r\n obj.selectedCell[2] = x;\r\n obj.selectedCell[3] = y;\r\n }\r\n }\r\n \r\n obj.left.get = function(x, y) {\r\n var x = parseInt(x);\r\n var y = parseInt(y);\r\n for (var i = (x - 1); i >= 0; i--) {\r\n if (obj.records[y][i].style.display != 'none') {\r\n if (obj.records[y][i].getAttribute('data-merged')) {\r\n if (obj.records[y][i] == obj.records[y][x]) {\r\n continue;\r\n }\r\n }\r\n x = i;\r\n break;\r\n }\r\n }\r\n \r\n return x;\r\n }\r\n \r\n obj.first = function(shiftKey, ctrlKey) {\r\n if (shiftKey) {\r\n if (ctrlKey) {\r\n obj.selectedCell[3] = 0;\r\n } else {\r\n obj.left.visible(1, 0);\r\n }\r\n } else {\r\n if (ctrlKey) {\r\n obj.selectedCell[1] = 0;\r\n } else {\r\n obj.left.visible(0, 0);\r\n }\r\n obj.selectedCell[2] = obj.selectedCell[0];\r\n obj.selectedCell[3] = obj.selectedCell[1];\r\n }\r\n \r\n // Change page\r\n if (obj.options.lazyLoading == true && (obj.selectedCell[1] == 0 || obj.selectedCell[3] == 0)) {\r\n obj.loadPage(0);\r\n } else if (obj.options.pagination > 0) {\r\n var pageNumber = obj.whichPage(obj.selectedCell[3]);\r\n if (pageNumber != obj.pageNumber) {\r\n obj.page(pageNumber);\r\n }\r\n }\r\n \r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n obj.updateScroll(1);\r\n }\r\n \r\n obj.last = function(shiftKey, ctrlKey) {\r\n if (shiftKey) {\r\n if (ctrlKey) {\r\n obj.selectedCell[3] = obj.records.length - 1;\r\n } else {\r\n obj.right.visible(1, 0);\r\n }\r\n } else {\r\n if (ctrlKey) {\r\n obj.selectedCell[1] = obj.records.length - 1;\r\n } else {\r\n obj.right.visible(0, 0);\r\n }\r\n obj.selectedCell[2] = obj.selectedCell[0];\r\n obj.selectedCell[3] = obj.selectedCell[1];\r\n }\r\n \r\n // Change page\r\n if (obj.options.lazyLoading == true && (obj.selectedCell[1] == obj.records.length - 1 || obj.selectedCell[3] == obj.records.length - 1)) {\r\n obj.loadPage(-1);\r\n } else if (obj.options.pagination > 0) {\r\n var pageNumber = obj.whichPage(obj.selectedCell[3]);\r\n if (pageNumber != obj.pageNumber) {\r\n obj.page(pageNumber);\r\n }\r\n }\r\n \r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n obj.updateScroll(3);\r\n }\r\n \r\n obj.selectAll = function() {\r\n if (! obj.selectedCell) {\r\n obj.selectedCell = [];\r\n }\r\n \r\n obj.selectedCell[0] = 0;\r\n obj.selectedCell[1] = 0;\r\n obj.selectedCell[2] = obj.headers.length - 1;\r\n obj.selectedCell[3] = obj.records.length - 1;\r\n \r\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\r\n }\r\n \r\n /**\r\n * Go to a page in a lazyLoading\r\n */\r\n obj.loadPage = function(pageNumber) {\r\n // Search\r\n if (obj.options.search == true && obj.results) {\r\n var results = obj.results;\r\n } else {\r\n var results = obj.rows;\r\n }\r\n \r\n // Per page\r\n var quantityPerPage = 100;\r\n \r\n // pageNumber\r\n if (pageNumber == null || pageNumber == -1) {\r\n // Last page\r\n pageNumber = Math.ceil(results.length / quantityPerPage) - 1; \r\n }\r\n \r\n var startRow = (pageNumber * quantityPerPage);\r\n var finalRow = (pageNumber * quantityPerPage) + quantityPerPage;\r\n if (finalRow > results.length) {\r\n finalRow = results.length;\r\n }\r\n startRow = finalRow - 100;\r\n if (startRow < 0) {\r\n startRow = 0;\r\n }\r\n \r\n // Appeding items\r\n for (var j = startRow; j < finalRow; j++) {\r\n if (obj.options.search == true && obj.results) {\r\n obj.tbody.appendChild(obj.rows[results[j]]);\r\n } else {\r\n obj.tbody.appendChild(obj.rows[j]);\r\n }\r\n \r\n if (obj.tbody.children.length > quantityPerPage) {\r\n obj.tbody.removeChild(obj.tbody.firstChild);\r\n }\r\n }\r\n }\r\n \r\n obj.loadUp = function() {\r\n // Search\r\n if (obj.options.search == true && obj.results) {\r\n var results = obj.results;\r\n } else {\r\n var results = obj.rows;\r\n }\r\n var test = 0;\r\n if (results.length > 100) {\r\n // Get the first element in the page\r\n var item = parseInt(obj.tbody.firstChild.getAttribute('data-y'));\r\n if (obj.options.search == true && obj.results) {\r\n item = results.indexOf(item);\r\n }\r\n if (item > 0) {\r\n for (var j = 0; j < 30; j++) {\r\n item = item - 1;\r\n if (item > -1) {\r\n if (obj.options.search == true && obj.results) {\r\n obj.tbody.insertBefore(obj.rows[results[item]], obj.tbody.firstChild);\r\n } else {\r\n obj.tbody.insertBefore(obj.rows[item], obj.tbody.firstChild);\r\n }\r\n if (obj.tbody.children.length > 100) {\r\n obj.tbody.removeChild(obj.tbody.lastChild);\r\n test = 1;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return test;\r\n }\r\n \r\n obj.loadDown = function() {\r\n // Search\r\n if (obj.options.search == true && obj.results) {\r\n var results = obj.results;\r\n } else {\r\n var results = obj.rows;\r\n }\r\n var test = 0;\r\n if (results.length > 100) {\r\n // Get the last element in the page\r\n var item = parseInt(obj.tbody.lastChild.getAttribute('data-y'));\r\n if (obj.options.search == true && obj.results) {\r\n item = results.indexOf(item);\r\n }\r\n if (item < obj.rows.length - 1) {\r\n for (var j = 0; j <= 30; j++) {\r\n if (item < results.length) {\r\n if (obj.options.search == true && obj.results) {\r\n obj.tbody.appendChild(obj.rows[results[item]]);\r\n } else {\r\n obj.tbody.appendChild(obj.rows[item]);\r\n }\r\n if (obj.tbody.children.length > 100) {\r\n obj.tbody.removeChild(obj.tbody.firstChild);\r\n test = 1;\r\n }\r\n }\r\n item = item + 1;\r\n }\r\n }\r\n }\r\n \r\n return test;\r\n }\r\n \r\n obj.loadValidation = function() {\r\n if (obj.selectedCell) {\r\n var currentPage = parseInt(obj.tbody.firstChild.getAttribute('data-y')) / 100;\r\n var selectedPage = parseInt(obj.selectedCell[3] / 100);\r\n var totalPages = parseInt(obj.rows.length / 100);\r\n \r\n if (currentPage != selectedPage && selectedPage <= totalPages) {\r\n if (! Array.prototype.indexOf.call(obj.tbody.children, obj.rows[obj.selectedCell[3]])) {\r\n obj.loadPage(selectedPage);\r\n return true;\r\n }\r\n }\r\n }\r\n \r\n return false;\r\n }\r\n \r\n /**\r\n * Reset search\r\n */\r\n obj.resetSearch = function() {\r\n obj.searchInput.value = '';\r\n obj.search('');\r\n obj.results = null;\r\n }\r\n\r\n /**\r\n * Search\r\n */\r\n obj.search = function(query) {\r\n // Query\r\n if (query) {\r\n var query = query.toLowerCase();\r\n }\r\n \r\n // Reset any filter\r\n if (obj.options.filters) {\r\n obj.resetFilters();\r\n }\r\n\r\n // Reset selection\r\n obj.resetSelection();\r\n \r\n // Total of results\r\n obj.pageNumber = 0;\r\n obj.results = [];\r\n \r\n if (query) {\r\n // Search filter\r\n var search = function(item, query, index) {\r\n for (var i = 0; i < item.length; i++) {\r\n if ((''+item[i]).toLowerCase().search(query) >= 0 ||\r\n (''+obj.records[index][i].innerHTML).toLowerCase().search(query) >= 0) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n \r\n // Result\r\n var addToResult = function(k) {\r\n if (obj.results.indexOf(k) == -1) {\r\n obj.results.push(k);\r\n }\r\n }\r\n \r\n // Filter\r\n var data = obj.options.data.filter(function(v, k) {\r\n if (search(v, query, k)) {\r\n // Merged rows found\r\n var rows = obj.isRowMerged(k);\r\n if (rows.length) {\r\n for (var i = 0; i < rows.length; i++) {\r\n var row = jexcel.getIdFromColumnName(rows[i], true);\r\n for (var j = 0; j < obj.options.mergeCells[rows[i]][1]; j++) {\r\n addToResult(row[1]+j);\r\n }\r\n }\r\n } else {\r\n // Normal row found\r\n addToResult(k);\r\n }\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n });\r\n } else {\r\n obj.results = null;\r\n }\r\n\r\n return obj.updateResult();\r\n }\r\n \r\n obj.updateResult = function() {\r\n var total = 0;\r\n var index = 0;\r\n \r\n // Page 1\r\n if (obj.options.lazyLoading == true) {\r\n total = 100;\r\n } else if (obj.options.pagination > 0) {\r\n total = obj.options.pagination;\r\n } else {\r\n if (obj.results) {\r\n total = obj.results.length;\r\n } else {\r\n total = obj.rows.length;\r\n }\r\n }\r\n \r\n // Reset current nodes\r\n while (obj.tbody.firstChild) {\r\n obj.tbody.removeChild(obj.tbody.firstChild);\r\n }\r\n \r\n // Hide all records from the table\r\n for (var j = 0; j < obj.rows.length; j++) {\r\n if (! obj.results || obj.results.indexOf(j) > -1) {\r\n if (index < total) {\r\n obj.tbody.appendChild(obj.rows[j]);\r\n index++;\r\n }\r\n obj.rows[j].style.display = '';\r\n } else {\r\n obj.rows[j].style.display = 'none';\r\n }\r\n }\r\n \r\n // Update pagination\r\n if (obj.options.pagination > 0) {\r\n obj.updatePagination();\r\n }\r\n\r\n obj.updateCornerPosition();\r\n \r\n return total;\r\n }\r\n\r\n /**\r\n * Which page the cell is\r\n */\r\n obj.whichPage = function(cell) {\r\n // Search\r\n if (obj.options.search == true && obj.results) {\r\n cell = obj.results.indexOf(cell);\r\n }\r\n \r\n return (Math.ceil((parseInt(cell) + 1) / parseInt(obj.options.pagination))) - 1;\r\n }\r\n \r\n /**\r\n * Go to page\r\n */\r\n obj.page = function(pageNumber) {\r\n var oldPage = obj.pageNumber;\r\n\r\n // Search\r\n if (obj.options.search == true && obj.results) {\r\n var results = obj.results;\r\n } else {\r\n var results = obj.rows;\r\n }\r\n \r\n // Per page\r\n var quantityPerPage = parseInt(obj.options.pagination);\r\n \r\n // pageNumber\r\n if (pageNumber == null || pageNumber == -1) {\r\n // Last page\r\n pageNumber = Math.ceil(results.length / quantityPerPage) - 1;\r\n }\r\n \r\n // Page number\r\n obj.pageNumber = pageNumber;\r\n \r\n var startRow = (pageNumber * quantityPerPage);\r\n var finalRow = (pageNumber * quantityPerPage) + quantityPerPage;\r\n if (finalRow > results.length) {\r\n finalRow = results.length;\r\n }\r\n if (startRow < 0) {\r\n startRow = 0;\r\n }\r\n \r\n // Reset container\r\n while (obj.tbody.firstChild) {\r\n obj.tbody.removeChild(obj.tbody.firstChild);\r\n }\r\n \r\n // Appeding items\r\n for (var j = startRow; j < finalRow; j++) {\r\n if (obj.options.search == true && obj.results) {\r\n obj.tbody.appendChild(obj.rows[results[j]]);\r\n } else {\r\n obj.tbody.appendChild(obj.rows[j]);\r\n }\r\n }\r\n \r\n if (obj.options.pagination > 0) {\r\n obj.updatePagination();\r\n }\r\n \r\n // Update corner position\r\n obj.updateCornerPosition();\r\n\r\n // Events\r\n obj.dispatch('onchangepage', el, pageNumber, oldPage);\r\n }\r\n \r\n /**\r\n * Update the pagination\r\n */\r\n obj.updatePagination = function() {\r\n // Reset container\r\n obj.pagination.children[0].innerHTML = '';\r\n obj.pagination.children[1].innerHTML = '';\r\n \r\n // Start pagination\r\n if (obj.options.pagination) {\r\n // Searchable\r\n if (obj.options.search == true && obj.results) {\r\n var results = obj.results.length;\r\n } else {\r\n var results = obj.rows.length;\r\n }\r\n \r\n if (! results) {\r\n // No records found\r\n obj.pagination.children[0].innerHTML = obj.options.text.noRecordsFound;\r\n } else {\r\n // Pagination container\r\n var quantyOfPages = Math.ceil(results / obj.options.pagination);\r\n \r\n if (obj.pageNumber < 6) {\r\n var startNumber = 1;\r\n var finalNumber = quantyOfPages < 10 ? quantyOfPages : 10;\r\n } else if (quantyOfPages - obj.pageNumber < 5) {\r\n var startNumber = quantyOfPages - 9;\r\n var finalNumber = quantyOfPages;\r\n if (startNumber < 1) {\r\n startNumber = 1;\r\n }\r\n } else {\r\n var startNumber = obj.pageNumber - 4;\r\n var finalNumber = obj.pageNumber + 5;\r\n }\r\n \r\n // First\r\n if (startNumber > 1) {\r\n var paginationItem = document.createElement('div');\r\n paginationItem.className = 'jexcel_page';\r\n paginationItem.innerHTML = '<';\r\n paginationItem.title = 1;\r\n obj.pagination.children[1].appendChild(paginationItem);\r\n }\r\n \r\n // Get page links\r\n for (var i = startNumber; i <= finalNumber; i++) {\r\n var paginationItem = document.createElement('div');\r\n paginationItem.className = 'jexcel_page';\r\n paginationItem.innerHTML = i;\r\n obj.pagination.children[1].appendChild(paginationItem);\r\n \r\n if (obj.pageNumber == (i-1)) {\r\n paginationItem.classList.add('jexcel_page_selected');\r\n }\r\n }\r\n \r\n // Last\r\n if (finalNumber < quantyOfPages) {\r\n var paginationItem = document.createElement('div');\r\n paginationItem.className = 'jexcel_page';\r\n paginationItem.innerHTML = '>';\r\n paginationItem.title = quantyOfPages;\r\n obj.pagination.children[1].appendChild(paginationItem);\r\n }\r\n \r\n // Text\r\n var format = function(format) {\r\n var args = Array.prototype.slice.call(arguments, 1);\r\n return format.replace(/{(\\d+)}/g, function(match, number) {\r\n return typeof args[number] != 'undefined'\r\n ? args[number]\r\n : match\r\n ;\r\n });\r\n };\r\n \r\n obj.pagination.children[0].innerHTML = format(obj.options.text.showingPage, obj.pageNumber + 1, quantyOfPages)\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Download CSV table\r\n * \r\n * @return null\r\n */\r\n obj.download = function(includeHeaders) {\r\n if (obj.options.allowExport == false) {\r\n console.error('Export not allowed');\r\n } else {\r\n // Data\r\n var data = '';\r\n\r\n // Get data\r\n data += obj.copy(false, obj.options.csvDelimiter, true, includeHeaders, true);\r\n\r\n // Download element\r\n var blob = new Blob([\"\\uFEFF\"+data], {type: 'text/csv;charset=utf-8;'});\r\n\r\n // IE Compatibility\r\n if (window.navigator && window.navigator.msSaveOrOpenBlob) {\r\n window.navigator.msSaveOrOpenBlob(blob, obj.options.csvFileName + '.csv');\r\n } else {\r\n // Download element\r\n var pom = document.createElement('a');\r\n var url = URL.createObjectURL(blob);\r\n pom.href = url;\r\n pom.setAttribute('download', obj.options.csvFileName + '.csv');\r\n document.body.appendChild(pom);\r\n pom.click();\r\n pom.parentNode.removeChild(pom);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Initializes a new history record for undo/redo\r\n * \r\n * @return null\r\n */\r\n obj.setHistory = function(changes) {\r\n if (obj.ignoreHistory != true) {\r\n // Increment and get the current history index\r\n var index = ++obj.historyIndex;\r\n \r\n // Slice the array to discard undone changes\r\n obj.history = (obj.history = obj.history.slice(0, index + 1));\r\n \r\n // Keep history\r\n obj.history[index] = changes;\r\n }\r\n }\r\n \r\n /**\r\n * Copy method\r\n * \r\n * @param bool highlighted - Get only highlighted cells\r\n * @param delimiter - \\t default to keep compatibility with excel\r\n * @return string value\r\n */\r\n obj.copy = function(highlighted, delimiter, returnData, includeHeaders, download) {\r\n if (! delimiter) {\r\n delimiter = \"\\t\";\r\n }\r\n \r\n var div = new RegExp(delimiter, 'ig');\r\n\r\n // Controls\r\n var header = [];\r\n var col = [];\r\n var colLabel = [];\r\n var row = [];\r\n var rowLabel = [];\r\n var x = obj.options.data[0].length\r\n var y = obj.options.data.length\r\n var tmp = '';\r\n var copyHeader = false;\r\n var headers = '';\r\n var nestedHeaders = '';\r\n var numOfCols = 0;\r\n var numOfRows = 0;\r\n\r\n if ((download && obj.options.includeHeadersOnDownload == true) ||\r\n (! download && obj.options.includeHeadersOnCopy == true) ||\r\n (includeHeaders)) {\r\n // Nested headers\r\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0) {\r\n // Flexible way to handle nestedheaders\r\n if (! (obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0])) {\r\n tmp = [obj.options.nestedHeaders];\r\n } else {\r\n tmp = obj.options.nestedHeaders;\r\n }\r\n\r\n for (var j = 0; j < tmp.length; j++) {\r\n var nested = [];\r\n for (var i = 0; i < tmp[j].length; i++) {\r\n var colspan = parseInt(tmp[j][i].colspan);\r\n nested.push(tmp[j][i].title);\r\n for (var c = 0; c < colspan - 1; c++) {\r\n nested.push('');\r\n }\r\n }\r\n nestedHeaders += nested.join(delimiter) + \"\\r\\n\";\r\n }\r\n }\r\n\r\n copyHeader = true;\r\n }\r\n\r\n // Reset container\r\n obj.style = [];\r\n \r\n // Go through the columns to get the data\r\n for (var j = 0; j < y; j++) {\r\n col = [];\r\n colLabel = [];\r\n \r\n for (var i = 0; i < x; i++) {\r\n // If cell is highlighted\r\n if (! highlighted || obj.records[j][i].classList.contains('highlight')) {\r\n if (copyHeader == true) {\r\n header.push(obj.headers[i].innerText);\r\n }\r\n // Values\r\n var value = obj.options.data[j][i];\r\n if (value.match && (value.match(div) || value.match(/,/g) || value.match(/\\n/) || value.match(/\\\"/))) {\r\n value = value.replace(new RegExp('\"', 'g'), '\"\"');\r\n value = '\"' + value + '\"';\r\n }\r\n col.push(value);\r\n \r\n // Labels\r\n if (obj.options.columns[i].type == 'checkbox' || obj.options.columns[i].type == 'radio') {\r\n var label = value;\r\n } else {\r\n if (obj.options.stripHTMLOnCopy == true) {\r\n var label = obj.records[j][i].innerText;\r\n } else {\r\n var label = obj.records[j][i].innerHTML;\r\n }\r\n if (label.match && (label.match(div) || label.match(/,/g) || label.match(/\\n/) || label.match(/\\\"/))) {\r\n // Scape double quotes\r\n label = label.replace(new RegExp('\"', 'g'), '\"\"');\r\n label = '\"' + label + '\"';\r\n }\r\n }\r\n colLabel.push(label);\r\n \r\n // Get style\r\n tmp = obj.records[j][i].getAttribute('style');\r\n tmp = tmp.replace('display: none;', '');\r\n obj.style.push(tmp ? tmp : '');\r\n }\r\n }\r\n \r\n if (col.length) {\r\n if (copyHeader) {\r\n numOfCols = col.length;\r\n row.push(header.join(delimiter));\r\n }\r\n row.push(col.join(delimiter));\r\n }\r\n if (colLabel.length) {\r\n numOfRows++;\r\n if (copyHeader) {\r\n rowLabel.push(header.join(delimiter));\r\n copyHeader = false;\r\n }\r\n rowLabel.push(colLabel.join(delimiter));\r\n }\r\n }\r\n\r\n if (x == numOfCols && y == numOfRows) {\r\n headers = nestedHeaders;\r\n }\r\n\r\n // Final string\r\n var str = headers + row.join(\"\\r\\n\");\r\n var strLabel = headers + rowLabel.join(\"\\r\\n\");\r\n\r\n // Create a hidden textarea to copy the values\r\n if (! returnData) {\r\n if (obj.options.copyCompatibility == true) {\r\n obj.textarea.value = strLabel;\r\n } else {\r\n obj.textarea.value = str;\r\n }\r\n obj.textarea.select();\r\n document.execCommand(\"copy\");\r\n }\r\n \r\n // Keep data\r\n if (obj.options.copyCompatibility == true) {\r\n obj.data = strLabel;\r\n } else {\r\n obj.data = str;\r\n }\r\n // Keep non visible information\r\n obj.hashString = obj.hash(obj.data);\r\n \r\n // Any exiting border should go\r\n if (! returnData) {\r\n obj.removeCopyingSelection();\r\n \r\n // Border\r\n if (obj.highlighted) {\r\n for (var i = 0; i < obj.highlighted.length; i++) {\r\n obj.highlighted[i].classList.add('copying');\r\n if (obj.highlighted[i].classList.contains('highlight-left')) {\r\n obj.highlighted[i].classList.add('copying-left');\r\n }\r\n if (obj.highlighted[i].classList.contains('highlight-right')) {\r\n obj.highlighted[i].classList.add('copying-right');\r\n }\r\n if (obj.highlighted[i].classList.contains('highlight-top')) {\r\n obj.highlighted[i].classList.add('copying-top');\r\n }\r\n if (obj.highlighted[i].classList.contains('highlight-bottom')) {\r\n obj.highlighted[i].classList.add('copying-bottom');\r\n }\r\n }\r\n }\r\n \r\n // Paste event\r\n obj.dispatch('oncopy', el, obj.options.copyCompatibility == true ? rowLabel : row, obj.hashString);\r\n }\r\n\r\n return obj.data;\r\n }\r\n \r\n /**\r\n * Jspreadsheet paste method\r\n * \r\n * @param integer row number\r\n * @return string value\r\n */\r\n obj.paste = function(x, y, data) {\r\n // Paste filter\r\n var ret = obj.dispatch('onbeforepaste', el, data, x, y);\r\n\r\n if (ret === false) {\r\n return false;\r\n } else if (ret) {\r\n var data = ret;\r\n }\r\n \r\n // Controls\r\n var hash = obj.hash(data);\r\n var style = (hash == obj.hashString) ? obj.style : null;\r\n \r\n // Depending on the behavior\r\n if (obj.options.copyCompatibility == true && hash == obj.hashString) {\r\n var data = obj.data;\r\n }\r\n \r\n // Split new line\r\n var data = obj.parseCSV(data, \"\\t\");\r\n \r\n if (x != null && y != null && data) {\r\n // Records\r\n var i = 0;\r\n var j = 0;\r\n var records = [];\r\n var newStyle = {};\r\n var oldStyle = {};\r\n var styleIndex = 0;\r\n \r\n // Index\r\n var colIndex = parseInt(x);\r\n var rowIndex = parseInt(y);\r\n var row = null;\r\n \r\n // Go through the columns to get the data\r\n while (row = data[j]) {\r\n i = 0;\r\n colIndex = parseInt(x);\r\n \r\n while (row[i] != null) {\r\n // Update and keep history\r\n var record = obj.updateCell(colIndex, rowIndex, row[i]);\r\n // Keep history\r\n records.push(record);\r\n // Update all formulas in the chain\r\n obj.updateFormulaChain(colIndex, rowIndex, records);\r\n // Style\r\n if (style && style[styleIndex]) {\r\n var columnName = jexcel.getColumnNameFromId([colIndex, rowIndex]);\r\n newStyle[columnName] = style[styleIndex];\r\n oldStyle[columnName] = obj.getStyle(columnName);\r\n obj.records[rowIndex][colIndex].setAttribute('style', style[styleIndex]);\r\n styleIndex++\r\n }\r\n i++;\r\n if (row[i] != null) {\r\n if (colIndex >= obj.headers.length - 1) {\r\n obj.insertColumn();\r\n }\r\n colIndex = obj.right.get(colIndex, rowIndex);\r\n }\r\n }\r\n \r\n j++;\r\n if (data[j]) {\r\n if (rowIndex >= obj.rows.length-1) {\r\n obj.insertRow();\r\n }\r\n rowIndex = obj.down.get(x, rowIndex);\r\n }\r\n }\r\n \r\n // Select the new cells\r\n obj.updateSelectionFromCoords(x, y, colIndex, rowIndex);\r\n \r\n // Update history\r\n obj.setHistory({\r\n action:'setValue',\r\n records:records,\r\n selection:obj.selectedCell,\r\n newStyle:newStyle,\r\n oldStyle:oldStyle,\r\n });\r\n \r\n // Update table\r\n obj.updateTable();\r\n \r\n // Paste event\r\n obj.dispatch('onpaste', el, data);\r\n \r\n // On after changes\r\n obj.onafterchanges(el, records);\r\n }\r\n\r\n obj.removeCopyingSelection();\r\n }\r\n\r\n /**\r\n * Remove copying border\r\n */\r\n obj.removeCopyingSelection = function() {\r\n var copying = document.querySelectorAll('.jexcel .copying');\r\n for (var i = 0; i < copying.length; i++) {\r\n copying[i].classList.remove('copying');\r\n copying[i].classList.remove('copying-left');\r\n copying[i].classList.remove('copying-right');\r\n copying[i].classList.remove('copying-top');\r\n copying[i].classList.remove('copying-bottom');\r\n }\r\n }\r\n\r\n /**\r\n * Process row\r\n */\r\n obj.historyProcessRow = function(type, historyRecord) {\r\n var rowIndex = (! historyRecord.insertBefore) ? historyRecord.rowNumber + 1 : historyRecord.rowNumber;\r\n \r\n if (obj.options.search == true) {\r\n if (obj.results && obj.results.length != obj.rows.length) {\r\n obj.resetSearch();\r\n }\r\n }\r\n \r\n // Remove row\r\n if (type == 1) {\r\n var numOfRows = historyRecord.numOfRows;\r\n // Remove nodes\r\n for (var j = rowIndex; j < (numOfRows + rowIndex); j++) {\r\n obj.rows[j].parentNode.removeChild(obj.rows[j]);\r\n }\r\n // Remove references\r\n obj.records.splice(rowIndex, numOfRows);\r\n obj.options.data.splice(rowIndex, numOfRows);\r\n obj.rows.splice(rowIndex, numOfRows);\r\n \r\n obj.conditionalSelectionUpdate(1, rowIndex, (numOfRows + rowIndex) - 1);\r\n } else {\r\n // Insert data\r\n obj.records = jexcel.injectArray(obj.records, rowIndex, historyRecord.rowRecords);\r\n obj.options.data = jexcel.injectArray(obj.options.data, rowIndex, historyRecord.rowData);\r\n obj.rows = jexcel.injectArray(obj.rows, rowIndex, historyRecord.rowNode);\r\n // Insert nodes\r\n var index = 0\r\n for (var j = rowIndex; j < (historyRecord.numOfRows + rowIndex); j++) {\r\n obj.tbody.insertBefore(historyRecord.rowNode[index], obj.tbody.children[j]);\r\n index++;\r\n }\r\n }\r\n \r\n // Respect pagination\r\n if (obj.options.pagination > 0) {\r\n obj.page(obj.pageNumber);\r\n }\r\n \r\n obj.updateTableReferences();\r\n }\r\n \r\n /**\r\n * Process column\r\n */\r\n obj.historyProcessColumn = function(type, historyRecord) {\r\n var columnIndex = (! historyRecord.insertBefore) ? historyRecord.columnNumber + 1 : historyRecord.columnNumber;\r\n \r\n // Remove column\r\n if (type == 1) {\r\n var numOfColumns = historyRecord.numOfColumns;\r\n \r\n obj.options.columns.splice(columnIndex, numOfColumns);\r\n for (var i = columnIndex; i < (numOfColumns + columnIndex); i++) {\r\n obj.headers[i].parentNode.removeChild(obj.headers[i]);\r\n obj.colgroup[i].parentNode.removeChild(obj.colgroup[i]);\r\n }\r\n obj.headers.splice(columnIndex, numOfColumns);\r\n obj.colgroup.splice(columnIndex, numOfColumns);\r\n for (var j = 0; j < historyRecord.data.length; j++) {\r\n for (var i = columnIndex; i < (numOfColumns + columnIndex); i++) {\r\n obj.records[j][i].parentNode.removeChild(obj.records[j][i]);\r\n }\r\n obj.records[j].splice(columnIndex, numOfColumns);\r\n obj.options.data[j].splice(columnIndex, numOfColumns);\r\n }\r\n // Process footers\r\n if (obj.options.footers) {\r\n for (var j = 0; j < obj.options.footers.length; j++) {\r\n obj.options.footers[j].splice(columnIndex, numOfColumns);\r\n }\r\n }\r\n } else {\r\n // Insert data\r\n obj.options.columns = jexcel.injectArray(obj.options.columns, columnIndex, historyRecord.columns);\r\n obj.headers = jexcel.injectArray(obj.headers, columnIndex, historyRecord.headers);\r\n obj.colgroup = jexcel.injectArray(obj.colgroup, columnIndex, historyRecord.colgroup);\r\n \r\n var index = 0\r\n for (var i = columnIndex; i < (historyRecord.numOfColumns + columnIndex); i++) {\r\n obj.headerContainer.insertBefore(historyRecord.headers[index], obj.headerContainer.children[i+1]);\r\n obj.colgroupContainer.insertBefore(historyRecord.colgroup[index], obj.colgroupContainer.children[i+1]);\r\n index++;\r\n }\r\n \r\n for (var j = 0; j < historyRecord.data.length; j++) {\r\n obj.options.data[j] = jexcel.injectArray(obj.options.data[j], columnIndex, historyRecord.data[j]);\r\n obj.records[j] = jexcel.injectArray(obj.records[j], columnIndex, historyRecord.records[j]);\r\n var index = 0\r\n for (var i = columnIndex; i < (historyRecord.numOfColumns + columnIndex); i++) {\r\n obj.rows[j].insertBefore(historyRecord.records[j][index], obj.rows[j].children[i+1]);\r\n index++;\r\n }\r\n }\r\n // Process footers\r\n if (obj.options.footers) {\r\n for (var j = 0; j < obj.options.footers.length; j++) {\r\n obj.options.footers[j] = jexcel.injectArray(obj.options.footers[j], columnIndex, historyRecord.footers[j]);\r\n }\r\n }\r\n }\r\n \r\n // Adjust nested headers\r\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0) {\r\n // Flexible way to handle nestedheaders\r\n if (obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\r\n for (var j = 0; j < obj.options.nestedHeaders.length; j++) {\r\n if (type == 1) {\r\n var colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan) - historyRecord.numOfColumns;\r\n } else {\r\n var colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan) + historyRecord.numOfColumns;\r\n }\r\n obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan = colspan;\r\n obj.thead.children[j].children[obj.thead.children[j].children.length-1].setAttribute('colspan', colspan);\r\n }\r\n } else {\r\n if (type == 1) {\r\n var colspan = parseInt(obj.options.nestedHeaders[0].colspan) - historyRecord.numOfColumns;\r\n } else {\r\n var colspan = parseInt(obj.options.nestedHeaders[0].colspan) + historyRecord.numOfColumns;\r\n }\r\n obj.options.nestedHeaders[0].colspan = colspan;\r\n obj.thead.children[0].children[obj.thead.children[0].children.length-1].setAttribute('colspan', colspan);\r\n }\r\n }\r\n \r\n obj.updateTableReferences();\r\n }\r\n \r\n /**\r\n * Undo last action\r\n */\r\n obj.undo = function() {\r\n // Ignore events and history\r\n var ignoreEvents = obj.ignoreEvents ? true : false;\r\n var ignoreHistory = obj.ignoreHistory ? true : false;\r\n \r\n obj.ignoreEvents = true;\r\n obj.ignoreHistory = true;\r\n \r\n // Records\r\n var records = [];\r\n \r\n // Update cells\r\n if (obj.historyIndex >= 0) {\r\n // History\r\n var historyRecord = obj.history[obj.historyIndex--];\r\n \r\n if (historyRecord.action == 'insertRow') {\r\n obj.historyProcessRow(1, historyRecord);\r\n } else if (historyRecord.action == 'deleteRow') {\r\n obj.historyProcessRow(0, historyRecord);\r\n } else if (historyRecord.action == 'insertColumn') {\r\n obj.historyProcessColumn(1, historyRecord);\r\n } else if (historyRecord.action == 'deleteColumn') {\r\n obj.historyProcessColumn(0, historyRecord);\r\n } else if (historyRecord.action == 'moveRow') {\r\n obj.moveRow(historyRecord.newValue, historyRecord.oldValue);\r\n } else if (historyRecord.action == 'moveColumn') {\r\n obj.moveColumn(historyRecord.newValue, historyRecord.oldValue);\r\n } else if (historyRecord.action == 'setMerge') {\r\n obj.removeMerge(historyRecord.column, historyRecord.data);\r\n } else if (historyRecord.action == 'setStyle') {\r\n obj.setStyle(historyRecord.oldValue, null, null, 1);\r\n } else if (historyRecord.action == 'setWidth') {\r\n obj.setWidth(historyRecord.column, historyRecord.oldValue);\r\n } else if (historyRecord.action == 'setHeight') {\r\n obj.setHeight(historyRecord.row, historyRecord.oldValue);\r\n } else if (historyRecord.action == 'setHeader') {\r\n obj.setHeader(historyRecord.column, historyRecord.oldValue);\r\n } else if (historyRecord.action == 'setComments') {\r\n obj.setComments(historyRecord.column, historyRecord.oldValue[0], historyRecord.oldValue[1]);\r\n } else if (historyRecord.action == 'orderBy') {\r\n var rows = [];\r\n for (var j = 0; j < historyRecord.rows.length; j++) {\r\n rows[historyRecord.rows[j]] = j;\r\n }\r\n obj.updateOrderArrow(historyRecord.column, historyRecord.order ? 0 : 1);\r\n obj.updateOrder(rows);\r\n } else if (historyRecord.action == 'setValue') {\r\n // Redo for changes in cells\r\n for (var i = 0; i < historyRecord.records.length; i++) {\r\n records.push({\r\n x: historyRecord.records[i].x,\r\n y: historyRecord.records[i].y,\r\n newValue: historyRecord.records[i].oldValue,\r\n });\r\n\r\n if (historyRecord.oldStyle) {\r\n obj.resetStyle(historyRecord.oldStyle);\r\n }\r\n }\r\n // Update records\r\n obj.setValue(records);\r\n\r\n // Update selection\r\n if (historyRecord.selection) {\r\n obj.updateSelectionFromCoords(historyRecord.selection[0], historyRecord.selection[1], historyRecord.selection[2], historyRecord.selection[3]);\r\n }\r\n }\r\n }\r\n obj.ignoreEvents = ignoreEvents;\r\n obj.ignoreHistory = ignoreHistory;\r\n \r\n // Events\r\n obj.dispatch('onundo', el, historyRecord);\r\n }\r\n \r\n /**\r\n * Redo previously undone action\r\n */\r\n obj.redo = function() {\r\n // Ignore events and history\r\n var ignoreEvents = obj.ignoreEvents ? true : false;\r\n var ignoreHistory = obj.ignoreHistory ? true : false;\r\n \r\n obj.ignoreEvents = true;\r\n obj.ignoreHistory = true;\r\n \r\n // Records\r\n var records = [];\r\n \r\n // Update cells\r\n if (obj.historyIndex < obj.history.length - 1) {\r\n // History\r\n var historyRecord = obj.history[++obj.historyIndex];\r\n \r\n if (historyRecord.action == 'insertRow') {\r\n obj.historyProcessRow(0, historyRecord);\r\n } else if (historyRecord.action == 'deleteRow') {\r\n obj.historyProcessRow(1, historyRecord);\r\n } else if (historyRecord.action == 'insertColumn') {\r\n obj.historyProcessColumn(0, historyRecord);\r\n } else if (historyRecord.action == 'deleteColumn') {\r\n obj.historyProcessColumn(1, historyRecord);\r\n } else if (historyRecord.action == 'moveRow') {\r\n obj.moveRow(historyRecord.oldValue, historyRecord.newValue);\r\n } else if (historyRecord.action == 'moveColumn') {\r\n obj.moveColumn(historyRecord.oldValue, historyRecord.newValue);\r\n } else if (historyRecord.action == 'setMerge') {\r\n obj.setMerge(historyRecord.column, historyRecord.colspan, historyRecord.rowspan, 1);\r\n } else if (historyRecord.action == 'setStyle') {\r\n obj.setStyle(historyRecord.newValue, null, null, 1);\r\n } else if (historyRecord.action == 'setWidth') {\r\n obj.setWidth(historyRecord.column, historyRecord.newValue);\r\n } else if (historyRecord.action == 'setHeight') {\r\n obj.setHeight(historyRecord.row, historyRecord.newValue);\r\n } else if (historyRecord.action == 'setHeader') {\r\n obj.setHeader(historyRecord.column, historyRecord.newValue);\r\n } else if (historyRecord.action == 'setComments') {\r\n obj.setComments(historyRecord.column, historyRecord.newValue[0], historyRecord.newValue[1]);\r\n } else if (historyRecord.action == 'orderBy') {\r\n obj.updateOrderArrow(historyRecord.column, historyRecord.order);\r\n obj.updateOrder(historyRecord.rows);\r\n } else if (historyRecord.action == 'setValue') {\r\n obj.setValue(historyRecord.records);\r\n // Redo for changes in cells\r\n for (var i = 0; i < historyRecord.records.length; i++) {\r\n if (historyRecord.oldStyle) {\r\n obj.resetStyle(historyRecord.newStyle);\r\n }\r\n }\r\n // Update selection\r\n if (historyRecord.selection) {\r\n obj.updateSelectionFromCoords(historyRecord.selection[0], historyRecord.selection[1], historyRecord.selection[2], historyRecord.selection[3]);\r\n }\r\n }\r\n }\r\n obj.ignoreEvents = ignoreEvents;\r\n obj.ignoreHistory = ignoreHistory;\r\n \r\n // Events\r\n obj.dispatch('onredo', el, historyRecord);\r\n }\r\n \r\n /**\r\n * Get dropdown value from key\r\n */\r\n obj.getDropDownValue = function(column, key) {\r\n var value = [];\r\n \r\n if (obj.options.columns[column] && obj.options.columns[column].source) {\r\n // Create array from source\r\n var combo = [];\r\n var source = obj.options.columns[column].source;\r\n \r\n for (var i = 0; i < source.length; i++) {\r\n if (typeof(source[i]) == 'object') {\r\n combo[source[i].id] = source[i].name;\r\n } else {\r\n combo[source[i]] = source[i];\r\n }\r\n }\r\n \r\n // Guarantee single multiple compatibility\r\n var keys = Array.isArray(key) ? key : ('' + key).split(';');\r\n \r\n for (var i = 0; i < keys.length; i++) {\r\n if (typeof(keys[i]) === 'object') {\r\n value.push(combo[keys[i].id]);\r\n } else {\r\n if (combo[keys[i]]) {\r\n value.push(combo[keys[i]]);\r\n }\r\n }\r\n }\r\n } else {\r\n console.error('Invalid column');\r\n }\r\n \r\n return (value.length > 0) ? value.join('; ') : '';\r\n }\r\n \r\n /**\r\n * From starckoverflow contributions\r\n */\r\n obj.parseCSV = function(str, delimiter) {\r\n // Remove last line break\r\n str = str.replace(/\\r?\\n$|\\r$|\\n$/g, \"\");\r\n // Last caracter is the delimiter\r\n if (str.charCodeAt(str.length-1) == 9) {\r\n str += \"\\0\";\r\n }\r\n // user-supplied delimeter or default comma\r\n delimiter = (delimiter || \",\");\r\n \r\n var arr = [];\r\n var quote = false; // true means we're inside a quoted field\r\n // iterate over each character, keep track of current row and column (of the returned array)\r\n for (var row = 0, col = 0, c = 0; c < str.length; c++) {\r\n var cc = str[c], nc = str[c+1];\r\n arr[row] = arr[row] || [];\r\n arr[row][col] = arr[row][col] || '';\r\n \r\n // If the current character is a quotation mark, and we're inside a quoted field, and the next character is also a quotation mark, add a quotation mark to the current column and skip the next character\r\n if (cc == '\"' && quote && nc == '\"') { arr[row][col] += cc; ++c; continue; } \r\n \r\n // If it's just one quotation mark, begin/end quoted field\r\n if (cc == '\"') { quote = !quote; continue; }\r\n \r\n // If it's a comma and we're not in a quoted field, move on to the next column\r\n if (cc == delimiter && !quote) { ++col; continue; }\r\n \r\n // If it's a newline (CRLF) and we're not in a quoted field, skip the next character and move on to the next row and move to column 0 of that new row\r\n if (cc == '\\r' && nc == '\\n' && !quote) { ++row; col = 0; ++c; continue; }\r\n \r\n // If it's a newline (LF or CR) and we're not in a quoted field, move on to the next row and move to column 0 of that new row\r\n if (cc == '\\n' && !quote) { ++row; col = 0; continue; }\r\n if (cc == '\\r' && !quote) { ++row; col = 0; continue; }\r\n \r\n // Otherwise, append the current character to the current column\r\n arr[row][col] += cc;\r\n }\r\n return arr;\r\n }\r\n \r\n obj.hash = function(str) {\r\n var hash = 0, i, chr;\r\n \r\n if (str.length === 0) {\r\n return hash;\r\n } else {\r\n for (i = 0; i < str.length; i++) {\r\n chr = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + chr;\r\n hash |= 0;\r\n }\r\n }\r\n return hash;\r\n }\r\n \r\n obj.onafterchanges = function(el, records) {\r\n // Events\r\n obj.dispatch('onafterchanges', el, records);\r\n }\r\n \r\n obj.destroy = function() {\r\n jexcel.destroy(el);\r\n }\r\n\r\n /**\r\n * Initialization method\r\n */\r\n obj.init = function() {\r\n jexcel.current = obj;\r\n \r\n // Build handlers\r\n if (typeof(jexcel.build) == 'function') {\r\n if (obj.options.root) {\r\n jexcel.build(obj.options.root);\r\n } else {\r\n jexcel.build(document);\r\n jexcel.build = null;\r\n }\r\n }\r\n \r\n // Event\r\n el.setAttribute('tabindex', 1);\r\n el.addEventListener('focus', function(e) {\r\n if (jexcel.current && ! obj.selectedCell) {\r\n obj.updateSelectionFromCoords(0,0,0,0);\r\n obj.left();\r\n }\r\n });\r\n\r\n // Load the table data based on an CSV file\r\n if (obj.options.csv) {\r\n // Loading\r\n if (obj.options.loadingSpin == true) {\r\n jSuites.loading.show();\r\n }\r\n \r\n // Load CSV file\r\n jSuites.ajax({\r\n url: obj.options.csv,\r\n method: obj.options.method,\r\n data: obj.options.requestVariables,\r\n dataType: 'text',\r\n success: function(result) {\r\n // Convert data\r\n var newData = obj.parseCSV(result, obj.options.csvDelimiter)\r\n \r\n // Headers\r\n if (obj.options.csvHeaders == true && newData.length > 0) {\r\n var headers = newData.shift();\r\n for(var i = 0; i < headers.length; i++) {\r\n if (! obj.options.columns[i]) {\r\n obj.options.columns[i] = { type:'text', align:obj.options.defaultColAlign, width:obj.options.defaultColWidth };\r\n }\r\n // Precedence over pre-configurated titles\r\n if (typeof obj.options.columns[i].title === 'undefined') {\r\n obj.options.columns[i].title = headers[i];\r\n }\r\n }\r\n }\r\n // Data\r\n obj.options.data = newData;\r\n // Prepare table\r\n obj.prepareTable();\r\n // Hide spin\r\n if (obj.options.loadingSpin == true) {\r\n jSuites.loading.hide();\r\n }\r\n }\r\n });\r\n } else if (obj.options.url) {\r\n // Loading\r\n if (obj.options.loadingSpin == true) {\r\n jSuites.loading.show();\r\n }\r\n \r\n jSuites.ajax({\r\n url: obj.options.url,\r\n method: obj.options.method,\r\n data: obj.options.requestVariables,\r\n dataType: 'json',\r\n success: function(result) {\r\n // Data\r\n obj.options.data = (result.data) ? result.data : result;\r\n // Prepare table\r\n obj.prepareTable();\r\n // Hide spin\r\n if (obj.options.loadingSpin == true) {\r\n jSuites.loading.hide();\r\n }\r\n }\r\n });\r\n } else {\r\n // Prepare table\r\n obj.prepareTable();\r\n }\r\n }\r\n \r\n // Context menu\r\n if (options && options.contextMenu != null) {\r\n obj.options.contextMenu = options.contextMenu;\r\n } else {\r\n obj.options.contextMenu = function(el, x, y, e) {\r\n var items = [];\r\n \r\n if (y == null) {\r\n // Insert a new column\r\n if (obj.options.allowInsertColumn == true) {\r\n items.push({\r\n title:obj.options.text.insertANewColumnBefore,\r\n onclick:function() {\r\n obj.insertColumn(1, parseInt(x), 1);\r\n }\r\n });\r\n }\r\n \r\n if (obj.options.allowInsertColumn == true) {\r\n items.push({\r\n title:obj.options.text.insertANewColumnAfter,\r\n onclick:function() {\r\n obj.insertColumn(1, parseInt(x), 0);\r\n }\r\n });\r\n }\r\n \r\n // Delete a column\r\n if (obj.options.allowDeleteColumn == true) {\r\n items.push({\r\n title:obj.options.text.deleteSelectedColumns,\r\n onclick:function() {\r\n obj.deleteColumn(obj.getSelectedColumns().length ? undefined : parseInt(x));\r\n }\r\n });\r\n }\r\n \r\n // Rename column\r\n if (obj.options.allowRenameColumn == true) {\r\n items.push({\r\n title:obj.options.text.renameThisColumn,\r\n onclick:function() {\r\n obj.setHeader(x);\r\n }\r\n });\r\n }\r\n \r\n // Sorting\r\n if (obj.options.columnSorting == true) {\r\n // Line\r\n items.push({ type:'line' });\r\n \r\n items.push({\r\n title:obj.options.text.orderAscending,\r\n onclick:function() {\r\n obj.orderBy(x, 0);\r\n }\r\n });\r\n items.push({\r\n title:obj.options.text.orderDescending,\r\n onclick:function() {\r\n obj.orderBy(x, 1);\r\n }\r\n });\r\n }\r\n } else {\r\n // Insert new row\r\n if (obj.options.allowInsertRow == true) {\r\n items.push({\r\n title:obj.options.text.insertANewRowBefore,\r\n onclick:function() {\r\n obj.insertRow(1, parseInt(y), 1);\r\n }\r\n });\r\n \r\n items.push({\r\n title:obj.options.text.insertANewRowAfter,\r\n onclick:function() {\r\n obj.insertRow(1, parseInt(y));\r\n }\r\n });\r\n }\r\n \r\n if (obj.options.allowDeleteRow == true) {\r\n items.push({\r\n title:obj.options.text.deleteSelectedRows,\r\n onclick:function() {\r\n obj.deleteRow(obj.getSelectedRows().length ? undefined : parseInt(y));\r\n }\r\n });\r\n }\r\n \r\n if (x) {\r\n if (obj.options.allowComments == true) {\r\n items.push({ type:'line' });\r\n \r\n var title = obj.records[y][x].getAttribute('title') || '';\r\n\r\n items.push({\r\n title: title ? obj.options.text.editComments : obj.options.text.addComments,\r\n onclick:function() {\r\n var comment = prompt(obj.options.text.comments, title);\r\n if (comment) {\r\n obj.setComments([ x, y ], comment);\r\n }\r\n }\r\n });\r\n \r\n if (title) {\r\n items.push({\r\n title:obj.options.text.clearComments,\r\n onclick:function() {\r\n obj.setComments([ x, y ], '');\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Line\r\n items.push({ type:'line' });\r\n \r\n // Copy\r\n items.push({\r\n title:obj.options.text.copy,\r\n shortcut:'Ctrl + C',\r\n onclick:function() {\r\n obj.copy(true);\r\n }\r\n });\r\n \r\n // Paste\r\n if (navigator && navigator.clipboard) {\r\n items.push({\r\n title:obj.options.text.paste,\r\n shortcut:'Ctrl + V',\r\n onclick:function() {\r\n if (obj.selectedCell) {\r\n navigator.clipboard.readText().then(function(text) {\r\n if (text) {\r\n jexcel.current.paste(obj.selectedCell[0], obj.selectedCell[1], text);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n \r\n // Save\r\n if (obj.options.allowExport) {\r\n items.push({\r\n title: obj.options.text.saveAs,\r\n shortcut: 'Ctrl + S',\r\n onclick: function () {\r\n obj.download();\r\n }\r\n });\r\n }\r\n \r\n // About\r\n if (obj.options.about) {\r\n items.push({\r\n title:obj.options.text.about,\r\n onclick:function() {\r\n if (obj.options.about === true) {\r\n alert(Version().print());\r\n } else {\r\n alert(obj.options.about);\r\n }\r\n }\r\n });\r\n }\r\n \r\n return items;\r\n }\r\n }\r\n \r\n obj.scrollControls = function(e) {\r\n obj.wheelControls();\r\n\r\n if (obj.options.freezeColumns > 0 && obj.content.scrollLeft != scrollLeft) {\r\n obj.updateFreezePosition();\r\n }\r\n\r\n // Close editor\r\n if (obj.options.lazyLoading == true || obj.options.tableOverflow == true) {\r\n if (obj.edition && e.target.className.substr(0,9) != 'jdropdown') {\r\n obj.closeEditor(obj.edition[0], true);\r\n }\r\n }\r\n }\r\n\r\n obj.wheelControls = function(e) {\r\n if (obj.options.lazyLoading == true) {\r\n if (jexcel.timeControlLoading == null) {\r\n jexcel.timeControlLoading = setTimeout(function() {\r\n if (obj.content.scrollTop + obj.content.clientHeight >= obj.content.scrollHeight - 10) {\r\n if (obj.loadDown()) {\r\n if (obj.content.scrollTop + obj.content.clientHeight > obj.content.scrollHeight - 10) {\r\n obj.content.scrollTop = obj.content.scrollTop - obj.content.clientHeight;\r\n }\r\n obj.updateCornerPosition();\r\n }\r\n } else if (obj.content.scrollTop <= obj.content.clientHeight) {\r\n if (obj.loadUp()) {\r\n if (obj.content.scrollTop < 10) {\r\n obj.content.scrollTop = obj.content.scrollTop + obj.content.clientHeight;\r\n }\r\n obj.updateCornerPosition();\r\n }\r\n }\r\n \r\n jexcel.timeControlLoading = null;\r\n }, 100);\r\n }\r\n }\r\n }\r\n\r\n // Get width of all freezed cells together\r\n obj.getFreezeWidth = function() {\r\n var width = 0;\r\n if (obj.options.freezeColumns > 0) {\r\n for (var i = 0; i < obj.options.freezeColumns; i++) {\r\n width += parseInt(obj.options.columns[i].width);\r\n }\r\n }\r\n return width;\r\n }\r\n\r\n var scrollLeft = 0;\r\n\r\n obj.updateFreezePosition = function() {\r\n scrollLeft = obj.content.scrollLeft;\r\n var width = 0;\r\n if (scrollLeft > 50) {\r\n for (var i = 0; i < obj.options.freezeColumns; i++) {\r\n if (i > 0) {\r\n width += parseInt(obj.options.columns[i-1].width);\r\n }\r\n obj.headers[i].classList.add('jexcel_freezed');\r\n obj.headers[i].style.left = width + 'px';\r\n for (var j = 0; j < obj.rows.length; j++) {\r\n if (obj.rows[j] && obj.records[j][i]) {\r\n var shifted = (scrollLeft + (i > 0 ? obj.records[j][i-1].style.width : 0)) - 51 + 'px';\r\n obj.records[j][i].classList.add('jexcel_freezed');\r\n obj.records[j][i].style.left = shifted;\r\n }\r\n }\r\n }\r\n } else {\r\n for (var i = 0; i < obj.options.freezeColumns; i++) {\r\n obj.headers[i].classList.remove('jexcel_freezed');\r\n obj.headers[i].style.left = '';\r\n for (var j = 0; j < obj.rows.length; j++) {\r\n if (obj.records[j][i]) {\r\n obj.records[j][i].classList.remove('jexcel_freezed');\r\n obj.records[j][i].style.left = '';\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Place the corner in the correct place\r\n obj.updateCornerPosition();\r\n }\r\n\r\n el.addEventListener(\"DOMMouseScroll\", obj.wheelControls);\r\n el.addEventListener(\"mousewheel\", obj.wheelControls);\r\n \r\n el.jexcel = obj;\r\n el.jspreadsheet = obj;\r\n \r\n obj.init();\r\n \r\n return obj;\r\n });\r\n \r\n jexcel.version = Version;\r\n\r\n jexcel.current = null;\r\n jexcel.timeControl = null;\r\n jexcel.timeControlLoading = null;\r\n \r\n jexcel.destroy = function(element, destroyEventHandlers) {\r\n if (element.jexcel) {\r\n var root = element.jexcel.options.root ? element.jexcel.options.root : document;\r\n element.removeEventListener(\"DOMMouseScroll\", element.jexcel.scrollControls);\r\n element.removeEventListener(\"mousewheel\", element.jexcel.scrollControls);\r\n element.jexcel = null;\r\n element.innerHTML = '';\r\n \r\n if (destroyEventHandlers) {\r\n root.removeEventListener(\"mouseup\", jexcel.mouseUpControls);\r\n root.removeEventListener(\"mousedown\", jexcel.mouseDownControls);\r\n root.removeEventListener(\"mousemove\", jexcel.mouseMoveControls);\r\n root.removeEventListener(\"mouseover\", jexcel.mouseOverControls);\r\n root.removeEventListener(\"dblclick\", jexcel.doubleClickControls);\r\n root.removeEventListener(\"paste\", jexcel.pasteControls);\r\n root.removeEventListener(\"contextmenu\", jexcel.contextMenuControls);\r\n root.removeEventListener(\"touchstart\", jexcel.touchStartControls);\r\n root.removeEventListener(\"touchend\", jexcel.touchEndControls);\r\n root.removeEventListener(\"touchcancel\", jexcel.touchEndControls);\r\n document.removeEventListener(\"keydown\", jexcel.keyDownControls);\r\n jexcel = null;\r\n }\r\n }\r\n }\r\n \r\n jexcel.build = function(root) {\r\n root.addEventListener(\"mouseup\", jexcel.mouseUpControls);\r\n root.addEventListener(\"mousedown\", jexcel.mouseDownControls);\r\n root.addEventListener(\"mousemove\", jexcel.mouseMoveControls);\r\n root.addEventListener(\"mouseover\", jexcel.mouseOverControls);\r\n root.addEventListener(\"dblclick\", jexcel.doubleClickControls);\r\n root.addEventListener(\"paste\", jexcel.pasteControls);\r\n root.addEventListener(\"contextmenu\", jexcel.contextMenuControls);\r\n root.addEventListener(\"touchstart\", jexcel.touchStartControls);\r\n root.addEventListener(\"touchend\", jexcel.touchEndControls);\r\n root.addEventListener(\"touchcancel\", jexcel.touchEndControls);\r\n root.addEventListener(\"touchmove\", jexcel.touchEndControls);\r\n document.addEventListener(\"keydown\", jexcel.keyDownControls);\r\n }\r\n \r\n /**\r\n * Events\r\n */\r\n jexcel.keyDownControls = function(e) {\r\n if (jexcel.current) {\r\n if (jexcel.current.edition) {\r\n if (e.which == 27) {\r\n // Escape\r\n if (jexcel.current.edition) {\r\n // Exit without saving\r\n jexcel.current.closeEditor(jexcel.current.edition[0], false);\r\n }\r\n e.preventDefault();\r\n } else if (e.which == 13) {\r\n // Enter\r\n if (jexcel.current.options.columns[jexcel.current.edition[2]].type == 'calendar') {\r\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\r\n } else if (jexcel.current.options.columns[jexcel.current.edition[2]].type == 'dropdown' ||\r\n jexcel.current.options.columns[jexcel.current.edition[2]].type == 'autocomplete') {\r\n // Do nothing\r\n } else {\r\n // Alt enter -> do not close editor\r\n if ((jexcel.current.options.wordWrap == true ||\r\n jexcel.current.options.columns[jexcel.current.edition[2]].wordWrap == true ||\r\n jexcel.current.options.data[jexcel.current.edition[3]][jexcel.current.edition[2]].length > 200) && e.altKey) {\r\n // Add new line to the editor\r\n var editorTextarea = jexcel.current.edition[0].children[0];\r\n var editorValue = jexcel.current.edition[0].children[0].value;\r\n var editorIndexOf = editorTextarea.selectionStart;\r\n editorValue = editorValue.slice(0, editorIndexOf) + \"\\n\" + editorValue.slice(editorIndexOf);\r\n editorTextarea.value = editorValue;\r\n editorTextarea.focus();\r\n editorTextarea.selectionStart = editorIndexOf + 1;\r\n editorTextarea.selectionEnd = editorIndexOf + 1;\r\n } else {\r\n jexcel.current.edition[0].children[0].blur();\r\n }\r\n }\r\n } else if (e.which == 9) {\r\n // Tab\r\n if (jexcel.current.options.columns[jexcel.current.edition[2]].type == 'calendar') {\r\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\r\n } else {\r\n jexcel.current.edition[0].children[0].blur();\r\n }\r\n }\r\n }\r\n \r\n if (! jexcel.current.edition && jexcel.current.selectedCell) {\r\n // Which key\r\n if (e.which == 37) {\r\n jexcel.current.left(e.shiftKey, e.ctrlKey);\r\n e.preventDefault();\r\n } else if (e.which == 39) {\r\n jexcel.current.right(e.shiftKey, e.ctrlKey);\r\n e.preventDefault();\r\n } else if (e.which == 38) {\r\n jexcel.current.up(e.shiftKey, e.ctrlKey);\r\n e.preventDefault();\r\n } else if (e.which == 40) {\r\n jexcel.current.down(e.shiftKey, e.ctrlKey);\r\n e.preventDefault();\r\n } else if (e.which == 36) {\r\n jexcel.current.first(e.shiftKey, e.ctrlKey);\r\n e.preventDefault();\r\n } else if (e.which == 35) {\r\n jexcel.current.last(e.shiftKey, e.ctrlKey);\r\n e.preventDefault();\r\n } else if (e.which == 32) {\r\n if (jexcel.current.options.editable == true) {\r\n jexcel.current.setCheckRadioValue();\r\n }\r\n e.preventDefault();\r\n } else if (e.which == 46) {\r\n // Delete\r\n if (jexcel.current.options.editable == true) {\r\n if (jexcel.current.selectedRow) {\r\n if (jexcel.current.options.allowDeleteRow == true) {\r\n if (confirm(jexcel.current.options.text.areYouSureToDeleteTheSelectedRows)) {\r\n jexcel.current.deleteRow();\r\n }\r\n }\r\n } else if (jexcel.current.selectedHeader) {\r\n if (jexcel.current.options.allowDeleteColumn == true) {\r\n if (confirm(jexcel.current.options.text.areYouSureToDeleteTheSelectedColumns)) {\r\n jexcel.current.deleteColumn();\r\n }\r\n }\r\n } else {\r\n // Change value\r\n jexcel.current.setValue(jexcel.current.highlighted, '');\r\n }\r\n }\r\n } else if (e.which == 13) {\r\n // Move cursor\r\n if (e.shiftKey) {\r\n jexcel.current.up();\r\n } else {\r\n if (jexcel.current.options.allowInsertRow == true) {\r\n if (jexcel.current.options.allowManualInsertRow == true) {\r\n if (jexcel.current.selectedCell[1] == jexcel.current.options.data.length - 1) {\r\n // New record in case selectedCell in the last row\r\n jexcel.current.insertRow();\r\n }\r\n }\r\n }\r\n \r\n jexcel.current.down();\r\n }\r\n e.preventDefault();\r\n } else if (e.which == 9) {\r\n // Tab\r\n if (e.shiftKey) {\r\n jexcel.current.left();\r\n } else {\r\n if (jexcel.current.options.allowInsertColumn == true) {\r\n if (jexcel.current.options.allowManualInsertColumn == true) {\r\n if (jexcel.current.selectedCell[0] == jexcel.current.options.data[0].length - 1) {\r\n // New record in case selectedCell in the last column\r\n jexcel.current.insertColumn();\r\n }\r\n }\r\n }\r\n \r\n jexcel.current.right();\r\n }\r\n e.preventDefault();\r\n } else {\r\n if ((e.ctrlKey || e.metaKey) && ! e.shiftKey) {\r\n if (e.which == 65) {\r\n // Ctrl + A\r\n jexcel.current.selectAll();\r\n e.preventDefault();\r\n } else if (e.which == 83) {\r\n // Ctrl + S\r\n jexcel.current.download();\r\n e.preventDefault();\r\n } else if (e.which == 89) {\r\n // Ctrl + Y\r\n jexcel.current.redo();\r\n e.preventDefault();\r\n } else if (e.which == 90) {\r\n // Ctrl + Z\r\n jexcel.current.undo();\r\n e.preventDefault();\r\n } else if (e.which == 67) {\r\n // Ctrl + C\r\n jexcel.current.copy(true);\r\n e.preventDefault();\r\n } else if (e.which == 88) {\r\n // Ctrl + X\r\n if (jexcel.current.options.editable == true) {\r\n jexcel.cutControls();\r\n } else {\r\n jexcel.copyControls();\r\n }\r\n e.preventDefault();\r\n } else if (e.which == 86) {\r\n // Ctrl + V\r\n jexcel.pasteControls();\r\n }\r\n } else {\r\n if (jexcel.current.selectedCell) {\r\n if (jexcel.current.options.editable == true) {\r\n var rowId = jexcel.current.selectedCell[1];\r\n var columnId = jexcel.current.selectedCell[0];\r\n \r\n // If is not readonly\r\n if (jexcel.current.options.columns[columnId].type != 'readonly') {\r\n // Characters able to start a edition\r\n if (e.keyCode == 32) {\r\n // Space\r\n if (jexcel.current.options.columns[columnId].type == 'checkbox' ||\r\n jexcel.current.options.columns[columnId].type == 'radio') {\r\n e.preventDefault();\r\n } else {\r\n // Start edition\r\n jexcel.current.openEditor(jexcel.current.records[rowId][columnId], true);\r\n }\r\n } else if (e.keyCode == 113) {\r\n // Start edition with current content F2\r\n jexcel.current.openEditor(jexcel.current.records[rowId][columnId], false);\r\n } else if ((e.keyCode == 8) ||\r\n (e.keyCode >= 48 && e.keyCode <= 57) ||\r\n (e.keyCode >= 96 && e.keyCode <= 111) ||\r\n (e.keyCode >= 187 && e.keyCode <= 190) ||\r\n ((String.fromCharCode(e.keyCode) == e.key || String.fromCharCode(e.keyCode).toLowerCase() == e.key.toLowerCase()) && jexcel.validLetter(String.fromCharCode(e.keyCode)))) {\r\n // Start edition\r\n jexcel.current.openEditor(jexcel.current.records[rowId][columnId], true);\r\n // Prevent entries in the calendar\r\n if (jexcel.current.options.columns[columnId].type == 'calendar') {\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (e.target.classList.contains('jexcel_search')) {\r\n if (jexcel.timeControl) {\r\n clearTimeout(jexcel.timeControl);\r\n }\r\n \r\n jexcel.timeControl = setTimeout(function() {\r\n jexcel.current.search(e.target.value);\r\n }, 200);\r\n }\r\n }\r\n }\r\n }\r\n \r\n jexcel.isMouseAction = false;\r\n \r\n jexcel.mouseDownControls = function(e) {\r\n e = e || window.event;\r\n if (e.buttons) {\r\n var mouseButton = e.buttons;\r\n } else if (e.button) {\r\n var mouseButton = e.button;\r\n } else {\r\n var mouseButton = e.which;\r\n }\r\n\r\n // Get elements\r\n var jexcelTable = jexcel.getElement(e.target);\r\n\r\n if (jexcelTable[0]) {\r\n if (jexcel.current != jexcelTable[0].jexcel) {\r\n if (jexcel.current) {\r\n if (jexcel.current.edition) {\r\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\r\n }\r\n jexcel.current.resetSelection();\r\n }\r\n jexcel.current = jexcelTable[0].jexcel;\r\n }\r\n } else {\r\n if (jexcel.current) {\r\n if (jexcel.current.edition) {\r\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\r\n }\r\n \r\n jexcel.current.resetSelection(true);\r\n jexcel.current = null;\r\n }\r\n }\r\n \r\n if (jexcel.current && mouseButton == 1) {\r\n if (e.target.classList.contains('jexcel_selectall')) {\r\n if (jexcel.current) {\r\n jexcel.current.selectAll();\r\n }\r\n } else if (e.target.classList.contains('jexcel_corner')) {\r\n if (jexcel.current.options.editable == true) {\r\n jexcel.current.selectedCorner = true;\r\n }\r\n } else {\r\n // Header found\r\n if (jexcelTable[1] == 1) {\r\n var columnId = e.target.getAttribute('data-x');\r\n if (columnId) {\r\n // Update cursor\r\n var info = e.target.getBoundingClientRect();\r\n if (jexcel.current.options.columnResize == true && info.width - e.offsetX < 6) {\r\n // Resize helper\r\n jexcel.current.resizing = {\r\n mousePosition: e.pageX,\r\n column: columnId,\r\n width: info.width,\r\n };\r\n \r\n // Border indication\r\n jexcel.current.headers[columnId].classList.add('resizing');\r\n for (var j = 0; j < jexcel.current.records.length; j++) {\r\n if (jexcel.current.records[j][columnId]) {\r\n jexcel.current.records[j][columnId].classList.add('resizing');\r\n }\r\n }\r\n } else if (jexcel.current.options.columnDrag == true && info.height - e.offsetY < 6) {\r\n if (jexcel.current.isColMerged(columnId).length) {\r\n console.error('Jspreadsheet: This column is part of a merged cell.');\r\n } else {\r\n // Reset selection\r\n jexcel.current.resetSelection();\r\n // Drag helper\r\n jexcel.current.dragging = {\r\n element: e.target,\r\n column:columnId,\r\n destination:columnId,\r\n };\r\n // Border indication\r\n jexcel.current.headers[columnId].classList.add('dragging');\r\n for (var j = 0; j < jexcel.current.records.length; j++) {\r\n if (jexcel.current.records[j][columnId]) {\r\n jexcel.current.records[j][columnId].classList.add('dragging');\r\n }\r\n }\r\n }\r\n } else {\r\n if (jexcel.current.selectedHeader && (e.shiftKey || e.ctrlKey)) {\r\n var o = jexcel.current.selectedHeader;\r\n var d = columnId;\r\n } else {\r\n // Press to rename\r\n if (jexcel.current.selectedHeader == columnId && jexcel.current.options.allowRenameColumn == true) {\r\n jexcel.timeControl = setTimeout(function() {\r\n jexcel.current.setHeader(columnId);\r\n }, 800);\r\n }\r\n \r\n // Keep track of which header was selected first\r\n jexcel.current.selectedHeader = columnId;\r\n \r\n // Update selection single column\r\n var o = columnId;\r\n var d = columnId;\r\n }\r\n \r\n // Update selection\r\n jexcel.current.updateSelectionFromCoords(o, 0, d, jexcel.current.options.data.length - 1);\r\n }\r\n } else {\r\n if (e.target.parentNode.classList.contains('jexcel_nested')) {\r\n if (e.target.getAttribute('data-column')) {\r\n var column = e.target.getAttribute('data-column').split(',');\r\n var c1 = parseInt(column[0]);\r\n var c2 = parseInt(column[column.length-1]);\r\n } else {\r\n var c1 = 0;\r\n var c2 = jexcel.current.options.columns.length - 1;\r\n }\r\n jexcel.current.updateSelectionFromCoords(c1, 0, c2, jexcel.current.options.data.length - 1);\r\n }\r\n }\r\n } else {\r\n jexcel.current.selectedHeader = false;\r\n }\r\n \r\n // Body found\r\n if (jexcelTable[1] == 2) {\r\n var rowId = e.target.getAttribute('data-y');\r\n \r\n if (e.target.classList.contains('jexcel_row')) {\r\n var info = e.target.getBoundingClientRect();\r\n if (jexcel.current.options.rowResize == true && info.height - e.offsetY < 6) {\r\n // Resize helper\r\n jexcel.current.resizing = {\r\n element: e.target.parentNode,\r\n mousePosition: e.pageY,\r\n row: rowId,\r\n height: info.height,\r\n };\r\n // Border indication\r\n e.target.parentNode.classList.add('resizing');\r\n } else if (jexcel.current.options.rowDrag == true && info.width - e.offsetX < 6) {\r\n if (jexcel.current.isRowMerged(rowId).length) {\r\n console.error('Jspreadsheet: This row is part of a merged cell');\r\n } else if (jexcel.current.options.search == true && jexcel.current.results) {\r\n console.error('Jspreadsheet: Please clear your search before perform this action');\r\n } else {\r\n // Reset selection\r\n jexcel.current.resetSelection();\r\n // Drag helper\r\n jexcel.current.dragging = {\r\n element: e.target.parentNode,\r\n row:rowId,\r\n destination:rowId,\r\n };\r\n // Border indication\r\n e.target.parentNode.classList.add('dragging');\r\n }\r\n } else {\r\n if (jexcel.current.selectedRow && (e.shiftKey || e.ctrlKey)) {\r\n var o = jexcel.current.selectedRow;\r\n var d = rowId;\r\n } else {\r\n // Keep track of which header was selected first\r\n jexcel.current.selectedRow = rowId;\r\n \r\n // Update selection single column\r\n var o = rowId;\r\n var d = rowId;\r\n }\r\n \r\n // Update selection\r\n jexcel.current.updateSelectionFromCoords(0, o, jexcel.current.options.data[0].length - 1, d);\r\n }\r\n } else {\r\n // Jclose\r\n if (e.target.classList.contains('jclose') && e.target.clientWidth - e.offsetX < 50 && e.offsetY < 50) {\r\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\r\n } else {\r\n var getCellCoords = function(element) {\r\n var x = element.getAttribute('data-x');\r\n var y = element.getAttribute('data-y');\r\n if (x && y) {\r\n return [x, y];\r\n } else {\r\n if (element.parentNode) {\r\n return getCellCoords(element.parentNode);\r\n }\r\n }\r\n };\r\n\r\n var position = getCellCoords(e.target);\r\n if (position) {\r\n\r\n var columnId = position[0];\r\n var rowId = position[1];\r\n // Close edition\r\n if (jexcel.current.edition) {\r\n if (jexcel.current.edition[2] != columnId || jexcel.current.edition[3] != rowId) {\r\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\r\n }\r\n }\r\n\r\n if (! jexcel.current.edition) {\r\n // Update cell selection\r\n if (e.shiftKey) {\r\n jexcel.current.updateSelectionFromCoords(jexcel.current.selectedCell[0], jexcel.current.selectedCell[1], columnId, rowId);\r\n } else {\r\n jexcel.current.updateSelectionFromCoords(columnId, rowId);\r\n }\r\n }\r\n\r\n // No full row selected\r\n jexcel.current.selectedHeader = null;\r\n jexcel.current.selectedRow = null;\r\n }\r\n }\r\n }\r\n } else {\r\n jexcel.current.selectedRow = false;\r\n }\r\n \r\n // Pagination\r\n if (e.target.classList.contains('jexcel_page')) {\r\n if (e.target.innerText == '<') {\r\n jexcel.current.page(0);\r\n } else if (e.target.innerText == '>') {\r\n jexcel.current.page(e.target.getAttribute('title') - 1);\r\n } else {\r\n jexcel.current.page(e.target.innerText - 1);\r\n }\r\n }\r\n }\r\n \r\n if (jexcel.current.edition) {\r\n jexcel.isMouseAction = false;\r\n } else {\r\n jexcel.isMouseAction = true;\r\n }\r\n } else {\r\n jexcel.isMouseAction = false;\r\n }\r\n }\r\n \r\n jexcel.mouseUpControls = function(e) {\r\n if (jexcel.current) {\r\n // Update cell size\r\n if (jexcel.current.resizing) {\r\n // Columns to be updated\r\n if (jexcel.current.resizing.column) {\r\n // New width\r\n var newWidth = jexcel.current.colgroup[jexcel.current.resizing.column].getAttribute('width');\r\n // Columns\r\n var columns = jexcel.current.getSelectedColumns();\r\n if (columns.length > 1) {\r\n var currentWidth = [];\r\n for (var i = 0; i < columns.length; i++) {\r\n currentWidth.push(parseInt(jexcel.current.colgroup[columns[i]].getAttribute('width')));\r\n }\r\n // Previous width\r\n var index = columns.indexOf(parseInt(jexcel.current.resizing.column));\r\n currentWidth[index] = jexcel.current.resizing.width;\r\n jexcel.current.setWidth(columns, newWidth, currentWidth);\r\n } else {\r\n jexcel.current.setWidth(jexcel.current.resizing.column, newWidth, jexcel.current.resizing.width);\r\n }\r\n // Remove border\r\n jexcel.current.headers[jexcel.current.resizing.column].classList.remove('resizing');\r\n for (var j = 0; j < jexcel.current.records.length; j++) {\r\n if (jexcel.current.records[j][jexcel.current.resizing.column]) {\r\n jexcel.current.records[j][jexcel.current.resizing.column].classList.remove('resizing');\r\n }\r\n }\r\n } else {\r\n // Remove Class\r\n jexcel.current.rows[jexcel.current.resizing.row].children[0].classList.remove('resizing');\r\n var newHeight = jexcel.current.rows[jexcel.current.resizing.row].getAttribute('height');\r\n jexcel.current.setHeight(jexcel.current.resizing.row, newHeight, jexcel.current.resizing.height);\r\n // Remove border\r\n jexcel.current.resizing.element.classList.remove('resizing');\r\n }\r\n // Reset resizing helper\r\n jexcel.current.resizing = null;\r\n } else if (jexcel.current.dragging) {\r\n // Reset dragging helper\r\n if (jexcel.current.dragging) {\r\n if (jexcel.current.dragging.column) {\r\n // Target\r\n var columnId = e.target.getAttribute('data-x');\r\n // Remove move style\r\n jexcel.current.headers[jexcel.current.dragging.column].classList.remove('dragging');\r\n for (var j = 0; j < jexcel.current.rows.length; j++) {\r\n if (jexcel.current.records[j][jexcel.current.dragging.column]) {\r\n jexcel.current.records[j][jexcel.current.dragging.column].classList.remove('dragging');\r\n }\r\n }\r\n for (var i = 0; i < jexcel.current.headers.length; i++) {\r\n jexcel.current.headers[i].classList.remove('dragging-left');\r\n jexcel.current.headers[i].classList.remove('dragging-right');\r\n }\r\n // Update position\r\n if (columnId) {\r\n if (jexcel.current.dragging.column != jexcel.current.dragging.destination) {\r\n jexcel.current.moveColumn(jexcel.current.dragging.column, jexcel.current.dragging.destination);\r\n }\r\n }\r\n } else {\r\n if (jexcel.current.dragging.element.nextSibling) {\r\n var position = parseInt(jexcel.current.dragging.element.nextSibling.getAttribute('data-y'));\r\n if (jexcel.current.dragging.row < position) {\r\n position -= 1;\r\n }\r\n } else {\r\n var position = parseInt(jexcel.current.dragging.element.previousSibling.getAttribute('data-y'));\r\n }\r\n if (jexcel.current.dragging.row != jexcel.current.dragging.destination) {\r\n jexcel.current.moveRow(jexcel.current.dragging.row, position, true);\r\n }\r\n jexcel.current.dragging.element.classList.remove('dragging');\r\n }\r\n jexcel.current.dragging = null;\r\n }\r\n } else {\r\n // Close any corner selection\r\n if (jexcel.current.selectedCorner) {\r\n jexcel.current.selectedCorner = false;\r\n \r\n // Data to be copied\r\n if (jexcel.current.selection.length > 0) {\r\n // Copy data\r\n jexcel.current.copyData(jexcel.current.selection[0], jexcel.current.selection[jexcel.current.selection.length - 1]);\r\n \r\n // Remove selection\r\n jexcel.current.removeCopySelection();\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Clear any time control\r\n if (jexcel.timeControl) {\r\n clearTimeout(jexcel.timeControl);\r\n jexcel.timeControl = null;\r\n }\r\n \r\n // Mouse up\r\n jexcel.isMouseAction = false;\r\n }\r\n \r\n // Mouse move controls\r\n jexcel.mouseMoveControls = function(e) {\r\n e = e || window.event;\r\n if (e.buttons) {\r\n var mouseButton = e.buttons;\r\n } else if (e.button) {\r\n var mouseButton = e.button;\r\n } else {\r\n var mouseButton = e.which;\r\n }\r\n \r\n if (! mouseButton) {\r\n jexcel.isMouseAction = false;\r\n }\r\n \r\n if (jexcel.current) {\r\n if (jexcel.isMouseAction == true) {\r\n // Resizing is ongoing\r\n if (jexcel.current.resizing) {\r\n if (jexcel.current.resizing.column) {\r\n var width = e.pageX - jexcel.current.resizing.mousePosition;\r\n \r\n if (jexcel.current.resizing.width + width > 0) {\r\n var tempWidth = jexcel.current.resizing.width + width;\r\n jexcel.current.colgroup[jexcel.current.resizing.column].setAttribute('width', tempWidth);\r\n \r\n jexcel.current.updateCornerPosition();\r\n }\r\n } else {\r\n var height = e.pageY - jexcel.current.resizing.mousePosition;\r\n \r\n if (jexcel.current.resizing.height + height > 0) {\r\n var tempHeight = jexcel.current.resizing.height + height;\r\n jexcel.current.rows[jexcel.current.resizing.row].setAttribute('height', tempHeight);\r\n \r\n jexcel.current.updateCornerPosition();\r\n }\r\n }\r\n }\r\n } else {\r\n var x = e.target.getAttribute('data-x');\r\n var y = e.target.getAttribute('data-y');\r\n var rect = e.target.getBoundingClientRect();\r\n \r\n if (jexcel.current.cursor) {\r\n jexcel.current.cursor.style.cursor = '';\r\n jexcel.current.cursor = null;\r\n }\r\n\r\n if (e.target.parentNode.parentNode && e.target.parentNode.parentNode.className) {\r\n if (e.target.parentNode.parentNode.classList.contains('resizable')) {\r\n if (e.target && x && ! y && (rect.width - (e.clientX - rect.left) < 6)) {\r\n jexcel.current.cursor = e.target;\r\n jexcel.current.cursor.style.cursor = 'col-resize';\r\n } else if (e.target && ! x && y && (rect.height - (e.clientY - rect.top) < 6)) {\r\n jexcel.current.cursor = e.target;\r\n jexcel.current.cursor.style.cursor = 'row-resize';\r\n }\r\n }\r\n \r\n if (e.target.parentNode.parentNode.classList.contains('draggable')) {\r\n if (e.target && ! x && y && (rect.width - (e.clientX - rect.left) < 6)) {\r\n jexcel.current.cursor = e.target;\r\n jexcel.current.cursor.style.cursor = 'move';\r\n } else if (e.target && x && ! y && (rect.height - (e.clientY - rect.top) < 6)) {\r\n jexcel.current.cursor = e.target;\r\n jexcel.current.cursor.style.cursor = 'move';\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n jexcel.mouseOverControls = function(e) {\r\n e = e || window.event;\r\n if (e.buttons) {\r\n var mouseButton = e.buttons;\r\n } else if (e.button) {\r\n var mouseButton = e.button;\r\n } else {\r\n var mouseButton = e.which;\r\n }\r\n \r\n if (! mouseButton) {\r\n jexcel.isMouseAction = false;\r\n }\r\n \r\n if (jexcel.current && jexcel.isMouseAction == true) {\r\n // Get elements\r\n var jexcelTable = jexcel.getElement(e.target);\r\n \r\n if (jexcelTable[0]) {\r\n // Avoid cross reference\r\n if (jexcel.current != jexcelTable[0].jexcel) {\r\n if (jexcel.current) {\r\n return false;\r\n }\r\n }\r\n \r\n var columnId = e.target.getAttribute('data-x');\r\n var rowId = e.target.getAttribute('data-y');\r\n \r\n if (jexcel.current.dragging) {\r\n if (jexcel.current.dragging.column) {\r\n if (columnId) {\r\n if (jexcel.current.isColMerged(columnId).length) {\r\n console.error('Jspreadsheet: This column is part of a merged cell.');\r\n } else {\r\n for (var i = 0; i < jexcel.current.headers.length; i++) {\r\n jexcel.current.headers[i].classList.remove('dragging-left');\r\n jexcel.current.headers[i].classList.remove('dragging-right');\r\n }\r\n \r\n if (jexcel.current.dragging.column == columnId) {\r\n jexcel.current.dragging.destination = parseInt(columnId);\r\n } else {\r\n if (e.target.clientWidth / 2 > e.offsetX) {\r\n if (jexcel.current.dragging.column < columnId) {\r\n jexcel.current.dragging.destination = parseInt(columnId) - 1;\r\n } else {\r\n jexcel.current.dragging.destination = parseInt(columnId);\r\n }\r\n jexcel.current.headers[columnId].classList.add('dragging-left');\r\n } else {\r\n if (jexcel.current.dragging.column < columnId) {\r\n jexcel.current.dragging.destination = parseInt(columnId);\r\n } else {\r\n jexcel.current.dragging.destination = parseInt(columnId) + 1;\r\n }\r\n jexcel.current.headers[columnId].classList.add('dragging-right');\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (rowId) {\r\n if (jexcel.current.isRowMerged(rowId).length) {\r\n console.error('Jspreadsheet: This row is part of a merged cell.');\r\n } else {\r\n var target = (e.target.clientHeight / 2 > e.offsetY) ? e.target.parentNode.nextSibling : e.target.parentNode;\r\n if (jexcel.current.dragging.element != target) {\r\n e.target.parentNode.parentNode.insertBefore(jexcel.current.dragging.element, target);\r\n jexcel.current.dragging.destination = Array.prototype.indexOf.call(jexcel.current.dragging.element.parentNode.children, jexcel.current.dragging.element);\r\n }\r\n }\r\n }\r\n }\r\n } else if (jexcel.current.resizing) {\r\n } else {\r\n // Header found\r\n if (jexcelTable[1] == 1) {\r\n if (jexcel.current.selectedHeader) {\r\n var columnId = e.target.getAttribute('data-x');\r\n var o = jexcel.current.selectedHeader;\r\n var d = columnId;\r\n // Update selection\r\n jexcel.current.updateSelectionFromCoords(o, 0, d, jexcel.current.options.data.length - 1);\r\n }\r\n }\r\n \r\n // Body found\r\n if (jexcelTable[1] == 2) {\r\n if (e.target.classList.contains('jexcel_row')) {\r\n if (jexcel.current.selectedRow) {\r\n var o = jexcel.current.selectedRow;\r\n var d = rowId;\r\n // Update selection\r\n jexcel.current.updateSelectionFromCoords(0, o, jexcel.current.options.data[0].length - 1, d);\r\n }\r\n } else {\r\n // Do not select edtion is in progress\r\n if (! jexcel.current.edition) {\r\n if (columnId && rowId) {\r\n if (jexcel.current.selectedCorner) {\r\n jexcel.current.updateCopySelection(columnId, rowId);\r\n } else {\r\n if (jexcel.current.selectedCell) {\r\n jexcel.current.updateSelectionFromCoords(jexcel.current.selectedCell[0], jexcel.current.selectedCell[1], columnId, rowId);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Clear any time control\r\n if (jexcel.timeControl) {\r\n clearTimeout(jexcel.timeControl);\r\n jexcel.timeControl = null;\r\n }\r\n }\r\n \r\n /**\r\n * Double click event handler: controls the double click in the corner, cell edition or column re-ordering.\r\n */\r\n jexcel.doubleClickControls = function(e) {\r\n // Jexcel is selected\r\n if (jexcel.current) {\r\n // Corner action\r\n if (e.target.classList.contains('jexcel_corner')) {\r\n // Any selected cells\r\n if (jexcel.current.highlighted.length > 0) {\r\n // Copy from this\r\n var x1 = jexcel.current.highlighted[0].getAttribute('data-x');\r\n var y1 = parseInt(jexcel.current.highlighted[jexcel.current.highlighted.length - 1].getAttribute('data-y')) + 1;\r\n // Until this\r\n var x2 = jexcel.current.highlighted[jexcel.current.highlighted.length - 1].getAttribute('data-x');\r\n var y2 = jexcel.current.records.length - 1\r\n // Execute copy\r\n jexcel.current.copyData(jexcel.current.records[y1][x1], jexcel.current.records[y2][x2]);\r\n }\r\n } else if (e.target.classList.contains('jexcel_column_filter')) {\r\n // Column\r\n var columnId = e.target.getAttribute('data-x');\r\n // Open filter\r\n jexcel.current.openFilter(columnId);\r\n \r\n } else {\r\n // Get table\r\n var jexcelTable = jexcel.getElement(e.target);\r\n \r\n // Double click over header\r\n if (jexcelTable[1] == 1 && jexcel.current.options.columnSorting == true) {\r\n // Check valid column header coords\r\n var columnId = e.target.getAttribute('data-x');\r\n if (columnId) {\r\n jexcel.current.orderBy(columnId);\r\n }\r\n }\r\n \r\n // Double click over body\r\n if (jexcelTable[1] == 2 && jexcel.current.options.editable == true) {\r\n if (! jexcel.current.edition) {\r\n var getCellCoords = function(element) {\r\n if (element.parentNode) {\r\n var x = element.getAttribute('data-x');\r\n var y = element.getAttribute('data-y');\r\n if (x && y) {\r\n return element;\r\n } else {\r\n return getCellCoords(element.parentNode);\r\n }\r\n }\r\n }\r\n var cell = getCellCoords(e.target);\r\n if (cell && cell.classList.contains('highlight')) {\r\n jexcel.current.openEditor(cell);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n jexcel.copyControls = function(e) {\r\n if (jexcel.current && jexcel.copyControls.enabled) {\r\n if (! jexcel.current.edition) {\r\n jexcel.current.copy(true);\r\n }\r\n }\r\n }\r\n \r\n jexcel.cutControls = function(e) {\r\n if (jexcel.current) {\r\n if (! jexcel.current.edition) {\r\n jexcel.current.copy(true);\r\n if (jexcel.current.options.editable == true) {\r\n jexcel.current.setValue(jexcel.current.highlighted, '');\r\n }\r\n }\r\n }\r\n }\r\n \r\n jexcel.pasteControls = function(e) {\r\n if (jexcel.current && jexcel.current.selectedCell) {\r\n if (! jexcel.current.edition) {\r\n if (jexcel.current.options.editable == true) {\r\n if (e && e.clipboardData) {\r\n jexcel.current.paste(jexcel.current.selectedCell[0], jexcel.current.selectedCell[1], e.clipboardData.getData('text'));\r\n e.preventDefault();\r\n } else if (window.clipboardData) {\r\n jexcel.current.paste(jexcel.current.selectedCell[0], jexcel.current.selectedCell[1], window.clipboardData.getData('text'));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n jexcel.contextMenuControls = function(e) {\r\n e = e || window.event;\r\n if (\"buttons\" in e) {\r\n var mouseButton = e.buttons;\r\n } else {\r\n var mouseButton = e.which || e.button;\r\n }\r\n \r\n if (jexcel.current) {\r\n if (jexcel.current.edition) {\r\n e.preventDefault();\r\n } else if (jexcel.current.options.contextMenu) {\r\n jexcel.current.contextMenu.contextmenu.close();\r\n \r\n if (jexcel.current) {\r\n var x = e.target.getAttribute('data-x');\r\n var y = e.target.getAttribute('data-y');\r\n \r\n if (x || y) {\r\n if ((x < parseInt(jexcel.current.selectedCell[0])) || (x > parseInt(jexcel.current.selectedCell[2])) ||\r\n (y < parseInt(jexcel.current.selectedCell[1])) || (y > parseInt(jexcel.current.selectedCell[3])))\r\n {\r\n jexcel.current.updateSelectionFromCoords(x, y, x, y);\r\n }\r\n\r\n // Table found\r\n var items = jexcel.current.options.contextMenu(jexcel.current, x, y, e);\r\n // The id is depending on header and body\r\n jexcel.current.contextMenu.contextmenu.open(e, items);\r\n // Avoid the real one\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n jexcel.touchStartControls = function(e) {\r\n var jexcelTable = jexcel.getElement(e.target);\r\n \r\n if (jexcelTable[0]) {\r\n if (jexcel.current != jexcelTable[0].jexcel) {\r\n if (jexcel.current) {\r\n jexcel.current.resetSelection();\r\n }\r\n jexcel.current = jexcelTable[0].jexcel;\r\n }\r\n } else {\r\n if (jexcel.current) {\r\n jexcel.current.resetSelection();\r\n jexcel.current = null;\r\n }\r\n }\r\n \r\n if (jexcel.current) {\r\n if (! jexcel.current.edition) {\r\n var columnId = e.target.getAttribute('data-x');\r\n var rowId = e.target.getAttribute('data-y');\r\n \r\n if (columnId && rowId) {\r\n jexcel.current.updateSelectionFromCoords(columnId, rowId);\r\n \r\n jexcel.timeControl = setTimeout(function() {\r\n // Keep temporary reference to the element\r\n if (jexcel.current.options.columns[columnId].type == 'color') {\r\n jexcel.tmpElement = null;\r\n } else {\r\n jexcel.tmpElement = e.target;\r\n }\r\n jexcel.current.openEditor(e.target, false, e);\r\n }, 500);\r\n }\r\n }\r\n }\r\n }\r\n \r\n jexcel.touchEndControls = function(e) {\r\n // Clear any time control\r\n if (jexcel.timeControl) {\r\n clearTimeout(jexcel.timeControl);\r\n jexcel.timeControl = null;\r\n // Element\r\n if (jexcel.tmpElement && jexcel.tmpElement.children[0].tagName == 'INPUT') {\r\n jexcel.tmpElement.children[0].focus();\r\n }\r\n jexcel.tmpElement = null;\r\n }\r\n }\r\n \r\n /**\r\n * Jexcel extensions\r\n */\r\n \r\n jexcel.tabs = function(tabs, result) {\r\n var instances = [];\r\n // Create tab container\r\n if (! tabs.classList.contains('jexcel_tabs')) {\r\n tabs.innerHTML = '';\r\n tabs.classList.add('jexcel_tabs')\r\n tabs.jexcel = [];\r\n\r\n var div = document.createElement('div');\r\n var headers = tabs.appendChild(div);\r\n var div = document.createElement('div');\r\n var content = tabs.appendChild(div);\r\n } else {\r\n var headers = tabs.children[0];\r\n var content = tabs.children[1];\r\n }\r\n\r\n var spreadsheet = []\r\n var link = [];\r\n for (var i = 0; i < result.length; i++) {\r\n // Spreadsheet container\r\n spreadsheet[i] = document.createElement('div');\r\n spreadsheet[i].classList.add('jexcel_tab');\r\n var worksheet = jexcel(spreadsheet[i], result[i]);\r\n content.appendChild(spreadsheet[i]);\r\n instances[i] = tabs.jexcel.push(worksheet);\r\n\r\n // Tab link\r\n link[i] = document.createElement('div');\r\n link[i].classList.add('jexcel_tab_link');\r\n link[i].setAttribute('data-spreadsheet', tabs.jexcel.length-1);\r\n link[i].innerHTML = result[i].sheetName;\r\n link[i].onclick = function() {\r\n for (var j = 0; j < headers.children.length; j++) {\r\n headers.children[j].classList.remove('selected');\r\n content.children[j].style.display = 'none';\r\n }\r\n var i = this.getAttribute('data-spreadsheet');\r\n content.children[i].style.display = 'block';\r\n headers.children[i].classList.add('selected')\r\n }\r\n headers.appendChild(link[i]);\r\n }\r\n\r\n // First tab\r\n for (var j = 0; j < headers.children.length; j++) {\r\n headers.children[j].classList.remove('selected');\r\n content.children[j].style.display = 'none';\r\n }\r\n headers.children[headers.children.length - 1].classList.add('selected');\r\n content.children[headers.children.length - 1].style.display = 'block';\r\n\r\n return instances;\r\n }\r\n\r\n // Compability to older versions\r\n jexcel.createTabs = jexcel.tabs;\r\n\r\n jexcel.fromSpreadsheet = function(file, __callback) {\r\n var convert = function(workbook) {\r\n var spreadsheets = [];\r\n workbook.SheetNames.forEach(function(sheetName) {\r\n var spreadsheet = {};\r\n spreadsheet.rows = [];\r\n spreadsheet.columns = [];\r\n spreadsheet.data = [];\r\n spreadsheet.style = {};\r\n spreadsheet.sheetName = sheetName;\r\n \r\n // Column widths\r\n var temp = workbook.Sheets[sheetName]['!cols'];\r\n if (temp && temp.length) {\r\n for (var i = 0; i < temp.length; i++) {\r\n spreadsheet.columns[i] = {};\r\n if (temp[i] && temp[i].wpx) {\r\n spreadsheet.columns[i].width = temp[i].wpx + 'px';\r\n }\r\n }\r\n }\r\n // Rows heights\r\n var temp = workbook.Sheets[sheetName]['!rows'];\r\n if (temp && temp.length) {\r\n for (var i = 0; i < temp.length; i++) {\r\n if (temp[i] && temp[i].hpx) {\r\n spreadsheet.rows[i] = {};\r\n spreadsheet.rows[i].height = temp[i].hpx + 'px';\r\n }\r\n }\r\n }\r\n // Merge cells\r\n var temp = workbook.Sheets[sheetName]['!merges'];\r\n if (temp && temp.length > 0) {\r\n spreadsheet.mergeCells = [];\r\n for (var i = 0; i < temp.length; i++) {\r\n var x1 = temp[i].s.c;\r\n var y1 = temp[i].s.r;\r\n var x2 = temp[i].e.c;\r\n var y2 = temp[i].e.r;\r\n var key = jexcel.getColumnNameFromId([x1,y1]);\r\n spreadsheet.mergeCells[key] = [ x2-x1+1, y2-y1+1 ];\r\n }\r\n }\r\n // Data container\r\n var max_x = 0;\r\n var max_y = 0;\r\n var temp = Object.keys(workbook.Sheets[sheetName]);\r\n for (var i = 0; i < temp.length; i++) {\r\n if (temp[i].substr(0,1) != '!') {\r\n var cell = workbook.Sheets[sheetName][temp[i]];\r\n var info = jexcel.getIdFromColumnName(temp[i], true);\r\n if (! spreadsheet.data[info[1]]) {\r\n spreadsheet.data[info[1]] = [];\r\n }\r\n spreadsheet.data[info[1]][info[0]] = cell.f ? '=' + cell.f : cell.w;\r\n if (max_x < info[0]) {\r\n max_x = info[0];\r\n }\r\n if (max_y < info[1]) {\r\n max_y = info[1];\r\n }\r\n // Style\r\n if (cell.style && Object.keys(cell.style).length > 0) {\r\n spreadsheet.style[temp[i]] = cell.style;\r\n }\r\n if (cell.s && cell.s.fgColor) {\r\n if (spreadsheet.style[temp[i]]) {\r\n spreadsheet.style[temp[i]] += ';';\r\n }\r\n spreadsheet.style[temp[i]] += 'background-color:#' + cell.s.fgColor.rgb;\r\n }\r\n }\r\n }\r\n var numColumns = spreadsheet.columns;\r\n for (var j = 0; j <= max_y; j++) {\r\n for (var i = 0; i <= max_x; i++) {\r\n if (! spreadsheet.data[j]) {\r\n spreadsheet.data[j] = [];\r\n }\r\n if (! spreadsheet.data[j][i]) {\r\n if (numColumns < i) {\r\n spreadsheet.data[j][i] = '';\r\n }\r\n }\r\n }\r\n }\r\n spreadsheets.push(spreadsheet);\r\n });\r\n \r\n return spreadsheets;\r\n }\r\n \r\n var oReq;\r\n oReq = new XMLHttpRequest();\r\n oReq.open(\"GET\", file, true);\r\n \r\n if(typeof Uint8Array !== 'undefined') {\r\n oReq.responseType = \"arraybuffer\";\r\n oReq.onload = function(e) {\r\n var arraybuffer = oReq.response;\r\n var data = new Uint8Array(arraybuffer);\r\n var wb = XLSX.read(data, {type:\"array\", cellFormula:true, cellStyles:true });\r\n __callback(convert(wb))\r\n };\r\n } else {\r\n oReq.setRequestHeader(\"Accept-Charset\", \"x-user-defined\"); \r\n oReq.onreadystatechange = function() { if(oReq.readyState == 4 && oReq.status == 200) {\r\n var ff = convertResponseBodyToText(oReq.responseBody);\r\n var wb = XLSX.read(ff, {type:\"binary\", cellFormula:true, cellStyles:true });\r\n __callback(convert(wb))\r\n }};\r\n }\r\n \r\n oReq.send();\r\n }\r\n \r\n /**\r\n * Valid international letter\r\n */\r\n \r\n jexcel.validLetter = function (text) {\r\n var regex = /([\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC-\\u0400-\\u04FF']+)/g;\r\n return text.match(regex) ? 1 : 0;\r\n }\r\n \r\n /**\r\n * Helper injectArray\r\n */\r\n jexcel.injectArray = function(o, idx, arr) {\r\n return o.slice(0, idx).concat(arr).concat(o.slice(idx));\r\n }\r\n \r\n /**\r\n * Get letter based on a number\r\n * \r\n * @param integer i\r\n * @return string letter\r\n */\r\n jexcel.getColumnName = function(i) {\r\n var letter = '';\r\n if (i > 701) {\r\n letter += String.fromCharCode(64 + parseInt(i / 676));\r\n letter += String.fromCharCode(64 + parseInt((i % 676) / 26));\r\n } else if (i > 25) {\r\n letter += String.fromCharCode(64 + parseInt(i / 26));\r\n }\r\n letter += String.fromCharCode(65 + (i % 26));\r\n \r\n return letter;\r\n }\r\n \r\n /**\r\n * Convert excel like column to jexcel id\r\n * \r\n * @param string id\r\n * @return string id\r\n */\r\n jexcel.getIdFromColumnName = function (id, arr) {\r\n // Get the letters\r\n var t = /^[a-zA-Z]+/.exec(id);\r\n \r\n if (t) {\r\n // Base 26 calculation\r\n var code = 0;\r\n for (var i = 0; i < t[0].length; i++) {\r\n code += parseInt(t[0].charCodeAt(i) - 64) * Math.pow(26, (t[0].length - 1 - i));\r\n }\r\n code--;\r\n // Make sure jexcel starts on zero\r\n if (code < 0) {\r\n code = 0;\r\n }\r\n \r\n // Number\r\n var number = parseInt(/[0-9]+$/.exec(id));\r\n if (number > 0) {\r\n number--;\r\n }\r\n \r\n if (arr == true) {\r\n id = [ code, number ];\r\n } else {\r\n id = code + '-' + number;\r\n }\r\n }\r\n \r\n return id;\r\n }\r\n \r\n /**\r\n * Convert jexcel id to excel like column name\r\n * \r\n * @param string id\r\n * @return string id\r\n */\r\n jexcel.getColumnNameFromId = function (cellId) {\r\n if (! Array.isArray(cellId)) {\r\n cellId = cellId.split('-');\r\n }\r\n \r\n return jexcel.getColumnName(parseInt(cellId[0])) + (parseInt(cellId[1]) + 1);\r\n }\r\n \r\n /**\r\n * Verify element inside jexcel table\r\n * \r\n * @param string id\r\n * @return string id\r\n */\r\n jexcel.getElement = function(element) {\r\n var jexcelSection = 0;\r\n var jexcelElement = 0;\r\n \r\n function path (element) {\r\n if (element.className) {\r\n if (element.classList.contains('jexcel_container')) {\r\n jexcelElement = element;\r\n }\r\n }\r\n \r\n if (element.tagName == 'THEAD') {\r\n jexcelSection = 1;\r\n } else if (element.tagName == 'TBODY') {\r\n jexcelSection = 2;\r\n }\r\n \r\n if (element.parentNode) {\r\n if (! jexcelElement) {\r\n path(element.parentNode);\r\n }\r\n }\r\n }\r\n \r\n path(element);\r\n \r\n return [ jexcelElement, jexcelSection ];\r\n }\r\n\r\n jexcel.doubleDigitFormat = function(v) {\r\n v = ''+v;\r\n if (v.length == 1) {\r\n v = '0'+v;\r\n }\r\n return v;\r\n }\r\n\r\n jexcel.createFromTable = function(el, options) {\r\n if (el.tagName != 'TABLE') {\r\n console.log('Element is not a table');\r\n } else {\r\n // Configuration\r\n if (! options) {\r\n options = {};\r\n }\r\n options.columns = [];\r\n options.data = [];\r\n\r\n // Colgroup\r\n var colgroup = el.querySelectorAll('colgroup > col');\r\n if (colgroup.length) {\r\n // Get column width\r\n for (var i = 0; i < colgroup.length; i++) {\r\n var width = colgroup[i].style.width;\r\n if (! width) {\r\n var width = colgroup[i].getAttribute('width');\r\n }\r\n // Set column width\r\n if (width) {\r\n if (! options.columns[i]) {\r\n options.columns[i] = {}\r\n }\r\n options.columns[i].width = width;\r\n }\r\n }\r\n }\r\n\r\n // Parse header\r\n var parseHeader = function(header) {\r\n // Get width information\r\n var info = header.getBoundingClientRect();\r\n var width = info.width > 50 ? info.width : 50;\r\n\r\n // Create column option\r\n if (! options.columns[i]) {\r\n options.columns[i] = {};\r\n } \r\n if (header.getAttribute('data-celltype')) {\r\n options.columns[i].type = header.getAttribute('data-celltype');\r\n } else {\r\n options.columns[i].type = 'text';\r\n }\r\n options.columns[i].width = width + 'px';\r\n options.columns[i].title = header.innerHTML;\r\n options.columns[i].align = header.style.textAlign || 'center';\r\n\r\n if (info = header.getAttribute('name')) {\r\n options.columns[i].name = info;\r\n }\r\n if (info = header.getAttribute('id')) {\r\n options.columns[i].id = info;\r\n }\r\n }\r\n\r\n // Headers\r\n var nested = [];\r\n var headers = el.querySelectorAll(':scope > thead > tr');\r\n if (headers.length) {\r\n for (var j = 0; j < headers.length - 1; j++) {\r\n var cells = [];\r\n for (var i = 0; i < headers[j].children.length; i++) {\r\n var row = {\r\n title: headers[j].children[i].innerText,\r\n colspan: headers[j].children[i].getAttribute('colspan') || 1,\r\n };\r\n cells.push(row);\r\n }\r\n nested.push(cells);\r\n }\r\n // Get the last row in the thead\r\n headers = headers[headers.length-1].children;\r\n // Go though the headers\r\n for (var i = 0; i < headers.length; i++) {\r\n parseHeader(headers[i]);\r\n }\r\n }\r\n\r\n // Content\r\n var rowNumber = 0;\r\n var mergeCells = {};\r\n var rows = {};\r\n var style = {};\r\n var classes = {};\r\n\r\n var content = el.querySelectorAll(':scope > tr, :scope > tbody > tr');\r\n for (var j = 0; j < content.length; j++) {\r\n options.data[rowNumber] = [];\r\n if (options.parseTableFirstRowAsHeader == true && ! headers.length && j == 0) {\r\n for (var i = 0; i < content[j].children.length; i++) {\r\n parseHeader(content[j].children[i]);\r\n }\r\n } else {\r\n for (var i = 0; i < content[j].children.length; i++) {\r\n // WickedGrid formula compatibility\r\n var value = content[j].children[i].getAttribute('data-formula');\r\n if (value) {\r\n if (value.substr(0,1) != '=') {\r\n value = '=' + value;\r\n }\r\n } else {\r\n var value = content[j].children[i].innerHTML;\r\n }\r\n options.data[rowNumber].push(value);\r\n\r\n // Key\r\n var cellName = jexcel.getColumnNameFromId([ i, j ]);\r\n\r\n // Classes\r\n var tmp = content[j].children[i].getAttribute('class');\r\n if (tmp) {\r\n classes[cellName] = tmp;\r\n }\r\n\r\n // Merged cells\r\n var mergedColspan = parseInt(content[j].children[i].getAttribute('colspan')) || 0;\r\n var mergedRowspan = parseInt(content[j].children[i].getAttribute('rowspan')) || 0;\r\n if (mergedColspan || mergedRowspan) {\r\n mergeCells[cellName] = [ mergedColspan || 1, mergedRowspan || 1 ];\r\n }\r\n\r\n // Avoid problems with hidden cells\r\n if (s = content[j].children[i].style && content[j].children[i].style.display == 'none') {\r\n content[j].children[i].style.display = '';\r\n }\r\n // Get style\r\n var s = content[j].children[i].getAttribute('style');\r\n if (s) {\r\n style[cellName] = s;\r\n }\r\n // Bold\r\n if (content[j].children[i].classList.contains('styleBold')) {\r\n if (style[cellName]) {\r\n style[cellName] += '; font-weight:bold;';\r\n } else {\r\n style[cellName] = 'font-weight:bold;';\r\n }\r\n }\r\n }\r\n\r\n // Row Height\r\n if (content[j].style && content[j].style.height) {\r\n rows[j] = { height: content[j].style.height };\r\n }\r\n\r\n // Index\r\n rowNumber++;\r\n }\r\n }\r\n\r\n // Nested\r\n if (Object.keys(nested).length > 0) {\r\n options.nestedHeaders = nested;\r\n }\r\n // Style\r\n if (Object.keys(style).length > 0) {\r\n options.style = style;\r\n }\r\n // Merged\r\n if (Object.keys(mergeCells).length > 0) {\r\n options.mergeCells = mergeCells;\r\n }\r\n // Row height\r\n if (Object.keys(rows).length > 0) {\r\n options.rows = rows;\r\n }\r\n // Classes\r\n if (Object.keys(classes).length > 0) {\r\n options.classes = classes;\r\n }\r\n\r\n var content = el.querySelectorAll('tfoot tr');\r\n if (content.length) {\r\n var footers = [];\r\n for (var j = 0; j < content.length; j++) {\r\n var footer = [];\r\n for (var i = 0; i < content[j].children.length; i++) {\r\n footer.push(content[j].children[i].innerText);\r\n }\r\n footers.push(footer);\r\n }\r\n if (Object.keys(footers).length > 0) {\r\n options.footers = footers;\r\n }\r\n }\r\n // TODO: data-hiddencolumns=\"3,4\"\r\n \r\n // I guess in terms the better column type\r\n if (options.parseTableAutoCellType == true) {\r\n var pattern = [];\r\n for (var i = 0; i < options.columns.length; i++) {\r\n var test = true;\r\n var testCalendar = true;\r\n pattern[i] = [];\r\n for (var j = 0; j < options.data.length; j++) {\r\n var value = options.data[j][i];\r\n if (! pattern[i][value]) {\r\n pattern[i][value] = 0;\r\n }\r\n pattern[i][value]++;\r\n if (value.length > 25) {\r\n test = false;\r\n }\r\n if (value.length == 10) {\r\n if (! (value.substr(4,1) == '-' && value.substr(7,1) == '-')) {\r\n testCalendar = false;\r\n }\r\n } else {\r\n testCalendar = false;\r\n }\r\n }\r\n\r\n var keys = Object.keys(pattern[i]).length;\r\n if (testCalendar) {\r\n options.columns[i].type = 'calendar';\r\n } else if (test == true && keys > 1 && keys <= parseInt(options.data.length * 0.1)) {\r\n options.columns[i].type = 'dropdown';\r\n options.columns[i].source = Object.keys(pattern[i]);\r\n }\r\n }\r\n }\r\n\r\n return options;\r\n }\r\n }\r\n\r\n /**\r\n * Jquery Support\r\n */\r\n if (typeof(jQuery) != 'undefined') {\r\n (function($){\r\n $.fn.jspreadsheet = $.fn.jexcel = function(mixed) {\r\n var spreadsheetContainer = $(this).get(0);\r\n if (! spreadsheetContainer.jexcel) {\r\n return jexcel($(this).get(0), arguments[0]);\r\n } else {\r\n if (Array.isArray(spreadsheetContainer.jexcel)) {\r\n return spreadsheetContainer.jexcel[mixed][arguments[1]].apply(this, Array.prototype.slice.call( arguments, 2 ));\r\n } else {\r\n return spreadsheetContainer.jexcel[mixed].apply(this, Array.prototype.slice.call( arguments, 1 ));\r\n }\r\n }\r\n };\r\n \r\n })(jQuery);\r\n }\r\n \r\n \r\n // Based on sutoiku work (https://github.com/sutoiku)\r\n \r\n var error = (function() {\r\n var exports = {};\r\n \r\n exports.nil = new Error('#NULL!');\r\n exports.div0 = new Error('#DIV/0!');\r\n exports.value = new Error('#VALUE!');\r\n exports.ref = new Error('#REF!');\r\n exports.name = new Error('#NAME?');\r\n exports.num = new Error('#NUM!');\r\n exports.na = new Error('#N/A');\r\n exports.error = new Error('#ERROR!');\r\n exports.data = new Error('#GETTING_DATA');\r\n \r\n return exports;\r\n })();\r\n \r\n var utils = (function() {\r\n var exports = {};\r\n \r\n exports.flattenShallow = function(array) {\r\n if (!array || !array.reduce) {\r\n return array;\r\n }\r\n \r\n return array.reduce(function(a, b) {\r\n var aIsArray = Array.isArray(a);\r\n var bIsArray = Array.isArray(b);\r\n \r\n if (aIsArray && bIsArray) {\r\n return a.concat(b);\r\n }\r\n if (aIsArray) {\r\n a.push(b);\r\n \r\n return a;\r\n }\r\n if (bIsArray) {\r\n return [ a ].concat(b);\r\n }\r\n \r\n return [ a, b ];\r\n });\r\n };\r\n \r\n exports.isFlat = function(array) {\r\n if (!array) {\r\n return false;\r\n }\r\n \r\n for (var i = 0; i < array.length; ++i) {\r\n if (Array.isArray(array[i])) {\r\n return false;\r\n }\r\n }\r\n \r\n return true;\r\n };\r\n \r\n exports.flatten = function() {\r\n var result = exports.argsToArray.apply(null, arguments);\r\n \r\n while (!exports.isFlat(result)) {\r\n result = exports.flattenShallow(result);\r\n }\r\n \r\n return result;\r\n };\r\n \r\n exports.argsToArray = function(args) {\r\n var result = [];\r\n \r\n exports.arrayEach(args, function(value) {\r\n result.push(value);\r\n });\r\n \r\n return result;\r\n };\r\n \r\n exports.numbers = function() {\r\n var possibleNumbers = this.flatten.apply(null, arguments);\r\n return possibleNumbers.filter(function(el) {\r\n return typeof el === 'number';\r\n });\r\n };\r\n \r\n exports.cleanFloat = function(number) {\r\n var power = 1e14;\r\n return Math.round(number * power) / power;\r\n };\r\n \r\n exports.parseBool = function(bool) {\r\n if (typeof bool === 'boolean') {\r\n return bool;\r\n }\r\n \r\n if (bool instanceof Error) {\r\n return bool;\r\n }\r\n \r\n if (typeof bool === 'number') {\r\n return bool !== 0;\r\n }\r\n \r\n if (typeof bool === 'string') {\r\n var up = bool.toUpperCase();\r\n if (up === 'TRUE') {\r\n return true;\r\n }\r\n \r\n if (up === 'FALSE') {\r\n return false;\r\n }\r\n }\r\n \r\n if (bool instanceof Date && !isNaN(bool)) {\r\n return true;\r\n }\r\n \r\n return error.value;\r\n };\r\n \r\n exports.parseNumber = function(string) {\r\n if (string === undefined || string === '') {\r\n return error.value;\r\n }\r\n if (!isNaN(string)) {\r\n return parseFloat(string);\r\n }\r\n \r\n return error.value;\r\n };\r\n \r\n exports.parseNumberArray = function(arr) {\r\n var len;\r\n \r\n if (!arr || (len = arr.length) === 0) {\r\n return error.value;\r\n }\r\n \r\n var parsed;\r\n \r\n while (len--) {\r\n parsed = exports.parseNumber(arr[len]);\r\n if (parsed === error.value) {\r\n return parsed;\r\n }\r\n arr[len] = parsed;\r\n }\r\n \r\n return arr;\r\n };\r\n \r\n exports.parseMatrix = function(matrix) {\r\n var n;\r\n \r\n if (!matrix || (n = matrix.length) === 0) {\r\n return error.value;\r\n }\r\n var pnarr;\r\n \r\n for (var i = 0; i < matrix.length; i++) {\r\n pnarr = exports.parseNumberArray(matrix[i]);\r\n matrix[i] = pnarr;\r\n \r\n if (pnarr instanceof Error) {\r\n return pnarr;\r\n }\r\n }\r\n \r\n return matrix;\r\n };\r\n \r\n var d1900 = new Date(Date.UTC(1900, 0, 1));\r\n exports.parseDate = function(date) {\r\n if (!isNaN(date)) {\r\n if (date instanceof Date) {\r\n return new Date(date);\r\n }\r\n var d = parseInt(date, 10);\r\n if (d < 0) {\r\n return error.num;\r\n }\r\n if (d <= 60) {\r\n return new Date(d1900.getTime() + (d - 1) * 86400000);\r\n }\r\n return new Date(d1900.getTime() + (d - 2) * 86400000);\r\n }\r\n if (typeof date === 'string') {\r\n date = new Date(date);\r\n if (!isNaN(date)) {\r\n return date;\r\n }\r\n }\r\n return error.value;\r\n };\r\n \r\n exports.parseDateArray = function(arr) {\r\n var len = arr.length;\r\n var parsed;\r\n while (len--) {\r\n parsed = this.parseDate(arr[len]);\r\n if (parsed === error.value) {\r\n return parsed;\r\n }\r\n arr[len] = parsed;\r\n }\r\n return arr;\r\n };\r\n \r\n exports.anyIsError = function() {\r\n var n = arguments.length;\r\n while (n--) {\r\n if (arguments[n] instanceof Error) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n \r\n exports.arrayValuesToNumbers = function(arr) {\r\n var n = arr.length;\r\n var el;\r\n while (n--) {\r\n el = arr[n];\r\n if (typeof el === 'number') {\r\n continue;\r\n }\r\n if (el === true) {\r\n arr[n] = 1;\r\n continue;\r\n }\r\n if (el === false) {\r\n arr[n] = 0;\r\n continue;\r\n }\r\n if (typeof el === 'string') {\r\n var number = this.parseNumber(el);\r\n if (number instanceof Error) {\r\n arr[n] = 0;\r\n } else {\r\n arr[n] = number;\r\n }\r\n }\r\n }\r\n return arr;\r\n };\r\n \r\n exports.rest = function(array, idx) {\r\n idx = idx || 1;\r\n if (!array || typeof array.slice !== 'function') {\r\n return array;\r\n }\r\n return array.slice(idx);\r\n };\r\n \r\n exports.initial = function(array, idx) {\r\n idx = idx || 1;\r\n if (!array || typeof array.slice !== 'function') {\r\n return array;\r\n }\r\n return array.slice(0, array.length - idx);\r\n };\r\n \r\n exports.arrayEach = function(array, iteratee) {\r\n var index = -1, length = array.length;\r\n \r\n while (++index < length) {\r\n if (iteratee(array[index], index, array) === false) {\r\n break;\r\n }\r\n }\r\n \r\n return array;\r\n };\r\n \r\n exports.transpose = function(matrix) {\r\n if (!matrix) {\r\n return error.value;\r\n }\r\n \r\n return matrix[0].map(function(col, i) {\r\n return matrix.map(function(row) {\r\n return row[i];\r\n });\r\n });\r\n };\r\n \r\n return exports;\r\n })();\r\n \r\n jexcel.methods = {};\r\n \r\n jexcel.methods.datetime = (function() {\r\n var exports = {};\r\n \r\n var d1900 = new Date(1900, 0, 1);\r\n var WEEK_STARTS = [\r\n undefined,\r\n 0,\r\n 1,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n 1,\r\n 2,\r\n 3,\r\n 4,\r\n 5,\r\n 6,\r\n 0\r\n ];\r\n var WEEK_TYPES = [\r\n [],\r\n [1, 2, 3, 4, 5, 6, 7],\r\n [7, 1, 2, 3, 4, 5, 6],\r\n [6, 0, 1, 2, 3, 4, 5],\r\n [],\r\n [],\r\n [],\r\n [],\r\n [],\r\n [],\r\n [],\r\n [7, 1, 2, 3, 4, 5, 6],\r\n [6, 7, 1, 2, 3, 4, 5],\r\n [5, 6, 7, 1, 2, 3, 4],\r\n [4, 5, 6, 7, 1, 2, 3],\r\n [3, 4, 5, 6, 7, 1, 2],\r\n [2, 3, 4, 5, 6, 7, 1],\r\n [1, 2, 3, 4, 5, 6, 7]\r\n ];\r\n var WEEKEND_TYPES = [\r\n [],\r\n [6, 0],\r\n [0, 1],\r\n [1, 2],\r\n [2, 3],\r\n [3, 4],\r\n [4, 5],\r\n [5, 6],\r\n undefined,\r\n undefined,\r\n undefined, [0, 0],\r\n [1, 1],\r\n [2, 2],\r\n [3, 3],\r\n [4, 4],\r\n [5, 5],\r\n [6, 6]\r\n ];\r\n \r\n exports.DATE = function(year, month, day) {\r\n year = utils.parseNumber(year);\r\n month = utils.parseNumber(month);\r\n day = utils.parseNumber(day);\r\n if (utils.anyIsError(year, month, day)) {\r\n return error.value;\r\n }\r\n if (year < 0 || month < 0 || day < 0) {\r\n return error.num;\r\n }\r\n var date = new Date(year, month - 1, day);\r\n return date;\r\n };\r\n \r\n exports.DATEVALUE = function(date_text) {\r\n if (typeof date_text !== 'string') {\r\n return error.value;\r\n }\r\n var date = Date.parse(date_text);\r\n if (isNaN(date)) {\r\n return error.value;\r\n }\r\n if (date <= -2203891200000) {\r\n return (date - d1900) / 86400000 + 1;\r\n }\r\n return (date - d1900) / 86400000 + 2;\r\n };\r\n \r\n exports.DAY = function(serial_number) {\r\n var date = utils.parseDate(serial_number);\r\n if (date instanceof Error) {\r\n return date;\r\n }\r\n return date.getDate();\r\n };\r\n \r\n exports.DAYS = function(end_date, start_date) {\r\n end_date = utils.parseDate(end_date);\r\n start_date = utils.parseDate(start_date);\r\n if (end_date instanceof Error) {\r\n return end_date;\r\n }\r\n if (start_date instanceof Error) {\r\n return start_date;\r\n }\r\n return serial(end_date) - serial(start_date);\r\n };\r\n \r\n exports.DAYS360 = function(start_date, end_date, method) {\r\n };\r\n \r\n exports.EDATE = function(start_date, months) {\r\n start_date = utils.parseDate(start_date);\r\n if (start_date instanceof Error) {\r\n return start_date;\r\n }\r\n if (isNaN(months)) {\r\n return error.value;\r\n }\r\n months = parseInt(months, 10);\r\n start_date.setMonth(start_date.getMonth() + months);\r\n return serial(start_date);\r\n };\r\n \r\n exports.EOMONTH = function(start_date, months) {\r\n start_date = utils.parseDate(start_date);\r\n if (start_date instanceof Error) {\r\n return start_date;\r\n }\r\n if (isNaN(months)) {\r\n return error.value;\r\n }\r\n months = parseInt(months, 10);\r\n return serial(new Date(start_date.getFullYear(), start_date.getMonth() + months + 1, 0));\r\n };\r\n \r\n exports.HOUR = function(serial_number) {\r\n serial_number = utils.parseDate(serial_number);\r\n if (serial_number instanceof Error) {\r\n return serial_number;\r\n }\r\n return serial_number.getHours();\r\n };\r\n \r\n exports.INTERVAL = function(second) {\r\n if (typeof second !== 'number' && typeof second !== 'string') {\r\n return error.value;\r\n } else {\r\n second = parseInt(second, 10);\r\n }\r\n \r\n var year = Math.floor(second/946080000);\r\n second = second%946080000;\r\n var month = Math.floor(second/2592000);\r\n second = second%2592000;\r\n var day = Math.floor(second/86400);\r\n second = second%86400;\r\n \r\n var hour = Math.floor(second/3600);\r\n second = second%3600;\r\n var min = Math.floor(second/60);\r\n second = second%60;\r\n var sec = second;\r\n \r\n year = (year > 0) ? year + 'Y' : '';\r\n month = (month > 0) ? month + 'M' : '';\r\n day = (day > 0) ? day + 'D' : '';\r\n hour = (hour > 0) ? hour + 'H' : '';\r\n min = (min > 0) ? min + 'M' : '';\r\n sec = (sec > 0) ? sec + 'S' : '';\r\n \r\n return 'P' + year + month + day + 'T' + hour + min + sec;\r\n };\r\n \r\n exports.ISOWEEKNUM = function(date) {\r\n date = utils.parseDate(date);\r\n if (date instanceof Error) {\r\n return date;\r\n }\r\n \r\n date.setHours(0, 0, 0);\r\n date.setDate(date.getDate() + 4 - (date.getDay() || 7));\r\n var yearStart = new Date(date.getFullYear(), 0, 1);\r\n return Math.ceil((((date - yearStart) / 86400000) + 1) / 7);\r\n };\r\n \r\n exports.MINUTE = function(serial_number) {\r\n serial_number = utils.parseDate(serial_number);\r\n if (serial_number instanceof Error) {\r\n return serial_number;\r\n }\r\n return serial_number.getMinutes();\r\n };\r\n \r\n exports.MONTH = function(serial_number) {\r\n serial_number = utils.parseDate(serial_number);\r\n if (serial_number instanceof Error) {\r\n return serial_number;\r\n }\r\n return serial_number.getMonth() + 1;\r\n };\r\n \r\n exports.NETWORKDAYS = function(start_date, end_date, holidays) {\r\n };\r\n \r\n exports.NETWORKDAYS.INTL = function(start_date, end_date, weekend, holidays) {\r\n };\r\n \r\n exports.NOW = function() {\r\n return new Date();\r\n };\r\n \r\n exports.SECOND = function(serial_number) {\r\n serial_number = utils.parseDate(serial_number);\r\n if (serial_number instanceof Error) {\r\n return serial_number;\r\n }\r\n return serial_number.getSeconds();\r\n };\r\n \r\n exports.TIME = function(hour, minute, second) {\r\n hour = utils.parseNumber(hour);\r\n minute = utils.parseNumber(minute);\r\n second = utils.parseNumber(second);\r\n if (utils.anyIsError(hour, minute, second)) {\r\n return error.value;\r\n }\r\n if (hour < 0 || minute < 0 || second < 0) {\r\n return error.num;\r\n }\r\n return (3600 * hour + 60 * minute + second) / 86400;\r\n };\r\n \r\n exports.TIMEVALUE = function(time_text) {\r\n time_text = utils.parseDate(time_text);\r\n if (time_text instanceof Error) {\r\n return time_text;\r\n }\r\n return (3600 * time_text.getHours() + 60 * time_text.getMinutes() + time_text.getSeconds()) / 86400;\r\n };\r\n \r\n exports.TODAY = function() {\r\n return new Date();\r\n };\r\n \r\n exports.WEEKDAY = function(serial_number, return_type) {\r\n serial_number = utils.parseDate(serial_number);\r\n if (serial_number instanceof Error) {\r\n return serial_number;\r\n }\r\n if (return_type === undefined) {\r\n return_type = 1;\r\n }\r\n var day = serial_number.getDay();\r\n return WEEK_TYPES[return_type][day];\r\n };\r\n \r\n exports.WEEKNUM = function(serial_number, return_type) {\r\n };\r\n \r\n exports.WORKDAY = function(start_date, days, holidays) {\r\n };\r\n \r\n exports.WORKDAY.INTL = function(start_date, days, weekend, holidays) {\r\n };\r\n \r\n exports.YEAR = function(serial_number) {\r\n serial_number = utils.parseDate(serial_number);\r\n if (serial_number instanceof Error) {\r\n return serial_number;\r\n }\r\n return serial_number.getFullYear();\r\n };\r\n \r\n function isLeapYear(year) {\r\n return new Date(year, 1, 29).getMonth() === 1;\r\n }\r\n \r\n exports.YEARFRAC = function(start_date, end_date, basis) {\r\n };\r\n \r\n function serial(date) {\r\n var addOn = (date > -2203891200000)?2:1;\r\n return (date - d1900) / 86400000 + addOn;\r\n }\r\n \r\n return exports;\r\n })();\r\n \r\n jexcel.methods.database = (function() {\r\n var exports = {};\r\n \r\n function compact(array) {\r\n if (!array) {\r\n return array;\r\n }\r\n var result = [];\r\n for (var i = 0; i < array.length; ++i) {\r\n if (!array[i]) {\r\n continue;\r\n }\r\n result.push(array[i]);\r\n }\r\n return result;\r\n }\r\n \r\n exports.FINDFIELD = function(database, title) {\r\n var index = null;\r\n for (var i = 0; i < database.length; i++) {\r\n if (database[i][0] === title) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n \r\n // Return error if the input field title is incorrect\r\n if (index == null) {\r\n return error.value;\r\n }\r\n return index;\r\n };\r\n \r\n function findResultIndex(database, criterias) {\r\n var matches = {};\r\n for (var i = 1; i < database[0].length; ++i) {\r\n matches[i] = true;\r\n }\r\n var maxCriteriaLength = criterias[0].length;\r\n for (i = 1; i < criterias.length; ++i) {\r\n if (criterias[i].length > maxCriteriaLength) {\r\n maxCriteriaLength = criterias[i].length;\r\n }\r\n }\r\n \r\n for (var k = 1; k < database.length; ++k) {\r\n for (var l = 1; l < database[k].length; ++l) {\r\n var currentCriteriaResult = false;\r\n var hasMatchingCriteria = false;\r\n for (var j = 0; j < criterias.length; ++j) {\r\n var criteria = criterias[j];\r\n if (criteria.length < maxCriteriaLength) {\r\n continue;\r\n }\r\n \r\n var criteriaField = criteria[0];\r\n if (database[k][0] !== criteriaField) {\r\n continue;\r\n }\r\n hasMatchingCriteria = true;\r\n for (var p = 1; p < criteria.length; ++p) {\r\n currentCriteriaResult = currentCriteriaResult\r\n || eval(database[k][l] + criteria[p]); // jshint\r\n // ignore:line\r\n }\r\n }\r\n if (hasMatchingCriteria) {\r\n matches[l] = matches[l] && currentCriteriaResult;\r\n }\r\n }\r\n }\r\n \r\n var result = [];\r\n for (var n = 0; n < database[0].length; ++n) {\r\n if (matches[n]) {\r\n result.push(n - 1);\r\n }\r\n }\r\n return result;\r\n }\r\n \r\n // Database functions\r\n exports.DAVERAGE = function(database, field, criteria) {\r\n // Return error if field is not a number and not a string\r\n if (isNaN(field) && (typeof field !== \"string\")) {\r\n return error.value;\r\n }\r\n var resultIndexes = findResultIndex(database, criteria);\r\n var targetFields = [];\r\n if (typeof field === \"string\") {\r\n var index = exports.FINDFIELD(database, field);\r\n targetFields = utils.rest(database[index]);\r\n } else {\r\n targetFields = utils.rest(database[field]);\r\n }\r\n var sum = 0;\r\n for (var i = 0; i < resultIndexes.length; i++) {\r\n sum += targetFields[resultIndexes[i]];\r\n }\r\n return resultIndexes.length === 0 ? error.div0 : sum / resultIndexes.length;\r\n };\r\n \r\n exports.DCOUNT = function(database, field, criteria) {\r\n };\r\n \r\n exports.DCOUNTA = function(database, field, criteria) {\r\n };\r\n \r\n exports.DGET = function(database, field, criteria) {\r\n // Return error if field is not a number and not a string\r\n if (isNaN(field) && (typeof field !== \"string\")) {\r\n return error.value;\r\n }\r\n var resultIndexes = findResultIndex(database, criteria);\r\n var targetFields = [];\r\n if (typeof field === \"string\") {\r\n var index = exports.FINDFIELD(database, field);\r\n targetFields = utils.rest(database[index]);\r\n } else {\r\n targetFields = utils.rest(database[field]);\r\n }\r\n // Return error if no record meets the criteria\r\n if (resultIndexes.length === 0) {\r\n return error.value;\r\n }\r\n // Returns the #NUM! error value because more than one record meets the\r\n // criteria\r\n if (resultIndexes.length > 1) {\r\n return error.num;\r\n }\r\n \r\n return targetFields[resultIndexes[0]];\r\n };\r\n \r\n exports.DMAX = function(database, field, criteria) {\r\n // Return error if field is not a number and not a string\r\n if (isNaN(field) && (typeof field !== \"string\")) {\r\n return error.value;\r\n }\r\n var resultIndexes = findResultIndex(database, criteria);\r\n var targetFields = [];\r\n if (typeof field === \"string\") {\r\n var index = exports.FINDFIELD(database, field);\r\n targetFields = utils.rest(database[index]);\r\n } else {\r\n targetFields = utils.rest(database[field]);\r\n }\r\n var maxValue = targetFields[resultIndexes[0]];\r\n for (var i = 1; i < resultIndexes.length; i++) {\r\n if (maxValue < targetFields[resultIndexes[i]]) {\r\n maxValue = targetFields[resultIndexes[i]];\r\n }\r\n }\r\n return maxValue;\r\n };\r\n \r\n exports.DMIN = function(database, field, criteria) {\r\n // Return error if field is not a number and not a string\r\n if (isNaN(field) && (typeof field !== \"string\")) {\r\n return error.value;\r\n }\r\n var resultIndexes = findResultIndex(database, criteria);\r\n var targetFields = [];\r\n if (typeof field === \"string\") {\r\n var index = exports.FINDFIELD(database, field);\r\n targetFields = utils.rest(database[index]);\r\n } else {\r\n targetFields = utils.rest(database[field]);\r\n }\r\n var minValue = targetFields[resultIndexes[0]];\r\n for (var i = 1; i < resultIndexes.length; i++) {\r\n if (minValue > targetFields[resultIndexes[i]]) {\r\n minValue = targetFields[resultIndexes[i]];\r\n }\r\n }\r\n return minValue;\r\n };\r\n \r\n exports.DPRODUCT = function(database, field, criteria) {\r\n // Return error if field is not a number and not a string\r\n if (isNaN(field) && (typeof field !== \"string\")) {\r\n return error.value;\r\n }\r\n var resultIndexes = findResultIndex(database, criteria);\r\n var targetFields = [];\r\n if (typeof field === \"string\") {\r\n var index = exports.FINDFIELD(database, field);\r\n targetFields = utils.rest(database[index]);\r\n } else {\r\n targetFields = utils.rest(database[field]);\r\n }\r\n var targetValues = [];\r\n for (var i = 0; i < resultIndexes.length; i++) {\r\n targetValues[i] = targetFields[resultIndexes[i]];\r\n }\r\n targetValues = compact(targetValues);\r\n var result = 1;\r\n for (i = 0; i < targetValues.length; i++) {\r\n result *= targetValues[i];\r\n }\r\n return result;\r\n };\r\n \r\n exports.DSTDEV = function(database, field, criteria) {\r\n };\r\n \r\n exports.DSTDEVP = function(database, field, criteria) {\r\n };\r\n \r\n exports.DSUM = function(database, field, criteria) {\r\n };\r\n \r\n exports.DVAR = function(database, field, criteria) {\r\n };\r\n \r\n exports.DVARP = function(database, field, criteria) {\r\n };\r\n \r\n exports.MATCH = function(lookupValue, lookupArray, matchType) {\r\n if (!lookupValue && !lookupArray) {\r\n return error.na;\r\n }\r\n if (arguments.length === 2) {\r\n matchType = 1;\r\n }\r\n if (!(lookupArray instanceof Array)) {\r\n return error.na;\r\n }\r\n if (matchType !== -1 && matchType !== 0 && matchType !== 1) {\r\n return error.na;\r\n }\r\n \r\n var index;\r\n var indexValue;\r\n \r\n for (var idx = 0; idx < lookupArray.length; idx++) {\r\n if (matchType === 1) {\r\n if (lookupArray[idx] === lookupValue) {\r\n return idx + 1;\r\n } else if (lookupArray[idx] < lookupValue) {\r\n if (!indexValue) {\r\n index = idx + 1;\r\n indexValue = lookupArray[idx];\r\n } else if (lookupArray[idx] > indexValue) {\r\n index = idx + 1;\r\n indexValue = lookupArray[idx];\r\n }\r\n }\r\n } else if (matchType === 0) {\r\n if (typeof lookupValue === 'string') {\r\n lookupValue = lookupValue.replace(/\\?/g, '.');\r\n if (lookupArray[idx].toLowerCase().match(lookupValue.toLowerCase())) {\r\n return idx + 1;\r\n }\r\n } else {\r\n if (lookupArray[idx] === lookupValue) {\r\n return idx + 1;\r\n }\r\n }\r\n } else if (matchType === -1) {\r\n if (lookupArray[idx] === lookupValue) {\r\n return idx + 1;\r\n } else if (lookupArray[idx] > lookupValue) {\r\n if (!indexValue) {\r\n index = idx + 1;\r\n indexValue = lookupArray[idx];\r\n } else if (lookupArray[idx] < indexValue) {\r\n index = idx + 1;\r\n indexValue = lookupArray[idx];\r\n }\r\n }\r\n }\r\n }\r\n \r\n return index ? index : error.na;\r\n };\r\n \r\n return exports;\r\n })();\r\n \r\n jexcel.methods.engineering = (function() {\r\n var exports = {};\r\n \r\n function isValidBinaryNumber(number) {\r\n return (/^[01]{1,10}$/).test(number);\r\n }\r\n \r\n exports.BESSELI = function(x, n) {\r\n };\r\n \r\n exports.BESSELJ = function(x, n) {\r\n };\r\n \r\n exports.BESSELK = function(x, n) {\r\n };\r\n \r\n exports.BESSELY = function(x, n) {\r\n };\r\n \r\n exports.BIN2DEC = function(number) {\r\n // Return error if number is not binary or contains more than 10\r\n // characters (10 digits)\r\n if (!isValidBinaryNumber(number)) {\r\n return error.num;\r\n }\r\n \r\n // Convert binary number to decimal\r\n var result = parseInt(number, 2);\r\n \r\n // Handle negative numbers\r\n var stringified = number.toString();\r\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\r\n return parseInt(stringified.substring(1), 2) - 512;\r\n } else {\r\n return result;\r\n }\r\n };\r\n \r\n exports.BIN2HEX = function(number, places) {\r\n // Return error if number is not binary or contains more than 10\r\n // characters (10 digits)\r\n if (!isValidBinaryNumber(number)) {\r\n return error.num;\r\n }\r\n \r\n // Ignore places and return a 10-character hexadecimal number if number\r\n // is negative\r\n var stringified = number.toString();\r\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\r\n return (1099511627264 + parseInt(stringified.substring(1), 2)).toString(16);\r\n }\r\n \r\n // Convert binary number to hexadecimal\r\n var result = parseInt(number, 2).toString(16);\r\n \r\n // Return hexadecimal number using the minimum number of characters\r\n // necessary if places is undefined\r\n if (places === undefined) {\r\n return result;\r\n } else {\r\n // Return error if places is nonnumeric\r\n if (isNaN(places)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if places is negative\r\n if (places < 0) {\r\n return error.num;\r\n }\r\n \r\n // Truncate places in case it is not an integer\r\n places = Math.floor(places);\r\n \r\n // Pad return value with leading 0s (zeros) if necessary (using\r\n // Underscore.string)\r\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\r\n }\r\n };\r\n \r\n exports.BIN2OCT = function(number, places) {\r\n // Return error if number is not binary or contains more than 10\r\n // characters (10 digits)\r\n if (!isValidBinaryNumber(number)) {\r\n return error.num;\r\n }\r\n \r\n // Ignore places and return a 10-character octal number if number is\r\n // negative\r\n var stringified = number.toString();\r\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\r\n return (1073741312 + parseInt(stringified.substring(1), 2)).toString(8);\r\n }\r\n \r\n // Convert binary number to octal\r\n var result = parseInt(number, 2).toString(8);\r\n \r\n // Return octal number using the minimum number of characters necessary\r\n // if places is undefined\r\n if (places === undefined) {\r\n return result;\r\n } else {\r\n // Return error if places is nonnumeric\r\n if (isNaN(places)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if places is negative\r\n if (places < 0) {\r\n return error.num;\r\n }\r\n \r\n // Truncate places in case it is not an integer\r\n places = Math.floor(places);\r\n \r\n // Pad return value with leading 0s (zeros) if necessary (using\r\n // Underscore.string)\r\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\r\n }\r\n };\r\n \r\n exports.BITAND = function(number1, number2) {\r\n // Return error if either number is a non-numeric value\r\n number1 = utils.parseNumber(number1);\r\n number2 = utils.parseNumber(number2);\r\n if (utils.anyIsError(number1, number2)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if either number is less than 0\r\n if (number1 < 0 || number2 < 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if either number is a non-integer\r\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\r\n return error.num;\r\n }\r\n \r\n // Return error if either number is greater than (2^48)-1\r\n if (number1 > 281474976710655 || number2 > 281474976710655) {\r\n return error.num;\r\n }\r\n \r\n // Return bitwise AND of two numbers\r\n return number1 & number2;\r\n };\r\n \r\n exports.BITLSHIFT = function(number, shift) {\r\n number = utils.parseNumber(number);\r\n shift = utils.parseNumber(shift);\r\n if (utils.anyIsError(number, shift)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if number is less than 0\r\n if (number < 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if number is a non-integer\r\n if (Math.floor(number) !== number) {\r\n return error.num;\r\n }\r\n \r\n // Return error if number is greater than (2^48)-1\r\n if (number > 281474976710655) {\r\n return error.num;\r\n }\r\n \r\n // Return error if the absolute value of shift is greater than 53\r\n if (Math.abs(shift) > 53) {\r\n return error.num;\r\n }\r\n \r\n // Return number shifted by shift bits to the left or to the right if\r\n // shift is negative\r\n return (shift >= 0) ? number << shift : number >> -shift;\r\n };\r\n \r\n exports.BITOR = function(number1, number2) {\r\n number1 = utils.parseNumber(number1);\r\n number2 = utils.parseNumber(number2);\r\n if (utils.anyIsError(number1, number2)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if either number is less than 0\r\n if (number1 < 0 || number2 < 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if either number is a non-integer\r\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\r\n return error.num;\r\n }\r\n \r\n // Return error if either number is greater than (2^48)-1\r\n if (number1 > 281474976710655 || number2 > 281474976710655) {\r\n return error.num;\r\n }\r\n \r\n // Return bitwise OR of two numbers\r\n return number1 | number2;\r\n };\r\n \r\n exports.BITRSHIFT = function(number, shift) {\r\n number = utils.parseNumber(number);\r\n shift = utils.parseNumber(shift);\r\n if (utils.anyIsError(number, shift)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if number is less than 0\r\n if (number < 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if number is a non-integer\r\n if (Math.floor(number) !== number) {\r\n return error.num;\r\n }\r\n \r\n // Return error if number is greater than (2^48)-1\r\n if (number > 281474976710655) {\r\n return error.num;\r\n }\r\n \r\n // Return error if the absolute value of shift is greater than 53\r\n if (Math.abs(shift) > 53) {\r\n return error.num;\r\n }\r\n \r\n // Return number shifted by shift bits to the right or to the left if\r\n // shift is negative\r\n return (shift >= 0) ? number >> shift : number << -shift;\r\n };\r\n \r\n exports.BITXOR = function(number1, number2) {\r\n number1 = utils.parseNumber(number1);\r\n number2 = utils.parseNumber(number2);\r\n if (utils.anyIsError(number1, number2)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if either number is less than 0\r\n if (number1 < 0 || number2 < 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if either number is a non-integer\r\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\r\n return error.num;\r\n }\r\n \r\n // Return error if either number is greater than (2^48)-1\r\n if (number1 > 281474976710655 || number2 > 281474976710655) {\r\n return error.num;\r\n }\r\n \r\n // Return bitwise XOR of two numbers\r\n return number1 ^ number2;\r\n };\r\n \r\n exports.COMPLEX = function(real, imaginary, suffix) {\r\n real = utils.parseNumber(real);\r\n imaginary = utils.parseNumber(imaginary);\r\n if (utils.anyIsError(real, imaginary)) {\r\n return real;\r\n }\r\n \r\n // Set suffix\r\n suffix = (suffix === undefined) ? 'i' : suffix;\r\n \r\n // Return error if suffix is neither \"i\" nor \"j\"\r\n if (suffix !== 'i' && suffix !== 'j') {\r\n return error.value;\r\n }\r\n \r\n // Return complex number\r\n if (real === 0 && imaginary === 0) {\r\n return 0;\r\n } else if (real === 0) {\r\n return (imaginary === 1) ? suffix : imaginary.toString() + suffix;\r\n } else if (imaginary === 0) {\r\n return real.toString();\r\n } else {\r\n var sign = (imaginary > 0) ? '+' : '';\r\n return real.toString() + sign + ((imaginary === 1) ? suffix : imaginary.toString() + suffix);\r\n }\r\n };\r\n \r\n exports.CONVERT = function(number, from_unit, to_unit) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n \r\n // List of units supported by CONVERT and units defined by the\r\n // International System of Units\r\n // [Name, Symbol, Alternate symbols, Quantity, ISU, CONVERT, Conversion\r\n // ratio]\r\n var units = [\r\n [\"a.u. of action\", \"?\", null, \"action\", false, false, 1.05457168181818e-34],\r\n [\"a.u. of charge\", \"e\", null, \"electric_charge\", false, false, 1.60217653141414e-19],\r\n [\"a.u. of energy\", \"Eh\", null, \"energy\", false, false, 4.35974417757576e-18],\r\n [\"a.u. of length\", \"a?\", null, \"length\", false, false, 5.29177210818182e-11],\r\n [\"a.u. of mass\", \"m?\", null, \"mass\", false, false, 9.10938261616162e-31],\r\n [\"a.u. of time\", \"?/Eh\", null, \"time\", false, false, 2.41888432650516e-17],\r\n [\"admiralty knot\", \"admkn\", null, \"speed\", false, true, 0.514773333],\r\n [\"ampere\", \"A\", null, \"electric_current\", true, false, 1],\r\n [\"ampere per meter\", \"A/m\", null, \"magnetic_field_intensity\", true, false, 1],\r\n [\"Ã¥ngström\", \"Ã…\", [\"ang\"], \"length\", false, true, 1e-10],\r\n [\"are\", \"ar\", null, \"area\", false, true, 100],\r\n [\"astronomical unit\", \"ua\", null, \"length\", false, false, 1.49597870691667e-11],\r\n [\"bar\", \"bar\", null, \"pressure\", false, false, 100000],\r\n [\"barn\", \"b\", null, \"area\", false, false, 1e-28],\r\n [\"becquerel\", \"Bq\", null, \"radioactivity\", true, false, 1],\r\n [\"bit\", \"bit\", [\"b\"], \"information\", false, true, 1],\r\n [\"btu\", \"BTU\", [\"btu\"], \"energy\", false, true, 1055.05585262],\r\n [\"byte\", \"byte\", null, \"information\", false, true, 8],\r\n [\"candela\", \"cd\", null, \"luminous_intensity\", true, false, 1],\r\n [\"candela per square metre\", \"cd/m?\", null, \"luminance\", true, false, 1],\r\n [\"coulomb\", \"C\", null, \"electric_charge\", true, false, 1],\r\n [\"cubic Ã¥ngström\", \"ang3\", [\"ang^3\"], \"volume\", false, true, 1e-30],\r\n [\"cubic foot\", \"ft3\", [\"ft^3\"], \"volume\", false, true, 0.028316846592],\r\n [\"cubic inch\", \"in3\", [\"in^3\"], \"volume\", false, true, 0.000016387064],\r\n [\"cubic light-year\", \"ly3\", [\"ly^3\"], \"volume\", false, true, 8.46786664623715e-47],\r\n [\"cubic metre\", \"m?\", null, \"volume\", true, true, 1],\r\n [\"cubic mile\", \"mi3\", [\"mi^3\"], \"volume\", false, true, 4168181825.44058],\r\n [\"cubic nautical mile\", \"Nmi3\", [\"Nmi^3\"], \"volume\", false, true, 6352182208],\r\n [\"cubic Pica\", \"Pica3\", [\"Picapt3\", \"Pica^3\", \"Picapt^3\"], \"volume\", false, true, 7.58660370370369e-8],\r\n [\"cubic yard\", \"yd3\", [\"yd^3\"], \"volume\", false, true, 0.764554857984],\r\n [\"cup\", \"cup\", null, \"volume\", false, true, 0.0002365882365],\r\n [\"dalton\", \"Da\", [\"u\"], \"mass\", false, false, 1.66053886282828e-27],\r\n [\"day\", \"d\", [\"day\"], \"time\", false, true, 86400],\r\n [\"degree\", \"°\", null, \"angle\", false, false, 0.0174532925199433],\r\n [\"degrees Rankine\", \"Rank\", null, \"temperature\", false, true, 0.555555555555556],\r\n [\"dyne\", \"dyn\", [\"dy\"], \"force\", false, true, 0.00001],\r\n [\"electronvolt\", \"eV\", [\"ev\"], \"energy\", false, true, 1.60217656514141],\r\n [\"ell\", \"ell\", null, \"length\", false, true, 1.143],\r\n [\"erg\", \"erg\", [\"e\"], \"energy\", false, true, 1e-7],\r\n [\"farad\", \"F\", null, \"electric_capacitance\", true, false, 1],\r\n [\"fluid ounce\", \"oz\", null, \"volume\", false, true, 0.0000295735295625],\r\n [\"foot\", \"ft\", null, \"length\", false, true, 0.3048],\r\n [\"foot-pound\", \"flb\", null, \"energy\", false, true, 1.3558179483314],\r\n [\"gal\", \"Gal\", null, \"acceleration\", false, false, 0.01],\r\n [\"gallon\", \"gal\", null, \"volume\", false, true, 0.003785411784],\r\n [\"gauss\", \"G\", [\"ga\"], \"magnetic_flux_density\", false, true, 1],\r\n [\"grain\", \"grain\", null, \"mass\", false, true, 0.0000647989],\r\n [\"gram\", \"g\", null, \"mass\", false, true, 0.001],\r\n [\"gray\", \"Gy\", null, \"absorbed_dose\", true, false, 1],\r\n [\"gross registered ton\", \"GRT\", [\"regton\"], \"volume\", false, true, 2.8316846592],\r\n [\"hectare\", \"ha\", null, \"area\", false, true, 10000],\r\n [\"henry\", \"H\", null, \"inductance\", true, false, 1],\r\n [\"hertz\", \"Hz\", null, \"frequency\", true, false, 1],\r\n [\"horsepower\", \"HP\", [\"h\"], \"power\", false, true, 745.69987158227],\r\n [\"horsepower-hour\", \"HPh\", [\"hh\", \"hph\"], \"energy\", false, true, 2684519.538],\r\n [\"hour\", \"h\", [\"hr\"], \"time\", false, true, 3600],\r\n [\"imperial gallon (U.K.)\", \"uk_gal\", null, \"volume\", false, true, 0.00454609],\r\n [\"imperial hundredweight\", \"lcwt\", [\"uk_cwt\", \"hweight\"], \"mass\", false, true, 50.802345],\r\n [\"imperial quart (U.K)\", \"uk_qt\", null, \"volume\", false, true, 0.0011365225],\r\n [\"imperial ton\", \"brton\", [\"uk_ton\", \"LTON\"], \"mass\", false, true, 1016.046909],\r\n [\"inch\", \"in\", null, \"length\", false, true, 0.0254],\r\n [\"international acre\", \"uk_acre\", null, \"area\", false, true, 4046.8564224],\r\n [\"IT calorie\", \"cal\", null, \"energy\", false, true, 4.1868],\r\n [\"joule\", \"J\", null, \"energy\", true, true, 1],\r\n [\"katal\", \"kat\", null, \"catalytic_activity\", true, false, 1],\r\n [\"kelvin\", \"K\", [\"kel\"], \"temperature\", true, true, 1],\r\n [\"kilogram\", \"kg\", null, \"mass\", true, true, 1],\r\n [\"knot\", \"kn\", null, \"speed\", false, true, 0.514444444444444],\r\n [\"light-year\", \"ly\", null, \"length\", false, true, 9460730472580800],\r\n [\"litre\", \"L\", [\"l\", \"lt\"], \"volume\", false, true, 0.001],\r\n [\"lumen\", \"lm\", null, \"luminous_flux\", true, false, 1],\r\n [\"lux\", \"lx\", null, \"illuminance\", true, false, 1],\r\n [\"maxwell\", \"Mx\", null, \"magnetic_flux\", false, false, 1e-18],\r\n [\"measurement ton\", \"MTON\", null, \"volume\", false, true, 1.13267386368],\r\n [\"meter per hour\", \"m/h\", [\"m/hr\"], \"speed\", false, true, 0.00027777777777778],\r\n [\"meter per second\", \"m/s\", [\"m/sec\"], \"speed\", true, true, 1],\r\n [\"meter per second squared\", \"m?s??\", null, \"acceleration\", true, false, 1],\r\n [\"parsec\", \"pc\", [\"parsec\"], \"length\", false, true, 30856775814671900],\r\n [\"meter squared per second\", \"m?/s\", null, \"kinematic_viscosity\", true, false, 1],\r\n [\"metre\", \"m\", null, \"length\", true, true, 1],\r\n [\"miles per hour\", \"mph\", null, \"speed\", false, true, 0.44704],\r\n [\"millimetre of mercury\", \"mmHg\", null, \"pressure\", false, false, 133.322],\r\n [\"minute\", \"?\", null, \"angle\", false, false, 0.000290888208665722],\r\n [\"minute\", \"min\", [\"mn\"], \"time\", false, true, 60],\r\n [\"modern teaspoon\", \"tspm\", null, \"volume\", false, true, 0.000005],\r\n [\"mole\", \"mol\", null, \"amount_of_substance\", true, false, 1],\r\n [\"morgen\", \"Morgen\", null, \"area\", false, true, 2500],\r\n [\"n.u. of action\", \"?\", null, \"action\", false, false, 1.05457168181818e-34],\r\n [\"n.u. of mass\", \"m?\", null, \"mass\", false, false, 9.10938261616162e-31],\r\n [\"n.u. of speed\", \"c?\", null, \"speed\", false, false, 299792458],\r\n [\"n.u. of time\", \"?/(me?c??)\", null, \"time\", false, false, 1.28808866778687e-21],\r\n [\"nautical mile\", \"M\", [\"Nmi\"], \"length\", false, true, 1852],\r\n [\"newton\", \"N\", null, \"force\", true, true, 1],\r\n [\"Å“rsted\", \"Oe \", null, \"magnetic_field_intensity\", false, false, 79.5774715459477],\r\n [\"ohm\", \"Ω\", null, \"electric_resistance\", true, false, 1],\r\n [\"ounce mass\", \"ozm\", null, \"mass\", false, true, 0.028349523125],\r\n [\"pascal\", \"Pa\", null, \"pressure\", true, false, 1],\r\n [\"pascal second\", \"Pa?s\", null, \"dynamic_viscosity\", true, false, 1],\r\n [\"pferdestärke\", \"PS\", null, \"power\", false, true, 735.49875],\r\n [\"phot\", \"ph\", null, \"illuminance\", false, false, 0.0001],\r\n [\"pica (1/6 inch)\", \"pica\", null, \"length\", false, true, 0.00035277777777778],\r\n [\"pica (1/72 inch)\", \"Pica\", [\"Picapt\"], \"length\", false, true, 0.00423333333333333],\r\n [\"poise\", \"P\", null, \"dynamic_viscosity\", false, false, 0.1],\r\n [\"pond\", \"pond\", null, \"force\", false, true, 0.00980665],\r\n [\"pound force\", \"lbf\", null, \"force\", false, true, 4.4482216152605],\r\n [\"pound mass\", \"lbm\", null, \"mass\", false, true, 0.45359237],\r\n [\"quart\", \"qt\", null, \"volume\", false, true, 0.000946352946],\r\n [\"radian\", \"rad\", null, \"angle\", true, false, 1],\r\n [\"second\", \"?\", null, \"angle\", false, false, 0.00000484813681109536],\r\n [\"second\", \"s\", [\"sec\"], \"time\", true, true, 1],\r\n [\"short hundredweight\", \"cwt\", [\"shweight\"], \"mass\", false, true, 45.359237],\r\n [\"siemens\", \"S\", null, \"electrical_conductance\", true, false, 1],\r\n [\"sievert\", \"Sv\", null, \"equivalent_dose\", true, false, 1],\r\n [\"slug\", \"sg\", null, \"mass\", false, true, 14.59390294],\r\n [\"square Ã¥ngström\", \"ang2\", [\"ang^2\"], \"area\", false, true, 1e-20],\r\n [\"square foot\", \"ft2\", [\"ft^2\"], \"area\", false, true, 0.09290304],\r\n [\"square inch\", \"in2\", [\"in^2\"], \"area\", false, true, 0.00064516],\r\n [\"square light-year\", \"ly2\", [\"ly^2\"], \"area\", false, true, 8.95054210748189e+31],\r\n [\"square meter\", \"m?\", null, \"area\", true, true, 1],\r\n [\"square mile\", \"mi2\", [\"mi^2\"], \"area\", false, true, 2589988.110336],\r\n [\"square nautical mile\", \"Nmi2\", [\"Nmi^2\"], \"area\", false, true, 3429904],\r\n [\"square Pica\", \"Pica2\", [\"Picapt2\", \"Pica^2\", \"Picapt^2\"], \"area\", false, true, 0.00001792111111111],\r\n [\"square yard\", \"yd2\", [\"yd^2\"], \"area\", false, true, 0.83612736],\r\n [\"statute mile\", \"mi\", null, \"length\", false, true, 1609.344],\r\n [\"steradian\", \"sr\", null, \"solid_angle\", true, false, 1],\r\n [\"stilb\", \"sb\", null, \"luminance\", false, false, 0.0001],\r\n [\"stokes\", \"St\", null, \"kinematic_viscosity\", false, false, 0.0001],\r\n [\"stone\", \"stone\", null, \"mass\", false, true, 6.35029318],\r\n [\"tablespoon\", \"tbs\", null, \"volume\", false, true, 0.0000147868],\r\n [\"teaspoon\", \"tsp\", null, \"volume\", false, true, 0.00000492892],\r\n [\"tesla\", \"T\", null, \"magnetic_flux_density\", true, true, 1],\r\n [\"thermodynamic calorie\", \"c\", null, \"energy\", false, true, 4.184],\r\n [\"ton\", \"ton\", null, \"mass\", false, true, 907.18474],\r\n [\"tonne\", \"t\", null, \"mass\", false, false, 1000],\r\n [\"U.K. pint\", \"uk_pt\", null, \"volume\", false, true, 0.00056826125],\r\n [\"U.S. bushel\", \"bushel\", null, \"volume\", false, true, 0.03523907],\r\n [\"U.S. oil barrel\", \"barrel\", null, \"volume\", false, true, 0.158987295],\r\n [\"U.S. pint\", \"pt\", [\"us_pt\"], \"volume\", false, true, 0.000473176473],\r\n [\"U.S. survey mile\", \"survey_mi\", null, \"length\", false, true, 1609.347219],\r\n [\"U.S. survey/statute acre\", \"us_acre\", null, \"area\", false, true, 4046.87261],\r\n [\"volt\", \"V\", null, \"voltage\", true, false, 1],\r\n [\"watt\", \"W\", null, \"power\", true, true, 1],\r\n [\"watt-hour\", \"Wh\", [\"wh\"], \"energy\", false, true, 3600],\r\n [\"weber\", \"Wb\", null, \"magnetic_flux\", true, false, 1],\r\n [\"yard\", \"yd\", null, \"length\", false, true, 0.9144],\r\n [\"year\", \"yr\", null, \"time\", false, true, 31557600]\r\n ];\r\n \r\n // Binary prefixes\r\n // [Name, Prefix power of 2 value, Previx value, Abbreviation, Derived\r\n // from]\r\n var binary_prefixes = {\r\n Yi: [\"yobi\", 80, 1208925819614629174706176, \"Yi\", \"yotta\"],\r\n Zi: [\"zebi\", 70, 1180591620717411303424, \"Zi\", \"zetta\"],\r\n Ei: [\"exbi\", 60, 1152921504606846976, \"Ei\", \"exa\"],\r\n Pi: [\"pebi\", 50, 1125899906842624, \"Pi\", \"peta\"],\r\n Ti: [\"tebi\", 40, 1099511627776, \"Ti\", \"tera\"],\r\n Gi: [\"gibi\", 30, 1073741824, \"Gi\", \"giga\"],\r\n Mi: [\"mebi\", 20, 1048576, \"Mi\", \"mega\"],\r\n ki: [\"kibi\", 10, 1024, \"ki\", \"kilo\"]\r\n };\r\n \r\n // Unit prefixes\r\n // [Name, Multiplier, Abbreviation]\r\n var unit_prefixes = {\r\n Y: [\"yotta\", 1e+24, \"Y\"],\r\n Z: [\"zetta\", 1e+21, \"Z\"],\r\n E: [\"exa\", 1e+18, \"E\"],\r\n P: [\"peta\", 1e+15, \"P\"],\r\n T: [\"tera\", 1e+12, \"T\"],\r\n G: [\"giga\", 1e+09, \"G\"],\r\n M: [\"mega\", 1e+06, \"M\"],\r\n k: [\"kilo\", 1e+03, \"k\"],\r\n h: [\"hecto\", 1e+02, \"h\"],\r\n e: [\"dekao\", 1e+01, \"e\"],\r\n d: [\"deci\", 1e-01, \"d\"],\r\n c: [\"centi\", 1e-02, \"c\"],\r\n m: [\"milli\", 1e-03, \"m\"],\r\n u: [\"micro\", 1e-06, \"u\"],\r\n n: [\"nano\", 1e-09, \"n\"],\r\n p: [\"pico\", 1e-12, \"p\"],\r\n f: [\"femto\", 1e-15, \"f\"],\r\n a: [\"atto\", 1e-18, \"a\"],\r\n z: [\"zepto\", 1e-21, \"z\"],\r\n y: [\"yocto\", 1e-24, \"y\"]\r\n };\r\n \r\n // Initialize units and multipliers\r\n var from = null;\r\n var to = null;\r\n var base_from_unit = from_unit;\r\n var base_to_unit = to_unit;\r\n var from_multiplier = 1;\r\n var to_multiplier = 1;\r\n var alt;\r\n \r\n // Lookup from and to units\r\n for (var i = 0; i < units.length; i++) {\r\n alt = (units[i][2] === null) ? [] : units[i][2];\r\n if (units[i][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\r\n from = units[i];\r\n }\r\n if (units[i][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\r\n to = units[i];\r\n }\r\n }\r\n \r\n // Lookup from prefix\r\n if (from === null) {\r\n var from_binary_prefix = binary_prefixes[from_unit.substring(0, 2)];\r\n var from_unit_prefix = unit_prefixes[from_unit.substring(0, 1)];\r\n \r\n // Handle dekao unit prefix (only unit prefix with two characters)\r\n if (from_unit.substring(0, 2) === 'da') {\r\n from_unit_prefix = [\"dekao\", 1e+01, \"da\"];\r\n }\r\n \r\n // Handle binary prefixes first (so that 'Yi' is processed before\r\n // 'Y')\r\n if (from_binary_prefix) {\r\n from_multiplier = from_binary_prefix[2];\r\n base_from_unit = from_unit.substring(2);\r\n } else if (from_unit_prefix) {\r\n from_multiplier = from_unit_prefix[1];\r\n base_from_unit = from_unit.substring(from_unit_prefix[2].length);\r\n }\r\n \r\n // Lookup from unit\r\n for (var j = 0; j < units.length; j++) {\r\n alt = (units[j][2] === null) ? [] : units[j][2];\r\n if (units[j][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\r\n from = units[j];\r\n }\r\n }\r\n }\r\n \r\n // Lookup to prefix\r\n if (to === null) {\r\n var to_binary_prefix = binary_prefixes[to_unit.substring(0, 2)];\r\n var to_unit_prefix = unit_prefixes[to_unit.substring(0, 1)];\r\n \r\n // Handle dekao unit prefix (only unit prefix with two characters)\r\n if (to_unit.substring(0, 2) === 'da') {\r\n to_unit_prefix = [\"dekao\", 1e+01, \"da\"];\r\n }\r\n \r\n // Handle binary prefixes first (so that 'Yi' is processed before\r\n // 'Y')\r\n if (to_binary_prefix) {\r\n to_multiplier = to_binary_prefix[2];\r\n base_to_unit = to_unit.substring(2);\r\n } else if (to_unit_prefix) {\r\n to_multiplier = to_unit_prefix[1];\r\n base_to_unit = to_unit.substring(to_unit_prefix[2].length);\r\n }\r\n \r\n // Lookup to unit\r\n for (var k = 0; k < units.length; k++) {\r\n alt = (units[k][2] === null) ? [] : units[k][2];\r\n if (units[k][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\r\n to = units[k];\r\n }\r\n }\r\n }\r\n \r\n // Return error if a unit does not exist\r\n if (from === null || to === null) {\r\n return error.na;\r\n }\r\n \r\n // Return error if units represent different quantities\r\n if (from[3] !== to[3]) {\r\n return error.na;\r\n }\r\n \r\n // Return converted number\r\n return number * from[6] * from_multiplier / (to[6] * to_multiplier);\r\n };\r\n \r\n exports.DEC2BIN = function(number, places) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n \r\n // Return error if number is not decimal, is lower than -512, or is\r\n // greater than 511\r\n if (!/^-?[0-9]{1,3}$/.test(number) || number < -512 || number > 511) {\r\n return error.num;\r\n }\r\n \r\n // Ignore places and return a 10-character binary number if number is\r\n // negative\r\n if (number < 0) {\r\n return '1' + REPT('0', 9 - (512 + number).toString(2).length) + (512 + number).toString(2);\r\n }\r\n \r\n // Convert decimal number to binary\r\n var result = parseInt(number, 10).toString(2);\r\n \r\n // Return binary number using the minimum number of characters necessary\r\n // if places is undefined\r\n if (typeof places === 'undefined') {\r\n return result;\r\n } else {\r\n // Return error if places is nonnumeric\r\n if (isNaN(places)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if places is negative\r\n if (places < 0) {\r\n return error.num;\r\n }\r\n \r\n // Truncate places in case it is not an integer\r\n places = Math.floor(places);\r\n \r\n // Pad return value with leading 0s (zeros) if necessary (using\r\n // Underscore.string)\r\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\r\n }\r\n };\r\n \r\n exports.DEC2HEX = function(number, places) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n \r\n // Return error if number is not decimal, is lower than -549755813888,\r\n // or is greater than 549755813887\r\n if (!/^-?[0-9]{1,12}$/.test(number) || number < -549755813888 || number > 549755813887) {\r\n return error.num;\r\n }\r\n \r\n // Ignore places and return a 10-character hexadecimal number if number\r\n // is negative\r\n if (number < 0) {\r\n return (1099511627776 + number).toString(16);\r\n }\r\n \r\n // Convert decimal number to hexadecimal\r\n var result = parseInt(number, 10).toString(16);\r\n \r\n // Return hexadecimal number using the minimum number of characters\r\n // necessary if places is undefined\r\n if (typeof places === 'undefined') {\r\n return result;\r\n } else {\r\n // Return error if places is nonnumeric\r\n if (isNaN(places)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if places is negative\r\n if (places < 0) {\r\n return error.num;\r\n }\r\n \r\n // Truncate places in case it is not an integer\r\n places = Math.floor(places);\r\n \r\n // Pad return value with leading 0s (zeros) if necessary (using\r\n // Underscore.string)\r\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\r\n }\r\n };\r\n \r\n exports.DEC2OCT = function(number, places) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n \r\n // Return error if number is not decimal, is lower than -549755813888,\r\n // or is greater than 549755813887\r\n if (!/^-?[0-9]{1,9}$/.test(number) || number < -536870912 || number > 536870911) {\r\n return error.num;\r\n }\r\n \r\n // Ignore places and return a 10-character octal number if number is\r\n // negative\r\n if (number < 0) {\r\n return (1073741824 + number).toString(8);\r\n }\r\n \r\n // Convert decimal number to octal\r\n var result = parseInt(number, 10).toString(8);\r\n \r\n // Return octal number using the minimum number of characters necessary\r\n // if places is undefined\r\n if (typeof places === 'undefined') {\r\n return result;\r\n } else {\r\n // Return error if places is nonnumeric\r\n if (isNaN(places)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if places is negative\r\n if (places < 0) {\r\n return error.num;\r\n }\r\n \r\n // Truncate places in case it is not an integer\r\n places = Math.floor(places);\r\n \r\n // Pad return value with leading 0s (zeros) if necessary (using\r\n // Underscore.string)\r\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\r\n }\r\n };\r\n \r\n exports.DELTA = function(number1, number2) {\r\n // Set number2 to zero if undefined\r\n number2 = (number2 === undefined) ? 0 : number2;\r\n number1 = utils.parseNumber(number1);\r\n number2 = utils.parseNumber(number2);\r\n if (utils.anyIsError(number1, number2)) {\r\n return error.value;\r\n }\r\n \r\n // Return delta\r\n return (number1 === number2) ? 1 : 0;\r\n };\r\n \r\n exports.ERF = function(lower_bound, upper_bound) {\r\n };\r\n \r\n exports.ERF.PRECISE = function() {\r\n };\r\n \r\n exports.ERFC = function(x) {\r\n };\r\n \r\n exports.ERFC.PRECISE = function() {\r\n };\r\n \r\n exports.GESTEP = function(number, step) {\r\n step = step || 0;\r\n number = utils.parseNumber(number);\r\n if (utils.anyIsError(step, number)) {\r\n return number;\r\n }\r\n \r\n // Return delta\r\n return (number >= step) ? 1 : 0;\r\n };\r\n \r\n exports.HEX2BIN = function(number, places) {\r\n // Return error if number is not hexadecimal or contains more than ten\r\n // characters (10 digits)\r\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\r\n return error.num;\r\n }\r\n \r\n // Check if number is negative\r\n var negative = (number.length === 10 && number.substring(0, 1).toLowerCase() === 'f') ? true : false;\r\n \r\n // Convert hexadecimal number to decimal\r\n var decimal = (negative) ? parseInt(number, 16) - 1099511627776 : parseInt(number, 16);\r\n \r\n // Return error if number is lower than -512 or greater than 511\r\n if (decimal < -512 || decimal > 511) {\r\n return error.num;\r\n }\r\n \r\n // Ignore places and return a 10-character binary number if number is\r\n // negative\r\n if (negative) {\r\n return '1' + REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2);\r\n }\r\n \r\n // Convert decimal number to binary\r\n var result = decimal.toString(2);\r\n \r\n // Return binary number using the minimum number of characters necessary\r\n // if places is undefined\r\n if (places === undefined) {\r\n return result;\r\n } else {\r\n // Return error if places is nonnumeric\r\n if (isNaN(places)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if places is negative\r\n if (places < 0) {\r\n return error.num;\r\n }\r\n \r\n // Truncate places in case it is not an integer\r\n places = Math.floor(places);\r\n \r\n // Pad return value with leading 0s (zeros) if necessary (using\r\n // Underscore.string)\r\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\r\n }\r\n };\r\n \r\n exports.HEX2DEC = function(number) {\r\n // Return error if number is not hexadecimal or contains more than ten\r\n // characters (10 digits)\r\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\r\n return error.num;\r\n }\r\n \r\n // Convert hexadecimal number to decimal\r\n var decimal = parseInt(number, 16);\r\n \r\n // Return decimal number\r\n return (decimal >= 549755813888) ? decimal - 1099511627776 : decimal;\r\n };\r\n \r\n exports.HEX2OCT = function(number, places) {\r\n // Return error if number is not hexadecimal or contains more than ten\r\n // characters (10 digits)\r\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\r\n return error.num;\r\n }\r\n \r\n // Convert hexadecimal number to decimal\r\n var decimal = parseInt(number, 16);\r\n \r\n // Return error if number is positive and greater than 0x1fffffff\r\n // (536870911)\r\n if (decimal > 536870911 && decimal < 1098974756864) {\r\n return error.num;\r\n }\r\n \r\n // Ignore places and return a 10-character octal number if number is\r\n // negative\r\n if (decimal >= 1098974756864) {\r\n return (decimal - 1098437885952).toString(8);\r\n }\r\n \r\n // Convert decimal number to octal\r\n var result = decimal.toString(8);\r\n \r\n // Return octal number using the minimum number of characters necessary\r\n // if places is undefined\r\n if (places === undefined) {\r\n return result;\r\n } else {\r\n // Return error if places is nonnumeric\r\n if (isNaN(places)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if places is negative\r\n if (places < 0) {\r\n return error.num;\r\n }\r\n \r\n // Truncate places in case it is not an integer\r\n places = Math.floor(places);\r\n \r\n // Pad return value with leading 0s (zeros) if necessary (using\r\n // Underscore.string)\r\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\r\n }\r\n };\r\n \r\n exports.IMABS = function(inumber) {\r\n // Lookup real and imaginary coefficients using exports.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n // Return error if either coefficient is not a number\r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Return absolute value of complex number\r\n return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\r\n };\r\n \r\n exports.IMAGINARY = function(inumber) {\r\n if (inumber === undefined || inumber === true || inumber === false) {\r\n return error.value;\r\n }\r\n \r\n // Return 0 if inumber is equal to 0\r\n if (inumber === 0 || inumber === '0') {\r\n return 0;\r\n }\r\n \r\n // Handle special cases\r\n if (['i', 'j'].indexOf(inumber) >= 0) {\r\n return 1;\r\n }\r\n \r\n // Normalize imaginary coefficient\r\n inumber = inumber.replace('+i', '+1i').replace('-i', '-1i').replace('+j', '+1j').replace('-j', '-1j');\r\n \r\n // Lookup sign\r\n var plus = inumber.indexOf('+');\r\n var minus = inumber.indexOf('-');\r\n if (plus === 0) {\r\n plus = inumber.indexOf('+', 1);\r\n }\r\n \r\n if (minus === 0) {\r\n minus = inumber.indexOf('-', 1);\r\n }\r\n \r\n // Lookup imaginary unit\r\n var last = inumber.substring(inumber.length - 1, inumber.length);\r\n var unit = (last === 'i' || last === 'j');\r\n \r\n if (plus >= 0 || minus >= 0) {\r\n // Return error if imaginary unit is neither i nor j\r\n if (!unit) {\r\n return error.num;\r\n }\r\n \r\n // Return imaginary coefficient of complex number\r\n if (plus >= 0) {\r\n return (isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))) ?\r\n error.num :\r\n Number(inumber.substring(plus + 1, inumber.length - 1));\r\n } else {\r\n return (isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))) ?\r\n error.num :\r\n -Number(inumber.substring(minus + 1, inumber.length - 1));\r\n }\r\n } else {\r\n if (unit) {\r\n return (isNaN(inumber.substring(0, inumber.length - 1))) ? error.num : inumber.substring(0, inumber.length - 1);\r\n } else {\r\n return (isNaN(inumber)) ? error.num : 0;\r\n }\r\n }\r\n };\r\n \r\n exports.IMARGUMENT = function(inumber) {\r\n // Lookup real and imaginary coefficients using exports.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n // Return error if either coefficient is not a number\r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if inumber is equal to zero\r\n if (x === 0 && y === 0) {\r\n return error.div0;\r\n }\r\n \r\n // Return PI/2 if x is equal to zero and y is positive\r\n if (x === 0 && y > 0) {\r\n return Math.PI / 2;\r\n }\r\n \r\n // Return -PI/2 if x is equal to zero and y is negative\r\n if (x === 0 && y < 0) {\r\n return -Math.PI / 2;\r\n }\r\n \r\n // Return zero if x is negative and y is equal to zero\r\n if (y === 0 && x > 0) {\r\n return 0;\r\n }\r\n \r\n // Return zero if x is negative and y is equal to zero\r\n if (y === 0 && x < 0) {\r\n return -Math.PI;\r\n }\r\n \r\n // Return argument of complex number\r\n if (x > 0) {\r\n return Math.atan(y / x);\r\n } else if (x < 0 && y >= 0) {\r\n return Math.atan(y / x) + Math.PI;\r\n } else {\r\n return Math.atan(y / x) - Math.PI;\r\n }\r\n };\r\n \r\n exports.IMCONJUGATE = function(inumber) {\r\n // Lookup real and imaginary coefficients using exports.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Return conjugate of complex number\r\n return (y !== 0) ? exports.COMPLEX(x, -y, unit) : inumber;\r\n };\r\n \r\n exports.IMCOS = function(inumber) {\r\n // Lookup real and imaginary coefficients using exports.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Return cosine of complex number\r\n return exports.COMPLEX(Math.cos(x) * (Math.exp(y) + Math.exp(-y)) / 2, -Math.sin(x) * (Math.exp(y) - Math.exp(-y)) / 2, unit);\r\n };\r\n \r\n exports.IMCOSH = function(inumber) {\r\n // Lookup real and imaginary coefficients using exports.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Return hyperbolic cosine of complex number\r\n return exports.COMPLEX(Math.cos(y) * (Math.exp(x) + Math.exp(-x)) / 2, Math.sin(y) * (Math.exp(x) - Math.exp(-x)) / 2, unit);\r\n };\r\n \r\n exports.IMCOT = function(inumber) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Return cotangent of complex number\r\n return exports.IMDIV(exports.IMCOS(inumber), exports.IMSIN(inumber));\r\n };\r\n \r\n exports.IMDIV = function(inumber1, inumber2) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var a = exports.IMREAL(inumber1);\r\n var b = exports.IMAGINARY(inumber1);\r\n var c = exports.IMREAL(inumber2);\r\n var d = exports.IMAGINARY(inumber2);\r\n \r\n if (utils.anyIsError(a, b, c, d)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit1 = inumber1.substring(inumber1.length - 1);\r\n var unit2 = inumber2.substring(inumber2.length - 1);\r\n var unit = 'i';\r\n if (unit1 === 'j') {\r\n unit = 'j';\r\n } else if (unit2 === 'j') {\r\n unit = 'j';\r\n }\r\n \r\n // Return error if inumber2 is null\r\n if (c === 0 && d === 0) {\r\n return error.num;\r\n }\r\n \r\n // Return exponential of complex number\r\n var den = c * c + d * d;\r\n return exports.COMPLEX((a * c + b * d) / den, (b * c - a * d) / den, unit);\r\n };\r\n \r\n exports.IMEXP = function(inumber) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Return exponential of complex number\r\n var e = Math.exp(x);\r\n return exports.COMPLEX(e * Math.cos(y), e * Math.sin(y), unit);\r\n };\r\n \r\n exports.IMLN = function(inumber) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Return exponential of complex number\r\n return exports.COMPLEX(Math.log(Math.sqrt(x * x + y * y)), Math.atan(y / x), unit);\r\n };\r\n \r\n exports.IMLOG10 = function(inumber) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Return exponential of complex number\r\n return exports.COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(10), Math.atan(y / x) / Math.log(10), unit);\r\n };\r\n \r\n exports.IMLOG2 = function(inumber) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Return exponential of complex number\r\n return exports.COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(2), Math.atan(y / x) / Math.log(2), unit);\r\n };\r\n \r\n exports.IMPOWER = function(inumber, number) {\r\n number = utils.parseNumber(number);\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n if (utils.anyIsError(number, x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Calculate power of modulus\r\n var p = Math.pow(exports.IMABS(inumber), number);\r\n \r\n // Calculate argument\r\n var t = exports.IMARGUMENT(inumber);\r\n \r\n // Return exponential of complex number\r\n return exports.COMPLEX(p * Math.cos(number * t), p * Math.sin(number * t), unit);\r\n };\r\n \r\n exports.IMPRODUCT = function() {\r\n // Initialize result\r\n var result = arguments[0];\r\n \r\n // Loop on all numbers\r\n for (var i = 1; i < arguments.length; i++) {\r\n // Lookup coefficients of two complex numbers\r\n var a = exports.IMREAL(result);\r\n var b = exports.IMAGINARY(result);\r\n var c = exports.IMREAL(arguments[i]);\r\n var d = exports.IMAGINARY(arguments[i]);\r\n \r\n if (utils.anyIsError(a, b, c, d)) {\r\n return error.value;\r\n }\r\n \r\n // Complute product of two complex numbers\r\n result = exports.COMPLEX(a * c - b * d, a * d + b * c);\r\n }\r\n \r\n // Return product of complex numbers\r\n return result;\r\n };\r\n \r\n exports.IMREAL = function(inumber) {\r\n if (inumber === undefined || inumber === true || inumber === false) {\r\n return error.value;\r\n }\r\n \r\n // Return 0 if inumber is equal to 0\r\n if (inumber === 0 || inumber === '0') {\r\n return 0;\r\n }\r\n \r\n // Handle special cases\r\n if (['i', '+i', '1i', '+1i', '-i', '-1i', 'j', '+j', '1j', '+1j', '-j', '-1j'].indexOf(inumber) >= 0) {\r\n return 0;\r\n }\r\n \r\n // Lookup sign\r\n var plus = inumber.indexOf('+');\r\n var minus = inumber.indexOf('-');\r\n if (plus === 0) {\r\n plus = inumber.indexOf('+', 1);\r\n }\r\n if (minus === 0) {\r\n minus = inumber.indexOf('-', 1);\r\n }\r\n \r\n // Lookup imaginary unit\r\n var last = inumber.substring(inumber.length - 1, inumber.length);\r\n var unit = (last === 'i' || last === 'j');\r\n \r\n if (plus >= 0 || minus >= 0) {\r\n // Return error if imaginary unit is neither i nor j\r\n if (!unit) {\r\n return error.num;\r\n }\r\n \r\n // Return real coefficient of complex number\r\n if (plus >= 0) {\r\n return (isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))) ?\r\n error.num :\r\n Number(inumber.substring(0, plus));\r\n } else {\r\n return (isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))) ?\r\n error.num :\r\n Number(inumber.substring(0, minus));\r\n }\r\n } else {\r\n if (unit) {\r\n return (isNaN(inumber.substring(0, inumber.length - 1))) ? error.num : 0;\r\n } else {\r\n return (isNaN(inumber)) ? error.num : inumber;\r\n }\r\n }\r\n };\r\n \r\n exports.IMSEC = function(inumber) {\r\n // Return error if inumber is a logical value\r\n if (inumber === true || inumber === false) {\r\n return error.value;\r\n }\r\n \r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Return secant of complex number\r\n return exports.IMDIV('1', exports.IMCOS(inumber));\r\n };\r\n \r\n exports.IMSECH = function(inumber) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Return hyperbolic secant of complex number\r\n return exports.IMDIV('1', exports.IMCOSH(inumber));\r\n };\r\n \r\n exports.IMSIN = function(inumber) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Return sine of complex number\r\n return exports.COMPLEX(Math.sin(x) * (Math.exp(y) + Math.exp(-y)) / 2, Math.cos(x) * (Math.exp(y) - Math.exp(-y)) / 2, unit);\r\n };\r\n \r\n exports.IMSINH = function(inumber) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Return hyperbolic sine of complex number\r\n return exports.COMPLEX(Math.cos(y) * (Math.exp(x) - Math.exp(-x)) / 2, Math.sin(y) * (Math.exp(x) + Math.exp(-x)) / 2, unit);\r\n };\r\n \r\n exports.IMSQRT = function(inumber) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit = inumber.substring(inumber.length - 1);\r\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n \r\n // Calculate power of modulus\r\n var s = Math.sqrt(exports.IMABS(inumber));\r\n \r\n // Calculate argument\r\n var t = exports.IMARGUMENT(inumber);\r\n \r\n // Return exponential of complex number\r\n return exports.COMPLEX(s * Math.cos(t / 2), s * Math.sin(t / 2), unit);\r\n };\r\n \r\n exports.IMCSC = function (inumber) {\r\n // Return error if inumber is a logical value\r\n if (inumber === true || inumber === false) {\r\n return error.value;\r\n }\r\n \r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n // Return error if either coefficient is not a number\r\n if (utils.anyIsError(x, y)) {\r\n return error.num;\r\n }\r\n \r\n // Return cosecant of complex number\r\n return exports.IMDIV('1', exports.IMSIN(inumber));\r\n };\r\n \r\n exports.IMCSCH = function (inumber) {\r\n // Return error if inumber is a logical value\r\n if (inumber === true || inumber === false) {\r\n return error.value;\r\n }\r\n \r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n // Return error if either coefficient is not a number\r\n if (utils.anyIsError(x, y)) {\r\n return error.num;\r\n }\r\n \r\n // Return hyperbolic cosecant of complex number\r\n return exports.IMDIV('1', exports.IMSINH(inumber));\r\n };\r\n \r\n exports.IMSUB = function(inumber1, inumber2) {\r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var a = this.IMREAL(inumber1);\r\n var b = this.IMAGINARY(inumber1);\r\n var c = this.IMREAL(inumber2);\r\n var d = this.IMAGINARY(inumber2);\r\n \r\n if (utils.anyIsError(a, b, c, d)) {\r\n return error.value;\r\n }\r\n \r\n // Lookup imaginary unit\r\n var unit1 = inumber1.substring(inumber1.length - 1);\r\n var unit2 = inumber2.substring(inumber2.length - 1);\r\n var unit = 'i';\r\n if (unit1 === 'j') {\r\n unit = 'j';\r\n } else if (unit2 === 'j') {\r\n unit = 'j';\r\n }\r\n \r\n // Return _ of two complex numbers\r\n return this.COMPLEX(a - c, b - d, unit);\r\n };\r\n \r\n exports.IMSUM = function() {\r\n var args = utils.flatten(arguments);\r\n \r\n // Initialize result\r\n var result = args[0];\r\n \r\n // Loop on all numbers\r\n for (var i = 1; i < args.length; i++) {\r\n // Lookup coefficients of two complex numbers\r\n var a = this.IMREAL(result);\r\n var b = this.IMAGINARY(result);\r\n var c = this.IMREAL(args[i]);\r\n var d = this.IMAGINARY(args[i]);\r\n \r\n if (utils.anyIsError(a, b, c, d)) {\r\n return error.value;\r\n }\r\n \r\n // Complute product of two complex numbers\r\n result = this.COMPLEX(a + c, b + d);\r\n }\r\n \r\n // Return sum of complex numbers\r\n return result;\r\n };\r\n \r\n exports.IMTAN = function(inumber) {\r\n // Return error if inumber is a logical value\r\n if (inumber === true || inumber === false) {\r\n return error.value;\r\n }\r\n \r\n // Lookup real and imaginary coefficients using Formula.js\r\n // [http://formulajs.org]\r\n var x = exports.IMREAL(inumber);\r\n var y = exports.IMAGINARY(inumber);\r\n \r\n if (utils.anyIsError(x, y)) {\r\n return error.value;\r\n }\r\n \r\n // Return tangent of complex number\r\n return this.IMDIV(this.IMSIN(inumber), this.IMCOS(inumber));\r\n };\r\n \r\n exports.OCT2BIN = function(number, places) {\r\n // Return error if number is not hexadecimal or contains more than ten\r\n // characters (10 digits)\r\n if (!/^[0-7]{1,10}$/.test(number)) {\r\n return error.num;\r\n }\r\n \r\n // Check if number is negative\r\n var negative = (number.length === 10 && number.substring(0, 1) === '7') ? true : false;\r\n \r\n // Convert octal number to decimal\r\n var decimal = (negative) ? parseInt(number, 8) - 1073741824 : parseInt(number, 8);\r\n \r\n // Return error if number is lower than -512 or greater than 511\r\n if (decimal < -512 || decimal > 511) {\r\n return error.num;\r\n }\r\n \r\n // Ignore places and return a 10-character binary number if number is\r\n // negative\r\n if (negative) {\r\n return '1' + REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2);\r\n }\r\n \r\n // Convert decimal number to binary\r\n var result = decimal.toString(2);\r\n \r\n // Return binary number using the minimum number of characters necessary\r\n // if places is undefined\r\n if (typeof places === 'undefined') {\r\n return result;\r\n } else {\r\n // Return error if places is nonnumeric\r\n if (isNaN(places)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if places is negative\r\n if (places < 0) {\r\n return error.num;\r\n }\r\n \r\n // Truncate places in case it is not an integer\r\n places = Math.floor(places);\r\n \r\n // Pad return value with leading 0s (zeros) if necessary (using\r\n // Underscore.string)\r\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\r\n }\r\n };\r\n \r\n exports.OCT2DEC = function(number) {\r\n // Return error if number is not octal or contains more than ten\r\n // characters (10 digits)\r\n if (!/^[0-7]{1,10}$/.test(number)) {\r\n return error.num;\r\n }\r\n \r\n // Convert octal number to decimal\r\n var decimal = parseInt(number, 8);\r\n \r\n // Return decimal number\r\n return (decimal >= 536870912) ? decimal - 1073741824 : decimal;\r\n };\r\n \r\n exports.OCT2HEX = function(number, places) {\r\n // Return error if number is not octal or contains more than ten\r\n // characters (10 digits)\r\n if (!/^[0-7]{1,10}$/.test(number)) {\r\n return error.num;\r\n }\r\n \r\n // Convert octal number to decimal\r\n var decimal = parseInt(number, 8);\r\n \r\n // Ignore places and return a 10-character octal number if number is\r\n // negative\r\n if (decimal >= 536870912) {\r\n return 'ff' + (decimal + 3221225472).toString(16);\r\n }\r\n \r\n // Convert decimal number to hexadecimal\r\n var result = decimal.toString(16);\r\n \r\n // Return hexadecimal number using the minimum number of characters\r\n // necessary if places is undefined\r\n if (places === undefined) {\r\n return result;\r\n } else {\r\n // Return error if places is nonnumeric\r\n if (isNaN(places)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if places is negative\r\n if (places < 0) {\r\n return error.num;\r\n }\r\n \r\n // Truncate places in case it is not an integer\r\n places = Math.floor(places);\r\n \r\n // Pad return value with leading 0s (zeros) if necessary (using\r\n // Underscore.string)\r\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\r\n }\r\n };\r\n \r\n return exports;\r\n })();\r\n \r\n jexcel.methods.financial = (function() {\r\n var exports = {};\r\n \r\n function validDate(d) {\r\n return d && d.getTime && !isNaN(d.getTime());\r\n }\r\n \r\n function ensureDate(d) {\r\n return (d instanceof Date)?d:new Date(d);\r\n }\r\n \r\n exports.ACCRINT = function(issue, first, settlement, rate, par, frequency, basis) {\r\n // Return error if either date is invalid\r\n issue = ensureDate(issue);\r\n first = ensureDate(first);\r\n settlement = ensureDate(settlement);\r\n if (!validDate(issue) || !validDate(first) || !validDate(settlement)) {\r\n return '#VALUE!';\r\n }\r\n \r\n // Return error if either rate or par are lower than or equal to zero\r\n if (rate <= 0 || par <= 0) {\r\n return '#NUM!';\r\n }\r\n \r\n // Return error if frequency is neither 1, 2, or 4\r\n if ([1, 2, 4].indexOf(frequency) === -1) {\r\n return '#NUM!';\r\n }\r\n \r\n // Return error if basis is neither 0, 1, 2, 3, or 4\r\n if ([0, 1, 2, 3, 4].indexOf(basis) === -1) {\r\n return '#NUM!';\r\n }\r\n \r\n // Return error if settlement is before or equal to issue\r\n if (settlement <= issue) {\r\n return '#NUM!';\r\n }\r\n \r\n // Set default values\r\n par = par || 0;\r\n basis = basis || 0;\r\n \r\n // Compute accrued interest\r\n return par * rate * YEARFRAC(issue, settlement, basis);\r\n };\r\n \r\n exports.ACCRINTM = null;\r\n \r\n exports.AMORDEGRC = null;\r\n \r\n exports.AMORLINC = null;\r\n \r\n exports.COUPDAYBS = null;\r\n \r\n exports.COUPDAYS = null;\r\n \r\n exports.COUPDAYSNC = null;\r\n \r\n exports.COUPNCD = null;\r\n \r\n exports.COUPNUM = null;\r\n \r\n exports.COUPPCD = null;\r\n \r\n exports.CUMIPMT = function(rate, periods, value, start, end, type) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n // Credits: Hannes Stiebitzhofer for the translations of function and\r\n // variable names\r\n // Requires exports.FV() and exports.PMT() from exports.js\r\n // [http://stoic.com/exports/]\r\n \r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n value = utils.parseNumber(value);\r\n if (utils.anyIsError(rate, periods, value)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if either rate, periods, or value are lower than or\r\n // equal to zero\r\n if (rate <= 0 || periods <= 0 || value <= 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if start < 1, end < 1, or start > end\r\n if (start < 1 || end < 1 || start > end) {\r\n return error.num;\r\n }\r\n \r\n // Return error if type is neither 0 nor 1\r\n if (type !== 0 && type !== 1) {\r\n return error.num;\r\n }\r\n \r\n // Compute cumulative interest\r\n var payment = exports.PMT(rate, periods, value, 0, type);\r\n var interest = 0;\r\n \r\n if (start === 1) {\r\n if (type === 0) {\r\n interest = -value;\r\n start++;\r\n }\r\n }\r\n \r\n for (var i = start; i <= end; i++) {\r\n if (type === 1) {\r\n interest += exports.FV(rate, i - 2, payment, value, 1) - payment;\r\n } else {\r\n interest += exports.FV(rate, i - 1, payment, value, 0);\r\n }\r\n }\r\n interest *= rate;\r\n \r\n // Return cumulative interest\r\n return interest;\r\n };\r\n \r\n exports.CUMPRINC = function(rate, periods, value, start, end, type) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n // Credits: Hannes Stiebitzhofer for the translations of function and\r\n // variable names\r\n \r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n value = utils.parseNumber(value);\r\n if (utils.anyIsError(rate, periods, value)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if either rate, periods, or value are lower than or\r\n // equal to zero\r\n if (rate <= 0 || periods <= 0 || value <= 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if start < 1, end < 1, or start > end\r\n if (start < 1 || end < 1 || start > end) {\r\n return error.num;\r\n }\r\n \r\n // Return error if type is neither 0 nor 1\r\n if (type !== 0 && type !== 1) {\r\n return error.num;\r\n }\r\n \r\n // Compute cumulative principal\r\n var payment = exports.PMT(rate, periods, value, 0, type);\r\n var principal = 0;\r\n if (start === 1) {\r\n if (type === 0) {\r\n principal = payment + value * rate;\r\n } else {\r\n principal = payment;\r\n }\r\n start++;\r\n }\r\n for (var i = start; i <= end; i++) {\r\n if (type > 0) {\r\n principal += payment - (exports.FV(rate, i - 2, payment, value, 1) - payment) * rate;\r\n } else {\r\n principal += payment - exports.FV(rate, i - 1, payment, value, 0) * rate;\r\n }\r\n }\r\n \r\n // Return cumulative principal\r\n return principal;\r\n };\r\n \r\n exports.DB = function(cost, salvage, life, period, month) {\r\n // Initialize month\r\n month = (month === undefined) ? 12 : month;\r\n \r\n cost = utils.parseNumber(cost);\r\n salvage = utils.parseNumber(salvage);\r\n life = utils.parseNumber(life);\r\n period = utils.parseNumber(period);\r\n month = utils.parseNumber(month);\r\n if (utils.anyIsError(cost, salvage, life, period, month)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if any of the parameters is negative\r\n if (cost < 0 || salvage < 0 || life < 0 || period < 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if month is not an integer between 1 and 12\r\n if ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].indexOf(month) === -1) {\r\n return error.num;\r\n }\r\n \r\n // Return error if period is greater than life\r\n if (period > life) {\r\n return error.num;\r\n }\r\n \r\n // Return 0 (zero) if salvage is greater than or equal to cost\r\n if (salvage >= cost) {\r\n return 0;\r\n }\r\n \r\n // Rate is rounded to three decimals places\r\n var rate = (1 - Math.pow(salvage / cost, 1 / life)).toFixed(3);\r\n \r\n // Compute initial depreciation\r\n var initial = cost * rate * month / 12;\r\n \r\n // Compute total depreciation\r\n var total = initial;\r\n var current = 0;\r\n var ceiling = (period === life) ? life - 1 : period;\r\n for (var i = 2; i <= ceiling; i++) {\r\n current = (cost - total) * rate;\r\n total += current;\r\n }\r\n \r\n // Depreciation for the first and last periods are special cases\r\n if (period === 1) {\r\n // First period\r\n return initial;\r\n } else if (period === life) {\r\n // Last period\r\n return (cost - total) * rate;\r\n } else {\r\n return current;\r\n }\r\n };\r\n \r\n exports.DDB = function(cost, salvage, life, period, factor) {\r\n // Initialize factor\r\n factor = (factor === undefined) ? 2 : factor;\r\n \r\n cost = utils.parseNumber(cost);\r\n salvage = utils.parseNumber(salvage);\r\n life = utils.parseNumber(life);\r\n period = utils.parseNumber(period);\r\n factor = utils.parseNumber(factor);\r\n if (utils.anyIsError(cost, salvage, life, period, factor)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if any of the parameters is negative or if factor is\r\n // null\r\n if (cost < 0 || salvage < 0 || life < 0 || period < 0 || factor <= 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if period is greater than life\r\n if (period > life) {\r\n return error.num;\r\n }\r\n \r\n // Return 0 (zero) if salvage is greater than or equal to cost\r\n if (salvage >= cost) {\r\n return 0;\r\n }\r\n \r\n // Compute depreciation\r\n var total = 0;\r\n var current = 0;\r\n for (var i = 1; i <= period; i++) {\r\n current = Math.min((cost - total) * (factor / life), (cost - salvage - total));\r\n total += current;\r\n }\r\n \r\n // Return depreciation\r\n return current;\r\n };\r\n \r\n exports.DISC = null;\r\n \r\n exports.DOLLARDE = function(dollar, fraction) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n \r\n dollar = utils.parseNumber(dollar);\r\n fraction = utils.parseNumber(fraction);\r\n if (utils.anyIsError(dollar, fraction)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if fraction is negative\r\n if (fraction < 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if fraction is greater than or equal to 0 and less than\r\n // 1\r\n if (fraction >= 0 && fraction < 1) {\r\n return error.div0;\r\n }\r\n \r\n // Truncate fraction if it is not an integer\r\n fraction = parseInt(fraction, 10);\r\n \r\n // Compute integer part\r\n var result = parseInt(dollar, 10);\r\n \r\n // Add decimal part\r\n result += (dollar % 1) * Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN10)) / fraction;\r\n \r\n // Round result\r\n var power = Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN2) + 1);\r\n result = Math.round(result * power) / power;\r\n \r\n // Return converted dollar price\r\n return result;\r\n };\r\n \r\n exports.DOLLARFR = function(dollar, fraction) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n \r\n dollar = utils.parseNumber(dollar);\r\n fraction = utils.parseNumber(fraction);\r\n if (utils.anyIsError(dollar, fraction)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if fraction is negative\r\n if (fraction < 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if fraction is greater than or equal to 0 and less than\r\n // 1\r\n if (fraction >= 0 && fraction < 1) {\r\n return error.div0;\r\n }\r\n \r\n // Truncate fraction if it is not an integer\r\n fraction = parseInt(fraction, 10);\r\n \r\n // Compute integer part\r\n var result = parseInt(dollar, 10);\r\n \r\n // Add decimal part\r\n result += (dollar % 1) * Math.pow(10, -Math.ceil(Math.log(fraction) / Math.LN10)) * fraction;\r\n \r\n // Return converted dollar price\r\n return result;\r\n };\r\n \r\n exports.DURATION = null;\r\n \r\n exports.EFFECT = function(rate, periods) {\r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n if (utils.anyIsError(rate, periods)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if rate <=0 or periods < 1\r\n if (rate <= 0 || periods < 1) {\r\n return error.num;\r\n }\r\n \r\n // Truncate periods if it is not an integer\r\n periods = parseInt(periods, 10);\r\n \r\n // Return effective annual interest rate\r\n return Math.pow(1 + rate / periods, periods) - 1;\r\n };\r\n \r\n exports.FV = function(rate, periods, payment, value, type) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n \r\n value = value || 0;\r\n type = type || 0;\r\n \r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n payment = utils.parseNumber(payment);\r\n value = utils.parseNumber(value);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, periods, payment, value, type)) {\r\n return error.value;\r\n }\r\n \r\n // Return future value\r\n var result;\r\n if (rate === 0) {\r\n result = value + payment * periods;\r\n } else {\r\n var term = Math.pow(1 + rate, periods);\r\n if (type === 1) {\r\n result = value * term + payment * (1 + rate) * (term - 1) / rate;\r\n } else {\r\n result = value * term + payment * (term - 1) / rate;\r\n }\r\n }\r\n return -result;\r\n };\r\n \r\n exports.FVSCHEDULE = function(principal, schedule) {\r\n principal = utils.parseNumber(principal);\r\n schedule = utils.parseNumberArray(utils.flatten(schedule));\r\n if (utils.anyIsError(principal, schedule)) {\r\n return error.value;\r\n }\r\n \r\n var n = schedule.length;\r\n var future = principal;\r\n \r\n // Apply all interests in schedule\r\n for (var i = 0; i < n; i++) {\r\n // Apply scheduled interest\r\n future *= 1 + schedule[i];\r\n }\r\n \r\n // Return future value\r\n return future;\r\n };\r\n \r\n exports.INTRATE = null;\r\n \r\n exports.IPMT = function(rate, period, periods, present, future, type) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n \r\n future = future || 0;\r\n type = type || 0;\r\n \r\n rate = utils.parseNumber(rate);\r\n period = utils.parseNumber(period);\r\n periods = utils.parseNumber(periods);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, period, periods, present, future, type)) {\r\n return error.value;\r\n }\r\n \r\n // Compute payment\r\n var payment = exports.PMT(rate, periods, present, future, type);\r\n \r\n // Compute interest\r\n var interest;\r\n if (period === 1) {\r\n if (type === 1) {\r\n interest = 0;\r\n } else {\r\n interest = -present;\r\n }\r\n } else {\r\n if (type === 1) {\r\n interest = exports.FV(rate, period - 2, payment, present, 1) - payment;\r\n } else {\r\n interest = exports.FV(rate, period - 1, payment, present, 0);\r\n }\r\n }\r\n \r\n // Return interest\r\n return interest * rate;\r\n };\r\n \r\n exports.IRR = function(values, guess) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n \r\n guess = guess || 0;\r\n \r\n values = utils.parseNumberArray(utils.flatten(values));\r\n guess = utils.parseNumber(guess);\r\n if (utils.anyIsError(values, guess)) {\r\n return error.value;\r\n }\r\n \r\n // Calculates the resulting amount\r\n var irrResult = function(values, dates, rate) {\r\n var r = rate + 1;\r\n var result = values[0];\r\n for (var i = 1; i < values.length; i++) {\r\n result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);\r\n }\r\n return result;\r\n };\r\n \r\n // Calculates the first derivation\r\n var irrResultDeriv = function(values, dates, rate) {\r\n var r = rate + 1;\r\n var result = 0;\r\n for (var i = 1; i < values.length; i++) {\r\n var frac = (dates[i] - dates[0]) / 365;\r\n result -= frac * values[i] / Math.pow(r, frac + 1);\r\n }\r\n return result;\r\n };\r\n \r\n // Initialize dates and check that values contains at least one positive\r\n // value and one negative value\r\n var dates = [];\r\n var positive = false;\r\n var negative = false;\r\n for (var i = 0; i < values.length; i++) {\r\n dates[i] = (i === 0) ? 0 : dates[i - 1] + 365;\r\n if (values[i] > 0) {\r\n positive = true;\r\n }\r\n if (values[i] < 0) {\r\n negative = true;\r\n }\r\n }\r\n \r\n // Return error if values does not contain at least one positive value\r\n // and one negative value\r\n if (!positive || !negative) {\r\n return error.num;\r\n }\r\n \r\n // Initialize guess and resultRate\r\n guess = (guess === undefined) ? 0.1 : guess;\r\n var resultRate = guess;\r\n \r\n // Set maximum epsilon for end of iteration\r\n var epsMax = 1e-10;\r\n \r\n // Implement Newton's method\r\n var newRate, epsRate, resultValue;\r\n var contLoop = true;\r\n do {\r\n resultValue = irrResult(values, dates, resultRate);\r\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\r\n epsRate = Math.abs(newRate - resultRate);\r\n resultRate = newRate;\r\n contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);\r\n } while (contLoop);\r\n \r\n // Return internal rate of return\r\n return resultRate;\r\n };\r\n \r\n exports.ISPMT = function(rate, period, periods, value) {\r\n rate = utils.parseNumber(rate);\r\n period = utils.parseNumber(period);\r\n periods = utils.parseNumber(periods);\r\n value = utils.parseNumber(value);\r\n if (utils.anyIsError(rate, period, periods, value)) {\r\n return error.value;\r\n }\r\n \r\n // Return interest\r\n return value * rate * (period / periods - 1);\r\n };\r\n \r\n exports.MDURATION = null;\r\n \r\n exports.MIRR = function(values, finance_rate, reinvest_rate) {\r\n values = utils.parseNumberArray(utils.flatten(values));\r\n finance_rate = utils.parseNumber(finance_rate);\r\n reinvest_rate = utils.parseNumber(reinvest_rate);\r\n if (utils.anyIsError(values, finance_rate, reinvest_rate)) {\r\n return error.value;\r\n }\r\n \r\n // Initialize number of values\r\n var n = values.length;\r\n \r\n // Lookup payments (negative values) and incomes (positive values)\r\n var payments = [];\r\n var incomes = [];\r\n for (var i = 0; i < n; i++) {\r\n if (values[i] < 0) {\r\n payments.push(values[i]);\r\n } else {\r\n incomes.push(values[i]);\r\n }\r\n }\r\n \r\n // Return modified internal rate of return\r\n var num = -exports.NPV(reinvest_rate, incomes) * Math.pow(1 + reinvest_rate, n - 1);\r\n var den = exports.NPV(finance_rate, payments) * (1 + finance_rate);\r\n return Math.pow(num / den, 1 / (n - 1)) - 1;\r\n };\r\n \r\n exports.NOMINAL = function(rate, periods) {\r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n if (utils.anyIsError(rate, periods)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if rate <=0 or periods < 1\r\n if (rate <= 0 || periods < 1) {\r\n return error.num;\r\n }\r\n \r\n // Truncate periods if it is not an integer\r\n periods = parseInt(periods, 10);\r\n \r\n // Return nominal annual interest rate\r\n return (Math.pow(rate + 1, 1 / periods) - 1) * periods;\r\n };\r\n \r\n exports.NPER = function(rate, payment, present, future, type) {\r\n type = (type === undefined) ? 0 : type;\r\n future = (future === undefined) ? 0 : future;\r\n \r\n rate = utils.parseNumber(rate);\r\n payment = utils.parseNumber(payment);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, payment, present, future, type)) {\r\n return error.value;\r\n }\r\n \r\n // Return number of periods\r\n var num = payment * (1 + rate * type) - future * rate;\r\n var den = (present * rate + payment * (1 + rate * type));\r\n return Math.log(num / den) / Math.log(1 + rate);\r\n };\r\n \r\n exports.NPV = function() {\r\n var args = utils.parseNumberArray(utils.flatten(arguments));\r\n if (args instanceof Error) {\r\n return args;\r\n }\r\n \r\n // Lookup rate\r\n var rate = args[0];\r\n \r\n // Initialize net present value\r\n var value = 0;\r\n \r\n // Loop on all values\r\n for (var j = 1; j < args.length; j++) {\r\n value += args[j] / Math.pow(1 + rate, j);\r\n }\r\n \r\n // Return net present value\r\n return value;\r\n };\r\n \r\n exports.ODDFPRICE = null;\r\n \r\n exports.ODDFYIELD = null;\r\n \r\n exports.ODDLPRICE = null;\r\n \r\n exports.ODDLYIELD = null;\r\n \r\n exports.PDURATION = function(rate, present, future) {\r\n rate = utils.parseNumber(rate);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n if (utils.anyIsError(rate, present, future)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if rate <=0\r\n if (rate <= 0) {\r\n return error.num;\r\n }\r\n \r\n // Return number of periods\r\n return (Math.log(future) - Math.log(present)) / Math.log(1 + rate);\r\n };\r\n \r\n exports.PMT = function(rate, periods, present, future, type) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n \r\n future = future || 0;\r\n type = type || 0;\r\n \r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, periods, present, future, type)) {\r\n return error.value;\r\n }\r\n \r\n // Return payment\r\n var result;\r\n if (rate === 0) {\r\n result = (present + future) / periods;\r\n } else {\r\n var term = Math.pow(1 + rate, periods);\r\n if (type === 1) {\r\n result = (future * rate / (term - 1) + present * rate / (1 - 1 / term)) / (1 + rate);\r\n } else {\r\n result = future * rate / (term - 1) + present * rate / (1 - 1 / term);\r\n }\r\n }\r\n return -result;\r\n };\r\n \r\n exports.PPMT = function(rate, period, periods, present, future, type) {\r\n future = future || 0;\r\n type = type || 0;\r\n \r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, periods, present, future, type)) {\r\n return error.value;\r\n }\r\n \r\n return exports.PMT(rate, periods, present, future, type) - exports.IPMT(rate, period, periods, present, future, type);\r\n };\r\n \r\n exports.PRICE = null;\r\n \r\n exports.PRICEDISC = null;\r\n \r\n exports.PRICEMAT = null;\r\n \r\n exports.PV = function(rate, periods, payment, future, type) {\r\n future = future || 0;\r\n type = type || 0;\r\n \r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n payment = utils.parseNumber(payment);\r\n future = utils.parseNumber(future);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, periods, payment, future, type)) {\r\n return error.value;\r\n }\r\n \r\n // Return present value\r\n if (rate === 0) {\r\n return -payment * periods - future;\r\n } else {\r\n return (((1 - Math.pow(1 + rate, periods)) / rate) * payment * (1 + rate * type) - future) / Math.pow(1 + rate, periods);\r\n }\r\n };\r\n \r\n exports.RATE = function(periods, payment, present, future, type, guess) {\r\n // Credits: rabugento\r\n \r\n guess = (guess === undefined) ? 0.01 : guess;\r\n future = (future === undefined) ? 0 : future;\r\n type = (type === undefined) ? 0 : type;\r\n \r\n periods = utils.parseNumber(periods);\r\n payment = utils.parseNumber(payment);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n type = utils.parseNumber(type);\r\n guess = utils.parseNumber(guess);\r\n if (utils.anyIsError(periods, payment, present, future, type, guess)) {\r\n return error.value;\r\n }\r\n \r\n // Set maximum epsilon for end of iteration\r\n var epsMax = 1e-6;\r\n \r\n // Set maximum number of iterations\r\n var iterMax = 100;\r\n var iter = 0;\r\n var close = false;\r\n var rate = guess;\r\n \r\n while (iter < iterMax && !close) {\r\n var t1 = Math.pow(rate + 1, periods);\r\n var t2 = Math.pow(rate + 1, periods - 1);\r\n \r\n var f1 = future + t1 * present + payment * (t1 - 1) * (rate * type + 1) / rate;\r\n var f2 = periods * t2 * present - payment * (t1 - 1) *(rate * type + 1) / Math.pow(rate,2);\r\n var f3 = periods * payment * t2 * (rate * type + 1) / rate + payment * (t1 - 1) * type / rate;\r\n \r\n var newRate = rate - f1 / (f2 + f3);\r\n \r\n if (Math.abs(newRate - rate) < epsMax) close = true;\r\n iter++\r\n rate = newRate;\r\n }\r\n \r\n if (!close) return Number.NaN + rate;\r\n return rate;\r\n };\r\n \r\n // TODO\r\n exports.RECEIVED = null;\r\n \r\n exports.RRI = function(periods, present, future) {\r\n periods = utils.parseNumber(periods);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n if (utils.anyIsError(periods, present, future)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if periods or present is equal to 0 (zero)\r\n if (periods === 0 || present === 0) {\r\n return error.num;\r\n }\r\n \r\n // Return equivalent interest rate\r\n return Math.pow(future / present, 1 / periods) - 1;\r\n };\r\n \r\n exports.SLN = function(cost, salvage, life) {\r\n cost = utils.parseNumber(cost);\r\n salvage = utils.parseNumber(salvage);\r\n life = utils.parseNumber(life);\r\n if (utils.anyIsError(cost, salvage, life)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if life equal to 0 (zero)\r\n if (life === 0) {\r\n return error.num;\r\n }\r\n \r\n // Return straight-line depreciation\r\n return (cost - salvage) / life;\r\n };\r\n \r\n exports.SYD = function(cost, salvage, life, period) {\r\n // Return error if any of the parameters is not a number\r\n cost = utils.parseNumber(cost);\r\n salvage = utils.parseNumber(salvage);\r\n life = utils.parseNumber(life);\r\n period = utils.parseNumber(period);\r\n if (utils.anyIsError(cost, salvage, life, period)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if life equal to 0 (zero)\r\n if (life === 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if period is lower than 1 or greater than life\r\n if (period < 1 || period > life) {\r\n return error.num;\r\n }\r\n \r\n // Truncate period if it is not an integer\r\n period = parseInt(period, 10);\r\n \r\n // Return straight-line depreciation\r\n return ((cost - salvage) * (life - period + 1) * 2) / (life * (life + 1));\r\n };\r\n \r\n exports.TBILLEQ = function(settlement, maturity, discount) {\r\n settlement = utils.parseDate(settlement);\r\n maturity = utils.parseDate(maturity);\r\n discount = utils.parseNumber(discount);\r\n if (utils.anyIsError(settlement, maturity, discount)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if discount is lower than or equal to zero\r\n if (discount <= 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if settlement is greater than maturity\r\n if (settlement > maturity) {\r\n return error.num;\r\n }\r\n \r\n // Return error if maturity is more than one year after settlement\r\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\r\n return error.num;\r\n }\r\n \r\n // Return bond-equivalent yield\r\n return (365 * discount) / (360 - discount * DAYS360(settlement, maturity, false));\r\n };\r\n \r\n exports.TBILLPRICE = function(settlement, maturity, discount) {\r\n settlement = utils.parseDate(settlement);\r\n maturity = utils.parseDate(maturity);\r\n discount = utils.parseNumber(discount);\r\n if (utils.anyIsError(settlement, maturity, discount)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if discount is lower than or equal to zero\r\n if (discount <= 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if settlement is greater than maturity\r\n if (settlement > maturity) {\r\n return error.num;\r\n }\r\n \r\n // Return error if maturity is more than one year after settlement\r\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\r\n return error.num;\r\n }\r\n \r\n // Return bond-equivalent yield\r\n return 100 * (1 - discount * DAYS360(settlement, maturity, false) / 360);\r\n };\r\n \r\n exports.TBILLYIELD = function(settlement, maturity, price) {\r\n settlement = utils.parseDate(settlement);\r\n maturity = utils.parseDate(maturity);\r\n price = utils.parseNumber(price);\r\n if (utils.anyIsError(settlement, maturity, price)) {\r\n return error.value;\r\n }\r\n \r\n // Return error if price is lower than or equal to zero\r\n if (price <= 0) {\r\n return error.num;\r\n }\r\n \r\n // Return error if settlement is greater than maturity\r\n if (settlement > maturity) {\r\n return error.num;\r\n }\r\n \r\n // Return error if maturity is more than one year after settlement\r\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\r\n return error.num;\r\n }\r\n \r\n // Return bond-equivalent yield\r\n return (100 - price) * 360 / (price * DAYS360(settlement, maturity, false));\r\n };\r\n \r\n exports.VDB = null;\r\n \r\n exports.XIRR = function(values, dates, guess) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n \r\n values = utils.parseNumberArray(utils.flatten(values));\r\n dates = utils.parseDateArray(utils.flatten(dates));\r\n guess = utils.parseNumber(guess);\r\n if (utils.anyIsError(values, dates, guess)) {\r\n return error.value;\r\n }\r\n \r\n // Calculates the resulting amount\r\n var irrResult = function(values, dates, rate) {\r\n var r = rate + 1;\r\n var result = values[0];\r\n for (var i = 1; i < values.length; i++) {\r\n result += values[i] / Math.pow(r, DAYS(dates[i], dates[0]) / 365);\r\n }\r\n return result;\r\n };\r\n \r\n // Calculates the first derivation\r\n var irrResultDeriv = function(values, dates, rate) {\r\n var r = rate + 1;\r\n var result = 0;\r\n for (var i = 1; i < values.length; i++) {\r\n var frac = DAYS(dates[i], dates[0]) / 365;\r\n result -= frac * values[i] / Math.pow(r, frac + 1);\r\n }\r\n return result;\r\n };\r\n \r\n // Check that values contains at least one positive value and one\r\n // negative value\r\n var positive = false;\r\n var negative = false;\r\n for (var i = 0; i < values.length; i++) {\r\n if (values[i] > 0) {\r\n positive = true;\r\n }\r\n if (values[i] < 0) {\r\n negative = true;\r\n }\r\n }\r\n \r\n // Return error if values does not contain at least one positive value\r\n // and one negative value\r\n if (!positive || !negative) {\r\n return error.num;\r\n }\r\n \r\n // Initialize guess and resultRate\r\n guess = guess || 0.1;\r\n var resultRate = guess;\r\n \r\n // Set maximum epsilon for end of iteration\r\n var epsMax = 1e-10;\r\n \r\n // Implement Newton's method\r\n var newRate, epsRate, resultValue;\r\n var contLoop = true;\r\n do {\r\n resultValue = irrResult(values, dates, resultRate);\r\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\r\n epsRate = Math.abs(newRate - resultRate);\r\n resultRate = newRate;\r\n contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);\r\n } while (contLoop);\r\n \r\n // Return internal rate of return\r\n return resultRate;\r\n };\r\n \r\n exports.XNPV = function(rate, values, dates) {\r\n rate = utils.parseNumber(rate);\r\n values = utils.parseNumberArray(utils.flatten(values));\r\n dates = utils.parseDateArray(utils.flatten(dates));\r\n if (utils.anyIsError(rate, values, dates)) {\r\n return error.value;\r\n }\r\n \r\n var result = 0;\r\n for (var i = 0; i < values.length; i++) {\r\n result += values[i] / Math.pow(1 + rate, DAYS(dates[i], dates[0]) / 365);\r\n }\r\n return result;\r\n };\r\n \r\n exports.YIELD = null;\r\n \r\n exports.YIELDDISC = null;\r\n \r\n exports.YIELDMAT = null;\r\n \r\n return exports;\r\n })();\r\n \r\n jexcel.methods.information = (function() {\r\n var exports = {};\r\n exports.CELL = null;\r\n \r\n exports.ERROR = {};\r\n exports.ERROR.TYPE = function(error_val) {\r\n switch (error_val) {\r\n case error.nil: return 1;\r\n case error.div0: return 2;\r\n case error.value: return 3;\r\n case error.ref: return 4;\r\n case error.name: return 5;\r\n case error.num: return 6;\r\n case error.na: return 7;\r\n case error.data: return 8;\r\n }\r\n return error.na;\r\n };\r\n \r\n exports.INFO = null;\r\n \r\n exports.ISBLANK = function(value) {\r\n return value === null;\r\n };\r\n \r\n exports.ISBINARY = function (number) {\r\n return (/^[01]{1,10}$/).test(number);\r\n };\r\n \r\n exports.ISERR = function(value) {\r\n return ([error.value, error.ref, error.div0, error.num, error.name, error.nil]).indexOf(value) >= 0 ||\r\n (typeof value === 'number' && (isNaN(value) || !isFinite(value)));\r\n };\r\n \r\n exports.ISERROR = function(value) {\r\n return exports.ISERR(value) || value === error.na;\r\n };\r\n \r\n exports.ISEVEN = function(number) {\r\n return (Math.floor(Math.abs(number)) & 1) ? false : true;\r\n };\r\n \r\n // TODO\r\n exports.ISFORMULA = null;\r\n \r\n exports.ISLOGICAL = function(value) {\r\n return value === true || value === false;\r\n };\r\n \r\n exports.ISNA = function(value) {\r\n return value === error.na;\r\n };\r\n \r\n exports.ISNONTEXT = function(value) {\r\n return typeof(value) !== 'string';\r\n };\r\n \r\n exports.ISNUMBER = function(value) {\r\n return typeof(value) === 'number' && !isNaN(value) && isFinite(value);\r\n };\r\n \r\n exports.ISODD = function(number) {\r\n return (Math.floor(Math.abs(number)) & 1) ? true : false;\r\n };\r\n \r\n exports.ISREF = null;\r\n \r\n exports.ISTEXT = function(value) {\r\n return typeof(value) === 'string';\r\n };\r\n \r\n exports.N = function(value) {\r\n if (this.ISNUMBER(value)) {\r\n return value;\r\n }\r\n if (value instanceof Date) {\r\n return value.getTime();\r\n }\r\n if (value === true) {\r\n return 1;\r\n }\r\n if (value === false) {\r\n return 0;\r\n }\r\n if (this.ISERROR(value)) {\r\n return value;\r\n }\r\n return 0;\r\n };\r\n \r\n exports.NA = function() {\r\n return error.na;\r\n };\r\n \r\n exports.SHEET = null;\r\n \r\n exports.SHEETS = null;\r\n \r\n exports.TYPE = function(value) {\r\n if (this.ISNUMBER(value)) {\r\n return 1;\r\n }\r\n if (this.ISTEXT(value)) {\r\n return 2;\r\n }\r\n if (this.ISLOGICAL(value)) {\r\n return 4;\r\n }\r\n if (this.ISERROR(value)) {\r\n return 16;\r\n }\r\n if (Array.isArray(value)) {\r\n return 64;\r\n }\r\n };\r\n \r\n return exports;\r\n })();\r\n \r\n jexcel.methods.logical = (function() {\r\n var exports = {};\r\n \r\n exports.AND = function() {\r\n var args = utils.flatten(arguments);\r\n var result = true;\r\n for (var i = 0; i < args.length; i++) {\r\n if (!args[i]) {\r\n result = false;\r\n }\r\n }\r\n return result;\r\n };\r\n \r\n exports.CHOOSE = function() {\r\n if (arguments.length < 2) {\r\n return error.na;\r\n }\r\n \r\n var index = arguments[0];\r\n if (index < 1 || index > 254) {\r\n return error.value;\r\n }\r\n \r\n if (arguments.length < index + 1) {\r\n return error.value;\r\n }\r\n \r\n return arguments[index];\r\n };\r\n \r\n exports.FALSE = function() {\r\n return false;\r\n };\r\n \r\n exports.IF = function(test, then_value, otherwise_value) {\r\n return test ? then_value : otherwise_value;\r\n };\r\n \r\n exports.IFERROR = function(value, valueIfError) {\r\n if (ISERROR(value)) {\r\n return valueIfError;\r\n }\r\n return value;\r\n };\r\n \r\n exports.IFNA = function(value, value_if_na) {\r\n return value === error.na ? value_if_na : value;\r\n };\r\n \r\n exports.NOT = function(logical) {\r\n return !logical;\r\n };\r\n \r\n exports.OR = function() {\r\n var args = utils.flatten(arguments);\r\n var result = false;\r\n for (var i = 0; i < args.length; i++) {\r\n if (args[i]) {\r\n result = true;\r\n }\r\n }\r\n return result;\r\n };\r\n \r\n exports.TRUE = function() {\r\n return true;\r\n };\r\n \r\n exports.XOR = function() {\r\n var args = utils.flatten(arguments);\r\n var result = 0;\r\n for (var i = 0; i < args.length; i++) {\r\n if (args[i]) {\r\n result++;\r\n }\r\n }\r\n return (Math.floor(Math.abs(result)) & 1) ? true : false;\r\n };\r\n \r\n exports.SWITCH = function() {\r\n var result;\r\n if (arguments.length > 0) {\r\n var targetValue = arguments[0];\r\n var argc = arguments.length - 1;\r\n var switchCount = Math.floor(argc / 2);\r\n var switchSatisfied = false;\r\n var defaultClause = argc % 2 === 0 ? null : arguments[arguments.length - 1];\r\n \r\n if (switchCount) {\r\n for (var index = 0; index < switchCount; index++) {\r\n if (targetValue === arguments[index * 2 + 1]) {\r\n result = arguments[index * 2 + 2];\r\n switchSatisfied = true;\r\n break;\r\n }\r\n }\r\n }\r\n \r\n if (!switchSatisfied && defaultClause) {\r\n result = defaultClause;\r\n }\r\n }\r\n \r\n return result;\r\n };\r\n \r\n return exports;\r\n })();\r\n \r\n jexcel.methods.math = (function() {\r\n var exports = {};\r\n \r\n exports.ABS = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.abs(utils.parseNumber(number));\r\n };\r\n \r\n exports.ACOS = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.acos(number);\r\n };\r\n \r\n exports.ACOSH = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.log(number + Math.sqrt(number * number - 1));\r\n };\r\n \r\n exports.ACOT = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.atan(1 / number);\r\n };\r\n \r\n exports.ACOTH = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return 0.5 * Math.log((number + 1) / (number - 1));\r\n };\r\n \r\n exports.AGGREGATE = null\r\n \r\n exports.ARABIC = function(text) {\r\n // Credits: Rafa? Kukawski\r\n if (!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(text)) {\r\n return error.value;\r\n }\r\n var r = 0;\r\n text.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g, function(i) {\r\n r += {\r\n M: 1000,\r\n CM: 900,\r\n D: 500,\r\n CD: 400,\r\n C: 100,\r\n XC: 90,\r\n L: 50,\r\n XL: 40,\r\n X: 10,\r\n IX: 9,\r\n V: 5,\r\n IV: 4,\r\n I: 1\r\n }[i];\r\n });\r\n return r;\r\n };\r\n \r\n exports.ASIN = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.asin(number);\r\n };\r\n \r\n exports.ASINH = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.log(number + Math.sqrt(number * number + 1));\r\n };\r\n \r\n exports.ATAN = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.atan(number);\r\n };\r\n \r\n exports.ATAN2 = function(number_x, number_y) {\r\n number_x = utils.parseNumber(number_x);\r\n number_y = utils.parseNumber(number_y);\r\n if (utils.anyIsError(number_x, number_y)) {\r\n return error.value;\r\n }\r\n return Math.atan2(number_x, number_y);\r\n };\r\n \r\n exports.ATANH = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.log((1 + number) / (1 - number)) / 2;\r\n };\r\n \r\n exports.BASE = function(number, radix, min_length) {\r\n min_length = min_length || 0;\r\n \r\n number = utils.parseNumber(number);\r\n radix = utils.parseNumber(radix);\r\n min_length = utils.parseNumber(min_length);\r\n if (utils.anyIsError(number, radix, min_length)) {\r\n return error.value;\r\n }\r\n min_length = (min_length === undefined) ? 0 : min_length;\r\n var result = number.toString(radix);\r\n return new Array(Math.max(min_length + 1 - result.length, 0)).join('0') + result;\r\n };\r\n \r\n exports.CEILING = function(number, significance, mode) {\r\n significance = (significance === undefined) ? 1 : significance;\r\n mode = (mode === undefined) ? 0 : mode;\r\n \r\n number = utils.parseNumber(number);\r\n significance = utils.parseNumber(significance);\r\n mode = utils.parseNumber(mode);\r\n if (utils.anyIsError(number, significance, mode)) {\r\n return error.value;\r\n }\r\n if (significance === 0) {\r\n return 0;\r\n }\r\n \r\n significance = Math.abs(significance);\r\n if (number >= 0) {\r\n return Math.ceil(number / significance) * significance;\r\n } else {\r\n if (mode === 0) {\r\n return -1 * Math.floor(Math.abs(number) / significance) * significance;\r\n } else {\r\n return -1 * Math.ceil(Math.abs(number) / significance) * significance;\r\n }\r\n }\r\n };\r\n \r\n exports.CEILING.MATH = exports.CEILING;\r\n \r\n exports.CEILING.PRECISE = exports.CEILING;\r\n \r\n exports.COMBIN = function(number, number_chosen) {\r\n number = utils.parseNumber(number);\r\n number_chosen = utils.parseNumber(number_chosen);\r\n if (utils.anyIsError(number, number_chosen)) {\r\n return error.value;\r\n }\r\n return exports.FACT(number) / (exports.FACT(number_chosen) * exports.FACT(number - number_chosen));\r\n };\r\n \r\n exports.COMBINA = function(number, number_chosen) {\r\n number = utils.parseNumber(number);\r\n number_chosen = utils.parseNumber(number_chosen);\r\n if (utils.anyIsError(number, number_chosen)) {\r\n return error.value;\r\n }\r\n return (number === 0 && number_chosen === 0) ? 1 : exports.COMBIN(number + number_chosen - 1, number - 1);\r\n };\r\n \r\n exports.COS = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.cos(number);\r\n };\r\n \r\n exports.COSH = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return (Math.exp(number) + Math.exp(-number)) / 2;\r\n };\r\n \r\n exports.COT = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return 1 / Math.tan(number);\r\n };\r\n \r\n exports.COTH = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n var e2 = Math.exp(2 * number);\r\n return (e2 + 1) / (e2 - 1);\r\n };\r\n \r\n exports.CSC = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return 1 / Math.sin(number);\r\n };\r\n \r\n exports.CSCH = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return 2 / (Math.exp(number) - Math.exp(-number));\r\n };\r\n \r\n exports.DECIMAL = function(number, radix) {\r\n if (arguments.length < 1) {\r\n return error.value;\r\n }\r\n \r\n \r\n return parseInt(number, radix);\r\n };\r\n \r\n exports.DEGREES = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return number * 180 / Math.PI;\r\n };\r\n \r\n exports.EVEN = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return exports.CEILING(number, -2, -1);\r\n };\r\n \r\n exports.EXP = Math.exp;\r\n \r\n var MEMOIZED_FACT = [];\r\n exports.FACT = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n var n = Math.floor(number);\r\n if (n === 0 || n === 1) {\r\n return 1;\r\n } else if (MEMOIZED_FACT[n] > 0) {\r\n return MEMOIZED_FACT[n];\r\n } else {\r\n MEMOIZED_FACT[n] = exports.FACT(n - 1) * n;\r\n return MEMOIZED_FACT[n];\r\n }\r\n };\r\n \r\n exports.FACTDOUBLE = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n var n = Math.floor(number);\r\n if (n <= 0) {\r\n return 1;\r\n } else {\r\n return n * exports.FACTDOUBLE(n - 2);\r\n }\r\n };\r\n \r\n exports.FLOOR = function(number, significance, mode) {\r\n significance = (significance === undefined) ? 1 : significance;\r\n mode = (mode === undefined) ? 0 : mode;\r\n \r\n number = utils.parseNumber(number);\r\n significance = utils.parseNumber(significance);\r\n mode = utils.parseNumber(mode);\r\n if (utils.anyIsError(number, significance, mode)) {\r\n return error.value;\r\n }\r\n if (significance === 0) {\r\n return 0;\r\n }\r\n \r\n significance = Math.abs(significance);\r\n if (number >= 0) {\r\n return Math.floor(number / significance) * significance;\r\n } else {\r\n if (mode === 0) {\r\n return -1 * Math.ceil(Math.abs(number) / significance) * significance;\r\n } else {\r\n return -1 * Math.floor(Math.abs(number) / significance) * significance;\r\n }\r\n }\r\n };\r\n \r\n exports.FLOOR.MATH = exports.FLOOR;\r\n \r\n exports.GCD = null;\r\n \r\n exports.INT = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.floor(number);\r\n };\r\n \r\n exports.LCM = function() {\r\n // Credits: Jonas Raoni Soares Silva\r\n var o = utils.parseNumberArray(utils.flatten(arguments));\r\n if (o instanceof Error) {\r\n return o;\r\n }\r\n for (var i, j, n, d, r = 1;\r\n (n = o.pop()) !== undefined;) {\r\n while (n > 1) {\r\n if (n % 2) {\r\n for (i = 3, j = Math.floor(Math.sqrt(n)); i <= j && n % i; i += 2) {\r\n //empty\r\n }\r\n d = (i <= j) ? i : n;\r\n } else {\r\n d = 2;\r\n }\r\n for (n /= d, r *= d, i = o.length; i;\r\n (o[--i] % d) === 0 && (o[i] /= d) === 1 && o.splice(i, 1)) {\r\n //empty\r\n }\r\n }\r\n }\r\n return r;\r\n };\r\n \r\n exports.LN = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.log(number);\r\n };\r\n \r\n exports.LOG = function(number, base) {\r\n number = utils.parseNumber(number);\r\n base = (base === undefined) ? 10 : utils.parseNumber(base);\r\n \r\n if (utils.anyIsError(number, base)) {\r\n return error.value;\r\n }\r\n \r\n return Math.log(number) / Math.log(base);\r\n };\r\n \r\n exports.LOG10 = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.log(number) / Math.log(10);\r\n };\r\n \r\n exports.MDETERM = null;\r\n \r\n exports.MINVERSE = null;\r\n \r\n exports.MMULT = null;\r\n \r\n exports.MOD = function(dividend, divisor) {\r\n dividend = utils.parseNumber(dividend);\r\n divisor = utils.parseNumber(divisor);\r\n if (utils.anyIsError(dividend, divisor)) {\r\n return error.value;\r\n }\r\n if (divisor === 0) {\r\n return error.div0;\r\n }\r\n var modulus = Math.abs(dividend % divisor);\r\n return (divisor > 0) ? modulus : -modulus;\r\n };\r\n \r\n exports.MROUND = function(number, multiple) {\r\n number = utils.parseNumber(number);\r\n multiple = utils.parseNumber(multiple);\r\n if (utils.anyIsError(number, multiple)) {\r\n return error.value;\r\n }\r\n if (number * multiple < 0) {\r\n return error.num;\r\n }\r\n \r\n return Math.round(number / multiple) * multiple;\r\n };\r\n \r\n exports.MULTINOMIAL = function() {\r\n var args = utils.parseNumberArray(utils.flatten(arguments));\r\n if (args instanceof Error) {\r\n return args;\r\n }\r\n var sum = 0;\r\n var divisor = 1;\r\n for (var i = 0; i < args.length; i++) {\r\n sum += args[i];\r\n divisor *= exports.FACT(args[i]);\r\n }\r\n return exports.FACT(sum) / divisor;\r\n };\r\n \r\n exports.MUNIT = null;\r\n \r\n exports.ODD = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n var temp = Math.ceil(Math.abs(number));\r\n temp = (temp & 1) ? temp : temp + 1;\r\n return (number > 0) ? temp : -temp;\r\n };\r\n \r\n exports.PI = function() {\r\n return Math.PI;\r\n };\r\n \r\n exports.POWER = function(number, power) {\r\n number = utils.parseNumber(number);\r\n power = utils.parseNumber(power);\r\n if (utils.anyIsError(number, power)) {\r\n return error.value;\r\n }\r\n var result = Math.pow(number, power);\r\n if (isNaN(result)) {\r\n return error.num;\r\n }\r\n \r\n return result;\r\n };\r\n \r\n exports.PRODUCT = function() {\r\n var args = utils.parseNumberArray(utils.flatten(arguments));\r\n if (args instanceof Error) {\r\n return args;\r\n }\r\n var result = 1;\r\n for (var i = 0; i < args.length; i++) {\r\n result *= args[i];\r\n }\r\n return result;\r\n };\r\n \r\n exports.QUOTIENT = function(numerator, denominator) {\r\n numerator = utils.parseNumber(numerator);\r\n denominator = utils.parseNumber(denominator);\r\n if (utils.anyIsError(numerator, denominator)) {\r\n return error.value;\r\n }\r\n return parseInt(numerator / denominator, 10);\r\n };\r\n \r\n exports.RADIANS = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return number * Math.PI / 180;\r\n };\r\n \r\n exports.RAND = function() {\r\n return Math.random();\r\n };\r\n \r\n exports.RANDBETWEEN = function(bottom, top) {\r\n bottom = utils.parseNumber(bottom);\r\n top = utils.parseNumber(top);\r\n if (utils.anyIsError(bottom, top)) {\r\n return error.value;\r\n }\r\n // Creative Commons Attribution 3.0 License\r\n // Copyright (c) 2012 eqcode\r\n return bottom + Math.ceil((top - bottom + 1) * Math.random()) - 1;\r\n };\r\n \r\n exports.ROMAN = null;\r\n \r\n exports.ROUND = function(number, digits) {\r\n number = utils.parseNumber(number);\r\n digits = utils.parseNumber(digits);\r\n if (utils.anyIsError(number, digits)) {\r\n return error.value;\r\n }\r\n return Math.round(number * Math.pow(10, digits)) / Math.pow(10, digits);\r\n };\r\n \r\n exports.ROUNDDOWN = function(number, digits) {\r\n number = utils.parseNumber(number);\r\n digits = utils.parseNumber(digits);\r\n if (utils.anyIsError(number, digits)) {\r\n return error.value;\r\n }\r\n var sign = (number > 0) ? 1 : -1;\r\n return sign * (Math.floor(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n };\r\n \r\n exports.ROUNDUP = function(number, digits) {\r\n number = utils.parseNumber(number);\r\n digits = utils.parseNumber(digits);\r\n if (utils.anyIsError(number, digits)) {\r\n return error.value;\r\n }\r\n var sign = (number > 0) ? 1 : -1;\r\n return sign * (Math.ceil(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n };\r\n \r\n exports.SEC = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return 1 / Math.cos(number);\r\n };\r\n \r\n exports.SECH = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return 2 / (Math.exp(number) + Math.exp(-number));\r\n };\r\n \r\n exports.SERIESSUM = function(x, n, m, coefficients) {\r\n x = utils.parseNumber(x);\r\n n = utils.parseNumber(n);\r\n m = utils.parseNumber(m);\r\n coefficients = utils.parseNumberArray(coefficients);\r\n if (utils.anyIsError(x, n, m, coefficients)) {\r\n return error.value;\r\n }\r\n var result = coefficients[0] * Math.pow(x, n);\r\n for (var i = 1; i < coefficients.length; i++) {\r\n result += coefficients[i] * Math.pow(x, n + i * m);\r\n }\r\n return result;\r\n };\r\n \r\n exports.SIGN = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n if (number < 0) {\r\n return -1;\r\n } else if (number === 0) {\r\n return 0;\r\n } else {\r\n return 1;\r\n }\r\n };\r\n \r\n exports.SIN = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.sin(number);\r\n };\r\n \r\n exports.SINH = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return (Math.exp(number) - Math.exp(-number)) / 2;\r\n };\r\n \r\n exports.SQRT = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n if (number < 0) {\r\n return error.num;\r\n }\r\n return Math.sqrt(number);\r\n };\r\n \r\n exports.SQRTPI = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.sqrt(number * Math.PI);\r\n };\r\n \r\n exports.SUBTOTAL = null;\r\n \r\n exports.ADD = function (num1, num2) {\r\n if (arguments.length !== 2) {\r\n return error.na;\r\n }\r\n \r\n num1 = utils.parseNumber(num1);\r\n num2 = utils.parseNumber(num2);\r\n if (utils.anyIsError(num1, num2)) {\r\n return error.value;\r\n }\r\n \r\n return num1 + num2;\r\n };\r\n \r\n exports.MINUS = function (num1, num2) {\r\n if (arguments.length !== 2) {\r\n return error.na;\r\n }\r\n \r\n num1 = utils.parseNumber(num1);\r\n num2 = utils.parseNumber(num2);\r\n if (utils.anyIsError(num1, num2)) {\r\n return error.value;\r\n }\r\n \r\n return num1 - num2;\r\n };\r\n \r\n exports.DIVIDE = function (dividend, divisor) {\r\n if (arguments.length !== 2) {\r\n return error.na;\r\n }\r\n \r\n dividend = utils.parseNumber(dividend);\r\n divisor = utils.parseNumber(divisor);\r\n if (utils.anyIsError(dividend, divisor)) {\r\n return error.value;\r\n }\r\n \r\n if (divisor === 0) {\r\n return error.div0;\r\n }\r\n \r\n return dividend / divisor;\r\n };\r\n \r\n exports.MULTIPLY = function (factor1, factor2) {\r\n if (arguments.length !== 2) {\r\n return error.na;\r\n }\r\n \r\n factor1 = utils.parseNumber(factor1);\r\n factor2 = utils.parseNumber(factor2);\r\n if (utils.anyIsError(factor1, factor2)) {\r\n return error.value;\r\n }\r\n \r\n return factor1 * factor2;\r\n };\r\n \r\n exports.GTE = function (num1, num2) {\r\n if (arguments.length !== 2) {\r\n return error.na;\r\n }\r\n \r\n num1 = utils.parseNumber(num1);\r\n num2 = utils.parseNumber(num2);\r\n if (utils.anyIsError(num1, num2)) {\r\n return error.error;\r\n }\r\n \r\n return num1 >= num2;\r\n };\r\n \r\n exports.LT = function (num1, num2) {\r\n if (arguments.length !== 2) {\r\n return error.na;\r\n }\r\n \r\n num1 = utils.parseNumber(num1);\r\n num2 = utils.parseNumber(num2);\r\n if (utils.anyIsError(num1, num2)) {\r\n return error.error;\r\n }\r\n \r\n return num1 < num2;\r\n };\r\n \r\n exports.LTE = function (num1, num2) {\r\n if (arguments.length !== 2) {\r\n return error.na;\r\n }\r\n \r\n num1 = utils.parseNumber(num1);\r\n num2 = utils.parseNumber(num2);\r\n if (utils.anyIsError(num1, num2)) {\r\n return error.error;\r\n }\r\n \r\n return num1 <= num2;\r\n };\r\n \r\n exports.EQ = function (value1, value2) {\r\n if (arguments.length !== 2) {\r\n return error.na;\r\n }\r\n \r\n return value1 === value2;\r\n };\r\n \r\n exports.NE = function (value1, value2) {\r\n if (arguments.length !== 2) {\r\n return error.na;\r\n }\r\n \r\n return value1 !== value2;\r\n };\r\n \r\n exports.POW = function (base, exponent) {\r\n if (arguments.length !== 2) {\r\n return error.na;\r\n }\r\n \r\n base = utils.parseNumber(base);\r\n exponent = utils.parseNumber(exponent);\r\n if (utils.anyIsError(base, exponent)) {\r\n return error.error;\r\n }\r\n \r\n return exports.POWER(base, exponent);\r\n };\r\n \r\n exports.SUM = function() {\r\n var result = 0;\r\n var argsKeys = Object.keys(arguments);\r\n for (var i = 0; i < argsKeys.length; ++i) {\r\n var elt = arguments[argsKeys[i]];\r\n if (typeof elt === 'number') {\r\n result += elt;\r\n } else if (typeof elt === 'string') {\r\n var parsed = parseFloat(elt);\r\n !isNaN(parsed) && (result += parsed);\r\n } else if (Array.isArray(elt)) {\r\n result += exports.SUM.apply(null, elt);\r\n }\r\n }\r\n return result;\r\n };\r\n \r\n exports.SUMIF = function(range, criteria) {\r\n range = utils.parseNumberArray(utils.flatten(range));\r\n if (range instanceof Error) {\r\n return range;\r\n }\r\n var result = 0;\r\n for (var i = 0; i < range.length; i++) {\r\n result += (eval(range[i] + criteria)) ? range[i] : 0; // jshint ignore:line\r\n }\r\n return result;\r\n };\r\n \r\n exports.SUMIFS = function() {\r\n var args = utils.argsToArray(arguments);\r\n var range = utils.parseNumberArray(utils.flatten(args.shift()));\r\n if (range instanceof Error) {\r\n return range;\r\n }\r\n var criteria = args;\r\n \r\n var n_range_elements = range.length;\r\n var n_criterias = criteria.length;\r\n \r\n var result = 0;\r\n for (var i = 0; i < n_range_elements; i++) {\r\n var el = range[i];\r\n var condition = '';\r\n for (var c = 0; c < n_criterias; c++) {\r\n condition += el + criteria[c];\r\n if (c !== n_criterias - 1) {\r\n condition += '&&';\r\n }\r\n }\r\n if (eval(condition)) { // jshint ignore:line\r\n result += el;\r\n }\r\n }\r\n return result;\r\n };\r\n \r\n exports.SUMPRODUCT = null;\r\n \r\n exports.SUMSQ = function() {\r\n var numbers = utils.parseNumberArray(utils.flatten(arguments));\r\n if (numbers instanceof Error) {\r\n return numbers;\r\n }\r\n var result = 0;\r\n var length = numbers.length;\r\n for (var i = 0; i < length; i++) {\r\n result += (ISNUMBER(numbers[i])) ? numbers[i] * numbers[i] : 0;\r\n }\r\n return result;\r\n };\r\n \r\n exports.SUMX2MY2 = function(array_x, array_y) {\r\n array_x = utils.parseNumberArray(utils.flatten(array_x));\r\n array_y = utils.parseNumberArray(utils.flatten(array_y));\r\n if (utils.anyIsError(array_x, array_y)) {\r\n return error.value;\r\n }\r\n var result = 0;\r\n for (var i = 0; i < array_x.length; i++) {\r\n result += array_x[i] * array_x[i] - array_y[i] * array_y[i];\r\n }\r\n return result;\r\n };\r\n \r\n exports.SUMX2PY2 = function(array_x, array_y) {\r\n array_x = utils.parseNumberArray(utils.flatten(array_x));\r\n array_y = utils.parseNumberArray(utils.flatten(array_y));\r\n if (utils.anyIsError(array_x, array_y)) {\r\n return error.value;\r\n }\r\n var result = 0;\r\n array_x = utils.parseNumberArray(utils.flatten(array_x));\r\n array_y = utils.parseNumberArray(utils.flatten(array_y));\r\n for (var i = 0; i < array_x.length; i++) {\r\n result += array_x[i] * array_x[i] + array_y[i] * array_y[i];\r\n }\r\n return result;\r\n };\r\n \r\n exports.SUMXMY2 = function(array_x, array_y) {\r\n array_x = utils.parseNumberArray(utils.flatten(array_x));\r\n array_y = utils.parseNumberArray(utils.flatten(array_y));\r\n if (utils.anyIsError(array_x, array_y)) {\r\n return error.value;\r\n }\r\n var result = 0;\r\n array_x = utils.flatten(array_x);\r\n array_y = utils.flatten(array_y);\r\n for (var i = 0; i < array_x.length; i++) {\r\n result += Math.pow(array_x[i] - array_y[i], 2);\r\n }\r\n return result;\r\n };\r\n \r\n exports.TAN = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return Math.tan(number);\r\n };\r\n \r\n exports.TANH = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n var e2 = Math.exp(2 * number);\r\n return (e2 - 1) / (e2 + 1);\r\n };\r\n \r\n exports.TRUNC = function(number, digits) {\r\n digits = (digits === undefined) ? 0 : digits;\r\n number = utils.parseNumber(number);\r\n digits = utils.parseNumber(digits);\r\n if (utils.anyIsError(number, digits)) {\r\n return error.value;\r\n }\r\n var sign = (number > 0) ? 1 : -1;\r\n return sign * (Math.floor(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n };\r\n \r\n return exports;\r\n })();\r\n \r\n jexcel.methods.misc = (function() {\r\n var exports = {};\r\n \r\n exports.UNIQUE = function () {\r\n var result = [];\r\n for (var i = 0; i < arguments.length; ++i) {\r\n var hasElement = false;\r\n var element = arguments[i];\r\n \r\n // Check if we've already seen this element.\r\n for (var j = 0; j < result.length; ++j) {\r\n hasElement = result[j] === element;\r\n if (hasElement) { break; }\r\n }\r\n \r\n // If we did not find it, add it to the result.\r\n if (!hasElement) {\r\n result.push(element);\r\n }\r\n }\r\n return result;\r\n };\r\n \r\n exports.FLATTEN = utils.flatten;\r\n \r\n exports.ARGS2ARRAY = function () {\r\n return Array.prototype.slice.call(arguments, 0);\r\n };\r\n \r\n exports.REFERENCE = function (context, reference) {\r\n try {\r\n var path = reference.split('.');\r\n var result = context;\r\n for (var i = 0; i < path.length; ++i) {\r\n var step = path[i];\r\n if (step[step.length - 1] === ']') {\r\n var opening = step.indexOf('[');\r\n var index = step.substring(opening + 1, step.length - 1);\r\n result = result[step.substring(0, opening)][index];\r\n } else {\r\n result = result[step];\r\n }\r\n }\r\n return result;\r\n } catch (error) {}\r\n };\r\n \r\n exports.JOIN = function (array, separator) {\r\n return array.join(separator);\r\n };\r\n \r\n exports.NUMBERS = function () {\r\n var possibleNumbers = utils.flatten(arguments);\r\n return possibleNumbers.filter(function (el) {\r\n return typeof el === 'number';\r\n });\r\n };\r\n \r\n exports.NUMERAL = null;\r\n \r\n return exports;\r\n })();\r\n \r\n jexcel.methods.text = (function() {\r\n var exports = {};\r\n \r\n exports.ASC = null;\r\n \r\n exports.BAHTTEXT = null;\r\n \r\n exports.CHAR = function(number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return String.fromCharCode(number);\r\n };\r\n \r\n exports.CLEAN = function(text) {\r\n text = text || '';\r\n var re = /[\\0-\\x1F]/g;\r\n return text.replace(re, \"\");\r\n };\r\n \r\n exports.CODE = function(text) {\r\n text = text || '';\r\n return text.charCodeAt(0);\r\n };\r\n \r\n exports.CONCATENATE = function() {\r\n var args = utils.flatten(arguments);\r\n \r\n var trueFound = 0;\r\n while ((trueFound = args.indexOf(true)) > -1) {\r\n args[trueFound] = 'TRUE';\r\n }\r\n \r\n var falseFound = 0;\r\n while ((falseFound = args.indexOf(false)) > -1) {\r\n args[falseFound] = 'FALSE';\r\n }\r\n \r\n return args.join('');\r\n };\r\n \r\n exports.DBCS = null;\r\n \r\n exports.DOLLAR = null;\r\n \r\n exports.EXACT = function(text1, text2) {\r\n return text1 === text2;\r\n };\r\n \r\n exports.FIND = function(find_text, within_text, position) {\r\n position = (position === undefined) ? 0 : position;\r\n return within_text ? within_text.indexOf(find_text, position - 1) + 1 : null;\r\n };\r\n \r\n exports.FIXED = null;\r\n \r\n exports.HTML2TEXT = function (value) {\r\n var result = '';\r\n \r\n if (value) {\r\n if (value instanceof Array) {\r\n value.forEach(function (line) {\r\n if (result !== '') {\r\n result += '\\n';\r\n }\r\n result += (line.replace(/<(?:.|\\n)*?>/gm, ''));\r\n });\r\n } else {\r\n result = value.replace(/<(?:.|\\n)*?>/gm, '');\r\n }\r\n }\r\n \r\n return result;\r\n };\r\n \r\n exports.LEFT = function(text, number) {\r\n number = (number === undefined) ? 1 : number;\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error || typeof text !== 'string') {\r\n return error.value;\r\n }\r\n return text ? text.substring(0, number) : null;\r\n };\r\n \r\n exports.LEN = function(text) {\r\n if (arguments.length === 0) {\r\n return error.error;\r\n }\r\n \r\n if (typeof text === 'string') {\r\n return text ? text.length : 0;\r\n }\r\n \r\n if (text.length) {\r\n return text.length;\r\n }\r\n \r\n return error.value;\r\n };\r\n \r\n exports.LOWER = function(text) {\r\n if (typeof text !== 'string') {\r\n return error.value;\r\n }\r\n return text ? text.toLowerCase() : text;\r\n };\r\n \r\n exports.MID = function(text, start, number) {\r\n start = utils.parseNumber(start);\r\n number = utils.parseNumber(number);\r\n if (utils.anyIsError(start, number) || typeof text !== 'string') {\r\n return number;\r\n }\r\n \r\n var begin = start - 1;\r\n var end = begin + number;\r\n \r\n return text.substring(begin, end);\r\n };\r\n \r\n exports.NUMBERVALUE = null;\r\n \r\n exports.PRONETIC = null;\r\n \r\n exports.PROPER = function(text) {\r\n if (text === undefined || text.length === 0) {\r\n return error.value;\r\n }\r\n if (text === true) {\r\n text = 'TRUE';\r\n }\r\n if (text === false) {\r\n text = 'FALSE';\r\n }\r\n if (isNaN(text) && typeof text === 'number') {\r\n return error.value;\r\n }\r\n if (typeof text === 'number') {\r\n text = '' + text;\r\n }\r\n \r\n return text.replace(/\\w\\S*/g, function(txt) {\r\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\r\n });\r\n };\r\n \r\n exports.REGEXEXTRACT = function (text, regular_expression) {\r\n var match = text.match(new RegExp(regular_expression));\r\n return match ? (match[match.length > 1 ? match.length - 1 : 0]) : null;\r\n };\r\n \r\n exports.REGEXMATCH = function (text, regular_expression, full) {\r\n var match = text.match(new RegExp(regular_expression));\r\n return full ? match : !!match;\r\n };\r\n \r\n exports.REGEXREPLACE = function (text, regular_expression, replacement) {\r\n return text.replace(new RegExp(regular_expression), replacement);\r\n };\r\n \r\n exports.REPLACE = function(text, position, length, new_text) {\r\n position = utils.parseNumber(position);\r\n length = utils.parseNumber(length);\r\n if (utils.anyIsError(position, length) ||\r\n typeof text !== 'string' ||\r\n typeof new_text !== 'string') {\r\n return error.value;\r\n }\r\n return text.substr(0, position - 1) + new_text + text.substr(position - 1 + length);\r\n };\r\n \r\n exports.REPT = function(text, number) {\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return new Array(number + 1).join(text);\r\n };\r\n \r\n exports.RIGHT = function(text, number) {\r\n number = (number === undefined) ? 1 : number;\r\n number = utils.parseNumber(number);\r\n if (number instanceof Error) {\r\n return number;\r\n }\r\n return text ? text.substring(text.length - number) : null;\r\n };\r\n \r\n exports.SEARCH = function(find_text, within_text, position) {\r\n var foundAt;\r\n if (typeof find_text !== 'string' || typeof within_text !== 'string') {\r\n return error.value;\r\n }\r\n position = (position === undefined) ? 0 : position;\r\n foundAt = within_text.toLowerCase().indexOf(find_text.toLowerCase(), position - 1)+1;\r\n return (foundAt === 0)?error.value:foundAt;\r\n };\r\n \r\n exports.SPLIT = function (text, separator) {\r\n return text.split(separator);\r\n };\r\n \r\n exports.SUBSTITUTE = function(text, old_text, new_text, occurrence) {\r\n if (!text || !old_text || !new_text) {\r\n return text;\r\n } else if (occurrence === undefined) {\r\n return text.replace(new RegExp(old_text, 'g'), new_text);\r\n } else {\r\n var index = 0;\r\n var i = 0;\r\n while (text.indexOf(old_text, index) > 0) {\r\n index = text.indexOf(old_text, index + 1);\r\n i++;\r\n if (i === occurrence) {\r\n return text.substring(0, index) + new_text + text.substring(index + old_text.length);\r\n }\r\n }\r\n }\r\n };\r\n \r\n exports.T = function(value) {\r\n return (typeof value === \"string\") ? value : '';\r\n };\r\n \r\n exports.TEXT = null;\r\n \r\n exports.TRIM = function(text) {\r\n if (typeof text !== 'string') {\r\n return error.value;\r\n }\r\n return text.replace(/ +/g, ' ').trim();\r\n };\r\n \r\n exports.UNICHAR = exports.CHAR;\r\n \r\n exports.UNICODE = exports.CODE;\r\n \r\n exports.UPPER = function(text) {\r\n if (typeof text !== 'string') {\r\n return error.value;\r\n }\r\n return text.toUpperCase();\r\n };\r\n \r\n exports.VALUE = null;\r\n \r\n return exports;\r\n })();\r\n \r\n jexcel.methods.stats = (function() {\r\n var exports = {};\r\n \r\n var SQRT2PI = 2.5066282746310002;\r\n \r\n exports.AVEDEV = null;\r\n \r\n exports.AVERAGE = function() {\r\n var range = utils.numbers(utils.flatten(arguments));\r\n var n = range.length;\r\n var sum = 0;\r\n var count = 0;\r\n for (var i = 0; i < n; i++) {\r\n sum += range[i];\r\n count += 1;\r\n }\r\n return sum / count;\r\n };\r\n \r\n exports.AVERAGEA = function() {\r\n var range = utils.flatten(arguments);\r\n var n = range.length;\r\n var sum = 0;\r\n var count = 0;\r\n for (var i = 0; i < n; i++) {\r\n var el = range[i];\r\n if (typeof el === 'number') {\r\n sum += el;\r\n }\r\n if (el === true) {\r\n sum++;\r\n }\r\n if (el !== null) {\r\n count++;\r\n }\r\n }\r\n return sum / count;\r\n };\r\n \r\n exports.AVERAGEIF = function(range, criteria, average_range) {\r\n average_range = average_range || range;\r\n range = utils.flatten(range);\r\n average_range = utils.parseNumberArray(utils.flatten(average_range));\r\n if (average_range instanceof Error) {\r\n return average_range;\r\n }\r\n var average_count = 0;\r\n var result = 0;\r\n for (var i = 0; i < range.length; i++) {\r\n if (eval(range[i] + criteria)) { // jshint ignore:line\r\n result += average_range[i];\r\n average_count++;\r\n }\r\n }\r\n return result / average_count;\r\n };\r\n \r\n exports.AVERAGEIFS = null;\r\n \r\n exports.COUNT = function() {\r\n return utils.numbers(utils.flatten(arguments)).length;\r\n };\r\n \r\n exports.COUNTA = function() {\r\n var range = utils.flatten(arguments);\r\n return range.length - exports.COUNTBLANK(range);\r\n };\r\n \r\n exports.COUNTIN = function (range, value) {\r\n var result = 0;\r\n for (var i = 0; i < range.length; i++) {\r\n if (range[i] === value) {\r\n result++;\r\n }\r\n }\r\n return result;\r\n };\r\n \r\n exports.COUNTBLANK = function() {\r\n var range = utils.flatten(arguments);\r\n var blanks = 0;\r\n var element;\r\n for (var i = 0; i < range.length; i++) {\r\n element = range[i];\r\n if (element === null || element === '') {\r\n blanks++;\r\n }\r\n }\r\n return blanks;\r\n };\r\n \r\n exports.COUNTIF = function(range, criteria) {\r\n range = utils.flatten(range);\r\n if (!/[<>=!]/.test(criteria)) {\r\n criteria = '==\"' + criteria + '\"';\r\n }\r\n var matches = 0;\r\n for (var i = 0; i < range.length; i++) {\r\n if (typeof range[i] !== 'string') {\r\n if (eval(range[i] + criteria)) { // jshint ignore:line\r\n matches++;\r\n }\r\n } else {\r\n if (eval('\"' + range[i] + '\"' + criteria)) { // jshint ignore:line\r\n matches++;\r\n }\r\n }\r\n }\r\n return matches;\r\n };\r\n \r\n exports.COUNTIFS = function() {\r\n var args = utils.argsToArray(arguments);\r\n var results = new Array(utils.flatten(args[0]).length);\r\n for (var i = 0; i < results.length; i++) {\r\n results[i] = true;\r\n }\r\n for (i = 0; i < args.length; i += 2) {\r\n var range = utils.flatten(args[i]);\r\n var criteria = args[i + 1];\r\n if (!/[<>=!]/.test(criteria)) {\r\n criteria = '==\"' + criteria + '\"';\r\n }\r\n for (var j = 0; j < range.length; j++) {\r\n if (typeof range[j] !== 'string') {\r\n results[j] = results[j] && eval(range[j] + criteria); // jshint ignore:line\r\n } else {\r\n results[j] = results[j] && eval('\"' + range[j] + '\"' + criteria); // jshint ignore:line\r\n }\r\n }\r\n }\r\n var result = 0;\r\n for (i = 0; i < results.length; i++) {\r\n if (results[i]) {\r\n result++;\r\n }\r\n }\r\n return result;\r\n };\r\n \r\n exports.COUNTUNIQUE = function () {\r\n return UNIQUE.apply(null, utils.flatten(arguments)).length;\r\n };\r\n \r\n exports.FISHER = function(x) {\r\n x = utils.parseNumber(x);\r\n if (x instanceof Error) {\r\n return x;\r\n }\r\n return Math.log((1 + x) / (1 - x)) / 2;\r\n };\r\n \r\n exports.FISHERINV = function(y) {\r\n y = utils.parseNumber(y);\r\n if (y instanceof Error) {\r\n return y;\r\n }\r\n var e2y = Math.exp(2 * y);\r\n return (e2y - 1) / (e2y + 1);\r\n };\r\n \r\n exports.FREQUENCY = function(data, bins) {\r\n data = utils.parseNumberArray(utils.flatten(data));\r\n bins = utils.parseNumberArray(utils.flatten(bins));\r\n if (utils.anyIsError(data, bins)) {\r\n return error.value;\r\n }\r\n var n = data.length;\r\n var b = bins.length;\r\n var r = [];\r\n for (var i = 0; i <= b; i++) {\r\n r[i] = 0;\r\n for (var j = 0; j < n; j++) {\r\n if (i === 0) {\r\n if (data[j] <= bins[0]) {\r\n r[0] += 1;\r\n }\r\n } else if (i < b) {\r\n if (data[j] > bins[i - 1] && data[j] <= bins[i]) {\r\n r[i] += 1;\r\n }\r\n } else if (i === b) {\r\n if (data[j] > bins[b - 1]) {\r\n r[b] += 1;\r\n }\r\n }\r\n }\r\n }\r\n return r;\r\n };\r\n \r\n exports.LARGE = function(range, k) {\r\n range = utils.parseNumberArray(utils.flatten(range));\r\n k = utils.parseNumber(k);\r\n if (utils.anyIsError(range, k)) {\r\n return range;\r\n }\r\n return range.sort(function(a, b) {\r\n return b - a;\r\n })[k - 1];\r\n };\r\n \r\n exports.MAX = function() {\r\n var range = utils.numbers(utils.flatten(arguments));\r\n return (range.length === 0) ? 0 : Math.max.apply(Math, range);\r\n };\r\n \r\n exports.MAXA = function() {\r\n var range = utils.arrayValuesToNumbers(utils.flatten(arguments));\r\n return (range.length === 0) ? 0 : Math.max.apply(Math, range);\r\n };\r\n \r\n exports.MIN = function() {\r\n var range = utils.numbers(utils.flatten(arguments));\r\n return (range.length === 0) ? 0 : Math.min.apply(Math, range);\r\n };\r\n \r\n exports.MINA = function() {\r\n var range = utils.arrayValuesToNumbers(utils.flatten(arguments));\r\n return (range.length === 0) ? 0 : Math.min.apply(Math, range);\r\n };\r\n \r\n exports.MODE = {};\r\n \r\n exports.MODE.MULT = function() {\r\n // Credits: Roönaän\r\n var range = utils.parseNumberArray(utils.flatten(arguments));\r\n if (range instanceof Error) {\r\n return range;\r\n }\r\n var n = range.length;\r\n var count = {};\r\n var maxItems = [];\r\n var max = 0;\r\n var currentItem;\r\n \r\n for (var i = 0; i < n; i++) {\r\n currentItem = range[i];\r\n count[currentItem] = count[currentItem] ? count[currentItem] + 1 : 1;\r\n if (count[currentItem] > max) {\r\n max = count[currentItem];\r\n maxItems = [];\r\n }\r\n if (count[currentItem] === max) {\r\n maxItems[maxItems.length] = currentItem;\r\n }\r\n }\r\n return maxItems;\r\n };\r\n \r\n exports.MODE.SNGL = function() {\r\n var range = utils.parseNumberArray(utils.flatten(arguments));\r\n if (range instanceof Error) {\r\n return range;\r\n }\r\n return exports.MODE.MULT(range).sort(function(a, b) {\r\n return a - b;\r\n })[0];\r\n };\r\n \r\n exports.PERCENTILE = {};\r\n \r\n exports.PERCENTILE.EXC = function(array, k) {\r\n array = utils.parseNumberArray(utils.flatten(array));\r\n k = utils.parseNumber(k);\r\n if (utils.anyIsError(array, k)) {\r\n return error.value;\r\n }\r\n array = array.sort(function(a, b) {\r\n {\r\n return a - b;\r\n }\r\n });\r\n var n = array.length;\r\n if (k < 1 / (n + 1) || k > 1 - 1 / (n + 1)) {\r\n return error.num;\r\n }\r\n var l = k * (n + 1) - 1;\r\n var fl = Math.floor(l);\r\n return utils.cleanFloat((l === fl) ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]));\r\n };\r\n \r\n exports.PERCENTILE.INC = function(array, k) {\r\n array = utils.parseNumberArray(utils.flatten(array));\r\n k = utils.parseNumber(k);\r\n if (utils.anyIsError(array, k)) {\r\n return error.value;\r\n }\r\n array = array.sort(function(a, b) {\r\n return a - b;\r\n });\r\n var n = array.length;\r\n var l = k * (n - 1);\r\n var fl = Math.floor(l);\r\n return utils.cleanFloat((l === fl) ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]));\r\n };\r\n \r\n exports.PERCENTRANK = {};\r\n \r\n exports.PERCENTRANK.EXC = function(array, x, significance) {\r\n significance = (significance === undefined) ? 3 : significance;\r\n array = utils.parseNumberArray(utils.flatten(array));\r\n x = utils.parseNumber(x);\r\n significance = utils.parseNumber(significance);\r\n if (utils.anyIsError(array, x, significance)) {\r\n return error.value;\r\n }\r\n array = array.sort(function(a, b) {\r\n return a - b;\r\n });\r\n var uniques = UNIQUE.apply(null, array);\r\n var n = array.length;\r\n var m = uniques.length;\r\n var power = Math.pow(10, significance);\r\n var result = 0;\r\n var match = false;\r\n var i = 0;\r\n while (!match && i < m) {\r\n if (x === uniques[i]) {\r\n result = (array.indexOf(uniques[i]) + 1) / (n + 1);\r\n match = true;\r\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\r\n result = (array.indexOf(uniques[i]) + 1 + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n + 1);\r\n match = true;\r\n }\r\n i++;\r\n }\r\n return Math.floor(result * power) / power;\r\n };\r\n \r\n exports.PERCENTRANK.INC = function(array, x, significance) {\r\n significance = (significance === undefined) ? 3 : significance;\r\n array = utils.parseNumberArray(utils.flatten(array));\r\n x = utils.parseNumber(x);\r\n significance = utils.parseNumber(significance);\r\n if (utils.anyIsError(array, x, significance)) {\r\n return error.value;\r\n }\r\n array = array.sort(function(a, b) {\r\n return a - b;\r\n });\r\n var uniques = UNIQUE.apply(null, array);\r\n var n = array.length;\r\n var m = uniques.length;\r\n var power = Math.pow(10, significance);\r\n var result = 0;\r\n var match = false;\r\n var i = 0;\r\n while (!match && i < m) {\r\n if (x === uniques[i]) {\r\n result = array.indexOf(uniques[i]) / (n - 1);\r\n match = true;\r\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\r\n result = (array.indexOf(uniques[i]) + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n - 1);\r\n match = true;\r\n }\r\n i++;\r\n }\r\n return Math.floor(result * power) / power;\r\n };\r\n \r\n exports.PERMUT = function(number, number_chosen) {\r\n number = utils.parseNumber(number);\r\n number_chosen = utils.parseNumber(number_chosen);\r\n if (utils.anyIsError(number, number_chosen)) {\r\n return error.value;\r\n }\r\n return FACT(number) / FACT(number - number_chosen);\r\n };\r\n \r\n exports.PERMUTATIONA = function(number, number_chosen) {\r\n number = utils.parseNumber(number);\r\n number_chosen = utils.parseNumber(number_chosen);\r\n if (utils.anyIsError(number, number_chosen)) {\r\n return error.value;\r\n }\r\n return Math.pow(number, number_chosen);\r\n };\r\n \r\n exports.PHI = function(x) {\r\n x = utils.parseNumber(x);\r\n if (x instanceof Error) {\r\n return error.value;\r\n }\r\n return Math.exp(-0.5 * x * x) / SQRT2PI;\r\n };\r\n \r\n exports.PROB = function(range, probability, lower, upper) {\r\n if (lower === undefined) {\r\n return 0;\r\n }\r\n upper = (upper === undefined) ? lower : upper;\r\n \r\n range = utils.parseNumberArray(utils.flatten(range));\r\n probability = utils.parseNumberArray(utils.flatten(probability));\r\n lower = utils.parseNumber(lower);\r\n upper = utils.parseNumber(upper);\r\n if (utils.anyIsError(range, probability, lower, upper)) {\r\n return error.value;\r\n }\r\n \r\n if (lower === upper) {\r\n return (range.indexOf(lower) >= 0) ? probability[range.indexOf(lower)] : 0;\r\n }\r\n \r\n var sorted = range.sort(function(a, b) {\r\n return a - b;\r\n });\r\n var n = sorted.length;\r\n var result = 0;\r\n for (var i = 0; i < n; i++) {\r\n if (sorted[i] >= lower && sorted[i] <= upper) {\r\n result += probability[range.indexOf(sorted[i])];\r\n }\r\n }\r\n return result;\r\n };\r\n \r\n exports.QUARTILE = {};\r\n \r\n exports.QUARTILE.EXC = function(range, quart) {\r\n range = utils.parseNumberArray(utils.flatten(range));\r\n quart = utils.parseNumber(quart);\r\n if (utils.anyIsError(range, quart)) {\r\n return error.value;\r\n }\r\n switch (quart) {\r\n case 1:\r\n return exports.PERCENTILE.EXC(range, 0.25);\r\n case 2:\r\n return exports.PERCENTILE.EXC(range, 0.5);\r\n case 3:\r\n return exports.PERCENTILE.EXC(range, 0.75);\r\n default:\r\n return error.num;\r\n }\r\n };\r\n \r\n exports.QUARTILE.INC = function(range, quart) {\r\n range = utils.parseNumberArray(utils.flatten(range));\r\n quart = utils.parseNumber(quart);\r\n if (utils.anyIsError(range, quart)) {\r\n return error.value;\r\n }\r\n switch (quart) {\r\n case 1:\r\n return exports.PERCENTILE.INC(range, 0.25);\r\n case 2:\r\n return exports.PERCENTILE.INC(range, 0.5);\r\n case 3:\r\n return exports.PERCENTILE.INC(range, 0.75);\r\n default:\r\n return error.num;\r\n }\r\n };\r\n \r\n exports.RANK = {};\r\n \r\n exports.RANK.AVG = function(number, range, order) {\r\n number = utils.parseNumber(number);\r\n range = utils.parseNumberArray(utils.flatten(range));\r\n if (utils.anyIsError(number, range)) {\r\n return error.value;\r\n }\r\n range = utils.flatten(range);\r\n order = order || false;\r\n var sort = (order) ? function(a, b) {\r\n return a - b;\r\n } : function(a, b) {\r\n return b - a;\r\n };\r\n range = range.sort(sort);\r\n \r\n var length = range.length;\r\n var count = 0;\r\n for (var i = 0; i < length; i++) {\r\n if (range[i] === number) {\r\n count++;\r\n }\r\n }\r\n \r\n return (count > 1) ? (2 * range.indexOf(number) + count + 1) / 2 : range.indexOf(number) + 1;\r\n };\r\n \r\n exports.RANK.EQ = function(number, range, order) {\r\n number = utils.parseNumber(number);\r\n range = utils.parseNumberArray(utils.flatten(range));\r\n if (utils.anyIsError(number, range)) {\r\n return error.value;\r\n }\r\n order = order || false;\r\n var sort = (order) ? function(a, b) {\r\n return a - b;\r\n } : function(a, b) {\r\n return b - a;\r\n };\r\n range = range.sort(sort);\r\n return range.indexOf(number) + 1;\r\n };\r\n \r\n exports.RSQ = function(data_x, data_y) { // no need to flatten here, PEARSON will take care of that\r\n data_x = utils.parseNumberArray(utils.flatten(data_x));\r\n data_y = utils.parseNumberArray(utils.flatten(data_y));\r\n if (utils.anyIsError(data_x, data_y)) {\r\n return error.value;\r\n }\r\n return Math.pow(exports.PEARSON(data_x, data_y), 2);\r\n };\r\n \r\n exports.SMALL = function(range, k) {\r\n range = utils.parseNumberArray(utils.flatten(range));\r\n k = utils.parseNumber(k);\r\n if (utils.anyIsError(range, k)) {\r\n return range;\r\n }\r\n return range.sort(function(a, b) {\r\n return a - b;\r\n })[k - 1];\r\n };\r\n \r\n exports.STANDARDIZE = function(x, mean, sd) {\r\n x = utils.parseNumber(x);\r\n mean = utils.parseNumber(mean);\r\n sd = utils.parseNumber(sd);\r\n if (utils.anyIsError(x, mean, sd)) {\r\n return error.value;\r\n }\r\n return (x - mean) / sd;\r\n };\r\n \r\n exports.STDEV = {};\r\n \r\n exports.STDEV.P = function() {\r\n var v = exports.VAR.P.apply(this, arguments);\r\n return Math.sqrt(v);\r\n };\r\n \r\n exports.STDEV.S = function() {\r\n var v = exports.VAR.S.apply(this, arguments);\r\n return Math.sqrt(v);\r\n };\r\n \r\n exports.STDEVA = function() {\r\n var v = exports.VARA.apply(this, arguments);\r\n return Math.sqrt(v);\r\n };\r\n \r\n exports.STDEVPA = function() {\r\n var v = exports.VARPA.apply(this, arguments);\r\n return Math.sqrt(v);\r\n };\r\n \r\n exports.VAR = {};\r\n \r\n exports.VAR.P = function() {\r\n var range = utils.numbers(utils.flatten(arguments));\r\n var n = range.length;\r\n var sigma = 0;\r\n var mean = exports.AVERAGE(range);\r\n for (var i = 0; i < n; i++) {\r\n sigma += Math.pow(range[i] - mean, 2);\r\n }\r\n return sigma / n;\r\n };\r\n \r\n exports.VAR.S = function() {\r\n var range = utils.numbers(utils.flatten(arguments));\r\n var n = range.length;\r\n var sigma = 0;\r\n var mean = exports.AVERAGE(range);\r\n for (var i = 0; i < n; i++) {\r\n sigma += Math.pow(range[i] - mean, 2);\r\n }\r\n return sigma / (n - 1);\r\n };\r\n \r\n exports.VARA = function() {\r\n var range = utils.flatten(arguments);\r\n var n = range.length;\r\n var sigma = 0;\r\n var count = 0;\r\n var mean = exports.AVERAGEA(range);\r\n for (var i = 0; i < n; i++) {\r\n var el = range[i];\r\n if (typeof el === 'number') {\r\n sigma += Math.pow(el - mean, 2);\r\n } else if (el === true) {\r\n sigma += Math.pow(1 - mean, 2);\r\n } else {\r\n sigma += Math.pow(0 - mean, 2);\r\n }\r\n \r\n if (el !== null) {\r\n count++;\r\n }\r\n }\r\n return sigma / (count - 1);\r\n };\r\n \r\n exports.VARPA = function() {\r\n var range = utils.flatten(arguments);\r\n var n = range.length;\r\n var sigma = 0;\r\n var count = 0;\r\n var mean = exports.AVERAGEA(range);\r\n for (var i = 0; i < n; i++) {\r\n var el = range[i];\r\n if (typeof el === 'number') {\r\n sigma += Math.pow(el - mean, 2);\r\n } else if (el === true) {\r\n sigma += Math.pow(1 - mean, 2);\r\n } else {\r\n sigma += Math.pow(0 - mean, 2);\r\n }\r\n \r\n if (el !== null) {\r\n count++;\r\n }\r\n }\r\n return sigma / count;\r\n };\r\n \r\n exports.WEIBULL = {};\r\n \r\n exports.WEIBULL.DIST = function(x, alpha, beta, cumulative) {\r\n x = utils.parseNumber(x);\r\n alpha = utils.parseNumber(alpha);\r\n beta = utils.parseNumber(beta);\r\n if (utils.anyIsError(x, alpha, beta)) {\r\n return error.value;\r\n }\r\n return (cumulative) ? 1 - Math.exp(-Math.pow(x / beta, alpha)) : Math.pow(x, alpha - 1) * Math.exp(-Math.pow(x / beta, alpha)) * alpha / Math.pow(beta, alpha);\r\n };\r\n \r\n exports.Z = {};\r\n \r\n exports.Z.TEST = function(range, x, sd) {\r\n range = utils.parseNumberArray(utils.flatten(range));\r\n x = utils.parseNumber(x);\r\n if (utils.anyIsError(range, x)) {\r\n return error.value;\r\n }\r\n \r\n sd = sd || exports.STDEV.S(range);\r\n var n = range.length;\r\n return 1 - exports.NORM.S.DIST((exports.AVERAGE(range) - x) / (sd / Math.sqrt(n)), true);\r\n };\r\n \r\n return exports;\r\n })();\r\n\r\n jexcel.methods.utils = (function() {\r\n var exports = {};\r\n\r\n exports.PROGRESS = function(p, c) {\r\n var color = c ? c : 'red';\r\n var value = p ? p : '0';\r\n\r\n return '
';\r\n };\r\n\r\n exports.RATING = function(v) {\r\n var html = '
';\r\n for (var i = 0; i < 5; i++) {\r\n if (i < v) {\r\n html += '
';\r\n } else {\r\n html += '
';\r\n }\r\n }\r\n html += '
';\r\n return html;\r\n }\r\n\r\n return exports;\r\n })();\r\n\r\n for (var i = 0; i < Object.keys(jexcel.methods).length; i++) {\r\n var methods = jexcel.methods[Object.keys(jexcel.methods)[i]];\r\n for (var j = 0; j < Object.keys(methods).length; j++) {\r\n if (typeof(methods[Object.keys(methods)[j]]) == 'function') {\r\n window[Object.keys(methods)[j]] = methods[Object.keys(methods)[j]];\r\n } else {\r\n window[Object.keys(methods)[j]] = function() {\r\n return Object.keys(methods)[j] + 'Not implemented';\r\n }\r\n }\r\n }\r\n }\r\n\r\n return jexcel;\r\n})));\r\n","/**\r\n * (c) jSuites Javascript Web Components\r\n *\r\n * Website: https://jsuites.net\r\n * Description: Create amazing web based applications.\r\n *\r\n * MIT License\r\n *\r\n */\r\n;(function (global, factory) {\r\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n typeof define === 'function' && define.amd ? define(factory) :\r\n global.jSuites = factory();\r\n}(this, (function () {\r\n\r\n 'use strict';\r\n\r\nvar jSuites = function(options) {\r\n var obj = {}\r\n var version = '4.5.4';\r\n\r\n var find = function(DOMElement, component) {\r\n if (DOMElement[component.type] && DOMElement[component.type] == component) {\r\n return true;\r\n }\r\n if (DOMElement.parentNode) {\r\n return find(DOMElement.parentNode, component);\r\n }\r\n return false;\r\n }\r\n\r\n var isOpened = function(e) {\r\n if (jSuites.current.length > 0) {\r\n for (var i = 0; i < jSuites.current.length; i++) {\r\n if (jSuites.current[i] && ! find(e.target, jSuites.current[i])) {\r\n jSuites.current[i].close();\r\n }\r\n }\r\n }\r\n }\r\n\r\n obj.init = function() {\r\n document.addEventListener(\"click\", isOpened);\r\n\r\n obj.version = version;\r\n }\r\n\r\n obj.tracking = function(component, state) {\r\n if (state == true) {\r\n jSuites.current = jSuites.current.filter(function(v) {\r\n return v !== null;\r\n });\r\n\r\n // Start after all events\r\n setTimeout(function() {\r\n jSuites.current.push(component);\r\n }, 0);\r\n\r\n } else {\r\n var index = jSuites.current.indexOf(component);\r\n if (index >= 0) {\r\n jSuites.current[index] = null;\r\n }\r\n }\r\n }\r\n\r\n obj.path = function(str) {\r\n str = str.split('.');\r\n if (str.length) {\r\n var o = this;\r\n var t = null;\r\n while (t = str.shift()) {\r\n if (o.hasOwnProperty(t)) {\r\n o = o[t];\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n return o;\r\n }\r\n return false;\r\n }\r\n\r\n // Array of opened components\r\n obj.current = [];\r\n\r\n return obj;\r\n}();\r\n\r\n/**\r\n * Global jsuites event\r\n */\r\nif (typeof(document) !== \"undefined\") {\r\n jSuites.init();\r\n}\r\n\r\njSuites.ajax = (function(options, complete) {\r\n if (Array.isArray(options)) {\r\n // Create multiple request controller \r\n var multiple = {\r\n instance: [],\r\n complete: complete,\r\n }\r\n\r\n if (options.length > 0) {\r\n for (var i = 0; i < options.length; i++) {\r\n options[i].multiple = multiple;\r\n multiple.instance.push(jSuites.ajax(options[i]));\r\n }\r\n }\r\n\r\n return multiple;\r\n }\r\n\r\n if (! options.data) {\r\n options.data = {};\r\n }\r\n\r\n if (options.type) {\r\n options.method = options.type;\r\n }\r\n\r\n // Default method\r\n if (! options.method) {\r\n options.method = 'GET';\r\n }\r\n\r\n // Default type\r\n if (! options.dataType) {\r\n options.dataType = 'json';\r\n }\r\n\r\n if (options.data) {\r\n // Parse object to variables format\r\n var parseData = function(value, key) {\r\n var vars = [];\r\n var keys = Object.keys(value);\r\n if (keys.length) {\r\n for (var i = 0; i < keys.length; i++) {\r\n if (key) {\r\n var k = key + '[' + keys[i] + ']';\r\n } else {\r\n var k = keys[i];\r\n }\r\n\r\n if (typeof(value[keys[i]]) == 'object') {\r\n var r = parseData(value[keys[i]], k);\r\n var o = Object.keys(r);\r\n for (var j = 0; j < o.length; j++) {\r\n vars[o[j]] = r[o[j]];\r\n }\r\n } else {\r\n vars[k] = value[keys[i]];\r\n }\r\n }\r\n }\r\n\r\n return vars;\r\n }\r\n\r\n var data = [];\r\n var d = parseData(options.data);\r\n var k = Object.keys(d);\r\n for (var i = 0; i < k.length; i++) {\r\n data.push(k[i] + '=' + encodeURIComponent(d[k[i]]));\r\n }\r\n\r\n if (options.method == 'GET' && data.length > 0) {\r\n if (options.url.indexOf('?') < 0) {\r\n options.url += '?';\r\n }\r\n options.url += data.join('&');\r\n }\r\n }\r\n\r\n var httpRequest = new XMLHttpRequest();\r\n httpRequest.open(options.method, options.url, true);\r\n httpRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n\r\n if (options.method == 'POST') {\r\n httpRequest.setRequestHeader('Accept', 'application/json');\r\n httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n } else {\r\n if (options.dataType == 'json') {\r\n httpRequest.setRequestHeader('Content-Type', 'text/json');\r\n } else if (options.dataType == 'blob') {\r\n httpRequest.responseType = \"blob\";\r\n }\r\n }\r\n\r\n // No cache\r\n if (options.cache != true) {\r\n httpRequest.setRequestHeader('pragma', 'no-cache');\r\n httpRequest.setRequestHeader('cache-control', 'no-cache');\r\n }\r\n\r\n // Authentication\r\n if (options.withCredentials == true) {\r\n httpRequest.withCredentials = true\r\n }\r\n\r\n // Before send\r\n if (typeof(options.beforeSend) == 'function') {\r\n options.beforeSend(httpRequest);\r\n }\r\n\r\n httpRequest.onload = function() {\r\n if (httpRequest.status === 200) {\r\n if (options.dataType == 'json') {\r\n try {\r\n var result = JSON.parse(httpRequest.responseText);\r\n\r\n if (options.success && typeof(options.success) == 'function') {\r\n options.success(result);\r\n }\r\n } catch(err) {\r\n if (options.error && typeof(options.error) == 'function') {\r\n options.error(err, result);\r\n }\r\n }\r\n } else {\r\n if (options.dataType == 'blob') {\r\n var result = httpRequest.response;\r\n } else {\r\n var result = httpRequest.responseText;\r\n }\r\n\r\n if (options.success && typeof(options.success) == 'function') {\r\n options.success(result);\r\n }\r\n }\r\n } else {\r\n if (options.error && typeof(options.error) == 'function') {\r\n options.error(httpRequest.responseText);\r\n }\r\n }\r\n\r\n // Global queue\r\n if (jSuites.ajax.queue && jSuites.ajax.queue.length > 0) {\r\n jSuites.ajax.send(jSuites.ajax.queue.shift());\r\n }\r\n\r\n // Global complete method\r\n if (jSuites.ajax.requests && jSuites.ajax.requests.length) {\r\n // Get index of this request in the container\r\n var index = jSuites.ajax.requests.indexOf(httpRequest);\r\n // Remove from the ajax requests container\r\n jSuites.ajax.requests.splice(index, 1);\r\n // Last one?\r\n if (! jSuites.ajax.requests.length) {\r\n // Object event\r\n if (options.complete && typeof(options.complete) == 'function') {\r\n options.complete(result);\r\n }\r\n // Global event\r\n if (typeof(jSuites.ajax.oncomplete[options.group]) == 'function') {\r\n jSuites.ajax.oncomplete[options.group]();\r\n jSuites.ajax.oncomplete[options.group] = null;\r\n }\r\n }\r\n // Controllers\r\n if (options.multiple && options.multiple.instance) {\r\n // Get index of this request in the container\r\n var index = options.multiple.instance.indexOf(httpRequest);\r\n // Remove from the ajax requests container\r\n options.multiple.instance.splice(index, 1);\r\n // If this is the last one call method complete\r\n if (! options.multiple.instance.length) {\r\n if (options.multiple.complete && typeof(options.multiple.complete) == 'function') {\r\n options.multiple.complete(result);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Keep the options\r\n httpRequest.options = options;\r\n // Data\r\n httpRequest.data = data;\r\n\r\n // Queue\r\n if (options.queue == true && jSuites.ajax.requests.length > 0) {\r\n jSuites.ajax.queue.push(httpRequest);\r\n } else {\r\n jSuites.ajax.send(httpRequest)\r\n }\r\n\r\n return httpRequest;\r\n});\r\n\r\njSuites.ajax.send = function(httpRequest) {\r\n if (httpRequest.data) {\r\n httpRequest.send(httpRequest.data.join('&'));\r\n } else {\r\n httpRequest.send();\r\n }\r\n\r\n jSuites.ajax.requests.push(httpRequest);\r\n}\r\n\r\njSuites.ajax.exists = function(url, __callback) {\r\n var http = new XMLHttpRequest();\r\n http.open('HEAD', url, false);\r\n http.send();\r\n if (http.status) {\r\n __callback(http.status);\r\n }\r\n}\r\n\r\njSuites.ajax.pending = function(group) {\r\n var n = 0;\r\n var o = jSuites.ajax.requests;\r\n if (o && o.length) {\r\n for (var i = 0; i < o.length; i++) {\r\n if (! group || group == o[i].options.group) {\r\n n++\r\n }\r\n }\r\n }\r\n return n;\r\n}\r\n\r\njSuites.ajax.oncomplete = {};\r\njSuites.ajax.requests = [];\r\njSuites.ajax.queue = [];\r\n\r\njSuites.alert = function(message) {\r\n if (jSuites.getWindowWidth() < 800 && jSuites.dialog) {\r\n jSuites.dialog.open({\r\n title:'Alert',\r\n message:message,\r\n });\r\n } else {\r\n alert(message);\r\n }\r\n}\r\n\r\njSuites.animation = {};\r\n\r\njSuites.animation.slideLeft = function(element, direction, done) {\r\n if (direction == true) {\r\n element.classList.add('slide-left-in');\r\n setTimeout(function() {\r\n element.classList.remove('slide-left-in');\r\n if (typeof(done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n } else {\r\n element.classList.add('slide-left-out');\r\n setTimeout(function() {\r\n element.classList.remove('slide-left-out');\r\n if (typeof(done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n }\r\n}\r\n\r\njSuites.animation.slideRight = function(element, direction, done) {\r\n if (direction == true) {\r\n element.classList.add('slide-right-in');\r\n setTimeout(function() {\r\n element.classList.remove('slide-right-in');\r\n if (typeof(done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n } else {\r\n element.classList.add('slide-right-out');\r\n setTimeout(function() {\r\n element.classList.remove('slide-right-out');\r\n if (typeof(done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n }\r\n}\r\n\r\njSuites.animation.slideTop = function(element, direction, done) {\r\n if (direction == true) {\r\n element.classList.add('slide-top-in');\r\n setTimeout(function() {\r\n element.classList.remove('slide-top-in');\r\n if (typeof(done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n } else {\r\n element.classList.add('slide-top-out');\r\n setTimeout(function() {\r\n element.classList.remove('slide-top-out');\r\n if (typeof(done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n }\r\n}\r\n\r\njSuites.animation.slideBottom = function(element, direction, done) {\r\n if (direction == true) {\r\n element.classList.add('slide-bottom-in');\r\n setTimeout(function() {\r\n element.classList.remove('slide-bottom-in');\r\n if (typeof(done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n } else {\r\n element.classList.add('slide-bottom-out');\r\n setTimeout(function() {\r\n element.classList.remove('slide-bottom-out');\r\n if (typeof(done) == 'function') {\r\n done();\r\n }\r\n }, 100);\r\n }\r\n}\r\n\r\njSuites.animation.fadeIn = function(element, done) {\r\n element.style.display = '';\r\n element.classList.add('fade-in');\r\n setTimeout(function() {\r\n element.classList.remove('fade-in');\r\n if (typeof(done) == 'function') {\r\n done();\r\n }\r\n }, 2000);\r\n}\r\n\r\njSuites.animation.fadeOut = function(element, done) {\r\n element.classList.add('fade-out');\r\n setTimeout(function() {\r\n element.style.display = 'none';\r\n element.classList.remove('fade-out');\r\n if (typeof(done) == 'function') {\r\n done();\r\n }\r\n }, 1000);\r\n}\r\n\r\njSuites.calendar = (function(el, options) {\r\n // Already created, update options\r\n if (el.calendar) {\r\n return el.calendar.setOptions(options, true);\r\n }\r\n\r\n // New instance\r\n var obj = { type:'calendar' };\r\n obj.options = {};\r\n\r\n // Date\r\n obj.date = null;\r\n\r\n /**\r\n * Update options\r\n */\r\n obj.setOptions = function(options, reset) {\r\n // Default configuration\r\n var defaults = {\r\n // Render type: [ default | year-month-picker ]\r\n type: 'default',\r\n // Restrictions\r\n validRange: null,\r\n // Starting weekday - 0 for sunday, 6 for saturday\r\n startingDay: null, \r\n // Date format\r\n format: 'DD/MM/YYYY',\r\n // Allow keyboard date entry\r\n readonly: true,\r\n // Today is default\r\n today: false,\r\n // Show timepicker\r\n time: false,\r\n // Show the reset button\r\n resetButton: true,\r\n // Placeholder\r\n placeholder: '',\r\n // Translations can be done here\r\n months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\r\n monthsFull: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\r\n weekdays: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],\r\n weekdays_short: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\r\n textDone: 'Done',\r\n textReset: 'Reset',\r\n textUpdate: 'Update',\r\n // Value\r\n value: null,\r\n // Fullscreen (this is automatic set for screensize < 800)\r\n fullscreen: false,\r\n // Create the calendar closed as default\r\n opened: false,\r\n // Events\r\n onopen: null,\r\n onclose: null,\r\n onchange: null,\r\n onupdate: null,\r\n // Internal mode controller\r\n mode: null,\r\n position: null,\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Reset button\r\n if (obj.options.resetButton == false) {\r\n calendarReset.style.display = 'none';\r\n } else {\r\n calendarReset.style.display = '';\r\n }\r\n\r\n // Readonly\r\n if (obj.options.readonly) {\r\n el.setAttribute('readonly', 'readonly');\r\n } else {\r\n el.removeAttribute('readonly');\r\n }\r\n\r\n // Placeholder\r\n if (obj.options.placeholder) {\r\n el.setAttribute('placeholder', obj.options.placeholder);\r\n } else {\r\n el.removeAttribute('placeholder');\r\n }\r\n\r\n // Texts\r\n calendarReset.innerHTML = obj.options.textReset;\r\n calendarConfirm.innerHTML = obj.options.textDone;\r\n calendarControlsUpdateButton.innerHTML = obj.options.textUpdate;\r\n\r\n // Define mask\r\n el.setAttribute('data-mask', obj.options.format.toLowerCase());\r\n\r\n // Value\r\n if (! obj.options.value && obj.options.today) {\r\n var value = jSuites.calendar.now();\r\n } else {\r\n var value = obj.options.value;\r\n }\r\n\r\n // Set internal date\r\n if (value) {\r\n // Force the update\r\n obj.options.value = null;\r\n // New value\r\n obj.setValue(value);\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * Open the calendar\r\n */\r\n obj.open = function (value) {\r\n if (! calendar.classList.contains('jcalendar-focus')) {\r\n if (! calendar.classList.contains('jcalendar-inline')) {\r\n // Current\r\n jSuites.calendar.current = obj;\r\n // Start tracking\r\n jSuites.tracking(obj, true);\r\n // Create the days\r\n obj.getDays();\r\n // Render months\r\n if (obj.options.type == 'year-month-picker') {\r\n obj.getMonths();\r\n }\r\n // Get time\r\n if (obj.options.time) {\r\n calendarSelectHour.value = obj.date[3];\r\n calendarSelectMin.value = obj.date[4];\r\n }\r\n\r\n // Show calendar\r\n calendar.classList.add('jcalendar-focus');\r\n\r\n // Get the position of the corner helper\r\n if (jSuites.getWindowWidth() < 800 || obj.options.fullscreen) {\r\n calendar.classList.add('jcalendar-fullsize');\r\n // Animation\r\n jSuites.animation.slideBottom(calendarContent, 1);\r\n } else {\r\n calendar.classList.remove('jcalendar-fullsize');\r\n\r\n var rect = el.getBoundingClientRect();\r\n var rectContent = calendarContent.getBoundingClientRect();\r\n\r\n if (obj.options.position) {\r\n calendarContainer.style.position = 'fixed';\r\n if (window.innerHeight < rect.bottom + rectContent.height) {\r\n calendarContainer.style.top = (rect.top - (rectContent.height + 2)) + 'px';\r\n } else {\r\n calendarContainer.style.top = (rect.top + rect.height + 2) + 'px';\r\n }\r\n calendarContainer.style.left = rect.left + 'px';\r\n } else {\r\n if (window.innerHeight < rect.bottom + rectContent.height) {\r\n var d = -1 * (rect.height + rectContent.height + 2);\r\n if (d + rect.top < 0) {\r\n d = -1 * (rect.top + rect.height);\r\n }\r\n calendarContainer.style.top = d + 'px';\r\n } else {\r\n calendarContainer.style.top = 2 + 'px'; \r\n }\r\n\r\n if (window.innerWidth < rect.left + rectContent.width) {\r\n var d = window.innerWidth - (rect.left + rectContent.width + 20);\r\n calendarContainer.style.left = d + 'px';\r\n } else {\r\n calendarContainer.style.left = '0px'; \r\n }\r\n }\r\n }\r\n\r\n // Events\r\n if (typeof(obj.options.onopen) == 'function') {\r\n obj.options.onopen(el);\r\n }\r\n }\r\n }\r\n }\r\n\r\n obj.close = function (ignoreEvents, update) {\r\n if (calendar.classList.contains('jcalendar-focus')) {\r\n if (update !== false) {\r\n var element = calendar.querySelector('.jcalendar-selected');\r\n\r\n if (typeof(update) == 'string') {\r\n var value = update;\r\n } else if (! element || element.classList.contains('jcalendar-disabled')) {\r\n var value = obj.options.value\r\n } else {\r\n var value = obj.getValue();\r\n }\r\n\r\n obj.setValue(value);\r\n }\r\n\r\n // Events\r\n if (! ignoreEvents && typeof(obj.options.onclose) == 'function') {\r\n obj.options.onclose(el);\r\n }\r\n // Hide\r\n calendar.classList.remove('jcalendar-focus');\r\n // Stop tracking\r\n jSuites.tracking(obj, false);\r\n // Current\r\n jSuites.calendar.current = null;\r\n }\r\n\r\n return obj.options.value;\r\n }\r\n\r\n obj.prev = function() {\r\n // Check if the visualization is the days picker or years picker\r\n if (obj.options.mode == 'years') {\r\n obj.date[0] = obj.date[0] - 12;\r\n\r\n // Update picker table of days\r\n obj.getYears();\r\n } else if (obj.options.mode == 'months') {\r\n obj.date[0] = parseInt(obj.date[0]) - 1;\r\n // Update picker table of months\r\n obj.getMonths();\r\n } else {\r\n // Go to the previous month\r\n if (obj.date[1] < 2) {\r\n obj.date[0] = obj.date[0] - 1;\r\n obj.date[1] = 12;\r\n } else {\r\n obj.date[1] = obj.date[1] - 1;\r\n }\r\n\r\n // Update picker table of days\r\n obj.getDays();\r\n }\r\n }\r\n\r\n obj.next = function() {\r\n // Check if the visualization is the days picker or years picker\r\n if (obj.options.mode == 'years') {\r\n obj.date[0] = parseInt(obj.date[0]) + 12;\r\n\r\n // Update picker table of days\r\n obj.getYears();\r\n } else if (obj.options.mode == 'months') {\r\n obj.date[0] = parseInt(obj.date[0]) + 1;\r\n // Update picker table of months\r\n obj.getMonths();\r\n } else {\r\n // Go to the previous month\r\n if (obj.date[1] > 11) {\r\n obj.date[0] = parseInt(obj.date[0]) + 1;\r\n obj.date[1] = 1;\r\n } else {\r\n obj.date[1] = parseInt(obj.date[1]) + 1;\r\n }\r\n\r\n // Update picker table of days\r\n obj.getDays();\r\n }\r\n }\r\n\r\n /**\r\n * Set today\r\n */\r\n obj.setToday = function() {\r\n // Today\r\n var value = new Date().toISOString().substr(0, 10);\r\n // Change value\r\n obj.setValue(value);\r\n // Value\r\n return value;\r\n }\r\n\r\n obj.setValue = function(val) {\r\n if (! val) {\r\n val = '' + val;\r\n }\r\n // Values\r\n var newValue = val;\r\n var oldValue = obj.options.value;\r\n\r\n if (oldValue != newValue) {\r\n // Set label\r\n if (! newValue) {\r\n obj.date = null;\r\n var val = '';\r\n } else {\r\n var value = obj.setLabel(newValue, obj.options);\r\n var date = newValue.split(' ');\r\n if (! date[1]) {\r\n date[1] = '00:00:00';\r\n }\r\n var time = date[1].split(':')\r\n var date = date[0].split('-');\r\n var y = parseInt(date[0]);\r\n var m = parseInt(date[1]);\r\n var d = parseInt(date[2]);\r\n var h = parseInt(time[0]);\r\n var i = parseInt(time[1]);\r\n obj.date = [ y, m, d, h, i, 0 ];\r\n var val = obj.setLabel(newValue, obj.options);\r\n }\r\n\r\n // New value\r\n obj.options.value = newValue;\r\n\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, newValue, oldValue);\r\n }\r\n\r\n // Lemonade JS\r\n if (el.value != val) {\r\n el.value = val;\r\n if (typeof(el.onchange) == 'function') {\r\n el.onchange({\r\n type: 'change',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n obj.getDays();\r\n }\r\n\r\n obj.getValue = function() {\r\n if (obj.date) {\r\n if (obj.options.time) {\r\n return jSuites.two(obj.date[0]) + '-' + jSuites.two(obj.date[1]) + '-' + jSuites.two(obj.date[2]) + ' ' + jSuites.two(obj.date[3]) + ':' + jSuites.two(obj.date[4]) + ':' + jSuites.two(0);\r\n } else {\r\n return jSuites.two(obj.date[0]) + '-' + jSuites.two(obj.date[1]) + '-' + jSuites.two(obj.date[2]) + ' ' + jSuites.two(0) + ':' + jSuites.two(0) + ':' + jSuites.two(0);\r\n }\r\n } else {\r\n return \"\";\r\n }\r\n }\r\n\r\n /**\r\n * Calendar\r\n */\r\n obj.update = function(element, v) {\r\n if (element.classList.contains('jcalendar-disabled')) {\r\n // Do nothing\r\n } else {\r\n var elements = calendar.querySelector('.jcalendar-selected');\r\n if (elements) {\r\n elements.classList.remove('jcalendar-selected');\r\n }\r\n element.classList.add('jcalendar-selected');\r\n\r\n if (element.classList.contains('jcalendar-set-month')) {\r\n obj.date[1] = v;\r\n } else {\r\n obj.date[2] = element.innerText;\r\n }\r\n\r\n if (! obj.options.time) {\r\n obj.close();\r\n } else {\r\n obj.date[3] = calendarSelectHour.value;\r\n obj.date[4] = calendarSelectMin.value;\r\n }\r\n }\r\n\r\n // Update\r\n updateActions();\r\n }\r\n\r\n /**\r\n * Set to blank\r\n */\r\n obj.reset = function() {\r\n // Close calendar\r\n obj.setValue('');\r\n obj.date = null;\r\n obj.close(false, false);\r\n }\r\n\r\n /**\r\n * Get calendar days\r\n */\r\n obj.getDays = function() {\r\n // Mode\r\n obj.options.mode = 'days';\r\n\r\n // Setting current values in case of NULLs\r\n var date = new Date();\r\n\r\n // Current selection\r\n var year = obj.date && jSuites.isNumeric(obj.date[0]) ? obj.date[0] : parseInt(date.getFullYear());\r\n var month = obj.date && jSuites.isNumeric(obj.date[1]) ? obj.date[1] : parseInt(date.getMonth()) + 1;\r\n var day = obj.date && jSuites.isNumeric(obj.date[2]) ? obj.date[2] : parseInt(date.getDate());\r\n var hour = obj.date && jSuites.isNumeric(obj.date[3]) ? obj.date[3] : parseInt(date.getHours());\r\n var min = obj.date && jSuites.isNumeric(obj.date[4]) ? obj.date[4] : parseInt(date.getMinutes());\r\n\r\n // Selection container\r\n obj.date = [ year, month, day, hour, min, 0 ];\r\n\r\n // Update title\r\n calendarLabelYear.innerHTML = year;\r\n calendarLabelMonth.innerHTML = obj.options.months[month - 1];\r\n\r\n // Current month and Year\r\n var isCurrentMonthAndYear = (date.getMonth() == month - 1) && (date.getFullYear() == year) ? true : false;\r\n var currentDay = date.getDate();\r\n\r\n // Number of days in the month\r\n var date = new Date(year, month, 0, 0, 0);\r\n var numberOfDays = date.getDate();\r\n\r\n // First day\r\n var date = new Date(year, month-1, 0, 0, 0);\r\n var firstDay = date.getDay() + 1;\r\n\r\n // Index value\r\n var index = obj.options.startingDay || 0;\r\n\r\n // First of day relative to the starting calendar weekday\r\n firstDay = firstDay - index;\r\n\r\n // Reset table\r\n calendarBody.innerHTML = '';\r\n\r\n // Weekdays Row\r\n var row = document.createElement('tr');\r\n row.setAttribute('align', 'center');\r\n calendarBody.appendChild(row);\r\n\r\n // Create weekdays row\r\n for (var i = 0; i < 7; i++) {\r\n var cell = document.createElement('td');\r\n cell.classList.add('jcalendar-weekday')\r\n cell.innerHTML = obj.options.weekdays_short[index];\r\n row.appendChild(cell);\r\n // Next week day\r\n index++;\r\n // Restart index\r\n if (index > 6) {\r\n index = 0;\r\n }\r\n }\r\n\r\n // Index of days\r\n var index = 0;\r\n var d = 0;\r\n \r\n // Calendar table\r\n for (var j = 0; j < 6; j++) {\r\n // Reset cells container\r\n var row = document.createElement('tr');\r\n row.setAttribute('align', 'center');\r\n // Data control\r\n var emptyRow = true;\r\n // Create cells\r\n for (var i = 0; i < 7; i++) {\r\n // Create cell\r\n var cell = document.createElement('td');\r\n cell.classList.add('jcalendar-set-day');\r\n\r\n if (index >= firstDay && index < (firstDay + numberOfDays)) {\r\n // Day cell\r\n d++;\r\n cell.innerHTML = d;\r\n\r\n // Selected\r\n if (d == day) {\r\n cell.classList.add('jcalendar-selected');\r\n }\r\n\r\n // Current selection day is today\r\n if (isCurrentMonthAndYear && currentDay == d) {\r\n cell.style.fontWeight = 'bold';\r\n }\r\n\r\n // Current selection day\r\n var current = jSuites.calendar.now(new Date(year, month-1, d), true);\r\n\r\n // Available ranges\r\n if (obj.options.validRange) {\r\n if (! obj.options.validRange[0] || current >= obj.options.validRange[0]) {\r\n var test1 = true;\r\n } else {\r\n var test1 = false;\r\n }\r\n\r\n if (! obj.options.validRange[1] || current <= obj.options.validRange[1]) {\r\n var test2 = true;\r\n } else {\r\n var test2 = false;\r\n }\r\n\r\n if (! (test1 && test2)) {\r\n cell.classList.add('jcalendar-disabled');\r\n }\r\n }\r\n\r\n // Control\r\n emptyRow = false;\r\n }\r\n // Day cell\r\n row.appendChild(cell);\r\n // Index\r\n index++;\r\n }\r\n\r\n // Add cell to the calendar body\r\n if (emptyRow == false) {\r\n calendarBody.appendChild(row);\r\n }\r\n }\r\n\r\n // Show time controls\r\n if (obj.options.time) {\r\n calendarControlsTime.style.display = '';\r\n } else {\r\n calendarControlsTime.style.display = 'none';\r\n }\r\n\r\n // Update\r\n updateActions();\r\n }\r\n\r\n obj.getMonths = function() {\r\n // Mode\r\n obj.options.mode = 'months';\r\n\r\n // Loading month labels\r\n var months = obj.options.months;\r\n\r\n // Value\r\n var value = obj.options.value; \r\n\r\n // Current date\r\n var date = new Date();\r\n var currentYear = parseInt(date.getFullYear());\r\n var currentMonth = parseInt(date.getMonth()) + 1;\r\n var selectedYear = obj.date && jSuites.isNumeric(obj.date[0]) ? obj.date[0] : currentYear;\r\n var selectedMonth = obj.date && jSuites.isNumeric(obj.date[1]) ? obj.date[1] : currentMonth;\r\n\r\n // Update title\r\n calendarLabelYear.innerHTML = obj.date[0];\r\n calendarLabelMonth.innerHTML = months[selectedMonth-1];\r\n\r\n // Table\r\n var table = document.createElement('table');\r\n table.setAttribute('width', '100%');\r\n\r\n // Row\r\n var row = null;\r\n\r\n // Calendar table\r\n for (var i = 0; i < 12; i++) {\r\n if (! (i % 4)) {\r\n // Reset cells container\r\n var row = document.createElement('tr');\r\n row.setAttribute('align', 'center');\r\n table.appendChild(row);\r\n }\r\n\r\n // Create cell\r\n var cell = document.createElement('td');\r\n cell.classList.add('jcalendar-set-month');\r\n cell.setAttribute('data-value', i+1);\r\n cell.innerText = months[i];\r\n\r\n if (obj.options.validRange) {\r\n var current = selectedYear + '-' + jSuites.two(i+1);\r\n if (! obj.options.validRange[0] || current >= obj.options.validRange[0].substr(0,7)) {\r\n var test1 = true;\r\n } else {\r\n var test1 = false;\r\n }\r\n\r\n if (! obj.options.validRange[1] || current <= obj.options.validRange[1].substr(0,7)) {\r\n var test2 = true;\r\n } else {\r\n var test2 = false;\r\n }\r\n\r\n if (! (test1 && test2)) {\r\n cell.classList.add('jcalendar-disabled');\r\n }\r\n }\r\n\r\n if (i+1 == selectedMonth) {\r\n cell.classList.add('jcalendar-selected');\r\n }\r\n\r\n if (currentYear == selectedYear && i+1 == currentMonth) {\r\n cell.style.fontWeight = 'bold';\r\n }\r\n\r\n row.appendChild(cell);\r\n }\r\n\r\n calendarBody.innerHTML = '';\r\n calendarBody.children[0].children[0].appendChild(table);\r\n\r\n // Update\r\n updateActions();\r\n }\r\n\r\n obj.getYears = function() { \r\n // Mode\r\n obj.options.mode = 'years';\r\n\r\n // Current date\r\n var date = new Date();\r\n var currentYear = date.getFullYear();\r\n var selectedYear = obj.date && jSuites.isNumeric(obj.date[0]) ? obj.date[0] : parseInt(date.getFullYear());\r\n\r\n // Array of years\r\n var y = [];\r\n for (var i = 0; i < 25; i++) {\r\n y[i] = parseInt(obj.date[0]) + (i - 12);\r\n }\r\n\r\n // Assembling the year tables\r\n var table = document.createElement('table');\r\n table.setAttribute('width', '100%');\r\n\r\n for (var i = 0; i < 25; i++) {\r\n if (! (i % 5)) {\r\n // Reset cells container\r\n var row = document.createElement('tr');\r\n row.setAttribute('align', 'center');\r\n table.appendChild(row);\r\n }\r\n\r\n // Create cell\r\n var cell = document.createElement('td');\r\n cell.classList.add('jcalendar-set-year');\r\n cell.innerText = y[i];\r\n\r\n if (selectedYear == y[i]) {\r\n cell.classList.add('jcalendar-selected');\r\n }\r\n\r\n if (currentYear == y[i]) {\r\n cell.style.fontWeight = 'bold';\r\n }\r\n\r\n row.appendChild(cell);\r\n }\r\n\r\n calendarBody.innerHTML = '';\r\n calendarBody.firstChild.firstChild.appendChild(table);\r\n\r\n // Update\r\n updateActions();\r\n }\r\n\r\n obj.setLabel = function(value, mixed) {\r\n return jSuites.calendar.getDateString(value, mixed);\r\n }\r\n\r\n obj.fromFormatted = function (value, format) {\r\n return jSuites.calendar.extractDateFromString(value, format);\r\n }\r\n\r\n var mouseUpControls = function(e) {\r\n var element = jSuites.findElement(e.target, 'jcalendar-container');\r\n if (element) {\r\n var action = e.target.className;\r\n\r\n // Object id\r\n if (action == 'jcalendar-prev') {\r\n obj.prev();\r\n } else if (action == 'jcalendar-next') {\r\n obj.next();\r\n } else if (action == 'jcalendar-month') {\r\n obj.getMonths();\r\n } else if (action == 'jcalendar-year') {\r\n obj.getYears();\r\n } else if (action == 'jcalendar-set-year') {\r\n obj.date[0] = e.target.innerText;\r\n if (obj.options.type == 'year-month-picker') {\r\n obj.getMonths();\r\n } else {\r\n obj.getDays();\r\n }\r\n } else if (e.target.classList.contains('jcalendar-set-month')) {\r\n var month = parseInt(e.target.getAttribute('data-value'));\r\n if (obj.options.type == 'year-month-picker') {\r\n obj.update(e.target, month);\r\n } else {\r\n obj.date[1] = month;\r\n obj.getDays();\r\n }\r\n } else if (action == 'jcalendar-confirm' || action == 'jcalendar-update' || action == 'jcalendar-close') {\r\n obj.close();\r\n } else if (action == 'jcalendar-backdrop') {\r\n obj.close(false, false);\r\n } else if (action == 'jcalendar-reset') {\r\n obj.reset();\r\n } else if (e.target.classList.contains('jcalendar-set-day') && e.target.innerText) {\r\n obj.update(e.target);\r\n }\r\n } else {\r\n obj.close();\r\n }\r\n }\r\n\r\n var keyUpControls = function(e) {\r\n if (e.target.value && e.target.value.length > 3) {\r\n var test = jSuites.calendar.extractDateFromString(e.target.value, obj.options.format);\r\n if (test) {\r\n if (e.target.getAttribute('data-completed') == 'true') {\r\n obj.setValue(test);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Update actions button\r\n var updateActions = function() {\r\n var currentDay = calendar.querySelector('.jcalendar-selected');\r\n\r\n if (currentDay && currentDay.classList.contains('jcalendar-disabled')) {\r\n calendarControlsUpdateButton.setAttribute('disabled', 'disabled');\r\n calendarSelectHour.setAttribute('disabled', 'disabled');\r\n calendarSelectMin.setAttribute('disabled', 'disabled');\r\n } else {\r\n calendarControlsUpdateButton.removeAttribute('disabled');\r\n calendarSelectHour.removeAttribute('disabled');\r\n calendarSelectMin.removeAttribute('disabled');\r\n }\r\n\r\n // Event\r\n if (typeof(obj.options.onupdate) == 'function') {\r\n obj.options.onupdate(el, obj.getValue());\r\n }\r\n }\r\n\r\n var calendar = null;\r\n var calendarReset = null;\r\n var calendarConfirm = null;\r\n var calendarContainer = null;\r\n var calendarContent = null;\r\n var calendarLabelYear = null;\r\n var calendarLabelMonth = null;\r\n var calendarTable = null;\r\n var calendarBody = null;\r\n\r\n var calendarControls = null;\r\n var calendarControlsTime = null;\r\n var calendarControlsUpdate = null;\r\n var calendarControlsUpdateButton = null;\r\n var calendarSelectHour = null;\r\n var calendarSelectMin = null;\r\n\r\n var init = function() {\r\n // Get value from initial element if that is an input\r\n if (el.tagName == 'INPUT' && el.value) {\r\n options.value = el.value;\r\n }\r\n\r\n // Calendar DOM elements\r\n calendarReset = document.createElement('div');\r\n calendarReset.className = 'jcalendar-reset';\r\n\r\n calendarConfirm = document.createElement('div');\r\n calendarConfirm.className = 'jcalendar-confirm';\r\n\r\n calendarControls = document.createElement('div');\r\n calendarControls.className = 'jcalendar-controls'\r\n calendarControls.style.borderBottom = '1px solid #ddd';\r\n calendarControls.appendChild(calendarReset);\r\n calendarControls.appendChild(calendarConfirm);\r\n\r\n calendarContainer = document.createElement('div');\r\n calendarContainer.className = 'jcalendar-container';\r\n\r\n calendarContent = document.createElement('div');\r\n calendarContent.className = 'jcalendar-content';\r\n calendarContainer.appendChild(calendarContent);\r\n\r\n // Main element\r\n if (el.tagName == 'DIV') {\r\n calendar = el;\r\n calendar.classList.add('jcalendar-inline');\r\n } else {\r\n // Add controls to the screen\r\n calendarContent.appendChild(calendarControls);\r\n\r\n calendar = document.createElement('div');\r\n calendar.className = 'jcalendar';\r\n }\r\n calendar.classList.add('jcalendar-container');\r\n calendar.appendChild(calendarContainer);\r\n\r\n // Table container\r\n var calendarTableContainer = document.createElement('div');\r\n calendarTableContainer.className = 'jcalendar-table';\r\n calendarContent.appendChild(calendarTableContainer);\r\n\r\n // Previous button\r\n var calendarHeaderPrev = document.createElement('td');\r\n calendarHeaderPrev.setAttribute('colspan', '2');\r\n calendarHeaderPrev.className = 'jcalendar-prev';\r\n\r\n // Header with year and month\r\n calendarLabelYear = document.createElement('span');\r\n calendarLabelYear.className = 'jcalendar-year';\r\n calendarLabelMonth = document.createElement('span');\r\n calendarLabelMonth.className = 'jcalendar-month';\r\n\r\n var calendarHeaderTitle = document.createElement('td');\r\n calendarHeaderTitle.className = 'jcalendar-header';\r\n calendarHeaderTitle.setAttribute('colspan', '3');\r\n calendarHeaderTitle.appendChild(calendarLabelMonth);\r\n calendarHeaderTitle.appendChild(calendarLabelYear);\r\n\r\n var calendarHeaderNext = document.createElement('td');\r\n calendarHeaderNext.setAttribute('colspan', '2');\r\n calendarHeaderNext.className = 'jcalendar-next';\r\n\r\n var calendarHeader = document.createElement('thead');\r\n var calendarHeaderRow = document.createElement('tr');\r\n calendarHeaderRow.appendChild(calendarHeaderPrev);\r\n calendarHeaderRow.appendChild(calendarHeaderTitle);\r\n calendarHeaderRow.appendChild(calendarHeaderNext);\r\n calendarHeader.appendChild(calendarHeaderRow);\r\n\r\n calendarTable = document.createElement('table');\r\n calendarBody = document.createElement('tbody');\r\n calendarTable.setAttribute('cellpadding', '0');\r\n calendarTable.setAttribute('cellspacing', '0');\r\n calendarTable.appendChild(calendarHeader);\r\n calendarTable.appendChild(calendarBody);\r\n calendarTableContainer.appendChild(calendarTable);\r\n\r\n calendarSelectHour = document.createElement('select');\r\n calendarSelectHour.className = 'jcalendar-select';\r\n calendarSelectHour.onchange = function() {\r\n obj.date[3] = this.value; \r\n\r\n // Event\r\n if (typeof(obj.options.onupdate) == 'function') {\r\n obj.options.onupdate(el, obj.getValue());\r\n }\r\n }\r\n\r\n for (var i = 0; i < 24; i++) {\r\n var element = document.createElement('option');\r\n element.value = i;\r\n element.innerHTML = jSuites.two(i);\r\n calendarSelectHour.appendChild(element);\r\n }\r\n\r\n calendarSelectMin = document.createElement('select');\r\n calendarSelectMin.className = 'jcalendar-select';\r\n calendarSelectMin.onchange = function() {\r\n obj.date[4] = this.value;\r\n\r\n // Event\r\n if (typeof(obj.options.onupdate) == 'function') {\r\n obj.options.onupdate(el, obj.getValue());\r\n }\r\n }\r\n\r\n for (var i = 0; i < 60; i++) {\r\n var element = document.createElement('option');\r\n element.value = i;\r\n element.innerHTML = jSuites.two(i);\r\n calendarSelectMin.appendChild(element);\r\n }\r\n\r\n // Footer controls\r\n var calendarControlsFooter = document.createElement('div');\r\n calendarControlsFooter.className = 'jcalendar-controls';\r\n\r\n calendarControlsTime = document.createElement('div');\r\n calendarControlsTime.className = 'jcalendar-time';\r\n calendarControlsTime.style.maxWidth = '140px';\r\n calendarControlsTime.appendChild(calendarSelectHour);\r\n calendarControlsTime.appendChild(calendarSelectMin);\r\n\r\n calendarControlsUpdateButton = document.createElement('button');\r\n calendarControlsUpdateButton.setAttribute('type', 'button');\r\n calendarControlsUpdateButton.className = 'jcalendar-update';\r\n\r\n calendarControlsUpdate = document.createElement('div');\r\n calendarControlsUpdate.style.flexGrow = '10';\r\n calendarControlsUpdate.appendChild(calendarControlsUpdateButton);\r\n calendarControlsFooter.appendChild(calendarControlsTime);\r\n\r\n // Only show the update button for input elements\r\n if (el.tagName == 'INPUT') {\r\n calendarControlsFooter.appendChild(calendarControlsUpdate);\r\n }\r\n\r\n calendarContent.appendChild(calendarControlsFooter);\r\n\r\n var calendarBackdrop = document.createElement('div');\r\n calendarBackdrop.className = 'jcalendar-backdrop';\r\n calendar.appendChild(calendarBackdrop);\r\n\r\n // Handle events\r\n el.addEventListener(\"keyup\", keyUpControls);\r\n\r\n // Add global events\r\n calendar.addEventListener(\"swipeleft\", function(e) {\r\n jSuites.animation.slideLeft(calendarTable, 0, function() {\r\n obj.next();\r\n jSuites.animation.slideRight(calendarTable, 1);\r\n });\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n calendar.addEventListener(\"swiperight\", function(e) {\r\n jSuites.animation.slideRight(calendarTable, 0, function() {\r\n obj.prev();\r\n jSuites.animation.slideLeft(calendarTable, 1);\r\n });\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n el.onmouseup = function() {\r\n obj.open();\r\n }\r\n\r\n if ('ontouchend' in document.documentElement === true) {\r\n calendar.addEventListener(\"touchend\", mouseUpControls);\r\n } else {\r\n calendar.addEventListener(\"mouseup\", mouseUpControls);\r\n }\r\n\r\n // Global controls\r\n if (! jSuites.calendar.hasEvents) {\r\n // Execute only one time\r\n jSuites.calendar.hasEvents = true;\r\n // Enter and Esc\r\n document.addEventListener(\"keydown\", jSuites.calendar.keydown);\r\n }\r\n\r\n // Set configuration\r\n obj.setOptions(options);\r\n\r\n // Append element to the DOM\r\n if (el.tagName == 'INPUT') {\r\n el.parentNode.insertBefore(calendar, el.nextSibling);\r\n // Add properties\r\n el.setAttribute('autocomplete', 'off');\r\n // Element\r\n el.classList.add('jcalendar-input');\r\n // Value\r\n el.value = obj.setLabel(obj.getValue(), obj.options);\r\n } else {\r\n // Get days\r\n obj.getDays();\r\n // Hour\r\n if (obj.options.time) {\r\n calendarSelectHour.value = obj.date[3];\r\n calendarSelectMin.value = obj.date[4];\r\n }\r\n }\r\n\r\n // Default opened\r\n if (obj.options.opened == true) {\r\n obj.open();\r\n }\r\n\r\n // Change method\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Keep object available from the node\r\n el.calendar = calendar.calendar = obj;\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n});\r\n\r\njSuites.calendar.keydown = function(e) {\r\n var calendar = null;\r\n if (calendar = jSuites.calendar.current) { \r\n if (e.which == 13) {\r\n // ENTER\r\n calendar.close(false, true);\r\n } else if (e.which == 27) {\r\n // ESC\r\n calendar.close(false, false);\r\n }\r\n }\r\n}\r\n\r\njSuites.calendar.prettify = function(d, texts) {\r\n if (! texts) {\r\n var texts = {\r\n justNow: 'Just now',\r\n xMinutesAgo: '{0}m ago',\r\n xHoursAgo: '{0}h ago',\r\n xDaysAgo: '{0}d ago',\r\n xWeeksAgo: '{0}w ago',\r\n xMonthsAgo: '{0} mon ago',\r\n xYearsAgo: '{0}y ago',\r\n }\r\n }\r\n\r\n var d1 = new Date();\r\n var d2 = new Date(d);\r\n var total = parseInt((d1 - d2) / 1000 / 60);\r\n\r\n String.prototype.format = function(o) {\r\n return this.replace('{0}', o);\r\n }\r\n\r\n if (total == 0) {\r\n var text = texts.justNow;\r\n } else if (total < 90) {\r\n var text = texts.xMinutesAgo.format(total);\r\n } else if (total < 1440) { // One day\r\n var text = texts.xHoursAgo.format(Math.round(total/60));\r\n } else if (total < 20160) { // 14 days\r\n var text = texts.xDaysAgo.format(Math.round(total / 1440));\r\n } else if (total < 43200) { // 30 days\r\n var text = texts.xWeeksAgo.format(Math.round(total / 10080));\r\n } else if (total < 1036800) { // 24 months\r\n var text = texts.xMonthsAgo.format(Math.round(total / 43200));\r\n } else { // 24 months+\r\n var text = texts.xYearsAgo.format(Math.round(total / 525600));\r\n }\r\n\r\n return text;\r\n}\r\n\r\njSuites.calendar.prettifyAll = function() {\r\n var elements = document.querySelectorAll('.prettydate');\r\n for (var i = 0; i < elements.length; i++) {\r\n if (elements[i].getAttribute('data-date')) {\r\n elements[i].innerHTML = jSuites.calendar.prettify(elements[i].getAttribute('data-date'));\r\n } else {\r\n elements[i].setAttribute('data-date', elements[i].innerHTML);\r\n elements[i].innerHTML = jSuites.calendar.prettify(elements[i].innerHTML);\r\n }\r\n }\r\n}\r\n\r\njSuites.calendar.now = function(date, dateOnly) {\r\n if (! date) {\r\n var date = new Date();\r\n }\r\n var y = date.getFullYear();\r\n var m = date.getMonth() + 1;\r\n var d = date.getDate();\r\n var h = date.getHours();\r\n var i = date.getMinutes();\r\n var s = date.getSeconds();\r\n\r\n if (dateOnly == true) {\r\n return jSuites.two(y) + '-' + jSuites.two(m) + '-' + jSuites.two(d);\r\n } else {\r\n return jSuites.two(y) + '-' + jSuites.two(m) + '-' + jSuites.two(d) + ' ' + jSuites.two(h) + ':' + jSuites.two(i) + ':' + jSuites.two(s);\r\n }\r\n}\r\n\r\njSuites.calendar.toArray = function(value) {\r\n var date = value.split(((value.indexOf('T') !== -1) ? 'T' : ' '));\r\n var time = date[1];\r\n var date = date[0].split('-');\r\n var y = parseInt(date[0]);\r\n var m = parseInt(date[1]);\r\n var d = parseInt(date[2]);\r\n\r\n if (time) {\r\n var time = time.split(':');\r\n var h = parseInt(time[0]);\r\n var i = parseInt(time[1]);\r\n } else {\r\n var h = 0;\r\n var i = 0;\r\n }\r\n return [ y, m, d, h, i, 0 ];\r\n}\r\n\r\n// Helper to extract date from a string\r\njSuites.calendar.extractDateFromString = function(date, format) {\r\n if (date > 0 && Number(date) == date) {\r\n var d = new Date(Math.round((date - 25569)*86400*1000));\r\n return d.getFullYear() + \"-\" + jSuites.two(d.getMonth()) + \"-\" + jSuites.two(d.getDate()) + ' 00:00:00';\r\n }\r\n\r\n var v1 = '' + date;\r\n var v2 = format.replace(/[0-9]/g,'');\r\n\r\n var test = 1;\r\n\r\n // Get year\r\n var y = v2.search(\"YYYY\");\r\n y = v1.substr(y,4);\r\n if (parseInt(y) != y) {\r\n test = 0;\r\n }\r\n\r\n // Get month\r\n var m = v2.search(\"MM\");\r\n m = v1.substr(m,2);\r\n if (parseInt(m) != m || m > 12) {\r\n test = 0;\r\n }\r\n\r\n // Get day\r\n var d = v2.search(\"DD\");\r\n d = v1.substr(d,2);\r\n if (parseInt(d) != d || d > 31) {\r\n test = 0;\r\n }\r\n\r\n // Get hour\r\n var h = v2.search(\"HH\");\r\n if (h >= 0) {\r\n h = v1.substr(h,2);\r\n if (! parseInt(h) || h > 23) {\r\n h = '00';\r\n }\r\n } else {\r\n h = '00';\r\n }\r\n\r\n // Get minutes\r\n var i = v2.search(\"MI\");\r\n if (i >= 0) {\r\n i = v1.substr(i,2);\r\n if (! parseInt(i) || i > 59) {\r\n i = '00';\r\n }\r\n } else {\r\n i = '00';\r\n }\r\n\r\n // Get seconds\r\n var s = v2.search(\"SS\");\r\n if (s >= 0) {\r\n s = v1.substr(s,2);\r\n if (! parseInt(s) || s > 59) {\r\n s = '00';\r\n }\r\n } else {\r\n s = '00';\r\n }\r\n\r\n if (test == 1 && date.length == v2.length) {\r\n // Update source\r\n return y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s;\r\n }\r\n\r\n return '';\r\n}\r\n\r\n// Helper to convert date into string\r\njSuites.calendar.getDateString = function(value, options) {\r\n if (! options) {\r\n var options = {};\r\n }\r\n\r\n // Labels\r\n if (typeof(options) == 'string') {\r\n var format = options;\r\n } else {\r\n var format = options.format;\r\n }\r\n\r\n // Labels\r\n if (options && options.weekdays) {\r\n var weekdays = options.weekdays;\r\n } else {\r\n var weekdays = [ 'Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday' ];\r\n }\r\n\r\n // Labels\r\n if (options && options.months) {\r\n var months = options.months;\r\n } else {\r\n var months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ];\r\n }\r\n\r\n // Labels\r\n if (options && options.months) {\r\n var monthsFull = options.monthsFull;\r\n } else {\r\n var monthsFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n }\r\n\r\n // Default date format\r\n if (! format) {\r\n format = 'DD/MM/YYYY';\r\n }\r\n\r\n if (value) {\r\n var d = ''+value;\r\n var splitStr = (d.indexOf('T') !== -1) ? 'T' : ' ';\r\n d = d.split(splitStr);\r\n\r\n var h = '';\r\n var m = '';\r\n var s = '';\r\n\r\n if (d[1]) {\r\n h = d[1].split(':');\r\n m = h[1] ? h[1] : '00';\r\n s = h[2] ? h[2] : '00';\r\n h = h[0] ? h[0] : '00';\r\n } else {\r\n h = '00';\r\n m = '00';\r\n s = '00';\r\n }\r\n\r\n d = d[0].split('-');\r\n\r\n if (d[0] && d[1] && d[2] && d[0] > 0 && d[1] > 0 && d[1] < 13 && d[2] > 0 && d[2] < 32) {\r\n var calendar = new Date(d[0], d[1]-1, d[2]);\r\n\r\n d[1] = (d[1].length < 2 ? '0' : '') + d[1];\r\n d[2] = (d[2].length < 2 ? '0' : '') + d[2];\r\n h = (h.length < 2 ? '0' : '') + h;\r\n m = (m.length < 2 ? '0' : '') + m;\r\n s = (s.length < 2 ? '0' : '') + s;\r\n\r\n // New value\r\n value = format;\r\n // Legacy\r\n value = value.replace('MMM', 'MON');\r\n\r\n // Extract tokens\r\n var tokens = [ 'YYYY', 'YYY', 'YY', 'Y', 'MM', 'DD', 'DY', 'DAY', 'WD', 'D', 'Q', 'HH24', 'HH12', 'HH', 'PM', 'AM', 'MI', 'SS', 'MS', 'MONTH', 'MON'];\r\n var pieces = [];\r\n var tmp = value;\r\n\r\n while (tmp) {\r\n var t = 0;\r\n for (var i = 0; i < tokens.length; i++) {\r\n if (t == 0 && tmp.toUpperCase().indexOf(tokens[i]) === 0) {\r\n t = tokens[i].length;\r\n }\r\n }\r\n if (t == 0) {\r\n pieces.push(tmp.substr(0, 1));\r\n tmp = tmp.substr(1);\r\n } else {\r\n pieces.push(tmp.substr(0, t));\r\n tmp = tmp.substr(t);\r\n }\r\n }\r\n\r\n // Replace tokens per values\r\n var replace = function(k, v, c) {\r\n if (c == true) {\r\n for (var i = 0; i < pieces.length; i++) {\r\n if (pieces[i].toUpperCase() == k) {\r\n pieces[i] = v;\r\n }\r\n }\r\n } else {\r\n for (var i = 0; i < pieces.length; i++) {\r\n if (pieces[i] == k) {\r\n pieces[i] = v;\r\n }\r\n }\r\n }\r\n }\r\n\r\n replace('YYYY', d[0], true);\r\n replace('YYY', d[0].substring(1,4), true);\r\n replace('YY', d[0].substring(2,4), true);\r\n replace('Y', d[0].substring(3,4), true);\r\n\r\n replace('MM', d[1], true);\r\n replace('DD', d[2], true);\r\n replace('Q', Math.floor((calendar.getMonth() + 3) / 3), true);\r\n\r\n if (h) {\r\n replace('HH24', h);\r\n }\r\n\r\n if (h > 12) {\r\n replace('HH12', h - 12, true);\r\n replace('HH', h - 12, true);\r\n replace('AM', 'pm', true);\r\n replace('PM', 'pm', true);\r\n } else {\r\n replace('HH12', h, true);\r\n replace('HH', h, true);\r\n replace('AM', 'am', true);\r\n replace('PM', 'am', true);\r\n }\r\n\r\n replace('MI', m, true);\r\n replace('SS', s, true);\r\n replace('MS', calendar.getMilliseconds(), true);\r\n\r\n // Textual tokens\r\n replace('MONTH', monthsFull[calendar.getMonth()].toUpperCase());\r\n replace('Month', monthsFull[calendar.getMonth()]);\r\n replace('month', monthsFull[calendar.getMonth()].toLowerCase());\r\n replace('MON', months[calendar.getMonth()].toUpperCase());\r\n replace('MMM', months[calendar.getMonth()].toUpperCase());\r\n replace('Mon', months[calendar.getMonth()]);\r\n replace('mon', months[calendar.getMonth()].toLowerCase());\r\n\r\n replace('DAY', weekdays[calendar.getDay()].toUpperCase());\r\n replace('Day', weekdays[calendar.getDay()]);\r\n replace('day', weekdays[calendar.getDay()].toLowerCase());\r\n replace('DY', weekdays[calendar.getDay()].substr(0,3).toUpperCase());\r\n replace('Dy', weekdays[calendar.getDay()].substr(0,3));\r\n replace('dy', weekdays[calendar.getDay()].substr(0,3).toLowerCase());\r\n replace('D', weekdays[calendar.getDay()]);\r\n replace('WD', weekdays[calendar.getDay()]);\r\n\r\n // Put pieces together\r\n value = pieces.join('');\r\n } else {\r\n value = '';\r\n }\r\n }\r\n\r\n return value;\r\n}\r\n\r\n\r\n\r\njSuites.color = (function(el, options) {\r\n // Already created, update options\r\n if (el.color) {\r\n return el.color.setOptions(options, true);\r\n }\r\n\r\n // New instance\r\n var obj = { type: 'color' };\r\n obj.options = {};\r\n\r\n var container = null;\r\n var backdrop = null;\r\n var content = null;\r\n var resetButton = null;\r\n var closeButton = null;\r\n var tabs = null;\r\n var jsuitesTabs = null;\r\n\r\n /**\r\n * Update options\r\n */\r\n obj.setOptions = function(options, reset) {\r\n /**\r\n * @typedef {Object} defaults\r\n * @property {(string|Array)} value - Initial value of the compontent\r\n * @property {string} placeholder - The default instruction text on the element\r\n * @property {requestCallback} onchange - Method to be execute after any changes on the element\r\n * @property {requestCallback} onclose - Method to be execute when the element is closed\r\n * @property {string} doneLabel - Label for button done\r\n * @property {string} resetLabel - Label for button reset\r\n * @property {string} resetValue - Value for button reset\r\n * @property {Bool} showResetButton - Active or note for button reset - default false\r\n */\r\n var defaults = {\r\n placeholder: '',\r\n value: null,\r\n onopen: null,\r\n onclose: null,\r\n onchange: null,\r\n closeOnChange: true,\r\n palette: null,\r\n position: null,\r\n doneLabel: 'Done',\r\n resetLabel: 'Reset',\r\n fullscreen: false,\r\n opened: false,\r\n }\r\n\r\n if (! options) {\r\n options = {};\r\n }\r\n\r\n if (options && ! options.palette) {\r\n // Default pallete\r\n options.palette = jSuites.palette();\r\n }\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Update the text of the controls, if they have already been created\r\n if (resetButton) {\r\n resetButton.innerHTML = obj.options.resetLabel;\r\n }\r\n if (closeButton) {\r\n closeButton.innerHTML = obj.options.doneLabel;\r\n }\r\n\r\n // Update the pallete\r\n if (obj.options.palette && jsuitesTabs) {\r\n jsuitesTabs.updateContent(0, table());\r\n }\r\n\r\n // Value\r\n if (typeof obj.options.value === 'string') {\r\n el.value = obj.options.value;\r\n }\r\n\r\n // Placeholder\r\n if (obj.options.placeholder) {\r\n el.setAttribute('placeholder', obj.options.placeholder);\r\n } else {\r\n if (el.getAttribute('placeholder')) {\r\n el.removeAttribute('placeholder');\r\n }\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * Open color pallete\r\n */\r\n obj.open = function() {\r\n if (! container.classList.contains('jcolor-focus')) {\r\n // Start tracking\r\n jSuites.tracking(obj, true);\r\n\r\n // Show colorpicker\r\n container.classList.add('jcolor-focus');\r\n\r\n var rectContent = content.getBoundingClientRect();\r\n\r\n if (jSuites.getWindowWidth() < 800 || obj.options.fullscreen == true) {\r\n content.style.top = '';\r\n content.classList.add('jcolor-fullscreen');\r\n jSuites.animation.slideBottom(content, 1);\r\n backdrop.style.display = 'block';\r\n } else {\r\n if (content.classList.contains('jcolor-fullscreen')) {\r\n content.classList.remove('jcolor-fullscreen');\r\n backdrop.style.display = '';\r\n }\r\n\r\n var rect = el.getBoundingClientRect();\r\n\r\n if (obj.options.position) {\r\n content.style.position = 'fixed';\r\n if (window.innerHeight < rect.bottom + rectContent.height) {\r\n content.style.top = (rect.top - (rectContent.height + 2)) + 'px';\r\n } else {\r\n content.style.top = (rect.top + rect.height + 2) + 'px';\r\n }\r\n content.style.left = rect.left + 'px';\r\n } else {\r\n if (window.innerHeight < rect.bottom + rectContent.height) {\r\n content.style.top = -1 * (rectContent.height + rect.height + 2) + 'px';\r\n } else {\r\n content.style.top = '2px';\r\n }\r\n }\r\n }\r\n\r\n if (typeof(obj.options.onopen) == 'function') {\r\n obj.options.onopen(el);\r\n }\r\n\r\n jsuitesTabs.setBorder(jsuitesTabs.getActive());\r\n\r\n // Update sliders\r\n if (obj.options.value) {\r\n var rgb = HexToRgb(obj.options.value);\r\n\r\n rgbInputs.forEach(function(rgbInput, index) {\r\n rgbInput.value = rgb[index];\r\n rgbInput.dispatchEvent(new Event('input'));\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Close color pallete\r\n */\r\n obj.close = function(ignoreEvents) {\r\n if (container.classList.contains('jcolor-focus')) {\r\n // Remove focus\r\n container.classList.remove('jcolor-focus');\r\n // Make sure backdrop is hidden\r\n backdrop.style.display = '';\r\n // Call related events\r\n if (! ignoreEvents && typeof(obj.options.onclose) == 'function') {\r\n obj.options.onclose(el);\r\n }\r\n // Stop the object\r\n jSuites.tracking(obj, false);\r\n }\r\n\r\n return obj.options.value;\r\n }\r\n\r\n /**\r\n * Set value\r\n */\r\n obj.setValue = function(color) {\r\n if (! color) {\r\n color = '';\r\n }\r\n\r\n if (color != obj.options.value) {\r\n obj.options.value = color;\r\n slidersResult = color;\r\n\r\n // Remove current selecded mark\r\n var selected = container.querySelector('.jcolor-selected');\r\n if (selected) {\r\n selected.classList.remove('jcolor-selected');\r\n }\r\n\r\n // Mark cell as selected\r\n if (obj.values[color]) {\r\n obj.values[color].classList.add('jcolor-selected');\r\n }\r\n\r\n // Onchange\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, color);\r\n }\r\n\r\n // Changes\r\n if (el.value != obj.options.value) {\r\n // Set input value\r\n el.value = obj.options.value;\r\n // Element onchange native\r\n if (typeof(el.onchange) == 'function') {\r\n el.onchange({\r\n type: 'change',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n\r\n if (obj.options.closeOnChange == true) {\r\n obj.close();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get value\r\n */\r\n obj.getValue = function() {\r\n return obj.options.value;\r\n }\r\n\r\n var backdropClickControl = false;\r\n\r\n // Converts a number in decimal to hexadecimal\r\n var decToHex = function(num) {\r\n var hex = num.toString(16);\r\n return hex.length === 1 ? \"0\" + hex : hex;\r\n }\r\n\r\n // Converts a color in rgb to hexadecimal\r\n var rgbToHex = function(r, g, b) {\r\n return \"#\" + decToHex(r) + decToHex(g) + decToHex(b);\r\n }\r\n\r\n // Converts a number in hexadecimal to decimal\r\n var hexToDec = function(hex) {\r\n return parseInt('0x' + hex);\r\n }\r\n\r\n // Converts a color in hexadecimal to rgb\r\n var HexToRgb = function(hex) {\r\n return [hexToDec(hex.substr(1, 2)), hexToDec(hex.substr(3, 2)), hexToDec(hex.substr(5, 2))]\r\n }\r\n\r\n var table = function() {\r\n // Content of the first tab\r\n var tableContainer = document.createElement('div');\r\n tableContainer.className = 'jcolor-grid';\r\n\r\n // Cells\r\n obj.values = [];\r\n\r\n // Table pallete\r\n var t = document.createElement('table');\r\n t.setAttribute('cellpadding', '7');\r\n t.setAttribute('cellspacing', '0');\r\n\r\n for (var j = 0; j < obj.options.palette.length; j++) {\r\n var tr = document.createElement('tr');\r\n for (var i = 0; i < obj.options.palette[j].length; i++) {\r\n var td = document.createElement('td');\r\n var color = obj.options.palette[j][i];\r\n if (color.length < 7 && color.substr(0,1) !== '#') {\r\n color = '#' + color;\r\n }\r\n td.style.backgroundColor = color;\r\n td.setAttribute('data-value', color);\r\n td.innerHTML = '';\r\n tr.appendChild(td);\r\n\r\n // Selected color\r\n if (obj.options.value == color) {\r\n td.classList.add('jcolor-selected');\r\n }\r\n\r\n // Possible values\r\n obj.values[color] = td;\r\n }\r\n t.appendChild(tr);\r\n }\r\n\r\n // Append to the table\r\n tableContainer.appendChild(t);\r\n\r\n // Select color\r\n tableContainer.addEventListener(\"mouseup\", function(e) {\r\n if (e.target.tagName == 'TD') {\r\n var value = e.target.getAttribute('data-value');\r\n if (value) {\r\n obj.setValue(value);\r\n }\r\n }\r\n });\r\n\r\n return tableContainer;\r\n }\r\n\r\n // Canvas where the image will be rendered\r\n var canvas = document.createElement('canvas');\r\n canvas.width = 200;\r\n canvas.height = 160;\r\n var context = canvas.getContext(\"2d\");\r\n\r\n var resizeCanvas = function() {\r\n // Specifications necessary to correctly obtain colors later in certain positions\r\n var m = tabs.firstChild.getBoundingClientRect();\r\n canvas.width = m.width - 14;\r\n gradient()\r\n }\r\n\r\n var gradient = function() {\r\n var g = context.createLinearGradient(0, 0, canvas.width, 0);\r\n // Create color gradient\r\n g.addColorStop(0, \"rgb(255,0,0)\");\r\n g.addColorStop(0.15, \"rgb(255,0,255)\");\r\n g.addColorStop(0.33, \"rgb(0,0,255)\");\r\n g.addColorStop(0.49, \"rgb(0,255,255)\");\r\n g.addColorStop(0.67, \"rgb(0,255,0)\");\r\n g.addColorStop(0.84, \"rgb(255,255,0)\");\r\n g.addColorStop(1, \"rgb(255,0,0)\");\r\n context.fillStyle = g;\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n g = context.createLinearGradient(0, 0, 0, canvas.height);\r\n g.addColorStop(0, \"rgba(255,255,255,1)\");\r\n g.addColorStop(0.5, \"rgba(255,255,255,0)\");\r\n g.addColorStop(0.5, \"rgba(0,0,0,0)\");\r\n g.addColorStop(1, \"rgba(0,0,0,1)\");\r\n context.fillStyle = g;\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n var hsl = function() {\r\n var element = document.createElement('div');\r\n element.className = \"jcolor-hsl\";\r\n\r\n var point = document.createElement('div');\r\n point.className = 'jcolor-point';\r\n\r\n var div = document.createElement('div');\r\n div.appendChild(canvas);\r\n div.appendChild(point);\r\n element.appendChild(div);\r\n\r\n // Moves the marquee point to the specified position\r\n var update = function(buttons, x, y) {\r\n if (buttons === 1) {\r\n var rect = element.getBoundingClientRect();\r\n var left = x - rect.left;\r\n var top = y - rect.top;\r\n if (left < 0) {\r\n left = 0;\r\n }\r\n if (top < 0) {\r\n top = 0;\r\n }\r\n if (left > rect.width) {\r\n left = rect.width;\r\n }\r\n if (top > rect.height) {\r\n top = rect.height;\r\n }\r\n point.style.left = left + 'px';\r\n point.style.top = top + 'px';\r\n var pixel = context.getImageData(left, top, 1, 1).data;\r\n slidersResult = rgbToHex(pixel[0], pixel[1], pixel[2]);\r\n }\r\n }\r\n\r\n // Applies the point's motion function to the div that contains it\r\n element.addEventListener('mousedown', function(e) {\r\n update(e.buttons, e.clientX, e.clientY);\r\n });\r\n\r\n element.addEventListener('mousemove', function(e) {\r\n update(e.buttons, e.clientX, e.clientY);\r\n });\r\n\r\n element.addEventListener('touchmove', function(e) {\r\n update(1, e.changedTouches[0].clientX, e.changedTouches[0].clientY);\r\n });\r\n\r\n return element;\r\n }\r\n\r\n var slidersResult = '';\r\n\r\n var rgbInputs = [];\r\n\r\n var changeInputColors = function() {\r\n if (slidersResult !== '') {\r\n for (var j = 0; j < rgbInputs.length; j++) {\r\n var currentColor = HexToRgb(slidersResult);\r\n\r\n currentColor[j] = 0;\r\n\r\n var newGradient = 'linear-gradient(90deg, rgb(';\r\n newGradient += currentColor.join(', ');\r\n newGradient += '), rgb(';\r\n\r\n currentColor[j] = 255;\r\n\r\n newGradient += currentColor.join(', ');\r\n newGradient += '))';\r\n\r\n rgbInputs[j].style.backgroundImage = newGradient;\r\n }\r\n }\r\n }\r\n\r\n var sliders = function() {\r\n // Content of the third tab\r\n var slidersElement = document.createElement('div');\r\n slidersElement.className = 'jcolor-sliders';\r\n\r\n var slidersBody = document.createElement('div');\r\n\r\n // Creates a range-type input with the specified name\r\n var createSliderInput = function(name) {\r\n var inputContainer = document.createElement('div');\r\n inputContainer.className = 'jcolor-sliders-input-container';\r\n\r\n var label = document.createElement('label');\r\n label.innerText = name;\r\n\r\n var subContainer = document.createElement('div');\r\n subContainer.className = 'jcolor-sliders-input-subcontainer';\r\n\r\n var input = document.createElement('input');\r\n input.type = 'range';\r\n input.min = 0;\r\n input.max = 255;\r\n input.value = 0;\r\n\r\n inputContainer.appendChild(label);\r\n subContainer.appendChild(input);\r\n\r\n var value = document.createElement('div');\r\n value.innerText = input.value;\r\n\r\n input.addEventListener('input', function() {\r\n value.innerText = input.value;\r\n });\r\n\r\n subContainer.appendChild(value);\r\n inputContainer.appendChild(subContainer);\r\n\r\n slidersBody.appendChild(inputContainer);\r\n\r\n return input;\r\n }\r\n\r\n // Creates red, green and blue inputs\r\n rgbInputs = [\r\n createSliderInput('Red'),\r\n createSliderInput('Green'),\r\n createSliderInput('Blue'),\r\n ];\r\n\r\n slidersElement.appendChild(slidersBody);\r\n\r\n // Element that prints the current color\r\n var slidersResultColor = document.createElement('div');\r\n slidersResultColor.className = 'jcolor-sliders-final-color';\r\n\r\n var resultElement = document.createElement('div');\r\n resultElement.style.visibility = 'hidden';\r\n resultElement.innerText = 'a';\r\n slidersResultColor.appendChild(resultElement)\r\n\r\n // Update the element that prints the current color\r\n var updateResult = function() {\r\n var resultColor = rgbToHex(parseInt(rgbInputs[0].value), parseInt(rgbInputs[1].value), parseInt(rgbInputs[2].value));\r\n\r\n resultElement.innerText = resultColor;\r\n resultElement.style.color = resultColor;\r\n resultElement.style.removeProperty('visibility');\r\n\r\n slidersResult = resultColor;\r\n }\r\n\r\n // Apply the update function to color inputs\r\n rgbInputs.forEach(function(rgbInput) {\r\n rgbInput.addEventListener('input', function() {\r\n updateResult();\r\n changeInputColors();\r\n });\r\n });\r\n\r\n slidersElement.appendChild(slidersResultColor);\r\n\r\n return slidersElement;\r\n }\r\n\r\n var init = function() {\r\n // Initial options\r\n obj.setOptions(options);\r\n\r\n // Add a proper input tag when the element is an input\r\n if (el.tagName == 'INPUT') {\r\n el.classList.add('jcolor-input');\r\n el.readOnly = true;\r\n }\r\n\r\n // Table container\r\n container = document.createElement('div');\r\n container.className = 'jcolor';\r\n\r\n // Table container\r\n backdrop = document.createElement('div');\r\n backdrop.className = 'jcolor-backdrop';\r\n container.appendChild(backdrop);\r\n\r\n // Content\r\n content = document.createElement('div');\r\n content.className = 'jcolor-content';\r\n\r\n // Controls\r\n var controls = document.createElement('div');\r\n controls.className = 'jcolor-controls';\r\n content.appendChild(controls);\r\n\r\n // Reset button\r\n resetButton = document.createElement('div');\r\n resetButton.className = 'jcolor-reset';\r\n resetButton.innerHTML = obj.options.resetLabel;\r\n resetButton.onclick = function(e) {\r\n obj.setValue('');\r\n obj.close();\r\n }\r\n controls.appendChild(resetButton);\r\n\r\n // Close button\r\n closeButton = document.createElement('div');\r\n closeButton.className = 'jcolor-close';\r\n closeButton.innerHTML = obj.options.doneLabel;\r\n closeButton.onclick = function(e) {\r\n if (jsuitesTabs.getActive() > 0) {\r\n obj.setValue(slidersResult);\r\n }\r\n obj.close();\r\n }\r\n controls.appendChild(closeButton);\r\n\r\n // Element that will be used to create the tabs\r\n tabs = document.createElement('div');\r\n content.appendChild(tabs);\r\n\r\n // Starts the jSuites tabs component\r\n jsuitesTabs = jSuites.tabs(tabs, {\r\n animation: true,\r\n data: [\r\n {\r\n title: 'Grid',\r\n contentElement: table(),\r\n },\r\n {\r\n title: 'Spectrum',\r\n contentElement: hsl(),\r\n },\r\n {\r\n title: 'Sliders',\r\n contentElement: sliders(),\r\n }\r\n ],\r\n onchange: function(element, instance, index) {\r\n if (index === 1) {\r\n resizeCanvas();\r\n } else {\r\n var color = slidersResult !== '' ? slidersResult : obj.getValue();\r\n\r\n if (index === 2 && color) {\r\n var rgb = HexToRgb(color);\r\n\r\n rgbInputs.forEach(function(rgbInput, index) {\r\n rgbInput.value = rgb[index];\r\n rgbInput.dispatchEvent(new Event('input'));\r\n });\r\n }\r\n }\r\n },\r\n palette: 'modern',\r\n });\r\n\r\n container.appendChild(content);\r\n\r\n // Insert picker after the element\r\n if (el.tagName == 'INPUT') {\r\n el.parentNode.insertBefore(container, el.nextSibling);\r\n } else {\r\n el.appendChild(container);\r\n }\r\n\r\n /**\r\n * If element is focus open the picker\r\n */\r\n el.addEventListener(\"mouseup\", function(e) {\r\n obj.open();\r\n });\r\n\r\n backdrop.addEventListener(\"mousedown\", function(e) {\r\n backdropClickControl = true;\r\n });\r\n\r\n backdrop.addEventListener(\"mouseup\", function(e) {\r\n if (backdropClickControl) {\r\n obj.close();\r\n backdropClickControl = false;\r\n }\r\n });\r\n\r\n // If the picker is open on the spectrum tab, it changes the canvas size when the window size is changed\r\n window.addEventListener('resize', function() {\r\n if (container.classList.contains('jcolor-focus') && jsuitesTabs.getActive() == 1) {\r\n resizeCanvas();\r\n }\r\n });\r\n\r\n // Default opened\r\n if (obj.options.opened == true) {\r\n obj.open();\r\n }\r\n\r\n // Change\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Keep object available from the node\r\n el.color = obj;\r\n\r\n // Container shortcut\r\n container.color = obj;\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n});\r\n\r\n\r\n\r\njSuites.contextmenu = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n items: null,\r\n onclick: null,\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Class definition\r\n el.classList.add('jcontextmenu');\r\n // Focusable\r\n el.setAttribute('tabindex', '900');\r\n\r\n /**\r\n * Open contextmenu\r\n */\r\n obj.open = function(e, items) {\r\n if (items) {\r\n // Update content\r\n obj.options.items = items;\r\n // Create items\r\n obj.create(items);\r\n }\r\n\r\n // Coordinates\r\n if ((obj.options.items && obj.options.items.length > 0) || el.children.length) {\r\n if (e.target) {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n } else {\r\n var x = e.x;\r\n var y = e.y;\r\n }\r\n\r\n el.classList.add('jcontextmenu-focus');\r\n el.focus();\r\n\r\n var rect = el.getBoundingClientRect();\r\n\r\n if (window.innerHeight < y + rect.height) {\r\n var h = y - rect.height;\r\n if (h < 0) {\r\n h = 0;\r\n }\r\n el.style.top = h + 'px';\r\n } else {\r\n el.style.top = y + 'px';\r\n }\r\n\r\n if (window.innerWidth < x + rect.width) {\r\n if (x - rect.width > 0) {\r\n el.style.left = (x - rect.width) + 'px';\r\n } else {\r\n el.style.left = '10px';\r\n }\r\n } else {\r\n el.style.left = x + 'px';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Close menu\r\n */\r\n obj.close = function() {\r\n if (el.classList.contains('jcontextmenu-focus')) {\r\n el.classList.remove('jcontextmenu-focus');\r\n }\r\n }\r\n\r\n /**\r\n * Create items based on the declared objectd\r\n * @param {object} items - List of object\r\n */\r\n obj.create = function(items) {\r\n // Update content\r\n el.innerHTML = '';\r\n\r\n // Append items\r\n for (var i = 0; i < items.length; i++) {\r\n var itemContainer = createItemElement(items[i]);\r\n el.appendChild(itemContainer);\r\n }\r\n }\r\n \r\n /**\r\n * Private function for create a new Item element\r\n * @param {type} item\r\n * @returns {jsuitesL#15.jSuites.contextmenu.createItemElement.itemContainer}\r\n */\r\n function createItemElement(item) {\r\n if (item.type && (item.type == 'line' || item.type == 'divisor')) {\r\n var itemContainer = document.createElement('hr');\r\n } else {\r\n var itemContainer = document.createElement('div');\r\n var itemText = document.createElement('a');\r\n itemText.innerHTML = item.title;\r\n\r\n if (item.tooltip) {\r\n itemContainer.setAttribute('title', item.tooltip);\r\n }\r\n\r\n if (item.icon) {\r\n itemContainer.setAttribute('data-icon', item.icon);\r\n }\r\n\r\n if (item.id) {\r\n itemContainer.id = item.id;\r\n }\r\n\r\n if (item.disabled) {\r\n itemContainer.className = 'jcontextmenu-disabled';\r\n } else if (item.onclick) {\r\n itemContainer.method = item.onclick;\r\n itemContainer.addEventListener(\"mousedown\", function(e) {\r\n e.preventDefault();\r\n });\r\n itemContainer.addEventListener(\"mouseup\", function() {\r\n // Execute method\r\n this.method(this);\r\n });\r\n }\r\n itemContainer.appendChild(itemText);\r\n\r\n if (item.submenu) {\r\n var itemIconSubmenu = document.createElement('span');\r\n itemIconSubmenu.innerHTML = \"►\";\r\n itemContainer.appendChild(itemIconSubmenu);\r\n itemContainer.classList.add('jcontexthassubmenu');\r\n var el_submenu = document.createElement('div');\r\n // Class definition\r\n el_submenu.classList.add('jcontextmenu');\r\n // Focusable\r\n el_submenu.setAttribute('tabindex', '900');\r\n \r\n // Append items\r\n var submenu = item.submenu;\r\n for (var i = 0; i < submenu.length; i++) {\r\n var itemContainerSubMenu = createItemElement(submenu[i]);\r\n el_submenu.appendChild(itemContainerSubMenu);\r\n }\r\n\r\n itemContainer.appendChild(el_submenu);\r\n } else if (item.shortcut) {\r\n var itemShortCut = document.createElement('span');\r\n itemShortCut.innerHTML = item.shortcut;\r\n itemContainer.appendChild(itemShortCut);\r\n }\r\n }\r\n return itemContainer;\r\n }\r\n\r\n if (typeof(obj.options.onclick) == 'function') {\r\n el.addEventListener('click', function(e) {\r\n obj.options.onclick(obj, e);\r\n });\r\n }\r\n\r\n // Create items\r\n if (obj.options.items) {\r\n obj.create(obj.options.items);\r\n }\r\n\r\n el.addEventListener('blur', function(e) {\r\n obj.close();\r\n });\r\n\r\n if (! jSuites.contextmenu.hasEvents) {\r\n window.addEventListener(\"mousewheel\", function() {\r\n obj.close();\r\n });\r\n\r\n document.addEventListener(\"contextmenu\", function(e) {\r\n var id = jSuites.contextmenu.getElement(e.target);\r\n if (id) {\r\n var element = document.querySelector('#' + id);\r\n if (! element) {\r\n console.error('JSUITES: Contextmenu id not found');\r\n } else {\r\n element.contextmenu.open(e);\r\n e.preventDefault();\r\n }\r\n }\r\n });\r\n\r\n jSuites.contextmenu.hasEvents = true;\r\n }\r\n\r\n el.contextmenu = obj;\r\n\r\n return obj;\r\n});\r\n\r\njSuites.contextmenu.getElement = function(element) {\r\n var foundId = 0;\r\n\r\n function path (element) {\r\n if (element.parentNode && element.getAttribute('aria-contextmenu-id')) {\r\n foundId = element.getAttribute('aria-contextmenu-id')\r\n } else {\r\n if (element.parentNode) {\r\n path(element.parentNode);\r\n }\r\n }\r\n }\r\n\r\n path(element);\r\n\r\n return foundId;\r\n}\r\n\r\njSuites.dropdown = (function(el, options) {\r\n // Already created, update options\r\n if (el.dropdown) {\r\n return el.dropdown.setOptions(options, true);\r\n }\r\n\r\n // New instance\r\n var obj = { type: 'dropdown' };\r\n obj.options = {};\r\n\r\n // Success\r\n var success = function(data, val) {\r\n if (val === undefined || val === null) {\r\n val = '';\r\n }\r\n\r\n // Set data\r\n if (data && data.length) {\r\n obj.setData(data);\r\n\r\n // Onload method\r\n if (typeof(obj.options.onload) == 'function') {\r\n obj.options.onload(el, obj, data, val);\r\n }\r\n }\r\n\r\n // Set value\r\n applyValue(val);\r\n\r\n // Component value\r\n el.value = obj.options.value;\r\n\r\n // Open dropdown\r\n if (obj.options.opened == true) {\r\n obj.open();\r\n }\r\n }\r\n\r\n /**\r\n * Reset the options for the dropdown\r\n */\r\n var resetValue = function() {\r\n // Reset value container\r\n obj.value = {};\r\n // Remove selected\r\n for (var i = 0; i < obj.items.length; i++) {\r\n if (obj.items[i].selected == true) {\r\n if (obj.items[i].element) {\r\n obj.items[i].element.classList.remove('jdropdown-selected')\r\n }\r\n obj.items[i].selected = null;\r\n }\r\n }\r\n // Reset options\r\n obj.options.value = '';\r\n }\r\n\r\n /**\r\n * Apply values to the dropdown\r\n */\r\n var applyValue = function(values) {\r\n // Reset the current values\r\n resetValue();\r\n\r\n // Read values\r\n if (! Array.isArray(values)) {\r\n values = (''+values).split(';');\r\n }\r\n for (var i = 0; i < values.length; i++) {\r\n obj.value[values[i]] = '';\r\n }\r\n // Update the DOM\r\n for (var i = 0; i < obj.items.length; i++) {\r\n if (typeof(obj.value[Value(i)]) !== 'undefined') {\r\n if (obj.items[i].element) {\r\n obj.items[i].element.classList.add('jdropdown-selected')\r\n }\r\n obj.items[i].selected = true;\r\n\r\n // Keep label\r\n obj.value[Value(i)] = Text(i);\r\n }\r\n }\r\n\r\n // Global value\r\n obj.options.value = Object.keys(obj.value).join(';');\r\n\r\n // Update labels\r\n obj.header.value = obj.getText();\r\n }\r\n\r\n // Get the value of one item\r\n var Value = function(k, v) {\r\n // Legacy purposes\r\n if (! obj.options.format) {\r\n var property = 'value';\r\n } else {\r\n var property = 'id';\r\n }\r\n\r\n if (obj.items[k]) {\r\n if (v !== undefined) {\r\n return obj.items[k].data[property] = v;\r\n } else {\r\n return obj.items[k].data[property];\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n // Get the label of one item\r\n var Text = function(k, v) {\r\n // Legacy purposes\r\n if (! obj.options.format) {\r\n var property = 'text';\r\n } else {\r\n var property = 'name';\r\n }\r\n\r\n if (obj.items[k]) {\r\n if (v !== undefined) {\r\n return obj.items[k].data[property] = v;\r\n } else {\r\n return obj.items[k].data[property];\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n var getValue = function() {\r\n return Object.keys(obj.value);\r\n }\r\n\r\n var getText = function() {\r\n var data = [];\r\n var k = Object.keys(obj.value);\r\n for (var i = 0; i < k.length; i++) {\r\n data.push(obj.value[k[i]]);\r\n }\r\n return data;\r\n }\r\n\r\n obj.setOptions = function(options, reset) {\r\n if (! options) {\r\n options = {};\r\n }\r\n\r\n // Default configuration\r\n var defaults = {\r\n url: null,\r\n data: [],\r\n format: 0,\r\n multiple: false,\r\n autocomplete: false,\r\n remoteSearch: false,\r\n lazyLoading: false,\r\n type: null,\r\n width: null,\r\n maxWidth: null,\r\n opened: false,\r\n value: null,\r\n placeholder: '',\r\n newOptions: false,\r\n position: false,\r\n onchange: null,\r\n onload: null,\r\n onopen: null,\r\n onclose: null,\r\n onfocus: null,\r\n onblur: null,\r\n oninsert: null,\r\n }\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Force autocomplete search\r\n if (obj.options.remoteSearch == true || obj.options.type === 'searchbar') {\r\n obj.options.autocomplete = true;\r\n }\r\n\r\n // New options\r\n if (obj.options.newOptions == true) {\r\n obj.header.classList.add('jdropdown-add');\r\n } else {\r\n obj.header.classList.remove('jdropdown-add');\r\n }\r\n\r\n // Autocomplete\r\n if (obj.options.autocomplete == true) {\r\n obj.header.removeAttribute('readonly');\r\n } else {\r\n obj.header.setAttribute('readonly', 'readonly');\r\n }\r\n\r\n // Place holder\r\n if (obj.options.placeholder) {\r\n obj.header.setAttribute('placeholder', obj.options.placeholder);\r\n } else {\r\n obj.header.removeAttribute('placeholder');\r\n }\r\n\r\n // Remove specific dropdown typing to add again\r\n el.classList.remove('jdropdown-searchbar');\r\n el.classList.remove('jdropdown-picker');\r\n el.classList.remove('jdropdown-list');\r\n\r\n if (obj.options.type == 'searchbar') {\r\n el.classList.add('jdropdown-searchbar');\r\n } else if (obj.options.type == 'list') {\r\n el.classList.add('jdropdown-list');\r\n } else if (obj.options.type == 'picker') {\r\n el.classList.add('jdropdown-picker');\r\n } else {\r\n if (jSuites.getWindowWidth() < 800) {\r\n if (obj.options.autocomplete) {\r\n el.classList.add('jdropdown-searchbar');\r\n obj.options.type = 'searchbar';\r\n } else {\r\n el.classList.add('jdropdown-picker');\r\n obj.options.type = 'picker';\r\n }\r\n } else {\r\n if (obj.options.width) {\r\n el.style.width = obj.options.width;\r\n el.style.minWidth = obj.options.width;\r\n } else {\r\n el.style.removeProperty('width');\r\n el.style.removeProperty('min-width');\r\n }\r\n\r\n el.classList.add('jdropdown-default');\r\n obj.options.type = 'default';\r\n }\r\n }\r\n\r\n // Close button\r\n if (obj.options.type == 'searchbar') {\r\n containerHeader.appendChild(closeButton);\r\n } else {\r\n container.insertBefore(closeButton, container.firstChild);\r\n }\r\n\r\n // Load the content\r\n if (obj.options.url && ! options.data) {\r\n jSuites.ajax({\r\n url: obj.options.url,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function(data) {\r\n if (data) {\r\n success(data, obj.options.value);\r\n }\r\n }\r\n });\r\n } else {\r\n success(obj.options.data, obj.options.value);\r\n }\r\n\r\n // Return the instance\r\n return obj;\r\n }\r\n\r\n // Helpers\r\n var containerHeader = null;\r\n var container = null;\r\n var content = null;\r\n var closeButton = null;\r\n var resetButton = null;\r\n var backdrop = null;\r\n\r\n var keyTimer = null;\r\n\r\n /**\r\n * Init dropdown\r\n */\r\n var init = function() {\r\n // Do not accept null\r\n if (! options) {\r\n options = {};\r\n }\r\n\r\n // If the element is a SELECT tag, create a configuration object\r\n if (el.tagName == 'SELECT') {\r\n var ret = jSuites.dropdown.extractFromDom(el, options);\r\n el = ret.el;\r\n options = ret.options;\r\n }\r\n\r\n // Place holder\r\n if (! options.placeholder && el.getAttribute('placeholder')) {\r\n options.placeholder = el.getAttribute('placeholder');\r\n }\r\n\r\n // Value container\r\n obj.value = {};\r\n // Containers\r\n obj.items = [];\r\n obj.groups = [];\r\n // Search options\r\n obj.search = '';\r\n obj.results = null;\r\n obj.numOfItems = 0;\r\n\r\n // Create dropdown\r\n el.classList.add('jdropdown');\r\n\r\n // Header container\r\n containerHeader = document.createElement('div');\r\n containerHeader.className = 'jdropdown-container-header';\r\n\r\n // Header\r\n obj.header = document.createElement('input');\r\n obj.header.className = 'jdropdown-header';\r\n obj.header.setAttribute('autocomplete', 'off');\r\n obj.header.onfocus = function() {\r\n if (typeof(obj.options.onfocus) == 'function') {\r\n obj.options.onfocus(el);\r\n }\r\n }\r\n\r\n obj.header.onblur = function() {\r\n if (typeof(obj.options.onblur) == 'function') {\r\n obj.options.onblur(el);\r\n }\r\n }\r\n\r\n obj.header.onkeyup = function(e) {\r\n if (obj.options.autocomplete == true && ! keyTimer) {\r\n if (obj.search != obj.header.value.trim()) {\r\n keyTimer = setTimeout(function() {\r\n obj.find(obj.header.value.trim());\r\n keyTimer = null;\r\n }, 400);\r\n }\r\n\r\n if (! el.classList.contains('jdropdown-focus')) {\r\n obj.open();\r\n }\r\n } else {\r\n if (! obj.options.autocomplete) {\r\n obj.next(e.key);\r\n }\r\n }\r\n }\r\n\r\n // Global controls\r\n if (! jSuites.dropdown.hasEvents) {\r\n // Execute only one time\r\n jSuites.dropdown.hasEvents = true;\r\n // Enter and Esc\r\n document.addEventListener(\"keydown\", jSuites.dropdown.keydown);\r\n }\r\n\r\n // Container\r\n container = document.createElement('div');\r\n container.className = 'jdropdown-container';\r\n\r\n // Dropdown content\r\n content = document.createElement('div');\r\n content.className = 'jdropdown-content';\r\n\r\n // Close button\r\n closeButton = document.createElement('div');\r\n closeButton.className = 'jdropdown-close';\r\n closeButton.innerHTML = 'Done';\r\n\r\n // Reset button\r\n resetButton = document.createElement('div');\r\n resetButton.className = 'jdropdown-reset';\r\n resetButton.innerHTML = 'x';\r\n resetButton.onclick = function() {\r\n obj.reset();\r\n obj.close();\r\n }\r\n\r\n // Create backdrop\r\n backdrop = document.createElement('div');\r\n backdrop.className = 'jdropdown-backdrop';\r\n\r\n // Append elements\r\n containerHeader.appendChild(obj.header);\r\n\r\n container.appendChild(content);\r\n el.appendChild(containerHeader);\r\n el.appendChild(container);\r\n el.appendChild(backdrop);\r\n\r\n // Set the otiptions\r\n obj.setOptions(options);\r\n\r\n if ('ontouchsend' in document.documentElement === true) {\r\n el.addEventListener('touchsend', jSuites.dropdown.mouseup);\r\n } else {\r\n el.addEventListener('mouseup', jSuites.dropdown.mouseup);\r\n }\r\n\r\n // Lazyloading\r\n if (obj.options.lazyLoading == true) {\r\n jSuites.lazyLoading(content, {\r\n loadUp: obj.loadUp,\r\n loadDown: obj.loadDown,\r\n });\r\n }\r\n\r\n // Change method\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue(obj.options.multiple ? true : false);\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Keep object available from the node\r\n el.dropdown = obj;\r\n }\r\n\r\n /**\r\n * Get the current remote source of data URL\r\n */\r\n obj.getUrl = function() {\r\n return obj.options.url;\r\n }\r\n\r\n /**\r\n * Set the new data from a remote source\r\n * @param {string} url - url from the remote source\r\n * @param {function} callback - callback when the data is loaded\r\n */\r\n obj.setUrl = function(url, callback) {\r\n obj.options.url = url;\r\n\r\n jSuites.ajax({\r\n url: obj.options.url,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function(data) {\r\n obj.setData(data);\r\n // Callback\r\n if (typeof(callback) == 'function') {\r\n callback(obj);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Set ID for one item\r\n */\r\n obj.setId = function(item, v) {\r\n // Legacy purposes\r\n if (! obj.options.format) {\r\n var property = 'value';\r\n } else {\r\n var property = 'id';\r\n }\r\n\r\n if (typeof(item) == 'object') {\r\n item[property] = v;\r\n } else {\r\n obj.items[item].data[property] = v;\r\n }\r\n }\r\n\r\n /**\r\n * Add a new item\r\n * @param {string} title - title of the new item\r\n */\r\n obj.add = function(title) {\r\n if (! title) {\r\n var current = obj.options.autocomplete == true ? obj.header.value : '';\r\n var title = prompt('Text', current);\r\n if (! title) {\r\n return false;\r\n }\r\n }\r\n\r\n // Id\r\n var id = jSuites.guid()\r\n\r\n // Create new item\r\n if (! obj.options.format) {\r\n var item = {\r\n value: id,\r\n text: title,\r\n }\r\n } else {\r\n var item = {\r\n id: id,\r\n name: title,\r\n };\r\n }\r\n\r\n // Add item to the main list\r\n obj.options.data.push(item);\r\n\r\n // Create DOM\r\n var newItem = obj.createItem(item);\r\n\r\n // Append DOM to the list\r\n content.appendChild(newItem.element);\r\n\r\n // Callback\r\n if (typeof(obj.options.oninsert) == 'function') {\r\n obj.options.oninsert(obj, item, item)\r\n }\r\n\r\n // Show content\r\n if (content.style.display == 'none') {\r\n content.style.display = '';\r\n }\r\n\r\n return item;\r\n }\r\n\r\n /**\r\n * Create a new item\r\n */\r\n obj.createItem = function(data, group, groupName) {\r\n // Keep the correct source of data\r\n if (! obj.options.format) {\r\n if (! data.value && data.id !== undefined) {\r\n data.value = data.id;\r\n //delete data.id;\r\n }\r\n if (! data.text && data.name !== undefined) {\r\n data.text = data.name;\r\n //delete data.name;\r\n }\r\n } else {\r\n if (! data.id && data.value !== undefined) {\r\n data.id = data.value;\r\n //delete data.value;\r\n }\r\n if (! data.name && data.text !== undefined) {\r\n data.name = data.text\r\n //delete data.text;\r\n }\r\n }\r\n\r\n // Create item\r\n var item = {};\r\n item.element = document.createElement('div');\r\n item.element.className = 'jdropdown-item';\r\n item.element.indexValue = obj.items.length;\r\n item.data = data;\r\n\r\n // Groupd DOM\r\n if (group) {\r\n item.group = group; \r\n }\r\n\r\n // Id\r\n if (data.id) {\r\n item.element.setAttribute('id', data.id);\r\n }\r\n\r\n // Disabled\r\n if (data.disabled == true) {\r\n item.element.setAttribute('data-disabled', true);\r\n }\r\n\r\n // Image\r\n if (data.image) {\r\n var image = document.createElement('img');\r\n image.className = 'jdropdown-image';\r\n image.src = data.image;\r\n if (! data.title) {\r\n image.classList.add('jdropdown-image-small');\r\n }\r\n item.element.appendChild(image);\r\n } else if (data.color) {\r\n var color = document.createElement('div');\r\n color.className = 'jdropdown-color';\r\n color.style.backgroundColor = data.color;\r\n item.element.appendChild(color);\r\n }\r\n\r\n // Set content\r\n if (! obj.options.format) {\r\n var text = data.text;\r\n } else {\r\n var text = data.name;\r\n }\r\n\r\n var node = document.createElement('div');\r\n node.className = 'jdropdown-description';\r\n node.innerHTML = text || ' '; \r\n\r\n // Title\r\n if (data.title) {\r\n var title = document.createElement('div');\r\n title.className = 'jdropdown-title';\r\n title.innerText = data.title;\r\n node.appendChild(title);\r\n }\r\n\r\n // Set content\r\n if (! obj.options.format) {\r\n var val = data.value;\r\n } else {\r\n var val = data.id;\r\n }\r\n\r\n // Value\r\n if (obj.value[val]) {\r\n item.element.classList.add('jdropdown-selected');\r\n item.selected = true;\r\n }\r\n\r\n // Keep DOM accessible\r\n obj.items.push(item);\r\n\r\n // Add node to item\r\n item.element.appendChild(node);\r\n\r\n return item;\r\n }\r\n\r\n obj.appendData = function(data) {\r\n // Create elements\r\n if (data.length) {\r\n // Reset counter\r\n obj.numOfItems = 0;\r\n\r\n // Helpers\r\n var items = [];\r\n var groups = [];\r\n\r\n // Prepare data\r\n for (var i = 0; i < data.length; i++) {\r\n // Process groups\r\n if (data[i].group) {\r\n if (! groups[data[i].group]) {\r\n groups[data[i].group] = [];\r\n }\r\n groups[data[i].group].push(i);\r\n } else {\r\n items.push(i);\r\n }\r\n }\r\n\r\n // Groups\r\n var groupNames = Object.keys(groups);\r\n\r\n // Append groups in case exists\r\n if (groupNames.length > 0) {\r\n for (var i = 0; i < groupNames.length; i++) {\r\n // Group container\r\n var group = document.createElement('div');\r\n group.className = 'jdropdown-group';\r\n // Group name\r\n var groupName = document.createElement('div');\r\n groupName.className = 'jdropdown-group-name';\r\n groupName.innerHTML = groupNames[i];\r\n // Group arrow\r\n var groupArrow = document.createElement('i');\r\n groupArrow.className = 'jdropdown-group-arrow jdropdown-group-arrow-down';\r\n groupName.appendChild(groupArrow);\r\n // Group items\r\n var groupContent = document.createElement('div');\r\n groupContent.className = 'jdropdown-group-items';\r\n for (var j = 0; j < groups[groupNames[i]].length; j++) {\r\n var item = obj.createItem(data[groups[groupNames[i]][j]], group, groupNames[i]);\r\n\r\n if (obj.options.lazyLoading == false || obj.numOfItems < 200) {\r\n groupContent.appendChild(item.element);\r\n obj.numOfItems++;\r\n }\r\n }\r\n // Group itens\r\n group.appendChild(groupName);\r\n group.appendChild(groupContent);\r\n // Keep group DOM\r\n obj.groups.push(group);\r\n // Only add to the screen if children on the group\r\n if (groupContent.children.length > 0) {\r\n // Add DOM to the content\r\n content.appendChild(group);\r\n }\r\n }\r\n }\r\n\r\n if (items.length) {\r\n for (var i = 0; i < items.length; i++) {\r\n var item = obj.createItem(data[items[i]]);\r\n if (obj.options.lazyLoading == false || obj.numOfItems < 200) {\r\n content.appendChild(item.element);\r\n obj.numOfItems++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n obj.setData = function(data) {\r\n // Prepare data\r\n if (data.length) {\r\n for (var i = 0; i < data.length; i++) {\r\n // Compatibility\r\n if (typeof(data[i]) != 'object') {\r\n // Correct format\r\n if (! obj.options.format) {\r\n data[i] = {\r\n value: data[i],\r\n text: data[i]\r\n }\r\n } else {\r\n data[i] = {\r\n id: data[i],\r\n name: data[i]\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Reset current value\r\n resetValue();\r\n\r\n // Make sure the content container is blank\r\n content.innerHTML = '';\r\n\r\n // Reset\r\n obj.header.value = '';\r\n\r\n // Reset items and values\r\n obj.items = [];\r\n\r\n // Append data\r\n obj.appendData(data);\r\n\r\n // Update data\r\n obj.options.data = data;\r\n }\r\n }\r\n\r\n obj.getData = function() {\r\n return obj.options.data;\r\n }\r\n\r\n /**\r\n * Get position of the item\r\n */\r\n obj.getPosition = function(val) {\r\n for (var i = 0; i < obj.items.length; i++) {\r\n if (Value(i) == val) {\r\n return i;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Get dropdown current text\r\n */\r\n obj.getText = function(asArray) {\r\n // Get value\r\n var v = getText();\r\n // Return value\r\n if (asArray) {\r\n return v;\r\n } else {\r\n return v.join('; ');\r\n }\r\n }\r\n\r\n /**\r\n * Get dropdown current value\r\n */\r\n obj.getValue = function(asArray) {\r\n // Get value\r\n var v = getValue();\r\n // Return value\r\n if (asArray) {\r\n return v;\r\n } else {\r\n return v.join(';');\r\n }\r\n }\r\n\r\n /**\r\n * Change event\r\n */\r\n var change = function(oldValue) {\r\n // Events\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, obj, oldValue, obj.options.value);\r\n }\r\n\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof(el.onchange) == 'function') {\r\n el.onchange({\r\n type: 'change',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set value\r\n */\r\n obj.setValue = function(newValue) {\r\n // Current value\r\n var oldValue = getValue();\r\n // New value\r\n if (Array.isArray(newValue)) {\r\n newValue = newValue.join(';')\r\n }\r\n\r\n if (oldValue !== newValue) {\r\n // Set value\r\n applyValue(newValue);\r\n\r\n // Change\r\n change(oldValue);\r\n }\r\n }\r\n\r\n obj.resetSelected = function() {\r\n obj.setValue(null);\r\n } \r\n\r\n obj.selectIndex = function(index) {\r\n // Make sure is a number\r\n var index = parseInt(index);\r\n\r\n // Only select those existing elements\r\n if (obj.items && obj.items[index]) {\r\n // Reset cursor to a new position\r\n obj.setCursor(index, false);\r\n\r\n // Behaviour\r\n if (! obj.options.multiple) {\r\n // Update value\r\n if (obj.items[index].selected) {\r\n obj.setValue(null);\r\n } else {\r\n obj.setValue(Value(index));\r\n }\r\n\r\n // Close component\r\n obj.close();\r\n } else {\r\n // Old value\r\n var oldValue = obj.options.value;\r\n\r\n // Toggle option\r\n if (obj.items[index].selected) {\r\n obj.items[index].element.classList.remove('jdropdown-selected');\r\n obj.items[index].selected = false;\r\n\r\n delete obj.value[Value(index)];\r\n } else {\r\n // Select element\r\n obj.items[index].element.classList.add('jdropdown-selected');\r\n obj.items[index].selected = true;\r\n\r\n // Set value\r\n obj.value[Value(index)] = Text(index);\r\n }\r\n\r\n // Global value\r\n obj.options.value = Object.keys(obj.value).join(';');\r\n\r\n // Update labels for multiple dropdown\r\n if (obj.options.autocomplete == false) {\r\n obj.header.value = getText().join('; ');\r\n }\r\n\r\n // Events\r\n change(oldValue);\r\n }\r\n }\r\n }\r\n\r\n obj.selectItem = function(item) {\r\n obj.selectIndex(item.indexValue);\r\n }\r\n\r\n obj.find = function(str) {\r\n if (obj.search == str.trim()) {\r\n return false;\r\n }\r\n\r\n // Search term\r\n obj.search = str;\r\n\r\n // Results\r\n obj.numOfItems = 0;\r\n\r\n // Remove current items in the remote search\r\n if (obj.options.remoteSearch == true) {\r\n obj.currentIndex = null;\r\n obj.results = null;\r\n jSuites.ajax({\r\n url: obj.options.url + '?q=' + str,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function(result) {\r\n // Reset items\r\n obj.items = [];\r\n content.innerHTML = '';\r\n obj.appendData(result);\r\n\r\n if (! result.length) {\r\n content.style.display = 'none';\r\n } else {\r\n content.style.display = '';\r\n }\r\n }\r\n });\r\n } else {\r\n // Search terms\r\n str = new RegExp(str, 'gi');\r\n\r\n // Reset search\r\n obj.results = [];\r\n\r\n // Append options\r\n for (var i = 0; i < obj.items.length; i++) {\r\n // Item label\r\n var label = Text(i);\r\n // Item title\r\n var title = obj.items[i].data.title || '';\r\n // Group name\r\n var groupName = obj.items[i].data.group || '';\r\n // Synonym\r\n var synonym = obj.items[i].data.synonym || '';\r\n if (synonym) {\r\n synonym = synonym.join(' ');\r\n }\r\n\r\n if (str == null || obj.items[i].selected == true || label.match(str) || title.match(str) || groupName.match(str) || synonym.match(str)) {\r\n obj.results.push(obj.items[i]);\r\n\r\n if (obj.items[i].group && obj.items[i].group.children[1].children[0]) {\r\n // Remove all nodes\r\n while (obj.items[i].group.children[1].children[0]) {\r\n obj.items[i].group.children[1].removeChild(obj.items[i].group.children[1].children[0]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Remove all nodes\r\n while (content.children[0]) {\r\n content.removeChild(content.children[0]);\r\n }\r\n\r\n // Show 200 items at once\r\n var number = obj.results.length || 0;\r\n\r\n // Lazyloading\r\n if (obj.options.lazyLoading == true && number > 200) {\r\n number = 200;\r\n }\r\n\r\n for (var i = 0; i < number; i++) {\r\n if (obj.results[i].group) {\r\n if (! obj.results[i].group.parentNode) {\r\n content.appendChild(obj.results[i].group);\r\n }\r\n obj.results[i].group.children[1].appendChild(obj.results[i].element);\r\n } else {\r\n content.appendChild(obj.results[i].element);\r\n }\r\n obj.numOfItems++;\r\n }\r\n\r\n if (! obj.results.length) {\r\n content.style.display = 'none';\r\n } else {\r\n content.style.display = '';\r\n }\r\n }\r\n }\r\n\r\n obj.open = function() {\r\n // Focus\r\n if (! el.classList.contains('jdropdown-focus')) {\r\n // Current dropdown\r\n jSuites.dropdown.current = obj;\r\n\r\n // Start tracking\r\n jSuites.tracking(obj, true);\r\n\r\n // Add focus\r\n el.classList.add('jdropdown-focus');\r\n\r\n // Animation\r\n if (jSuites.getWindowWidth() < 800) {\r\n if (obj.options.type == null || obj.options.type == 'picker') {\r\n jSuites.animation.slideBottom(container, 1);\r\n }\r\n }\r\n\r\n // Filter\r\n if (obj.options.autocomplete == true) {\r\n obj.header.value = obj.search;\r\n obj.header.focus();\r\n }\r\n\r\n // Set cursor for the first or first selected element\r\n var k = Object.keys(getValue());\r\n if (k[0]) {\r\n var cursor = obj.getPosition(k[0]);\r\n if (cursor) {\r\n obj.setCursor(cursor);\r\n }\r\n }\r\n\r\n // Container Size\r\n if (! obj.options.type || obj.options.type == 'default') {\r\n var rect = el.getBoundingClientRect();\r\n var rectContainer = container.getBoundingClientRect();\r\n\r\n if (obj.options.position) {\r\n container.style.position = 'fixed';\r\n if (window.innerHeight < rect.bottom + rectContainer.height) {\r\n container.style.top = '';\r\n container.style.bottom = (window.innerHeight - rect.top ) + 1 + 'px';\r\n } else {\r\n container.style.top = rect.bottom + 'px';\r\n container.style.bottom = '';\r\n }\r\n container.style.left = rect.left + 'px';\r\n } else {\r\n if (window.innerHeight < rect.bottom + rectContainer.height) {\r\n container.style.top = '';\r\n container.style.bottom = rect.height + 1 + 'px';\r\n } else {\r\n container.style.top = '';\r\n container.style.bottom = '';\r\n }\r\n }\r\n\r\n container.style.minWidth = rect.width + 'px';\r\n\r\n if (obj.options.maxWidth) {\r\n container.style.maxWidth = obj.options.maxWidth;\r\n }\r\n\r\n if (! obj.items.length && obj.options.autocomplete == true) {\r\n content.style.display = 'none';\r\n } else {\r\n content.style.display = '';\r\n }\r\n }\r\n }\r\n\r\n // Events\r\n if (typeof(obj.options.onopen) == 'function') {\r\n obj.options.onopen(el);\r\n }\r\n }\r\n\r\n obj.close = function(ignoreEvents) {\r\n if (el.classList.contains('jdropdown-focus')) {\r\n // Update labels\r\n obj.header.value = obj.getText();\r\n // Remove cursor\r\n obj.setCursor();\r\n // Events\r\n if (! ignoreEvents && typeof(obj.options.onclose) == 'function') {\r\n obj.options.onclose(el);\r\n }\r\n // Blur\r\n if (obj.header.blur) {\r\n obj.header.blur();\r\n }\r\n // Remove focus\r\n el.classList.remove('jdropdown-focus');\r\n // Start tracking\r\n jSuites.tracking(obj, false);\r\n // Current dropdown\r\n jSuites.dropdown.current = null;\r\n }\r\n\r\n return obj.getValue();\r\n }\r\n\r\n /**\r\n * Set cursor\r\n */\r\n obj.setCursor = function(index, setPosition) {\r\n // Remove current cursor\r\n if (obj.currentIndex != null) {\r\n // Remove visual cursor\r\n if (obj.items && obj.items[obj.currentIndex]) {\r\n obj.items[obj.currentIndex].element.classList.remove('jdropdown-cursor');\r\n }\r\n }\r\n\r\n if (index == undefined) {\r\n obj.currentIndex = null;\r\n } else {\r\n parseInt(index);\r\n\r\n obj.items[index].element.classList.add('jdropdown-cursor');\r\n obj.currentIndex = index;\r\n\r\n // Update scroll to the cursor element\r\n if (setPosition !== false && obj.items[obj.currentIndex].element) {\r\n var container = content.scrollTop;\r\n var element = obj.items[obj.currentIndex].element;\r\n content.scrollTop = element.offsetTop - element.scrollTop + element.clientTop - 95;\r\n }\r\n }\r\n }\r\n\r\n // Compatibility\r\n obj.resetCursor = obj.setCursor;\r\n obj.updateCursor = obj.setCursor;\r\n\r\n /**\r\n * Reset cursor and selected items\r\n */\r\n obj.reset = function() {\r\n // Reset cursor\r\n obj.setCursor();\r\n\r\n // Reset selected\r\n obj.setValue(null);\r\n }\r\n\r\n /**\r\n * First visible item\r\n */\r\n obj.firstVisible = function() {\r\n var newIndex = null;\r\n for (var i = 0; i < obj.items.length; i++) {\r\n if (obj.items && obj.items[i] && obj.items[i].element.parentNode && obj.items[i].element.style.display != 'none') {\r\n newIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (newIndex == null) {\r\n return false;\r\n }\r\n\r\n obj.setCursor(newIndex);\r\n }\r\n\r\n /**\r\n * Navigation\r\n */\r\n obj.first = function() {\r\n var newIndex = null;\r\n for (var i = obj.currentIndex - 1; i >= 0; i--) {\r\n if (obj.items && obj.items[i] && obj.items[i].element.parentNode && obj.items[i].element.style.display != 'none') {\r\n newIndex = i;\r\n }\r\n }\r\n\r\n if (newIndex == null) {\r\n return false;\r\n }\r\n\r\n obj.setCursor(newIndex);\r\n }\r\n\r\n obj.last = function() {\r\n var newIndex = null;\r\n for (var i = obj.currentIndex + 1; i < obj.items.length; i++) {\r\n if (obj.items && obj.items[i] && obj.items[i].element.parentNode && obj.items[i].element.style.display != 'none') {\r\n newIndex = i;\r\n }\r\n }\r\n\r\n if (newIndex == null) {\r\n return false;\r\n }\r\n\r\n obj.setCursor(newIndex);\r\n }\r\n\r\n var next = function(index, letter) {\r\n for (var i = index; i < obj.items.length; i++) {\r\n if (obj.items && obj.items[i] && obj.items[i].element.parentNode && (! letter || (''+Text(i)).substr(0,1).toLowerCase() == letter)) {\r\n return i;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n obj.next = function(letter) {\r\n if (letter && letter.length == 1) {\r\n letter = letter.toLowerCase();\r\n }\r\n\r\n if (obj.currentIndex === null) {\r\n var index = obj.currentIndex = 0;\r\n } else {\r\n var index = obj.currentIndex + 1;\r\n }\r\n\r\n // Try to find the next from the current position\r\n var newIndex = next(index, letter);\r\n\r\n if (newIndex == null && letter) {\r\n // Trying to find from the begining\r\n newIndex = next(0, letter);\r\n // Did not find\r\n if (newIndex == null) {\r\n return false;\r\n }\r\n }\r\n\r\n // Set cursor\r\n obj.setCursor(newIndex);\r\n }\r\n\r\n obj.prev = function() {\r\n var newIndex = null;\r\n for (var i = obj.currentIndex - 1; i >= 0; i--) {\r\n if (obj.items && obj.items[i] && obj.items[i].element.parentNode) {\r\n newIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (newIndex == null) {\r\n return false;\r\n }\r\n\r\n obj.setCursor(newIndex);\r\n }\r\n\r\n obj.loadUp = function() {\r\n return false;\r\n }\r\n\r\n obj.loadDown = function() {\r\n var test = false;\r\n\r\n // Search\r\n if (obj.results) {\r\n var results = obj.results;\r\n } else {\r\n var results = obj.items;\r\n }\r\n\r\n if (results.length > obj.numOfItems) {\r\n var numberOfItems = obj.numOfItems;\r\n var number = results.length - numberOfItems;\r\n if (number > 200) {\r\n number = 200;\r\n }\r\n\r\n for (var i = numberOfItems; i < numberOfItems + number; i++) {\r\n if (results[i].group) {\r\n if (! results[i].group.parentNode) {\r\n content.appendChild(results[i].group);\r\n }\r\n results[i].group.children[2].appendChild(results[i].element);\r\n } else {\r\n content.appendChild(results[i].element);\r\n }\r\n\r\n obj.numOfItems++;\r\n }\r\n\r\n // New item added\r\n test = true;\r\n }\r\n\r\n return test;\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n});\r\n\r\njSuites.dropdown.keydown = function(e) {\r\n var dropdown = null;\r\n if (dropdown = jSuites.dropdown.current) {\r\n if (e.which == 13) {\r\n dropdown.selectIndex(dropdown.currentIndex);\r\n } else if (e.which == 38) {\r\n if (dropdown.currentIndex == null) {\r\n dropdown.firstVisible();\r\n } else if (dropdown.currentIndex > 0) {\r\n dropdown.prev();\r\n }\r\n e.preventDefault();\r\n } else if (e.which == 40) {\r\n if (dropdown.currentIndex == null) {\r\n dropdown.firstVisible();\r\n } else if (dropdown.currentIndex + 1 < dropdown.items.length) {\r\n dropdown.next();\r\n }\r\n e.preventDefault();\r\n } else if (e.which == 36) {\r\n dropdown.first();\r\n } else if (e.which == 35) {\r\n dropdown.last();\r\n } else if (e.which == 27) {\r\n dropdown.close();\r\n }\r\n }\r\n}\r\n\r\njSuites.dropdown.mouseup = function(e) {\r\n var element = jSuites.findElement(e.target, 'jdropdown');\r\n if (element) {\r\n var dropdown = element.dropdown;\r\n if (e.target.classList.contains('jdropdown-header')) {\r\n if (element.classList.contains('jdropdown-focus') && element.classList.contains('jdropdown-default')) {\r\n var rect = element.getBoundingClientRect();\r\n\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].clientX;\r\n var y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n\r\n if (rect.width - (x - rect.left) < 30) {\r\n if (e.target.classList.contains('jdropdown-add')) {\r\n dropdown.add();\r\n } else {\r\n dropdown.close();\r\n }\r\n } else {\r\n if (dropdown.options.autocomplete == false) {\r\n dropdown.close();\r\n }\r\n }\r\n } else {\r\n dropdown.open();\r\n }\r\n } else if (e.target.classList.contains('jdropdown-group-name')) {\r\n var items = e.target.nextSibling.children;\r\n if (e.target.nextSibling.style.display != 'none') {\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].style.display != 'none') {\r\n dropdown.selectItem(items[i]);\r\n }\r\n }\r\n }\r\n } else if (e.target.classList.contains('jdropdown-group-arrow')) {\r\n if (e.target.classList.contains('jdropdown-group-arrow-down')) {\r\n e.target.classList.remove('jdropdown-group-arrow-down');\r\n e.target.classList.add('jdropdown-group-arrow-up');\r\n e.target.parentNode.nextSibling.style.display = 'none';\r\n } else {\r\n e.target.classList.remove('jdropdown-group-arrow-up');\r\n e.target.classList.add('jdropdown-group-arrow-down');\r\n e.target.parentNode.nextSibling.style.display = '';\r\n }\r\n } else if (e.target.classList.contains('jdropdown-item')) {\r\n dropdown.selectItem(e.target);\r\n } else if (e.target.classList.contains('jdropdown-image')) {\r\n dropdown.selectItem(e.target.parentNode);\r\n } else if (e.target.classList.contains('jdropdown-description')) {\r\n dropdown.selectItem(e.target.parentNode);\r\n } else if (e.target.classList.contains('jdropdown-title')) {\r\n dropdown.selectItem(e.target.parentNode.parentNode);\r\n } else if (e.target.classList.contains('jdropdown-close') || e.target.classList.contains('jdropdown-backdrop')) {\r\n dropdown.close();\r\n }\r\n }\r\n}\r\n\r\njSuites.dropdown.extractFromDom = function(el, options) {\r\n // Keep reference\r\n var select = el;\r\n if (! options) {\r\n options = {};\r\n }\r\n // Prepare configuration\r\n if (el.getAttribute('multiple') && (! options || options.multiple == undefined)) {\r\n options.multiple = true;\r\n }\r\n if (el.getAttribute('placeholder') && (! options || options.placeholder == undefined)) {\r\n options.placeholder = el.getAttribute('placeholder');\r\n }\r\n if (el.getAttribute('data-autocomplete') && (! options || options.autocomplete == undefined)) {\r\n options.autocomplete = true;\r\n }\r\n if (! options || options.width == undefined) {\r\n options.width = el.offsetWidth;\r\n }\r\n if (el.value && (! options || options.value == undefined)) {\r\n options.value = el.value;\r\n }\r\n if (! options || options.data == undefined) {\r\n options.data = [];\r\n for (var j = 0; j < el.children.length; j++) {\r\n if (el.children[j].tagName == 'OPTGROUP') {\r\n for (var i = 0; i < el.children[j].children.length; i++) {\r\n options.data.push({\r\n value: el.children[j].children[i].value,\r\n text: el.children[j].children[i].innerHTML,\r\n group: el.children[j].getAttribute('label'),\r\n });\r\n }\r\n } else {\r\n options.data.push({\r\n value: el.children[j].value,\r\n text: el.children[j].innerHTML,\r\n });\r\n }\r\n }\r\n }\r\n if (! options || options.onchange == undefined) {\r\n options.onchange = function(a,b,c,d) {\r\n if (options.multiple == true) {\r\n if (obj.items[b].classList.contains('jdropdown-selected')) {\r\n select.options[b].setAttribute('selected', 'selected');\r\n } else {\r\n select.options[b].removeAttribute('selected');\r\n }\r\n } else {\r\n select.value = d;\r\n }\r\n }\r\n }\r\n // Create DIV\r\n var div = document.createElement('div');\r\n el.parentNode.insertBefore(div, el);\r\n el.style.display = 'none';\r\n el = div;\r\n\r\n return { el:el, options:options };\r\n}\r\n\r\njSuites.editor = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // If element is textarea, then replace by div editor\r\n if (el.tagName == 'TEXTAREA' || el.tagName == 'INPUT') {\r\n // Current element\r\n var element = el;\r\n element.style.display = 'none';\r\n // New Element\r\n el = document.createElement('div');\r\n // Value\r\n if (! options.value) {\r\n options.value = element.value;\r\n }\r\n // Event to populate the textarea\r\n options.onblur = function(a,b,c) {\r\n element.value = b.getData()\r\n }\r\n element.insertBefore(el);\r\n }\r\n\r\n // Default configuration\r\n var defaults = {\r\n // Initial HTML content\r\n value: null,\r\n // Initial snippet\r\n snippet: null,\r\n // Add toolbar\r\n toolbar: null,\r\n // Website parser is to read websites and images from cross domain\r\n remoteParser: null,\r\n // Placeholder\r\n placeholder: null,\r\n // Parse URL\r\n parseURL: false,\r\n filterPaste: true,\r\n // Accept drop files\r\n dropZone: false,\r\n dropAsAttachment: false,\r\n acceptImages: false,\r\n acceptFiles: false,\r\n maxFileSize: 5000000,\r\n allowImageResize: true,\r\n // Style\r\n border: true,\r\n padding: true,\r\n maxHeight: null,\r\n height: null,\r\n focus: false,\r\n // Events\r\n onclick: null,\r\n onfocus: null,\r\n onblur: null,\r\n onload: null,\r\n onkeyup: null,\r\n onkeydown: null,\r\n onchange: null,\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Private controllers\r\n var imageResize = 0;\r\n var editorTimer = null;\r\n var editorAction = null;\r\n\r\n // Make sure element is empty\r\n el.innerHTML = '';\r\n\r\n if (typeof(obj.options.onclick) == 'function') {\r\n el.onclick = function(e) {\r\n obj.options.onclick(el, obj, e);\r\n }\r\n }\r\n\r\n // Prepare container\r\n el.classList.add('jeditor-container');\r\n\r\n // Padding\r\n if (obj.options.padding == true) {\r\n el.classList.add('jeditor-padding');\r\n }\r\n\r\n // Placeholder\r\n if (obj.options.placeholder) {\r\n el.setAttribute('data-placeholder', obj.options.placeholder);\r\n }\r\n\r\n // Border\r\n if (obj.options.border == false) {\r\n el.style.border = '0px';\r\n }\r\n\r\n // Snippet\r\n var snippet = document.createElement('div');\r\n snippet.className = 'jsnippet';\r\n snippet.setAttribute('contenteditable', false);\r\n\r\n // Toolbar\r\n var toolbar = document.createElement('div');\r\n toolbar.className = 'jeditor-toolbar';\r\n\r\n // Create editor\r\n var editor = document.createElement('div');\r\n editor.setAttribute('contenteditable', true);\r\n editor.setAttribute('spellcheck', false);\r\n editor.className = 'jeditor';\r\n\r\n // Max height\r\n if (obj.options.maxHeight || obj.options.height) {\r\n editor.style.overflowY = 'auto';\r\n\r\n if (obj.options.maxHeight) {\r\n editor.style.maxHeight = obj.options.maxHeight;\r\n }\r\n if (obj.options.height) {\r\n editor.style.height = obj.options.height;\r\n }\r\n }\r\n\r\n // Set editor initial value\r\n if (obj.options.value) {\r\n var value = obj.options.value;\r\n } else {\r\n var value = el.innerHTML ? el.innerHTML : ''; \r\n }\r\n\r\n if (! value) {\r\n var value = '
';\r\n }\r\n\r\n /**\r\n * Onchange event controllers\r\n */\r\n var change = function(e) {\r\n if (typeof(obj.options.onchange) == 'function') { \r\n obj.options.onchange(el, obj, e);\r\n }\r\n\r\n // Update value\r\n obj.options.value = obj.getData();\r\n\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof(el.onchange) == 'function') {\r\n el.onchange({\r\n type: 'change',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Extract images from a HTML string\r\n */\r\n var extractImageFromHtml = function(html) {\r\n // Create temp element\r\n var div = document.createElement('div');\r\n div.innerHTML = html;\r\n\r\n // Extract images\r\n var img = div.querySelectorAll('img');\r\n\r\n if (img.length) {\r\n for (var i = 0; i < img.length; i++) {\r\n obj.addImage(img[i].src);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Insert node at caret\r\n */\r\n var insertNodeAtCaret = function(newNode) {\r\n var sel, range;\r\n\r\n if (window.getSelection) {\r\n sel = window.getSelection();\r\n if (sel.rangeCount) {\r\n range = sel.getRangeAt(0);\r\n var selectedText = range.toString();\r\n range.deleteContents();\r\n range.insertNode(newNode); \r\n // move the cursor after element\r\n range.setStartAfter(newNode);\r\n range.setEndAfter(newNode); \r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Append snippet or thumbs in the editor\r\n * @Param object data\r\n */\r\n var appendElement = function(data) {\r\n // Reset snippet\r\n snippet.innerHTML = '';\r\n\r\n if (data.image) {\r\n var div = document.createElement('div');\r\n div.className = 'jsnippet-image';\r\n div.setAttribute('data-k', 'image');\r\n snippet.appendChild(div);\r\n\r\n var image = document.createElement('img');\r\n image.src = data.image;\r\n div.appendChild(image);\r\n }\r\n\r\n var div = document.createElement('div');\r\n div.className = 'jsnippet-title';\r\n div.setAttribute('data-k', 'title');\r\n div.innerHTML = data.title;\r\n snippet.appendChild(div);\r\n\r\n var div = document.createElement('div');\r\n div.className = 'jsnippet-description';\r\n div.setAttribute('data-k', 'description');\r\n div.innerHTML = data.description;\r\n snippet.appendChild(div);\r\n\r\n var div = document.createElement('div');\r\n div.className = 'jsnippet-host';\r\n div.setAttribute('data-k', 'host');\r\n div.innerHTML = data.host;\r\n snippet.appendChild(div);\r\n\r\n var div = document.createElement('div');\r\n div.className = 'jsnippet-url';\r\n div.setAttribute('data-k', 'url');\r\n div.innerHTML = data.url;\r\n snippet.appendChild(div);\r\n\r\n editor.appendChild(snippet);\r\n }\r\n\r\n var verifyEditor = function() {\r\n clearTimeout(editorTimer);\r\n editorTimer = setTimeout(function() {\r\n var snippet = editor.querySelector('.jsnippet');\r\n var thumbsContainer = el.querySelector('.jeditor-thumbs-container');\r\n\r\n if (! snippet && ! thumbsContainer) {\r\n var html = editor.innerHTML.replace(/\\n/g, ' ');\r\n var container = document.createElement('div');\r\n container.innerHTML = html;\r\n var thumbsContainer = container.querySelector('.jeditor-thumbs-container');\r\n if (thumbsContainer) {\r\n thumbsContainer.remove();\r\n }\r\n var text = container.innerText; \r\n var url = jSuites.editor.detectUrl(text);\r\n\r\n if (url) {\r\n if (url[0].substr(-3) == 'jpg' || url[0].substr(-3) == 'png' || url[0].substr(-3) == 'gif') {\r\n if (jSuites.editor.getDomain(url[0]) == window.location.hostname) {\r\n obj.importImage(url[0], '');\r\n } else {\r\n obj.importImage(obj.options.remoteParser + url[0], '');\r\n }\r\n } else {\r\n var id = jSuites.editor.youtubeParser(url[0]);\r\n obj.parseWebsite(url[0], id);\r\n }\r\n }\r\n }\r\n }, 1000);\r\n }\r\n\r\n obj.parseContent = function() {\r\n verifyEditor();\r\n }\r\n\r\n obj.parseWebsite = function(url, youtubeId) {\r\n if (! obj.options.remoteParser) {\r\n console.log('The remoteParser is not defined');\r\n } else {\r\n // Youtube definitions\r\n if (youtubeId) {\r\n var url = 'https://www.youtube.com/watch?v=' + youtubeId;\r\n }\r\n\r\n var p = {\r\n title: '',\r\n description: '',\r\n image: '',\r\n host: url.split('/')[2],\r\n url: url,\r\n }\r\n\r\n jSuites.ajax({\r\n url: obj.options.remoteParser + encodeURI(url.trim()),\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function(result) {\r\n // Get title\r\n if (result.title) {\r\n p.title = result.title;\r\n }\r\n // Description\r\n if (result.description) {\r\n p.description = result.description;\r\n }\r\n // Image\r\n if (result.image) {\r\n p.image = result.image;\r\n } else if (result['og:image']) {\r\n p.image = result['og:image'];\r\n }\r\n // Host\r\n if (result.host) {\r\n p.host = result.host;\r\n }\r\n // Url\r\n if (result.url) {\r\n p.url = result.url;\r\n }\r\n\r\n appendElement(p);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Set editor value\r\n */\r\n obj.setData = function(html) {\r\n editor.innerHTML = html;\r\n\r\n if (obj.options.focus) {\r\n jSuites.editor.setCursor(editor, true);\r\n }\r\n }\r\n\r\n obj.getText = function() {\r\n return editor.innerText;\r\n }\r\n\r\n /**\r\n * Get editor data\r\n */\r\n obj.getData = function(json) {\r\n if (! json) {\r\n var data = editor.innerHTML;\r\n } else {\r\n var data = {\r\n content : '',\r\n }\r\n\r\n // Get tag users\r\n var tagged = editor.querySelectorAll('.post-tag');\r\n if (tagged.length) {\r\n data.users = [];\r\n for (var i = 0; i < tagged.length; i++) {\r\n var userId = tagged[i].getAttribute('data-user');\r\n if (userId) {\r\n data.users.push(userId);\r\n }\r\n }\r\n data.users = data.users.join(',');\r\n }\r\n\r\n if (snippet.innerHTML) {\r\n var index = 0;\r\n data.snippet = {};\r\n for (var i = 0; i < snippet.children.length; i++) {\r\n // Get key from element\r\n var key = snippet.children[i].getAttribute('data-k');\r\n if (key) {\r\n if (key == 'image') {\r\n data.snippet.image = snippet.children[i].children[0].getAttribute('src');\r\n } else {\r\n data.snippet[key] = snippet.children[i].innerHTML;\r\n }\r\n }\r\n }\r\n\r\n snippet.innerHTML = '';\r\n snippet.remove();\r\n }\r\n\r\n var text = editor.innerHTML;\r\n text = text.replace(/
/g, \"\\n\");\r\n text = text.replace(/<\\/div>/g, \"<\\/div>\\n\");\r\n text = text.replace(/<(?:.|\\n)*?>/gm, \"\");\r\n data.content = text.trim();\r\n data = JSON.stringify(data);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n // Reset\r\n obj.reset = function() {\r\n editor.innerHTML = '';\r\n }\r\n\r\n obj.addPdf = function(data) {\r\n if (data.result.substr(0,4) != 'data') {\r\n console.error('Invalid source');\r\n } else {\r\n var canvas = document.createElement('canvas');\r\n canvas.width = 60;\r\n canvas.height = 60;\r\n\r\n var img = new Image();\r\n var ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n\r\n canvas.toBlob(function(blob) {\r\n var newImage = document.createElement('img');\r\n newImage.src = window.URL.createObjectURL(blob);\r\n newImage.setAttribute('data-extension', 'pdf');\r\n if (data.name) {\r\n newImage.setAttribute('data-name', data.name);\r\n }\r\n if (data.size) {\r\n newImage.setAttribute('data-size', data.size);\r\n }\r\n if (data.date) {\r\n newImage.setAttribute('data-date', data.date);\r\n }\r\n newImage.className = 'jfile pdf';\r\n\r\n insertNodeAtCaret(newImage);\r\n\r\n // Image content\r\n newImage.content = data.result.substr(data.result.indexOf(',') + 1);\r\n });\r\n }\r\n }\r\n\r\n obj.getFiles = function() {\r\n return jSuites.files(editor).get();\r\n }\r\n\r\n obj.addImage = function(src, name, size, date, handler) {\r\n if (src.substr(0,4) != 'data' && ! obj.options.remoteParser) {\r\n console.error('remoteParser not defined in your initialization');\r\n } else {\r\n // This is to process cross domain images\r\n if (src.substr(0,4) == 'data') {\r\n var extension = src.split(';')\r\n extension = extension[0].split('/');\r\n extension = extension[1];\r\n } else {\r\n var extension = src.substr(src.lastIndexOf('.') + 1);\r\n // Work for cross browsers\r\n src = obj.options.remoteParser + src;\r\n }\r\n\r\n var img = new Image();\r\n\r\n img.onload = function onload() {\r\n var canvas = document.createElement('canvas');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n var ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n\r\n canvas.toBlob(function(blob) {\r\n var newImage = document.createElement('img');\r\n newImage.src = window.URL.createObjectURL(blob);\r\n newImage.className = 'jfile';\r\n newImage.setAttribute('tabindex', '900');\r\n var data = {\r\n file: newImage.src,\r\n name: name,\r\n size: size,\r\n date: date,\r\n extension: extension,\r\n content: canvas.toDataURL(),\r\n }\r\n newImage.content = data;\r\n if (typeof(handler) == 'function') {\r\n handler(newImage, data);\r\n } else {\r\n insertNodeAtCaret(newImage);\r\n }\r\n change();\r\n });\r\n };\r\n\r\n img.src = src;\r\n }\r\n }\r\n\r\n obj.addFile = function(files) {\r\n var reader = [];\r\n\r\n for (var i = 0; i < files.length; i++) {\r\n if (files[i].size > obj.options.maxFileSize) {\r\n alert('The file is too big');\r\n } else {\r\n // Only PDF or Images\r\n var type = files[i].type.split('/');\r\n\r\n if (type[0] == 'image') {\r\n type = 1;\r\n } else if (type[1] == 'pdf') {\r\n type = 2;\r\n } else {\r\n type = 0;\r\n }\r\n\r\n if (type) {\r\n // Create file\r\n reader[i] = new FileReader();\r\n reader[i].index = i;\r\n reader[i].type = type;\r\n reader[i].name = files[i].name;\r\n reader[i].date = files[i].lastModified;\r\n reader[i].size = files[i].size;\r\n reader[i].addEventListener(\"load\", function (data) {\r\n // Get result\r\n if (data.target.type == 2) {\r\n if (obj.options.acceptFiles == true) {\r\n obj.addPdf(data.target);\r\n }\r\n } else {\r\n obj.addImage(data.target.result, data.target.name, data.total, data.target.lastModified);\r\n }\r\n }, false);\r\n\r\n reader[i].readAsDataURL(files[i])\r\n } else {\r\n alert('The extension is not allowed');\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Destroy\r\n obj.destroy = function() {\r\n editor.removeEventListener('mouseup', editorMouseUp);\r\n editor.removeEventListener('mousedown', editorMouseDown);\r\n editor.removeEventListener('mousemove', editorMouseMove);\r\n editor.removeEventListener('keyup', editorKeyUp);\r\n editor.removeEventListener('keydown', editorKeyDown);\r\n editor.removeEventListener('dragstart', editorDragStart);\r\n editor.removeEventListener('dragenter', editorDragEnter);\r\n editor.removeEventListener('dragover', editorDragOver);\r\n editor.removeEventListener('drop', editorDrop);\r\n editor.removeEventListener('paste', editorPaste);\r\n\r\n if (typeof(obj.options.onblur) == 'function') {\r\n editor.removeEventListener('blur', editorBlur);\r\n }\r\n if (typeof(obj.options.onfocus) == 'function') {\r\n editor.removeEventListener('focus', editorFocus);\r\n }\r\n\r\n el.editor = null;\r\n el.classList.remove('jeditor-container');\r\n\r\n toolbar.remove();\r\n snippet.remove();\r\n editor.remove();\r\n }\r\n\r\n var isLetter = function (str) {\r\n var regex = /([\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]+)/g;\r\n return str.match(regex) ? 1 : 0;\r\n }\r\n\r\n // Event handlers\r\n var editorMouseUp = function(e) {\r\n if (editorAction && editorAction.e) {\r\n editorAction.e.classList.remove('resizing');\r\n }\r\n\r\n editorAction = false;\r\n }\r\n\r\n var editorMouseDown = function(e) {\r\n var close = function(snippet) {\r\n var rect = snippet.getBoundingClientRect();\r\n if (rect.width - (e.clientX - rect.left) < 40 && e.clientY - rect.top < 40) {\r\n snippet.innerHTML = '';\r\n snippet.remove();\r\n }\r\n }\r\n\r\n if (e.target.tagName == 'IMG') {\r\n if (e.target.style.cursor) {\r\n var rect = e.target.getBoundingClientRect();\r\n editorAction = {\r\n e: e.target,\r\n x: e.clientX,\r\n y: e.clientY,\r\n w: rect.width,\r\n h: rect.height,\r\n d: e.target.style.cursor,\r\n }\r\n\r\n if (! e.target.width) {\r\n e.target.width = rect.width + 'px';\r\n }\r\n\r\n if (! e.target.height) {\r\n e.target.height = rect.height + 'px';\r\n }\r\n\r\n var s = window.getSelection();\r\n if (s.rangeCount) {\r\n for (var i = 0; i < s.rangeCount; i++) {\r\n s.removeRange(s.getRangeAt(i));\r\n }\r\n }\r\n\r\n e.target.classList.add('resizing');\r\n } else {\r\n editorAction = true;\r\n }\r\n } else { \r\n if (e.target.classList.contains('jsnippet')) {\r\n close(e.target);\r\n } else if (e.target.parentNode.classList.contains('jsnippet')) {\r\n close(e.target.parentNode);\r\n }\r\n\r\n editorAction = true;\r\n }\r\n }\r\n\r\n var editorMouseMove = function(e) {\r\n if (e.target.tagName == 'IMG' && obj.options.allowImageResize == true) {\r\n if (e.target.getAttribute('tabindex')) {\r\n var rect = e.target.getBoundingClientRect();\r\n if (e.clientY - rect.top < 5) {\r\n if (rect.width - (e.clientX - rect.left) < 5) {\r\n e.target.style.cursor = 'ne-resize';\r\n } else if (e.clientX - rect.left < 5) {\r\n e.target.style.cursor = 'nw-resize';\r\n } else {\r\n e.target.style.cursor = 'n-resize';\r\n }\r\n } else if (rect.height - (e.clientY - rect.top) < 5) {\r\n if (rect.width - (e.clientX - rect.left) < 5) {\r\n e.target.style.cursor = 'se-resize';\r\n } else if (e.clientX - rect.left < 5) {\r\n e.target.style.cursor = 'sw-resize';\r\n } else {\r\n e.target.style.cursor = 's-resize';\r\n }\r\n } else if (rect.width - (e.clientX - rect.left) < 5) {\r\n e.target.style.cursor = 'e-resize';\r\n } else if (e.clientX - rect.left < 5) {\r\n e.target.style.cursor = 'w-resize';\r\n } else {\r\n e.target.style.cursor = '';\r\n }\r\n }\r\n }\r\n\r\n // Move\r\n if (e.which == 1 && editorAction && editorAction.d) {\r\n if (editorAction.d == 'e-resize' || editorAction.d == 'ne-resize' || editorAction.d == 'se-resize') {\r\n editorAction.e.width = (editorAction.w + (e.clientX - editorAction.x));\r\n\r\n if (e.shiftKey) {\r\n var newHeight = (e.clientX - editorAction.x) * (editorAction.h / editorAction.w);\r\n editorAction.e.height = editorAction.h + newHeight;\r\n } else {\r\n var newHeight = null;\r\n }\r\n }\r\n\r\n if (! newHeight) {\r\n if (editorAction.d == 's-resize' || editorAction.d == 'se-resize' || editorAction.d == 'sw-resize') {\r\n if (! e.shiftKey) {\r\n editorAction.e.height = editorAction.h + (e.clientY - editorAction.y);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n var editorKeyUp = function(e) {\r\n if (! editor.innerHTML) {\r\n editor.innerHTML = '

';\r\n }\r\n\r\n if (typeof(obj.options.onkeyup) == 'function') { \r\n obj.options.onkeyup(el, obj, e);\r\n }\r\n }\r\n\r\n\r\n var editorKeyDown = function(e) {\r\n // Check for URL\r\n if (obj.options.parseURL == true) {\r\n verifyEditor();\r\n }\r\n\r\n if (typeof(obj.options.onkeydown) == 'function') { \r\n obj.options.onkeydown(el, obj, e);\r\n }\r\n }\r\n\r\n // Elements to be removed\r\n var remove = [HTMLUnknownElement];\r\n\r\n // Valid CSS attributes\r\n var validStyle = ['color', 'font-weight', 'font-size', 'background', 'background-color', 'margin'];\r\n\r\n var parse = function(element) {\r\n // Remove attributes\r\n if (element.attributes && element.attributes.length) {\r\n var image = null;\r\n var style = null;\r\n // Process style attribute\r\n var elementStyle = element.getAttribute('style');\r\n if (elementStyle) {\r\n style = [];\r\n var t = elementStyle.split(';');\r\n for (var j = 0; j < t.length; j++) {\r\n var v = t[j].trim().split(':');\r\n if (validStyle.indexOf(v[0].trim()) >= 0) {\r\n var k = v.shift();\r\n var v = v.join(':');\r\n style.push(k + ':' + v);\r\n }\r\n }\r\n }\r\n // Process image\r\n if (element.tagName == 'IMG') {\r\n if (! obj.options.acceptImages) {\r\n element.remove();\r\n } else {\r\n // Check if is data\r\n element.setAttribute('tabindex', '900');\r\n // Check attributes for persistance\r\n obj.addImage(element.src, null, null, null, function(a, b) {\r\n element.src = b.file;\r\n element.content = b;\r\n element.classList.add('jfile');\r\n });\r\n }\r\n } else {\r\n // Remove attributes\r\n var numAttributes = element.attributes.length - 1;\r\n for (var i = numAttributes; i >= 0 ; i--) {\r\n element.removeAttribute(element.attributes[i].name);\r\n }\r\n }\r\n element.style = '';\r\n // Add valid style\r\n if (style && style.length) {\r\n element.setAttribute('style', style.join(';'));\r\n }\r\n }\r\n // Parse children\r\n if (element.children.length) {\r\n for (var i = 0; i < element.children.length; i++) {\r\n parse(element.children[i]);\r\n }\r\n }\r\n\r\n if (remove.indexOf(element.constructor) >= 0) {\r\n element.remove();\r\n }\r\n }\r\n\r\n var filter = function(data) {\r\n if (data) {\r\n data = data.replace(new RegExp('', 'gsi'), '');\r\n }\r\n var span = document.createElement('span');\r\n span.innerHTML = data;\r\n parse(span);\r\n return span;\r\n } \r\n\r\n var editorPaste = function(e) {\r\n if (obj.options.filterPaste == true) {\r\n if (e.clipboardData || e.originalEvent.clipboardData) {\r\n var html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n var text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n var file = (e.originalEvent || e).clipboardData.files\r\n } else if (window.clipboardData) {\r\n var html = window.clipboardData.getData('Html');\r\n var text = window.clipboardData.getData('Text');\r\n var file = window.clipboardData.files\r\n }\r\n\r\n if (file.length) {\r\n // Paste a image from the clipboard\r\n obj.addFile(file);\r\n } else {\r\n if (! html) {\r\n html = text.split('\\r\\n');\r\n if (! e.target.innerText) {\r\n html.map(function(v) {\r\n var d = document.createElement('div');\r\n d.innerText = v;\r\n editor.appendChild(d);\r\n });\r\n } else {\r\n html = html.map(function(v) {\r\n return '
' + v + '
';\r\n });\r\n document.execCommand('insertHtml', false, html.join(''));\r\n }\r\n } else {\r\n var d = filter(html);\r\n console.log(d)\r\n // Paste to the editor\r\n insertNodeAtCaret(d)\r\n }\r\n }\r\n\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n var editorDragStart = function(e) {\r\n if (editorAction && editorAction.e) {\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n var editorDragEnter = function(e) {\r\n if (editorAction || obj.options.dropZone == false) {\r\n // Do nothing\r\n } else {\r\n el.classList.add('jeditor-dragging');\r\n }\r\n }\r\n\r\n var editorDragOver = function(e) {\r\n if (editorAction || obj.options.dropZone == false) {\r\n // Do nothing\r\n } else {\r\n if (editorTimer) {\r\n clearTimeout(editorTimer);\r\n }\r\n\r\n editorTimer = setTimeout(function() {\r\n el.classList.remove('jeditor-dragging');\r\n }, 100);\r\n }\r\n }\r\n\r\n var editorDrop = function(e) {\r\n if (editorAction || obj.options.dropZone == false) {\r\n // Do nothing\r\n } else {\r\n // Position caret on the drop\r\n var range = null;\r\n if (document.caretRangeFromPoint) {\r\n range=document.caretRangeFromPoint(e.clientX, e.clientY);\r\n } else if (e.rangeParent) {\r\n range=document.createRange();\r\n range.setStart(e.rangeParent,e.rangeOffset);\r\n }\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n sel.anchorNode.parentNode.focus();\r\n\r\n var html = (e.originalEvent || e).dataTransfer.getData('text/html');\r\n var text = (e.originalEvent || e).dataTransfer.getData('text/plain');\r\n var file = (e.originalEvent || e).dataTransfer.files;\r\n \r\n if (file.length) {\r\n obj.addFile(file);\r\n } else if (text) {\r\n extractImageFromHtml(html);\r\n }\r\n\r\n el.classList.remove('jeditor-dragging');\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n var editorBlur = function(e) {\r\n // Blur\r\n if (typeof(obj.options.onblur) == 'function') {\r\n obj.options.onblur(el, obj, e);\r\n }\r\n\r\n change(e);\r\n }\r\n\r\n var editorFocus = function(e) {\r\n // Focus\r\n if (typeof(obj.options.onfocus) == 'function') {\r\n obj.options.onfocus(el, obj, e);\r\n }\r\n }\r\n\r\n editor.addEventListener('mouseup', editorMouseUp);\r\n editor.addEventListener('mousedown', editorMouseDown);\r\n editor.addEventListener('mousemove', editorMouseMove);\r\n editor.addEventListener('keyup', editorKeyUp);\r\n editor.addEventListener('keydown', editorKeyDown);\r\n editor.addEventListener('dragstart', editorDragStart);\r\n editor.addEventListener('dragenter', editorDragEnter);\r\n editor.addEventListener('dragover', editorDragOver);\r\n editor.addEventListener('drop', editorDrop);\r\n editor.addEventListener('paste', editorPaste);\r\n editor.addEventListener('focus', editorFocus);\r\n editor.addEventListener('blur', editorBlur);\r\n\r\n // Onload\r\n if (typeof(obj.options.onload) == 'function') {\r\n obj.options.onload(el, obj, editor);\r\n }\r\n\r\n // Set value to the editor\r\n editor.innerHTML = value;\r\n\r\n // Append editor to the containre\r\n el.appendChild(editor);\r\n\r\n // Snippet\r\n if (obj.options.snippet) {\r\n appendElement(obj.options.snippet);\r\n }\r\n\r\n // Default toolbar\r\n if (obj.options.toolbar == null) {\r\n obj.options.toolbar = jSuites.editor.getDefaultToolbar();\r\n }\r\n\r\n // Add toolbar\r\n if (obj.options.toolbar) {\r\n // Create toolbar\r\n jSuites.toolbar(toolbar, {\r\n container: true,\r\n items: obj.options.toolbar\r\n });\r\n // Append to the DOM\r\n el.appendChild(toolbar);\r\n }\r\n\r\n // Focus to the editor\r\n if (obj.options.focus) {\r\n jSuites.editor.setCursor(editor, obj.options.focus == 'initial' ? true : false);\r\n }\r\n\r\n // Change method\r\n el.change = obj.setData;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getData();\r\n } else {\r\n obj.setData(val);\r\n }\r\n }\r\n\r\n el.editor = obj;\r\n\r\n return obj;\r\n});\r\n\r\njSuites.editor.setCursor = function(element, first) {\r\n element.focus();\r\n document.execCommand('selectAll');\r\n var sel = window.getSelection();\r\n var range = sel.getRangeAt(0);\r\n if (first == true) {\r\n var node = range.startContainer;\r\n var size = 0;\r\n } else {\r\n var node = range.endContainer;\r\n var size = node.length;\r\n }\r\n range.setStart(node, size);\r\n range.setEnd(node, size);\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n}\r\n\r\njSuites.editor.getDomain = function(url) {\r\n return url.replace('http://','').replace('https://','').replace('www.','').split(/[/?#]/)[0].split(/:/g)[0];\r\n}\r\n\r\njSuites.editor.detectUrl = function(text) {\r\n var expression = /(((https?:\\/\\/)|(www\\.))[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|]+)/ig;\r\n var links = text.match(expression);\r\n\r\n if (links) {\r\n if (links[0].substr(0,3) == 'www') {\r\n links[0] = 'http://' + links[0];\r\n }\r\n }\r\n\r\n return links;\r\n}\r\n\r\njSuites.editor.youtubeParser = function(url) {\r\n var regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*/;\r\n var match = url.match(regExp);\r\n\r\n return (match && match[7].length == 11) ? match[7] : false;\r\n}\r\n\r\njSuites.editor.getDefaultToolbar = function() { \r\n return [\r\n {\r\n content: 'undo',\r\n onclick: function() {\r\n document.execCommand('undo');\r\n }\r\n },\r\n {\r\n content: 'redo',\r\n onclick: function() {\r\n document.execCommand('redo');\r\n }\r\n },\r\n {\r\n type:'divisor'\r\n },\r\n {\r\n content: 'format_bold',\r\n onclick: function(a,b,c) {\r\n document.execCommand('bold');\r\n\r\n if (document.queryCommandState(\"bold\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n },\r\n {\r\n content: 'format_italic',\r\n onclick: function(a,b,c) {\r\n document.execCommand('italic');\r\n\r\n if (document.queryCommandState(\"italic\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n },\r\n {\r\n content: 'format_underline',\r\n onclick: function(a,b,c) {\r\n document.execCommand('underline');\r\n\r\n if (document.queryCommandState(\"underline\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n },\r\n {\r\n type:'divisor'\r\n },\r\n {\r\n content: 'format_list_bulleted',\r\n onclick: function(a,b,c) {\r\n document.execCommand('insertUnorderedList');\r\n\r\n if (document.queryCommandState(\"insertUnorderedList\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n },\r\n {\r\n content: 'format_list_numbered',\r\n onclick: function(a,b,c) {\r\n document.execCommand('insertOrderedList');\r\n\r\n if (document.queryCommandState(\"insertOrderedList\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n },\r\n {\r\n content: 'format_indent_increase',\r\n onclick: function(a,b,c) {\r\n document.execCommand('indent', true, null);\r\n\r\n if (document.queryCommandState(\"indent\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n },\r\n {\r\n content: 'format_indent_decrease',\r\n onclick: function() {\r\n document.execCommand('outdent');\r\n\r\n if (document.queryCommandState(\"outdent\")) {\r\n this.classList.add('selected');\r\n } else {\r\n this.classList.remove('selected');\r\n }\r\n }\r\n }/*,\r\n {\r\n icon: ['format_align_left', 'format_align_right', 'format_align_center'],\r\n onclick: function() {\r\n document.execCommand('justifyCenter');\r\n\r\n if (document.queryCommandState(\"justifyCenter\")) {\r\n this.classList.add('selected');\r\n } else {\r\n this.classList.remove('selected');\r\n }\r\n }\r\n }\r\n {\r\n type:'select',\r\n items: ['Verdana','Arial','Courier New'],\r\n onchange: function() {\r\n }\r\n },\r\n {\r\n type:'select',\r\n items: ['10px','12px','14px','16px','18px','20px','22px'],\r\n onchange: function() {\r\n }\r\n },\r\n {\r\n icon:'format_align_left',\r\n onclick: function() {\r\n document.execCommand('JustifyLeft');\r\n\r\n if (document.queryCommandState(\"JustifyLeft\")) {\r\n this.classList.add('selected');\r\n } else {\r\n this.classList.remove('selected');\r\n }\r\n }\r\n },\r\n {\r\n icon:'format_align_center',\r\n onclick: function() {\r\n document.execCommand('justifyCenter');\r\n\r\n if (document.queryCommandState(\"justifyCenter\")) {\r\n this.classList.add('selected');\r\n } else {\r\n this.classList.remove('selected');\r\n }\r\n }\r\n },\r\n {\r\n icon:'format_align_right',\r\n onclick: function() {\r\n document.execCommand('justifyRight');\r\n\r\n if (document.queryCommandState(\"justifyRight\")) {\r\n this.classList.add('selected');\r\n } else {\r\n this.classList.remove('selected');\r\n }\r\n }\r\n },\r\n {\r\n icon:'format_align_justify',\r\n onclick: function() {\r\n document.execCommand('justifyFull');\r\n\r\n if (document.queryCommandState(\"justifyFull\")) {\r\n this.classList.add('selected');\r\n } else {\r\n this.classList.remove('selected');\r\n }\r\n }\r\n },\r\n {\r\n icon:'format_list_bulleted',\r\n onclick: function() {\r\n document.execCommand('insertUnorderedList');\r\n\r\n if (document.queryCommandState(\"insertUnorderedList\")) {\r\n this.classList.add('selected');\r\n } else {\r\n this.classList.remove('selected');\r\n }\r\n }\r\n }*/\r\n ];\r\n}\r\n\r\n\r\njSuites.files = (function(element) {\r\n if (! element) {\r\n console.error('No element defined in the arguments of your method');\r\n }\r\n\r\n var obj = {};\r\n\r\n // DOM references\r\n var D = [];\r\n\r\n // Files container\r\n obj.data = [];\r\n\r\n /**\r\n * Get list of files and properties\r\n */\r\n obj.get = function() {\r\n return obj.data;\r\n }\r\n\r\n /**\r\n * Update the properties of files\r\n */\r\n obj.getNames = function(options) {\r\n if (options && options.folder) {\r\n var folder = options.folder;\r\n } else {\r\n var folder = '/media';\r\n }\r\n\r\n // Get attachments\r\n var data = {};\r\n for (var i = 0; i < D.length; i++) {\r\n if (D[i] && D[i].src && D[i].src.substr(0,5) == 'blob:') {\r\n var name = D[i].src.split('/');\r\n data[D[i].src] = folder + '/' + name[name.length - 1] + '.' + D[i].content[i].extension;\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Update the properties of files\r\n */\r\n obj.updateNames = function(options) {\r\n if (options && options.folder) {\r\n var folder = options.folder;\r\n } else {\r\n var folder = '/media';\r\n }\r\n\r\n // Get attachments\r\n for (var i = 0; i < D.length; i++) {\r\n if (D[i] && D[i].src && D[i].src.substr(0,5) == 'blob:') {\r\n var name = D[i].src.split('/');\r\n D[i].src = folder + '/' + name[name.length - 1] + '.' + D[i].content[i].extension;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove files\r\n */\r\n obj.remove = function() {\r\n // Get attachments\r\n var files = element.querySelectorAll('.jfile');\r\n\r\n if (files.length > 0) {\r\n // Read all files\r\n for (var i = 0; i < files.length; i++) {\r\n var file = {};\r\n if (files[i].classList.contains('jremove')) {\r\n files[i].remove();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set list of files and properties for upload\r\n */\r\n obj.set = function() {\r\n // Reset references\r\n D = [];\r\n // Reset container\r\n obj.data = [];\r\n\r\n // Get attachments\r\n var files = element.querySelectorAll('.jfile');\r\n\r\n if (files.length > 0) {\r\n // Read all files\r\n for (var i = 0; i < files.length; i++) {\r\n if (Array.isArray(files[i].content)) {\r\n if (files[i].content.length) {\r\n for (var j = 0; j < files[i].content.length; j++) {\r\n // File name\r\n if (! files[i].content[j].content) {\r\n files[i].content[j].content = files[i].content[j].file;\r\n if (files[i].src && files[i].src.length < 255) {\r\n files[i].content[j].file = files[i].src;\r\n } else {\r\n files[i].content[j].file = jSuites.guid();\r\n }\r\n }\r\n // Push file\r\n obj.data.push(files[i].content[j]);\r\n }\r\n }\r\n } else {\r\n if (files[i].content) {\r\n if (files[i].classList.contains('jremove')) {\r\n files[i].content.file.remove = 1;\r\n }\r\n\r\n // File name\r\n if (! files[i].content.content) {\r\n files[i].content.content = files[i].content.file;\r\n if (files[i].src && files[i].src.length < 255) {\r\n files[i].content.file = files[i].src;\r\n } else {\r\n files[i].content.file = jSuites.guid();\r\n }\r\n }\r\n // Push file\r\n obj.data.push(files[i].content);\r\n }\r\n }\r\n\r\n // DOM reference\r\n D.push(files[i]);\r\n }\r\n\r\n return obj.data;\r\n }\r\n }\r\n\r\n obj.set();\r\n\r\n return obj;\r\n});\r\n\r\n\r\n\r\njSuites.form = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n url: null,\r\n message: 'Are you sure? There are unsaved information in your form',\r\n ignore: false,\r\n currentHash: null,\r\n submitButton:null,\r\n validations: null,\r\n onbeforeload: null,\r\n onload: null,\r\n onbeforesave: null,\r\n onsave: null,\r\n onbeforeremove: null,\r\n onremove: null,\r\n onerror: function(el, message) {\r\n jSuites.alert(message);\r\n }\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Validations\r\n if (! obj.options.validations) {\r\n obj.options.validations = {};\r\n }\r\n\r\n // Submit Button\r\n if (! obj.options.submitButton) {\r\n obj.options.submitButton = el.querySelector('input[type=submit]');\r\n }\r\n\r\n if (obj.options.submitButton && obj.options.url) {\r\n obj.options.submitButton.onclick = function() {\r\n obj.save();\r\n }\r\n }\r\n\r\n if (! obj.options.validations.email) {\r\n obj.options.validations.email = jSuites.validations.email;\r\n }\r\n\r\n if (! obj.options.validations.length) {\r\n obj.options.validations.length = jSuites.validations.length;\r\n }\r\n\r\n if (! obj.options.validations.required) {\r\n obj.options.validations.required = jSuites.validations.required;\r\n }\r\n\r\n obj.setUrl = function(url) {\r\n obj.options.url = url;\r\n }\r\n\r\n obj.load = function() {\r\n jSuites.ajax({\r\n url: obj.options.url,\r\n method: 'GET',\r\n dataType: 'json',\r\n queue: true,\r\n success: function(data) {\r\n // Overwrite values from the backend\r\n if (typeof(obj.options.onbeforeload) == 'function') {\r\n var ret = obj.options.onbeforeload(el, data);\r\n if (ret) {\r\n data = ret;\r\n }\r\n }\r\n // Apply values to the form\r\n jSuites.form.setElements(el, data);\r\n // Onload methods\r\n if (typeof(obj.options.onload) == 'function') {\r\n obj.options.onload(el, data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n obj.save = function() {\r\n var test = obj.validate();\r\n\r\n if (test) {\r\n obj.options.onerror(el, test);\r\n } else {\r\n var data = jSuites.form.getElements(el, true);\r\n\r\n if (typeof(obj.options.onbeforesave) == 'function') {\r\n var data = obj.options.onbeforesave(el, data);\r\n\r\n if (data === false) {\r\n console.log('Onbeforesave returned false');\r\n return; \r\n }\r\n }\r\n\r\n jSuites.ajax({\r\n url: obj.options.url,\r\n method: 'POST',\r\n dataType: 'json',\r\n data: data,\r\n success: function(result) {\r\n if (typeof(obj.options.onsave) == 'function') {\r\n obj.options.onsave(el, data, result);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n obj.remove = function() {\r\n if (typeof(obj.options.onbeforeremove) == 'function') {\r\n var ret = obj.options.onbeforeremove(el, obj);\r\n if (ret === false) {\r\n return false;\r\n }\r\n }\r\n\r\n jSuites.ajax({\r\n url: obj.options.url,\r\n method: 'DELETE',\r\n dataType: 'json',\r\n success: function(result) {\r\n if (typeof(obj.options.onremove) == 'function') {\r\n obj.options.onremove(el, obj, result);\r\n }\r\n\r\n obj.reset();\r\n }\r\n });\r\n }\r\n\r\n var addError = function(element) {\r\n // Add error in the element\r\n element.classList.add('error');\r\n // Submit button\r\n if (obj.options.submitButton) {\r\n obj.options.submitButton.setAttribute('disabled', true);\r\n }\r\n // Return error message\r\n var error = element.getAttribute('data-error') || 'There is an error in the form';\r\n element.setAttribute('title', error);\r\n return error;\r\n }\r\n\r\n var delError = function(element) {\r\n var error = false;\r\n // Remove class from this element\r\n element.classList.remove('error');\r\n element.removeAttribute('title');\r\n // Get elements in the form\r\n var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n // Run all elements \r\n for (var i = 0; i < elements.length; i++) {\r\n if (elements[i].getAttribute('data-validation')) {\r\n if (elements[i].classList.contains('error')) {\r\n error = true;\r\n }\r\n }\r\n }\r\n\r\n if (obj.options.submitButton) {\r\n if (error) {\r\n obj.options.submitButton.setAttribute('disabled', true);\r\n } else {\r\n obj.options.submitButton.removeAttribute('disabled');\r\n }\r\n }\r\n }\r\n\r\n obj.validateElement = function(element) {\r\n // Test results\r\n var test = false;\r\n // Value\r\n var value = jSuites.form.getValue(element);\r\n // Validation\r\n var validation = element.getAttribute('data-validation');\r\n // Parse\r\n if (typeof(obj.options.validations[validation]) == 'function' && ! obj.options.validations[validation](value, element)) {\r\n // Not passed in the test\r\n test = addError(element);\r\n } else {\r\n if (element.classList.contains('error')) {\r\n delError(element);\r\n }\r\n }\r\n\r\n return test;\r\n }\r\n\r\n obj.reset = function() {\r\n // Get elements in the form\r\n var name = null;\r\n var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n // Run all elements \r\n for (var i = 0; i < elements.length; i++) {\r\n if (name = elements[i].getAttribute('name')) {\r\n if (elements[i].type == 'checkbox' || elements[i].type == 'radio') {\r\n elements[i].checked = false;\r\n } else {\r\n if (typeof(elements[i].val) == 'function') {\r\n elements[i].val('');\r\n } else {\r\n elements[i].value = '';\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Run form validation\r\n obj.validate = function() {\r\n var test = [];\r\n // Get elements in the form\r\n var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n // Run all elements \r\n for (var i = 0; i < elements.length; i++) {\r\n // Required\r\n if (elements[i].getAttribute('data-validation')) {\r\n var res = obj.validateElement(elements[i]);\r\n if (res) {\r\n test.push(res);\r\n }\r\n }\r\n }\r\n if (test.length > 0) {\r\n return test.join('
');\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n // Check the form\r\n obj.getError = function() {\r\n // Validation\r\n return obj.validation() ? true : false;\r\n }\r\n\r\n // Return the form hash\r\n obj.setHash = function() {\r\n return obj.getHash(jSuites.form.getElements(el));\r\n }\r\n\r\n // Get the form hash\r\n obj.getHash = function(str) {\r\n var hash = 0, i, chr;\r\n\r\n if (str.length === 0) {\r\n return hash;\r\n } else {\r\n for (i = 0; i < str.length; i++) {\r\n chr = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + chr;\r\n hash |= 0;\r\n }\r\n }\r\n\r\n return hash;\r\n }\r\n\r\n // Is there any change in the form since start tracking?\r\n obj.isChanged = function() {\r\n var hash = obj.setHash();\r\n return (obj.options.currentHash != hash);\r\n }\r\n\r\n // Restart tracking\r\n obj.resetTracker = function() {\r\n obj.options.currentHash = obj.setHash();\r\n obj.options.ignore = false;\r\n }\r\n\r\n // Ignore flag\r\n obj.setIgnore = function(ignoreFlag) {\r\n obj.options.ignore = ignoreFlag ? true : false;\r\n }\r\n\r\n // Start tracking in one second\r\n setTimeout(function() {\r\n obj.options.currentHash = obj.setHash();\r\n }, 1000);\r\n\r\n // Validations\r\n el.addEventListener(\"keyup\", function(e) {\r\n if (e.target.getAttribute('data-validation')) {\r\n obj.validateElement(e.target);\r\n }\r\n });\r\n\r\n // Alert\r\n if (! jSuites.form.hasEvents) {\r\n window.addEventListener(\"beforeunload\", function (e) {\r\n if (obj.isChanged() && obj.options.ignore == false) {\r\n var confirmationMessage = obj.options.message? obj.options.message : \"\\o/\";\r\n\r\n if (confirmationMessage) {\r\n if (typeof e == 'undefined') {\r\n e = window.event;\r\n }\r\n\r\n if (e) {\r\n e.returnValue = confirmationMessage;\r\n }\r\n\r\n return confirmationMessage;\r\n } else {\r\n return void(0);\r\n }\r\n }\r\n });\r\n\r\n jSuites.form.hasEvents = true;\r\n }\r\n\r\n el.form = obj;\r\n\r\n return obj;\r\n});\r\n\r\n// Get value from one element\r\njSuites.form.getValue = function(element) {\r\n var value = null;\r\n if (element.type == 'checkbox') {\r\n if (element.checked == true) {\r\n value = element.value || true;\r\n }\r\n } else if (element.type == 'radio') {\r\n if (element.checked == true) {\r\n value = element.value;\r\n }\r\n } else if (element.tagName == 'select' && element.multiple == true) {\r\n value = [];\r\n var options = element.querySelectorAll(\"options[selected]\");\r\n for (var j = 0; j < options.length; j++) {\r\n value.push(options[j].value);\r\n }\r\n } else if (typeof(element.val) == 'function') {\r\n value = element.val();\r\n } else {\r\n value = element.value || '';\r\n }\r\n\r\n return value;\r\n}\r\n\r\n// Get form elements\r\njSuites.form.getElements = function(el, asArray) {\r\n var data = {};\r\n var name = null;\r\n var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n if (name = elements[i].getAttribute('name')) {\r\n data[name] = jSuites.form.getValue(elements[i]) || '';\r\n }\r\n }\r\n\r\n // Get files\r\n var tmp = null;\r\n var files = jSuites.files(el);\r\n if (tmp = files.get()) {\r\n if (tmp.length) {\r\n data.files = tmp;\r\n }\r\n }\r\n\r\n return asArray == true ? data : JSON.stringify(data);\r\n}\r\n\r\n//Get form elements\r\njSuites.form.setElements = function(el, data) {\r\n var name = null;\r\n var value = null;\r\n var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n for (var i = 0; i < elements.length; i++) {\r\n // Attributes\r\n var type = elements[i].getAttribute('type');\r\n if (name = elements[i].getAttribute('name')) {\r\n // Transform variable names in pathname\r\n name = name.replace(new RegExp(/\\[(.*?)\\]/ig), '.$1');\r\n value = null;\r\n // Seach for the data in the path\r\n if (name.match(/\\./)) {\r\n var tmp = jSuites.path.call(data, name) || '';\r\n if (typeof(tmp) !== 'undefined') {\r\n value = tmp;\r\n }\r\n } else {\r\n if (typeof(data[name]) !== 'undefined') {\r\n value = data[name];\r\n }\r\n }\r\n // Set the values\r\n if (value !== null) {\r\n if (type == 'checkbox' || type == 'radio') {\r\n elements[i].checked = value ? true : false;\r\n } else {\r\n if (typeof (elements[i].val) == 'function') {\r\n elements[i].val(value);\r\n } else {\r\n elements[i].value = value;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Legacy\r\njSuites.tracker = jSuites.form;\r\n\r\njSuites.focus = function(el) {\r\n if (el.innerText.length) {\r\n var range = document.createRange();\r\n var sel = window.getSelection();\r\n var node = el.childNodes[el.childNodes.length-1];\r\n range.setStart(node, node.length)\r\n range.collapse(true)\r\n sel.removeAllRanges()\r\n sel.addRange(range)\r\n el.scrollLeft = el.scrollWidth;\r\n }\r\n}\r\n\r\njSuites.isNumeric = (function (num) {\r\n return !isNaN(num) && num !== null && num !== '';\r\n});\r\n\r\njSuites.guid = function() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n}\r\n\r\njSuites.getNode = function() {\r\n var node = document.getSelection().anchorNode;\r\n if (node) {\r\n return (node.nodeType == 3 ? node.parentNode : node);\r\n } else {\r\n return null;\r\n }\r\n}\r\n/**\r\n * Generate hash from a string\r\n */\r\njSuites.hash = function(str) {\r\n var hash = 0, i, chr;\r\n\r\n if (str.length === 0) {\r\n return hash;\r\n } else {\r\n for (i = 0; i < str.length; i++) {\r\n chr = str.charCodeAt(i);\r\n if (chr > 32) {\r\n hash = ((hash << 5) - hash) + chr;\r\n hash |= 0;\r\n }\r\n }\r\n }\r\n return hash;\r\n}\r\n\r\n/**\r\n * Generate a random color\r\n */\r\njSuites.randomColor = function(h) {\r\n var lum = -0.25;\r\n var hex = String('#' + Math.random().toString(16).slice(2, 8).toUpperCase()).replace(/[^0-9a-f]/gi, '');\r\n if (hex.length < 6) {\r\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\r\n }\r\n var rgb = [], c, i;\r\n for (i = 0; i < 3; i++) {\r\n c = parseInt(hex.substr(i * 2, 2), 16);\r\n c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);\r\n rgb.push((\"00\" + c).substr(c.length));\r\n }\r\n\r\n // Return hex\r\n if (h == true) {\r\n return '#' + jSuites.two(rgb[0].toString(16)) + jSuites.two(rgb[1].toString(16)) + jSuites.two(rgb[2].toString(16));\r\n }\r\n\r\n return rgb;\r\n}\r\n\r\njSuites.getWindowWidth = function() {\r\n var w = window,\r\n d = document,\r\n e = d.documentElement,\r\n g = d.getElementsByTagName('body')[0],\r\n x = w.innerWidth || e.clientWidth || g.clientWidth;\r\n return x;\r\n}\r\n\r\njSuites.getWindowHeight = function() {\r\n var w = window,\r\n d = document,\r\n e = d.documentElement,\r\n g = d.getElementsByTagName('body')[0],\r\n y = w.innerHeight|| e.clientHeight|| g.clientHeight;\r\n return y;\r\n}\r\n\r\njSuites.getPosition = function(e) {\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].pageX;\r\n var y = e.changedTouches[0].pageY;\r\n } else {\r\n var x = (window.Event) ? e.pageX : e.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);\r\n var y = (window.Event) ? e.pageY : e.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);\r\n }\r\n\r\n return [ x, y ];\r\n}\r\n\r\njSuites.click = function(el) {\r\n if (el.click) {\r\n el.click();\r\n } else {\r\n var evt = new MouseEvent('click', {\r\n bubbles: true,\r\n cancelable: true,\r\n view: window\r\n });\r\n el.dispatchEvent(evt);\r\n }\r\n}\r\n\r\njSuites.findElement = function(element, condition) {\r\n var foundElement = false;\r\n\r\n function path (element) {\r\n if (element && ! foundElement) {\r\n if (typeof(condition) == 'function') {\r\n foundElement = condition(element)\r\n } else if (typeof(condition) == 'string') {\r\n if (element.classList && element.classList.contains(condition)) {\r\n foundElement = element;\r\n }\r\n }\r\n }\r\n\r\n if (element.parentNode && ! foundElement) {\r\n path(element.parentNode);\r\n }\r\n }\r\n\r\n path(element);\r\n\r\n return foundElement;\r\n}\r\n\r\n// Two digits\r\njSuites.two = function(value) {\r\n value = '' + value;\r\n if (value.length == 1) {\r\n value = '0' + value;\r\n }\r\n return value;\r\n}\r\n\r\njSuites.sha512 = (function(str) {\r\n function int64(msint_32, lsint_32) {\r\n this.highOrder = msint_32;\r\n this.lowOrder = lsint_32;\r\n }\r\n\r\n var H = [new int64(0x6a09e667, 0xf3bcc908), new int64(0xbb67ae85, 0x84caa73b),\r\n new int64(0x3c6ef372, 0xfe94f82b), new int64(0xa54ff53a, 0x5f1d36f1),\r\n new int64(0x510e527f, 0xade682d1), new int64(0x9b05688c, 0x2b3e6c1f),\r\n new int64(0x1f83d9ab, 0xfb41bd6b), new int64(0x5be0cd19, 0x137e2179)];\r\n\r\n var K = [new int64(0x428a2f98, 0xd728ae22), new int64(0x71374491, 0x23ef65cd),\r\n new int64(0xb5c0fbcf, 0xec4d3b2f), new int64(0xe9b5dba5, 0x8189dbbc),\r\n new int64(0x3956c25b, 0xf348b538), new int64(0x59f111f1, 0xb605d019),\r\n new int64(0x923f82a4, 0xaf194f9b), new int64(0xab1c5ed5, 0xda6d8118),\r\n new int64(0xd807aa98, 0xa3030242), new int64(0x12835b01, 0x45706fbe),\r\n new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, 0xd5ffb4e2),\r\n new int64(0x72be5d74, 0xf27b896f), new int64(0x80deb1fe, 0x3b1696b1),\r\n new int64(0x9bdc06a7, 0x25c71235), new int64(0xc19bf174, 0xcf692694),\r\n new int64(0xe49b69c1, 0x9ef14ad2), new int64(0xefbe4786, 0x384f25e3),\r\n new int64(0x0fc19dc6, 0x8b8cd5b5), new int64(0x240ca1cc, 0x77ac9c65),\r\n new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),\r\n new int64(0x5cb0a9dc, 0xbd41fbd4), new int64(0x76f988da, 0x831153b5),\r\n new int64(0x983e5152, 0xee66dfab), new int64(0xa831c66d, 0x2db43210),\r\n new int64(0xb00327c8, 0x98fb213f), new int64(0xbf597fc7, 0xbeef0ee4),\r\n new int64(0xc6e00bf3, 0x3da88fc2), new int64(0xd5a79147, 0x930aa725),\r\n new int64(0x06ca6351, 0xe003826f), new int64(0x14292967, 0x0a0e6e70),\r\n new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),\r\n new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, 0x9d95b3df),\r\n new int64(0x650a7354, 0x8baf63de), new int64(0x766a0abb, 0x3c77b2a8),\r\n new int64(0x81c2c92e, 0x47edaee6), new int64(0x92722c85, 0x1482353b),\r\n new int64(0xa2bfe8a1, 0x4cf10364), new int64(0xa81a664b, 0xbc423001),\r\n new int64(0xc24b8b70, 0xd0f89791), new int64(0xc76c51a3, 0x0654be30),\r\n new int64(0xd192e819, 0xd6ef5218), new int64(0xd6990624, 0x5565a910),\r\n new int64(0xf40e3585, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),\r\n new int64(0x19a4c116, 0xb8d2d0c8), new int64(0x1e376c08, 0x5141ab53),\r\n new int64(0x2748774c, 0xdf8eeb99), new int64(0x34b0bcb5, 0xe19b48a8),\r\n new int64(0x391c0cb3, 0xc5c95a63), new int64(0x4ed8aa4a, 0xe3418acb),\r\n new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, 0xd6b2b8a3),\r\n new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),\r\n new int64(0x84c87814, 0xa1f0ab72), new int64(0x8cc70208, 0x1a6439ec),\r\n new int64(0x90befffa, 0x23631e28), new int64(0xa4506ceb, 0xde82bde9),\r\n new int64(0xbef9a3f7, 0xb2c67915), new int64(0xc67178f2, 0xe372532b),\r\n new int64(0xca273ece, 0xea26619c), new int64(0xd186b8c7, 0x21c0c207),\r\n new int64(0xeada7dd6, 0xcde0eb1e), new int64(0xf57d4f7f, 0xee6ed178),\r\n new int64(0x06f067aa, 0x72176fba), new int64(0x0a637dc5, 0xa2c898a6),\r\n new int64(0x113f9804, 0xbef90dae), new int64(0x1b710b35, 0x131c471b),\r\n new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),\r\n new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, 0x9c100d4c),\r\n new int64(0x4cc5d4be, 0xcb3e42b6), new int64(0x597f299c, 0xfc657e2a),\r\n new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)];\r\n\r\n var W = new Array(64);\r\n var a, b, c, d, e, f, g, h, i, j;\r\n var T1, T2;\r\n var charsize = 8;\r\n\r\n function utf8_encode(str) {\r\n return unescape(encodeURIComponent(str));\r\n }\r\n\r\n function str2binb(str) {\r\n var bin = [];\r\n var mask = (1 << charsize) - 1;\r\n var len = str.length * charsize;\r\n \r\n for (var i = 0; i < len; i += charsize) {\r\n bin[i >> 5] |= (str.charCodeAt(i / charsize) & mask) << (32 - charsize - (i % 32));\r\n }\r\n \r\n return bin;\r\n }\r\n\r\n function binb2hex(binarray) {\r\n var hex_tab = \"0123456789abcdef\";\r\n var str = \"\";\r\n var length = binarray.length * 4;\r\n var srcByte;\r\n\r\n for (var i = 0; i < length; i += 1) {\r\n srcByte = binarray[i >> 2] >> ((3 - (i % 4)) * 8);\r\n str += hex_tab.charAt((srcByte >> 4) & 0xF) + hex_tab.charAt(srcByte & 0xF);\r\n }\r\n\r\n return str;\r\n }\r\n\r\n function safe_add_2(x, y) {\r\n var lsw, msw, lowOrder, highOrder;\r\n\r\n lsw = (x.lowOrder & 0xFFFF) + (y.lowOrder & 0xFFFF);\r\n msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16);\r\n lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n lsw = (x.highOrder & 0xFFFF) + (y.highOrder & 0xFFFF) + (msw >>> 16);\r\n msw = (x.highOrder >>> 16) + (y.highOrder >>> 16) + (lsw >>> 16);\r\n highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n return new int64(highOrder, lowOrder);\r\n }\r\n\r\n function safe_add_4(a, b, c, d) {\r\n var lsw, msw, lowOrder, highOrder;\r\n\r\n lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF);\r\n msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16);\r\n lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (msw >>> 16);\r\n msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (lsw >>> 16);\r\n highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n return new int64(highOrder, lowOrder);\r\n }\r\n\r\n function safe_add_5(a, b, c, d, e) {\r\n var lsw, msw, lowOrder, highOrder;\r\n\r\n lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF) + (e.lowOrder & 0xFFFF);\r\n msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (e.lowOrder >>> 16) + (lsw >>> 16);\r\n lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (e.highOrder & 0xFFFF) + (msw >>> 16);\r\n msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (e.highOrder >>> 16) + (lsw >>> 16);\r\n highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n return new int64(highOrder, lowOrder);\r\n }\r\n\r\n function maj(x, y, z) {\r\n return new int64(\r\n (x.highOrder & y.highOrder) ^ (x.highOrder & z.highOrder) ^ (y.highOrder & z.highOrder),\r\n (x.lowOrder & y.lowOrder) ^ (x.lowOrder & z.lowOrder) ^ (y.lowOrder & z.lowOrder)\r\n );\r\n }\r\n\r\n function ch(x, y, z) {\r\n return new int64(\r\n (x.highOrder & y.highOrder) ^ (~x.highOrder & z.highOrder),\r\n (x.lowOrder & y.lowOrder) ^ (~x.lowOrder & z.lowOrder)\r\n );\r\n }\r\n\r\n function rotr(x, n) {\r\n if (n <= 32) {\r\n return new int64(\r\n (x.highOrder >>> n) | (x.lowOrder << (32 - n)),\r\n (x.lowOrder >>> n) | (x.highOrder << (32 - n))\r\n );\r\n } else {\r\n return new int64(\r\n (x.lowOrder >>> n) | (x.highOrder << (32 - n)),\r\n (x.highOrder >>> n) | (x.lowOrder << (32 - n))\r\n );\r\n }\r\n }\r\n\r\n function sigma0(x) {\r\n var rotr28 = rotr(x, 28);\r\n var rotr34 = rotr(x, 34);\r\n var rotr39 = rotr(x, 39);\r\n\r\n return new int64(\r\n rotr28.highOrder ^ rotr34.highOrder ^ rotr39.highOrder,\r\n rotr28.lowOrder ^ rotr34.lowOrder ^ rotr39.lowOrder\r\n );\r\n }\r\n\r\n function sigma1(x) {\r\n var rotr14 = rotr(x, 14);\r\n var rotr18 = rotr(x, 18);\r\n var rotr41 = rotr(x, 41);\r\n\r\n return new int64(\r\n rotr14.highOrder ^ rotr18.highOrder ^ rotr41.highOrder,\r\n rotr14.lowOrder ^ rotr18.lowOrder ^ rotr41.lowOrder\r\n );\r\n }\r\n\r\n function gamma0(x) {\r\n var rotr1 = rotr(x, 1), rotr8 = rotr(x, 8), shr7 = shr(x, 7);\r\n\r\n return new int64(\r\n rotr1.highOrder ^ rotr8.highOrder ^ shr7.highOrder,\r\n rotr1.lowOrder ^ rotr8.lowOrder ^ shr7.lowOrder\r\n );\r\n }\r\n\r\n function gamma1(x) {\r\n var rotr19 = rotr(x, 19);\r\n var rotr61 = rotr(x, 61);\r\n var shr6 = shr(x, 6);\r\n\r\n return new int64(\r\n rotr19.highOrder ^ rotr61.highOrder ^ shr6.highOrder,\r\n rotr19.lowOrder ^ rotr61.lowOrder ^ shr6.lowOrder\r\n );\r\n }\r\n\r\n function shr(x, n) {\r\n if (n <= 32) {\r\n return new int64(\r\n x.highOrder >>> n,\r\n x.lowOrder >>> n | (x.highOrder << (32 - n))\r\n );\r\n } else {\r\n return new int64(\r\n 0,\r\n x.highOrder << (32 - n)\r\n );\r\n }\r\n }\r\n\r\n var str = utf8_encode(str);\r\n var strlen = str.length*charsize;\r\n str = str2binb(str);\r\n\r\n str[strlen >> 5] |= 0x80 << (24 - strlen % 32);\r\n str[(((strlen + 128) >> 10) << 5) + 31] = strlen;\r\n\r\n for (var i = 0; i < str.length; i += 32) {\r\n a = H[0];\r\n b = H[1];\r\n c = H[2];\r\n d = H[3];\r\n e = H[4];\r\n f = H[5];\r\n g = H[6];\r\n h = H[7];\r\n\r\n for (var j = 0; j < 80; j++) {\r\n if (j < 16) {\r\n W[j] = new int64(str[j*2 + i], str[j*2 + i + 1]);\r\n } else {\r\n W[j] = safe_add_4(gamma1(W[j - 2]), W[j - 7], gamma0(W[j - 15]), W[j - 16]);\r\n }\r\n\r\n T1 = safe_add_5(h, sigma1(e), ch(e, f, g), K[j], W[j]);\r\n T2 = safe_add_2(sigma0(a), maj(a, b, c));\r\n h = g;\r\n g = f;\r\n f = e;\r\n e = safe_add_2(d, T1);\r\n d = c;\r\n c = b;\r\n b = a;\r\n a = safe_add_2(T1, T2);\r\n }\r\n\r\n H[0] = safe_add_2(a, H[0]);\r\n H[1] = safe_add_2(b, H[1]);\r\n H[2] = safe_add_2(c, H[2]);\r\n H[3] = safe_add_2(d, H[3]);\r\n H[4] = safe_add_2(e, H[4]);\r\n H[5] = safe_add_2(f, H[5]);\r\n H[6] = safe_add_2(g, H[6]);\r\n H[7] = safe_add_2(h, H[7]);\r\n }\r\n\r\n var binarray = [];\r\n for (var i = 0; i < H.length; i++) {\r\n binarray.push(H[i].highOrder);\r\n binarray.push(H[i].lowOrder);\r\n }\r\n\r\n return binb2hex(binarray);\r\n});\r\n\r\nif (! jSuites.login) {\r\n jSuites.login = {};\r\n jSuites.login.sha512 = jSuites.sha512;\r\n}\r\n\r\njSuites.image = jSuites.upload = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n type: 'image',\r\n extension: '*',\r\n input: false,\r\n minWidth: false,\r\n maxWidth: null,\r\n maxHeight: null,\r\n maxJpegSizeBytes: null, // For example, 350Kb would be 350000\r\n onchange: null,\r\n multiple: false,\r\n remoteParser: null,\r\n text:{\r\n extensionNotAllowed:'The extension is not allowed',\r\n }\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Multiple\r\n if (obj.options.multiple == true) {\r\n el.setAttribute('data-multiple', true);\r\n }\r\n\r\n // Container\r\n el.content = [];\r\n\r\n // Upload icon\r\n el.classList.add('jupload');\r\n\r\n if (obj.options.input == true) {\r\n el.classList.add('input');\r\n }\r\n\r\n obj.add = function(data) {\r\n // Reset container for single files\r\n if (obj.options.multiple == false) {\r\n el.content = [];\r\n el.innerText = '';\r\n }\r\n\r\n // Append to the element\r\n if (obj.options.type == 'image') {\r\n var img = document.createElement('img');\r\n img.setAttribute('src', data.file);\r\n img.setAttribute('tabindex', -1);\r\n if (! el.getAttribute('name')) {\r\n img.className = 'jfile';\r\n img.content = data;\r\n }\r\n el.appendChild(img);\r\n } else {\r\n if (data.name) {\r\n var name = data.name;\r\n } else {\r\n var name = data.file;\r\n }\r\n var div = document.createElement('div');\r\n div.innerText = name || obj.options.type;\r\n div.classList.add('jupload-item');\r\n div.setAttribute('tabindex', -1);\r\n el.appendChild(div);\r\n }\r\n\r\n if (data.content) {\r\n data.file = jSuites.guid();\r\n }\r\n\r\n // Push content\r\n el.content.push(data);\r\n\r\n // Onchange\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, data);\r\n }\r\n }\r\n\r\n obj.addFromFile = function(file) {\r\n var type = file.type.split('/');\r\n if (type[0] == obj.options.type) {\r\n var readFile = new FileReader();\r\n readFile.addEventListener(\"load\", function (v) {\r\n var data = {\r\n file: v.srcElement.result,\r\n extension: file.name.substr(file.name.lastIndexOf('.') + 1),\r\n name: file.name,\r\n size: file.size,\r\n lastmodified: file.lastModified,\r\n content: v.srcElement.result,\r\n }\r\n\r\n obj.add(data);\r\n });\r\n\r\n readFile.readAsDataURL(file);\r\n } else {\r\n alert(obj.options.text.extensionNotAllowed);\r\n }\r\n }\r\n\r\n obj.addFromUrl = function(src) {\r\n if (src.substr(0,4) != 'data' && ! obj.options.remoteParser) {\r\n console.error('remoteParser not defined in your initialization');\r\n } else {\r\n // This is to process cross domain images\r\n if (src.substr(0,4) == 'data') {\r\n var extension = src.split(';')\r\n extension = extension[0].split('/');\r\n var type = extension[0].replace('data:','');\r\n if (type == obj.options.type) {\r\n var data = {\r\n file: src,\r\n name: '',\r\n extension: extension[1],\r\n content: src,\r\n }\r\n obj.add(data);\r\n } else {\r\n alert(obj.options.text.extensionNotAllowed);\r\n }\r\n } else {\r\n var extension = src.substr(src.lastIndexOf('.') + 1);\r\n // Work for cross browsers\r\n src = obj.options.remoteParser + src;\r\n // Get remove content\r\n jSuites.ajax({\r\n url: src,\r\n type: 'GET',\r\n dataType: 'blob',\r\n success: function(data) {\r\n //add(extension[0].replace('data:',''), data);\r\n }\r\n })\r\n }\r\n }\r\n }\r\n\r\n var getDataURL = function(canvas, type) {\r\n var compression = 0.92;\r\n var lastContentLength = null;\r\n var content = canvas.toDataURL(type, compression);\r\n while (obj.options.maxJpegSizeBytes && type === 'image/jpeg' &&\r\n content.length > obj.options.maxJpegSizeBytes && content.length !== lastContentLength) {\r\n // Apply the compression\r\n compression *= 0.9;\r\n lastContentLength = content.length;\r\n content = canvas.toDataURL(type, compression);\r\n }\r\n return content;\r\n }\r\n\r\n var mime = obj.options.type + '/' + obj.options.extension;\r\n var input = document.createElement('input');\r\n input.type = 'file';\r\n input.setAttribute('accept', mime);\r\n input.onchange = function() {\r\n for (var i = 0; i < this.files.length; i++) {\r\n obj.addFromFile(this.files[i]);\r\n }\r\n }\r\n\r\n // Allow multiple files\r\n if (obj.options.multiple == true) {\r\n input.setAttribute('multiple', true);\r\n }\r\n\r\n var current = null;\r\n\r\n el.addEventListener(\"click\", function(e) {\r\n current = null;\r\n if (! el.children.length || e.target === el) {\r\n jSuites.click(input);\r\n } else {\r\n if (e.target.parentNode == el) {\r\n current = e.target;\r\n }\r\n }\r\n });\r\n\r\n el.addEventListener(\"dblclick\", function(e) {\r\n jSuites.click(input);\r\n });\r\n\r\n el.addEventListener('dragenter', function(e) {\r\n el.style.border = '1px dashed #000';\r\n });\r\n\r\n el.addEventListener('dragleave', function(e) {\r\n el.style.border = '1px solid #eee';\r\n });\r\n\r\n el.addEventListener('dragstop', function(e) {\r\n el.style.border = '1px solid #eee';\r\n });\r\n\r\n el.addEventListener('dragover', function(e) {\r\n e.preventDefault();\r\n });\r\n\r\n el.addEventListener('keydown', function(e) {\r\n if (current && e.which == 46) {\r\n var index = Array.prototype.indexOf.call(el.children, current);\r\n if (index >= 0) {\r\n el.content.splice(index, 1);\r\n current.remove();\r\n current = null;\r\n }\r\n }\r\n });\r\n\r\n el.addEventListener('drop', function(e) {\r\n e.preventDefault(); \r\n e.stopPropagation();\r\n\r\n var html = (e.originalEvent || e).dataTransfer.getData('text/html');\r\n var file = (e.originalEvent || e).dataTransfer.files;\r\n\r\n if (file.length) {\r\n for (var i = 0; i < e.dataTransfer.files.length; i++) {\r\n obj.addFromFile(e.dataTransfer.files[i]);\r\n }\r\n } else if (html) {\r\n if (obj.options.multiple == false) {\r\n el.innerText = '';\r\n }\r\n\r\n // Create temp element\r\n var div = document.createElement('div');\r\n div.innerHTML = html;\r\n\r\n // Extract images\r\n var img = div.querySelectorAll('img');\r\n\r\n if (img.length) {\r\n for (var i = 0; i < img.length; i++) {\r\n obj.addFromUrl(img[i].src);\r\n }\r\n }\r\n }\r\n\r\n el.style.border = '1px solid #eee';\r\n\r\n return false;\r\n });\r\n\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return el.content && el.content.length ? el.content : null;\r\n } else {\r\n // Reset\r\n el.innerText = '';\r\n el.content = [];\r\n\r\n if (val) {\r\n if (Array.isArray(val)) {\r\n for (var i = 0; i < val.length; i++) {\r\n if (typeof(val[i]) == 'string') {\r\n obj.add({ file: val[i] });\r\n } else {\r\n obj.add(val[i]);\r\n }\r\n }\r\n } else if (typeof(val) == 'string') {\r\n obj.add({ file: val });\r\n }\r\n }\r\n }\r\n }\r\n\r\n el.upload = el.image = obj;\r\n\r\n return obj;\r\n});\r\n\r\njSuites.image.create = function(data) {\r\n var img = document.createElement('img');\r\n img.setAttribute('src', data.file);\r\n img.className = 'jfile';\r\n img.setAttribute('tabindex', -1);\r\n img.content = data;\r\n\r\n return img;\r\n}\r\n\r\n\r\njSuites.lazyLoading = (function(el, options) {\r\n var obj = {}\r\n\r\n // Mandatory options\r\n if (! options.loadUp || typeof(options.loadUp) != 'function') {\r\n options.loadUp = function() {\r\n return false;\r\n }\r\n }\r\n if (! options.loadDown || typeof(options.loadDown) != 'function') {\r\n options.loadDown = function() {\r\n return false;\r\n }\r\n }\r\n // Timer ms\r\n if (! options.timer) {\r\n options.timer = 100;\r\n }\r\n\r\n // Timer\r\n var timeControlLoading = null;\r\n\r\n // Controls\r\n var scrollControls = function(e) {\r\n if (timeControlLoading == null) {\r\n var scrollTop = el.scrollTop;\r\n if (el.scrollTop + (el.clientHeight * 2) >= el.scrollHeight) {\r\n if (options.loadDown()) {\r\n if (scrollTop == el.scrollTop) {\r\n el.scrollTop = el.scrollTop - (el.clientHeight);\r\n }\r\n }\r\n } else if (el.scrollTop <= el.clientHeight) {\r\n if (options.loadUp()) {\r\n if (scrollTop == el.scrollTop) {\r\n el.scrollTop = el.scrollTop + (el.clientHeight);\r\n }\r\n }\r\n }\r\n\r\n timeControlLoading = setTimeout(function() {\r\n timeControlLoading = null;\r\n }, options.timer);\r\n }\r\n }\r\n\r\n // Onscroll\r\n el.onscroll = function(e) {\r\n scrollControls(e);\r\n }\r\n\r\n el.onwheel = function(e) {\r\n scrollControls(e);\r\n }\r\n\r\n return obj;\r\n});\r\n\r\njSuites.loading = (function() {\r\n var obj = {};\r\n\r\n var loading = null;\r\n\r\n obj.show = function() {\r\n if (! loading) {\r\n loading = document.createElement('div');\r\n loading.className = 'jloading';\r\n }\r\n document.body.appendChild(loading);\r\n }\r\n\r\n obj.hide = function() {\r\n if (loading && loading.parentNode) {\r\n document.body.removeChild(loading);\r\n }\r\n }\r\n\r\n return obj;\r\n})();\r\n\r\njSuites.mask = (function() {\r\n var obj = {};\r\n var index = 0;\r\n var values = []\r\n var pieces = [];\r\n\r\n /**\r\n * Apply a mask over a value considering a custom decimal representation. Default: '.'\r\n */\r\n obj.run = function(value, mask, decimal) {\r\n if (value.toString().length && mask.toString().length) {\r\n // Default decimal separator\r\n if (typeof(decimal) == 'undefined') {\r\n decimal = '.';\r\n }\r\n\r\n if (jSuites.isNumeric(value)) {\r\n if (typeof(value) == 'number') {\r\n var number = (''+value).split('.');\r\n } else {\r\n var number = (''+value).split(decimal);\r\n }\r\n var value = number[0];\r\n var valueDecimal = number[1];\r\n } else {\r\n value = '' + value;\r\n }\r\n\r\n // Helpers\r\n index = 0;\r\n values = [];\r\n // Create mask token\r\n obj.prepare(mask);\r\n // Current value\r\n var currentValue = value;\r\n if (currentValue) {\r\n // Checking current value\r\n for (var i = 0; i < currentValue.length; i++) {\r\n if (currentValue[i] != null) {\r\n obj.process(currentValue[i]);\r\n }\r\n }\r\n }\r\n if (valueDecimal) {\r\n obj.process(decimal);\r\n var currentValue = valueDecimal;\r\n if (currentValue) {\r\n // Checking current value\r\n for (var i = 0; i < currentValue.length; i++) {\r\n if (currentValue[i] != null) {\r\n obj.process(currentValue[i]);\r\n }\r\n }\r\n }\r\n }\r\n // Formatted value\r\n return values.join('');\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Process new string by keydown or paste\r\n */\r\n var execute = function(str) {\r\n index = 0;\r\n values = [];\r\n // Create mask token\r\n obj.prepare(this.getAttribute('data-mask'));\r\n // Current value\r\n var currentValue = '';\r\n // Process selection\r\n if (this.tagName == 'DIV') {\r\n if (this.innerText) {\r\n var s = window.getSelection();\r\n if (s && s.anchorOffset != s.focusOffset) {\r\n var offset = s.anchorOffset > s.focusOffset ? s.focusOffset : s.anchorOffset;\r\n var currentValue = this.innerText.substring(0, offset);\r\n } else {\r\n var currentValue = this.innerText;\r\n }\r\n }\r\n } else {\r\n if (this.selectionStart < this.selectionEnd) {\r\n var currentValue = this.value.substring(0, this.selectionStart); \r\n } else {\r\n var currentValue = this.value;\r\n }\r\n }\r\n\r\n // New string to the input\r\n currentValue += str;\r\n\r\n // Checking current value\r\n for (var i = 0; i < currentValue.length; i++) {\r\n if (currentValue[i] != null) {\r\n obj.process(currentValue[i]);\r\n }\r\n }\r\n\r\n // New value \r\n var value = values.join('');\r\n\r\n // Update value to the element\r\n if (this.tagName == 'DIV') {\r\n if (value != this.innerText) {\r\n this.innerText = value;\r\n // Set focus\r\n jSuites.focus(this);\r\n }\r\n } else {\r\n this.value = value;\r\n }\r\n\r\n // Completed attribute\r\n if (pieces.length == values.length && pieces[pieces.length-1].length == values[values.length-1].length) {\r\n this.setAttribute('data-completed', 'true');\r\n } else {\r\n this.setAttribute('data-completed', 'false');\r\n }\r\n }\r\n\r\n obj.apply = function(e) {\r\n if (e.target && ! e.target.getAttribute('readonly')) {\r\n var mask = e.target.getAttribute('data-mask');\r\n if (mask && e.key && e.key.length < 2 && ! e.ctrlKey) {\r\n // Prevent default\r\n e.preventDefault();\r\n // Process new char\r\n execute.call(e.target, e.key);\r\n }\r\n }\r\n }\r\n\r\n obj.paste = function(e) {\r\n if (e.target && ! e.target.getAttribute('readonly')) {\r\n // Only apply paste to jsuites mask elements\r\n var mask = e.target.getAttribute('data-mask');\r\n if (mask) {\r\n // Get the pasted text\r\n if (e.clipboardData || e.originalEvent.clipboardData) {\r\n var text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n } else if (window.clipboardData) {\r\n var text = window.clipboardData.getData('Text');\r\n }\r\n // Process the new text\r\n if (text) {\r\n // Prevent default\r\n e.preventDefault();\r\n // Process new information\r\n execute.call(e.target, text);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Process inputs and save to values\r\n */\r\n obj.process = function(input) {\r\n do {\r\n if (pieces[index] == 'mm') {\r\n if (values[index] == null || values[index] == '') {\r\n if (parseInt(input) > 1 && parseInt(input) < 10) {\r\n values[index] = '0' + input;\r\n index++;\r\n return true;\r\n } else if (parseInt(input) < 10) {\r\n values[index] = input;\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (values[index] == 1 && values[index] < 2 && parseInt(input) < 3) {\r\n values[index] += input;\r\n index++;\r\n return true;\r\n } else if (values[index] == 0 && values[index] < 10) {\r\n values[index] += input;\r\n index++;\r\n return true;\r\n } else {\r\n return false\r\n }\r\n }\r\n } else if (pieces[index] == 'dd') {\r\n if (values[index] == null || values[index] == '') {\r\n if (parseInt(input) > 3 && parseInt(input) < 10) {\r\n values[index] = '0' + input;\r\n index++;\r\n return true;\r\n } else if (parseInt(input) < 10) {\r\n values[index] = input;\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (values[index] == 3 && parseInt(input) < 2) {\r\n values[index] += input;\r\n index++;\r\n return true;\r\n } else if (values[index] < 3 && parseInt(input) < 10) {\r\n values[index] += input;\r\n index++;\r\n return true;\r\n } else {\r\n return false\r\n }\r\n }\r\n } else if (pieces[index] == 'hh24') {\r\n if (values[index] == null || values[index] == '') {\r\n if (parseInt(input) > 2 && parseInt(input) < 10) {\r\n values[index] = '0' + input;\r\n index++;\r\n return true;\r\n } else if (parseInt(input) < 10) {\r\n values[index] = input;\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (values[index] == 2 && parseInt(input) < 4) {\r\n values[index] += input;\r\n index++;\r\n return true;\r\n } else if (values[index] < 2 && parseInt(input) < 10) {\r\n values[index] += input;\r\n index++;\r\n return true;\r\n } else {\r\n return false\r\n }\r\n }\r\n } else if (pieces[index] == 'hh') {\r\n if (values[index] == null || values[index] == '') {\r\n if (parseInt(input) > 1 && parseInt(input) < 10) {\r\n values[index] = '0' + input;\r\n index++;\r\n return true;\r\n } else if (parseInt(input) < 10) {\r\n values[index] = input;\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (values[index] == 1 && parseInt(input) < 3) {\r\n values[index] += input;\r\n index++;\r\n return true;\r\n } else if (values[index] < 1 && parseInt(input) < 10) {\r\n values[index] += input;\r\n index++;\r\n return true;\r\n } else {\r\n return false\r\n }\r\n }\r\n } else if (pieces[index] == 'mi' || pieces[index] == 'ss') {\r\n if (values[index] == null || values[index] == '') {\r\n if (parseInt(input) > 5 && parseInt(input) < 10) {\r\n values[index] = '0' + input;\r\n index++;\r\n return true;\r\n } else if (parseInt(input) < 10) {\r\n values[index] = input;\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (parseInt(input) < 10) {\r\n values[index] += input;\r\n index++;\r\n return true;\r\n } else {\r\n return false\r\n }\r\n }\r\n } else if (pieces[index] == 'yy' || pieces[index] == 'yyyy') {\r\n if (parseInt(input) < 10) {\r\n if (values[index] == null || values[index] == '') {\r\n values[index] = input;\r\n } else {\r\n values[index] += input;\r\n }\r\n \r\n if (values[index].length == pieces[index].length) {\r\n index++;\r\n }\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else if (pieces[index] == '#' || pieces[index] == '#.##' || pieces[index] == '#,##' || pieces[index] == '# ##' || pieces[index] == \"#'##\") {\r\n if (input.match(/[0-9]/g)) {\r\n if (pieces[index] == '#.##') {\r\n var separator = '.';\r\n } else if (pieces[index] == '#,##') {\r\n var separator = ',';\r\n } else if (pieces[index] == '# ##') {\r\n var separator = ' ';\r\n } else if (pieces[index] == \"#'##\") {\r\n var separator = \"'\";\r\n } else {\r\n var separator = '';\r\n }\r\n if (values[index] == null || values[index] == '') {\r\n values[index] = input;\r\n } else {\r\n values[index] += input;\r\n if (separator) {\r\n values[index] = values[index].match(/[0-9]/g).join('');\r\n var t = [];\r\n var s = 0;\r\n for (var j = values[index].length - 1; j >= 0 ; j--) {\r\n t.push(values[index][j]);\r\n s++;\r\n if (! (s % 3)) {\r\n t.push(separator);\r\n }\r\n }\r\n t = t.reverse();\r\n values[index] = t.join('');\r\n if (values[index].substr(0,1) == separator) {\r\n values[index] = values[index].substr(1);\r\n } \r\n }\r\n }\r\n return true;\r\n } else {\r\n if (pieces[index] == '#.##' && input == '.') {\r\n // Do nothing\r\n } else if (pieces[index] == '#,##' && input == ',') {\r\n // Do nothing\r\n } else if (pieces[index] == '# ##' && input == ' ') {\r\n // Do nothing\r\n } else if (pieces[index] == \"#'##\" && input == \"'\") {\r\n // Do nothing\r\n } else {\r\n if (values[index]) {\r\n index++;\r\n if (pieces[index]) {\r\n if (pieces[index] == input) {\r\n values[index] = input;\r\n return true;\r\n } else {\r\n if (pieces[index] == '0' && pieces[index+1] == input) {\r\n index++;\r\n values[index] = input;\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n } else if (pieces[index] == '0') {\r\n if (input.match(/[0-9]/g)) {\r\n values[index] = input;\r\n index++;\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else if (pieces[index] == 'a') {\r\n if (input.match(/[a-zA-Z]/g)) {\r\n values[index] = input;\r\n index++;\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (pieces[index] != null) {\r\n if (pieces[index] == '\\\\a') {\r\n var v = 'a';\r\n } else if (pieces[index] == '\\\\0') {\r\n var v = '0';\r\n } else if (pieces[index] == '[-]') {\r\n if (input == '-' || input == '+') {\r\n var v = input;\r\n } else {\r\n var v = ' ';\r\n }\r\n } else {\r\n var v = pieces[index];\r\n }\r\n values[index] = v;\r\n if (input == v) {\r\n index++;\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n index++;\r\n } while (pieces[index]);\r\n }\r\n\r\n /**\r\n * Create tokens for the mask\r\n */\r\n obj.prepare = function(mask) {\r\n pieces = [];\r\n for (var i = 0; i < mask.length; i++) {\r\n if (mask[i].match(/[0-9]|[a-z]|\\\\/g)) {\r\n if (mask[i] == 'y' && mask[i+1] == 'y' && mask[i+2] == 'y' && mask[i+3] == 'y') {\r\n pieces.push('yyyy');\r\n i += 3;\r\n } else if (mask[i] == 'y' && mask[i+1] == 'y') {\r\n pieces.push('yy');\r\n i++;\r\n } else if (mask[i] == 'm' && mask[i+1] == 'm' && mask[i+2] == 'm' && mask[i+3] == 'm') {\r\n pieces.push('mmmm');\r\n i += 3;\r\n } else if (mask[i] == 'm' && mask[i+1] == 'm' && mask[i+2] == 'm') {\r\n pieces.push('mmm');\r\n i += 2;\r\n } else if (mask[i] == 'm' && mask[i+1] == 'm') {\r\n pieces.push('mm');\r\n i++;\r\n } else if (mask[i] == 'd' && mask[i+1] == 'd') {\r\n pieces.push('dd');\r\n i++;\r\n } else if (mask[i] == 'h' && mask[i+1] == 'h' && mask[i+2] == '2' && mask[i+3] == '4') {\r\n pieces.push('hh24');\r\n i += 3;\r\n } else if (mask[i] == 'h' && mask[i+1] == 'h') {\r\n pieces.push('hh');\r\n i++;\r\n } else if (mask[i] == 'm' && mask[i+1] == 'i') {\r\n pieces.push('mi');\r\n i++;\r\n } else if (mask[i] == 's' && mask[i+1] == 's') {\r\n pieces.push('ss');\r\n i++;\r\n } else if (mask[i] == 'a' && mask[i+1] == 'm') {\r\n pieces.push('am');\r\n i++;\r\n } else if (mask[i] == 'p' && mask[i+1] == 'm') {\r\n pieces.push('pm');\r\n i++;\r\n } else if (mask[i] == '\\\\' && mask[i+1] == '0') {\r\n pieces.push('\\\\0');\r\n i++;\r\n } else if (mask[i] == '\\\\' && mask[i+1] == 'a') {\r\n pieces.push('\\\\a');\r\n i++;\r\n } else {\r\n pieces.push(mask[i]);\r\n }\r\n } else {\r\n if (mask[i] == '#' && mask[i+1] == '.' && mask[i+2] == '#' && mask[i+3] == '#') {\r\n pieces.push('#.##');\r\n i += 3;\r\n } else if (mask[i] == '#' && mask[i+1] == ',' && mask[i+2] == '#' && mask[i+3] == '#') {\r\n pieces.push('#,##');\r\n i += 3;\r\n } else if (mask[i] == '#' && mask[i+1] == ' ' && mask[i+2] == '#' && mask[i+3] == '#') {\r\n pieces.push('# ##');\r\n i += 3;\r\n } else if (mask[i] == '#' && mask[i+1] == \"'\" && mask[i+2] == '#' && mask[i+3] == '#') {\r\n pieces.push(\"#'##\");\r\n i += 3;\r\n } else if (mask[i] == '[' && mask[i+1] == '-' && mask[i+2] == ']') {\r\n pieces.push('[-]');\r\n i += 2;\r\n } else {\r\n pieces.push(mask[i]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (typeof document !== 'undefined') {\r\n document.addEventListener('paste', obj.paste);\r\n document.addEventListener('keydown', obj.apply);\r\n }\r\n\r\n return obj;\r\n})();\r\n\r\n\r\njSuites.modal = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n url: null,\r\n onopen: null,\r\n onclose: null,\r\n closed: false,\r\n width: null,\r\n height: null,\r\n title: null,\r\n padding: null,\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Title\r\n if (! obj.options.title && el.getAttribute('title')) {\r\n obj.options.title = el.getAttribute('title');\r\n }\r\n\r\n var temp = document.createElement('div');\r\n while (el.children[0]) {\r\n temp.appendChild(el.children[0]);\r\n }\r\n\r\n obj.content = document.createElement('div');\r\n obj.content.className = 'jmodal_content';\r\n obj.content.innerHTML = el.innerHTML;\r\n\r\n while (temp.children[0]) {\r\n obj.content.appendChild(temp.children[0]);\r\n }\r\n\r\n obj.container = document.createElement('div');\r\n obj.container.className = 'jmodal';\r\n obj.container.appendChild(obj.content);\r\n\r\n if (obj.options.padding) {\r\n obj.content.style.padding = obj.options.padding;\r\n }\r\n if (obj.options.width) {\r\n obj.container.style.width = obj.options.width;\r\n }\r\n if (obj.options.height) {\r\n obj.container.style.height = obj.options.height;\r\n }\r\n if (obj.options.title) {\r\n obj.container.setAttribute('title', obj.options.title);\r\n } else {\r\n obj.container.classList.add('no-title');\r\n }\r\n el.innerHTML = '';\r\n el.style.display = 'none';\r\n el.appendChild(obj.container);\r\n\r\n // Backdrop\r\n var backdrop = document.createElement('div');\r\n backdrop.className = 'jmodal_backdrop';\r\n backdrop.onclick = function() {\r\n obj.close();\r\n }\r\n el.appendChild(backdrop);\r\n\r\n obj.open = function() {\r\n el.style.display = 'block';\r\n // Fullscreen\r\n var rect = obj.container.getBoundingClientRect();\r\n if (jSuites.getWindowWidth() < rect.width) {\r\n obj.container.style.top = '';\r\n obj.container.style.left = '';\r\n obj.container.classList.add('jmodal_fullscreen');\r\n jSuites.animation.slideBottom(obj.container, 1);\r\n } else {\r\n backdrop.style.display = 'block';\r\n }\r\n // Current\r\n jSuites.modal.current = obj;\r\n // Event\r\n if (typeof(obj.options.onopen) == 'function') {\r\n obj.options.onopen(el, obj);\r\n }\r\n }\r\n\r\n obj.resetPosition = function() {\r\n obj.container.style.top = '';\r\n obj.container.style.left = '';\r\n }\r\n\r\n obj.isOpen = function() {\r\n return el.style.display != 'none' ? true : false;\r\n }\r\n\r\n obj.close = function() {\r\n el.style.display = 'none';\r\n // Backdrop\r\n backdrop.style.display = '';\r\n // Current\r\n jSuites.modal.current = null;\r\n // Remove fullscreen class\r\n obj.container.classList.remove('jmodal_fullscreen');\r\n // Event\r\n if (typeof(obj.options.onclose) == 'function') {\r\n obj.options.onclose(el, obj);\r\n }\r\n }\r\n\r\n if (! jSuites.modal.hasEvents) {\r\n jSuites.modal.current = obj;\r\n\r\n if ('ontouchstart' in document.documentElement === true) {\r\n document.addEventListener(\"touchstart\", jSuites.modal.mouseDownControls);\r\n } else {\r\n document.addEventListener('mousedown', jSuites.modal.mouseDownControls);\r\n document.addEventListener('mousemove', jSuites.modal.mouseMoveControls);\r\n document.addEventListener('mouseup', jSuites.modal.mouseUpControls);\r\n }\r\n\r\n document.addEventListener('keydown', jSuites.modal.keyDownControls);\r\n\r\n jSuites.modal.hasEvents = true;\r\n }\r\n\r\n if (obj.options.url) {\r\n jSuites.ajax({\r\n url: obj.options.url,\r\n method: 'GET',\r\n dataType: 'text/html',\r\n success: function(data) {\r\n obj.content.innerHTML = data;\r\n\r\n if (! obj.options.closed) {\r\n obj.open();\r\n }\r\n }\r\n });\r\n } else {\r\n if (! obj.options.closed) {\r\n obj.open();\r\n }\r\n }\r\n\r\n // Keep object available from the node\r\n el.modal = obj;\r\n\r\n return obj;\r\n});\r\n\r\njSuites.modal.current = null;\r\njSuites.modal.position = null;\r\n\r\njSuites.modal.keyDownControls = function(e) {\r\n if (e.which == 27) {\r\n if (jSuites.modal.current) {\r\n jSuites.modal.current.close();\r\n }\r\n }\r\n}\r\n\r\njSuites.modal.mouseUpControls = function(e) {\r\n if (jSuites.modal.current) {\r\n jSuites.modal.current.container.style.cursor = 'auto';\r\n }\r\n jSuites.modal.position = null;\r\n}\r\n\r\njSuites.modal.mouseMoveControls = function(e) {\r\n if (jSuites.modal.current && jSuites.modal.position) {\r\n if (e.which == 1 || e.which == 3) {\r\n var position = jSuites.modal.position;\r\n jSuites.modal.current.container.style.top = (position[1] + (e.clientY - position[3]) + (position[5] / 2)) + 'px';\r\n jSuites.modal.current.container.style.left = (position[0] + (e.clientX - position[2]) + (position[4] / 2)) + 'px';\r\n jSuites.modal.current.container.style.cursor = 'move';\r\n } else {\r\n jSuites.modal.current.container.style.cursor = 'auto';\r\n }\r\n }\r\n}\r\n\r\njSuites.modal.mouseDownControls = function(e) {\r\n jSuites.modal.position = [];\r\n\r\n if (e.target.classList.contains('jmodal')) {\r\n setTimeout(function() {\r\n // Get target info\r\n var rect = e.target.getBoundingClientRect();\r\n\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].clientX;\r\n var y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n\r\n if (rect.width - (x - rect.left) < 50 && (y - rect.top) < 50) {\r\n setTimeout(function() {\r\n jSuites.modal.current.close();\r\n }, 100);\r\n } else {\r\n if (e.target.getAttribute('title') && (y - rect.top) < 50) {\r\n if (document.selection) {\r\n document.selection.empty();\r\n } else if ( window.getSelection ) {\r\n window.getSelection().removeAllRanges();\r\n }\r\n\r\n jSuites.modal.position = [\r\n rect.left,\r\n rect.top,\r\n e.clientX,\r\n e.clientY,\r\n rect.width,\r\n rect.height,\r\n ];\r\n }\r\n }\r\n }, 100);\r\n }\r\n}\r\n\r\n\r\njSuites.notification = (function(options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n icon: null,\r\n name: 'Notification',\r\n date: null,\r\n error: null,\r\n title: null,\r\n message: null,\r\n timeout: 4000,\r\n autoHide: true,\r\n closeable: true,\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n var notification = document.createElement('div');\r\n notification.className = 'jnotification';\r\n\r\n if (obj.options.error) {\r\n notification.classList.add('jnotification-error');\r\n }\r\n\r\n var notificationContainer = document.createElement('div');\r\n notificationContainer.className = 'jnotification-container';\r\n notification.appendChild(notificationContainer);\r\n\r\n var notificationHeader = document.createElement('div');\r\n notificationHeader.className = 'jnotification-header';\r\n notificationContainer.appendChild(notificationHeader);\r\n\r\n var notificationImage = document.createElement('div');\r\n notificationImage.className = 'jnotification-image';\r\n notificationHeader.appendChild(notificationImage);\r\n\r\n if (obj.options.icon) {\r\n var notificationIcon = document.createElement('img');\r\n notificationIcon.src = obj.options.icon;\r\n notificationImage.appendChild(notificationIcon);\r\n }\r\n\r\n var notificationName = document.createElement('div');\r\n notificationName.className = 'jnotification-name';\r\n notificationName.innerHTML = obj.options.name;\r\n notificationHeader.appendChild(notificationName);\r\n\r\n if (obj.options.closeable == true) {\r\n var notificationClose = document.createElement('div');\r\n notificationClose.className = 'jnotification-close';\r\n notificationClose.onclick = function() {\r\n obj.hide();\r\n }\r\n notificationHeader.appendChild(notificationClose);\r\n }\r\n\r\n var notificationDate = document.createElement('div');\r\n notificationDate.className = 'jnotification-date';\r\n notificationHeader.appendChild(notificationDate);\r\n\r\n var notificationContent = document.createElement('div');\r\n notificationContent.className = 'jnotification-content';\r\n notificationContainer.appendChild(notificationContent);\r\n\r\n if (obj.options.title) {\r\n var notificationTitle = document.createElement('div');\r\n notificationTitle.className = 'jnotification-title';\r\n notificationTitle.innerHTML = obj.options.title;\r\n notificationContent.appendChild(notificationTitle);\r\n }\r\n\r\n var notificationMessage = document.createElement('div');\r\n notificationMessage.className = 'jnotification-message';\r\n notificationMessage.innerHTML = obj.options.message;\r\n notificationContent.appendChild(notificationMessage);\r\n\r\n obj.show = function() {\r\n document.body.appendChild(notification);\r\n if (jSuites.getWindowWidth() > 800) { \r\n jSuites.animation.fadeIn(notification);\r\n } else {\r\n jSuites.animation.slideTop(notification, 1);\r\n }\r\n }\r\n\r\n obj.hide = function() {\r\n if (jSuites.getWindowWidth() > 800) { \r\n jSuites.animation.fadeOut(notification, function() {\r\n if (notification.parentNode) {\r\n notification.parentNode.removeChild(notification);\r\n if (notificationTimeout) {\r\n clearTimeout(notificationTimeout);\r\n }\r\n }\r\n });\r\n } else {\r\n jSuites.animation.slideTop(notification, 0, function() {\r\n if (notification.parentNode) {\r\n notification.parentNode.removeChild(notification);\r\n if (notificationTimeout) {\r\n clearTimeout(notificationTimeout);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n obj.show();\r\n\r\n if (obj.options.autoHide == true) {\r\n var notificationTimeout = setTimeout(function() {\r\n obj.hide();\r\n }, obj.options.timeout);\r\n }\r\n\r\n if (jSuites.getWindowWidth() < 800) {\r\n notification.addEventListener(\"swipeup\", function(e) {\r\n obj.hide();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n }\r\n\r\n return obj;\r\n});\r\n\r\njSuites.notification.isVisible = function() {\r\n var j = document.querySelector('.jnotification');\r\n return j && j.parentNode ? true : false;\r\n}\r\n\r\n// More palettes https://coolors.co/ or https://gka.github.io/palettes/#/10|s|003790,005647,ffffe0|ffffe0,ff005e,93003a|1|1\r\n\r\njSuites.palette = function(o) {\r\n // Material\r\n var palette = {};\r\n\r\n palette.material = [\r\n [ \"#ffebee\", \"#fce4ec\", \"#f3e5f5\", \"#e8eaf6\", \"#e3f2fd\", \"#e0f7fa\", \"#e0f2f1\", \"#e8f5e9\", \"#f1f8e9\", \"#f9fbe7\", \"#fffde7\", \"#fff8e1\", \"#fff3e0\", \"#fbe9e7\", \"#efebe9\", \"#fafafa\", \"#eceff1\" ],\r\n [ \"#ffcdd2\", \"#f8bbd0\", \"#e1bee7\", \"#c5cae9\", \"#bbdefb\", \"#b2ebf2\", \"#b2dfdb\", \"#c8e6c9\", \"#dcedc8\", \"#f0f4c3\", \"#fff9c4\", \"#ffecb3\", \"#ffe0b2\", \"#ffccbc\", \"#d7ccc8\", \"#f5f5f5\", \"#cfd8dc\" ],\r\n [ \"#ef9a9a\", \"#f48fb1\", \"#ce93d8\", \"#9fa8da\", \"#90caf9\", \"#80deea\", \"#80cbc4\", \"#a5d6a7\", \"#c5e1a5\", \"#e6ee9c\", \"#fff59d\", \"#ffe082\", \"#ffcc80\", \"#ffab91\", \"#bcaaa4\", \"#eeeeee\", \"#b0bec5\" ],\r\n [ \"#e57373\", \"#f06292\", \"#ba68c8\", \"#7986cb\", \"#64b5f6\", \"#4dd0e1\", \"#4db6ac\", \"#81c784\", \"#aed581\", \"#dce775\", \"#fff176\", \"#ffd54f\", \"#ffb74d\", \"#ff8a65\", \"#a1887f\", \"#e0e0e0\", \"#90a4ae\" ],\r\n [ \"#ef5350\", \"#ec407a\", \"#ab47bc\", \"#5c6bc0\", \"#42a5f5\", \"#26c6da\", \"#26a69a\", \"#66bb6a\", \"#9ccc65\", \"#d4e157\", \"#ffee58\", \"#ffca28\", \"#ffa726\", \"#ff7043\", \"#8d6e63\", \"#bdbdbd\", \"#78909c\" ],\r\n [ \"#f44336\", \"#e91e63\", \"#9c27b0\", \"#3f51b5\", \"#2196f3\", \"#00bcd4\", \"#009688\", \"#4caf50\", \"#8bc34a\", \"#cddc39\", \"#ffeb3b\", \"#ffc107\", \"#ff9800\", \"#ff5722\", \"#795548\", \"#9e9e9e\", \"#607d8b\" ],\r\n [ \"#e53935\", \"#d81b60\", \"#8e24aa\", \"#3949ab\", \"#1e88e5\", \"#00acc1\", \"#00897b\", \"#43a047\", \"#7cb342\", \"#c0ca33\", \"#fdd835\", \"#ffb300\", \"#fb8c00\", \"#f4511e\", \"#6d4c41\", \"#757575\", \"#546e7a\" ],\r\n [ \"#d32f2f\", \"#c2185b\", \"#7b1fa2\", \"#303f9f\", \"#1976d2\", \"#0097a7\", \"#00796b\", \"#388e3c\", \"#689f38\", \"#afb42b\", \"#fbc02d\", \"#ffa000\", \"#f57c00\", \"#e64a19\", \"#5d4037\", \"#616161\", \"#455a64\" ],\r\n [ \"#c62828\", \"#ad1457\", \"#6a1b9a\", \"#283593\", \"#1565c0\", \"#00838f\", \"#00695c\", \"#2e7d32\", \"#558b2f\", \"#9e9d24\", \"#f9a825\", \"#ff8f00\", \"#ef6c00\", \"#d84315\", \"#4e342e\", \"#424242\", \"#37474f\" ],\r\n [ \"#b71c1c\", \"#880e4f\", \"#4a148c\", \"#1a237e\", \"#0d47a1\", \"#006064\", \"#004d40\", \"#1b5e20\", \"#33691e\", \"#827717\", \"#f57f17\", \"#ff6f00\", \"#e65100\", \"#bf360c\", \"#3e2723\", \"#212121\", \"#263238\" ],\r\n ];\r\n\r\n palette.fire = [\r\n [\"0b1a6d\",\"840f38\",\"b60718\",\"de030b\",\"ff0c0c\",\"fd491c\",\"fc7521\",\"faa331\",\"fbb535\",\"ffc73a\"],\r\n [\"071147\",\"5f0b28\",\"930513\",\"be0309\",\"ef0000\",\"fa3403\",\"fb670b\",\"f9991b\",\"faad1e\",\"ffc123\"],\r\n [\"03071e\",\"370617\",\"6a040f\",\"9d0208\",\"d00000\",\"dc2f02\",\"e85d04\",\"f48c06\",\"faa307\",\"ffba08\"],\r\n [\"020619\",\"320615\",\"61040d\",\"8c0207\",\"bc0000\",\"c82a02\",\"d05203\",\"db7f06\",\"e19405\",\"efab00\"],\r\n [\"020515\",\"2d0513\",\"58040c\",\"7f0206\",\"aa0000\",\"b62602\",\"b94903\",\"c57205\",\"ca8504\",\"d89b00\"],\r\n ]\r\n\r\n palette.baby = [\r\n [\"eddcd2\",\"fff1e6\",\"fde2e4\",\"fad2e1\",\"c5dedd\",\"dbe7e4\",\"f0efeb\",\"d6e2e9\",\"bcd4e6\",\"99c1de\"],\r\n [\"e1c4b3\",\"ffd5b5\",\"fab6ba\",\"f5a8c4\",\"aacecd\",\"bfd5cf\",\"dbd9d0\",\"baceda\",\"9dc0db\",\"7eb1d5\"],\r\n [\"daa990\",\"ffb787\",\"f88e95\",\"f282a9\",\"8fc4c3\",\"a3c8be\",\"cec9b3\",\"9dbcce\",\"82acd2\",\"649dcb\"],\r\n [\"d69070\",\"ff9c5e\",\"f66770\",\"f05f8f\",\"74bbb9\",\"87bfae\",\"c5b993\",\"83aac3\",\"699bca\",\"4d89c2\"],\r\n [\"c97d5d\",\"f58443\",\"eb4d57\",\"e54a7b\",\"66a9a7\",\"78ae9c\",\"b5a67e\",\"7599b1\",\"5c88b7\",\"4978aa\"],\r\n ]\r\n\r\n if (palette[o]) {\r\n return palette[o];\r\n } else {\r\n return palette.material;\r\n }\r\n}\r\n\r\njSuites.picker = (function(el, options) {\r\n // Already created, update options\r\n if (el.picker) {\r\n return el.picker.setOptions(options, true);\r\n }\r\n\r\n // New instance\r\n var obj = { type: 'picker' };\r\n obj.options = {};\r\n\r\n var dropdownHeader = null;\r\n var dropdownContent = null;\r\n\r\n /**\r\n * Create the content options\r\n */\r\n var createContent = function() {\r\n dropdownContent.innerHTML = '';\r\n\r\n // Create items\r\n var keys = Object.keys(obj.options.data);\r\n\r\n // Go though all options\r\n for (var i = 0; i < keys.length; i++) {\r\n // Item\r\n var dropdownItem = document.createElement('div');\r\n dropdownItem.k = keys[i];\r\n dropdownItem.v = obj.options.data[keys[i]];\r\n // Label\r\n dropdownItem.innerHTML = obj.getLabel(keys[i]);\r\n\r\n // Onchange\r\n dropdownItem.onclick = function() {\r\n // Update label\r\n obj.setValue(this.k);\r\n\r\n // Call method\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange.call(obj, el, obj, 'reserved', this.v, this.k);\r\n }\r\n }\r\n\r\n // Append\r\n dropdownContent.appendChild(dropdownItem);\r\n }\r\n }\r\n\r\n /**\r\n * Set or reset the options for the picker\r\n */\r\n obj.setOptions = function(options, reset) {\r\n // Default configuration\r\n var defaults = {\r\n value: 0,\r\n data: null,\r\n render: null,\r\n onchange: null,\r\n onselect: null,\r\n onopen: null,\r\n onclose: null,\r\n onload: null,\r\n width: null,\r\n header: true,\r\n right: false,\r\n content: false,\r\n columns: null,\r\n height: null,\r\n }\r\n\r\n // Legacy purpose only\r\n if (options && options.options) {\r\n options.data = options.options;\r\n }\r\n\r\n // Loop through the initial configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Start using the options\r\n if (obj.options.header === false) {\r\n dropdownHeader.style.display = 'none';\r\n } else {\r\n dropdownHeader.style.display = '';\r\n }\r\n\r\n // Width\r\n if (obj.options.width) {\r\n dropdownHeader.style.width = parseInt(obj.options.width) + 'px';\r\n } else {\r\n dropdownHeader.style.width = '';\r\n }\r\n\r\n // Height\r\n if (obj.options.height) {\r\n dropdownContent.style.maxHeight = obj.options.height + 'px';\r\n dropdownContent.style.overflow = 'scroll';\r\n } else {\r\n dropdownContent.style.overflow = '';\r\n }\r\n\r\n if (obj.options.columns > 0) {\r\n dropdownContent.classList.add('jpicker-columns');\r\n dropdownContent.style.width = obj.options.width ? obj.options.width : 36 * obj.options.columns + 'px';\r\n }\r\n\r\n if (isNaN(obj.options.value)) {\r\n obj.options.value = '0';\r\n }\r\n\r\n // Create list from data\r\n createContent();\r\n\r\n // Set value\r\n obj.setValue(obj.options.value);\r\n\r\n // Set options all returns the own instance\r\n return obj;\r\n }\r\n\r\n obj.getValue = function() {\r\n return obj.options.value;\r\n }\r\n\r\n obj.setValue = function(v) {\r\n // Set label\r\n obj.setLabel(v);\r\n\r\n // Update value\r\n obj.options.value = String(v);\r\n\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof(el.onchange) == 'function') {\r\n el.onchange({\r\n type: 'change',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n\r\n if (dropdownContent.children[v].getAttribute('type') !== 'generic') {\r\n obj.close();\r\n }\r\n }\r\n\r\n obj.getLabel = function(v) {\r\n var label = obj.options.data[v] || null;\r\n if (typeof(obj.options.render) == 'function') {\r\n label = obj.options.render(label);\r\n }\r\n return label;\r\n }\r\n\r\n obj.setLabel = function(v) {\r\n if (obj.options.content) {\r\n var label = '' + obj.options.content + '';\r\n } else {\r\n var label = obj.getLabel(v);\r\n }\r\n\r\n dropdownHeader.innerHTML = label;\r\n }\r\n\r\n obj.open = function() {\r\n if (! el.classList.contains('jpicker-focus')) {\r\n // Start tracking the element\r\n jSuites.tracking(obj, true);\r\n\r\n // Open picker\r\n el.classList.add('jpicker-focus');\r\n el.focus();\r\n\r\n var rectHeader = dropdownHeader.getBoundingClientRect();\r\n var rectContent = dropdownContent.getBoundingClientRect();\r\n if (window.innerHeight < rectHeader.bottom + rectContent.height) {\r\n dropdownContent.style.marginTop = -1 * (rectContent.height + 4) + 'px';\r\n } else {\r\n dropdownContent.style.marginTop = rectHeader.height + 2 + 'px';\r\n }\r\n\r\n if (obj.options.right === true) {\r\n dropdownContent.style.marginLeft = -1 * rectContent.width + 24 + 'px';\r\n }\r\n\r\n if (typeof obj.options.onopen == 'function') {\r\n obj.options.onopen(el, obj);\r\n }\r\n }\r\n }\r\n\r\n obj.close = function() {\r\n if (el.classList.contains('jpicker-focus')) {\r\n el.classList.remove('jpicker-focus');\r\n\r\n // Start tracking the element\r\n jSuites.tracking(obj, false);\r\n\r\n if (typeof obj.options.onclose == 'function') {\r\n obj.options.onclose(el, obj);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create floating picker\r\n */\r\n var init = function() {\r\n // Class\r\n el.classList.add('jpicker');\r\n el.setAttribute('tabindex', '900');\r\n\r\n // Dropdown Header\r\n dropdownHeader = document.createElement('div');\r\n dropdownHeader.classList.add('jpicker-header');\r\n dropdownHeader.onmouseup = function(e) {\r\n if (! el.classList.contains('jpicker-focus')) {\r\n obj.open();\r\n } else {\r\n obj.close();\r\n }\r\n }\r\n\r\n // Dropdown content\r\n dropdownContent = document.createElement('div');\r\n dropdownContent.classList.add('jpicker-content');\r\n\r\n // Append content and header\r\n el.appendChild(dropdownHeader);\r\n el.appendChild(dropdownContent);\r\n\r\n // Default value\r\n el.value = options.value || 0;\r\n\r\n // Set options\r\n obj.setOptions(options);\r\n\r\n if (typeof(obj.options.onload) == 'function') {\r\n obj.options.onload(el, obj);\r\n }\r\n\r\n // Change\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Reference\r\n el.picker = obj;\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n});\r\n\r\njSuites.progressbar = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n value: 0,\r\n onchange: null,\r\n width: null,\r\n };\r\n\r\n // Loop through the initial configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Class\r\n el.classList.add('jprogressbar');\r\n el.setAttribute('tabindex', 1);\r\n el.setAttribute('data-value', obj.options.value);\r\n\r\n var bar = document.createElement('div');\r\n bar.style.width = obj.options.value + '%';\r\n bar.style.color = '#fff';\r\n el.appendChild(bar);\r\n\r\n if (obj.options.width) {\r\n el.style.width = obj.options.width;\r\n }\r\n\r\n // Set value\r\n obj.setValue = function(value) {\r\n value = parseInt(value);\r\n obj.options.value = value;\r\n bar.style.width = value + '%';\r\n el.setAttribute('data-value', value + '%');\r\n\r\n if (value < 6) {\r\n el.style.color = '#000';\r\n } else {\r\n el.style.color = '#fff';\r\n }\r\n\r\n // Update value\r\n obj.options.value = value;\r\n\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, value);\r\n }\r\n\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof(el.onchange) == 'function') {\r\n el.onchange({\r\n type: 'change',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n obj.getValue = function() {\r\n return obj.options.value;\r\n }\r\n\r\n var action = function(e) {\r\n if (e.which) {\r\n // Get target info\r\n var rect = el.getBoundingClientRect();\r\n\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].clientX;\r\n var y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n\r\n obj.setValue(Math.round((x - rect.left) / rect.width * 100));\r\n }\r\n }\r\n\r\n // Events\r\n if ('touchstart' in document.documentElement === true) {\r\n el.addEventListener('touchstart', action);\r\n el.addEventListener('touchend', action);\r\n } else {\r\n el.addEventListener('mousedown', action);\r\n el.addEventListener(\"mousemove\", action);\r\n }\r\n\r\n // Change\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Reference\r\n el.progressbar = obj;\r\n\r\n return obj;\r\n});\r\n\r\njSuites.rating = (function(el, options) {\r\n // Already created, update options\r\n if (el.rating) {\r\n return el.rating.setOptions(options, true);\r\n }\r\n\r\n // New instance\r\n var obj = {};\r\n obj.options = {};\r\n\r\n obj.setOptions = function(options, reset) {\r\n // Default configuration\r\n var defaults = {\r\n number: 5,\r\n value: 0,\r\n tooltip: [ 'Very bad', 'Bad', 'Average', 'Good', 'Very good' ],\r\n onchange: null,\r\n };\r\n\r\n // Loop through the initial configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Make sure the container is empty\r\n el.innerHTML = '';\r\n\r\n // Add elements\r\n for (var i = 0; i < obj.options.number; i++) {\r\n var div = document.createElement('div');\r\n div.setAttribute('data-index', (i + 1))\r\n div.setAttribute('title', obj.options.tooltip[i])\r\n el.appendChild(div);\r\n }\r\n\r\n // Selected option\r\n if (obj.options.value) {\r\n for (var i = 0; i < obj.options.number; i++) {\r\n if (i < obj.options.value) {\r\n el.children[i].classList.add('jrating-selected');\r\n }\r\n }\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n // Set value\r\n obj.setValue = function(index) {\r\n for (var i = 0; i < obj.options.number; i++) {\r\n if (i < index) {\r\n el.children[i].classList.add('jrating-selected');\r\n } else {\r\n el.children[i].classList.remove('jrating-over');\r\n el.children[i].classList.remove('jrating-selected');\r\n }\r\n }\r\n\r\n obj.options.value = index;\r\n\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, index);\r\n }\r\n\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof(el.onchange) == 'function') {\r\n el.onchange({\r\n type: 'change',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n obj.getValue = function() {\r\n return obj.options.value;\r\n }\r\n\r\n var init = function() {\r\n // Start plugin\r\n obj.setOptions(options);\r\n\r\n // Class\r\n el.classList.add('jrating');\r\n\r\n // Events\r\n el.addEventListener(\"click\", function(e) {\r\n var index = e.target.getAttribute('data-index');\r\n if (index != undefined) {\r\n if (index == obj.options.value) {\r\n obj.setValue(0);\r\n } else {\r\n obj.setValue(index);\r\n }\r\n }\r\n });\r\n\r\n el.addEventListener(\"mouseover\", function(e) {\r\n var index = e.target.getAttribute('data-index');\r\n for (var i = 0; i < obj.options.number; i++) {\r\n if (i < index) {\r\n el.children[i].classList.add('jrating-over');\r\n } else {\r\n el.children[i].classList.remove('jrating-over');\r\n }\r\n }\r\n });\r\n\r\n el.addEventListener(\"mouseout\", function(e) {\r\n for (var i = 0; i < obj.options.number; i++) {\r\n el.children[i].classList.remove('jrating-over');\r\n }\r\n });\r\n\r\n // Change\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Reference\r\n el.rating = obj;\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n});\r\n\r\n\r\njSuites.search = (function(el, options) {\r\n if (el.search) {\r\n return el.search;\r\n }\r\n\r\n var index = null;\r\n\r\n var select = function(e) {\r\n if (e.target.classList.contains('jsearch_item')) {\r\n var element = e.target;\r\n } else {\r\n var element = e.target.parentNode;\r\n }\r\n\r\n obj.selectIndex(element);\r\n e.preventDefault();\r\n }\r\n\r\n var createList = function(data) {\r\n // Reset container\r\n container.innerHTML = '';\r\n // Print results\r\n if (! data.length) {\r\n // Show container\r\n el.style.display = '';\r\n } else {\r\n // Show container\r\n el.style.display = 'block';\r\n\r\n // Show items (only 10)\r\n var len = data.length < 11 ? data.length : 10;\r\n for (var i = 0; i < len; i++) {\r\n // Legacy\r\n var text = data[i].text;\r\n if (! text && data[i].name) {\r\n text = data[i].name;\r\n }\r\n var value = data[i].value;\r\n if (! value && data[i].id) {\r\n value = data[i].id;\r\n }\r\n\r\n var div = document.createElement('div');\r\n div.setAttribute('data-value', value);\r\n div.setAttribute('data-text', text);\r\n div.className = 'jsearch_item';\r\n\r\n if (data[i].id) {\r\n div.setAttribute('id', data[i].id)\r\n }\r\n\r\n if (i == 0) {\r\n div.classList.add('selected');\r\n }\r\n var img = document.createElement('img');\r\n if (data[i].image) {\r\n img.src = data[i].image;\r\n } else {\r\n img.style.display = 'none';\r\n }\r\n div.appendChild(img);\r\n\r\n var item = document.createElement('div');\r\n item.innerHTML = text;\r\n div.appendChild(item);\r\n\r\n // Append item to the container\r\n container.appendChild(div);\r\n }\r\n }\r\n }\r\n\r\n var execute = function(str) {\r\n if (str != obj.terms) {\r\n // New terms\r\n obj.terms = str;\r\n // New index\r\n index = 0;\r\n // Array or remote search\r\n if (Array.isArray(obj.options.data)) {\r\n var test = function(o) {\r\n for (var key in o) {\r\n var value = o[key];\r\n if ((''+value).toLowerCase().search(str) >= 0) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n var results = obj.options.data.filter(function(item) {\r\n return test(item);\r\n });\r\n\r\n // Show items\r\n createList(results);\r\n } else {\r\n // Get remove results\r\n jSuites.ajax({\r\n url: obj.options.data + str,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function(data) {\r\n // Show items\r\n createList(data);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Search timer\r\n var timer = null;\r\n\r\n // Search methods\r\n var obj = function(str) {\r\n if (timer) {\r\n clearTimeout(timer);\r\n }\r\n timer = setTimeout(function() {\r\n execute(str);\r\n }, 500)\r\n }\r\n\r\n obj.options = {\r\n data: options.data || null,\r\n input: options.input || null,\r\n onselect: options.onselect || null,\r\n };\r\n\r\n obj.selectIndex = function(item) {\r\n var id = item.getAttribute('id');\r\n var text = item.getAttribute('data-text');\r\n var value = item.getAttribute('data-value');\r\n // Onselect\r\n if (typeof(obj.options.onselect) == 'function') {\r\n obj.options.onselect(obj, text, value, id);\r\n }\r\n // Close container\r\n obj.close();\r\n }\r\n\r\n obj.open = function() {\r\n el.style.display = 'block';\r\n }\r\n\r\n obj.close = function() {\r\n if (timer) {\r\n clearTimeout(timer);\r\n }\r\n // Current terms\r\n obj.terms = '';\r\n // Remove results\r\n container.innerHTML = '';\r\n // Hide\r\n el.style.display = '';\r\n }\r\n\r\n obj.isOpened = function() {\r\n return el.style.display ? true : false;\r\n }\r\n\r\n obj.keydown = function(e) {\r\n if (obj.isOpened()) {\r\n if (e.key == 'Enter') {\r\n // Enter\r\n if (container.children[index]) {\r\n obj.selectIndex(container.children[index]);\r\n e.preventDefault();\r\n }\r\n } else if (e.key === 'ArrowUp') {\r\n // Up\r\n if (container.children[0]) {\r\n container.children[index].classList.remove('selected');\r\n if (index > 0) {\r\n index--;\r\n }\r\n container.children[index].classList.add('selected');\r\n }\r\n e.preventDefault();\r\n } else if (e.key === 'ArrowDown') {\r\n // Down\r\n container.children[index].classList.remove('selected');\r\n if (index < 9 && container.children[index+1]) {\r\n index++;\r\n }\r\n container.children[index].classList.add('selected');\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n obj.keyup = function(e) {\r\n if (obj.options.input) {\r\n obj(obj.options.input.value)\r\n } else {\r\n // Current node\r\n var node = jSuites.getNode();\r\n if (node) {\r\n obj(node.innerText);\r\n }\r\n }\r\n }\r\n\r\n // Append element\r\n var container = document.createElement('div');\r\n container.classList.add('jsearch_container');\r\n container.onmousedown = select;\r\n el.appendChild(container);\r\n\r\n el.classList.add('jsearch')\r\n el.search = obj;\r\n\r\n return obj;\r\n})\r\n\r\njSuites.slider = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n obj.currentImage = null;\r\n\r\n if (options) {\r\n obj.options = options;\r\n }\r\n\r\n // Items\r\n obj.options.items = [];\r\n\r\n if (! el.classList.contains('jslider')) {\r\n el.classList.add('jslider');\r\n\r\n // Create container\r\n var container = document.createElement('div');\r\n container.className = 'jslider-container';\r\n\r\n // Move children inside\r\n if (el.children.length > 0) {\r\n // Keep children items\r\n for (var i = 0; i < el.children.length; i++) {\r\n obj.options.items.push(el.children[i]);\r\n }\r\n }\r\n if (obj.options.items.length > 0) {\r\n for (var i = 0; i < obj.options.items.length; i++) {\r\n obj.options.items[i].classList.add('jfile');\r\n var index = obj.options.items[i].src.lastIndexOf('/');\r\n if (index < 0) {\r\n obj.options.items[i].setAttribute('data-name', obj.options.items[i].src);\r\n } else {\r\n obj.options.items[i].setAttribute('data-name', obj.options.items[i].src.substr(index + 1));\r\n }\r\n var index = obj.options.items[i].src.lastIndexOf('/');\r\n\r\n container.appendChild(obj.options.items[i]);\r\n }\r\n }\r\n el.appendChild(container);\r\n // Add close buttom\r\n var close = document.createElement('div');\r\n close.className = 'jslider-close';\r\n close.innerHTML = '';\r\n close.onclick = function() {\r\n obj.close();\r\n }\r\n el.appendChild(close);\r\n } else {\r\n var container = el.querySelector('slider-container');\r\n }\r\n\r\n obj.show = function(target) {\r\n if (! target) {\r\n var target = container.children[0];\r\n }\r\n\r\n if (! container.classList.contains('jslider-preview')) {\r\n container.classList.add('jslider-preview');\r\n close.style.display = 'block';\r\n }\r\n\r\n // Hide all images\r\n for (var i = 0; i < container.children.length; i++) {\r\n container.children[i].style.display = 'none';\r\n }\r\n\r\n // Show clicked only\r\n target.style.display = 'block';\r\n\r\n // Is there any previous\r\n if (target.previousSibling) {\r\n container.classList.add('jslider-left');\r\n } else {\r\n container.classList.remove('jslider-left');\r\n }\r\n\r\n // Is there any next\r\n if (target.nextSibling) {\r\n container.classList.add('jslider-right');\r\n } else {\r\n container.classList.remove('jslider-right');\r\n }\r\n\r\n obj.currentImage = target;\r\n }\r\n\r\n obj.open = function() {\r\n obj.show();\r\n\r\n // Event\r\n if (typeof(obj.options.onopen) == 'function') {\r\n obj.options.onopen(el);\r\n }\r\n }\r\n\r\n obj.close = function() {\r\n container.classList.remove('jslider-preview');\r\n container.classList.remove('jslider-left');\r\n container.classList.remove('jslider-right');\r\n\r\n for (var i = 0; i < container.children.length; i++) {\r\n container.children[i].style.display = '';\r\n }\r\n\r\n close.style.display = '';\r\n\r\n obj.currentImage = null;\r\n\r\n // Event\r\n if (typeof(obj.options.onclose) == 'function') {\r\n obj.options.onclose(el);\r\n }\r\n }\r\n\r\n obj.reset = function() {\r\n container.innerHTML = '';\r\n }\r\n\r\n obj.addFile = function(v, ignoreEvents) {\r\n var img = document.createElement('img');\r\n img.setAttribute('data-lastmodified', v.lastmodified);\r\n img.setAttribute('data-name', v.name);\r\n img.setAttribute('data-size', v.size);\r\n img.setAttribute('data-extension', v.extension);\r\n img.setAttribute('data-cover', v.cover);\r\n img.setAttribute('src', v.file);\r\n img.className = 'jfile';\r\n container.appendChild(img);\r\n obj.options.items.push(img);\r\n\r\n // Onchange\r\n if (! ignoreEvents) {\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, v);\r\n }\r\n }\r\n }\r\n\r\n obj.addFiles = function(files) {\r\n for (var i = 0; i < files.length; i++) {\r\n obj.addFile(files[i]);\r\n }\r\n }\r\n\r\n obj.next = function() {\r\n if (obj.currentImage.nextSibling) {\r\n obj.show(obj.currentImage.nextSibling);\r\n }\r\n }\r\n \r\n obj.prev = function() {\r\n if (obj.currentImage.previousSibling) {\r\n obj.show(obj.currentImage.previousSibling);\r\n }\r\n }\r\n\r\n obj.getData = function() {\r\n return jSuites.files(container).get();\r\n }\r\n\r\n // Append data\r\n if (obj.options.data && obj.options.data.length) {\r\n for (var i = 0; i < obj.options.data.length; i++) {\r\n if (obj.options.data[i]) {\r\n obj.addFile(obj.options.data[i]);\r\n }\r\n }\r\n }\r\n\r\n // Allow insert\r\n if (obj.options.allowAttachment) {\r\n var attachmentInput = document.createElement('input');\r\n attachmentInput.type = 'file';\r\n attachmentInput.className = 'slider-attachment';\r\n attachmentInput.setAttribute('accept', 'image/*');\r\n attachmentInput.style.display = 'none';\r\n attachmentInput.onchange = function() {\r\n var reader = [];\r\n\r\n for (var i = 0; i < this.files.length; i++) {\r\n var type = this.files[i].type.split('/');\r\n\r\n if (type[0] == 'image') {\r\n var extension = this.files[i].name;\r\n extension = extension.split('.');\r\n extension = extension[extension.length-1];\r\n\r\n var file = {\r\n size: this.files[i].size,\r\n name: this.files[i].name,\r\n extension: extension,\r\n cover: 0,\r\n lastmodified: this.files[i].lastModified,\r\n }\r\n\r\n reader[i] = new FileReader();\r\n reader[i].addEventListener(\"load\", function (e) {\r\n file.file = e.target.result;\r\n obj.addFile(file);\r\n }, false);\r\n\r\n reader[i].readAsDataURL(this.files[i]);\r\n } else {\r\n alert('The extension is not allowed');\r\n }\r\n };\r\n }\r\n\r\n var attachmentIcon = document.createElement('i');\r\n attachmentIcon.innerHTML = 'attachment';\r\n attachmentIcon.className = 'jslider-attach material-icons';\r\n attachmentIcon.onclick = function() {\r\n jSuites.click(attachmentInput);\r\n }\r\n\r\n el.appendChild(attachmentInput);\r\n el.appendChild(attachmentIcon);\r\n }\r\n\r\n // Push to refresh\r\n var longTouchTimer = null;\r\n\r\n var mouseDown = function(e) {\r\n if (e.target.tagName == 'IMG') {\r\n // Remove\r\n var targetImage = e.target;\r\n longTouchTimer = setTimeout(function() {\r\n if (e.target.src.substr(0,4) == 'data') {\r\n e.target.remove();\r\n } else {\r\n if (e.target.classList.contains('jremove')) {\r\n e.target.classList.remove('jremove');\r\n } else {\r\n e.target.classList.add('jremove');\r\n }\r\n }\r\n\r\n // Onchange\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, e.target);\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n var mouseUp = function(e) {\r\n if (longTouchTimer) {\r\n clearTimeout(longTouchTimer);\r\n }\r\n\r\n // Open slider\r\n if (e.target.tagName == 'IMG') {\r\n if (! e.target.classList.contains('jremove')) {\r\n obj.show(e.target);\r\n }\r\n } else {\r\n // Arrow controls\r\n if (e.target.clientWidth - e.offsetX < 40) {\r\n // Show next image\r\n obj.next();\r\n } else if (e.offsetX < 40) {\r\n // Show previous image\r\n obj.prev();\r\n }\r\n }\r\n }\r\n\r\n container.addEventListener('mousedown', mouseDown);\r\n container.addEventListener('touchstart', mouseDown);\r\n container.addEventListener('mouseup', mouseUp);\r\n container.addEventListener('touchend', mouseUp);\r\n\r\n // Add global events\r\n el.addEventListener(\"swipeleft\", function(e) {\r\n obj.next();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n el.addEventListener(\"swiperight\", function(e) {\r\n obj.prev();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n if (! jSuites.slider.hasEvents) {\r\n document.addEventListener('keydown', function(e) {\r\n if (e.which == 27) {\r\n obj.close();\r\n }\r\n });\r\n\r\n jSuites.slider.hasEvents = true;\r\n }\r\n\r\n el.slider = obj;\r\n\r\n return obj;\r\n});\r\n\r\njSuites.sorting = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n var defaults = {\r\n pointer: null,\r\n direction: null,\r\n ondragstart: null,\r\n ondragend: null,\r\n ondrop: null,\r\n }\r\n\r\n var dragElement = null;\r\n\r\n // Loop through the initial configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n el.classList.add('jsorting');\r\n\r\n el.addEventListener('dragstart', function(e) {\r\n var position = Array.prototype.indexOf.call(e.target.parentNode.children, e.target);\r\n dragElement = {\r\n element: e.target,\r\n o: position,\r\n d: position\r\n }\r\n e.target.style.opacity = '0.25';\r\n\r\n if (typeof(obj.options.ondragstart) == 'function') {\r\n obj.options.ondragstart(el, e.target, e);\r\n }\r\n });\r\n\r\n el.addEventListener('dragover', function(e) {\r\n e.preventDefault();\r\n\r\n if (getElement(e.target) && dragElement) {\r\n if (e.target.getAttribute('draggable') == 'true' && dragElement.element != e.target) {\r\n if (! obj.options.direction) {\r\n var condition = e.target.clientHeight / 2 > e.offsetY;\r\n } else {\r\n var condition = e.target.clientWidth / 2 > e.offsetX;\r\n }\r\n\r\n if (condition) {\r\n e.target.parentNode.insertBefore(dragElement.element, e.target);\r\n } else {\r\n e.target.parentNode.insertBefore(dragElement.element, e.target.nextSibling);\r\n }\r\n\r\n dragElement.d = Array.prototype.indexOf.call(e.target.parentNode.children, dragElement.element);\r\n }\r\n }\r\n });\r\n\r\n el.addEventListener('dragleave', function(e) {\r\n e.preventDefault();\r\n });\r\n\r\n el.addEventListener('dragend', function(e) {\r\n e.preventDefault();\r\n\r\n if (dragElement) {\r\n if (typeof(obj.options.ondragend) == 'function') {\r\n obj.options.ondragend(el, dragElement.element, e);\r\n }\r\n\r\n // Cancelled put element to the original position\r\n if (dragElement.o < dragElement.d) {\r\n e.target.parentNode.insertBefore(dragElement.element, e.target.parentNode.children[dragElement.o]);\r\n } else {\r\n e.target.parentNode.insertBefore(dragElement.element, e.target.parentNode.children[dragElement.o].nextSibling);\r\n }\r\n\r\n dragElement.element.style.opacity = '';\r\n dragElement = null;\r\n }\r\n });\r\n\r\n el.addEventListener('drop', function(e) {\r\n e.preventDefault();\r\n\r\n if (dragElement && (dragElement.o != dragElement.d)) {\r\n if (typeof(obj.options.ondrop) == 'function') {\r\n obj.options.ondrop(el, dragElement.o, dragElement.d, dragElement.element, e.target, e);\r\n }\r\n }\r\n\r\n dragElement.element.style.opacity = '';\r\n dragElement = null;\r\n });\r\n\r\n var getElement = function(element) {\r\n var sorting = false;\r\n\r\n function path (element) {\r\n if (element.className) {\r\n if (element.classList.contains('jsorting')) {\r\n sorting = true;\r\n }\r\n }\r\n\r\n if (! sorting) {\r\n path(element.parentNode);\r\n }\r\n }\r\n\r\n path(element);\r\n\r\n return sorting;\r\n }\r\n\r\n for (var i = 0; i < el.children.length; i++) {\r\n if (! el.children[i].hasAttribute('draggable')) {\r\n el.children[i].setAttribute('draggable', 'true');\r\n }\r\n }\r\n\r\n el.val = function() {\r\n var id = null;\r\n var data = [];\r\n for (var i = 0; i < el.children.length; i++) {\r\n if (id = el.children[i].getAttribute('data-id')) {\r\n data.push(id);\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n return el;\r\n});\r\n\r\njSuites.tabs = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n data: [],\r\n position: null,\r\n allowCreate: false,\r\n allowChangePosition: false,\r\n onclick: null,\r\n onload: null,\r\n onchange: null,\r\n oncreate: null,\r\n ondelete: null,\r\n onbeforecreate: null,\r\n onchangeposition: null,\r\n animation: false,\r\n hideHeaders: false,\r\n padding: null,\r\n palette: null,\r\n }\r\n\r\n // Loop through the initial configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Class\r\n el.classList.add('jtabs');\r\n\r\n var prev = null;\r\n var next = null;\r\n var border = null;\r\n\r\n // Helpers\r\n var setBorder = function(index) {\r\n var rect = obj.headers.children[index].getBoundingClientRect();\r\n\r\n if (obj.options.palette == 'modern') {\r\n border.style.width = rect.width - 4 + 'px';\r\n border.style.left = obj.headers.children[index].offsetLeft + 2 + 'px';\r\n } else {\r\n border.style.width = rect.width + 'px';\r\n border.style.left = obj.headers.children[index].offsetLeft + 'px';\r\n }\r\n\r\n border.style.bottom = '0px';\r\n }\r\n\r\n var updateControls = function(x) {\r\n if (typeof(obj.headers.scrollTo) == 'function') {\r\n obj.headers.scrollTo({\r\n left: x,\r\n behavior: 'smooth',\r\n });\r\n } else {\r\n obj.headers.scrollLeft = x;\r\n }\r\n\r\n if (x <= 1) {\r\n prev.classList.add('disabled');\r\n } else {\r\n prev.classList.remove('disabled');\r\n }\r\n\r\n if (x >= obj.headers.scrollWidth - obj.headers.offsetWidth) {\r\n next.classList.add('disabled');\r\n } else {\r\n next.classList.remove('disabled');\r\n }\r\n\r\n if (obj.headers.scrollWidth <= obj.headers.offsetWidth) {\r\n prev.style.display = 'none';\r\n next.style.display = 'none';\r\n } else {\r\n prev.style.display = '';\r\n next.style.display = '';\r\n }\r\n }\r\n\r\n // Set value\r\n obj.open = function(index) {\r\n var previous = null;\r\n for (var i = 0; i < obj.headers.children.length; i++) {\r\n if (obj.headers.children[i].classList.contains('jtabs-selected')) {\r\n // Current one\r\n previous = i;\r\n }\r\n // Remote selected\r\n obj.headers.children[i].classList.remove('jtabs-selected');\r\n if (obj.content.children[i]) {\r\n obj.content.children[i].classList.remove('jtabs-selected');\r\n }\r\n }\r\n\r\n obj.headers.children[index].classList.add('jtabs-selected');\r\n if (obj.content.children[index]) {\r\n obj.content.children[index].classList.add('jtabs-selected');\r\n }\r\n\r\n if (previous != index && typeof(obj.options.onchange) == 'function') {\r\n if (obj.content.children[index]) {\r\n obj.options.onchange(el, obj, index, obj.headers.children[index], obj.content.children[index]);\r\n }\r\n }\r\n\r\n // Hide\r\n if (obj.options.hideHeaders == true && (obj.headers.children.length < 3 && obj.options.allowCreate == false)) {\r\n obj.headers.parentNode.style.display = 'none';\r\n } else {\r\n // Set border\r\n if (obj.options.animation == true) {\r\n setBorder(index);\r\n }\r\n\r\n obj.headers.parentNode.style.display = '';\r\n\r\n var x1 = obj.headers.children[index].offsetLeft;\r\n var x2 = x1 + obj.headers.children[index].offsetWidth;\r\n var r1 = obj.headers.scrollLeft;\r\n var r2 = r1 + obj.headers.offsetWidth;\r\n\r\n if (! (r1 <= x1 && r2 >= x2)) {\r\n // Out of the viewport\r\n updateControls(x1 - 1);\r\n }\r\n }\r\n }\r\n\r\n obj.selectIndex = function(a) {\r\n var index = Array.prototype.indexOf.call(obj.headers.children, a);\r\n if (index >= 0) {\r\n obj.open(index);\r\n }\r\n\r\n return index;\r\n }\r\n\r\n obj.rename = function(i, title) {\r\n if (! title) {\r\n title = prompt('New title', obj.headers.children[i].innerText);\r\n }\r\n obj.headers.children[i].innerText = title;\r\n obj.open(i);\r\n }\r\n\r\n obj.create = function(title, url) {\r\n if (typeof(obj.options.onbeforecreate) == 'function') {\r\n var ret = obj.options.onbeforecreate(el);\r\n if (ret === false) {\r\n return false;\r\n } else {\r\n title = ret;\r\n }\r\n }\r\n\r\n var div = obj.appendElement(title);\r\n\r\n if (typeof(obj.options.oncreate) == 'function') {\r\n obj.options.oncreate(el, div)\r\n }\r\n\r\n return div;\r\n }\r\n\r\n obj.remove = function(index) {\r\n return obj.deleteElement(index);\r\n }\r\n\r\n obj.nextNumber = function() {\r\n var num = 0;\r\n for (var i = 0; i < obj.headers.children.length; i++) {\r\n var tmp = obj.headers.children[i].innerText.match(/[0-9].*/);\r\n if (tmp > num) {\r\n num = parseInt(tmp);\r\n }\r\n }\r\n if (! num) {\r\n num = 1;\r\n } else {\r\n num++;\r\n }\r\n\r\n return num;\r\n }\r\n\r\n obj.deleteElement = function(index) {\r\n if (! obj.headers.children[index]) {\r\n return false;\r\n } else {\r\n obj.headers.removeChild(obj.headers.children[index]);\r\n obj.content.removeChild(obj.content.children[index]);\r\n }\r\n\r\n obj.open(0);\r\n\r\n if (typeof(obj.options.ondelete) == 'function') {\r\n obj.options.ondelete(el, index)\r\n }\r\n }\r\n\r\n obj.appendElement = function(title) {\r\n if (! title) {\r\n var title = prompt('Title?', '');\r\n }\r\n\r\n if (title) {\r\n // Add content\r\n var div = document.createElement('div');\r\n obj.content.appendChild(div);\r\n\r\n // Add headers\r\n var h = document.createElement('div');\r\n h.innerHTML = title;\r\n h.content = div;\r\n obj.headers.insertBefore(h, obj.headers.lastChild);\r\n\r\n // Sortable\r\n if (obj.options.allowChangePosition) {\r\n h.setAttribute('draggable', 'true');\r\n }\r\n // Open new tab\r\n obj.selectIndex(h);\r\n\r\n // Return element\r\n return div;\r\n }\r\n }\r\n\r\n obj.getActive = function() {\r\n for (var i = 0; i < obj.headers.children.length; i++) {\r\n if (obj.headers.children[i].classList.contains('jtabs-selected')) {\r\n return i\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n obj.updateContent = function(position, newContent) {\r\n if (typeof newContent !== 'string') {\r\n var contentItem = newContent;\r\n } else {\r\n var contentItem = document.createElement('div');\r\n contentItem.innerHTML = newContent;\r\n }\r\n\r\n if (obj.content.children[position].classList.contains('jtabs-selected')) {\r\n newContent.classList.add('jtabs-selected');\r\n }\r\n\r\n obj.content.replaceChild(newContent, obj.content.children[position]);\r\n }\r\n\r\n obj.updatePosition = function(f, t) {\r\n // Ondrop update position of content\r\n if (f > t) {\r\n obj.content.insertBefore(obj.content.children[f], obj.content.children[t]);\r\n } else {\r\n obj.content.insertBefore(obj.content.children[f], obj.content.children[t].nextSibling);\r\n }\r\n\r\n // Open destination tab\r\n obj.open(t);\r\n\r\n // Call event\r\n if (typeof(obj.options.onchangeposition) == 'function') {\r\n obj.options.onchangeposition(obj.headers, f, t);\r\n }\r\n }\r\n\r\n obj.move = function(f, t) {\r\n if (f > t) {\r\n obj.headers.insertBefore(obj.headers.children[f], obj.headers.children[t]);\r\n } else {\r\n obj.headers.insertBefore(obj.headers.children[f], obj.headers.children[t].nextSibling);\r\n }\r\n\r\n obj.updatePosition(f, t);\r\n }\r\n\r\n obj.setBorder = setBorder;\r\n\r\n obj.init = function() {\r\n el.innerHTML = '';\r\n\r\n // Make sure the component is blank\r\n obj.headers = document.createElement('div');\r\n obj.content = document.createElement('div');\r\n obj.headers.classList.add('jtabs-headers');\r\n obj.content.classList.add('jtabs-content');\r\n\r\n if (obj.options.palette) {\r\n el.classList.add('jtabs-modern');\r\n } else {\r\n el.classList.remove('jtabs-modern');\r\n }\r\n\r\n // Padding\r\n if (obj.options.padding) {\r\n obj.content.style.padding = parseInt(obj.options.padding) + 'px';\r\n }\r\n\r\n // Header\r\n var header = document.createElement('div');\r\n header.className = 'jtabs-headers-container';\r\n header.appendChild(obj.headers);\r\n\r\n // Controls\r\n var controls = document.createElement('div');\r\n controls.className = 'jtabs-controls';\r\n controls.setAttribute('draggable', 'false');\r\n header.appendChild(controls);\r\n\r\n // Append DOM elements\r\n if (obj.options.position == 'bottom') {\r\n el.appendChild(obj.content);\r\n el.appendChild(header);\r\n } else {\r\n el.appendChild(header);\r\n el.appendChild(obj.content);\r\n }\r\n\r\n // New button\r\n if (obj.options.allowCreate == true) {\r\n var add = document.createElement('div');\r\n add.className = 'jtabs-add';\r\n add.onclick = function() {\r\n obj.create();\r\n }\r\n controls.appendChild(add);\r\n }\r\n\r\n prev = document.createElement('div');\r\n prev.className = 'jtabs-prev';\r\n prev.onclick = function() {\r\n updateControls(obj.headers.scrollLeft - obj.headers.offsetWidth);\r\n }\r\n controls.appendChild(prev);\r\n\r\n next = document.createElement('div');\r\n next.className = 'jtabs-next';\r\n next.onclick = function() {\r\n updateControls(obj.headers.scrollLeft + obj.headers.offsetWidth);\r\n }\r\n controls.appendChild(next);\r\n\r\n // Data\r\n for (var i = 0; i < obj.options.data.length; i++) {\r\n // Title\r\n if (obj.options.data[i].titleElement) {\r\n var headerItem = obj.options.data[i].titleElement;\r\n } else {\r\n var headerItem = document.createElement('div');\r\n }\r\n // Icon\r\n if (obj.options.data[i].icon) {\r\n var iconContainer = document.createElement('div');\r\n var icon = document.createElement('i');\r\n icon.classList.add('material-icons');\r\n icon.innerHTML = obj.options.data[i].icon;\r\n iconContainer.appendChild(icon);\r\n headerItem.appendChild(iconContainer);\r\n }\r\n // Title\r\n if (obj.options.data[i].title) {\r\n var title = document.createTextNode(obj.options.data[i].title);\r\n headerItem.appendChild(title);\r\n }\r\n // Width\r\n if (obj.options.data[i].width) {\r\n headerItem.style.width = obj.options.data[i].width;\r\n }\r\n // Content\r\n if (obj.options.data[i].contentElement) {\r\n var contentItem = obj.options.data[i].contentElement;\r\n } else {\r\n var contentItem = document.createElement('div');\r\n contentItem.innerHTML = obj.options.data[i].content;\r\n }\r\n obj.headers.appendChild(headerItem);\r\n obj.content.appendChild(contentItem);\r\n }\r\n\r\n // Animation\r\n border = document.createElement('div');\r\n border.className = 'jtabs-border';\r\n obj.headers.appendChild(border);\r\n\r\n if (obj.options.animation) {\r\n el.classList.add('jtabs-animation');\r\n }\r\n\r\n // Events\r\n obj.headers.addEventListener(\"click\", function(e) {\r\n if (e.target.parentNode.classList.contains('jtabs-headers')) {\r\n var target = e.target;\r\n } else {\r\n if (e.target.tagName == 'I') {\r\n var target = e.target.parentNode.parentNode;\r\n } else {\r\n var target = e.target.parentNode;\r\n }\r\n }\r\n\r\n var index = obj.selectIndex(target);\r\n\r\n if (typeof(obj.options.onclick) == 'function') {\r\n obj.options.onclick(el, obj, index, obj.headers.children[index], obj.content.children[index]);\r\n }\r\n });\r\n\r\n obj.headers.addEventListener(\"contextmenu\", function(e) {\r\n obj.selectIndex(e.target);\r\n });\r\n\r\n if (obj.headers.children.length) {\r\n // Open first tab\r\n obj.open(0);\r\n }\r\n\r\n // Update controls\r\n updateControls(0);\r\n\r\n if (obj.options.allowChangePosition == true) {\r\n jSuites.sorting(obj.headers, {\r\n direction: 1,\r\n ondrop: function(a,b,c) {\r\n obj.updatePosition(b,c);\r\n },\r\n });\r\n }\r\n\r\n if (typeof(obj.options.onload) == 'function') {\r\n obj.options.onload(el, obj);\r\n }\r\n }\r\n\r\n // Loading existing nodes as the data\r\n if (el.children[0] && el.children[0].children.length) {\r\n // Create from existing elements\r\n for (var i = 0; i < el.children[0].children.length; i++) {\r\n var item = obj.options.data && obj.options.data[i] ? obj.options.data[i] : {};\r\n\r\n if (el.children[1] && el.children[1].children[i]) {\r\n item.titleElement = el.children[0].children[i];\r\n item.contentElement = el.children[1].children[i];\r\n } else {\r\n item.contentElement = el.children[0].children[i];\r\n }\r\n\r\n obj.options.data[i] = item;\r\n }\r\n }\r\n\r\n // Remote controller flag\r\n var loadingRemoteData = false;\r\n\r\n // Create from data\r\n if (obj.options.data) {\r\n // Append children\r\n for (var i = 0; i < obj.options.data.length; i++) {\r\n if (obj.options.data[i].url) {\r\n jSuites.ajax({\r\n url: obj.options.data[i].url,\r\n type: 'GET',\r\n dataType: 'text/html',\r\n index: i,\r\n success: function(result) {\r\n obj.options.data[this.index].content = result;\r\n },\r\n complete: function() {\r\n obj.init();\r\n }\r\n });\r\n\r\n // Flag loading\r\n loadingRemoteData = true;\r\n }\r\n }\r\n }\r\n\r\n if (! loadingRemoteData) {\r\n obj.init();\r\n }\r\n\r\n el.tabs = obj;\r\n\r\n return obj;\r\n});\r\n\r\njSuites.tags = (function(el, options) {\r\n // Redefine configuration\r\n if (el.tags) {\r\n return el.tags.setOptions(options, true);\r\n }\r\n\r\n var obj = { type:'tags' };\r\n obj.options = {};\r\n\r\n // Limit\r\n var limit = function() {\r\n return obj.options.limit && el.children.length >= obj.options.limit ? true : false;\r\n }\r\n\r\n // Search helpers\r\n var search = null;\r\n var searchContainer = null;\r\n\r\n obj.setOptions = function(options, reset) {\r\n /**\r\n * @typedef {Object} defaults\r\n * @property {(string|Array)} value - Initial value of the compontent\r\n * @property {number} limit - Max number of tags inside the element\r\n * @property {string} search - The URL for suggestions\r\n * @property {string} placeholder - The default instruction text on the element\r\n * @property {validation} validation - Method to validate the tags\r\n * @property {requestCallback} onbeforechange - Method to be execute before any changes on the element\r\n * @property {requestCallback} onchange - Method to be execute after any changes on the element\r\n * @property {requestCallback} onfocus - Method to be execute when on focus\r\n * @property {requestCallback} onblur - Method to be execute when on blur\r\n * @property {requestCallback} onload - Method to be execute when the element is loaded\r\n */\r\n var defaults = {\r\n value: '',\r\n limit: null,\r\n limitMessage: 'The limit of entries is: ',\r\n search: null,\r\n placeholder: null,\r\n validation: null,\r\n onbeforechange: null,\r\n onchange: null,\r\n onfocus: null,\r\n onblur: null,\r\n onload: null,\r\n colors: null,\r\n }\r\n\r\n // Loop through though the default configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Placeholder\r\n if (obj.options.placeholder) {\r\n el.setAttribute('data-placeholder', obj.options.placeholder);\r\n } else {\r\n el.removeAttribute('data-placeholder');\r\n }\r\n el.placeholder = obj.options.placeholder;\r\n\r\n // Update value\r\n obj.setValue(obj.options.value);\r\n\r\n // Validate items\r\n filter();\r\n\r\n // Create search box\r\n if (obj.options.search) {\r\n if (! searchContainer) {\r\n searchContainer = document.createElement('div');\r\n el.parentNode.insertBefore(searchContainer, el.nextSibling);\r\n\r\n // Create container\r\n search = jSuites.search(searchContainer, {\r\n data: obj.options.search,\r\n onselect: function(a,b,c) {\r\n obj.selectIndex(b,c);\r\n }\r\n });\r\n }\r\n } else {\r\n if (searchContainer) {\r\n search = null;\r\n searchContainer.remove();\r\n searchContainer = null;\r\n }\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * Add a new tag to the element\r\n * @param {(?string|Array)} value - The value of the new element\r\n */\r\n obj.add = function(value, focus) {\r\n if (typeof(obj.options.onbeforechange) == 'function') {\r\n var ret = obj.options.onbeforechange(el, obj, obj.options.value, value);\r\n if (ret === false) {\r\n return false;\r\n } else { \r\n if (ret != null) {\r\n value = ret;\r\n }\r\n }\r\n }\r\n\r\n // Make sure search is closed\r\n if (search) {\r\n search.close();\r\n }\r\n\r\n if (limit()) {\r\n alert(obj.options.limitMessage + ' ' + obj.options.limit);\r\n } else {\r\n // Get node\r\n var node = jSuites.getNode();\r\n\r\n if (node && node.parentNode && node.parentNode.classList.contains('jtags') &&\r\n node.nextSibling && (! (node.nextSibling.innerText && node.nextSibling.innerText.trim()))) {\r\n div = node.nextSibling;\r\n } else {\r\n // Remove not used last item\r\n if (el.lastChild) {\r\n if (! el.lastChild.innerText.trim()) {\r\n el.removeChild(el.lastChild);\r\n }\r\n }\r\n\r\n // Mix argument string or array\r\n if (! value || typeof(value) == 'string') {\r\n var div = createElement(value, value, node);\r\n } else {\r\n for (var i = 0; i <= value.length; i++) {\r\n if (! limit()) {\r\n if (! value[i] || typeof(value[i]) == 'string') {\r\n var t = value[i] || '';\r\n var v = null;\r\n } else {\r\n var t = value[i].text;\r\n var v = value[i].value;\r\n }\r\n\r\n // Add element\r\n var div = createElement(t, v);\r\n }\r\n }\r\n }\r\n\r\n // Change\r\n change();\r\n }\r\n\r\n // Place caret\r\n if (focus) {\r\n setFocus(div);\r\n }\r\n }\r\n }\r\n\r\n // Remove a item node\r\n obj.remove = function(node) {\r\n // Remove node\r\n node.parentNode.removeChild(node);\r\n // Make sure element is not blank\r\n if (! el.children.length) {\r\n obj.add('', true);\r\n } else {\r\n change();\r\n }\r\n }\r\n\r\n /**\r\n * Get all tags in the element\r\n * @return {Array} data - All tags as an array\r\n */\r\n obj.getData = function() {\r\n var data = [];\r\n for (var i = 0; i < el.children.length; i++) {\r\n // Get value\r\n var text = el.children[i].innerText.replace(\"\\n\", \"\");\r\n // Get id\r\n var value = el.children[i].getAttribute('data-value');\r\n if (! value) {\r\n value = text;\r\n }\r\n // Item\r\n if (text || value) {\r\n data.push({ text: text, value: value });\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n /**\r\n * Get the value of one tag. Null for all tags\r\n * @param {?number} index - Tag index number. Null for all tags.\r\n * @return {string} value - All tags separated by comma\r\n */\r\n obj.getValue = function(index) {\r\n var value = null;\r\n\r\n if (index != null) {\r\n // Get one individual value\r\n value = el.children[index].getAttribute('data-value');\r\n if (! value) {\r\n value = el.children[index].innerText.replace(\"\\n\", \"\");\r\n }\r\n } else {\r\n // Get all\r\n var data = [];\r\n for (var i = 0; i < el.children.length; i++) {\r\n value = el.children[i].innerText.replace(\"\\n\", \"\");\r\n if (value) {\r\n data.push(obj.getValue(i));\r\n }\r\n }\r\n value = data.join(',');\r\n }\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * Set the value of the element based on a string separeted by (,|;|\\r\\n)\r\n * @param {mixed} value - A string or array object with values\r\n */\r\n obj.setValue = function(mixed) {\r\n if (! mixed) {\r\n obj.reset();\r\n } else {\r\n if (el.value != mixed) {\r\n if (Array.isArray(mixed)) {\r\n obj.add(mixed);\r\n } else {\r\n // Remove whitespaces\r\n var text = (''+mixed).trim();\r\n // Tags\r\n var data = extractTags(text);\r\n // Reset\r\n el.innerHTML = '';\r\n // Add tags to the element\r\n obj.add(data);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Reset the data from the element\r\n */\r\n obj.reset = function() {\r\n // Empty class\r\n el.classList.add('jtags-empty');\r\n // Empty element\r\n el.innerHTML = '
';\r\n // Execute changes\r\n change();\r\n }\r\n\r\n /**\r\n * Verify if all tags in the element are valid\r\n * @return {boolean}\r\n */\r\n obj.isValid = function() {\r\n var test = 0;\r\n for (var i = 0; i < el.children.length; i++) {\r\n if (el.children[i].classList.contains('jtags_error')) {\r\n test++;\r\n }\r\n }\r\n return test == 0 ? true : false;\r\n }\r\n\r\n /**\r\n * Add one element from the suggestions to the element\r\n * @param {object} item - Node element in the suggestions container\r\n */ \r\n obj.selectIndex = function(text, value) {\r\n var node = jSuites.getNode();\r\n if (node) {\r\n // Append text to the caret\r\n node.innerText = text;\r\n // Set node id\r\n if (value) {\r\n node.setAttribute('data-value', value);\r\n }\r\n // Remove any error\r\n node.classList.remove('jtags_error');\r\n if (! limit()) {\r\n // Add new item\r\n obj.add('', true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Search for suggestions\r\n * @param {object} node - Target node for any suggestions\r\n */\r\n obj.search = function(node) {\r\n // Search for\r\n var terms = node.innerText;\r\n }\r\n\r\n // Destroy tags element\r\n obj.destroy = function() {\r\n // Bind events\r\n el.removeEventListener('mouseup', tagsMouseUp);\r\n el.removeEventListener('keydown', tagsKeyDown);\r\n el.removeEventListener('keyup', tagsKeyUp);\r\n el.removeEventListener('paste', tagsPaste);\r\n el.removeEventListener('focus', tagsFocus);\r\n el.removeEventListener('blur', tagsBlur);\r\n\r\n // Remove element\r\n el.parentNode.removeChild(el);\r\n }\r\n\r\n var setFocus = function(node) {\r\n var range = document.createRange();\r\n var sel = window.getSelection();\r\n range.setStart(node, node.innerText.length||0)\r\n range.collapse(true)\r\n sel.removeAllRanges()\r\n sel.addRange(range)\r\n node.scrollLeft = node.scrollWidth;\r\n }\r\n\r\n var createElement = function(label, value, node) {\r\n var div = document.createElement('div');\r\n div.innerHTML = label ? label : '';\r\n if (value) {\r\n div.setAttribute('data-value', value);\r\n }\r\n\r\n if (node && node.parentNode.classList.contains('jtags')) {\r\n el.insertBefore(div, node.nextSibling);\r\n } else {\r\n el.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n\r\n var change = function() {\r\n // Value\r\n var value = obj.getValue();\r\n\r\n if (value != obj.options.value) {\r\n obj.options.value = value;\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, obj, obj.options.value);\r\n }\r\n\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof(el.onchange) == 'function') {\r\n el.onchange({\r\n type: 'change',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n filter();\r\n }\r\n\r\n /**\r\n * Filter tags\r\n */\r\n var filter = function() {\r\n for (var i = 0; i < el.children.length; i++) {\r\n // Create label design\r\n if (! obj.getValue(i)) {\r\n el.children[i].classList.remove('jtags_label');\r\n } else {\r\n el.children[i].classList.add('jtags_label');\r\n\r\n // Validation in place\r\n if (typeof(obj.options.validation) == 'function') {\r\n if (obj.getValue(i)) {\r\n if (! obj.options.validation(el.children[i], el.children[i].innerText, el.children[i].getAttribute('data-value'))) {\r\n el.children[i].classList.add('jtags_error');\r\n } else {\r\n el.children[i].classList.remove('jtags_error');\r\n }\r\n } else {\r\n el.children[i].classList.remove('jtags_error');\r\n }\r\n } else {\r\n el.children[i].classList.remove('jtags_error');\r\n }\r\n }\r\n }\r\n\r\n isEmpty();\r\n }\r\n\r\n var isEmpty = function() {\r\n // Can't be empty\r\n if (! el.innerText.trim()) {\r\n el.innerHTML = '
';\r\n el.classList.add('jtags-empty');\r\n } else {\r\n el.classList.remove('jtags-empty');\r\n }\r\n }\r\n\r\n /**\r\n * Extract tags from a string\r\n * @param {string} text - Raw string\r\n * @return {Array} data - Array with extracted tags\r\n */\r\n var extractTags = function(text) {\r\n /** @type {Array} */\r\n var data = [];\r\n\r\n /** @type {string} */\r\n var word = '';\r\n\r\n // Remove whitespaces\r\n text = text.trim();\r\n\r\n if (text) {\r\n for (var i = 0; i < text.length; i++) {\r\n if (text[i] == ',' || text[i] == ';' || text[i] == '\\n') {\r\n if (word) {\r\n data.push(word.trim());\r\n word = '';\r\n }\r\n } else {\r\n word += text[i];\r\n }\r\n }\r\n\r\n if (word) {\r\n data.push(word);\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /** @type {number} */\r\n var anchorOffset = 0;\r\n\r\n /**\r\n * Processing event keydown on the element\r\n * @param e {object}\r\n */\r\n var tagsKeyDown = function(e) {\r\n // Anchoroffset\r\n anchorOffset = window.getSelection().anchorOffset;\r\n\r\n // Verify if is empty\r\n isEmpty();\r\n\r\n // Comma\r\n if (e.key === 'Tab' || e.key === ';' || e.key === ',') {\r\n var n = window.getSelection().anchorOffset;\r\n if (n > 1) {\r\n if (! limit()) {\r\n obj.add('', true);\r\n }\r\n }\r\n e.preventDefault();\r\n } else if (e.key == 'Enter') {\r\n if (! search || ! search.isOpened()) {\r\n var n = window.getSelection().anchorOffset;\r\n if (n > 1) {\r\n if (! limit()) {\r\n obj.add('', true);\r\n }\r\n }\r\n }\r\n } else if (e.key == 'Backspace') {\r\n // Back space - do not let last item to be removed\r\n if (el.children.length == 1 && window.getSelection().anchorOffset < 1) {\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n // Search events\r\n if (search) {\r\n search.keydown(e);\r\n }\r\n }\r\n\r\n /**\r\n * Processing event keyup on the element\r\n * @param e {object}\r\n */\r\n var tagsKeyUp = function(e) {\r\n if (e.which == 39) {\r\n // Right arrow\r\n var n = window.getSelection().anchorOffset;\r\n if (n > 1 && n == anchorOffset) {\r\n obj.add('', true);\r\n }\r\n } else if (e.which == 13 || e.which == 38 || e.which == 40) {\r\n e.preventDefault();\r\n } else {\r\n if (search) {\r\n search.keyup(e);\r\n }\r\n }\r\n\r\n filter();\r\n }\r\n\r\n /**\r\n * Processing event paste on the element\r\n * @param e {object}\r\n */\r\n var tagsPaste = function(e) {\r\n if (e.clipboardData || e.originalEvent.clipboardData) {\r\n var text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n } else if (window.clipboardData) {\r\n var text = window.clipboardData.getData('Text');\r\n }\r\n\r\n var data = extractTags(text);\r\n if (data.length > 1) {\r\n obj.add(data, true);\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Processing event mouseup on the element\r\n * @param e {object}\r\n */\r\n var tagsMouseUp = function(e) {\r\n if (e.target.parentNode && e.target.parentNode.classList.contains('jtags')) {\r\n if (e.target.classList.contains('jtags_label') || e.target.classList.contains('jtags_error')) {\r\n var rect = e.target.getBoundingClientRect();\r\n if (rect.width - (e.clientX - rect.left) < 16) {\r\n obj.remove(e.target);\r\n }\r\n }\r\n }\r\n }\r\n\r\n var tagsFocus = function() {\r\n if (! el.classList.contains('jtags-focus')) {\r\n if (! el.children.length || obj.getValue(el.children.length - 1)) {\r\n if (! limit()) {\r\n createElement('');\r\n }\r\n }\r\n\r\n if (typeof(obj.options.onfocus) == 'function') {\r\n obj.options.onfocus(el, obj, obj.getValue());\r\n }\r\n\r\n el.classList.add('jtags-focus');\r\n }\r\n }\r\n\r\n var tagsBlur = function() {\r\n if (el.classList.contains('jtags-focus')) {\r\n if (search) {\r\n search.close();\r\n }\r\n\r\n for (var i = 0; i < el.children.length - 1; i++) {\r\n // Create label design\r\n if (! obj.getValue(i)) {\r\n el.removeChild(el.children[i]);\r\n }\r\n }\r\n\r\n change();\r\n\r\n el.classList.remove('jtags-focus');\r\n\r\n if (typeof(obj.options.onblur) == 'function') {\r\n obj.options.onblur(el, obj, obj.getValue());\r\n }\r\n }\r\n }\r\n\r\n var init = function() {\r\n // Bind events\r\n if ('touchend' in document.documentElement === true) {\r\n el.addEventListener('touchend', tagsMouseUp);\r\n } else {\r\n el.addEventListener('mouseup', tagsMouseUp);\r\n }\r\n\r\n el.addEventListener('keydown', tagsKeyDown);\r\n el.addEventListener('keyup', tagsKeyUp);\r\n el.addEventListener('paste', tagsPaste);\r\n el.addEventListener('focus', tagsFocus);\r\n el.addEventListener('blur', tagsBlur);\r\n\r\n // Editable\r\n el.setAttribute('contenteditable', true);\r\n\r\n // Prepare container\r\n el.classList.add('jtags');\r\n\r\n // Initial options\r\n obj.setOptions(options);\r\n\r\n if (typeof(obj.options.onload) == 'function') {\r\n obj.options.onload(el, obj);\r\n }\r\n\r\n // Change methods\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n el.tags = obj;\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n});\r\n\r\njSuites.toolbar = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n app: null,\r\n container: false,\r\n badge: false,\r\n title: false,\r\n items: [],\r\n }\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n if (! el && options.app && options.app.el) {\r\n el = document.createElement('div');\r\n options.app.el.appendChild(el);\r\n }\r\n\r\n // Arrow\r\n var toolbarArrow = document.createElement('div');\r\n toolbarArrow.classList.add('jtoolbar-item');\r\n toolbarArrow.classList.add('jtoolbar-arrow');\r\n\r\n var toolbarFloating = document.createElement('div');\r\n toolbarFloating.classList.add('jtoolbar-floating');\r\n toolbarArrow.appendChild(toolbarFloating);\r\n\r\n obj.selectItem = function(element) {\r\n var elements = toolbarContent.children;\r\n for (var i = 0; i < elements.length; i++) {\r\n if (element != elements[i]) {\r\n elements[i].classList.remove('jtoolbar-selected');\r\n }\r\n }\r\n element.classList.add('jtoolbar-selected');\r\n }\r\n\r\n obj.hide = function() {\r\n jSuites.animation.slideBottom(el, 0, function() {\r\n el.style.display = 'none';\r\n });\r\n }\r\n\r\n obj.show = function() {\r\n el.style.display = '';\r\n jSuites.animation.slideBottom(el, 1);\r\n }\r\n\r\n obj.get = function() {\r\n return el;\r\n }\r\n\r\n obj.setBadge = function(index, value) {\r\n toolbarContent.children[index].children[1].firstChild.innerHTML = value;\r\n }\r\n\r\n obj.destroy = function() {\r\n toolbar.remove();\r\n el.innerHTML = '';\r\n }\r\n\r\n var toggleState = function() {\r\n if (this.classList.contains('jtoolbar-active')) {\r\n this.classList.remove('jtoolbar-active');\r\n } else {\r\n this.classList.add('jtoolbar-active');\r\n }\r\n }\r\n\r\n obj.create = function(items) {\r\n // Reset anything in the toolbar\r\n toolbarContent.innerHTML = '';\r\n // Create elements in the toolbar\r\n for (var i = 0; i < items.length; i++) {\r\n var toolbarItem = document.createElement('div');\r\n toolbarItem.classList.add('jtoolbar-item');\r\n\r\n if (items[i].width) {\r\n toolbarItem.style.width = parseInt(items[i].width) + 'px'; \r\n }\r\n\r\n if (items[i].k) {\r\n toolbarItem.k = items[i].k;\r\n }\r\n\r\n if (items[i].tooltip) {\r\n toolbarItem.setAttribute('title', items[i].tooltip);\r\n }\r\n\r\n // Id\r\n if (items[i].id) {\r\n toolbarItem.setAttribute('id', items[i].id);\r\n }\r\n\r\n // Selected\r\n if (items[i].state) {\r\n toolbarItem.toggleState = toggleState;\r\n }\r\n\r\n if (items[i].active) {\r\n toolbarItem.classList.add('jtoolbar-active');\r\n }\r\n\r\n if (items[i].type == 'select' || items[i].type == 'dropdown') {\r\n jSuites.picker(toolbarItem, items[i]);\r\n } else if (items[i].type == 'divisor') {\r\n toolbarItem.classList.add('jtoolbar-divisor');\r\n } else if (items[i].type == 'label') {\r\n toolbarItem.classList.add('jtoolbar-label');\r\n toolbarItem.innerHTML = items[i].content;\r\n } else {\r\n // Material icons\r\n var toolbarIcon = document.createElement('i');\r\n if (typeof(items[i].class) === 'undefined') {\r\n toolbarIcon.classList.add('material-icons');\r\n } else {\r\n var c = items[i].class.split(' ');\r\n for (var j = 0; j < c.length; j++) {\r\n toolbarIcon.classList.add(c[j]);\r\n }\r\n }\r\n toolbarIcon.innerHTML = items[i].content ? items[i].content : '';\r\n toolbarItem.appendChild(toolbarIcon);\r\n\r\n // Badge options\r\n if (obj.options.badge == true) {\r\n var toolbarBadge = document.createElement('div');\r\n toolbarBadge.classList.add('jbadge');\r\n var toolbarBadgeContent = document.createElement('div');\r\n toolbarBadgeContent.innerHTML = items[i].badge ? items[i].badge : '';\r\n toolbarBadge.appendChild(toolbarBadgeContent);\r\n toolbarItem.appendChild(toolbarBadge);\r\n }\r\n\r\n // Title\r\n if (items[i].title) {\r\n if (obj.options.title == true) {\r\n var toolbarTitle = document.createElement('span');\r\n toolbarTitle.innerHTML = items[i].title;\r\n toolbarItem.appendChild(toolbarTitle);\r\n } else {\r\n toolbarItem.setAttribute('title', items[i].title);\r\n }\r\n }\r\n\r\n if (obj.options.app && items[i].route) {\r\n // Route\r\n toolbarItem.route = items[i].route;\r\n // Onclick for route\r\n toolbarItem.onclick = function() {\r\n obj.options.app.pages(this.route);\r\n }\r\n // Create pages\r\n obj.options.app.pages(items[i].route, {\r\n toolbarItem: toolbarItem,\r\n closed: true\r\n });\r\n }\r\n }\r\n\r\n if (items[i].onclick) {\r\n toolbarItem.onclick = items[i].onclick.bind(items[i], el, obj, toolbarItem);\r\n }\r\n\r\n toolbarContent.appendChild(toolbarItem);\r\n }\r\n }\r\n\r\n obj.resize = function() {\r\n el.style.width = el.parentNode.offsetWidth;\r\n\r\n toolbarContent.appendChild(toolbarArrow);\r\n }\r\n\r\n el.classList.add('jtoolbar');\r\n\r\n if (obj.options.container == true) {\r\n el.classList.add('jtoolbar-container');\r\n }\r\n\r\n el.innerHTML = '';\r\n el.onclick = function(e) {\r\n var element = jSuites.findElement(e.target, 'jtoolbar-item');\r\n if (element) {\r\n obj.selectItem(element);\r\n }\r\n\r\n if (e.target.classList.contains('jtoolbar-arrow')) {\r\n e.target.classList.add('jtoolbar-arrow-selected');\r\n e.target.children[0].focus();\r\n }\r\n }\r\n\r\n var toolbarContent = document.createElement('div');\r\n el.appendChild(toolbarContent);\r\n\r\n if (obj.options.app) {\r\n el.classList.add('jtoolbar-mobile');\r\n } else {\r\n // Not a mobile version\r\n }\r\n\r\n obj.create(obj.options.items);\r\n\r\n el.toolbar = obj;\r\n\r\n return obj;\r\n});\r\n\r\njSuites.validations = {};\r\n\r\njSuites.validations.email = function(data) {\r\n var reg = new RegExp(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/);\r\n return data && reg.test(data) ? true : false; \r\n}\r\n\r\njSuites.validations.length = function(data, element) {\r\n var len = element.getAttribute('data-length') || 5;\r\n return (data.length >= len) ? true : false;\r\n}\r\n\r\njSuites.validations.required = function(data) {\r\n return data.trim() ? true : false;\r\n}\r\n\r\njSuites.validations.number = function(data) {\r\n return jSuites.isNumber(data);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n return jSuites;\r\n\r\n})));"],"sourceRoot":""}