{"version":3,"sources":["webpack:///./node_modules/jexcel/dist/jexcel.js","webpack:///./node_modules/jsuites/dist/jsuites.js"],"names":["jSuites","global","factory","module","exports","this","jexcel","el","options","obj","Element","HTMLDocument","console","error","tagName","createFromTable","div","document","createElement","parentNode","insertBefore","remove","defaults","url","data","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","meta","style","parseFormulas","autoIncrement","autoCasting","secureFormulas","stripHTML","filters","footers","onundo","onredo","onload","onchange","onbeforechange","onafterchanges","onbeforeinsertrow","oninsertrow","onbeforeinsertcolumn","oninsertcolumn","onbeforedeleterow","ondeleterow","onbeforedeletecolumn","ondeletecolumn","onmoverow","onmovecolumn","onresizerow","onresizecolumn","onsort","onselection","oncopy","onpaste","onbeforepaste","onmerge","onfocus","onblur","onchangeheader","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","type","name","source","editor","allowEmpty","title","width","align","push","index","method","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","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","getJson","k","newValue","log","stringify","getRowData","rowNumber","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","join","toolbarItem","v","tooltip","a","b","getAttribute","toolbarDropdownOption","open","o","cellName","rowspan","ignoreHistoryAndEvents","test","alert","x1","y1","x2","y2","cell","getIdFromColumnName","updateCell","updateSelection","setHistory","action","getMerge","removeMerge","keepOptions","removeAttribute","info","destroyMerged","isColMerged","cols","isRowMerged","openFilter","columnId","optionsFiltered","paddingLeft","paddingRight","dropdown","autocomplete","opened","position","onclose","resetFilters","getValue","getText","closeFilter","query","updateResult","openEditor","empty","createEditor","getBoundingClientRect","minHeight","split","closeEditor","focus","rect","rectContent","window","innerHeight","bottom","top","image","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","refreshSelection","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","scrollLeft","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","p","sort","valueA","valueB","toLowerCase","updateOrderArrow","updateOrder","updateTableReferences","loadPage","moveRow","ignoreDom","resetSearch","indexOf","nextSibling","splice","insertRow","mixed","numOfRows","lastRow","rowIndex","currentRecords","currentData","currentRows","rowRecords","rowData","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","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","colLabel","rowLabel","tmp","strLabel","str","RegExp","label","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","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","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","header","mergedColspan","mergedRowspan","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","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","complete","instance","parseData","vars","encodeURIComponent","httpRequest","cache","withCredentials","beforeSend","responseText","err","queue","requests","exists","http","message","getWindowWidth","dialog","animation","slideLeft","done","slideRight","slideTop","slideBottom","fadeIn","fadeOut","validRange","startingDay","readonly","today","time","resetButton","placeholder","weekdays","weekdays_short","textDone","textReset","textUpdate","onopen","two","calendarReset","calendarConfirm","calendarControls","calendarContainer","calendarContent","calendarTableContainer","calendarHeaderPrev","calendarLabelYear","calendarLabelMonth","calendarHeaderTitle","calendarHeaderNext","calendarHeaderRow","calendarHeader","calendarBody","calendarFooter","calendarTable","calendarSelectHour","calendarSelectMin","calendarControlsFooter","calendarControlsTime","maxWidth","calendarControlsUpdateButton","calendarControlsUpdate","flexGrow","calendarBackdrop","updateActions","currentDay","querySelector","getDays","update","prev","getYears","next","setLabel","elements","reset","isCurrentMonthAndYear","numberOfDays","firstDay","emptyRow","fontWeight","now","test1","test2","getMonths","fromFormatted","stopPropagation","keyUpControls","documentElement","hasEvents","isOpen","prettify","texts","justNow","xMinutesAgo","xHoursAgo","xDaysAgo","xWeeksAgo","xMonthsAgo","xYearsAgo","d1","d2","prettifyAll","dateOnly","v1","v2","weekday","closeOnChange","palette","backdrop","closeButton","selected","findElement","create","innerWidth","itemContainer","itemText","disabled","itemShortCut","foundId","extractFromDom","remoteSearch","groups","numOfItems","minWidth","containerHeader","newOptions","keyTimer","find","getUrl","setUrl","createItem","textLowerCase","node","appendData","groupNames","groupName","groupArrow","groupContent","getPosition","resetSelected","selectIndex","setCursor","selectItem","currentIndex","rectContainer","setPosition","offsetTop","clientTop","resetCursor","updateCursor","firstVisible","newIndex","numberOfItems","mouseup","onkeydown","changedTouches","offsetWidth","snippet","remoteParser","parseURL","dropZone","dropAsAttachment","acceptImages","acceptFiles","maxFileSize","border","padding","onkeyup","editorTimer","editorAction","overflowY","extractImageFromHtml","addImage","insertNodeAtCaret","newNode","sel","getSelection","rangeCount","getRangeAt","deleteContents","insertNode","setStartAfter","setEndAfter","removeAllRanges","addRange","appendElement","description","host","verifyEditor","thumbsContainer","detectUrl","getDomain","location","hostname","importImage","youtubeParser","parseWebsite","parseContent","youtubeId","encodeURI","json","tagged","users","userId","addPdf","canvas","Image","ctx","getContext","drawImage","toBlob","newImage","files","extension","lastIndexOf","toDataURL","addFile","reader","FileReader","lastModified","readAsDataURL","editorMouseUp","editorMouseDown","editorMouseMove","editorKeyUp","editorKeyDown","editorDragStart","editorDragEnter","editorDragOver","editorDrop","editorPaste","editorBlur","editorFocus","removeRange","originalEvent","nodeName","caretRangeFromPoint","rangeParent","createRange","setStart","rangeOffset","anchorNode","dataTransfer","getDefaultToolbar","startContainer","endContainer","setEnd","links","regExp","queryCommandState","cover","set","form","ignore","currentHash","submitButton","validations","onerror","email","reg","required","load","setElements","validate","getElements","addError","delError","validateElement","validation","getError","setHash","getHash","isChanged","resetTracker","setIgnore","ignoreFlag","confirmationMessage","returnValue","tracker","guid","g","getWindowHeight","evt","MouseEvent","bubbles","cancelable","view","dispatchEvent","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","singleFile","extensionNotAllowed","imageTooSmall","lastmodified","small","addImages","addFromFile","imageFile","srcElement","extentionNotAllowed","addFromUrl","attachmentInput","timer","pieces","valueDecimal","prepare","process","fromKeyCode","input","reverse","_to_ascii","shiftUps","modal","closed","resetPosition","notification","icon","timeout","autoHide","closeable","notificationContainer","notificationHeader","notificationImage","notificationIcon","notificationName","notificationClose","notificationDate","notificationContent","notificationTitle","notificationMessage","notificationTimeout","isVisible","progressbar","bar","rating","slider","currentImage","addFiles","allowAttachment","attachmentIcon","longTouchTimer","mouseDown","mouseUp","sorting","pointer","ondragstart","ondragend","ondrop","dragElement","opacity","hasAttribute","allowCreate","allowChangePosition","oncreate","ondelete","onbeforecreate","onchangeposition","hideHeaders","setBorder","previous","nextNumber","deleteElement","headersItem","contentItem","tags","limit","limitMessage","colors","searchTerms","searchIndex","searchTimer","getSelectionStart","caret","extractTags","isValid","terms","nodeValue","tagsMouseUp","tagsKeyDown","tagsKeyUp","tagsPaste","tagsFocus","tagsBlur","collapse","nodeType","word","anchorOffset","app","badge","toolbarContent","setBadge","rectHeader","dropdownContent","dropdownItem","toolbarIcon","toolbarBadge","toolbarBadgeContent","toolbarTitle","route","pages","onenter"],"mappings":"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","file":"js/chunk-4630a390.de6deecb.js","sourcesContent":["/**\n * jExcel v4.3.0\n *\n * Author: Paul Hodel \n * Website: https://bossanova.uk/jexcel/\n * Description: Create amazing web based spreadsheets.\n *\n * This software is distribute under MIT License\n */\n\n if (! jSuites && typeof(require) === 'function') {\n var jSuites = require('jsuites');\n require('jsuites/dist/jsuites.css');\n}\n\n;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.jexcel = factory();\n}(this, (function () {\n\n 'use strict';\n\n // Jexcel core object\n\n var jexcel = (function(el, options) {\n // Create jexcel object\n var obj = {};\n obj.options = {};\n\n if (! (el instanceof Element || el instanceof HTMLDocument)) {\n console.error('JEXCEL: el is not a valid DOM element');\n return false;\n } else if (el.tagName == 'TABLE') {\n if (options = jexcel.createFromTable(el, options)) {\n var div = document.createElement('div');\n el.parentNode.insertBefore(div, el);\n el.remove();\n el = div;\n } else {\n console.error('JEXCEL: el is not a valid DOM element');\n return false;\n }\n }\n\n // Loading default configuration\n var defaults = {\n // External data\n url:null,\n // Data\n data:null,\n // Copy behavior\n copyCompatibility:false,\n root:null,\n // Rows and columns definitions\n rows:[],\n columns:[],\n // Deprected legacy options\n colHeaders:[],\n colWidths:[],\n colAlignments:[],\n nestedHeaders:null,\n // Column width that is used by default\n defaultColWidth:50,\n defaultColAlign:'center',\n // Spare rows and columns\n minSpareRows:0,\n minSpareCols:0,\n // Minimal table dimensions\n minDimensions:[0,0],\n // Allow Export\n allowExport:true,\n // @type {boolean} - Include the header titles on download\n includeHeadersOnDownload:false,\n // @type {boolean} - Include the header titles on copy\n includeHeadersOnCopy:false,\n // Allow column sorting\n columnSorting:true,\n // Allow column dragging\n columnDrag:false,\n // Allow column resizing\n columnResize:true,\n // Allow row resizing\n rowResize:false,\n // Allow row dragging\n rowDrag:true,\n // Allow table edition\n editable:true,\n // Allow new rows\n allowInsertRow:true,\n // Allow new rows\n allowManualInsertRow:true,\n // Allow new columns\n allowInsertColumn:true,\n // Allow new rows\n allowManualInsertColumn:true,\n // Allow row delete\n allowDeleteRow:true,\n // Allow deleting of all rows\n allowDeletingAllRows:false,\n // Allow column delete\n allowDeleteColumn:true,\n // Allow rename column\n allowRenameColumn:true,\n // Allow comments\n allowComments:false,\n // Global wrap\n wordWrap:false,\n // Image options\n imageOptions: null,\n // CSV source\n csv:null,\n // Filename\n csvFileName:'jexcel',\n // Consider first line as header\n csvHeaders:true,\n // Delimiters\n csvDelimiter:',',\n // First row as header\n parseTableFirstRowAsHeader:false,\n parseTableAutoCellType:false,\n // Disable corner selection\n selectionCopy:true,\n // Merged cells\n mergeCells:{},\n // Create toolbar\n toolbar:null,\n // Allow search\n search:false,\n // Create pagination\n pagination:false,\n paginationOptions:null,\n // Full screen\n fullscreen:false,\n // Lazy loading\n lazyLoading:false,\n loadingSpin:false,\n // Table overflow\n tableOverflow:false,\n tableHeight:'300px',\n tableWidth:null,\n // Meta\n meta: null,\n // Style\n style:null,\n // Execute formulas\n parseFormulas:true,\n autoIncrement:true,\n autoCasting:true,\n // Security\n secureFormulas:true,\n stripHTML:true,\n // Filters\n filters:false,\n footers:null,\n // Event handles\n onundo:null,\n onredo:null,\n onload:null,\n onchange:null,\n onbeforechange:null,\n onafterchanges:null,\n onbeforeinsertrow: null,\n oninsertrow:null,\n onbeforeinsertcolumn: null,\n oninsertcolumn:null,\n onbeforedeleterow:null,\n ondeleterow:null,\n onbeforedeletecolumn:null,\n ondeletecolumn:null,\n onmoverow:null,\n onmovecolumn:null,\n onresizerow:null,\n onresizecolumn:null,\n onsort:null,\n onselection:null,\n oncopy:null,\n onpaste:null,\n onbeforepaste:null,\n onmerge:null,\n onfocus:null,\n onblur:null,\n onchangeheader:null,\n oneditionstart:null,\n oneditionend:null,\n onchangestyle:null,\n onchangemeta:null,\n onchangepage:null,\n onbeforesave:null,\n onsave:null,\n // Global event dispatcher\n onevent:null,\n // Persistance\n persistance:false,\n // Customize any cell behavior\n updateTable:null,\n // Detach the HTML table when calling updateTable\n detachForUpdates: false,\n freezeColumns:null,\n // Texts\n text:{\n noRecordsFound: 'No records found',\n showingPage: 'Showing page {0} of {1} entries',\n show: 'Show ',\n search: 'Search',\n entries: ' entries',\n columnName: 'Column name',\n insertANewColumnBefore: 'Insert a new column before',\n insertANewColumnAfter: 'Insert a new column after',\n deleteSelectedColumns: 'Delete selected columns',\n renameThisColumn: 'Rename this column',\n orderAscending: 'Order ascending',\n orderDescending: 'Order descending',\n insertANewRowBefore: 'Insert a new row before',\n insertANewRowAfter: 'Insert a new row after',\n deleteSelectedRows: 'Delete selected rows',\n editComments: 'Edit comments',\n addComments: 'Add comments',\n comments: 'Comments',\n clearComments: 'Clear comments',\n copy: 'Copy...',\n paste: 'Paste...',\n saveAs: 'Save as...',\n about: 'About',\n areYouSureToDeleteTheSelectedRows: 'Are you sure to delete the selected rows?',\n areYouSureToDeleteTheSelectedColumns: 'Are you sure to delete the selected columns?',\n thisActionWillDestroyAnyExistingMergedCellsAreYouSure: 'This action will destroy any existing merged cells. Are you sure?',\n thisActionWillClearYourSearchResultsAreYouSure: 'This action will clear your search results. Are you sure?',\n thereIsAConflictWithAnotherMergedCell: 'There is a conflict with another merged cell',\n invalidMergeProperties: 'Invalid merged properties',\n cellAlreadyMerged: 'Cell already merged',\n noCellsSelected: 'No cells selected',\n },\n // About message\n about:\"jExcel CE Spreadsheet\\nVersion 4.3.0\\nAuthor: Paul Hodel \\nWebsite: https://bossanova.uk/jexcel/v3\",\n };\n \n // Loading initial configuration from user\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n if (property === 'text') {\n obj.options[property] = defaults[property];\n for (var textKey in options[property]) {\n if (options[property].hasOwnProperty(textKey)){\n obj.options[property][textKey] = options[property][textKey];\n }\n }\n } else {\n obj.options[property] = options[property];\n }\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Global elements\n obj.el = el;\n obj.corner = null;\n obj.contextMenu = null;\n obj.textarea = null;\n obj.ads = null;\n obj.content = null;\n obj.table = null;\n obj.thead = null;\n obj.tbody = null;\n obj.rows = [];\n obj.results = null;\n obj.searchInput = null;\n obj.toolbar = null;\n obj.pagination = null;\n obj.pageNumber = null;\n obj.headerContainer = null;\n obj.colgroupContainer = null;\n \n // Containers\n obj.headers = [];\n obj.records = [];\n obj.history = [];\n obj.formula = [];\n obj.colgroup = [];\n obj.selection = [];\n obj.highlighted = [];\n obj.selectedCell = null;\n obj.selectedContainer = null;\n obj.style = [];\n obj.data = null;\n obj.filter = null;\n obj.filters = [];\n\n // Internal controllers\n obj.cursor = null;\n obj.historyIndex = -1;\n obj.ignoreEvents = false;\n obj.ignoreHistory = false;\n obj.edition = null;\n obj.hashString = null;\n obj.resizing = null;\n obj.dragging = null;\n \n // Lazy loading\n if (obj.options.lazyLoading == true && (obj.options.tableOverflow == false && obj.options.fullscreen == false)) {\n console.error('JEXCEL: The lazyloading only works when tableOverflow = yes or fullscreen = yes');\n obj.options.lazyLoading = false;\n }\n \n /**\n * Activate/Disable fullscreen \n * use programmatically : table.fullscreen(); or table.fullscreen(true); or table.fullscreen(false);\n * @Param {boolean} activate\n */\n obj.fullscreen = function(activate) {\n // If activate not defined, get reverse options.fullscreen\n if (activate == null) {\n activate = ! obj.options.fullscreen;\n }\n \n // If change\n if (obj.options.fullscreen != activate) {\n obj.options.fullscreen = activate;\n \n // Test LazyLoading conflict\n if (activate == true) {\n el.classList.add('fullscreen');\n } else {\n el.classList.remove('fullscreen');\n }\n } \n }\n\n /**\n * Trigger events\n */\n obj.dispatch = function(event) {\n // Dispatch events\n if (! obj.ignoreEvents) {\n // Call global event\n if (typeof(obj.options.onevent) == 'function') {\n var ret = obj.options.onevent.apply(this, arguments);\n }\n // Call specific events\n if (typeof(obj.options[event]) == 'function') {\n var ret = obj.options[event].apply(this, Array.prototype.slice.call(arguments, 1));\n }\n }\n\n // Persistance\n if (event == 'onafterchanges' && obj.options.persistance) {\n var url = obj.options.persistance == true ? obj.options.url : obj.options.persistance;\n var data = obj.prepareJson(arguments[2]);\n obj.save(url, data);\n }\n\n return ret;\n }\n\n /**\n * Prepare the jexcel table\n * \n * @Param config\n */\n obj.prepareTable = function() {\n // Loading initial data from remote sources\n var results = [];\n \n // Number of columns\n var size = obj.options.columns.length;\n \n if (obj.options.data && typeof(obj.options.data[0]) !== 'undefined') {\n // Data keys\n var keys = Object.keys(obj.options.data[0]);\n \n if (keys.length > size) {\n size = keys.length;\n }\n }\n \n // Minimal dimensions\n if (obj.options.minDimensions[0] > size) {\n size = obj.options.minDimensions[0];\n }\n \n // Requests\n var multiple = [];\n \n // Preparations\n for (var i = 0; i < size; i++) {\n // Deprected options. You should use only columns\n if (! obj.options.colHeaders[i]) {\n obj.options.colHeaders[i] = '';\n }\n if (! obj.options.colWidths[i]) {\n obj.options.colWidths[i] = obj.options.defaultColWidth;\n }\n if (! obj.options.colAlignments[i]) {\n obj.options.colAlignments[i] = obj.options.defaultColAlign;\n }\n \n // Default column description\n if (! obj.options.columns[i]) {\n obj.options.columns[i] = { type:'text' };\n } else if (! obj.options.columns[i].type) {\n obj.options.columns[i].type = 'text';\n }\n if (! obj.options.columns[i].name) {\n obj.options.columns[i].name = keys && keys[i] ? keys[i] : i;\n }\n if (! obj.options.columns[i].source) {\n obj.options.columns[i].source = [];\n }\n if (! obj.options.columns[i].options) {\n obj.options.columns[i].options = [];\n }\n if (! obj.options.columns[i].editor) {\n obj.options.columns[i].editor = null;\n }\n if (! obj.options.columns[i].allowEmpty) {\n obj.options.columns[i].allowEmpty = false;\n }\n if (! obj.options.columns[i].title) {\n obj.options.columns[i].title = obj.options.colHeaders[i] ? obj.options.colHeaders[i] : '';\n }\n if (! obj.options.columns[i].width) {\n obj.options.columns[i].width = obj.options.colWidths[i] ? obj.options.colWidths[i] : obj.options.defaultColWidth;\n }\n if (! obj.options.columns[i].align) {\n obj.options.columns[i].align = obj.options.colAlignments[i] ? obj.options.colAlignments[i] : 'center';\n }\n \n // Pre-load initial source for json autocomplete\n if (obj.options.columns[i].type == 'autocomplete' || obj.options.columns[i].type == 'dropdown') {\n // if remote content\n if (obj.options.columns[i].url) {\n multiple.push({\n url: obj.options.columns[i].url,\n index: i,\n method: 'GET',\n dataType: 'json',\n success: function(data) {\n var source = [];\n for (var i = 0; i < data.length; i++) {\n obj.options.columns[this.index].source.push(data[i]);\n }\n }\n });\n }\n } else if (obj.options.columns[i].type == 'calendar') {\n // Default format for date columns\n if (! obj.options.columns[i].options.format) {\n obj.options.columns[i].options.format = 'DD/MM/YYYY';\n }\n }\n }\n \n // Create the table when is ready\r\n if (! multiple.length) {\n obj.createTable();\n } else {\r\n jSuites.ajax(multiple, function() {\r\n obj.createTable();\r\n });\r\n }\n }\n \n obj.createTable = function() {\n // Elements\n obj.table = document.createElement('table');\n obj.thead = document.createElement('thead');\n obj.tbody = document.createElement('tbody');\n\n // Create headers controllers\n obj.headers = [];\n obj.colgroup = [];\n \n // Create table container\n obj.content = document.createElement('div');\n obj.content.classList.add('jexcel_content');\n obj.content.onscroll = function(e) {\n obj.scrollControls(e);\n }\n obj.content.onwheel = function(e) {\n obj.wheelControls(e);\n }\n\n // Create toolbar object\n obj.toolbar = document.createElement('div');\n obj.toolbar.classList.add('jexcel_toolbar');\n \n // Search\n var searchContainer = document.createElement('div');\n var searchText = document.createTextNode((obj.options.text.search) + ': ');\n obj.searchInput = document.createElement('input');\n obj.searchInput.classList.add('jexcel_search');\n searchContainer.appendChild(searchText);\n searchContainer.appendChild(obj.searchInput);\n obj.searchInput.onfocus = function() {\n obj.resetSelection();\n }\n \n // Pagination select option\n var paginationUpdateContainer = document.createElement('div');\n \n if (obj.options.pagination > 0 && obj.options.paginationOptions && obj.options.paginationOptions.length > 0) {\n obj.paginationDropdown = document.createElement('select');\n obj.paginationDropdown.classList.add('jexcel_pagination_dropdown');\n obj.paginationDropdown.onchange = function() {\n obj.options.pagination = parseInt(this.value);\n obj.page(0);\n }\n \n for (var i = 0; i < obj.options.paginationOptions.length; i++) {\n var temp = document.createElement('option');\n temp.value = obj.options.paginationOptions[i];\n temp.innerHTML = obj.options.paginationOptions[i];\n obj.paginationDropdown.appendChild(temp);\n }\n \n paginationUpdateContainer.appendChild(document.createTextNode(obj.options.text.show));\n paginationUpdateContainer.appendChild(obj.paginationDropdown);\n paginationUpdateContainer.appendChild(document.createTextNode(obj.options.text.entries));\n }\n \n // Filter and pagination container\n var filter = document.createElement('div');\n filter.classList.add('jexcel_filter');\n filter.appendChild(paginationUpdateContainer);\n filter.appendChild(searchContainer);\n \n // Colsgroup\n obj.colgroupContainer = document.createElement('colgroup');\n var tempCol = document.createElement('col');\n tempCol.setAttribute('width', '50');\n obj.colgroupContainer.appendChild(tempCol);\n \n // Nested\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0) {\n // Flexible way to handle nestedheaders\n if (obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\n for (var j = 0; j < obj.options.nestedHeaders.length; j++) {\n obj.thead.appendChild(obj.createNestedHeader(obj.options.nestedHeaders[j]));\n }\n } else {\n obj.thead.appendChild(obj.createNestedHeader(obj.options.nestedHeaders));\n }\n }\n \n // Row\n obj.headerContainer = document.createElement('tr');\n var tempCol = document.createElement('td');\n tempCol.classList.add('jexcel_selectall');\n obj.headerContainer.appendChild(tempCol);\n \n for (var i = 0; i < obj.options.columns.length; i++) {\n // Create header\n obj.createCellHeader(i);\n // Append cell to the container\n obj.headerContainer.appendChild(obj.headers[i]);\n obj.colgroupContainer.appendChild(obj.colgroup[i]);\n }\n\n obj.thead.appendChild(obj.headerContainer);\n\n // Filters\n if (obj.options.filters == true) {\n obj.filter = document.createElement('tr');\n var td = document.createElement('td');\n obj.filter.appendChild(td);\n\n for (var i = 0; i < obj.options.columns.length; i++) {\n var td = document.createElement('td');\n td.innerHTML = ' ';\n td.setAttribute('data-x', i);\n td.className = 'jexcel_column_filter';\n obj.filter.appendChild(td);\n }\n\n obj.thead.appendChild(obj.filter);\n }\n\n // Content table\n obj.table = document.createElement('table');\n obj.table.classList.add('jexcel');\n obj.table.setAttribute('cellpadding', '0');\n obj.table.setAttribute('cellspacing', '0');\n obj.table.setAttribute('unselectable', 'yes');\n //obj.table.setAttribute('onselectstart', 'return false');\n obj.table.appendChild(obj.colgroupContainer);\n obj.table.appendChild(obj.thead);\n obj.table.appendChild(obj.tbody);\n\n // Spreadsheet corner\n obj.corner = document.createElement('div');\n obj.corner.className = 'jexcel_corner';\n obj.corner.setAttribute('unselectable', 'on');\n obj.corner.setAttribute('onselectstart', 'return false');\n \n if (obj.options.selectionCopy == false) {\n obj.corner.style.display = 'none';\n }\n \n // Textarea helper\n obj.textarea = document.createElement('textarea');\n obj.textarea.className = 'jexcel_textarea';\n obj.textarea.id = 'jexcel_textarea';\n obj.textarea.tabIndex = '-1';\n\n // Contextmenu container\n obj.contextMenu = document.createElement('div');\n obj.contextMenu.className = 'jexcel_contextmenu';\n \n // Create element\n jSuites.contextmenu(obj.contextMenu, {\n onclick:function() {\n obj.contextMenu.contextmenu.close(false);\n }\n });\n \n // Powered by jExcel\n var ads = document.createElement('a');\n ads.setAttribute('href', 'https://bossanova.uk/jexcel/');\n obj.ads = document.createElement('div');\n obj.ads.className = 'jexcel_about';\n try {\n if (typeof(sessionStorage) !== \"undefined\" && ! sessionStorage.getItem('jexcel')) {\n sessionStorage.setItem('jexcel', true);\n var img = document.createElement('img');\n img.src = '//bossanova.uk/jexcel/logo.png';\n ads.appendChild(img);\n }\n } catch (exception) {\n }\n var span = document.createElement('span');\n span.innerHTML = 'Jexcel spreadsheet';\n ads.appendChild(span);\n obj.ads.appendChild(ads);\n\n // Create table container TODO: frozen columns\n var container = document.createElement('div');\n container.classList.add('jexcel_table');\n \n // Pagination\n obj.pagination = document.createElement('div');\n obj.pagination.classList.add('jexcel_pagination');\n var paginationInfo = document.createElement('div');\n var paginationPages = document.createElement('div');\n obj.pagination.appendChild(paginationInfo);\n obj.pagination.appendChild(paginationPages);\n\n // Hide pagination if not in use\n if (! obj.options.pagination) {\n obj.pagination.style.display = 'none';\n }\n\n // Append containers to the table\n if (obj.options.search == true) {\n el.appendChild(filter);\n }\n \n // Elements\n obj.content.appendChild(obj.table);\n obj.content.appendChild(obj.corner);\n obj.content.appendChild(obj.textarea);\n \n el.appendChild(obj.toolbar);\n el.appendChild(obj.content);\n el.appendChild(obj.pagination);\n el.appendChild(obj.contextMenu);\n el.appendChild(obj.ads);\n el.classList.add('jexcel_container');\n \n // Create toolbar\n if (obj.options.toolbar && obj.options.toolbar.length) {\n obj.createToolbar();\n }\n \n // Fullscreen\n if (obj.options.fullscreen == true) {\n el.classList.add('fullscreen');\n } else {\n // Overflow\n if (obj.options.tableOverflow == true) {\n if (obj.options.tableHeight) {\n obj.content.style['overflow-y'] = 'auto';\n obj.content.style.maxHeight = obj.options.tableHeight;\n }\n if (obj.options.tableWidth) {\n obj.content.style['overflow-x'] = 'auto';\n obj.content.style.width = obj.options.tableWidth;\n }\n }\n }\n \n // With toolbars\n if (obj.options.tableOverflow != true && obj.options.toolbar) {\n el.classList.add('with-toolbar');\n }\n \n // Actions\n if (obj.options.columnDrag == true) {\n obj.thead.classList.add('draggable');\n }\n if (obj.options.columnResize == true) {\n obj.thead.classList.add('resizable');\n }\n if (obj.options.rowDrag == true) {\n obj.tbody.classList.add('draggable');\n }\n if (obj.options.rowResize == true) {\n obj.tbody.classList.add('resizable');\n }\n \n // Load data\n obj.setData();\n \n // Style\n if (obj.options.style) {\n obj.setStyle(obj.options.style, null, null, 1, 1);\n }\n }\n\n /**\n * Refresh the data\n * \n * @return void\n */\n obj.refresh = function() {\n if (obj.options.url) {\n // Loading\n if (obj.options.loadingSpin == true) {\n jSuites.loading.show();\n }\n \n jSuites.ajax({\n url: obj.options.url,\n method: 'GET',\n dataType: 'json',\n success: function(result) {\n // Data\n obj.options.data = (result.data) ? result.data : result;\n // Prepare table\n obj.setData();\n // Hide spin\n if (obj.options.loadingSpin == true) {\n jSuites.loading.hide();\n }\n }\n });\n } else {\n obj.setData();\n }\n }\n\n /**\n * Set data\n * \n * @param array data In case no data is sent, default is reloaded\n * @return void\n */\n obj.setData = function(data) {\n // Update data\n if (data) {\n if (typeof(data) == 'string') {\n data = JSON.parse(data);\n }\n \n obj.options.data = data;\n }\n \n // Data\n if (! obj.options.data) {\n obj.options.data = [];\n }\n \n // Prepare data\n if (obj.options.data && obj.options.data[0]) {\n if (! Array.isArray(obj.options.data[0])) {\n var data = [];\n for (var j = 0; j < obj.options.data.length; j++) {\n var row = [];\n for (var i = 0; i < obj.options.columns.length; i++) {\n row[i] = obj.options.data[j][obj.options.columns[i].name];\n }\n data.push(row);\n }\n\n obj.options.data = data;\n }\n }\n\n // Adjust minimal dimensions\n var j = 0;\n var i = 0;\n var size_i = obj.options.columns.length;\n var size_j = obj.options.data.length;\n var min_i = obj.options.minDimensions[0];\n var min_j = obj.options.minDimensions[1];\n var max_i = min_i > size_i ? min_i : size_i;\n var max_j = min_j > size_j ? min_j : size_j;\n \n for (j = 0; j < max_j; j++) {\n for (i = 0; i < max_i; i++) {\n if (obj.options.data[j] == undefined) {\n obj.options.data[j] = [];\n }\n \n if (obj.options.data[j][i] == undefined) {\n obj.options.data[j][i] = '';\n }\n }\n }\n \n // Reset containers\n obj.rows = [];\n obj.results = null;\n obj.records = [];\n obj.history = [];\n \n // Reset internal controllers\n obj.historyIndex = -1;\n \n // Reset data\n obj.tbody.innerHTML = '';\n \n // Lazy loading\n if (obj.options.lazyLoading == true) {\n // Load only 100 records\n var startNumber = 0\n var finalNumber = obj.options.data.length < 100 ? obj.options.data.length : 100;\n \n if (obj.options.pagination) {\n obj.options.pagination = false;\n console.error('JEXCEL: Pagination will be disable due the lazyLoading');\n }\n } else if (obj.options.pagination) {\n // Pagination\n if (! obj.pageNumber) {\n obj.pageNumber = 0;\n }\n var quantityPerPage = obj.options.pagination;\n startNumber = (obj.options.pagination * obj.pageNumber);\n finalNumber = (obj.options.pagination * obj.pageNumber) + obj.options.pagination;\n \n if (obj.options.data.length < finalNumber) {\n finalNumber = obj.options.data.length;\n }\n } else {\n var startNumber = 0;\n var finalNumber = obj.options.data.length;\n }\n \n // Append nodes to the HTML\n for (j = 0; j < obj.options.data.length; j++) {\n // Create row\n var tr = obj.createRow(j, obj.options.data[j]);\n // Append line to the table\n if (j >= startNumber && j < finalNumber) {\n obj.tbody.appendChild(tr);\n }\n }\n \n if (obj.options.lazyLoading == true) {\n // Do not create pagination with lazyloading activated\n } else if (obj.options.pagination) {\n obj.updatePagination();\n }\n \n // Merge cells\n if (obj.options.mergeCells) {\n var keys = Object.keys(obj.options.mergeCells);\n for (var i = 0; i < keys.length; i++) {\n var num = obj.options.mergeCells[keys[i]];\n obj.setMerge(keys[i], num[0], num[1], 1);\n }\n }\n\n // Updata table with custom configurations if applicable\n obj.updateTable();\n\n // Onload\n obj.dispatch('onload', el, obj);\n }\n\n /**\n * Get the whole table data\n * \n * @param bool get highlighted cells only\n * @return array data\n */\n obj.getData = function(highlighted, dataOnly) {\n // Control vars\n var dataset = [];\n var px = 0;\n var py = 0;\n\n // Data type\n var dataType = dataOnly == true || obj.options.copyCompatibility == false ? true : false;\n\n // Column and row length\n var x = obj.options.columns.length\n var y = obj.options.data.length\n \n // Go through the columns to get the data\n for (var j = 0; j < y; j++) {\n px = 0;\n for (var i = 0; i < x; i++) {\n // Cell selected or fullset\n if (! highlighted || obj.records[j][i].classList.contains('highlight')) {\n // Get value\n if (! dataset[py]) {\n dataset[py] = [];\n }\n if (! dataType) {\n dataset[py][px] = obj.records[j][i].innerHTML;\n } else {\n dataset[py][px] = obj.options.data[j][i];\n }\n px++;\n }\n }\n if (px > 0) {\n py++;\n }\n }\n \n return dataset;\n }\n \n /**\n * Get the whole table data\n * \n * @param integer row number\n * @return string value\n */\n obj.getJson = function(highlighted) {\n // Control vars\n var data = [];\n \n // Column and row length\n var x = obj.options.columns.length\n var y = obj.options.data.length\n \n // Go through the columns to get the data\n for (var j = 0; j < y; j++) {\n var row = null;\n for (var i = 0; i < x; i++) {\n if (! highlighted || obj.records[j][i].classList.contains('highlight')) {\n if (row == null) {\n row = {};\n }\n if (! obj.options.columns[i].name) {\n obj.options.columns[i].name = i;\n }\n row[obj.options.columns[i].name] = obj.options.data[j][i];\n }\n }\n \n if (row != null) {\n data.push(row);\n }\n }\n \n return data;\n }\n\n /**\n * Prepare JSON in the correct format\n */\n obj.prepareJson = function(data) {\n var rows = [];\n for (var i = 0; i < data.length; i++) {\n var x = data[i].x;\n var y = data[i].y;\n var k = obj.options.columns[x].name ? obj.options.columns[x].name : x;\n\n // Create row\n if (! rows[y]) {\n rows[y] = {\n row: y,\n data: {},\n };\n }\n rows[y].data[k] = data[i].newValue;\n }\n\n // Filter rows\n return rows.filter(function (el) {\n return el != null;\n });\n }\n\n /**\n * Post json to a remote server\n */\n obj.save = function(url, data) {\n // Parse anything in the data before sending to the server\n var ret = obj.dispatch('onbeforesave', el, obj, data);\nconsole.log(ret);\n if (ret) {\n var data = ret;\n } else {\n if (ret === false) {\n return false;\n }\n }\n\n // Remove update\n jSuites.ajax({\n url: url,\n method: 'POST',\n dataType: 'json',\n data: { data: JSON.stringify(data) },\n success: function(result) {\n // Event\n obj.dispatch('onsave', el, obj, data);\n }\n });\n }\n\n /**\n * Get a row data by rowNumber\n */\n obj.getRowData = function(rowNumber) {\n return obj.options.data[rowNumber];\n }\n \n /**\n * Set a row data by rowNumber\n */\n obj.setRowData = function(rowNumber, data) {\n for (var i = 0; i < obj.headers.length; i++) {\n // Update cell\n var columnName = jexcel.getColumnNameFromId([ i, rowNumber ]);\n // Set value\n if (data[i] != null) {\n obj.setValue(columnName, data[i]);\n }\n }\n }\n \n /**\n * Get a column data by columnNumber\n */\n obj.getColumnData = function(columnNumber) {\n var dataset = [];\n // Go through the rows to get the data\n for (var j = 0; j < obj.options.data.length; j++) {\n dataset.push(obj.options.data[j][columnNumber]);\n }\n return dataset;\n }\n \n /**\n * Set a column data by colNumber\n */\n obj.setColumnData = function(colNumber, data) {\n for (var j = 0; j < obj.rows.length; j++) {\n // Update cell\n var columnName = jexcel.getColumnNameFromId([ colNumber, j ]);\n // Set value\n if (data[j] != null) {\n obj.setValue(columnName, data[j]);\n }\n }\n }\n \n /**\n * Create row\n */\n obj.createRow = function(j, data) {\n // Create container\n if (! obj.records[j]) {\n obj.records[j] = [];\n }\n // Default data\n if (! data) {\n var data = obj.options.data[j];\n }\n // New line of data to be append in the table\n obj.rows[j] = document.createElement('tr');\n obj.rows[j].setAttribute('data-y', j);\n // Definitions\n if (obj.options.rows[j]) {\n if (obj.options.rows[j].height) {\n obj.rows[j].style.height = obj.options.rows[j].height;\n }\n }\n // Row number label\n var td = document.createElement('td');\n td.innerHTML = parseInt(j + 1);\n td.setAttribute('data-y', j);\n td.className = 'jexcel_row';\n obj.rows[j].appendChild(td);\n \n // Data columns\n for (var i = 0; i < obj.options.columns.length; i++) {\n // New column of data to be append in the line\n obj.records[j][i] = obj.createCell(i, j, data[i]);\n // Add column to the row\n obj.rows[j].appendChild(obj.records[j][i]);\n }\n \n // Add row to the table body\n return obj.rows[j];\n }\n \n obj.parseValue = function(i, j, value) {\n if ((''+value).substr(0,1) == '=' && obj.options.parseFormulas == true) {\n value = obj.executeFormula(value, i, j)\n }\n if (obj.options.columns[i].mask) {\n var decimal = obj.options.columns[i].decimal || '.';\n value = '' + jSuites.mask.run(value, obj.options.columns[i].mask, decimal);\n }\n\n return value;\n }\n\n /**\n * Create cell\n */\n obj.createCell = function(i, j, value) {\n // Create cell and properties\n var td = document.createElement('td');\n td.setAttribute('data-x', i);\n td.setAttribute('data-y', j);\n\n // Security\n if ((''+value).substr(0,1) == '=' && obj.options.secureFormulas == true) {\n var val = secureFormula(value);\n if (val != value) {\n // Update the data container\n value = val;\n }\n }\n\n // Custom column\n if (obj.options.columns[i].editor) {\n if (obj.options.stripHTML === false || obj.options.columns[i].stripHTML === false) {\r\n td.innerHTML = value;\n } else {\r\n td.innerText = value;\r\n }\n if (typeof(obj.options.columns[i].editor.createCell) == 'function') {\n td = obj.options.columns[i].editor.createCell(td);\n }\n } else {\n // Hidden column\n if (obj.options.columns[i].type == 'hidden') {\n td.style.display = 'none';\n td.innerText = value;\n } else if (obj.options.columns[i].type == 'checkbox' || obj.options.columns[i].type == 'radio') {\n // Create input\n var element = document.createElement('input');\n element.type = obj.options.columns[i].type;\n element.name = 'c' + i;\n element.checked = (value == 1 || value == true || value == 'true') ? true : false;\n element.onclick = function() {\n obj.setValue(td, this.checked);\n }\n\n if (obj.options.columns[i].readOnly == true || obj.options.editable == false) {\n element.setAttribute('disabled', 'disabled');\n }\n\n // Append to the table\n td.appendChild(element);\n // Make sure the values are correct\n obj.options.data[j][i] = element.checked;\n } else if (obj.options.columns[i].type == 'calendar') {\n // Try formatted date\n var formatted = jSuites.calendar.extractDateFromString(value, obj.options.columns[i].options.format);\n // Create calendar cell\n td.innerText = jSuites.calendar.getDateString(formatted ? formatted : value, obj.options.columns[i].options.format);\n } else if (obj.options.columns[i].type == 'dropdown' || obj.options.columns[i].type == 'autocomplete') {\n // Create dropdown cell\n td.classList.add('jexcel_dropdown');\n td.innerText = obj.getDropDownValue(i, value);\n } else if (obj.options.columns[i].type == 'color') {\n if (obj.options.columns[i].render == 'square') {\n var color = document.createElement('div');\n color.className = 'color';\n color.style.backgroundColor = value;\n td.appendChild(color);\n } else {\n td.style.color = value;\n td.innerText = value;\n }\n } else if (obj.options.columns[i].type == 'image') {\n if (value && value.substr(0, 10) == 'data:image') {\n var img = document.createElement('img');\n img.src = value;\n td.appendChild(img);\n }\n } else {\n if (obj.options.columns[i].type == 'html') {\n td.innerHTML = stripScript(obj.parseValue(i, j, value));\n } else {\n if (obj.options.stripHTML === false || obj.options.columns[i].stripHTML === false) {\r\n td.innerHTML = stripScript(obj.parseValue(i, j, value));\n } else {\r\n td.innerText = obj.parseValue(i, j, value);\r\n }\n }\n }\n }\n \n // Readonly\n if (obj.options.columns[i].readOnly == true) {\n td.className = 'readonly';\n }\n \n // Text align\n var colAlign = obj.options.columns[i].align ? obj.options.columns[i].align : 'center';\n td.style.textAlign = colAlign;\n \n // Wrap option\n if (obj.options.columns[i].wordWrap != false && (obj.options.wordWrap == true || obj.options.columns[i].wordWrap == true || td.innerHTML.length > 200)) {\n td.style.whiteSpace = 'pre-wrap';\n }\n \n // Overflow\n if (i > 0) {\n if (value || td.innerHTML) {\n obj.records[j][i-1].style.overflow = 'hidden';\n } else {\n if (i == obj.options.columns.length - 1) {\n td.style.overflow = 'hidden';\n }\n }\n }\n \n return td;\n }\n \n obj.createCellHeader = function(colNumber) {\n // Create col global control\n var colWidth = obj.options.columns[colNumber].width ? obj.options.columns[colNumber].width : obj.options.defaultColWidth;\n var colAlign = obj.options.columns[colNumber].align ? obj.options.columns[colNumber].align : obj.options.defaultColAlign;\n \n // Create header cell\n obj.headers[colNumber] = document.createElement('td');\n obj.headers[colNumber].innerText = obj.options.columns[colNumber].title ? obj.options.columns[colNumber].title : jexcel.getColumnName(colNumber);\n obj.headers[colNumber].setAttribute('data-x', colNumber);\n obj.headers[colNumber].style.textAlign = colAlign;\n if (obj.options.columns[colNumber].title) {\n obj.headers[colNumber].setAttribute('title', obj.options.columns[colNumber].title);\n }\n \n // Width control\n obj.colgroup[colNumber] = document.createElement('col');\n obj.colgroup[colNumber].setAttribute('width', colWidth);\n \n // Hidden column\n if (obj.options.columns[colNumber].type == 'hidden') {\n obj.headers[colNumber].style.display = 'none';\n obj.colgroup[colNumber].style.display = 'none';\n }\n }\n\n /**\n * Update a nested header title\n */\n obj.updateNestedHeader = function(x, y, title) {\n if (obj.options.nestedHeaders[y][x].title) {\n obj.options.nestedHeaders[y][x].title = title;\n obj.options.nestedHeaders[y].element.children[x+1].innerText = title;\n }\n }\n\n /**\n * Create a nested header object\n */\n obj.createNestedHeader = function(nestedInformation) {\n var tr = document.createElement('tr');\n tr.classList.add('jexcel_nested');\n var td = document.createElement('td');\n tr.appendChild(td);\n // Element\n nestedInformation.element = tr;\n \n var headerIndex = 0;\n for (var i = 0; i < nestedInformation.length; i++) {\n // Default values\n if (! nestedInformation[i].colspan) {\n nestedInformation[i].colspan = 1;\n }\n if (! nestedInformation[i].align) {\n nestedInformation[i].align = 'center';\n }\n if (! nestedInformation[i].title) {\n nestedInformation[i].title = '';\n }\n \n // Number of columns\n var numberOfColumns = nestedInformation[i].colspan;\n \n // Classes container\n var column = [];\n // Header classes for this cell\n for (var x = 0; x < numberOfColumns; x++) {\n if (obj.options.columns[headerIndex] && obj.options.columns[headerIndex].type == 'hidden') {\n numberOfColumns++;\n }\n column.push(headerIndex);\n headerIndex++;\n }\n \n // Created the nested cell\n var td = document.createElement('td');\n td.setAttribute('data-column', column.join(','));\n td.setAttribute('colspan', nestedInformation[i].colspan);\n td.setAttribute('align', nestedInformation[i].align);\n td.innerText = nestedInformation[i].title;\n tr.appendChild(td);\n }\n \n return tr;\n }\n \n /**\n * Create toolbar\n */\n obj.createToolbar = function(toolbar) {\n if (toolbar) {\n obj.options.toolbar = toolbar;\n } else {\n var toolbar = obj.options.toolbar;\n }\n \n for (var i = 0; i < toolbar.length; i++) {\n if (toolbar[i].type == 'i') {\n var toolbarItem = document.createElement('i');\n toolbarItem.classList.add('jexcel_toolbar_item');\n toolbarItem.classList.add('material-icons');\n toolbarItem.setAttribute('data-k', toolbar[i].k);\n toolbarItem.setAttribute('data-v', toolbar[i].v);\n // Tooltip\n if (toolbar[i].tooltip) {\n toolbarItem.setAttribute('title', toolbar[i].tooltip);\n }\n // Handle click\n if (toolbar[i].onclick && typeof(toolbar[i].onclick)) {\n toolbarItem.onclick = (function (a) {\n var b = a;\n return function () {\n toolbar[b].onclick(el, obj, this);\n };\n })(i);\n } else {\n toolbarItem.onclick = function() {\n var k = this.getAttribute('data-k');\n var v = this.getAttribute('data-v');\n obj.setStyle(obj.highlighted, k, v);\n }\n }\n // Append element\n toolbarItem.innerText = toolbar[i].content;\n obj.toolbar.appendChild(toolbarItem);\n } else if (toolbar[i].type == 'select') {\n var toolbarItem = document.createElement('select');\n toolbarItem.classList.add('jexcel_toolbar_item');\n toolbarItem.setAttribute('data-k', toolbar[i].k);\n // Tooltip\n if (toolbar[i].tooltip) {\n toolbarItem.setAttribute('title', toolbar[i].tooltip);\n }\n // Handle onchange\n if (toolbar[i].onchange && typeof(toolbar[i].onchange)) {\n toolbarItem.onchange = toolbar[i].onchange;\n } else {\n toolbarItem.onchange = function() {\n var k = this.getAttribute('data-k');\n obj.setStyle(obj.highlighted, k, this.value);\n }\n }\n // Add options to the dropdown\n for(var j = 0; j < toolbar[i].v.length; j++) {\n var toolbarDropdownOption = document.createElement('option');\n toolbarDropdownOption.value = toolbar[i].v[j];\n toolbarDropdownOption.innerText = toolbar[i].v[j];\n toolbarItem.appendChild(toolbarDropdownOption);\n }\n obj.toolbar.appendChild(toolbarItem);\n } else if (toolbar[i].type == 'color') {\n var toolbarItem = document.createElement('i');\n toolbarItem.classList.add('jexcel_toolbar_item');\n toolbarItem.classList.add('material-icons');\n toolbarItem.setAttribute('data-k', toolbar[i].k);\n toolbarItem.setAttribute('data-v', '');\n // Tooltip\n if (toolbar[i].tooltip) {\n toolbarItem.setAttribute('title', toolbar[i].tooltip);\n }\n obj.toolbar.appendChild(toolbarItem);\n toolbarItem.onclick = function() {\n this.color.open();\n }\n toolbarItem.innerText = toolbar[i].content;\n jSuites.color(toolbarItem, {\n onchange:function(o, v) {\n var k = o.getAttribute('data-k');\n obj.setStyle(obj.highlighted, k, v);\n }\n });\n }\n }\n }\n \n /**\n * Merge cells\n * @param cellName\n * @param colspan\n * @param rowspan\n * @param ignoreHistoryAndEvents\n */\n obj.setMerge = function(cellName, colspan, rowspan, ignoreHistoryAndEvents) {\n var test = false;\n \n if (! cellName) {\n if (! obj.highlighted.length) {\n alert(obj.options.text.noCellsSelected);\n return null;\n } else {\n var x1 = parseInt(obj.highlighted[0].getAttribute('data-x'));\n var y1 = parseInt(obj.highlighted[0].getAttribute('data-y'));\n var x2 = parseInt(obj.highlighted[obj.highlighted.length-1].getAttribute('data-x'));\n var y2 = parseInt(obj.highlighted[obj.highlighted.length-1].getAttribute('data-y'));\n var cellName = jexcel.getColumnNameFromId([ x1, y1 ]);\n var colspan = (x2 - x1) + 1;\n var rowspan = (y2 - y1) + 1;\n }\n }\n \n var cell = jexcel.getIdFromColumnName(cellName, true);\n \n if (obj.options.mergeCells[cellName]) {\n if (obj.records[cell[1]][cell[0]].getAttribute('data-merged')) {\n test = obj.options.text.cellAlreadyMerged;\n }\n } else if ((! colspan || colspan < 2) && (! rowspan || rowspan < 2)) {\n test = obj.options.text.invalidMergeProperties;\n } else {\n var cells = [];\n for (var j = cell[1]; j < cell[1] + rowspan; j++) {\n for (var i = cell[0]; i < cell[0] + colspan; i++) {\n var columnName = jexcel.getColumnNameFromId([i, j]);\n if (obj.records[j][i].getAttribute('data-merged')) {\n test = obj.options.text.thereIsAConflictWithAnotherMergedCell;\n }\n }\n }\n }\n \n if (test) {\n alert(test);\n } else {\n // Add property\n if (colspan > 1) {\n obj.records[cell[1]][cell[0]].setAttribute('colspan', colspan);\n } else {\n colspan = 1;\n }\n if (rowspan > 1) {\n obj.records[cell[1]][cell[0]].setAttribute('rowspan', rowspan);\n } else {\n rowspan = 1;\n }\n // Keep links to the existing nodes\n obj.options.mergeCells[cellName] = [ colspan, rowspan, [] ];\n // Mark cell as merged\n obj.records[cell[1]][cell[0]].setAttribute('data-merged', 'true');\n // Overflow\n obj.records[cell[1]][cell[0]].style.overflow = 'hidden';\n // History data\n var data = [];\n // Adjust the nodes\n for (var y = cell[1]; y < cell[1] + rowspan; y++) {\n for (var x = cell[0]; x < cell[0] + colspan; x++) {\n if (! (cell[0] == x && cell[1] == y)) {\n data.push(obj.options.data[y][x]);\n obj.updateCell(x, y, '', true);\n obj.options.mergeCells[cellName][2].push(obj.records[y][x]);\n obj.records[y][x].style.display = 'none';\n obj.records[y][x] = obj.records[cell[1]][cell[0]];\n }\n }\n }\n // In the initialization is not necessary keep the history\n obj.updateSelection(obj.records[cell[1]][cell[0]]);\n \n if (! ignoreHistoryAndEvents) {\n obj.setHistory({\n action:'setMerge',\n column:cellName,\n colspan:colspan,\n rowspan:rowspan,\n data:data,\n });\n \n obj.dispatch('onmerge', el, cellName, colspan, rowspan);\n }\n }\n }\n \n /**\n * Merge cells\n * @param cellName\n * @param colspan\n * @param rowspan\n * @param ignoreHistoryAndEvents\n */\n obj.getMerge = function(cellName) {\n var data = {};\n if (cellName) {\n if (obj.options.mergeCells[cellName]) {\n data = [ obj.options.mergeCells[cellName][0], obj.options.mergeCells[cellName][1] ];\n } else {\n data = null;\n }\n } else {\n if (obj.options.mergeCells) {\n var mergedCells = obj.options.mergeCells;\n var keys = Object.keys(obj.options.mergeCells);\n for (var i = 0; i < keys.length; i++) {\n data[keys[i]] = [ obj.options.mergeCells[keys[i]][0], obj.options.mergeCells[keys[i]][1] ];\n }\n }\n }\n \n return data;\n }\n \n /**\n * Remove merge by cellname\n * @param cellName\n */\n obj.removeMerge = function(cellName, data, keepOptions) {\n if (obj.options.mergeCells[cellName]) {\n var cell = jexcel.getIdFromColumnName(cellName, true);\n obj.records[cell[1]][cell[0]].removeAttribute('colspan');\n obj.records[cell[1]][cell[0]].removeAttribute('rowspan');\n obj.records[cell[1]][cell[0]].removeAttribute('data-merged');\n var info = obj.options.mergeCells[cellName];\n \n var index = 0;\n for (var j = 0; j < info[1]; j++) {\n for (var i = 0; i < info[0]; i++) {\n if (j > 0 || i > 0) {\n obj.records[cell[1]+j][cell[0]+i] = info[2][index];\n obj.records[cell[1]+j][cell[0]+i].style.display = '';\n // Recover data\n if (data && data[index]) {\n obj.updateCell(cell[0]+i, cell[1]+j, data[index]);\n }\n index++;\n }\n }\n }\n \n // Update selection\n obj.updateSelection(obj.records[cell[1]][cell[0]], obj.records[cell[1]+j-1][cell[0]+i-1]);\n \n if (! keepOptions) {\n delete(obj.options.mergeCells[cellName]);\n }\n }\n }\n \n /**\n * Remove all merged cells\n */\n obj.destroyMerged = function(keepOptions) {\n // Remove any merged cells\n if (obj.options.mergeCells) {\n var mergedCells = obj.options.mergeCells;\n var keys = Object.keys(obj.options.mergeCells);\n for (var i = 0; i < keys.length; i++) {\n obj.removeMerge(keys[i], null, keepOptions);\n }\n }\n }\n \n /**\n * Is column merged\n */\n obj.isColMerged = function(x, insertBefore) {\n var cols = [];\n // Remove any merged cells\n if (obj.options.mergeCells) {\n var keys = Object.keys(obj.options.mergeCells);\n for (var i = 0; i < keys.length; i++) {\n var info = jexcel.getIdFromColumnName(keys[i], true);\n var colspan = obj.options.mergeCells[keys[i]][0];\n var x1 = info[0];\n var x2 = info[0] + (colspan > 1 ? colspan - 1 : 0);\n \n if (insertBefore == null) {\n if ((x1 <= x && x2 >= x)) {\n cols.push(keys[i]);\n }\n } else {\n if (insertBefore) {\n if ((x1 < x && x2 >= x)) {\n cols.push(keys[i]);\n }\n } else {\n if ((x1 <= x && x2 > x)) {\n cols.push(keys[i]);\n }\n }\n }\n }\n }\n \n return cols;\n }\n \n /**\n * Is rows merged\n */\n obj.isRowMerged = function(y, insertBefore) {\n var rows = [];\n // Remove any merged cells\n if (obj.options.mergeCells) {\n var keys = Object.keys(obj.options.mergeCells);\n for (var i = 0; i < keys.length; i++) {\n var info = jexcel.getIdFromColumnName(keys[i], true);\n var rowspan = obj.options.mergeCells[keys[i]][1];\n var y1 = info[1];\n var y2 = info[1] + (rowspan > 1 ? rowspan - 1 : 0);\n \n if (insertBefore == null) {\n if ((y1 <= y && y2 >= y)) {\n rows.push(keys[i]);\n }\n } else {\n if (insertBefore) {\n if ((y1 < y && y2 >= y)) {\n rows.push(keys[i]);\n }\n } else {\n if ((y1 <= y && y2 > y)) {\n rows.push(keys[i]);\n }\n }\n }\n }\n }\n \n return rows;\n }\n\n /**\n * Open the column filter\n */\n obj.openFilter = function(columnId) {\n if (! obj.options.filters) {\n console.log('JEXCEL: filters not enabled.');\n } else {\n // Make sure is integer\n columnId = parseInt(columnId);\n // Reset selection\n obj.resetSelection();\n // Load options\n var options = [];\n for (var j = 0; j < obj.options.data.length; j++) {\n var k = obj.options.data[j][columnId];\n var v = obj.records[j][columnId].innerHTML;\n if (k && v) {\n options[k] = v;\n }\n }\n var keys = Object.keys(options);\n var optionsFiltered = [];\n for (var j = 0; j < keys.length; j++) {\n optionsFiltered.push({ id: keys[j], name: options[keys[j]] });\n }\n\n // Create dropdown\n var div = document.createElement('div');\n obj.filter.children[columnId + 1].innerHTML = '';\n obj.filter.children[columnId + 1].appendChild(div);\n obj.filter.children[columnId + 1].style.paddingLeft = '0px';\n obj.filter.children[columnId + 1].style.paddingRight = '0px';\r\n obj.filter.children[columnId + 1].style.overflow = 'initial';\n\n // Dynamic dropdown\n jSuites.dropdown(div, {\n data: optionsFiltered,\n multiple: true,\n autocomplete: true,\n opened: true,\n value: obj.filters[columnId] ? obj.filters[columnId] : '',\n width:'100%',\n position: (obj.options.tableOverflow == true || obj.options.fullscreen == true) ? true : false,\n onclose: function(o) {\n obj.resetFilters();\n obj.filters[columnId] = o.dropdown.getValue(true);\n obj.filter.children[columnId + 1].innerHTML = o.dropdown.getText();\n obj.filter.children[columnId + 1].style.paddingLeft = '';\n obj.filter.children[columnId + 1].style.paddingRight = '';\n obj.filter.children[columnId + 1].style.overflow = '';\n obj.closeFilter(columnId);\n }\n });\n }\n }\n\n obj.resetFilters = function() {\n if (obj.options.filters) {\n for (var i = 0; i < obj.filter.children.length; i++) {\n obj.filter.children[i].innerHTML = ' ';\n obj.filters[i] = null;\n }\n }\n }\n\n obj.closeFilter = function(columnId) {\n if (! columnId) {\n for (var i = 0; i < obj.filter.children.length; i++) {\n if (obj.filters[i]) {\n columnId = i;\n }\n }\n }\n\n // Search filter\n var search = function(query, x, y) {\n for (var i = 0; i < query.length; i++) {\n if ((''+obj.options.data[y][x]).search(query[i]) >= 0 ||\n (''+obj.records[y][x].innerHTML).search(query[i]) >= 0) {\n return true;\n }\n }\n return false;\n }\n\n var query = obj.filters[columnId];\n obj.results = [];\n for (var j = 0; j < obj.options.data.length; j++) {\n if (search(query, columnId, j)) {\n obj.results.push(j);\n }\n }\n if (! obj.results.length) {\n obj.results = null;\n }\n\n obj.updateResult();\n }\n\n /**\n * Open the editor\n * \n * @param object cell\n * @return void\n */\n obj.openEditor = function(cell, empty, e) {\n // Get cell position\n var y = cell.getAttribute('data-y');\n var x = cell.getAttribute('data-x');\n \n // On edition start\n obj.dispatch('oneditionstart', el, cell, x, y);\n \n // Overflow\n if (x > 0) {\n obj.records[y][x-1].style.overflow = 'hidden';\n }\n \n // Create editor\n var createEditor = function(type) {\n // Cell information\n var info = cell.getBoundingClientRect();\n \n // Create dropdown\n var editor = document.createElement(type);\n editor.style.width = (info.width) + 'px';\n editor.style.height = (info.height - 2) + 'px';\n editor.style.minHeight = (info.height - 2) + 'px';\n \n // Edit cell\n cell.classList.add('editor');\n cell.innerHTML = '';\n cell.appendChild(editor);\n \n return editor;\n }\n \n // Readonly\n if (cell.classList.contains('readonly') == true) {\n // Do nothing\n } else {\n // Holder\n obj.edition = [ obj.records[y][x], obj.records[y][x].innerHTML, x, y ];\n \n // If there is a custom editor for it\n if (obj.options.columns[x].editor) {\n // Custom editors\n obj.options.columns[x].editor.openEditor(cell, el, empty, e);\n } else {\n // Native functions\n if (obj.options.columns[x].type == 'hidden') {\n // Do nothing\n } else if (obj.options.columns[x].type == 'checkbox' || obj.options.columns[x].type == 'radio') {\n // Get value\n var value = cell.children[0].checked ? false : true;\n // Toogle value\n obj.setValue(cell, value);\n // Do not keep edition open\n obj.edition = null;\n } else if (obj.options.columns[x].type == 'dropdown' || obj.options.columns[x].type == 'autocomplete') {\n // Get current value\n var value = obj.options.data[y][x];\n \n // Create dropdown\n if (typeof(obj.options.columns[x].filter) == 'function') {\n var source = obj.options.columns[x].filter(el, cell, x, y, obj.options.columns[x].source);\n } else {\n var source = obj.options.columns[x].source;\n }\n \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\n // Create editor\n var editor = createEditor('div');\n var options = {\n data: data,\n multiple: obj.options.columns[x].multiple ? true : false,\n autocomplete: obj.options.columns[x].autocomplete || obj.options.columns[x].type == 'autocomplete' ? true : false,\n opened:true,\n value: obj.options.columns[x].multiple ? value.split(';') : value,\n width:'100%',\n height:editor.style.minHeight,\n position: (obj.options.tableOverflow == true || obj.options.fullscreen == true) ? true : false,\n onclose:function() {\n obj.closeEditor(cell, true);\n }\n };\n if (obj.options.columns[x].options && obj.options.columns[x].options.type) {\n options.type = obj.options.columns[x].options.type;\n }\n jSuites.dropdown(editor, options);\n } else if (obj.options.columns[x].type == 'calendar' || obj.options.columns[x].type == 'color') {\n // Value\n var value = obj.options.data[y][x];\n // Create editor\n var editor = createEditor('input');\n editor.value = value;\n \n if (obj.options.tableOverflow == true || obj.options.fullscreen == true) {\n obj.options.columns[x].options.position = true;\n }\n obj.options.columns[x].options.value = obj.options.data[y][x];\n obj.options.columns[x].options.opened = true;\n obj.options.columns[x].options.onclose = function(el, value) {\n obj.closeEditor(cell, true);\n }\n // Current value\n if (obj.options.columns[x].type == 'color') {\n jSuites.color(editor, obj.options.columns[x].options);\n } else {\n jSuites.calendar(editor, obj.options.columns[x].options);\n }\n // Focus on editor\n editor.focus();\n } else if (obj.options.columns[x].type == 'html') {\n var value = obj.options.data[y][x];\n // Create editor\n var editor = createEditor('div');\n editor.style.position = 'relative';\n var div = document.createElement('div');\n div.classList.add('jexcel_richtext');\n editor.appendChild(div);\n jSuites.editor(div, {\n focus: true,\n value: value,\n });\n const rect = cell.getBoundingClientRect();\n const rectContent = div.getBoundingClientRect();\n if (window.innerHeight < rect.bottom + rectContent.height) {\n div.style.top = (rect.top - (rectContent.height + 2)) + 'px';\n } else {\n div.style.top = (rect.top) + 'px';\n }\n } else if (obj.options.columns[x].type == 'image') {\n // Value\n var img = cell.children[0];\n // Create editor\n var editor = createEditor('div');\n editor.style.position = 'relative';\n var div = document.createElement('div');\n div.classList.add('jclose');\n if (img && img.src) {\n div.appendChild(img);\n }\n editor.appendChild(div);\n jSuites.image(div, obj.options.imageOptions);\n const rect = cell.getBoundingClientRect();\n const rectContent = div.getBoundingClientRect();\n if (window.innerHeight < rect.bottom + rectContent.height) {\n div.style.top = (rect.top - (rectContent.height + 2)) + 'px';\n } else {\n div.style.top = (rect.top) + 'px';\n }\n } else {\n // Value\n var value = empty == true ? '' : obj.options.data[y][x];\n \n // Basic editor\n if (obj.options.columns[x].wordWrap != false && (obj.options.wordWrap == true || obj.options.columns[x].wordWrap == true)) {\n var editor = createEditor('textarea');\n } else {\n var editor = createEditor('input');\n // Mask\n if (obj.options.columns[x].mask) {\n editor.setAttribute('data-mask', obj.options.columns[x].mask);\n }\n }\n\n editor.onblur = function() {\n obj.closeEditor(cell, true);\n };\n editor.focus();\n editor.value = value;\n }\n }\n }\n }\n \n /**\n * Close the editor and save the information\n * \n * @param object cell\n * @param boolean save\n * @return void\n */\n obj.closeEditor = function(cell, save) {\n var x = parseInt(cell.getAttribute('data-x'));\n var y = parseInt(cell.getAttribute('data-y'));\n\n // Get cell properties\n if (save == true) {\n // If custom editor\n if (obj.options.columns[x].editor) {\n // Custom editor\n var value = obj.options.columns[x].editor.closeEditor(cell, save);\n } else {\n // Native functions\n if (obj.options.columns[x].type == 'checkbox' || obj.options.columns[x].type == 'radio' || obj.options.columns[x].type == 'hidden') {\n // Do nothing\n } else if (obj.options.columns[x].type == 'dropdown' || obj.options.columns[x].type == 'autocomplete') {\n var value = cell.children[0].dropdown.close(true);\n } else if (obj.options.columns[x].type == 'calendar') {\n var value = cell.children[0].calendar.close(true);\n } else if (obj.options.columns[x].type == 'color') {\n var value = cell.children[0].color.close(true);\n } else if (obj.options.columns[x].type == 'html') {\n var value = cell.children[0].children[0].editor.getData();\n } else if (obj.options.columns[x].type == 'image') {\n var img = cell.children[0].children[0].children[0];\n var value = img && img.tagName == 'IMG' ? img.src : '';\n } else if (obj.options.columns[x].type == 'numeric') {\n var value = cell.children[0].value;\n if (value.substr(0,1) != '=') {\n if (value == '') {\n value = obj.options.columns[x].allowEmpty ? '' : 0;\n }\n }\n cell.children[0].onblur = null;\n } else {\n var value = cell.children[0].value;\n cell.children[0].onblur = null;\n }\n }\n\n // Ignore changes if the value is the same\n if (obj.options.data[y][x] == value) {\n cell.innerHTML = obj.edition[1];\n } else {\n obj.setValue(cell, value);\n }\n } else {\n if (obj.options.columns[x].editor) {\n // Custom editor\n obj.options.columns[x].editor.closeEditor(cell, save);\n } else {\n if (obj.options.columns[x].type == 'dropdown' || obj.options.columns[x].type == 'autocomplete') {\n cell.children[0].dropdown.close(true);\n } else if (obj.options.columns[x].type == 'calendar') {\n cell.children[0].calendar.close(true);\n } else if (obj.options.columns[x].type == 'color') {\n cell.children[0].color.close(true);\n } else {\n cell.children[0].onblur = null;\n }\n }\n \n // Restore value\n cell.innerHTML = obj.edition && obj.edition[1] ? obj.edition[1] : '';\n }\n \n // On edition end\n obj.dispatch('oneditionend', el, cell, x, y, value, save);\n\n // Remove editor class\n cell.classList.remove('editor');\n \n // Finish edition\n obj.edition = null;\n }\n \n /**\n * Get the cell object\n * \n * @param object cell\n * @return string value\n */\n obj.getCell = function(cell) {\n // Convert in case name is excel liked ex. A10, BB92\n cell = jexcel.getIdFromColumnName(cell, true);\n var x = cell[0];\n var y = cell[1];\n \n return obj.records[y][x];\n }\n \n /**\n * Get the cell object from coords\n * \n * @param object cell\n * @return string value\n */\n obj.getCellFromCoords = function(x, y) {\n return obj.records[y][x];\n }\n \n /**\n * Get label\n * \n * @param object cell\n * @return string value\n */\n obj.getLabel = function(cell) {\n // Convert in case name is excel liked ex. A10, BB92\n cell = jexcel.getIdFromColumnName(cell, true);\n var x = cell[0];\n var y = cell[1];\n \n return obj.records[y][x].innerHTML;\n }\n \n /**\n * Get labelfrom coords\n * \n * @param object cell\n * @return string value\n */\n obj.getLabelFromCoords = function(x, y) {\n return obj.records[y][x].innerHTML;\n }\n \n /**\n * Get the value from a cell\n * \n * @param object cell\n * @return string value\n */\n obj.getValue = function(cell, processedValue) {\n if (typeof(cell) == 'object') {\n var x = cell.getAttribute('data-x');\n var y = cell.getAttribute('data-y');\n } else {\n cell = jexcel.getIdFromColumnName(cell, true);\n var x = cell[0];\n var y = cell[1];\n }\n \n var value = null;\n \n if (x != null && y != null) {\n if (obj.records[y] && obj.records[y][x] && (processedValue || obj.options.copyCompatibility == true)) {\n value = obj.records[y][x].innerHTML;\n } else {\n if (obj.options.data[y] && obj.options.data[y][x] != 'undefined') {\n value = obj.options.data[y][x];\n }\n }\n }\n \n return value;\n }\n \n /**\n * Get the value from a coords\n * \n * @param int x\n * @param int y\n * @return string value\n */\n obj.getValueFromCoords = function(x, y, processedValue) {\n var value = null;\n \n if (x != null && y != null) {\n if ((obj.records[y] && obj.records[y][x]) && processedValue || obj.options.copyCompatibility == true) {\n value = obj.records[y][x].innerHTML;\n } else {\n if (obj.options.data[y] && obj.options.data[y][x] != 'undefined') {\n value = obj.options.data[y][x];\n }\n }\n }\n \n return value;\n }\n \n /**\n * Set a cell value\n * \n * @param mixed cell destination cell\n * @param string value value\n * @return void\n */\n obj.setValue = function(cell, value, force) {\n var records = [];\n \n if (typeof(cell) == 'string') {\n var columnId = jexcel.getIdFromColumnName(cell, true);\n var x = columnId[0];\n var y = columnId[1];\n \n // Update cell\n records.push(obj.updateCell(x, y, value, force));\n \n // Update all formulas in the chain\n obj.updateFormulaChain(x, y, records);\n } else {\n var x = null;\n var y = null;\n if (cell && cell.getAttribute) {\n var x = cell.getAttribute('data-x');\n var y = cell.getAttribute('data-y');\n }\n \n // Update cell\n if (x != null && y != null) {\n records.push(obj.updateCell(x, y, value, force));\n \n // Update all formulas in the chain\n obj.updateFormulaChain(x, y, records);\n } else {\n var keys = Object.keys(cell);\n if (keys.length > 0) {\n for (var i = 0; i < keys.length; i++) {\n if (typeof(cell[i]) == 'string') {\n var columnId = jexcel.getIdFromColumnName(cell[i], true);\n var x = columnId[0];\n var y = columnId[1];\n } else {\n if (cell[i].x != null && cell[i].y != null) {\n var x = cell[i].x;\n var y = cell[i].y;\n // Flexible setup\n if (cell[i].newValue != null) {\n value = cell[i].newValue;\n } else if (cell[i].value != null) {\n value = cell[i].value;\n }\n } else {\n var x = cell[i].getAttribute('data-x');\n var y = cell[i].getAttribute('data-y');\n }\n }\n \n // Update cell\n if (x != null && y != null) {\n records.push(obj.updateCell(x, y, value, force));\n \n // Update all formulas in the chain\n obj.updateFormulaChain(x, y, records);\n }\n }\n }\n }\n }\n \n // Update history\n obj.setHistory({\n action:'setValue',\n records:records,\n selection:obj.selectedCell,\n });\n \n // Update table with custom configurations if applicable\n obj.updateTable();\n \n // On after changes\n obj.onafterchanges(el, records);\n }\n \n /**\n * Set a cell value based on coordinates\n * \n * @param int x destination cell\n * @param int y destination cell\n * @param string value\n * @return void\n */\n obj.setValueFromCoords = function(x, y, value, force) {\n var records = [];\n records.push(obj.updateCell(x, y, value, force));\n \n // Update all formulas in the chain\n obj.updateFormulaChain(x, y, records);\n \n // Update history\n obj.setHistory({\n action:'setValue',\n records:records,\n selection:obj.selectedCell,\n });\n \n // Update table with custom configurations if applicable\n obj.updateTable();\n \n // On after changes\n obj.onafterchanges(el, records);\n }\n \n /**\n * Toogle\n */\n obj.setCheckRadioValue = function() {\n var records = [];\n var keys = Object.keys(obj.highlighted);\n for (var i = 0; i < keys.length; i++) {\n var x = obj.highlighted[i].getAttribute('data-x');\n var y = obj.highlighted[i].getAttribute('data-y');\n \n if (obj.options.columns[x].type == 'checkbox' || obj.options.columns[x].type == 'radio') {\n // Update cell\n records.push(obj.updateCell(x, y, ! obj.options.data[y][x]));\n }\n }\n \n if (records.length) {\n // Update history\n obj.setHistory({\n action:'setValue',\n records:records,\n selection:obj.selectedCell,\n });\n \n // On after changes\n obj.onafterchanges(el, records);\n }\n }\n \n /**\n * Strip tags\n */\n var stripScript = function(a) {\n var b = new Option;\n b.innerHTML = a;\n var c = null;\n for (a = b.getElementsByTagName('script'); c=a[0];) c.parentNode.removeChild(c);\n return b.innerHTML;\n }\n\n /**\n * Update cell content\n * \n * @param object cell\n * @return void\n */\n obj.updateCell = function(x, y, value, force) {\n // Changing value depending on the column type\n if (obj.records[y][x].classList.contains('readonly') == true && ! force) {\n // Do nothing\n var record = {\n x: x,\n y: y,\n col: x,\n row: y\n }\n } else {\n // Security\n if ((''+value).substr(0,1) == '=' && obj.options.secureFormulas == true) {\n var val = secureFormula(value);\n if (val != value) {\n // Update the data container\n value = val;\n }\n }\n\n // On change\n var val = obj.dispatch('onbeforechange', el, obj.records[y][x], x, y, value);\n\n // If you return something this will overwrite the value\n if (val != undefined) {\n value = val;\n }\n\n if (obj.options.columns[x].editor && typeof(obj.options.columns[x].editor.updateCell) == 'function') {\n value = obj.options.columns[x].editor.updateCell(obj.records[y][x], value, force);\n }\n\n // History format\n var record = {\n x: x,\n y: y,\n col: x,\n row: y,\n newValue: value,\n oldValue: obj.options.data[y][x],\n }\n\n if (obj.options.columns[x].editor) {\n // Update data and cell\n obj.options.data[y][x] = value;\n } else {\n // Native functions\n if (obj.options.columns[x].type == 'checkbox' || obj.options.columns[x].type == 'radio') {\n // Unchecked all options\n if (obj.options.columns[x].type == 'radio') {\n for (var j = 0; j < obj.options.data.length; j++) {\n obj.options.data[j][x] = false;\n }\n }\n\n // Update data and cell\n obj.records[y][x].children[0].checked = (value == 1 || value == true || value == 'true' || value == 'TRUE') ? true : false;\n obj.options.data[y][x] = obj.records[y][x].children[0].checked;\n } else if (obj.options.columns[x].type == 'dropdown' || obj.options.columns[x].type == 'autocomplete') {\n // Update data and cell\n obj.options.data[y][x] = value;\n obj.records[y][x].innerText = obj.getDropDownValue(x, value);\n } else if (obj.options.columns[x].type == 'calendar') {\n // Update calendar\n var formatted = jSuites.calendar.extractDateFromString(value, obj.options.columns[x].options.format);\n // Update data and cell\n obj.options.data[y][x] = value;\n obj.records[y][x].innerText = jSuites.calendar.getDateString(formatted ? formatted : value, obj.options.columns[x].options.format);\n } else if (obj.options.columns[x].type == 'color') {\n // Update color\n obj.options.data[y][x] = value;\n // Render\n if (obj.options.columns[x].render == 'square') {\n var color = document.createElement('div');\n color.className = 'color';\n color.style.backgroundColor = value;\n obj.records[y][x].innerText = '';\n obj.records[y][x].appendChild(color);\n } else {\n obj.records[y][x].style.color = value;\n obj.records[y][x].innerText = value;\n }\n } else if (obj.options.columns[x].type == 'image') {\n value = ''+value;\n obj.options.data[y][x] = value;\n obj.records[y][x].innerHTML = '';\n if (value && value.substr(0, 10) == 'data:image') {\n var img = document.createElement('img');\n img.src = value;\n obj.records[y][x].appendChild(img);\n }\n } else {\n // Update data and cell\n obj.options.data[y][x] = value;\n // Label\n if (obj.options.columns[x].type == 'html') {\n obj.records[y][x].innerHTML = stripScript(obj.parseValue(x, y, value));\n } else {\n if (obj.options.stripHTML === false || obj.options.columns[x].stripHTML === false) {\n obj.records[y][x].innerHTML = stripScript(obj.parseValue(x, y, value));\n } else {\r\n obj.records[y][x].innerText = obj.parseValue(x, y, value);\r\n }\n }\n // Handle big text inside a cell\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)) {\n obj.records[y][x].style.whiteSpace = 'pre-wrap';\n } else {\n obj.records[y][x].style.whiteSpace = '';\n }\n }\n }\n\n // Overflow\n if (x > 0) {\n if (value) {\n obj.records[y][x-1].style.overflow = 'hidden';\n } else {\n obj.records[y][x-1].style.overflow = '';\n }\n }\n\n // On change\n obj.dispatch('onchange', el, (obj.records[y] && obj.records[y][x] ? obj.records[y][x] : null), x, y, value, record.oldValue);\n }\n\n return record;\n }\n\n /**\n * Helper function to copy data using the corner icon\n */\n obj.copyData = function(o, d) {\n // Get data from all selected cells\n var data = obj.getData(true, true);\n\n // Selected cells\n var h = obj.selectedContainer;\n\n // Cells\n var x1 = parseInt(o.getAttribute('data-x'));\n var y1 = parseInt(o.getAttribute('data-y'));\n var x2 = parseInt(d.getAttribute('data-x'));\n var y2 = parseInt(d.getAttribute('data-y'));\n\n // Records\n var records = [];\n var breakControl = false;\n\n if (h[0] == x1) {\n // Vertical copy\n if (y1 < h[1]) {\n var rowNumber = y1 - h[1];\n } else {\n var rowNumber = 1;\n }\n var colNumber = 0;\n } else {\n if (x1 < h[0]) {\n var colNumber = x1 - h[0];\n } else {\n var colNumber = 1;\n }\n var rowNumber = 0;\n }\n\n // Copy data procedure\n var posx = 0;\n var posy = 0;\n\n for (var j = y1; j <= y2; j++) {\n // Skip hidden rows\n if (obj.rows[j] && obj.rows[j].style.display == 'none') {\n continue;\n }\n\n // Controls\n if (data[posy] == undefined) {\n posy = 0;\n }\n posx = 0;\n\n // Data columns\n if (h[0] != x1) {\n if (x1 < h[0]) {\n var colNumber = x1 - h[0];\n } else {\n var colNumber = 1;\n }\n }\n // Data columns\n for (var i = x1; i <= x2; i++) {\n // Update non-readonly\n if (obj.records[j][i] && ! obj.records[j][i].classList.contains('readonly') && obj.records[j][i].style.display != 'none' && breakControl == false) {\n // Stop if contains value\n if (! obj.selection.length) {\n if (obj.options.data[j][i] != '') {\n breakControl = true;\n continue;\n }\n }\n \n // Column\n if (data[posy] == undefined) {\n posx = 0;\n } else if (data[posy][posx] == undefined) {\n posx = 0;\n }\n\n // Value\n var value = data[posy][posx];\n \n if (value && ! data[1] && obj.options.autoIncrement == true) {\n if (obj.options.columns[i].type == 'text' || obj.options.columns[i].type == 'number') {\n if ((''+value).substr(0,1) == '=') {\n var tokens = value.match(/([A-Z]+[0-9]+)/g);\n \n if (tokens) {\n var affectedTokens = [];\n for (var index = 0; index < tokens.length; index++) {\n var position = jexcel.getIdFromColumnName(tokens[index], 1);\n position[0] += colNumber;\n position[1] += rowNumber;\n if (position[1] < 0) {\n position[1] = 0;\n }\n var token = jexcel.getColumnNameFromId([position[0], position[1]]);\n \n if (token != tokens[index]) {\n affectedTokens[tokens[index]] = token;\n }\n }\n // Update formula\n if (affectedTokens) {\n value = obj.updateFormula(value, affectedTokens)\n }\n }\n } else {\n if (value == Number(value)) {\n value = Number(value) + rowNumber;\n }\n }\n } else if (obj.options.columns[i].type == 'calendar') {\n var date = new Date(value);\n date.setDate(date.getDate() + rowNumber);\n value = date.getFullYear() + '-' + jexcel.doubleDigitFormat(parseInt(date.getMonth() + 1)) + '-' + jexcel.doubleDigitFormat(date.getDate()) + ' ' + '00:00:00';\n }\n }\n \n records.push(obj.updateCell(i, j, value));\n \n // Update all formulas in the chain\n obj.updateFormulaChain(i, j, records);\n }\n posx++;\n if (h[0] != x1) {\n colNumber++;\n }\n }\n posy++;\n rowNumber++;\n }\n \n // Update history\n obj.setHistory({\n action:'setValue',\n records:records,\n selection:obj.selectedCell,\n });\n \n // Update table with custom configuration if applicable\n obj.updateTable();\n \n // On after changes\n obj.onafterchanges(el, records);\n }\n \n /**\n * Refresh current selection\n */\n obj.refreshSelection = function() {\n if (obj.selectedCell) {\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n }\n }\n \n /**\n * Move coords to A1 in case ovelaps with an excluded cell\n */\n obj.conditionalSelectionUpdate = function(type, o, d) {\n if (type == 1) {\n if (obj.selectedCell && ((o >= obj.selectedCell[1] && o <= obj.selectedCell[3]) || (d >= obj.selectedCell[1] && d <= obj.selectedCell[3]))) {\n obj.resetSelection();\n return;\n }\n } else {\n if (obj.selectedCell && ((o >= obj.selectedCell[0] && o <= obj.selectedCell[2]) || (d >= obj.selectedCell[0] && d <= obj.selectedCell[2]))) {\n obj.resetSelection();\n return;\n }\n }\n }\n \n /**\n * Clear table selection\n */\n obj.resetSelection = function(blur) {\n // Remove style\n if (! obj.highlighted.length) {\n var previousStatus = 0;\n } else {\n var previousStatus = 1;\n \n for (var i = 0; i < obj.highlighted.length; i++) {\n obj.highlighted[i].classList.remove('highlight');\n obj.highlighted[i].classList.remove('highlight-left');\n obj.highlighted[i].classList.remove('highlight-right');\n obj.highlighted[i].classList.remove('highlight-top');\n obj.highlighted[i].classList.remove('highlight-bottom');\n obj.highlighted[i].classList.remove('highlight-selected');\n \n var px = parseInt(obj.highlighted[i].getAttribute('data-x'));\n var py = parseInt(obj.highlighted[i].getAttribute('data-y'));\n \n // Check for merged cells\n if (obj.highlighted[i].getAttribute('data-merged')) {\n var colspan = parseInt(obj.highlighted[i].getAttribute('colspan'));\n var rowspan = parseInt(obj.highlighted[i].getAttribute('rowspan'));\n var ux = colspan > 0 ? px + (colspan - 1) : px;\n var uy = rowspan > 0 ? py + (rowspan - 1): py;\n } else {\n var ux = px;\n var uy = py;\n }\n \n // Remove selected from headers\n for (var j = px; j <= ux; j++) {\n if (obj.headers[j]) {\n obj.headers[j].classList.remove('selected');\n }\n }\n \n // Remove selected from rows\n for (var j = py; j <= uy; j++) {\n if (obj.rows[j]) {\n obj.rows[j].classList.remove('selected');\n }\n }\n }\n }\n \n // Reset highlighed cells\n obj.highlighted = [];\n \n // Reset\n obj.selectedCell = null;\n \n // Hide corner\n obj.corner.style.top = '-2000px';\n obj.corner.style.left = '-2000px';\n \n if (blur == true && previousStatus == 1) {\n obj.dispatch('onblur', el);\n }\n \n return previousStatus;\n }\n \n /**\n * Update selection based on two cells\n */\n obj.updateSelection = function(el1, el2, origin) {\n var x1 = el1.getAttribute('data-x');\n var y1 = el1.getAttribute('data-y');\n if (el2) {\n var x2 = el2.getAttribute('data-x');\n var y2 = el2.getAttribute('data-y');\n } else {\n var x2 = x1;\n var y2 = y1;\n }\n \n obj.updateSelectionFromCoords(x1, y1, x2, y2, origin);\n }\n \n /**\n * Update selection from coords\n */\n obj.updateSelectionFromCoords = function(x1, y1, x2, y2, origin) {\n // Reset Selection\n var updated = null;\n var previousState = obj.resetSelection();\n \n // Same element\n if (x2 == null) {\n x2 = x1;\n }\n if (y2 == null) {\n y2 = y1;\n }\n \n // Selection must be within the existing data\n if (x1 >= obj.headers.length) {\n x1 = obj.headers.length - 1;\n }\n if (y1 >= obj.rows.length) {\n y1 = obj.rows.length - 1;\n }\n if (x2 >= obj.headers.length) {\n x2 = obj.headers.length - 1;\n }\n if (y2 >= obj.rows.length) {\n y2 = obj.rows.length - 1;\n }\n \n // Keep selected cell\n obj.selectedCell = [x1, y1, x2, y2];\n \n // Select cells\n if (x1 != null) {\n // Add selected cell\n if (obj.records[y1][x1]) {\n obj.records[y1][x1].classList.add('highlight-selected');\n }\n \n // Origin & Destination\n if (parseInt(x1) < parseInt(x2)) {\n var px = parseInt(x1);\n var ux = parseInt(x2);\n } else {\n var px = parseInt(x2);\n var ux = parseInt(x1);\n }\n \n if (parseInt(y1) < parseInt(y2)) {\n var py = parseInt(y1);\n var uy = parseInt(y2);\n } else {\n var py = parseInt(y2);\n var uy = parseInt(y1);\n }\n \n // Verify merged columns\n for (var i = px; i <= ux; i++) {\n for (var j = py; j <= uy; j++) {\n if (obj.records[j][i] && obj.records[j][i].getAttribute('data-merged')) {\n var x = parseInt(obj.records[j][i].getAttribute('data-x'));\n var y = parseInt(obj.records[j][i].getAttribute('data-y'));\n var colspan = parseInt(obj.records[j][i].getAttribute('colspan'));\n var rowspan = parseInt(obj.records[j][i].getAttribute('rowspan'));\n \n if (colspan > 1) {\n if (x < px) {\n px = x;\n }\n if (x + colspan > ux) {\n ux = x + colspan - 1;\n }\n }\n \n if (rowspan) {\n if (y < py) {\n py = y;\n \n }\n if (y + rowspan > uy) {\n uy = y + rowspan - 1;\n }\n }\n }\n }\n }\n \n // Limits\n var borderLeft = null;\n var borderRight = null;\n var borderTop = null;\n var borderBottom = null;\n \n // Vertical limits\n for (var j = py; j <= uy; j++) {\n if (obj.rows[j].style.display != 'none') {\n if (borderTop == null) {\n borderTop = j;\n }\n borderBottom = j;\n }\n }\n \n // Redefining styles\n for (var i = px; i <= ux; i++) {\n for (var j = py; j <= uy; j++) {\n if (obj.rows[j].style.display != 'none' && obj.records[j][i].style.display != 'none') {\n obj.records[j][i].classList.add('highlight');\n obj.highlighted.push(obj.records[j][i]);\n }\n }\n \n // Horizontal limits\n if (obj.options.columns[i].type != 'hidden') {\n if (borderLeft == null) {\n borderLeft = i;\n }\n borderRight = i;\n }\n }\n \n // Create borders\n if (! borderLeft) {\n borderLeft = 0;\n }\n if (! borderRight) {\n borderRight = 0;\n }\n for (var i = borderLeft; i <= borderRight; i++) {\n if (obj.options.columns[i].type != 'hidden') {\n // Top border\n if (obj.records[borderTop][i]) {\n obj.records[borderTop][i].classList.add('highlight-top');\n }\n // Bottom border\n if (obj.records[borderBottom][i]) {\n obj.records[borderBottom][i].classList.add('highlight-bottom');\n }\n // Add selected from headers\n obj.headers[i].classList.add('selected');\n }\n }\n \n for (var j = borderTop; j <= borderBottom; j++) {\n if (obj.rows[j].style.display != 'none') {\n // Left border\n obj.records[j][borderLeft].classList.add('highlight-left');\n // Right border\n obj.records[j][borderRight].classList.add('highlight-right');\n // Add selected from rows\n obj.rows[j].classList.add('selected');\n }\n }\n \n obj.selectedContainer = [ borderLeft, borderTop, borderRight, borderBottom ];\n }\n \n // Handle events\n if (previousState == 0) {\n obj.dispatch('onfocus', el);\n\n obj.removeCopyingSelection();\n }\n\n obj.dispatch('onselection', el, borderLeft, borderTop, borderRight, borderBottom, origin);\n\n // Find corner cell\n obj.updateCornerPosition();\n }\n \n /**\n * Remove copy selection\n * \n * @return void\n */\n obj.removeCopySelection = function() {\n // Remove current selection\n for (var i = 0; i < obj.selection.length; i++) {\n obj.selection[i].classList.remove('selection');\n obj.selection[i].classList.remove('selection-left');\n obj.selection[i].classList.remove('selection-right');\n obj.selection[i].classList.remove('selection-top');\n obj.selection[i].classList.remove('selection-bottom');\n }\n \n obj.selection = [];\n }\n \n /**\n * Update copy selection\n * \n * @param int x, y\n * @return void\n */\n obj.updateCopySelection = function(x3, y3) {\n // Remove selection\n obj.removeCopySelection();\n \n // Get elements first and last\n var x1 = obj.selectedContainer[0];\n var y1 = obj.selectedContainer[1];\n var x2 = obj.selectedContainer[2];\n var y2 = obj.selectedContainer[3];\n \n if (x3 != null && y3 != null) {\n if (x3 - x2 > 0) {\n var px = parseInt(x2) + 1;\n var ux = parseInt(x3);\n } else {\n var px = parseInt(x3);\n var ux = parseInt(x1) - 1;\n }\n \n if (y3 - y2 > 0) {\n var py = parseInt(y2) + 1;\n var uy = parseInt(y3);\n } else {\n var py = parseInt(y3);\n var uy = parseInt(y1) - 1;\n }\n \n if (ux - px <= uy - py) {\n var px = parseInt(x1);\n var ux = parseInt(x2);\n } else {\n var py = parseInt(y1);\n var uy = parseInt(y2);\n }\n \n for (var j = py; j <= uy; j++) {\n for (var i = px; i <= ux; i++) {\n if (obj.records[j][i] && obj.rows[j].style.display != 'none' && obj.records[j][i].style.display != 'none') {\n obj.records[j][i].classList.add('selection');\n obj.records[py][i].classList.add('selection-top');\n obj.records[uy][i].classList.add('selection-bottom');\n obj.records[j][px].classList.add('selection-left');\n obj.records[j][ux].classList.add('selection-right');\n \n // Persist selected elements\n obj.selection.push(obj.records[j][i]);\n }\n }\n }\n }\n }\n \n /**\n * Update corner position\n * \n * @return void\n */\n obj.updateCornerPosition = function() {\n // If any selected cells\n if (! obj.highlighted.length) {\n obj.corner.style.top = '-2000px';\n obj.corner.style.left = '-2000px';\n } else {\n // Get last cell\n var last = obj.highlighted[obj.highlighted.length-1];\n\n const contentRect = obj.content.getBoundingClientRect();\n var x1 = contentRect.left;\n var y1 = contentRect.top;\n\n const lastRect = last.getBoundingClientRect();\n var x2 = lastRect.left;\n var y2 = lastRect.top;\n var w2 = lastRect.width;\n var h2 = lastRect.height;\n\n var x = (x2 - x1) + obj.content.scrollLeft + w2 - 4;\n var y = (y2 - y1) + obj.content.scrollTop + h2 - 4;\n\n // Place the corner in the correct place\n obj.corner.style.top = y + 'px';\n obj.corner.style.left = x + 'px';\n\n if (obj.options.freezeColumns) {\n var width = obj.getFreezeWidth();\n if (x2 - x1 + w2 < width) {\n obj.corner.style.display = 'none';\n } else {\n if (obj.options.selectionCopy == true) {\n obj.corner.style.display = '';\n }\n }\n } else {\n if (obj.options.selectionCopy == true) {\n obj.corner.style.display = '';\n }\n }\n }\n }\n \n /**\n * Update scroll position based on the selection\n */\n obj.updateScroll = function(direction) {\n // jExcel Container information\n const contentRect = obj.content.getBoundingClientRect();\n var x1 = contentRect.left;\n var y1 = contentRect.top;\n var w1 = contentRect.width;\n var h1 = contentRect.height;\n\n // Direction Left or Up\n var reference = obj.records[obj.selectedCell[3]][obj.selectedCell[2]];\n \n // Reference\n const referenceRect = reference.getBoundingClientRect();\n var x2 = referenceRect.left;\n var y2 = referenceRect.top;\n var w2 = referenceRect.width;\n var h2 = referenceRect.height;\n \n // Direction\n if (direction == 0 || direction == 1) {\n var x = (x2 - x1) + obj.content.scrollLeft;\n var y = (y2 - y1) + obj.content.scrollTop - 2;\n } else {\n var x = (x2 - x1) + obj.content.scrollLeft + w2;\n var y = (y2 - y1) + obj.content.scrollTop + h2;\n }\n \n // Top position check\n if (y > (obj.content.scrollTop + 30) && y < (obj.content.scrollTop + h1)) {\n // In the viewport\n } else {\n // Out of viewport\n if (y < obj.content.scrollTop + 30) {\n obj.content.scrollTop = y - h2;\n } else {\n obj.content.scrollTop = y - (h1 - 2);\n }\n }\n \n // Freeze columns? \n var freezed = obj.getFreezeWidth();\n\n // Left position check - TODO: change that to the bottom border of the element\n if (x > (obj.content.scrollLeft + freezed) && x < (obj.content.scrollLeft + w1)) {\n // In the viewport\n } else {\n // Out of viewport\n if (x < obj.content.scrollLeft + 30) {\n obj.content.scrollLeft = x;\n if (obj.content.scrollLeft < 50) {\n obj.content.scrollLeft = 0;\n }\n } else if (x < obj.content.scrollLeft + freezed) {\n obj.content.scrollLeft = x - freezed - 1;\n } else {\n obj.content.scrollLeft = x - (w1 - 20);\n }\n }\n }\n \n /**\n * Get the column width\n * \n * @param int column column number (first column is: 0)\n * @return int current width\n */\n obj.getWidth = function(column) {\n if (! column) {\n // Get all headers\n var data = [];\n for (var i = 0; i < obj.headers.length; i++) {\n data.push(obj.options.columns[i].width);\n }\n } else {\n // In case the column is an object\n if (typeof(column) == 'object') {\n column = $(column).getAttribute('data-x');\n }\n \n data = obj.colgroup[column].getAttribute('width')\n }\n \n return data;\n }\n\n\n /**\n * Set the column width\n * \n * @param int column number (first column is: 0)\n * @param int new column width\n * @param int old column width\n */\n obj.setWidth = function (column, width, oldWidth) {\n if (width) {\n if (Array.isArray(column)) {\n // Oldwidth\n if (! oldWidth) {\n var oldWidth = [];\n }\n // Set width\n for (var i = 0; i < column.length; i++) {\n if (! oldWidth[i]) {\n oldWidth[i] = obj.colgroup[column[i]].getAttribute('width');\n }\n var w = Array.isArray(width) && width[i] ? width[i] : width;\n obj.colgroup[column[i]].setAttribute('width', w);\n obj.options.columns[column[i]].width = w;\n }\n } else {\n // Oldwidth\n if (! oldWidth) {\n oldWidth = obj.colgroup[column].getAttribute('width');\n }\n // Set width\n obj.colgroup[column].setAttribute('width', width);\n obj.options.columns[column].width = width;\n }\n\n // Keeping history of changes\n obj.setHistory({\n action:'setWidth',\n column:column,\n oldValue:oldWidth,\n newValue:width,\n });\n\n // On resize column\n obj.dispatch('onresizecolumn', el, column, width, oldWidth);\n\n // Update corner position\n obj.updateCornerPosition();\n }\n }\n\n /**\n * Set the row height\n * \n * @param row - row number (first row is: 0)\n * @param height - new row height\n * @param oldHeight - old row height\n */\n obj.setHeight = function (row, height, oldHeight) {\n if (height > 0) {\n // In case the column is an object\n if (typeof(row) == 'object') {\n row = row.getAttribute('data-y');\n }\n \n // Oldwidth\n if (! oldHeight) {\n oldHeight = obj.rows[row].getAttribute('height');\n\n if (! oldHeight) {\n var rect = obj.rows[row].getBoundingClientRect();\n oldHeight = rect.height;\n }\n }\n\n // Integer\n height = parseInt(height);\n\n // Set width\n obj.rows[row].style.height = height + 'px';\n \n // Keep options updated\n if (! obj.options.rows[row]) {\n obj.options.rows[row] = {};\n }\n obj.options.rows[row].height = height;\n \n // Keeping history of changes\n obj.setHistory({\n action:'setHeight',\n row:row,\n oldValue:oldHeight,\n newValue:height,\n });\n\n // On resize column\n obj.dispatch('onresizerow', el, row, height, oldHeight);\n\n // Update corner position\n obj.updateCornerPosition();\n }\n }\n \n /**\n * Get the row height\n * \n * @param row - row number (first row is: 0)\n * @return height - current row height\n */\n obj.getHeight = function(row) {\n if (! row) {\n // Get height of all rows\n var data = [];\n for (var j = 0; j < obj.rows.length; j++) {\n var h = obj.rows[j].style.height;\n if (h) {\n data[j] = h;\n }\n }\n } else {\n // In case the row is an object\n if (typeof(row) == 'object') {\n row = $(row).getAttribute('data-y');\n }\n \n var data = obj.rows[row].style.height;\n }\n \n return data;\n }\n \n obj.setFooter = function(data) {\n if (data) {\n obj.options.footers = data;\n }\n\n if (obj.options.footers) {\n if (! obj.tfoot) {\n obj.tfoot = document.createElement('tfoot');\n obj.table.appendChild(obj.tfoot);\n } \n\n for (var j = 0; j < obj.options.footers.length; j++) {\n if (obj.tfoot.children[j]) {\n var tr = obj.tfoot.children[j];\n } else {\n var tr = document.createElement('tr');\n var td = document.createElement('td');\n tr.appendChild(td);\n obj.tfoot.appendChild(tr);\n }\n for (var i = 0; i < obj.headers.length; i++) {\n if (! obj.options.footers[j][i]) {\n obj.options.footers[j][i] = '';\n }\n if (obj.tfoot.children[j].children[i+1]) {\n var td = obj.tfoot.children[j].children[i+1];\n } else {\n var td = document.createElement('td');\n tr.appendChild(td);\n\n // Text align\n var colAlign = obj.options.columns[i].align ? obj.options.columns[i].align : 'center';\n td.style.textAlign = colAlign;\n }\n td.innerText = obj.parseValue(i, j, obj.options.footers[j][i]);\n }\n }\n }\n }\n\n /**\n * Get the column title\n * \n * @param column - column number (first column is: 0)\n * @param title - new column title\n */\n obj.getHeader = function(column) {\n return obj.headers[column].innerText;\n }\n \n /**\n * Set the column title\n * \n * @param column - column number (first column is: 0)\n * @param title - new column title\n */\n obj.setHeader = function(column, newValue) {\n if (obj.headers[column]) {\n var oldValue = obj.headers[column].innerText;\n \n if (! newValue) {\n newValue = prompt(obj.options.text.columnName, oldValue)\n }\n \n if (newValue) {\n obj.headers[column].innerText = newValue;\n // Keep the title property\n obj.headers[column].setAttribute('title', newValue);\n // Update title\n obj.options.columns[column].title = newValue;\n }\n \n obj.setHistory({\n action: 'setHeader',\n column: column,\n oldValue: oldValue,\n newValue: newValue\n });\n \n // On onchange header\n obj.dispatch('onchangeheader', el, column, oldValue, newValue);\n }\n }\n \n /**\n * Get the headers\n * \n * @param asArray\n * @return mixed\n */\n obj.getHeaders = function (asArray) {\n var title = [];\n \n for (var i = 0; i < obj.headers.length; i++) {\n title.push(obj.getHeader(i));\n }\n \n return asArray ? title : title.join(obj.options.csvDelimiter);\n }\n \n /**\n * Get meta information from cell(s)\n * \n * @return integer\n */\n obj.getMeta = function(cell, key) {\n if (! cell) {\n return obj.options.meta;\n } else {\n if (key) {\n return obj.options.meta[cell] && obj.options.meta[cell][key] ? obj.options.meta[cell][key] : null;\n } else {\n return obj.options.meta[cell] ? obj.options.meta[cell] : null;\n }\n }\n }\n \n /**\n * Set meta information to cell(s)\n * \n * @return integer\n */\n obj.setMeta = function(o, k, v) {\n if (! obj.options.meta) {\n obj.options.meta = {}\n }\n \n if (k && v) {\n // Set data value\n if (! obj.options.meta[o]) {\n obj.options.meta[o] = {};\n }\n obj.options.meta[o][k] = v;\n } else {\n // Apply that for all cells\n var keys = Object.keys(o);\n for (var i = 0; i < keys.length; i++) {\n if (! obj.options.meta[keys[i]]) {\n obj.options.meta[keys[i]] = {};\n }\n \n var prop = Object.keys(o[keys[i]]);\n for (var j = 0; j < prop.length; j++) {\n obj.options.meta[keys[i]][prop[j]] = o[keys[i]][prop[j]];\n }\n }\n }\n \n obj.dispatch('onchangemeta', el, o, k, v);\n }\n \n /**\n * Update meta information\n * \n * @return integer\n */\n obj.updateMeta = function(affectedCells) {\n if (obj.options.meta) {\n var newMeta = {};\n var keys = Object.keys(obj.options.meta);\n for (var i = 0; i < keys.length; i++) {\n if (affectedCells[keys[i]]) {\n newMeta[affectedCells[keys[i]]] = obj.options.meta[keys[i]];\n } else {\n newMeta[keys[i]] = obj.options.meta[keys[i]];\n }\n }\n // Update meta information\n obj.options.meta = newMeta;\n }\n }\n \n /**\n * Get style information from cell(s)\n * \n * @return integer\n */\n obj.getStyle = function(cell, key) {\n // Cell\n if (! cell) {\n // Control vars\n var data = {};\n \n // Column and row length\n var x = obj.options.data[0].length;\n var y = obj.options.data.length;\n \n // Go through the columns to get the data\n for (var j = 0; j < y; j++) {\n for (var i = 0; i < x; i++) {\n // Value\n var v = key ? obj.records[j][i].style[key] : obj.records[j][i].getAttribute('style');\n \n // Any meta data for this column?\n if (v) {\n // Column name\n var k = jexcel.getColumnNameFromId([i, j]);\n // Value\n data[k] = v;\n }\n }\n }\n \n return data;\n } else {\n cell = jexcel.getIdFromColumnName(cell, true);\n \n return key ? obj.records[cell[1]][cell[0]].style[key] : obj.records[cell[1]][cell[0]].getAttribute('style');\n }\n },\n \n obj.resetStyle = function(o, ignoreHistoryAndEvents) {\n var keys = Object.keys(o);\n for (var i = 0; i < keys.length; i++) {\n // Position\n var cell = jexcel.getIdFromColumnName(keys[i], true);\n if (obj.records[cell[1]] && obj.records[cell[1]][cell[0]]) {\n obj.records[cell[1]][cell[0]].setAttribute('style', '');\n }\n }\n obj.setStyle(o, null, null, null, ignoreHistoryAndEvents);\n }\n \n /**\n * Set meta information to cell(s)\n * \n * @return integer\n */\n obj.setStyle = function(o, k, v, force, ignoreHistoryAndEvents) {\n var newValue = {};\n var oldValue = {};\n \n // Apply style\n var applyStyle = function(cellId, key, value) {\n // Position\n var cell = jexcel.getIdFromColumnName(cellId, true);\n \n if (obj.records[cell[1]] && obj.records[cell[1]][cell[0]]) {\n // Current value\n var currentValue = obj.records[cell[1]][cell[0]].style[key];\n \n // Change layout\n if (currentValue == value && ! force) {\n value = '';\n obj.records[cell[1]][cell[0]].style[key] = '';\n } else {\n obj.records[cell[1]][cell[0]].style[key] = value;\n }\n \n // History\n if (! oldValue[cellId]) {\n oldValue[cellId] = [];\n }\n if (! newValue[cellId]) {\n newValue[cellId] = [];\n }\n \n oldValue[cellId].push([key + ':' + currentValue]);\n newValue[cellId].push([key + ':' + value]);\n }\n }\n \n if (k && v) {\n // Get object from string\n if (typeof(o) == 'string') {\n applyStyle(o, k, v);\n } else {\n // Avoid duplications\n var oneApplication = [];\n // Apply that for all cells\n for (var i = 0; i < o.length; i++) {\n var x = o[i].getAttribute('data-x');\n var y = o[i].getAttribute('data-y');\n var cellName = jexcel.getColumnNameFromId([x, y]);\n // This happens when is a merged cell\n if (! oneApplication[cellName]) {\n applyStyle(cellName, k, v);\n oneApplication[cellName] = true;\n }\n }\n }\n } else {\n var keys = Object.keys(o);\n for (var i = 0; i < keys.length; i++) {\n var style = o[keys[i]];\n if (typeof(style) == 'string') {\n style = style.split(';');\n }\n for (var j = 0; j < style.length; j++) {\n if (typeof(style[j]) == 'string') {\n style[j] = style[j].split(':');\n }\n // Apply value\n if (style[j][0].trim()) {\n applyStyle(keys[i], style[j][0].trim(), style[j][1]);\n }\n }\n }\n }\n \n var keys = Object.keys(oldValue);\n for (var i = 0; i < keys.length; i++) {\n oldValue[keys[i]] = oldValue[keys[i]].join(';');\n }\n var keys = Object.keys(newValue);\n for (var i = 0; i < keys.length; i++) {\n newValue[keys[i]] = newValue[keys[i]].join(';');\n }\n \n if (! ignoreHistoryAndEvents) {\n // Keeping history of changes\n obj.setHistory({\n action: 'setStyle',\n oldValue: oldValue,\n newValue: newValue,\n });\n }\n\n obj.dispatch('onchangestyle', el, o, k, v);\n }\n\n /**\n * Get cell comments, null cell for all\n */\n obj.getComments = function(cell, withAuthor) {\n if (cell) {\n if (typeof(cell) == 'string') {\n var cell = jexcel.getIdFromColumnName(cell, true);\n }\n\n if (withAuthor) {\n return [obj.records[cell[1]][cell[0]].getAttribute('title'), obj.records[cell[1]][cell[0]].getAttribute('author')];\n } else {\n return obj.records[cell[1]][cell[0]].getAttribute('title') || '';\n }\n } else {\n var data = {};\n for (var j = 0; j < obj.options.data.length; j++) {\n for (var i = 0; i < obj.options.columns.length; i++) {\n var comments = obj.records[j][i].getAttribute('title');\n if (comments) {\n var cell = jexcel.getColumnNameFromId([i, j]);\n data[cell] = comments;\n }\n }\n }\n return data;\n }\n }\n\n /**\n * Set cell comments\n */\n obj.setComments = function(cellId, comments, author) {\n if (typeof(cellId) == 'string') {\n var cell = jexcel.getIdFromColumnName(cellId, true);\n } else {\n var cell = cellId;\n }\n \n // Keep old value\n var title = obj.records[cell[1]][cell[0]].getAttribute('title');\n var author = obj.records[cell[1]][cell[0]].getAttribute('data-author');\n var oldValue = [ title, author ];\n \n // Set new values\n obj.records[cell[1]][cell[0]].setAttribute('title', comments ? comments : '');\n obj.records[cell[1]][cell[0]].setAttribute('data-author', author ? author : '');\n \n // Remove class if there is no comment\n if (comments) {\n obj.records[cell[1]][cell[0]].classList.add('jexcel_comments');\n } else {\n obj.records[cell[1]][cell[0]].classList.remove('jexcel_comments');\n }\n \n // Save history\n obj.setHistory({\n action:'setComments',\n column: cellId,\n newValue: [ comments, author ],\n oldValue: oldValue,\n });\n }\n \n /**\n * Get table config information\n */\n obj.getConfig = function() {\n var options = obj.options;\n options.style = obj.getStyle();\n options.mergeCells = obj.getMerge();\n options.comments = obj.getComments();\n \n return options;\n }\n \n /**\n * Sort data and reload table\n */\n obj.orderBy = function(column, order) {\n if (column >= 0) {\n // Merged cells\n if (Object.keys(obj.options.mergeCells).length > 0) {\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\n return false;\n } else {\n // Remove merged cells\n obj.destroyMerged();\n }\n }\n \n // Direction\n if (order == null) {\n order = obj.headers[column].classList.contains('arrow-down') ? 1 : 0;\n } else {\n order = order ? 1 : 0;\n }\n \n // Filter\n Array.prototype.orderBy = function(p, o) {\n return this.slice(0).sort(function(a, b) {\n var valueA = a[p];\n var valueB = b[p];\n \n if (! o) {\n return (valueA == '' && valueB != '') ? 1 : (valueA != '' && valueB == '') ? -1 : (valueA > valueB) ? 1 : (valueA < valueB) ? -1 : 0;\n } else {\n return (valueA == '' && valueB != '') ? 1 : (valueA != '' && valueB == '') ? -1 : (valueA > valueB) ? -1 : (valueA < valueB) ? 1 : 0;\n }\n });\n }\n \n // Test order\n var temp = [];\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') {\n for (var j = 0; j < obj.options.data.length; j++) {\n temp[j] = [ j, Number(obj.options.data[j][column]) ];\n }\n } else if (obj.options.columns[column].type == 'calendar' || obj.options.columns[column].type == 'checkbox' || obj.options.columns[column].type == 'radio') {\n for (var j = 0; j < obj.options.data.length; j++) {\n temp[j] = [ j, obj.options.data[j][column] ];\n }\n } else {\n for (var j = 0; j < obj.options.data.length; j++) {\n temp[j] = [ j, obj.records[j][column].innerText.toLowerCase() ];\n }\n }\n temp = temp.orderBy(1, order);\n \n // Save history\n var newValue = [];\n for (var j = 0; j < temp.length; j++) {\n newValue[j] = temp[j][0];\n }\n \n // Save history\n obj.setHistory({\n action: 'orderBy',\n rows: newValue,\n column: column,\n order: order,\n });\n \n // Update order\n obj.updateOrderArrow(column, order);\n obj.updateOrder(newValue);\n \n // On sort event\n obj.dispatch('onsort', el, column, order);\n \n return true;\n }\n }\n \n /**\n * Update order arrow\n */\n obj.updateOrderArrow = function(column, order) {\n // Remove order\n for (var i = 0; i < obj.headers.length; i++) {\n obj.headers[i].classList.remove('arrow-up');\n obj.headers[i].classList.remove('arrow-down');\n }\n \n // No order specified then toggle order\n if (order) {\n obj.headers[column].classList.add('arrow-up');\n } else {\n obj.headers[column].classList.add('arrow-down');\n }\n }\n \n /**\n * Update rows position\n */\n obj.updateOrder = function(rows) {\n // History\n var data = []\n for (var j = 0; j < rows.length; j++) {\n data[j] = obj.options.data[rows[j]];\n }\n obj.options.data = data;\n \n var data = []\n for (var j = 0; j < rows.length; j++) {\n data[j] = obj.records[rows[j]];\n }\n obj.records = data;\n \n var data = []\n for (var j = 0; j < rows.length; j++) {\n data[j] = obj.rows[rows[j]];\n }\n obj.rows = data;\n \n // Update references\n obj.updateTableReferences();\n \n // Redo search\n if (obj.results && obj.results.length) {\n if (obj.searchInput.value) {\n obj.search(obj.searchInput.value);\n } else {\n obj.closeFilter();\n }\n } else {\n // Create page\n obj.results = null;\n obj.pageNumber = 0;\n \n if (obj.options.pagination > 0) {\n obj.page(0);\n } else if (obj.options.lazyLoading == true) {\n obj.loadPage(0);\n } else {\n for (var j = 0; j < obj.rows.length; j++) {\n obj.tbody.appendChild(obj.rows[j]);\n }\n }\n }\n }\n \n /**\n * Move row\n * \n * @return void\n */\n obj.moveRow = function(o, d, ignoreDom) {\n if (Object.keys(obj.options.mergeCells).length > 0) {\n if (o > d) {\n var insertBefore = 1;\n } else {\n var insertBefore = 0;\n }\n\n if (obj.isRowMerged(o).length || obj.isRowMerged(d, insertBefore).length) {\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\n return false;\n } else {\n obj.destroyMerged();\n }\n }\n }\n \n if (obj.options.search == true) {\n if (obj.results && obj.results.length != obj.rows.length) {\n if (confirm(obj.options.text.thisActionWillClearYourSearchResultsAreYouSure)) {\n obj.resetSearch();\n } else {\n return false;\n }\n }\n \n obj.results = null;\n }\n \n if (! ignoreDom) {\n if (Array.prototype.indexOf.call(obj.tbody.children, obj.rows[d]) >= 0) {\n if (o > d) {\n obj.tbody.insertBefore(obj.rows[o], obj.rows[d]);\n } else {\n obj.tbody.insertBefore(obj.rows[o], obj.rows[d].nextSibling);\n }\n } else {\n obj.tbody.removeChild(obj.rows[o]);\n }\n }\n \n // Place references in the correct position\n obj.rows.splice(d, 0, obj.rows.splice(o, 1)[0]);\n obj.records.splice(d, 0, obj.records.splice(o, 1)[0]);\n obj.options.data.splice(d, 0, obj.options.data.splice(o, 1)[0]);\n \n // Respect pagination\n if (obj.options.pagination > 0 && obj.tbody.children.length != obj.options.pagination) {\n obj.page(obj.pageNumber);\n }\n \n // Keeping history of changes\n obj.setHistory({\n action:'moveRow',\n oldValue: o,\n newValue: d,\n });\n \n // Update table references\n obj.updateTableReferences();\n \n // Events\n obj.dispatch('onmoverow', el, o, d);\n }\n\n /**\n * Insert a new row\n * \n * @param mixed - number of blank lines to be insert or a single array with the data of the new row\n * @param rowNumber\n * @param insertBefore\n * @return void\n */\n obj.insertRow = function(mixed, rowNumber, insertBefore) {\n // Configuration\n if (obj.options.allowInsertRow == true) {\n // Records\n var records = [];\n \n // Data to be insert\n var data = [];\n \n // The insert could be lead by number of rows or the array of data\n if (mixed > 0) {\n var numOfRows = mixed;\n } else {\n var numOfRows = 1;\n \n if (mixed) {\n data = mixed;\n }\n }\n \n // Direction\n var insertBefore = insertBefore ? true : false;\n \n // Current column number\n var lastRow = obj.options.data.length - 1;\n \n if (rowNumber == undefined || rowNumber >= parseInt(lastRow) || rowNumber < 0) {\n rowNumber = lastRow;\n }\n \n // Onbeforeinsertrow\n if (obj.dispatch('onbeforeinsertrow', el, rowNumber, numOfRows, insertBefore) === false) {\n console.log('onbeforeinsertrow returned false');\n\n return false;\n }\n \n // Merged cells\n if (Object.keys(obj.options.mergeCells).length > 0) {\n if (obj.isRowMerged(rowNumber, insertBefore).length) {\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\n return false;\n } else {\n obj.destroyMerged();\n }\n }\n }\n \n // Clear any search\n if (obj.options.search == true) {\n if (obj.results && obj.results.length != obj.rows.length) {\n if (confirm(obj.options.text.thisActionWillClearYourSearchResultsAreYouSure)) {\n obj.resetSearch();\n } else {\n return false;\n }\n }\n \n obj.results = null;\n }\n \n // Insertbefore\n var rowIndex = (! insertBefore) ? rowNumber + 1 : rowNumber;\n\n // Keep the current data\n var currentRecords = obj.records.splice(rowIndex);\n var currentData = obj.options.data.splice(rowIndex);\n var currentRows = obj.rows.splice(rowIndex);\n \n // Adding lines\n var rowRecords = [];\n var rowData = [];\n var rowNode = [];\n\n for (var row = rowIndex; row < (numOfRows + rowIndex); row++) {\n // Push data to the data container\n obj.options.data[row] = [];\n for (var col = 0; col < obj.options.columns.length; col++) {\n obj.options.data[row][col] = data[col] ? data[col] : '';\n }\n // Create row\n var tr = obj.createRow(row, obj.options.data[row]);\n // Append node\n if (currentRows[0]) {\n if (Array.prototype.indexOf.call(obj.tbody.children, currentRows[0]) >= 0) {\n obj.tbody.insertBefore(tr, currentRows[0]);\n }\n } else {\n if (Array.prototype.indexOf.call(obj.tbody.children, obj.rows[rowNumber]) >= 0) {\n obj.tbody.appendChild(tr);\n }\n }\n // Record History\n rowRecords.push(obj.records[row]);\n rowData.push(obj.options.data[row]);\n rowNode.push(tr);\n }\n \n // Copy the data back to the main data\n Array.prototype.push.apply(obj.records, currentRecords);\n Array.prototype.push.apply(obj.options.data, currentData);\n Array.prototype.push.apply(obj.rows, currentRows);\n \n // Respect pagination\n if (obj.options.pagination > 0) {\n obj.page(obj.pageNumber);\n }\n \n // Keep history\n obj.setHistory({\n action: 'insertRow',\n rowNumber: rowNumber,\n numOfRows: numOfRows,\n insertBefore: insertBefore,\n rowRecords: rowRecords,\n rowData: rowData,\n rowNode: rowNode,\n });\n \n // Remove table references\n obj.updateTableReferences();\n \n // Events\n obj.dispatch('oninsertrow', el, rowNumber, numOfRows, rowRecords, insertBefore);\n }\n }\n \n /**\n * Delete a row by number\n * \n * @param integer rowNumber - row number to be excluded\n * @param integer numOfRows - number of lines\n * @return void\n */\n obj.deleteRow = function(rowNumber, numOfRows) {\n // Global Configuration\n if (obj.options.allowDeleteRow == true) {\n if (obj.options.allowDeletingAllRows == true || obj.options.data.length > 1) {\n // Delete row definitions\n if (rowNumber == undefined) {\n var number = obj.getSelectedRows();\n \n if (! number[0]) {\n rowNumber = obj.options.data.length - 1;\n numOfRows = 1;\n } else {\n rowNumber = parseInt(number[0].getAttribute('data-y'));\n numOfRows = number.length;\n }\n }\n \n // Last column\n var lastRow = obj.options.data.length - 1;\n \n if (rowNumber == undefined || rowNumber > lastRow || rowNumber < 0) {\n rowNumber = lastRow;\n }\n \n if (! numOfRows) {\n numOfRows = 1;\n }\n \n // Do not delete more than the number of recoreds\n if (rowNumber + numOfRows >= obj.options.data.length) {\n numOfRows = obj.options.data.length - rowNumber;\n }\n\n // Onbeforedeleterow\n if (obj.dispatch('onbeforedeleterow', el, rowNumber, numOfRows) === false) {\n console.log('onbeforedeleterow returned false');\n return false;\n }\n \n if (parseInt(rowNumber) > -1) {\n // Merged cells\n var mergeExists = false;\n if (Object.keys(obj.options.mergeCells).length > 0) {\n for (var row = rowNumber; row < rowNumber + numOfRows; row++) {\n if (obj.isRowMerged(row, false).length) {\n mergeExists = true;\n }\n }\n }\n if (mergeExists) {\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\n return false;\n } else {\n obj.destroyMerged();\n }\n }\n \n // Clear any search\n if (obj.options.search == true) {\n if (obj.results && obj.results.length != obj.rows.length) {\n if (confirm(obj.options.text.thisActionWillClearYourSearchResultsAreYouSure)) {\n obj.resetSearch();\n } else {\n return false;\n }\n }\n \n obj.results = null;\n }\n \n // Remove node\n for (var row = rowNumber; row < rowNumber + numOfRows; row++) {\n if (Array.prototype.indexOf.call(obj.tbody.children, obj.rows[row]) >= 0) {\n obj.rows[row].className = '';\n obj.rows[row].parentNode.removeChild(obj.rows[row]);\n }\n }\n \n // Remove data\n var rowRecords = obj.records.splice(rowNumber, numOfRows);\n var rowData = obj.options.data.splice(rowNumber, numOfRows);\n var rowNode = obj.rows.splice(rowNumber, numOfRows);\n \n // Respect pagination\n if (obj.options.pagination > 0 && obj.tbody.children.length != obj.options.pagination) {\n obj.page(obj.pageNumber);\n }\n \n // Remove selection\n obj.conditionalSelectionUpdate(1, rowNumber, (rowNumber + numOfRows) - 1);\n \n // Keep history\n obj.setHistory({\n action: 'deleteRow',\n rowNumber: rowNumber,\n numOfRows: numOfRows,\n insertBefore: 1,\n rowRecords: rowRecords,\n rowData: rowData,\n rowNode: rowNode\n });\n \n // Remove table references\n obj.updateTableReferences();\n \n // Events\n obj.dispatch('ondeleterow', el, rowNumber, numOfRows, rowRecords);\n }\n } else {\n console.error('JEXCEL. It is not possible to delete the last row');\n }\n }\n }\n \n \n /**\n * Move column\n * \n * @return void\n */\n obj.moveColumn = function(o, d) {\n if (Object.keys(obj.options.mergeCells).length > 0) {\n if (o > d) {\n var insertBefore = 1;\n } else {\n var insertBefore = 0;\n }\n\n if (obj.isColMerged(o).length || obj.isColMerged(d, insertBefore).length) {\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\n return false;\n } else {\n obj.destroyMerged();\n }\n }\n }\n \n var o = parseInt(o);\n var d = parseInt(d);\n \n if (o > d) {\n obj.headerContainer.insertBefore(obj.headers[o], obj.headers[d]);\n obj.colgroupContainer.insertBefore(obj.colgroup[o], obj.colgroup[d]);\n \n for (var j = 0; j < obj.rows.length; j++) {\n obj.rows[j].insertBefore(obj.records[j][o], obj.records[j][d]);\n }\n } else {\n obj.headerContainer.insertBefore(obj.headers[o], obj.headers[d].nextSibling);\n obj.colgroupContainer.insertBefore(obj.colgroup[o], obj.colgroup[d].nextSibling);\n \n for (var j = 0; j < obj.rows.length; j++) {\n obj.rows[j].insertBefore(obj.records[j][o], obj.records[j][d].nextSibling);\n }\n }\n \n obj.options.columns.splice(d, 0, obj.options.columns.splice(o, 1)[0]);\n obj.headers.splice(d, 0, obj.headers.splice(o, 1)[0]);\n obj.colgroup.splice(d, 0, obj.colgroup.splice(o, 1)[0]);\n \n for (var j = 0; j < obj.rows.length; j++) {\n obj.options.data[j].splice(d, 0, obj.options.data[j].splice(o, 1)[0]);\n obj.records[j].splice(d, 0, obj.records[j].splice(o, 1)[0]);\n }\n \n // Update footers position\n if (obj.options.footers) {\n for (var j = 0; j < obj.options.footers.length; j++) {\n obj.options.footers[j].splice(d, 0, obj.options.footers[j].splice(o, 1)[0]);\n }\n }\n\n // Keeping history of changes\n obj.setHistory({\n action:'moveColumn',\n oldValue: o,\n newValue: d,\n });\n \n // Update table references\n obj.updateTableReferences();\n \n // Events\n obj.dispatch('onmovecolumn', el, o, d);\n }\n\n /**\n * Insert a new column\n * \n * @param mixed - num of columns to be added or data to be added in one single column\n * @param int columnNumber - number of columns to be created\n * @param bool insertBefore\n * @param object properties - column properties\n * @return void\n */\n obj.insertColumn = function(mixed, columnNumber, insertBefore, properties) {\n // Configuration\n if (obj.options.allowInsertColumn == true) {\n // Records\n var records = [];\n \n // Data to be insert\n var data = [];\n \n // The insert could be lead by number of rows or the array of data\n if (mixed > 0) {\n var numOfColumns = mixed;\n } else {\n var numOfColumns = 1;\n \n if (mixed) {\n data = mixed;\n }\n }\n \n // Direction\n var insertBefore = insertBefore ? true : false;\n \n // Current column number\n var lastColumn = obj.options.columns.length - 1;\n \n // Confirm position\n if (columnNumber == undefined || columnNumber >= parseInt(lastColumn) || columnNumber < 0) {\n columnNumber = lastColumn;\n }\n \n // Onbeforeinsertcolumn\n if (obj.dispatch('onbeforeinsertcolumn', el, columnNumber, numOfColumns, insertBefore) === false) {\n console.log('onbeforeinsertcolumn returned false');\n\n return false;\n }\n \n // Merged cells\n if (Object.keys(obj.options.mergeCells).length > 0) {\n if (obj.isColMerged(columnNumber, insertBefore).length) {\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\n return false;\n } else {\n obj.destroyMerged();\n }\n }\n }\n \n // Create default properties\n if (! properties) {\n properties = [];\n }\n \n for (var i = 0; i < numOfColumns; i++) {\n if (! properties[i]) {\n properties[i] = { type:'text', source:[], options:[], width:obj.options.defaultColWidth, align:obj.options.defaultColAlign };\n }\n }\n \n // Insert before\n var columnIndex = (! insertBefore) ? columnNumber + 1 : columnNumber;\n obj.options.columns = jexcel.injectArray(obj.options.columns, columnIndex, properties);\n \n // Open space in the containers\n var currentHeaders = obj.headers.splice(columnIndex);\n var currentColgroup = obj.colgroup.splice(columnIndex);\n \n // History\n var historyHeaders = [];\n var historyColgroup = [];\n var historyRecords = [];\n var historyData = [];\n var historyFooters = [];\n \n // Add new headers\n for (var col = columnIndex; col < (numOfColumns + columnIndex); col++) {\n obj.createCellHeader(col);\n obj.headerContainer.insertBefore(obj.headers[col], obj.headerContainer.children[col+1]);\n obj.colgroupContainer.insertBefore(obj.colgroup[col], obj.colgroupContainer.children[col+1]);\n \n historyHeaders.push(obj.headers[col]);\n historyColgroup.push(obj.colgroup[col]);\n }\n \n // Add new footer cells\n if (obj.options.footers) {\n for (var j = 0; j < obj.options.footers.length; j++) {\n historyFooters[j] = [];\n for (var i = 0; i < numOfColumns; i++) {\n historyFooters[j].push('');\n }\n obj.options.footers[j].splice(columnIndex, 0, historyFooters[j]);\n }\n }\n\n // Adding visual columns\n for (var row = 0; row < obj.options.data.length; row++) {\n // Keep the current data\n var currentData = obj.options.data[row].splice(columnIndex);\n var currentRecord = obj.records[row].splice(columnIndex);\n \n // History\n historyData[row] = [];\n historyRecords[row] = [];\n \n for (var col = columnIndex; col < (numOfColumns + columnIndex); col++) {\n // New value\n var value = data[row] ? data[row] : '';\n obj.options.data[row][col] = value;\n // New cell\n var td = obj.createCell(col, row, obj.options.data[row][col]);\n obj.records[row][col] = td;\n // Add cell to the row\n if (obj.rows[row]) {\n obj.rows[row].insertBefore(td, obj.rows[row].children[col+1]);\n }\n \n // Record History\n historyData[row].push(value);\n historyRecords[row].push(td);\n }\n \n // Copy the data back to the main data\n Array.prototype.push.apply(obj.options.data[row], currentData);\n Array.prototype.push.apply(obj.records[row], currentRecord);\n }\n \n Array.prototype.push.apply(obj.headers, currentHeaders);\n Array.prototype.push.apply(obj.colgroup, currentColgroup);\n \n // Adjust nested headers\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0) {\n // Flexible way to handle nestedheaders\n if (obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\n for (var j = 0; j < obj.options.nestedHeaders.length; j++) {\n var colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan) + numOfColumns;\n obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan = colspan;\n obj.thead.children[j].children[obj.thead.children[j].children.length-1].setAttribute('colspan', colspan);\n }\n } else {\n var colspan = parseInt(obj.options.nestedHeaders[0].colspan) + numOfColumns;\n obj.options.nestedHeaders[0].colspan = colspan;\n obj.thead.children[0].children[obj.thead.children[0].children.length-1].setAttribute('colspan', colspan);\n }\n }\n \n // Keep history\n obj.setHistory({\n action: 'insertColumn',\n columnNumber:columnNumber,\n numOfColumns:numOfColumns,\n insertBefore:insertBefore,\n columns:properties,\n headers:historyHeaders,\n colgroup:historyColgroup,\n records:historyRecords,\n footers:historyFooters,\n data:historyData,\n });\n \n // Remove table references\n obj.updateTableReferences();\n \n // Events\n obj.dispatch('oninsertcolumn', el, columnNumber, numOfColumns, historyRecords, insertBefore);\n }\n }\n \n /**\n * Delete a column by number\n * \n * @param integer columnNumber - reference column to be excluded\n * @param integer numOfColumns - number of columns to be excluded from the reference column\n * @return void\n */\n obj.deleteColumn = function(columnNumber, numOfColumns) {\n // Global Configuration\n if (obj.options.allowDeleteColumn == true) {\n if (obj.headers.length > 1) {\n // Delete column definitions\n if (columnNumber == undefined) {\n var number = obj.getSelectedColumns(true);\n \n if (! number.length) {\n // Remove last column\n columnNumber = obj.headers.length - 1;\n numOfColumns = 1;\n } else {\n // Remove selected\n columnNumber = parseInt(number[0]);\n numOfColumns = parseInt(number.length);\n }\n }\n \n // Lasat column\n var lastColumn = obj.options.data[0].length - 1;\n \n if (columnNumber == undefined || columnNumber > lastColumn || columnNumber < 0) {\n columnNumber = lastColumn;\n }\n \n // Minimum of columns to be delete is 1\n if (! numOfColumns) {\n numOfColumns = 1;\n }\n \n // Can't delete more than the limit of the table\n if (numOfColumns > obj.options.data[0].length - columnNumber) {\n numOfColumns = obj.options.data[0].length - columnNumber;\n }\n \n // onbeforedeletecolumn\n if (obj.dispatch('onbeforedeletecolumn', el, columnNumber, numOfColumns) === false) {\n console.log('onbeforedeletecolumn returned false');\n return false;\n }\n \n // Can't remove the last column\n if (parseInt(columnNumber) > -1) {\n // Merged cells\n var mergeExists = false;\n if (Object.keys(obj.options.mergeCells).length > 0) {\n for (var col = columnNumber; col < columnNumber + numOfColumns; col++) {\n if (obj.isColMerged(col, false).length) {\n mergeExists = true;\n }\n }\n }\n if (mergeExists) {\n if (! confirm(obj.options.text.thisActionWillDestroyAnyExistingMergedCellsAreYouSure)) {\n return false;\n } else {\n obj.destroyMerged();\n }\n }\n \n // Delete the column properties\n var columns = obj.options.columns.splice(columnNumber, numOfColumns);\n \n for (var col = columnNumber; col < columnNumber + numOfColumns; col++) {\n obj.colgroup[col].className = '';\n obj.headers[col].className = '';\n obj.colgroup[col].parentNode.removeChild(obj.colgroup[col]);\n obj.headers[col].parentNode.removeChild(obj.headers[col]);\n }\n \n var historyHeaders = obj.headers.splice(columnNumber, numOfColumns);\n var historyColgroup = obj.colgroup.splice(columnNumber, numOfColumns);\n var historyRecords = [];\n var historyData = [];\n var historyFooters = [];\n\n for (var row = 0; row < obj.options.data.length; row++) {\n for (var col = columnNumber; col < columnNumber + numOfColumns; col++) {\n obj.records[row][col].className = '';\n obj.records[row][col].parentNode.removeChild(obj.records[row][col]);\n }\n }\n \n // Delete headers\n for (var row = 0; row < obj.options.data.length; row++) {\n // History\n historyData[row] = obj.options.data[row].splice(columnNumber, numOfColumns);\n historyRecords[row] = obj.records[row].splice(columnNumber, numOfColumns);\n }\n\n // Delete footers\n if (obj.options.footers) {\n for (var row = 0; row < obj.options.footers.length; row++) {\n historyFooters[row] = obj.options.footers[row].splice(columnNumber, numOfColumns);\n }\n }\n\n // Remove selection\n obj.conditionalSelectionUpdate(0, columnNumber, (columnNumber + numOfColumns) - 1);\n \n // Adjust nested headers\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0) {\n // Flexible way to handle nestedheaders\n if (obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\n for (var j = 0; j < obj.options.nestedHeaders.length; j++) {\n var colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan) - numOfColumns;\n obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan = colspan;\n obj.thead.children[j].children[obj.thead.children[j].children.length-1].setAttribute('colspan', colspan);\n }\n } else {\n var colspan = parseInt(obj.options.nestedHeaders[0].colspan) - numOfColumns;\n obj.options.nestedHeaders[0].colspan = colspan;\n obj.thead.children[0].children[obj.thead.children[0].children.length-1].setAttribute('colspan', colspan);\n }\n }\n \n // Keeping history of changes\n obj.setHistory({\n action:'deleteColumn',\n columnNumber:columnNumber,\n numOfColumns:numOfColumns,\n insertBefore: 1,\n columns:columns,\n headers:historyHeaders,\n colgroup:historyColgroup,\n records:historyRecords,\n footers:historyFooters,\n data:historyData,\n });\n \n // Update table references\n obj.updateTableReferences();\n \n // Delete\n obj.dispatch('ondeletecolumn', el, columnNumber, numOfColumns, historyRecords);\n }\n } else {\n console.error('JEXCEL. It is not possible to delete the last column');\n }\n }\n }\n \n /**\n * Get seleted rows numbers\n * \n * @return array\n */\n obj.getSelectedRows = function(asIds) {\n var rows = [];\n // Get all selected rows\n for (var j = 0; j < obj.rows.length; j++) {\n if (obj.rows[j].classList.contains('selected')) {\n if (asIds) {\n rows.push(j);\n } else {\n rows.push(obj.rows[j]);\n }\n }\n }\n \n return rows;\n },\n \n /**\n * Get seleted column numbers\n * \n * @return array\n */\n obj.getSelectedColumns = function() {\n var cols = [];\n // Get all selected cols\n for (var i = 0; i < obj.headers.length; i++) {\n if (obj.headers[i].classList.contains('selected')) {\n cols.push(i);\n }\n }\n \n return cols;\n }\n \n /**\n * Get highlighted\n * \n * @return array\n */\n obj.getHighlighted = function() {\n return obj.highlighted;\n }\n \n /**\n * Update cell references\n * \n * @return void\n */\n obj.updateTableReferences = function() {\n // Update headers\n for (var i = 0; i < obj.headers.length; i++) {\n var x = obj.headers[i].getAttribute('data-x');\n \n if (x != i) {\n // Update coords\n obj.headers[i].setAttribute('data-x', i);\n // Title\n if (! obj.headers[i].getAttribute('title')) {\n obj.headers[i].innerHTML = jexcel.getColumnName(i);\n }\n }\n }\n \n // Update all rows\n for (var j = 0; j < obj.rows.length; j++) {\n if (obj.rows[j]) {\n var y = obj.rows[j].getAttribute('data-y');\n \n if (y != j) {\n // Update coords\n obj.rows[j].setAttribute('data-y', j);\n obj.rows[j].children[0].setAttribute('data-y', j);\n // Row number\n obj.rows[j].children[0].innerHTML = j + 1;\n }\n }\n }\n \n // Regular cells affected by this change\n var affectedTokens = [];\n var mergeCellUpdates = [];\n \n // Update cell\n var updatePosition = function(x,y,i,j) {\n if (x != i) {\n obj.records[j][i].setAttribute('data-x', i);\n }\n if (y != j) {\n obj.records[j][i].setAttribute('data-y', j);\n }\n \n // Other updates\n if (x != i || y != j) {\n var columnIdFrom = jexcel.getColumnNameFromId([x, y]);\n var columnIdTo = jexcel.getColumnNameFromId([i, j]);\n affectedTokens[columnIdFrom] = columnIdTo;\n }\n }\n \n for (var j = 0; j < obj.records.length; j++) {\n for (var i = 0; i < obj.records[0].length; i++) {\n if (obj.records[j][i]) {\n // Current values\n var x = obj.records[j][i].getAttribute('data-x');\n var y = obj.records[j][i].getAttribute('data-y');\n \n // Update column\n if (obj.records[j][i].getAttribute('data-merged')) {\n var columnIdFrom = jexcel.getColumnNameFromId([x, y]);\n var columnIdTo = jexcel.getColumnNameFromId([i, j]);\n if (mergeCellUpdates[columnIdFrom] == null) {\n if (columnIdFrom == columnIdTo) {\n mergeCellUpdates[columnIdFrom] = false;\n } else {\n var totalX = parseInt(i - x);\n var totalY = parseInt(j - y);\n mergeCellUpdates[columnIdFrom] = [ columnIdTo, totalX, totalY ];\n }\n }\n } else {\n updatePosition(x,y,i,j);\n }\n }\n }\n }\n \n // Update merged if applicable\n var keys = Object.keys(mergeCellUpdates);\n if (keys.length) {\n for (var i = 0; i < keys.length; i++) {\n if (mergeCellUpdates[keys[i]]) {\n var info = jexcel.getIdFromColumnName(keys[i], true)\n var x = info[0];\n var y = info[1];\n updatePosition(x,y,x + mergeCellUpdates[keys[i]][1],y + mergeCellUpdates[keys[i]][2]);\n \n var columnIdFrom = keys[i];\n var columnIdTo = mergeCellUpdates[keys[i]][0];\n for (var j = 0; j < obj.options.mergeCells[columnIdFrom][2].length; j++) {\n var x = parseInt(obj.options.mergeCells[columnIdFrom][2][j].getAttribute('data-x'));\n var y = parseInt(obj.options.mergeCells[columnIdFrom][2][j].getAttribute('data-y'));\n obj.options.mergeCells[columnIdFrom][2][j].setAttribute('data-x', x + mergeCellUpdates[keys[i]][1]);\n obj.options.mergeCells[columnIdFrom][2][j].setAttribute('data-y', y + mergeCellUpdates[keys[i]][2]);\n }\n \n obj.options.mergeCells[columnIdTo] = obj.options.mergeCells[columnIdFrom];\n delete(obj.options.mergeCells[columnIdFrom]);\n }\n }\n }\n \n // Update formulas\n obj.updateFormulas(affectedTokens);\n \n // Update meta data\n obj.updateMeta(affectedTokens);\n \n // Refresh selection\n obj.refreshSelection();\n \n // Update table with custom configuration if applicable\n obj.updateTable();\n }\n \n /**\n * Custom settings for the cells\n */\n obj.updateTable = function() {\n // Check for spare\n if (obj.options.minSpareRows > 0) {\n var numBlankRows = 0;\n for (var j = obj.rows.length - 1; j >= 0; j--) {\n var test = false;\n for (var i = 0; i < obj.headers.length; i++) {\n if (obj.options.data[j][i]) {\n test = true;\n }\n }\n if (test) {\n break;\n } else {\n numBlankRows++;\n }\n }\n \n if (obj.options.minSpareRows - numBlankRows > 0) {\n obj.insertRow(obj.options.minSpareRows - numBlankRows)\n }\n }\n \n if (obj.options.minSpareCols > 0) {\n var numBlankCols = 0;\n for (var i = obj.headers.length - 1; i >= 0 ; i--) {\n var test = false;\n for (var j = 0; j < obj.rows.length; j++) {\n if (obj.options.data[j][i]) {\n test = true;\n }\n }\n if (test) {\n break;\n } else {\n numBlankCols++;\n }\n }\n \n if (obj.options.minSpareCols - numBlankCols > 0) {\n obj.insertColumn(obj.options.minSpareCols - numBlankCols)\n }\n }\n \n // Customizations by the developer\n if (typeof(obj.options.updateTable) == 'function') {\n if (obj.options.detachForUpdates) {\n el.removeChild(obj.content);\n }\n\n for (var j = 0; j < obj.rows.length; j++) {\n for (var i = 0; i < obj.headers.length; i++) {\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]));\n }\n }\n\n if (obj.options.detachForUpdates) {\n el.insertBefore(obj.content, obj.pagination);\n }\n }\n \n // Update footers\n if (obj.options.footers) {\n obj.setFooter();\n }\n\n // Update corner position\n setTimeout(function() {\n obj.updateCornerPosition();\n },0);\n }\n\n /**\n * Show row\n */\n obj.showRow = function(rowNumber) {\n obj.rows[rowNumber].style.display = '';\n }\n\n /**\n * Hide row\n */\n obj.hideRow = function(rowNumber) {\n obj.rows[rowNumber].style.display = 'none';\n }\n\n /**\n * Show column\n */\n obj.showColumn = function(colNumber) {\n obj.headers[colNumber].style.display = '';\n obj.colgroup[colNumber].style.display = '';\n for (var j = 0; j < obj.options.data.length; j++) {\n obj.records[j][colNumber].style.display = '';\n }\n }\n\n /**\n * Hide column\n */\n obj.hideColumn = function(colNumber) {\n obj.headers[colNumber].style.display = 'none';\n obj.colgroup[colNumber].style.display = 'none';\n for (var j = 0; j < obj.options.data.length; j++) {\n obj.records[j][colNumber].style.display = 'none';\n }\n }\n\n /**\n * Show index column\n */\n obj.showIndex = function() {\n obj.table.classList.remove('jexcel_hidden_index');\n }\n \n /**\n * Hide index column\n */\n obj.hideIndex = function() {\n obj.table.classList.add('jexcel_hidden_index');\n }\n \n /**\n * Update all related cells in the chain\n */\n var chainLoopProtection = [];\n \n obj.updateFormulaChain = function(x, y, records) {\n var cellId = jexcel.getColumnNameFromId([x, y]);\n if (obj.formula[cellId] && obj.formula[cellId].length > 0) {\n if (chainLoopProtection[cellId]) {\n obj.records[y][x].innerHTML = '#ERROR';\n obj.formula[cellId] = '';\n } else {\n // Protection\n chainLoopProtection[cellId] = true;\n \n for (var i = 0; i < obj.formula[cellId].length; i++) {\n var cell = jexcel.getIdFromColumnName(obj.formula[cellId][i], true);\n // Update cell\n var value = ''+obj.options.data[cell[1]][cell[0]];\n if (value.substr(0,1) == '=') {\n records.push(obj.updateCell(cell[0], cell[1], value, true));\n } else {\n // No longer a formula, remove from the chain\n Object.keys(obj.formula)[i] = null;\n }\n obj.updateFormulaChain(cell[0], cell[1], records);\n }\n }\n }\n \n chainLoopProtection = [];\n }\n \n /**\n * Update formulas\n */\n obj.updateFormulas = function(referencesToUpdate) {\n // Update formulas\n for (var j = 0; j < obj.options.data.length; j++) {\n for (var i = 0; i < obj.options.data[0].length; i++) {\n var value = '' + obj.options.data[j][i];\n // Is formula\n if (value.substr(0,1) == '=') {\n // Replace tokens\n var newFormula = obj.updateFormula(value, referencesToUpdate);\n if (newFormula != value) {\n obj.options.data[j][i] = newFormula;\n }\n }\n }\n }\n \n // Update formula chain\n var formula = [];\n var keys = Object.keys(obj.formula);\n for (var j = 0; j < keys.length; j++) {\n // Current key and values\n var key = keys[j];\n var value = obj.formula[key];\n // Update key\n if (referencesToUpdate[key]) {\n key = referencesToUpdate[key];\n }\n // Update values\n formula[key] = [];\n for (var i = 0; i < value.length; i++) {\n var letter = value[i];\n if (referencesToUpdate[letter]) {\n letter = referencesToUpdate[letter];\n }\n formula[key].push(letter);\n }\n }\n obj.formula = formula;\n }\n \n /**\n * Update formula\n */\n obj.updateFormula = function(formula, referencesToUpdate) {\n var testLetter = /[A-Z]/;\n var testNumber = /[0-9]/;\n \n var newFormula = '';\n var letter = null;\n var number = null;\n var token = '';\n \n for (var index = 0; index < formula.length; index++) {\n if (testLetter.exec(formula[index])) {\n letter = 1;\n number = 0;\n token += formula[index];\n } else if (testNumber.exec(formula[index])) {\n number = letter ? 1 : 0;\n token += formula[index];\n } else {\n if (letter && number) {\n token = referencesToUpdate[token] ? referencesToUpdate[token] : token;\n }\n newFormula += token;\n newFormula += formula[index];\n letter = 0;\n number = 0;\n token = '';\n }\n }\n \n if (token) {\n if (letter && number) {\n token = referencesToUpdate[token] ? referencesToUpdate[token] : token;\n }\n newFormula += token;\n }\n \n return newFormula;\n }\n \n /**\n * Secure formula\n */\n var secureFormula = function(oldValue) {\n var newValue = '';\n var inside = 0;\n\n for (var i = 0; i < oldValue.length; i++) {\n if (oldValue[i] == '\"') {\n if (inside == 0) {\n inside = 1;\n } else {\n inside = 0;\n }\n }\n\n if (inside == 1) {\n newValue += oldValue[i];\n } else {\n newValue += oldValue[i].toUpperCase();\n }\n }\n\n return newValue;\n }\n\n /**\n * Parse formulas\n */\n obj.executeFormula = function(expression, x, y) {\n \n var formulaResults = [];\n var formulaLoopProtection = [];\n \n // Execute formula with loop protection\n var execute = function(expression, x, y) {\n // Parent column identification\n var parentId = jexcel.getColumnNameFromId([x, y]);\n \n // Code protection\n if (formulaLoopProtection[parentId]) {\n console.error('Reference loop detected');\n return '#ERROR';\n }\n \n formulaLoopProtection[parentId] = true;\n \n // Convert range tokens\n var tokensUpdate = function(tokens) {\n for (var index = 0; index < tokens.length; index++) {\n var f = [];\n var token = tokens[index].split(':');\n var e1 = jexcel.getIdFromColumnName(token[0], true);\n var e2 = jexcel.getIdFromColumnName(token[1], true);\n \n if (e1[0] <= e2[0]) {\n var x1 = e1[0];\n var x2 = e2[0];\n } else {\n var x1 = e2[0];\n var x2 = e1[0];\n }\n \n if (e1[1] <= e2[1]) {\n var y1 = e1[1];\n var y2 = e2[1];\n } else {\n var y1 = e2[1];\n var y2 = e1[1];\n }\n \n for (var j = y1; j <= y2; j++) {\n for (var i = x1; i <= x2; i++) {\n f.push(jexcel.getColumnNameFromId([i, j]));\n }\n }\n \n expression = expression.replace(tokens[index], f.join(','));\n }\n }\n \n var tokens = expression.match(/([A-Z]+[0-9]+)\\:([A-Z]+[0-9]+)/g);\n if (tokens && tokens.length) {\n tokensUpdate(tokens);\n }\n \n // String\n var evalstring = '';\n \n // Get tokens\n var tokens = expression.match(/([A-Z]+[0-9]+)/g);\n \n // Direct self-reference protection\n if (tokens && tokens.indexOf(parentId) > -1) {\n console.error('Self Reference detected');\n return '#ERROR';\n } else {\n if (tokens) {\n for (var i = 0; i < tokens.length; i++) {\n // Keep chain\n if (! obj.formula[tokens[i]]) {\n obj.formula[tokens[i]] = [];\n }\n // Is already in the register\n if (obj.formula[tokens[i]].indexOf(parentId) < 0) {\n obj.formula[tokens[i]].push(parentId);\n }\n \n // Do not calculate again\n if (eval('typeof(' + tokens[i] + ') == \"undefined\"')) {\n // Coords\n var position = jexcel.getIdFromColumnName(tokens[i], 1);\n // Get value\n if (typeof(obj.options.data[position[1]]) != 'undefined' && typeof(obj.options.data[position[1]][position[0]]) != 'undefined') {\n var value = obj.options.data[position[1]][position[0]];\n } else {\n var value = '';\n }\n // Get column data\n if ((''+value).substr(0,1) == '=') {\n if (formulaResults[tokens[i]]) {\n value = formulaResults[tokens[i]];\n } else {\n value = execute(value, position[0], position[1]);\n formulaResults[tokens[i]] = value;\n }\n }\n // Type!\n if ((''+value).trim() == '') {\n // Null\n evalstring += \"var \" + tokens[i] + \" = null;\";\n } else {\n if (value == Number(value) && obj.options.autoCasting == true) {\n // Number\n evalstring += \"var \" + tokens[i] + \" = \" + Number(value) + \";\";\n } else {\n // Trying any formatted number\n var number = obj.parseNumber(value, position[0])\n if (obj.options.autoCasting == true && number) {\n // Render as number\n evalstring += \"var \" + tokens[i] + \" = \" + number + \";\";\n } else {\n // Render as string\n evalstring += \"var \" + tokens[i] + \" = '\" + value + \"';\";\n }\n }\n }\n }\n }\n }\n \n // Convert formula to javascript\n try {\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; }\";\n \n var res = eval(evalstring + expression.substr(1));\n } catch (e) {\n var res = '#ERROR';\n }\n \n return res;\n }\n }\n \n return execute(expression, x, y);\n }\n \n /**\n * Trying to extract a number from a string\n */\n obj.parseNumber = function(value, columnNumber) {\n // Decimal point\n var decimal = columnNumber && obj.options.columns[columnNumber].decimal ? obj.options.columns[columnNumber].decimal : '.';\n \n // Parse both parts of the number\n var number = ('' + value);\n number = number.split(decimal);\n number[0] = number[0].match(/[+-]?[0-9]/g);\n if (number[0]) {\n number[0] = number[0].join('');\n }\n if (number[1]) {\n number[1] = number[1].match(/[0-9]*/g).join('');\n }\n \n // Is a valid number\n if (number[0] && Number(number[0]) >= 0) {\n if (! number[1]) {\n var value = Number(number[0] + '.00');\n } else {\n var value = Number(number[0] + '.' + number[1]);\n }\n } else {\n var value = null;\n }\n \n return value;\n }\n \n /**\n * Get row number\n */\n obj.row = function(cell) {\n }\n \n /**\n * Get col number\n */\n obj.col = function(cell) {\n }\n \n obj.up = function(shiftKey, ctrlKey) {\n if (shiftKey) {\n if (obj.selectedCell[3] > 0) {\n obj.up.visible(1, ctrlKey ? 0 : 1)\n }\n } else {\n if (obj.selectedCell[1] > 0) {\n obj.up.visible(0, ctrlKey ? 0 : 1)\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n \n // Update selection\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n \n // Change page\n if (obj.options.lazyLoading == true) {\n if (obj.selectedCell[1] == 0 || obj.selectedCell[3] == 0) {\n obj.loadPage(0);\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n } else {\n if (obj.loadValidation()) {\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n } else {\n var item = parseInt(obj.tbody.firstChild.getAttribute('data-y'));\n if (obj.selectedCell[1] - item < 30) {\n obj.loadUp();\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n }\n }\n }\n } else if (obj.options.pagination > 0) {\n var pageNumber = obj.whichPage(obj.selectedCell[3]);\n if (pageNumber != obj.pageNumber) {\n obj.page(pageNumber);\n }\n }\n \n obj.updateScroll(1);\n }\n \n obj.up.visible = function(group, direction) {\n if (group == 0) {\n var x = parseInt(obj.selectedCell[0]);\n var y = parseInt(obj.selectedCell[1]);\n } else {\n var x = parseInt(obj.selectedCell[2]);\n var y = parseInt(obj.selectedCell[3]);\n }\n \n if (direction == 0) {\n for (var j = 0; j < y; j++) {\n if (obj.records[j][x].style.display != 'none' && obj.rows[j].style.display != 'none') {\n y = j;\n break;\n }\n }\n } else {\n y = obj.up.get(x, y);\n }\n \n if (group == 0) {\n obj.selectedCell[0] = x;\n obj.selectedCell[1] = y;\n } else {\n obj.selectedCell[2] = x;\n obj.selectedCell[3] = y;\n }\n }\n \n obj.up.get = function(x, y) {\n var x = parseInt(x);\n var y = parseInt(y);\n for (var j = (y - 1); j >= 0; j--) {\n if (obj.records[j][x].style.display != 'none' && obj.rows[j].style.display != 'none') {\n if (obj.records[j][x].getAttribute('data-merged')) {\n if (obj.records[j][x] == obj.records[y][x]) {\n continue;\n }\n }\n y = j;\n break;\n }\n }\n \n return y;\n }\n \n obj.down = function(shiftKey, ctrlKey) {\n if (shiftKey) {\n if (obj.selectedCell[3] < obj.records.length - 1) {\n obj.down.visible(1, ctrlKey ? 0 : 1)\n }\n } else {\n if (obj.selectedCell[1] < obj.records.length - 1) {\n obj.down.visible(0, ctrlKey ? 0 : 1)\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n \n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n \n // Change page\n if (obj.options.lazyLoading == true) {\n if ((obj.selectedCell[1] == obj.records.length - 1 || obj.selectedCell[3] == obj.records.length - 1)) {\n obj.loadPage(-1);\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n } else {\n if (obj.loadValidation()) {\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n } else {\n var item = parseInt(obj.tbody.lastChild.getAttribute('data-y'));\n if (item - obj.selectedCell[3] < 30) {\n obj.loadDown();\n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n }\n }\n }\n } else if (obj.options.pagination > 0) {\n var pageNumber = obj.whichPage(obj.selectedCell[3]);\n if (pageNumber != obj.pageNumber) {\n obj.page(pageNumber);\n }\n }\n \n obj.updateScroll(3);\n }\n \n obj.down.visible = function(group, direction) {\n if (group == 0) {\n var x = parseInt(obj.selectedCell[0]);\n var y = parseInt(obj.selectedCell[1]);\n } else {\n var x = parseInt(obj.selectedCell[2]);\n var y = parseInt(obj.selectedCell[3]);\n }\n \n if (direction == 0) {\n for (var j = obj.rows.length - 1; j > y; j--) {\n if (obj.records[j][x].style.display != 'none' && obj.rows[j].style.display != 'none') {\n y = j;\n break;\n }\n }\n } else {\n y = obj.down.get(x, y);\n }\n \n if (group == 0) {\n obj.selectedCell[0] = x;\n obj.selectedCell[1] = y;\n } else {\n obj.selectedCell[2] = x;\n obj.selectedCell[3] = y;\n }\n }\n \n obj.down.get = function(x, y) {\n var x = parseInt(x);\n var y = parseInt(y);\n for (var j = (y + 1); j < obj.rows.length; j++) {\n if (obj.records[j][x].style.display != 'none' && obj.rows[j].style.display != 'none') {\n if (obj.records[j][x].getAttribute('data-merged')) {\n if (obj.records[j][x] == obj.records[y][x]) {\n continue;\n }\n }\n y = j;\n break;\n }\n }\n \n return y;\n }\n \n obj.right = function(shiftKey, ctrlKey) {\n if (shiftKey) {\n if (obj.selectedCell[2] < obj.headers.length - 1) {\n obj.right.visible(1, ctrlKey ? 0 : 1)\n }\n } else {\n if (obj.selectedCell[0] < obj.headers.length - 1) {\n obj.right.visible(0, ctrlKey ? 0 : 1)\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n \n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n obj.updateScroll(2);\n }\n \n obj.right.visible = function(group, direction) {\n if (group == 0) {\n var x = parseInt(obj.selectedCell[0]);\n var y = parseInt(obj.selectedCell[1]);\n } else {\n var x = parseInt(obj.selectedCell[2]);\n var y = parseInt(obj.selectedCell[3]);\n }\n \n if (direction == 0) {\n for (var i = obj.headers.length - 1; i > x; i--) {\n if (obj.records[y][i].style.display != 'none') {\n x = i;\n break;\n }\n }\n } else {\n x = obj.right.get(x, y);\n }\n \n if (group == 0) {\n obj.selectedCell[0] = x;\n obj.selectedCell[1] = y;\n } else {\n obj.selectedCell[2] = x;\n obj.selectedCell[3] = y;\n }\n }\n \n obj.right.get = function(x, y) {\n var x = parseInt(x);\n var y = parseInt(y);\n \n for (var i = (x + 1); i < obj.headers.length; i++) {\n if (obj.records[y][i].style.display != 'none') {\n if (obj.records[y][i].getAttribute('data-merged')) {\n if (obj.records[y][i] == obj.records[y][x]) {\n continue;\n }\n }\n x = i;\n break;\n }\n }\n \n return x;\n }\n \n obj.left = function(shiftKey, ctrlKey) {\n if (shiftKey) {\n if (obj.selectedCell[2] > 0) {\n obj.left.visible(1, ctrlKey ? 0 : 1)\n }\n } else {\n if (obj.selectedCell[0] > 0) {\n obj.left.visible(0, ctrlKey ? 0 : 1)\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n \n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n obj.updateScroll(0);\n }\n \n obj.left.visible = function(group, direction) {\n if (group == 0) {\n var x = parseInt(obj.selectedCell[0]);\n var y = parseInt(obj.selectedCell[1]);\n } else {\n var x = parseInt(obj.selectedCell[2]);\n var y = parseInt(obj.selectedCell[3]);\n }\n \n if (direction == 0) {\n for (var i = 0; i < x; i++) {\n if (obj.records[y][i].style.display != 'none') {\n x = i;\n break;\n }\n }\n } else {\n x = obj.left.get(x, y);\n }\n \n if (group == 0) {\n obj.selectedCell[0] = x;\n obj.selectedCell[1] = y;\n } else {\n obj.selectedCell[2] = x;\n obj.selectedCell[3] = y;\n }\n }\n \n obj.left.get = function(x, y) {\n var x = parseInt(x);\n var y = parseInt(y);\n for (var i = (x - 1); i >= 0; i--) {\n if (obj.records[y][i].style.display != 'none') {\n if (obj.records[y][i].getAttribute('data-merged')) {\n if (obj.records[y][i] == obj.records[y][x]) {\n continue;\n }\n }\n x = i;\n break;\n }\n }\n \n return x;\n }\n \n obj.first = function(shiftKey, ctrlKey) {\n if (shiftKey) {\n if (ctrlKey) {\n obj.selectedCell[3] = 0;\n } else {\n obj.left.visible(1, 0);\n }\n } else {\n if (ctrlKey) {\n obj.selectedCell[1] = 0;\n } else {\n obj.left.visible(0, 0);\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n \n // Change page\n if (obj.options.lazyLoading == true && (obj.selectedCell[1] == 0 || obj.selectedCell[3] == 0)) {\n obj.loadPage(0);\n } else if (obj.options.pagination > 0) {\n var pageNumber = obj.whichPage(obj.selectedCell[3]);\n if (pageNumber != obj.pageNumber) {\n obj.page(pageNumber);\n }\n }\n \n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n obj.updateScroll(1);\n }\n \n obj.last = function(shiftKey, ctrlKey) {\n if (shiftKey) {\n if (ctrlKey) {\n obj.selectedCell[3] = obj.records.length - 1;\n } else {\n obj.right.visible(1, 0);\n }\n } else {\n if (ctrlKey) {\n obj.selectedCell[1] = obj.records.length - 1;\n } else {\n obj.right.visible(0, 0);\n }\n obj.selectedCell[2] = obj.selectedCell[0];\n obj.selectedCell[3] = obj.selectedCell[1];\n }\n \n // Change page\n if (obj.options.lazyLoading == true && (obj.selectedCell[1] == obj.records.length - 1 || obj.selectedCell[3] == obj.records.length - 1)) {\n obj.loadPage(-1);\n } else if (obj.options.pagination > 0) {\n var pageNumber = obj.whichPage(obj.selectedCell[3]);\n if (pageNumber != obj.pageNumber) {\n obj.page(pageNumber);\n }\n }\n \n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n obj.updateScroll(3);\n }\n \n obj.selectAll = function() {\n if (! obj.selectedCell) {\n obj.selectedCell = [];\n }\n \n obj.selectedCell[0] = 0;\n obj.selectedCell[1] = 0;\n obj.selectedCell[2] = obj.headers.length - 1;\n obj.selectedCell[3] = obj.records.length - 1;\n \n obj.updateSelectionFromCoords(obj.selectedCell[0], obj.selectedCell[1], obj.selectedCell[2], obj.selectedCell[3]);\n }\n \n /**\n * Go to a page in a lazyLoading\n */\n obj.loadPage = function(pageNumber) {\n // Search\n if (obj.options.search == true && obj.results) {\n var results = obj.results;\n } else {\n var results = obj.rows;\n }\n \n // Per page\n var quantityPerPage = 100;\n \n // pageNumber\n if (pageNumber == null || pageNumber == -1) {\n // Last page\n pageNumber = Math.ceil(results.length / quantityPerPage); \n }\n \n var startRow = (pageNumber * quantityPerPage);\n var finalRow = (pageNumber * quantityPerPage) + quantityPerPage;\n if (finalRow > results.length) {\n finalRow = results.length;\n }\n startRow = finalRow - 100;\n if (startRow < 0) {\n startRow = 0;\n }\n \n // Appeding items\n for (var j = startRow; j < finalRow; j++) {\n if (obj.options.search == true && obj.results) {\n obj.tbody.appendChild(obj.rows[results[j]]);\n } else {\n obj.tbody.appendChild(obj.rows[j]);\n }\n \n if (obj.tbody.children.length > quantityPerPage) {\n obj.tbody.removeChild(obj.tbody.firstChild);\n }\n }\n }\n \n obj.loadUp = function() {\n // Search\n if (obj.options.search == true && obj.results) {\n var results = obj.results;\n } else {\n var results = obj.rows;\n }\n var test = 0;\n if (results.length > 100) {\n // Get the first element in the page\n var item = parseInt(obj.tbody.firstChild.getAttribute('data-y'));\n if (obj.options.search == true && obj.results) {\n item = results.indexOf(item);\n }\n if (item > 0) {\n for (var j = 0; j < 30; j++) {\n item = item - 1;\n if (item > -1) {\n if (obj.options.search == true && obj.results) {\n obj.tbody.insertBefore(obj.rows[results[item]], obj.tbody.firstChild);\n } else {\n obj.tbody.insertBefore(obj.rows[item], obj.tbody.firstChild);\n }\n if (obj.tbody.children.length > 100) {\n obj.tbody.removeChild(obj.tbody.lastChild);\n test = 1;\n }\n }\n }\n }\n }\n return test;\n }\n \n obj.loadDown = function() {\n // Search\n if (obj.options.search == true && obj.results) {\n var results = obj.results;\n } else {\n var results = obj.rows;\n }\n var test = 0;\n if (results.length > 100) {\n // Get the last element in the page\n var item = parseInt(obj.tbody.lastChild.getAttribute('data-y'));\n if (obj.options.search == true && obj.results) {\n item = results.indexOf(item);\n }\n if (item < obj.rows.length - 1) {\n for (var j = 0; j <= 30; j++) {\n if (item < results.length) {\n if (obj.options.search == true && obj.results) {\n obj.tbody.appendChild(obj.rows[results[item]]);\n } else {\n obj.tbody.appendChild(obj.rows[item]);\n }\n if (obj.tbody.children.length > 100) {\n obj.tbody.removeChild(obj.tbody.firstChild);\n test = 1;\n }\n }\n item = item + 1;\n }\n }\n }\n \n return test;\n }\n \n obj.loadValidation = function() {\n if (obj.selectedCell) {\n var currentPage = parseInt(obj.tbody.firstChild.getAttribute('data-y')) / 100;\n var selectedPage = parseInt(obj.selectedCell[3] / 100);\n var totalPages = parseInt(obj.rows.length / 100);\n \n if (currentPage != selectedPage && selectedPage <= totalPages) {\n if (! Array.prototype.indexOf.call(obj.tbody.children, obj.rows[obj.selectedCell[3]])) {\n obj.loadPage(selectedPage);\n return true;\n }\n }\n }\n \n return false;\n }\n \n /**\n * Reset search\n */\n obj.resetSearch = function() {\n obj.searchInput.value = '';\n obj.search('');\n obj.results = null;\n }\n\n /**\n * Search\n */\n obj.search = function(query) {\n // Query\n if (query) {\n var query = query.toLowerCase();\n }\n \n // Reset any filter\n if (obj.options.filters) {\n obj.resetFilters();\n }\n\n // Reset selection\n obj.resetSelection();\n \n // Total of results\n obj.pageNumber = 0;\n obj.results = [];\n \n if (query) {\n // Search filter\n var search = function(item, query, index) {\n for (var i = 0; i < item.length; i++) {\n if ((''+item[i]).toLowerCase().search(query) >= 0 ||\n (''+obj.records[index][i].innerHTML).toLowerCase().search(query) >= 0) {\n return true;\n }\n }\n return false;\n }\n \n // Result\n var addToResult = function(k) {\n if (obj.results.indexOf(k) == -1) {\n obj.results.push(k);\n }\n }\n \n // Filter\n var data = obj.options.data.filter(function(v, k) {\n if (search(v, query, k)) {\n // Merged rows found\n var rows = obj.isRowMerged(k);\n if (rows.length) {\n for (var i = 0; i < rows.length; i++) {\n var row = jexcel.getIdFromColumnName(rows[i], true);\n for (var j = 0; j < obj.options.mergeCells[rows[i]][1]; j++) {\n addToResult(row[1]+j);\n }\n }\n } else {\n // Normal row found\n addToResult(k);\n }\n return true;\n } else {\n return false;\n }\n });\n } else {\n obj.results = null;\n }\n\n return obj.updateResult();\n }\n \n obj.updateResult = function() {\n var total = 0;\n var index = 0;\n \n // Page 1\n if (obj.options.lazyLoading == true) {\n total = 100;\n } else if (obj.options.pagination > 0) {\n total = obj.options.pagination;\n } else {\n if (obj.results) {\n total = obj.results.length;\n } else {\n total = obj.rows.length;\n }\n }\n \n // Reset current nodes\n while (obj.tbody.firstChild) {\n obj.tbody.removeChild(obj.tbody.firstChild);\n }\n \n // Hide all records from the table\n for (var j = 0; j < obj.rows.length; j++) {\n if (! obj.results || obj.results.indexOf(j) > -1) {\n if (index < total) {\n obj.tbody.appendChild(obj.rows[j]);\n index++;\n }\n obj.rows[j].style.display = '';\n } else {\n obj.rows[j].style.display = 'none';\n }\n }\n \n // Update pagination\n if (obj.options.pagination > 0) {\n obj.updatePagination();\n }\n\n obj.updateCornerPosition();\n \n return total;\n }\n\n /**\n * Which page the cell is\n */\n obj.whichPage = function(cell) {\n // Search\n if (obj.options.search == true && obj.results) {\n cell = obj.results.indexOf(cell);\n }\n \n return (Math.ceil((parseInt(cell) + 1) / parseInt(obj.options.pagination))) - 1;\n }\n \n /**\n * Go to page\n */\n obj.page = function(pageNumber) {\n var oldPage = obj.pageNumber;\n\n // Search\n if (obj.options.search == true && obj.results) {\n var results = obj.results;\n } else {\n var results = obj.rows;\n }\n \n // Per page\n var quantityPerPage = parseInt(obj.options.pagination);\n \n // pageNumber\n if (pageNumber == null || pageNumber == -1) {\n // Last page\n pageNumber = Math.ceil(results.length / quantityPerPage); \n }\n \n // Page number\n obj.pageNumber = pageNumber;\n \n var startRow = (pageNumber * quantityPerPage);\n var finalRow = (pageNumber * quantityPerPage) + quantityPerPage;\n if (finalRow > results.length) {\n finalRow = results.length;\n }\n if (startRow < 0) {\n startRow = 0;\n }\n \n // Reset container\n while (obj.tbody.firstChild) {\n obj.tbody.removeChild(obj.tbody.firstChild);\n }\n \n // Appeding items\n for (var j = startRow; j < finalRow; j++) {\n if (obj.options.search == true && obj.results) {\n obj.tbody.appendChild(obj.rows[results[j]]);\n } else {\n obj.tbody.appendChild(obj.rows[j]);\n }\n }\n \n if (obj.options.pagination > 0) {\n obj.updatePagination();\n }\n \n // Update corner position\n obj.updateCornerPosition();\n\n // Events\n obj.dispatch('onchangepage', el, pageNumber, oldPage);\n }\n \n /**\n * Update the pagination\n */\n obj.updatePagination = function() {\n // Reset container\n obj.pagination.children[0].innerHTML = '';\n obj.pagination.children[1].innerHTML = '';\n \n // Start pagination\n if (obj.options.pagination) {\n // Searchable\n if (obj.options.search == true && obj.results) {\n var results = obj.results.length;\n } else {\n var results = obj.rows.length;\n }\n \n if (! results) {\n // No records found\n obj.pagination.children[0].innerHTML = obj.options.text.noRecordsFound;\n } else {\n // Pagination container\n var quantyOfPages = Math.ceil(results / obj.options.pagination);\n \n if (obj.pageNumber < 6) {\n var startNumber = 1;\n var finalNumber = quantyOfPages < 10 ? quantyOfPages : 10;\n } else if (quantyOfPages - obj.pageNumber < 5) {\n var startNumber = quantyOfPages - 9;\n var finalNumber = quantyOfPages;\n if (startNumber < 1) {\n startNumber = 1;\n }\n } else {\n var startNumber = obj.pageNumber - 4;\n var finalNumber = obj.pageNumber + 5;\n }\n \n // First\n if (startNumber > 1) {\n var paginationItem = document.createElement('div');\n paginationItem.className = 'jexcel_page';\n paginationItem.innerHTML = '<';\n paginationItem.title = 1;\n obj.pagination.children[1].appendChild(paginationItem);\n }\n \n // Get page links\n for (var i = startNumber; i <= finalNumber; i++) {\n var paginationItem = document.createElement('div');\n paginationItem.className = 'jexcel_page';\n paginationItem.innerHTML = i;\n obj.pagination.children[1].appendChild(paginationItem);\n \n if (obj.pageNumber == (i-1)) {\n paginationItem.classList.add('jexcel_page_selected');\n }\n }\n \n // Last\n if (finalNumber < quantyOfPages) {\n var paginationItem = document.createElement('div');\n paginationItem.className = 'jexcel_page';\n paginationItem.innerHTML = '>';\n paginationItem.title = quantyOfPages;\n obj.pagination.children[1].appendChild(paginationItem);\n }\n \n // Text\n var format = function(format) {\n var args = Array.prototype.slice.call(arguments, 1);\n return format.replace(/{(\\d+)}/g, function(match, number) {\n return typeof args[number] != 'undefined'\n ? args[number]\n : match\n ;\n });\n };\n \n obj.pagination.children[0].innerHTML = format(obj.options.text.showingPage, obj.pageNumber + 1, quantyOfPages)\n }\n }\n }\n \n /**\n * Download CSV table\n * \n * @return null\n */\n obj.download = function(includeHeaders) {\n if (obj.options.allowExport == false) {\n console.error('Export not allowed');\n } else {\n // Data\n var data = '';\n if (includeHeaders == true || obj.options.includeHeadersOnDownload == true) {\n data += obj.getHeaders();\n data += \"\\r\\n\";\n }\n\n // Get data\n data += obj.copy(false, obj.options.csvDelimiter, true);\n\n // Download element\n var blob = new Blob([\"\\uFEFF\"+data], {type: 'text/csv;charset=utf-8;'});\n\n // IE Compatibility\n if (window.navigator && window.navigator.msSaveOrOpenBlob) {\n window.navigator.msSaveOrOpenBlob(blob, obj.options.csvFileName + '.csv');\r\n } else {\n // Download element\n var pom = document.createElement('a');\n var url = URL.createObjectURL(blob);\n pom.href = url;\n pom.setAttribute('download', obj.options.csvFileName + '.csv');\n document.body.appendChild(pom);\n pom.click();\n pom.parentNode.removeChild(pom);\n }\n }\n }\n \n /**\n * Initializes a new history record for undo/redo\n * \n * @return null\n */\n obj.setHistory = function(changes) {\n if (obj.ignoreHistory != true) {\n // Increment and get the current history index\n var index = ++obj.historyIndex;\n \n // Slice the array to discard undone changes\n obj.history = (obj.history = obj.history.slice(0, index + 1));\n \n // Keep history\n obj.history[index] = changes;\n }\n }\n \n /**\n * Copy method\n * \n * @param bool highlighted - Get only highlighted cells\n * @param delimiter - \\t default to keep compatibility with excel\n * @return string value\n */\n obj.copy = function(highlighted, delimiter, returnData) {\n if (! delimiter) {\n delimiter = \"\\t\";\n }\n \n // Controls\n var col = [];\n var colLabel = [];\n var row = [];\n var rowLabel = [];\n var x = obj.options.data[0].length\n var y = obj.options.data.length\n var tmp = '';\n\n // Headers\n if (obj.options.includeHeadersOnCopy == true) {\n if (obj.options.copyCompatibility == true) {\n strLabel.push(obj.getHeaders(true).join(delimiter));\n } else {\n str.push(obj.getHeaders(true).join(delimiter));\n }\n }\n\n // Reset container\n obj.style = [];\n \n // Go through the columns to get the data\n for (var j = 0; j < y; j++) {\n col = [];\n colLabel = [];\n \n for (var i = 0; i < x; i++) {\n // If cell is highlighted\n if (! highlighted || obj.records[j][i].classList.contains('highlight')) {\n // Values\n var value = obj.options.data[j][i];\n if (value.match && (value.match(/,/g) || value.match(/\\n/) || value.match(/\\\"/))) {\n value = value.replace(new RegExp('\"', 'g'), '\"\"');\n value = '\"' + value + '\"';\n }\n col.push(value);\n \n // Labels\n if (obj.options.columns[i].type == 'checkbox' || obj.options.columns[i].type == 'radio') {\n var label = value;\n } else {\n var label = obj.records[j][i].innerHTML;\n if (label.match && (label.match(/,/g) || label.match(/\\n/) || label.match(/\\\"/))) {\n // Scape double quotes\n label = label.replace(new RegExp('\"', 'g'), '\"\"');\n label = '\"' + label + '\"';\n }\n }\n colLabel.push(label);\n \n // Get style\n tmp = obj.records[j][i].getAttribute('style');\n tmp = tmp.replace('display: none;', '');\n obj.style.push(tmp ? tmp : '');\n }\n }\n \n if (col.length) {\n row.push(col.join(delimiter));\n }\n if (colLabel.length) {\n rowLabel.push(colLabel.join(delimiter));\n }\n }\n\n // Final string\n var str = row.join(\"\\r\\n\");\n var strLabel = rowLabel.join(\"\\r\\n\");\n\n // Create a hidden textarea to copy the values\n if (! returnData) {\n if (obj.options.copyCompatibility == true) {\n obj.textarea.value = strLabel;\n } else {\n obj.textarea.value = str;\n }\n obj.textarea.select();\n document.execCommand(\"copy\");\n }\n \n // Keep data\n if (obj.options.copyCompatibility == true) {\n obj.data = strLabel;\n } else {\n obj.data = str;\n }\n // Keep non visible information\n obj.hashString = obj.hash(obj.data);\n \n // Any exiting border should go\r\n obj.removeCopyingSelection();\r\n\r\n // Border\n if (obj.highlighted) {\n for (var i = 0; i < obj.highlighted.length; i++) {\n obj.highlighted[i].classList.add('copying');\n if (obj.highlighted[i].classList.contains('highlight-left')) {\n obj.highlighted[i].classList.add('copying-left');\n }\n if (obj.highlighted[i].classList.contains('highlight-right')) {\n obj.highlighted[i].classList.add('copying-right');\n }\n if (obj.highlighted[i].classList.contains('highlight-top')) {\n obj.highlighted[i].classList.add('copying-top');\n }\n if (obj.highlighted[i].classList.contains('highlight-bottom')) {\n obj.highlighted[i].classList.add('copying-bottom');\n }\n }\n }\n\n // Paste event\n obj.dispatch('oncopy', el, obj.options.copyCompatibility == true ? rowLabel : row, obj.hashString);\n\n return obj.data;\n }\n \n /**\n * jExcel paste method\n * \n * @param integer row number\n * @return string value\n */\n obj.paste = function(x, y, data) {\n // Paste filter\n var ret = obj.dispatch('onbeforepaste', el, data, x, y);\n\n if (ret === false) {\n return false;\n } else if (ret) {\n var data = ret;\n }\n \n // Controls\n var hash = obj.hash(data);\n var style = (hash == obj.hashString) ? obj.style : null;\n \n // Depending on the behavior\n if (obj.options.copyCompatibility == true && hash == obj.hashString) {\n var data = obj.data;\n }\n \n // Split new line\n var data = obj.parseCSV(data, \"\\t\");\n \n if (x != null && y != null && data) {\n // Records\n var i = 0;\n var j = 0;\n var records = [];\n var newStyle = {};\n var oldStyle = {};\n var styleIndex = 0;\n \n // Index\n var colIndex = parseInt(x);\n var rowIndex = parseInt(y);\n var row = null;\n \n // Go through the columns to get the data\n while (row = data[j]) {\n i = 0;\n colIndex = parseInt(x);\n \n while (row[i] != null) {\n // Update and keep history\n var record = obj.updateCell(colIndex, rowIndex, row[i]);\n // Keep history\n records.push(record);\n // Update all formulas in the chain\n obj.updateFormulaChain(colIndex, rowIndex, records);\n // Style\n if (style && style[styleIndex]) {\n var columnName = jexcel.getColumnNameFromId([colIndex, rowIndex]);\n newStyle[columnName] = style[styleIndex];\n oldStyle[columnName] = obj.getStyle(columnName);\n obj.records[rowIndex][colIndex].setAttribute('style', style[styleIndex]);\n styleIndex++\n }\n i++;\n if (row[i] != null) {\n if (colIndex >= obj.headers.length - 1) {\n obj.insertColumn();\n }\n colIndex = obj.right.get(colIndex, rowIndex);\n }\n }\n \n j++;\n if (data[j]) {\n if (rowIndex >= obj.rows.length-1) {\n obj.insertRow();\n }\n rowIndex = obj.down.get(x, rowIndex);\n }\n }\n \n // Select the new cells\n obj.updateSelectionFromCoords(x, y, colIndex, rowIndex);\n \n // Update history\n obj.setHistory({\n action:'setValue',\n records:records,\n selection:obj.selectedCell,\n newStyle:newStyle,\n oldStyle:oldStyle,\n });\n \n // Update table\n obj.updateTable();\n \n // Paste event\n obj.dispatch('onpaste', el, data);\n \n // On after changes\n obj.onafterchanges(el, records);\n }\n\n obj.removeCopyingSelection();\n }\n\n /**\n * Remove copying border\n */\n obj.removeCopyingSelection = function() {\n var copying = document.querySelectorAll('.jexcel .copying');\n for (var i = 0; i < copying.length; i++) {\n copying[i].classList.remove('copying');\n copying[i].classList.remove('copying-left');\n copying[i].classList.remove('copying-right');\n copying[i].classList.remove('copying-top');\n copying[i].classList.remove('copying-bottom');\n }\n }\n\n /**\n * Process row\n */\n obj.historyProcessRow = function(type, historyRecord) {\n var rowIndex = (! historyRecord.insertBefore) ? historyRecord.rowNumber + 1 : historyRecord.rowNumber;\n \n if (obj.options.search == true) {\n if (obj.results && obj.results.length != obj.rows.length) {\n obj.resetSearch();\n }\n }\n \n // Remove row\n if (type == 1) {\n var numOfRows = historyRecord.numOfRows;\n // Remove nodes\n for (var j = rowIndex; j < (numOfRows + rowIndex); j++) {\n obj.rows[j].parentNode.removeChild(obj.rows[j]);\n }\n // Remove references\n obj.records.splice(rowIndex, numOfRows);\n obj.options.data.splice(rowIndex, numOfRows);\n obj.rows.splice(rowIndex, numOfRows);\n \n obj.conditionalSelectionUpdate(1, rowIndex, (numOfRows + rowIndex) - 1);\n } else {\n // Insert data\n obj.records = jexcel.injectArray(obj.records, rowIndex, historyRecord.rowRecords);\n obj.options.data = jexcel.injectArray(obj.options.data, rowIndex, historyRecord.rowData);\n obj.rows = jexcel.injectArray(obj.rows, rowIndex, historyRecord.rowNode);\n // Insert nodes\n var index = 0\n for (var j = rowIndex; j < (historyRecord.numOfRows + rowIndex); j++) {\n obj.tbody.insertBefore(historyRecord.rowNode[index], obj.tbody.children[j]);\n index++;\n }\n }\n \n // Respect pagination\n if (obj.options.pagination > 0) {\n obj.page(obj.pageNumber);\n }\n \n obj.updateTableReferences();\n }\n \n /**\n * Process column\n */\n obj.historyProcessColumn = function(type, historyRecord) {\n var columnIndex = (! historyRecord.insertBefore) ? historyRecord.columnNumber + 1 : historyRecord.columnNumber;\n \n // Remove column\n if (type == 1) {\n var numOfColumns = historyRecord.numOfColumns;\n \n obj.options.columns.splice(columnIndex, numOfColumns);\n for (var i = columnIndex; i < (numOfColumns + columnIndex); i++) {\n obj.headers[i].parentNode.removeChild(obj.headers[i]);\n obj.colgroup[i].parentNode.removeChild(obj.colgroup[i]);\n }\n obj.headers.splice(columnIndex, numOfColumns);\n obj.colgroup.splice(columnIndex, numOfColumns);\n for (var j = 0; j < historyRecord.data.length; j++) {\n for (var i = columnIndex; i < (numOfColumns + columnIndex); i++) {\n obj.records[j][i].parentNode.removeChild(obj.records[j][i]);\n }\n obj.records[j].splice(columnIndex, numOfColumns);\n obj.options.data[j].splice(columnIndex, numOfColumns);\n }\n // Process footers\n if (obj.options.footers) {\n for (var j = 0; j < obj.options.footers.length; j++) {\n obj.options.footers[j].splice(columnIndex, numOfColumns);\n }\n }\n } else {\n // Insert data\n obj.options.columns = jexcel.injectArray(obj.options.columns, columnIndex, historyRecord.columns);\n obj.headers = jexcel.injectArray(obj.headers, columnIndex, historyRecord.headers);\n obj.colgroup = jexcel.injectArray(obj.colgroup, columnIndex, historyRecord.colgroup);\n \n var index = 0\n for (var i = columnIndex; i < (historyRecord.numOfColumns + columnIndex); i++) {\n obj.headerContainer.insertBefore(historyRecord.headers[index], obj.headerContainer.children[i+1]);\n obj.colgroupContainer.insertBefore(historyRecord.colgroup[index], obj.colgroupContainer.children[i+1]);\n index++;\n }\n \n for (var j = 0; j < historyRecord.data.length; j++) {\n obj.options.data[j] = jexcel.injectArray(obj.options.data[j], columnIndex, historyRecord.data[j]);\n obj.records[j] = jexcel.injectArray(obj.records[j], columnIndex, historyRecord.records[j]);\n var index = 0\n for (var i = columnIndex; i < (historyRecord.numOfColumns + columnIndex); i++) {\n obj.rows[j].insertBefore(historyRecord.records[j][index], obj.rows[j].children[i+1]);\n index++;\n }\n }\n // Process footers\n if (obj.options.footers) {\n for (var j = 0; j < obj.options.footers.length; j++) {\n obj.options.footers[j] = jexcel.injectArray(obj.options.footers[j], columnIndex, historyRecord.footers[j]);\n }\n }\n }\n \n // Adjust nested headers\n if (obj.options.nestedHeaders && obj.options.nestedHeaders.length > 0) {\n // Flexible way to handle nestedheaders\n if (obj.options.nestedHeaders[0] && obj.options.nestedHeaders[0][0]) {\n for (var j = 0; j < obj.options.nestedHeaders.length; j++) {\n if (type == 1) {\n var colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan) - historyRecord.numOfColumns;\n } else {\n var colspan = parseInt(obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan) + historyRecord.numOfColumns;\n }\n obj.options.nestedHeaders[j][obj.options.nestedHeaders[j].length-1].colspan = colspan;\n obj.thead.children[j].children[obj.thead.children[j].children.length-1].setAttribute('colspan', colspan);\n }\n } else {\n if (type == 1) {\n var colspan = parseInt(obj.options.nestedHeaders[0].colspan) - historyRecord.numOfColumns;\n } else {\n var colspan = parseInt(obj.options.nestedHeaders[0].colspan) + historyRecord.numOfColumns;\n }\n obj.options.nestedHeaders[0].colspan = colspan;\n obj.thead.children[0].children[obj.thead.children[0].children.length-1].setAttribute('colspan', colspan);\n }\n }\n \n obj.updateTableReferences();\n }\n \n /**\n * Undo last action\n */\n obj.undo = function() {\n // Ignore events and history\n var ignoreEvents = obj.ignoreEvents ? true : false;\n var ignoreHistory = obj.ignoreHistory ? true : false;\n \n obj.ignoreEvents = true;\n obj.ignoreHistory = true;\n \n // Records\n var records = [];\n \n // Update cells\n if (obj.historyIndex >= 0) {\n // History\n var historyRecord = obj.history[obj.historyIndex--];\n \n if (historyRecord.action == 'insertRow') {\n obj.historyProcessRow(1, historyRecord);\n } else if (historyRecord.action == 'deleteRow') {\n obj.historyProcessRow(0, historyRecord);\n } else if (historyRecord.action == 'insertColumn') {\n obj.historyProcessColumn(1, historyRecord);\n } else if (historyRecord.action == 'deleteColumn') {\n obj.historyProcessColumn(0, historyRecord);\n } else if (historyRecord.action == 'moveRow') {\n obj.moveRow(historyRecord.newValue, historyRecord.oldValue);\n } else if (historyRecord.action == 'moveColumn') {\n obj.moveColumn(historyRecord.newValue, historyRecord.oldValue);\n } else if (historyRecord.action == 'setMerge') {\n obj.removeMerge(historyRecord.column, historyRecord.data);\n } else if (historyRecord.action == 'setStyle') {\n obj.setStyle(historyRecord.oldValue, null, null, 1);\n } else if (historyRecord.action == 'setWidth') {\n obj.setWidth(historyRecord.column, historyRecord.oldValue);\n } else if (historyRecord.action == 'setHeight') {\n obj.setHeight(historyRecord.row, historyRecord.oldValue);\n } else if (historyRecord.action == 'setHeader') {\n obj.setHeader(historyRecord.column, historyRecord.oldValue);\n } else if (historyRecord.action == 'setComments') {\n obj.setComments(historyRecord.column, historyRecord.oldValue[0], historyRecord.oldValue[1]);\n } else if (historyRecord.action == 'orderBy') {\n var rows = [];\n for (var j = 0; j < historyRecord.rows.length; j++) {\n rows[historyRecord.rows[j]] = j;\n }\n obj.updateOrderArrow(historyRecord.column, historyRecord.order ? 0 : 1);\n obj.updateOrder(rows);\n } else if (historyRecord.action == 'setValue') {\n // Redo for changes in cells\n for (var i = 0; i < historyRecord.records.length; i++) {\n records.push({\n x: historyRecord.records[i].x,\n y: historyRecord.records[i].y,\n newValue: historyRecord.records[i].oldValue,\n });\n\n if (historyRecord.oldStyle) {\n obj.resetStyle(historyRecord.oldStyle);\n }\n }\n // Update records\n obj.setValue(records);\n\n // Update selection\n if (historyRecord.selection) {\n obj.updateSelectionFromCoords(historyRecord.selection[0], historyRecord.selection[1], historyRecord.selection[2], historyRecord.selection[3]);\n }\n }\n }\n obj.ignoreEvents = ignoreEvents;\n obj.ignoreHistory = ignoreHistory;\n \n // Events\n obj.dispatch('onundo', el, historyRecord);\n }\n \n /**\n * Redo previously undone action\n */\n obj.redo = function() {\n // Ignore events and history\n var ignoreEvents = obj.ignoreEvents ? true : false;\n var ignoreHistory = obj.ignoreHistory ? true : false;\n \n obj.ignoreEvents = true;\n obj.ignoreHistory = true;\n \n // Records\n var records = [];\n \n // Update cells\n if (obj.historyIndex < obj.history.length - 1) {\n // History\n var historyRecord = obj.history[++obj.historyIndex];\n \n if (historyRecord.action == 'insertRow') {\n obj.historyProcessRow(0, historyRecord);\n } else if (historyRecord.action == 'deleteRow') {\n obj.historyProcessRow(1, historyRecord);\n } else if (historyRecord.action == 'insertColumn') {\n obj.historyProcessColumn(0, historyRecord);\n } else if (historyRecord.action == 'deleteColumn') {\n obj.historyProcessColumn(1, historyRecord);\n } else if (historyRecord.action == 'moveRow') {\n obj.moveRow(historyRecord.oldValue, historyRecord.newValue);\n } else if (historyRecord.action == 'moveColumn') {\n obj.moveColumn(historyRecord.oldValue, historyRecord.newValue);\n } else if (historyRecord.action == 'setMerge') {\n obj.setMerge(historyRecord.column, historyRecord.colspan, historyRecord.rowspan, 1);\n } else if (historyRecord.action == 'setStyle') {\n obj.setStyle(historyRecord.newValue, null, null, 1);\n } else if (historyRecord.action == 'setWidth') {\n obj.setWidth(historyRecord.column, historyRecord.newValue);\n } else if (historyRecord.action == 'setHeight') {\n obj.setHeight(historyRecord.row, historyRecord.newValue);\n } else if (historyRecord.action == 'setHeader') {\n obj.setHeader(historyRecord.column, historyRecord.newValue);\n } else if (historyRecord.action == 'setComments') {\n obj.setComments(historyRecord.column, historyRecord.newValue[0], historyRecord.newValue[1]);\n } else if (historyRecord.action == 'orderBy') {\n obj.updateOrderArrow(historyRecord.column, historyRecord.order);\n obj.updateOrder(historyRecord.rows);\n } else if (historyRecord.action == 'setValue') {\n obj.setValue(historyRecord.records);\n // Redo for changes in cells\n for (var i = 0; i < historyRecord.records.length; i++) {\n if (historyRecord.oldStyle) {\n obj.resetStyle(historyRecord.newStyle);\n }\n }\n // Update selection\n if (historyRecord.selection) {\n obj.updateSelectionFromCoords(historyRecord.selection[0], historyRecord.selection[1], historyRecord.selection[2], historyRecord.selection[3]);\n }\n }\n }\n obj.ignoreEvents = ignoreEvents;\n obj.ignoreHistory = ignoreHistory;\n \n // Events\n obj.dispatch('onredo', el, historyRecord);\n }\n \n /**\n * Get dropdown value from key\n */\n obj.getDropDownValue = function(column, key) {\n var value = [];\n \n if (obj.options.columns[column] && obj.options.columns[column].source) {\n // Create array from source\n var combo = [];\n var source = obj.options.columns[column].source;\n \n for (var i = 0; i < source.length; i++) {\n if (typeof(source[i]) == 'object') {\n combo[source[i].id] = source[i].name;\n } else {\n combo[source[i]] = source[i];\n }\n }\n \n // Garante single multiple compatibily\n var keys = ('' + key).split(';')\n \n for (var i = 0; i < keys.length; i++) {\n if (combo[keys[i]]) {\n value.push(combo[keys[i]]);\n }\n }\n } else {\n console.error('Invalid column');\n }\n \n return (value.length > 0) ? value.join('; ') : '';\n }\n \n /**\n * From starckoverflow contributions\n */\n obj.parseCSV = function(str, delimiter) {\n // Remove last line break\n str = str.replace(/\\r?\\n$|\\r$|\\n$/g, \"\");\n // Last caracter is the delimiter\n if (str.charCodeAt(str.length-1) == 9) {\n str += \"\\0\";\n }\n // user-supplied delimeter or default comma\n delimiter = (delimiter || \",\");\n \n var arr = [];\n var quote = false; // true means we're inside a quoted field\n // iterate over each character, keep track of current row and column (of the returned array)\n for (var row = 0, col = 0, c = 0; c < str.length; c++) {\n var cc = str[c], nc = str[c+1];\n arr[row] = arr[row] || [];\n arr[row][col] = arr[row][col] || '';\n \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\n if (cc == '\"' && quote && nc == '\"') { arr[row][col] += cc; ++c; continue; } \n \n // If it's just one quotation mark, begin/end quoted field\n if (cc == '\"') { quote = !quote; continue; }\n \n // If it's a comma and we're not in a quoted field, move on to the next column\n if (cc == delimiter && !quote) { ++col; continue; }\n \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\n if (cc == '\\r' && nc == '\\n' && !quote) { ++row; col = 0; ++c; continue; }\n \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\n if (cc == '\\n' && !quote) { ++row; col = 0; continue; }\n if (cc == '\\r' && !quote) { ++row; col = 0; continue; }\n \n // Otherwise, append the current character to the current column\n arr[row][col] += cc;\n }\n return arr;\n }\n \n obj.hash = function(str) {\n var hash = 0, i, chr;\n \n if (str.length === 0) {\n return hash;\n } else {\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0;\n }\n }\n return hash;\n }\n \n obj.onafterchanges = function(el, records) {\n // Events\n obj.dispatch('onafterchanges', el, records);\n }\n \n obj.destroy = function() {\n jexcel.destroy(el);\n }\n\n /**\n * Initialization method\n */\n obj.init = function() {\n jexcel.current = obj;\n \n // Build handlers\n if (typeof(jexcel.build) == 'function') {\n if (obj.options.root) {\n jexcel.build(obj.options.root);\n } else {\n jexcel.build(document);\n jexcel.build = null;\n }\n }\n \n // Event\n el.setAttribute('tabindex', 1);\n el.addEventListener('focus', function(e) {\n if (jexcel.current && ! obj.selectedCell) {\n obj.updateSelectionFromCoords(0,0,0,0);\n obj.left();\n }\n });\n\n // Load the table data based on an CSV file\n if (obj.options.csv) {\n // Loading\n if (obj.options.loadingSpin == true) {\n jSuites.loading.show();\n }\n \n // Load CSV file\n jSuites.ajax({\n url: obj.options.csv,\n method: 'GET',\n dataType: 'text',\n success: function(result) {\n // Convert data\n var newData = obj.parseCSV(result, obj.options.csvDelimiter)\n \n // Headers\n if (obj.options.csvHeaders == true && newData.length > 0) {\n var headers = newData.shift();\n for(var i = 0; i < headers.length; i++) {\n if (! obj.options.columns[i]) {\n obj.options.columns[i] = { type:'text', align:obj.options.defaultColAlign, width:obj.options.defaultColWidth };\n }\n // Precedence over pre-configurated titles\n if (typeof obj.options.columns[i].title === 'undefined') {\n obj.options.columns[i].title = headers[i];\n }\n }\n }\n // Data\n obj.options.data = newData;\n // Prepare table\n obj.prepareTable();\n // Hide spin\n if (obj.options.loadingSpin == true) {\n jSuites.loading.hide();\n }\n }\n });\n } else if (obj.options.url) {\n // Loading\n if (obj.options.loadingSpin == true) {\n jSuites.loading.show();\n }\n \n jSuites.ajax({\n url: obj.options.url,\n method: 'GET',\n dataType: 'json',\n success: function(result) {\n // Data\n obj.options.data = (result.data) ? result.data : result;\n // Prepare table\n obj.prepareTable();\n // Hide spin\n if (obj.options.loadingSpin == true) {\n jSuites.loading.hide();\n }\n }\n });\n } else {\n // Prepare table\n obj.prepareTable();\n }\n }\n \n // Context menu\n if (options && options.contextMenu != null) {\n obj.options.contextMenu = options.contextMenu;\n } else {\n obj.options.contextMenu = function(el, x, y, e) {\n var items = [];\n \n if (y == null) {\n // Insert a new column\n if (obj.options.allowInsertColumn == true) {\n items.push({\n title:obj.options.text.insertANewColumnBefore,\n onclick:function() {\n obj.insertColumn(1, parseInt(x), 1);\n }\n });\n }\n \n if (obj.options.allowInsertColumn == true) {\n items.push({\n title:obj.options.text.insertANewColumnAfter,\n onclick:function() {\n obj.insertColumn(1, parseInt(x), 0);\n }\n });\n }\n \n // Delete a column\n if (obj.options.allowDeleteColumn == true) {\n items.push({\n title:obj.options.text.deleteSelectedColumns,\n onclick:function() {\n obj.deleteColumn(obj.getSelectedColumns().length ? undefined : parseInt(x));\n }\n });\n }\n \n // Rename column\n if (obj.options.allowRenameColumn == true) {\n items.push({\n title:obj.options.text.renameThisColumn,\n onclick:function() {\n obj.setHeader(x);\n }\n });\n }\n \n // Sorting\n if (obj.options.columnSorting == true) {\n // Line\n items.push({ type:'line' });\n \n items.push({\n title:obj.options.text.orderAscending,\n onclick:function() {\n obj.orderBy(x, 0);\n }\n });\n items.push({\n title:obj.options.text.orderDescending,\n onclick:function() {\n obj.orderBy(x, 1);\n }\n });\n }\n } else {\n // Insert new row\n if (obj.options.allowInsertRow == true) {\n items.push({\n title:obj.options.text.insertANewRowBefore,\n onclick:function() {\n obj.insertRow(1, parseInt(y), 1);\n }\n });\n \n items.push({\n title:obj.options.text.insertANewRowAfter,\n onclick:function() {\n obj.insertRow(1, parseInt(y));\n }\n });\n }\n \n if (obj.options.allowDeleteRow == true) {\n items.push({\n title:obj.options.text.deleteSelectedRows,\n onclick:function() {\n obj.deleteRow(obj.getSelectedRows().length ? undefined : parseInt(y));\n }\n });\n }\n \n if (x) {\n if (obj.options.allowComments == true) {\n items.push({ type:'line' });\n \n var title = obj.records[y][x].getAttribute('title') || '';\n\n items.push({\n title: title ? obj.options.text.editComments : obj.options.text.addComments,\n onclick:function() {\n var comment = prompt(obj.options.text.comments, title);\n if (comment) {\n obj.setComments([ x, y ], comment);\n }\n }\n });\n \n if (title) {\n items.push({\n title:obj.options.text.clearComments,\n onclick:function() {\n obj.setComments([ x, y ], '');\n }\n });\n }\n }\n }\n }\n \n // Line\n items.push({ type:'line' });\n \n // Copy\n items.push({\n title:obj.options.text.copy,\n shortcut:'Ctrl + C',\n onclick:function() {\n obj.copy(true);\n }\n });\n \n // Paste\n if (navigator && navigator.clipboard) {\n items.push({\n title:obj.options.text.paste,\n shortcut:'Ctrl + V',\n onclick:function() {\n if (obj.selectedCell) {\n navigator.clipboard.readText().then(function(text) {\n if (text) {\n jexcel.current.paste(obj.selectedCell[0], obj.selectedCell[1], text);\n }\n });\n }\n }\n });\n }\n \n // Save\n if (obj.options.allowExport) {\n items.push({\n title: obj.options.text.saveAs,\n shortcut: 'Ctrl + S',\n onclick: function () {\n obj.download();\n }\n });\n }\n \n // About\n if (obj.options.about) {\n items.push({\n title:obj.options.text.about,\n onclick:function() {\n alert(obj.options.about);\n }\n });\n }\n \n return items;\n }\n }\n \n obj.scrollControls = function(e) {\n obj.wheelControls();\n\n if (obj.options.freezeColumns > 0 && obj.content.scrollLeft != scrollLeft) {\n obj.updateFreezePosition();\n }\n\n // Close editor\n if (obj.options.lazyLoading == true || obj.options.tableOverflow == true) {\n if (obj.edition && e.target.className.substr(0,9) != 'jdropdown') {\n obj.closeEditor(obj.edition[0], true);\n }\n }\n }\n\n obj.wheelControls = function(e) {\n if (obj.options.lazyLoading == true) {\n if (jexcel.timeControlLoading == null) {\n jexcel.timeControlLoading = setTimeout(function() {\n if (obj.content.scrollTop + obj.content.clientHeight >= obj.content.scrollHeight) {\n if (obj.loadDown()) {\n if (obj.content.scrollTop + obj.content.clientHeight > obj.content.scrollHeight - 10) {\n obj.content.scrollTop = obj.content.scrollTop - obj.content.clientHeight;\n }\n obj.updateCornerPosition();\n }\n } else if (obj.content.scrollTop <= obj.content.clientHeight) {\n if (obj.loadUp()) {\n if (obj.content.scrollTop < 10) {\n obj.content.scrollTop = obj.content.scrollTop + obj.content.clientHeight;\n }\n obj.updateCornerPosition();\n }\n }\n \n jexcel.timeControlLoading = null;\n }, 100);\n }\n }\n }\n\n // Get width of all freezed cells together\n obj.getFreezeWidth = function() {\n var width = 0;\n if (obj.options.freezeColumns > 0) {\n for (var i = 0; i < obj.options.freezeColumns; i++) {\n width += parseInt(obj.options.columns[i].width);\n }\n }\n return width;\n }\n\n var scrollLeft = 0;\n\n obj.updateFreezePosition = function() {\n scrollLeft = obj.content.scrollLeft;\n var width = 0;\n if (scrollLeft > 50) {\n for (var i = 0; i < obj.options.freezeColumns; i++) {\n if (i > 0) {\n width += parseInt(obj.options.columns[i-1].width);\n }\n obj.headers[i].classList.add('jexcel_freezed');\n obj.headers[i].style.left = width + 'px';\n for (var j = 0; j < obj.rows.length; j++) {\n if (obj.rows[j] && obj.records[j][i]) {\n var shifted = (scrollLeft + (i > 0 ? obj.records[j][i-1].style.width : 0)) - 51 + 'px';\n obj.records[j][i].classList.add('jexcel_freezed');\n obj.records[j][i].style.left = shifted;\n }\n }\n }\n } else {\n for (var i = 0; i < obj.options.freezeColumns; i++) {\n obj.headers[i].classList.remove('jexcel_freezed');\n obj.headers[i].style.left = '';\n for (var j = 0; j < obj.rows.length; j++) {\n if (obj.records[j][i]) {\n obj.records[j][i].classList.remove('jexcel_freezed');\n obj.records[j][i].style.left = '';\n }\n }\n }\n }\n\n // Place the corner in the correct place\n obj.updateCornerPosition();\n }\n\n el.addEventListener(\"DOMMouseScroll\", obj.wheelControls);\n el.addEventListener(\"mousewheel\", obj.wheelControls);\n \n el.jexcel = obj;\n \n obj.init();\n \n return obj;\n });\n \n jexcel.current = null;\n jexcel.timeControl = null;\n jexcel.timeControlLoading = null;\n \n jexcel.destroy = function(element, destroyEventHandlers) {\n if (element.jexcel) {\n var root = element.jexcel.options.root ? element.jexcel.options.root : document;\n element.removeEventListener(\"DOMMouseScroll\", element.jexcel.scrollControls);\n element.removeEventListener(\"mousewheel\", element.jexcel.scrollControls);\n element.jexcel = null;\n element.innerHTML = '';\n \n if (destroyEventHandlers) {\n root.removeEventListener(\"mouseup\", jexcel.mouseUpControls);\n root.removeEventListener(\"mousedown\", jexcel.mouseDownControls);\n root.removeEventListener(\"mousemove\", jexcel.mouseMoveControls);\n root.removeEventListener(\"mouseover\", jexcel.mouseOverControls);\n root.removeEventListener(\"dblclick\", jexcel.doubleClickControls);\n root.removeEventListener(\"paste\", jexcel.pasteControls);\n root.removeEventListener(\"contextmenu\", jexcel.contextMenuControls);\n root.removeEventListener(\"touchstart\", jexcel.touchStartControls);\n root.removeEventListener(\"touchend\", jexcel.touchEndControls);\n root.removeEventListener(\"touchcancel\", jexcel.touchEndControls);\n document.removeEventListener(\"keydown\", jexcel.keyDownControls);\n jexcel = null;\n }\n }\n }\n \n jexcel.build = function(root) {\n root.addEventListener(\"mouseup\", jexcel.mouseUpControls);\n root.addEventListener(\"mousedown\", jexcel.mouseDownControls);\n root.addEventListener(\"mousemove\", jexcel.mouseMoveControls);\n root.addEventListener(\"mouseover\", jexcel.mouseOverControls);\n root.addEventListener(\"dblclick\", jexcel.doubleClickControls);\n root.addEventListener(\"paste\", jexcel.pasteControls);\n root.addEventListener(\"contextmenu\", jexcel.contextMenuControls);\n root.addEventListener(\"touchstart\", jexcel.touchStartControls);\n root.addEventListener(\"touchend\", jexcel.touchEndControls);\n root.addEventListener(\"touchcancel\", jexcel.touchEndControls);\n root.addEventListener(\"touchmove\", jexcel.touchEndControls);\n document.addEventListener(\"keydown\", jexcel.keyDownControls);\n }\n \n /**\n * Events\n */\n jexcel.keyDownControls = function(e) {\n if (jexcel.current) {\n if (jexcel.current.edition) {\n if (e.which == 27) {\n // Escape\n if (jexcel.current.edition) {\n // Exit without saving\n jexcel.current.closeEditor(jexcel.current.edition[0], false);\n }\n e.preventDefault();\n } else if (e.which == 13) {\n // Enter\n if (jexcel.current.options.columns[jexcel.current.edition[2]].type == 'calendar') {\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\n } else if (jexcel.current.options.columns[jexcel.current.edition[2]].type == 'dropdown' ||\n jexcel.current.options.columns[jexcel.current.edition[2]].type == 'autocomplete') {\n // Do nothing\n } else {\n // Alt enter -> do not close editor\n if ((jexcel.current.options.wordWrap == true ||\n jexcel.current.options.columns[jexcel.current.edition[2]].wordWrap == true ||\n jexcel.current.options.data[jexcel.current.edition[3]][jexcel.current.edition[2]].length > 200) && e.altKey) {\n // Add new line to the editor\n var editorTextarea = jexcel.current.edition[0].children[0];\n var editorValue = jexcel.current.edition[0].children[0].value;\n var editorIndexOf = editorTextarea.selectionStart;\n editorValue = editorValue.slice(0, editorIndexOf) + \"\\n\" + editorValue.slice(editorIndexOf);\n editorTextarea.value = editorValue;\n editorTextarea.focus();\n editorTextarea.selectionStart = editorIndexOf + 1;\n editorTextarea.selectionEnd = editorIndexOf + 1;\n } else {\n jexcel.current.edition[0].children[0].blur();\n }\n }\n } else if (e.which == 9) {\n // Tab\n if (jexcel.current.options.columns[jexcel.current.edition[2]].type == 'calendar') {\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\n } else {\n jexcel.current.edition[0].children[0].blur();\n }\n }\n }\n \n if (! jexcel.current.edition && jexcel.current.selectedCell) {\n // Which key\n if (e.which == 37) {\n jexcel.current.left(e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 39) {\n jexcel.current.right(e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 38) {\n jexcel.current.up(e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 40) {\n jexcel.current.down(e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 36) {\n jexcel.current.first(e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 35) {\n jexcel.current.last(e.shiftKey, e.ctrlKey);\n e.preventDefault();\n } else if (e.which == 32) {\n if (jexcel.current.options.editable == true) {\n jexcel.current.setCheckRadioValue();\n }\n e.preventDefault();\n } else if (e.which == 46) {\n // Delete\n if (jexcel.current.options.editable == true) {\n if (jexcel.current.selectedRow) {\n if (jexcel.current.options.allowDeleteRow == true) {\n if (confirm(jexcel.current.options.text.areYouSureToDeleteTheSelectedRows)) {\n jexcel.current.deleteRow();\n }\n }\n } else if (jexcel.current.selectedHeader) {\n if (jexcel.current.options.allowDeleteColumn == true) {\n if (confirm(jexcel.current.options.text.areYouSureToDeleteTheSelectedColumns)) {\n jexcel.current.deleteColumn();\n }\n }\n } else {\n // Change value\n jexcel.current.setValue(jexcel.current.highlighted, '');\n }\n }\n } else if (e.which == 13) {\n // Move cursor\n if (e.shiftKey) {\n jexcel.current.up();\n } else {\n if (jexcel.current.options.allowInsertRow == true) {\n if (jexcel.current.options.allowManualInsertRow == true) {\n if (jexcel.current.selectedCell[1] == jexcel.current.options.data.length - 1) {\n // New record in case selectedCell in the last row\n jexcel.current.insertRow();\n }\n }\n }\n \n jexcel.current.down();\n }\n e.preventDefault();\n } else if (e.which == 9) {\n // Tab\n if (e.shiftKey) {\n jexcel.current.left();\n } else {\n if (jexcel.current.options.allowInsertColumn == true) {\n if (jexcel.current.options.allowManualInsertColumn == true) {\n if (jexcel.current.selectedCell[0] == jexcel.current.options.data[0].length - 1) {\n // New record in case selectedCell in the last column\n jexcel.current.insertColumn();\n }\n }\n }\n \n jexcel.current.right();\n }\n e.preventDefault();\n } else {\n if ((e.ctrlKey || e.metaKey) && ! e.shiftKey) {\n if (e.which == 65) {\n // Ctrl + A\n jexcel.current.selectAll();\n e.preventDefault();\n } else if (e.which == 83) {\n // Ctrl + S\n jexcel.current.download();\n e.preventDefault();\n } else if (e.which == 89) {\n // Ctrl + Y\n jexcel.current.redo();\n e.preventDefault();\n } else if (e.which == 90) {\n // Ctrl + Z\n jexcel.current.undo();\n e.preventDefault();\n } else if (e.which == 67) {\n // Ctrl + C\n jexcel.current.copy(true);\n e.preventDefault();\n } else if (e.which == 67) {\n // Ctrl + C\n jexcel.current.copy(true);\n e.preventDefault();\n } else if (e.which == 88) {\n // Ctrl + X\n if (jexcel.current.options.editable == true) {\n jexcel.cutControls();\n } else {\n jexcel.copyControls();\n }\n e.preventDefault();\n } else if (e.which == 86) {\n // Ctrl + V\n jexcel.pasteControls();\n }\n } else {\n if (jexcel.current.selectedCell) {\n if (jexcel.current.options.editable == true) {\n var rowId = jexcel.current.selectedCell[1];\n var columnId = jexcel.current.selectedCell[0];\n \n // If is not readonly\n if (jexcel.current.options.columns[columnId].type != 'readonly') {\n // Characters able to start a edition\n if (e.keyCode == 32) {\n // Space\n if (jexcel.current.options.columns[columnId].type == 'checkbox' ||\n jexcel.current.options.columns[columnId].type == 'radio') {\n e.preventDefault();\n } else {\n // Start edition\n jexcel.current.openEditor(jexcel.current.records[rowId][columnId], true);\n }\n } else if (e.keyCode == 113) {\n // Start edition with current content F2\n jexcel.current.openEditor(jexcel.current.records[rowId][columnId], false);\n } else if ((e.keyCode == 8) ||\n (e.keyCode >= 48 && e.keyCode <= 57) ||\n (e.keyCode >= 96 && e.keyCode <= 111) ||\n (e.keyCode == 187) ||\n (e.keyCode == 189) ||\n ((String.fromCharCode(e.keyCode) == e.key || String.fromCharCode(e.keyCode).toLowerCase() == e.key.toLowerCase()) && jexcel.validLetter(String.fromCharCode(e.keyCode)))) {\n // Start edition\n jexcel.current.openEditor(jexcel.current.records[rowId][columnId], true);\n // Prevent entries in the calendar\n if (jexcel.current.options.columns[columnId].type == 'calendar') {\n e.preventDefault();\n }\n }\n }\n }\n }\n }\n }\n } else {\n if (e.target.classList.contains('jexcel_search')) {\n if (jexcel.timeControl) {\n clearTimeout(jexcel.timeControl);\n }\n \n jexcel.timeControl = setTimeout(function() {\n jexcel.current.search(e.target.value);\n }, 200);\n }\n }\n }\n }\n \n jexcel.isMouseAction = false;\n \n jexcel.mouseDownControls = function(e) {\n e = e || window.event;\n if (e.buttons) {\n var mouseButton = e.buttons;\n } else if (e.button) {\n var mouseButton = e.button;\n } else {\n var mouseButton = e.which;\n }\n\n // Get elements\n var jexcelTable = jexcel.getElement(e.target);\n\n if (jexcelTable[0]) {\n if (jexcel.current != jexcelTable[0].jexcel) {\n if (jexcel.current) {\n if (jexcel.current.edition) {\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\n }\n jexcel.current.resetSelection();\n }\n jexcel.current = jexcelTable[0].jexcel;\n }\n } else {\n if (jexcel.current) {\n if (jexcel.current.edition) {\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\n }\n \n jexcel.current.resetSelection(true);\n jexcel.current = null;\n }\n }\n \n if (jexcel.current && mouseButton == 1) {\n if (e.target.classList.contains('jexcel_selectall')) {\n if (jexcel.current) {\n jexcel.current.selectAll();\n }\n } else if (e.target.classList.contains('jexcel_corner')) {\n if (jexcel.current.options.editable == true) {\n jexcel.current.selectedCorner = true;\n }\n } else {\n // Header found\n if (jexcelTable[1] == 1) {\n var columnId = e.target.getAttribute('data-x');\n if (columnId) {\n // Update cursor\n var info = e.target.getBoundingClientRect();\n if (jexcel.current.options.columnResize == true && info.width - e.offsetX < 6) {\n // Resize helper\n jexcel.current.resizing = {\n mousePosition: e.pageX,\n column: columnId,\n width: info.width,\n };\n \n // Border indication\n jexcel.current.headers[columnId].classList.add('resizing');\n for (var j = 0; j < jexcel.current.records.length; j++) {\n if (jexcel.current.records[j][columnId]) {\n jexcel.current.records[j][columnId].classList.add('resizing');\n }\n }\n } else if (jexcel.current.options.columnDrag == true && info.height - e.offsetY < 6) {\n if (jexcel.current.isColMerged(columnId).length) {\n console.error('JEXCEL: This column is part of a merged cell.');\n } else {\n // Reset selection\n jexcel.current.resetSelection();\n // Drag helper\n jexcel.current.dragging = {\n element: e.target,\n column:columnId,\n destination:columnId,\n };\n // Border indication\n jexcel.current.headers[columnId].classList.add('dragging');\n for (var j = 0; j < jexcel.current.records.length; j++) {\n if (jexcel.current.records[j][columnId]) {\n jexcel.current.records[j][columnId].classList.add('dragging');\n }\n }\n }\n } else {\n if (jexcel.current.selectedHeader && (e.shiftKey || e.ctrlKey)) {\n var o = jexcel.current.selectedHeader;\n var d = columnId;\n } else {\n // Press to rename\n if (jexcel.current.selectedHeader == columnId && jexcel.current.options.allowRenameColumn == true) {\n jexcel.timeControl = setTimeout(function() {\n jexcel.current.setHeader(columnId);\n }, 800);\n }\n \n // Keep track of which header was selected first\n jexcel.current.selectedHeader = columnId;\n \n // Update selection single column\n var o = columnId;\n var d = columnId;\n }\n \n // Update selection\n jexcel.current.updateSelectionFromCoords(o, 0, d, jexcel.current.options.data.length - 1);\n }\n } else {\n if (e.target.parentNode.classList.contains('jexcel_nested')) {\n if (e.target.getAttribute('data-column')) {\n var column = e.target.getAttribute('data-column').split(',');\n var c1 = parseInt(column[0]);\n var c2 = parseInt(column[column.length-1]);\n } else {\n var c1 = 0;\n var c2 = jexcel.current.options.columns.length - 1;\n }\n jexcel.current.updateSelectionFromCoords(c1, 0, c2, jexcel.current.options.data.length - 1);\n }\n }\n } else {\n jexcel.current.selectedHeader = false;\n }\n \n // Body found\n if (jexcelTable[1] == 2) {\n var rowId = e.target.getAttribute('data-y');\n \n if (e.target.classList.contains('jexcel_row')) {\n var info = e.target.getBoundingClientRect();\n if (jexcel.current.options.rowResize == true && info.height - e.offsetY < 6) {\n // Resize helper\n jexcel.current.resizing = {\n element: e.target.parentNode,\n mousePosition: e.pageY,\n row: rowId,\n height: info.height,\n };\n // Border indication\n e.target.parentNode.classList.add('resizing');\n } else if (jexcel.current.options.rowDrag == true && info.width - e.offsetX < 6) {\n if (jexcel.current.isRowMerged(rowId).length) {\n console.error('JEXCEL: This row is part of a merged cell');\n } else if (jexcel.current.options.search == true && jexcel.current.results) {\n console.error('JEXCEL: Please clear your search before perform this action');\n } else {\n // Reset selection\n jexcel.current.resetSelection();\n // Drag helper\n jexcel.current.dragging = {\n element: e.target.parentNode,\n row:rowId,\n destination:rowId,\n };\n // Border indication\n e.target.parentNode.classList.add('dragging');\n }\n } else {\n if (jexcel.current.selectedRow && (e.shiftKey || e.ctrlKey)) {\n var o = jexcel.current.selectedRow;\n var d = rowId;\n } else {\n // Keep track of which header was selected first\n jexcel.current.selectedRow = rowId;\n \n // Update selection single column\n var o = rowId;\n var d = rowId;\n }\n \n // Update selection\n jexcel.current.updateSelectionFromCoords(0, o, jexcel.current.options.data[0].length - 1, d);\n }\n } else {\n // Jclose\n if (e.target.classList.contains('jclose') && e.target.clientWidth - e.offsetX < 50 && e.offsetY < 50) {\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\n } else {\n var getCellCoords = function(element) {\n var x = element.getAttribute('data-x');\n var y = element.getAttribute('data-y');\n if (x && y) {\n return [x, y];\n } else {\n if (element.parentNode) {\n return getCellCoords(element.parentNode);\n }\n }\n };\n\n var position = getCellCoords(e.target);\n if (position) {\n\n var columnId = position[0];\n var rowId = position[1];\n // Close edition\n if (jexcel.current.edition) {\n if (jexcel.current.edition[2] != columnId || jexcel.current.edition[3] != rowId) {\n jexcel.current.closeEditor(jexcel.current.edition[0], true);\n }\n }\n\n if (! jexcel.current.edition) {\n // Update cell selection\n if (e.shiftKey) {\n jexcel.current.updateSelectionFromCoords(jexcel.current.selectedCell[0], jexcel.current.selectedCell[1], columnId, rowId);\n } else {\n jexcel.current.updateSelectionFromCoords(columnId, rowId);\n }\n }\n\n // No full row selected\n jexcel.current.selectedHeader = null;\n jexcel.current.selectedRow = null;\n }\n }\n }\n } else {\n jexcel.current.selectedRow = false;\n }\n \n // Pagination\n if (e.target.classList.contains('jexcel_page')) {\n if (e.target.innerText == '<') {\n jexcel.current.page(0);\n } else if (e.target.innerText == '>') {\n jexcel.current.page(e.target.getAttribute('title') - 1);\n } else {\n jexcel.current.page(e.target.innerText - 1);\n }\n }\n }\n \n if (jexcel.current.edition) {\n jexcel.isMouseAction = false;\n } else {\n jexcel.isMouseAction = true;\n }\n } else {\n jexcel.isMouseAction = false;\n }\n }\n \n jexcel.mouseUpControls = function(e) {\n if (jexcel.current) {\n // Update cell size\n if (jexcel.current.resizing) {\n // Columns to be updated\n if (jexcel.current.resizing.column) {\n // New width\n var newWidth = jexcel.current.colgroup[jexcel.current.resizing.column].getAttribute('width');\n // Columns\n var columns = jexcel.current.getSelectedColumns();\n if (columns.length > 1) {\n var currentWidth = [];\n for (var i = 0; i < columns.length; i++) {\n currentWidth.push(parseInt(jexcel.current.colgroup[columns[i]].getAttribute('width')));\n }\n // Previous width\n var index = columns.indexOf(parseInt(jexcel.current.resizing.column));\n currentWidth[index] = jexcel.current.resizing.width;\n jexcel.current.setWidth(columns, newWidth, currentWidth);\n } else {\n jexcel.current.setWidth(jexcel.current.resizing.column, newWidth, jexcel.current.resizing.width);\n }\n // Remove border\n jexcel.current.headers[jexcel.current.resizing.column].classList.remove('resizing');\n for (var j = 0; j < jexcel.current.records.length; j++) {\n if (jexcel.current.records[j][jexcel.current.resizing.column]) {\n jexcel.current.records[j][jexcel.current.resizing.column].classList.remove('resizing');\n }\n }\n } else {\n // Remove Class\n jexcel.current.rows[jexcel.current.resizing.row].children[0].classList.remove('resizing');\n var newHeight = jexcel.current.rows[jexcel.current.resizing.row].getAttribute('height');\n jexcel.current.setHeight(jexcel.current.resizing.row, newHeight, jexcel.current.resizing.height);\n // Remove border\n jexcel.current.resizing.element.classList.remove('resizing');\n }\n // Reset resizing helper\n jexcel.current.resizing = null;\n } else if (jexcel.current.dragging) {\n // Reset dragging helper\n if (jexcel.current.dragging) {\n if (jexcel.current.dragging.column) {\n // Target\n var columnId = e.target.getAttribute('data-x');\n // Remove move style\n jexcel.current.headers[jexcel.current.dragging.column].classList.remove('dragging');\n for (var j = 0; j < jexcel.current.rows.length; j++) {\n if (jexcel.current.records[j][jexcel.current.dragging.column]) {\n jexcel.current.records[j][jexcel.current.dragging.column].classList.remove('dragging');\n }\n }\n for (var i = 0; i < jexcel.current.headers.length; i++) {\n jexcel.current.headers[i].classList.remove('dragging-left');\n jexcel.current.headers[i].classList.remove('dragging-right');\n }\n // Update position\n if (columnId) {\n if (jexcel.current.dragging.column != jexcel.current.dragging.destination) {\n jexcel.current.moveColumn(jexcel.current.dragging.column, jexcel.current.dragging.destination);\n }\n }\n } else {\n if (jexcel.current.dragging.element.nextSibling) {\n var position = parseInt(jexcel.current.dragging.element.nextSibling.getAttribute('data-y'));\n if (jexcel.current.dragging.row < position) {\n position -= 1;\n }\n } else {\n var position = parseInt(jexcel.current.dragging.element.previousSibling.getAttribute('data-y'));\n }\n if (jexcel.current.dragging.row != position) {\n jexcel.current.moveRow(jexcel.current.dragging.row, position, true);\n }\n jexcel.current.dragging.element.classList.remove('dragging');\n }\n jexcel.current.dragging = null;\n }\n } else {\n // Close any corner selection\n if (jexcel.current.selectedCorner) {\n jexcel.current.selectedCorner = false;\n \n // Data to be copied\n if (jexcel.current.selection.length > 0) {\n // Copy data\n jexcel.current.copyData(jexcel.current.selection[0], jexcel.current.selection[jexcel.current.selection.length - 1]);\n \n // Remove selection\n jexcel.current.removeCopySelection();\n }\n }\n }\n }\n\n // Clear any time control\n if (jexcel.timeControl) {\n clearTimeout(jexcel.timeControl);\n jexcel.timeControl = null;\n }\n \n // Mouse up\n jexcel.isMouseAction = false;\n }\n \n // Mouse move controls\n jexcel.mouseMoveControls = function(e) {\n e = e || window.event;\n if (e.buttons) {\n var mouseButton = e.buttons;\n } else if (e.button) {\n var mouseButton = e.button;\n } else {\n var mouseButton = e.which;\n }\n \n if (! mouseButton) {\n jexcel.isMouseAction = false;\n }\n \n if (jexcel.current) {\n if (jexcel.isMouseAction == true) {\n // Resizing is ongoing\n if (jexcel.current.resizing) {\n if (jexcel.current.resizing.column) {\n var width = e.pageX - jexcel.current.resizing.mousePosition;\n \n if (jexcel.current.resizing.width + width > 0) {\n var tempWidth = jexcel.current.resizing.width + width;\n jexcel.current.colgroup[jexcel.current.resizing.column].setAttribute('width', tempWidth);\n \n jexcel.current.updateCornerPosition();\n }\n } else {\n var height = e.pageY - jexcel.current.resizing.mousePosition;\n \n if (jexcel.current.resizing.height + height > 0) {\n var tempHeight = jexcel.current.resizing.height + height;\n jexcel.current.rows[jexcel.current.resizing.row].setAttribute('height', tempHeight);\n \n jexcel.current.updateCornerPosition();\n }\n }\n }\n } else {\n var x = e.target.getAttribute('data-x');\n var y = e.target.getAttribute('data-y');\n var rect = e.target.getBoundingClientRect();\n \n if (jexcel.current.cursor) {\n jexcel.current.cursor.style.cursor = '';\n jexcel.current.cursor = null;\n }\n\n if (e.target.parentNode.parentNode && e.target.parentNode.parentNode.className) {\n if (e.target.parentNode.parentNode.classList.contains('resizable')) {\n if (e.target && x && ! y && (rect.width - (e.clientX - rect.left) < 6)) {\n jexcel.current.cursor = e.target;\n jexcel.current.cursor.style.cursor = 'col-resize';\n } else if (e.target && ! x && y && (rect.height - (e.clientY - rect.top) < 6)) {\n jexcel.current.cursor = e.target;\n jexcel.current.cursor.style.cursor = 'row-resize';\n }\n }\n \n if (e.target.parentNode.parentNode.classList.contains('draggable')) {\n if (e.target && ! x && y && (rect.width - (e.clientX - rect.left) < 6)) {\n jexcel.current.cursor = e.target;\n jexcel.current.cursor.style.cursor = 'move';\n } else if (e.target && x && ! y && (rect.height - (e.clientY - rect.top) < 6)) {\n jexcel.current.cursor = e.target;\n jexcel.current.cursor.style.cursor = 'move';\n }\n }\n }\n }\n }\n }\n \n jexcel.mouseOverControls = function(e) {\n e = e || window.event;\n if (e.buttons) {\n var mouseButton = e.buttons;\n } else if (e.button) {\n var mouseButton = e.button;\n } else {\n var mouseButton = e.which;\n }\n \n if (! mouseButton) {\n jexcel.isMouseAction = false;\n }\n \n if (jexcel.current && jexcel.isMouseAction == true) {\n // Get elements\n var jexcelTable = jexcel.getElement(e.target);\n \n if (jexcelTable[0]) {\n // Avoid cross reference\n if (jexcel.current != jexcelTable[0].jexcel) {\n if (jexcel.current) {\n return false;\n }\n }\n \n var columnId = e.target.getAttribute('data-x');\n var rowId = e.target.getAttribute('data-y');\n \n if (jexcel.current.dragging) {\n if (jexcel.current.dragging.column) {\n if (columnId) {\n if (jexcel.current.isColMerged(columnId).length) {\n console.error('JEXCEL: This column is part of a merged cell.');\n } else {\n for (var i = 0; i < jexcel.current.headers.length; i++) {\n jexcel.current.headers[i].classList.remove('dragging-left');\n jexcel.current.headers[i].classList.remove('dragging-right');\n }\n \n if (jexcel.current.dragging.column == columnId) {\n jexcel.current.dragging.destination = parseInt(columnId);\n } else {\n if (e.target.clientWidth / 2 > e.offsetX) {\n if (jexcel.current.dragging.column < columnId) {\n jexcel.current.dragging.destination = parseInt(columnId) - 1;\n } else {\n jexcel.current.dragging.destination = parseInt(columnId);\n }\n jexcel.current.headers[columnId].classList.add('dragging-left');\n } else {\n if (jexcel.current.dragging.column < columnId) {\n jexcel.current.dragging.destination = parseInt(columnId);\n } else {\n jexcel.current.dragging.destination = parseInt(columnId) + 1;\n }\n jexcel.current.headers[columnId].classList.add('dragging-right');\n }\n }\n }\n }\n } else {\n if (rowId) {\n if (jexcel.current.isRowMerged(rowId).length) {\n console.error('JEXCEL: This row is part of a merged cell.');\n } else {\n var target = (e.target.clientHeight / 2 > e.offsetY) ? e.target.parentNode.nextSibling : e.target.parentNode;\n e.target.parentNode.parentNode.insertBefore(jexcel.current.dragging.element, target);\n }\n }\n }\n } else if (jexcel.current.resizing) {\n } else {\n // Header found\n if (jexcelTable[1] == 1) {\n if (jexcel.current.selectedHeader) {\n var columnId = e.target.getAttribute('data-x');\n var o = jexcel.current.selectedHeader;\n var d = columnId;\n // Update selection\n jexcel.current.updateSelectionFromCoords(o, 0, d, jexcel.current.options.data.length - 1);\n }\n }\n \n // Body found\n if (jexcelTable[1] == 2) {\n if (e.target.classList.contains('jexcel_row')) {\n if (jexcel.current.selectedRow) {\n var o = jexcel.current.selectedRow;\n var d = rowId;\n // Update selection\n jexcel.current.updateSelectionFromCoords(0, o, jexcel.current.options.data[0].length - 1, d);\n }\n } else {\n // Do not select edtion is in progress\n if (! jexcel.current.edition) {\n if (columnId && rowId) {\n if (jexcel.current.selectedCorner) {\n jexcel.current.updateCopySelection(columnId, rowId);\n } else {\n if (jexcel.current.selectedCell) {\n jexcel.current.updateSelectionFromCoords(jexcel.current.selectedCell[0], jexcel.current.selectedCell[1], columnId, rowId);\n }\n }\n }\n }\n }\n }\n }\n }\n }\n \n // Clear any time control\n if (jexcel.timeControl) {\n clearTimeout(jexcel.timeControl);\n jexcel.timeControl = null;\n }\n }\n \n /**\n * Double click event handler: controls the double click in the corner, cell edition or column re-ordering.\n */\n jexcel.doubleClickControls = function(e) {\n // Jexcel is selected\n if (jexcel.current) {\n // Corner action\n if (e.target.classList.contains('jexcel_corner')) {\n // Any selected cells\n if (jexcel.current.highlighted.length > 0) {\n // Copy from this\n var x1 = jexcel.current.highlighted[0].getAttribute('data-x');\n var y1 = parseInt(jexcel.current.highlighted[jexcel.current.highlighted.length - 1].getAttribute('data-y')) + 1;\n // Until this\n var x2 = jexcel.current.highlighted[jexcel.current.highlighted.length - 1].getAttribute('data-x');\n var y2 = jexcel.current.records.length - 1\n // Execute copy\n jexcel.current.copyData(jexcel.current.records[y1][x1], jexcel.current.records[y2][x2]);\n }\n } else if (e.target.classList.contains('jexcel_column_filter')) {\n // Column\n var columnId = e.target.getAttribute('data-x');\n // Open filter\n jexcel.current.openFilter(columnId);\n \n } else {\n // Get table\n var jexcelTable = jexcel.getElement(e.target);\n \n // Double click over header\n if (jexcelTable[1] == 1 && jexcel.current.options.columnSorting == true) {\n // Check valid column header coords\n var columnId = e.target.getAttribute('data-x');\n if (columnId) {\n jexcel.current.orderBy(columnId);\n }\n }\n \n // Double click over body\n if (jexcelTable[1] == 2 && jexcel.current.options.editable == true) {\n if (! jexcel.current.edition) {\n var getCellCoords = function(element) {\n if (element.parentNode) {\n var x = element.getAttribute('data-x');\n var y = element.getAttribute('data-y');\n if (x && y) {\n return element;\n } else {\n return getCellCoords(element.parentNode);\n }\n }\n }\n var cell = getCellCoords(e.target);\n if (cell && cell.classList.contains('highlight')) {\n jexcel.current.openEditor(cell);\n }\n }\n }\n }\n }\n }\n \n jexcel.copyControls = function(e) {\n if (jexcel.current && jexcel.copyControls.enabled) {\n if (! jexcel.current.edition) {\n jexcel.current.copy(true);\n }\n }\n }\n \n jexcel.cutControls = function(e) {\n if (jexcel.current) {\n if (! jexcel.current.edition) {\n jexcel.current.copy(true);\n if (jexcel.current.options.editable == true) {\n jexcel.current.setValue(jexcel.current.highlighted, '');\n }\n }\n }\n }\n \n jexcel.pasteControls = function(e) {\n if (jexcel.current && jexcel.current.selectedCell) {\n if (! jexcel.current.edition) {\n if (jexcel.current.options.editable == true) {\n if (e && e.clipboardData) {\n jexcel.current.paste(jexcel.current.selectedCell[0], jexcel.current.selectedCell[1], e.clipboardData.getData('text'));\n e.preventDefault();\n } else if (window.clipboardData) {\n jexcel.current.paste(jexcel.current.selectedCell[0], jexcel.current.selectedCell[1], window.clipboardData.getData('text'));\n }\n }\n }\n }\n }\n \n jexcel.contextMenuControls = function(e) {\n e = e || window.event;\n if (\"buttons\" in e) {\n var mouseButton = e.buttons;\n } else {\n var mouseButton = e.which || e.button;\n }\n \n if (jexcel.current) {\n if (jexcel.current.edition) {\n e.preventDefault();\n } else if (jexcel.current.options.contextMenu) {\n jexcel.current.contextMenu.contextmenu.close();\n \n if (jexcel.current) {\n var x = e.target.getAttribute('data-x');\n var y = e.target.getAttribute('data-y');\n \n if (x || y) {\n // Table found\n var items = jexcel.current.options.contextMenu(jexcel.current, x, y, e);\n // The id is depending on header and body\n jexcel.current.contextMenu.contextmenu.open(e, items);\n // Avoid the real one\n e.preventDefault();\n }\n }\n }\n }\n }\n\n jexcel.touchStartControls = function(e) {\n var jexcelTable = jexcel.getElement(e.target);\n \n if (jexcelTable[0]) {\n if (jexcel.current != jexcelTable[0].jexcel) {\n if (jexcel.current) {\n jexcel.current.resetSelection();\n }\n jexcel.current = jexcelTable[0].jexcel;\n }\n } else {\n if (jexcel.current) {\n jexcel.current.resetSelection();\n jexcel.current = null;\n }\n }\n \n if (jexcel.current) {\n if (! jexcel.current.edition) {\n var columnId = e.target.getAttribute('data-x');\n var rowId = e.target.getAttribute('data-y');\n \n if (columnId && rowId) {\n jexcel.current.updateSelectionFromCoords(columnId, rowId);\n \n jexcel.timeControl = setTimeout(function() {\n // Keep temporary reference to the element\n if (jexcel.current.options.columns[columnId].type == 'color') {\n jexcel.tmpElement = null;\n } else {\n jexcel.tmpElement = e.target;\n }\n jexcel.current.openEditor(e.target, false, e);\n }, 500);\n }\n }\n }\n }\n \n jexcel.touchEndControls = function(e) {\n // Clear any time control\n if (jexcel.timeControl) {\n clearTimeout(jexcel.timeControl);\n jexcel.timeControl = null;\n // Element\n if (jexcel.tmpElement && jexcel.tmpElement.children[0].tagName == 'INPUT') {\n jexcel.tmpElement.children[0].focus();\n }\n jexcel.tmpElement = null;\n }\n }\n \n /**\n * Jexcel extensions\n */\n \n jexcel.tabs = function(tabs, result) {\n var instances = [];\r\n // Create tab container\n if (! tabs.classList.contains('jexcel_tabs')) {\n tabs.innerHTML = '';\n tabs.classList.add('jexcel_tabs')\n tabs.jexcel = [];\n\n var div = document.createElement('div');\n var headers = tabs.appendChild(div);\n var div = document.createElement('div');\n var content = tabs.appendChild(div);\n } else {\n var headers = tabs.children[0];\n var content = tabs.children[1];\n }\n\n var spreadsheet = []\n var link = [];\n for (var i = 0; i < result.length; i++) {\n // Spreadsheet container\n spreadsheet[i] = document.createElement('div');\n spreadsheet[i].classList.add('jexcel_tab');\n var worksheet = jexcel(spreadsheet[i], result[i]);\n content.appendChild(spreadsheet[i]);\n instances[i] = tabs.jexcel.push(worksheet);\r\n\n // Tab link\n link[i] = document.createElement('div');\n link[i].classList.add('jexcel_tab_link');\n link[i].setAttribute('data-spreadsheet', tabs.jexcel.length-1);\n link[i].innerHTML = result[i].sheetName;\n link[i].onclick = function() {\n for (var j = 0; j < headers.children.length; j++) {\n headers.children[j].classList.remove('selected');\n content.children[j].style.display = 'none';\n }\n var i = this.getAttribute('data-spreadsheet');\n content.children[i].style.display = 'block';\n headers.children[i].classList.add('selected')\n }\n headers.appendChild(link[i]);\n }\n\n // First tab\n for (var j = 0; j < headers.children.length; j++) {\n headers.children[j].classList.remove('selected');\n content.children[j].style.display = 'none';\n }\n headers.children[headers.children.length - 1].classList.add('selected');\n content.children[headers.children.length - 1].style.display = 'block';\n\r\n return instances;\r\n }\n\n // Compability to older versions\n jexcel.createTabs = jexcel.tabs;\n\n jexcel.fromSpreadsheet = function(file, __callback) {\n var convert = function(workbook) {\n var spreadsheets = [];\n workbook.SheetNames.forEach(function(sheetName) {\n var spreadsheet = {};\n spreadsheet.rows = [];\n spreadsheet.columns = [];\n spreadsheet.data = [];\n spreadsheet.style = {};\n spreadsheet.sheetName = sheetName;\n \n // Column widths\n var temp = workbook.Sheets[sheetName]['!cols'];\n if (temp && temp.length) {\n for (var i = 0; i < temp.length; i++) {\n spreadsheet.columns[i] = {};\n if (temp[i] && temp[i].wpx) {\n spreadsheet.columns[i].width = temp[i].wpx + 'px';\n }\n }\n }\n // Rows heights\n var temp = workbook.Sheets[sheetName]['!rows'];\n if (temp && temp.length) {\n for (var i = 0; i < temp.length; i++) {\n if (temp[i] && temp[i].hpx) {\n spreadsheet.rows[i] = {};\n spreadsheet.rows[i].height = temp[i].hpx + 'px';\n }\n }\n }\n // Merge cells\n var temp = workbook.Sheets[sheetName]['!merges'];\n if (temp && temp.length > 0) {\n spreadsheet.mergeCells = [];\n for (var i = 0; i < temp.length; i++) {\n var x1 = temp[i].s.c;\n var y1 = temp[i].s.r;\n var x2 = temp[i].e.c;\n var y2 = temp[i].e.r;\n var key = jexcel.getColumnNameFromId([x1,y1]);\n spreadsheet.mergeCells[key] = [ x2-x1+1, y2-y1+1 ];\n }\n }\n // Data container\n var max_x = 0;\n var max_y = 0;\n var temp = Object.keys(workbook.Sheets[sheetName]);\n for (var i = 0; i < temp.length; i++) {\n if (temp[i].substr(0,1) != '!') {\n var cell = workbook.Sheets[sheetName][temp[i]];\n var info = jexcel.getIdFromColumnName(temp[i], true);\n if (! spreadsheet.data[info[1]]) {\n spreadsheet.data[info[1]] = [];\n }\n spreadsheet.data[info[1]][info[0]] = cell.f ? '=' + cell.f : cell.w;\n if (max_x < info[0]) {\n max_x = info[0];\n }\n if (max_y < info[1]) {\n max_y = info[1];\n }\n // Style\n if (cell.style && Object.keys(cell.style).length > 0) {\n spreadsheet.style[temp[i]] = cell.style;\n }\n if (cell.s && cell.s.fgColor) {\n if (spreadsheet.style[temp[i]]) {\n spreadsheet.style[temp[i]] += ';';\n }\n spreadsheet.style[temp[i]] += 'background-color:#' + cell.s.fgColor.rgb;\n }\n }\n }\n var numColumns = spreadsheet.columns;\n for (var j = 0; j <= max_y; j++) {\n for (var i = 0; i <= max_x; i++) {\n if (! spreadsheet.data[j]) {\n spreadsheet.data[j] = [];\n }\n if (! spreadsheet.data[j][i]) {\n if (numColumns < i) {\n spreadsheet.data[j][i] = '';\n }\n }\n }\n }\n spreadsheets.push(spreadsheet);\n });\n \n return spreadsheets;\n }\n \n var oReq;\n oReq = new XMLHttpRequest();\n oReq.open(\"GET\", file, true);\n \n if(typeof Uint8Array !== 'undefined') {\n oReq.responseType = \"arraybuffer\";\n oReq.onload = function(e) {\n var arraybuffer = oReq.response;\n var data = new Uint8Array(arraybuffer);\n var wb = XLSX.read(data, {type:\"array\", cellFormula:true, cellStyles:true });\n __callback(convert(wb))\n };\n } else {\n oReq.setRequestHeader(\"Accept-Charset\", \"x-user-defined\"); \n oReq.onreadystatechange = function() { if(oReq.readyState == 4 && oReq.status == 200) {\n var ff = convertResponseBodyToText(oReq.responseBody);\n var wb = XLSX.read(ff, {type:\"binary\", cellFormula:true, cellStyles:true });\n __callback(convert(wb))\n }};\n }\n \n oReq.send();\n }\n \n /**\n * Valid international letter\n */\n \n jexcel.validLetter = function (text) {\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;\n return text.match(regex) ? 1 : 0;\n }\n \n /**\n * Helper injectArray\n */\n jexcel.injectArray = function(o, idx, arr) {\n return o.slice(0, idx).concat(arr).concat(o.slice(idx));\n }\n \n /**\n * Get letter based on a number\n * \n * @param integer i\n * @return string letter\n */\n jexcel.getColumnName = function(i) {\n var letter = '';\n if (i > 701) {\n letter += String.fromCharCode(64 + parseInt(i / 676));\n letter += String.fromCharCode(64 + parseInt((i % 676) / 26));\n } else if (i > 25) {\n letter += String.fromCharCode(64 + parseInt(i / 26));\n }\n letter += String.fromCharCode(65 + (i % 26));\n \n return letter;\n }\n \n /**\n * Convert excel like column to jexcel id\n * \n * @param string id\n * @return string id\n */\n jexcel.getIdFromColumnName = function (id, arr) {\n // Get the letters\n var t = /^[a-zA-Z]+/.exec(id);\n \n if (t) {\n // Base 26 calculation\n var code = 0;\n for (var i = 0; i < t[0].length; i++) {\n code += parseInt(t[0].charCodeAt(i) - 64) * Math.pow(26, (t[0].length - 1 - i));\n }\n code--;\n // Make sure jexcel starts on zero\n if (code < 0) {\n code = 0;\n }\n \n // Number\n var number = parseInt(/[0-9]+$/.exec(id));\n if (number > 0) {\n number--;\n }\n \n if (arr == true) {\n id = [ code, number ];\n } else {\n id = code + '-' + number;\n }\n }\n \n return id;\n }\n \n /**\n * Convert jexcel id to excel like column name\n * \n * @param string id\n * @return string id\n */\n jexcel.getColumnNameFromId = function (cellId) {\n if (! Array.isArray(cellId)) {\n cellId = cellId.split('-');\n }\n \n return jexcel.getColumnName(parseInt(cellId[0])) + (parseInt(cellId[1]) + 1);\n }\n \n /**\n * Verify element inside jexcel table\n * \n * @param string id\n * @return string id\n */\n jexcel.getElement = function(element) {\n var jexcelSection = 0;\n var jexcelElement = 0;\n \n function path (element) {\n if (element.className) {\n if (element.classList.contains('jexcel_container')) {\n jexcelElement = element;\n }\n }\n \n if (element.tagName == 'THEAD') {\n jexcelSection = 1;\n } else if (element.tagName == 'TBODY') {\n jexcelSection = 2;\n }\n \n if (element.parentNode) {\n if (! jexcelElement) {\n path(element.parentNode);\n }\n }\n }\n \n path(element);\n \n return [ jexcelElement, jexcelSection ];\n }\n\n jexcel.doubleDigitFormat = function(v) {\n v = ''+v;\n if (v.length == 1) {\n v = '0'+v;\n }\n return v;\n }\n\n jexcel.createFromTable = function(el, options) {\n if (el.tagName != 'TABLE') {\n console.log('Element is not a table');\n } else {\n // Configuration\n if (! options) {\n options = {};\n }\n options.columns = [];\n options.data = [];\n\n // Colgroup\n var colgroup = el.querySelectorAll('colgroup > col');\n if (colgroup.length) {\n // Get column width\n for (var i = 0; i < colgroup.length; i++) {\n var width = colgroup[i].style.width;\n if (! width) {\n var width = colgroup[i].getAttribute('width');\n }\n // Set column width\n if (width) {\n if (! options.columns[i]) {\n options.columns[i] = {}\n }\n options.columns[i].width = width;\n }\n }\n }\n\n // Parse header\n var parseHeader = function(header) {\n // Get width information\n var info = header.getBoundingClientRect();\n var width = info.width > 50 ? info.width : 50;\n\n // Create column option\n if (! options.columns[i]) {\n options.columns[i] = {};\n } \n if (header.getAttribute('data-celltype')) {\n options.columns[i].type = header.getAttribute('data-celltype');\n } else {\n options.columns[i].type = 'text';\n }\n options.columns[i].width = width + 'px';\n options.columns[i].title = header.innerText;\n options.columns[i].align = header.style.textAlign || 'center';\n }\n\n // Headers\n var headers = el.querySelectorAll('thead > tr');\n if (headers.length) {\n // Get the last row in the thead\n headers = headers[headers.length-1].children;\n // Go though the headers\n for (var i = 0; i < headers.length; i++) {\n parseHeader(headers[i]);\n }\n }\n\n // Content\n var rowNumber = 0;\n var mergeCells = {};\n var rows = {};\n var style = {};\n\n var content = el.querySelectorAll('table > tr, tbody tr');\n for (var j = 0; j < content.length; j++) {\n options.data[rowNumber] = [];\n if (options.parseTableFirstRowAsHeader == true && j == 0) {\n for (var i = 0; i < content[j].children.length; i++) {\n parseHeader(content[j].children[i]);\n }\n } else {\n for (var i = 0; i < content[j].children.length; i++) {\n // WickedGrid formula compatibility\n var value = content[j].children[i].getAttribute('data-formula');\n if (value) {\n if (value.substr(0,1) != '=') {\n value = '=' + value;\n }\n } else {\n var value = content[j].children[i].innerText;\n }\n options.data[rowNumber].push(value);\n\n // Key\n var cellName = jexcel.getColumnNameFromId([ i, j ]);\n\n // Merged cells\n var mergedColspan = parseInt(content[j].children[i].getAttribute('colspan')) || 0;\n var mergedRowspan = parseInt(content[j].children[i].getAttribute('rowspan')) || 0;\n if (mergedColspan || mergedRowspan) {\n mergeCells[cellName] = [ mergedColspan || 1, mergedRowspan || 1 ];\n }\n\n // Avoid problems with hidden cells\n if (s = content[j].children[i].style && content[j].children[i].style.display == 'none') {\n content[j].children[i].style.display = '';\n }\n // Get style\n var s = content[j].children[i].getAttribute('style');\n if (s) {\n style[cellName] = s;\n }\n // Bold\n if (content[j].children[i].classList.contains('styleBold')) {\n if (style[cellName]) {\n style[cellName] += '; font-weight:bold;';\n } else {\n style[cellName] = 'font-weight:bold;';\n }\n }\n }\n\n // Row Height\n if (content[j].style && content[j].style.height) {\n rows[j] = { height: content[j].style.height };\n }\n\n // Index\n rowNumber++;\n }\n }\n\n // Style\n if (Object.keys(style).length > 0) {\n //options.style = style;\n }\n // Merged\n if (Object.keys(mergeCells).length > 0) {\n options.mergeCells = mergeCells;\n }\n // Row height\n if (Object.keys(rows).length > 0) {\n options.rows = rows;\n }\n\n // TODO: data-hiddencolumns=\"3,4\"\n \n // I guess in terms the better column type\n if (options.parseTableAutoCellType == true) {\n var pattern = [];\n for (var i = 0; i < options.columns.length; i++) {\n var test = true;\n var testCalendar = true;\n pattern[i] = [];\n for (var j = 0; j < options.data.length; j++) {\n var value = options.data[j][i];\n if (! pattern[i][value]) {\n pattern[i][value] = 0;\n }\n pattern[i][value]++;\n if (value.length > 25) {\n test = false;\n }\n if (value.length == 10) {\n if (! (value.substr(4,1) == '-' && value.substr(7,1) == '-')) {\n testCalendar = false;\n }\n } else {\n testCalendar = false;\n }\n }\n\n var keys = Object.keys(pattern[i]).length;\n if (testCalendar) {\n options.columns[i].type = 'calendar';\n } else if (test == true && keys > 1 && keys <= parseInt(options.data.length * 0.1)) {\n options.columns[i].type = 'dropdown';\n options.columns[i].source = Object.keys(pattern[i]);\n }\n }\n }\n\n return options;\n }\n }\n\n /**\n * Jquery Support\n */\n if (typeof(jQuery) != 'undefined') {\n (function($){\n $.fn.jexcel = function(method) {\n var spreadsheetContainer = $(this).get(0);\n if (! spreadsheetContainer.jexcel) {\n return jexcel($(this).get(0), arguments[0]);\n } else {\n return spreadsheetContainer.jexcel[method].apply(this, Array.prototype.slice.call( arguments, 1 ));\n }\n };\n \n })(jQuery);\n }\n \n \n // Based on sutoiku work (https://github.com/sutoiku)\n \n var error = (function() {\n var exports = {};\n \n exports.nil = new Error('#NULL!');\n exports.div0 = new Error('#DIV/0!');\n exports.value = new Error('#VALUE!');\n exports.ref = new Error('#REF!');\n exports.name = new Error('#NAME?');\n exports.num = new Error('#NUM!');\n exports.na = new Error('#N/A');\n exports.error = new Error('#ERROR!');\n exports.data = new Error('#GETTING_DATA');\n \n return exports;\n })();\n \n var utils = (function() {\n var exports = {};\n \n exports.flattenShallow = function(array) {\n if (!array || !array.reduce) {\n return array;\n }\n \n return array.reduce(function(a, b) {\n var aIsArray = Array.isArray(a);\n var bIsArray = Array.isArray(b);\n \n if (aIsArray && bIsArray) {\n return a.concat(b);\n }\n if (aIsArray) {\n a.push(b);\n \n return a;\n }\n if (bIsArray) {\n return [ a ].concat(b);\n }\n \n return [ a, b ];\n });\n };\n \n exports.isFlat = function(array) {\n if (!array) {\n return false;\n }\n \n for (var i = 0; i < array.length; ++i) {\n if (Array.isArray(array[i])) {\n return false;\n }\n }\n \n return true;\n };\n \n exports.flatten = function() {\n var result = exports.argsToArray.apply(null, arguments);\n \n while (!exports.isFlat(result)) {\n result = exports.flattenShallow(result);\n }\n \n return result;\n };\n \n exports.argsToArray = function(args) {\n var result = [];\n \n exports.arrayEach(args, function(value) {\n result.push(value);\n });\n \n return result;\n };\n \n exports.numbers = function() {\n var possibleNumbers = this.flatten.apply(null, arguments);\n return possibleNumbers.filter(function(el) {\n return typeof el === 'number';\n });\n };\n \n exports.cleanFloat = function(number) {\n var power = 1e14;\n return Math.round(number * power) / power;\n };\n \n exports.parseBool = function(bool) {\n if (typeof bool === 'boolean') {\n return bool;\n }\n \n if (bool instanceof Error) {\n return bool;\n }\n \n if (typeof bool === 'number') {\n return bool !== 0;\n }\n \n if (typeof bool === 'string') {\n var up = bool.toUpperCase();\n if (up === 'TRUE') {\n return true;\n }\n \n if (up === 'FALSE') {\n return false;\n }\n }\n \n if (bool instanceof Date && !isNaN(bool)) {\n return true;\n }\n \n return error.value;\n };\n \n exports.parseNumber = function(string) {\n if (string === undefined || string === '') {\n return error.value;\n }\n if (!isNaN(string)) {\n return parseFloat(string);\n }\n \n return error.value;\n };\n \n exports.parseNumberArray = function(arr) {\n var len;\n \n if (!arr || (len = arr.length) === 0) {\n return error.value;\n }\n \n var parsed;\n \n while (len--) {\n parsed = exports.parseNumber(arr[len]);\n if (parsed === error.value) {\n return parsed;\n }\n arr[len] = parsed;\n }\n \n return arr;\n };\n \n exports.parseMatrix = function(matrix) {\n var n;\n \n if (!matrix || (n = matrix.length) === 0) {\n return error.value;\n }\n var pnarr;\n \n for (var i = 0; i < matrix.length; i++) {\n pnarr = exports.parseNumberArray(matrix[i]);\n matrix[i] = pnarr;\n \n if (pnarr instanceof Error) {\n return pnarr;\n }\n }\n \n return matrix;\n };\n \n var d1900 = new Date(Date.UTC(1900, 0, 1));\n exports.parseDate = function(date) {\n if (!isNaN(date)) {\n if (date instanceof Date) {\n return new Date(date);\n }\n var d = parseInt(date, 10);\n if (d < 0) {\n return error.num;\n }\n if (d <= 60) {\n return new Date(d1900.getTime() + (d - 1) * 86400000);\n }\n return new Date(d1900.getTime() + (d - 2) * 86400000);\n }\n if (typeof date === 'string') {\n date = new Date(date);\n if (!isNaN(date)) {\n return date;\n }\n }\n return error.value;\n };\n \n exports.parseDateArray = function(arr) {\n var len = arr.length;\n var parsed;\n while (len--) {\n parsed = this.parseDate(arr[len]);\n if (parsed === error.value) {\n return parsed;\n }\n arr[len] = parsed;\n }\n return arr;\n };\n \n exports.anyIsError = function() {\n var n = arguments.length;\n while (n--) {\n if (arguments[n] instanceof Error) {\n return true;\n }\n }\n return false;\n };\n \n exports.arrayValuesToNumbers = function(arr) {\n var n = arr.length;\n var el;\n while (n--) {\n el = arr[n];\n if (typeof el === 'number') {\n continue;\n }\n if (el === true) {\n arr[n] = 1;\n continue;\n }\n if (el === false) {\n arr[n] = 0;\n continue;\n }\n if (typeof el === 'string') {\n var number = this.parseNumber(el);\n if (number instanceof Error) {\n arr[n] = 0;\n } else {\n arr[n] = number;\n }\n }\n }\n return arr;\n };\n \n exports.rest = function(array, idx) {\n idx = idx || 1;\n if (!array || typeof array.slice !== 'function') {\n return array;\n }\n return array.slice(idx);\n };\n \n exports.initial = function(array, idx) {\n idx = idx || 1;\n if (!array || typeof array.slice !== 'function') {\n return array;\n }\n return array.slice(0, array.length - idx);\n };\n \n exports.arrayEach = function(array, iteratee) {\n var index = -1, length = array.length;\n \n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n \n return array;\n };\n \n exports.transpose = function(matrix) {\n if (!matrix) {\n return error.value;\n }\n \n return matrix[0].map(function(col, i) {\n return matrix.map(function(row) {\n return row[i];\n });\n });\n };\n \n return exports;\n })();\n \n jexcel.methods = {};\n \n jexcel.methods.datetime = (function() {\n var exports = {};\n \n var d1900 = new Date(1900, 0, 1);\n var WEEK_STARTS = [\n undefined,\n 0,\n 1,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 0\n ];\n var WEEK_TYPES = [\n [],\n [1, 2, 3, 4, 5, 6, 7],\n [7, 1, 2, 3, 4, 5, 6],\n [6, 0, 1, 2, 3, 4, 5],\n [],\n [],\n [],\n [],\n [],\n [],\n [],\n [7, 1, 2, 3, 4, 5, 6],\n [6, 7, 1, 2, 3, 4, 5],\n [5, 6, 7, 1, 2, 3, 4],\n [4, 5, 6, 7, 1, 2, 3],\n [3, 4, 5, 6, 7, 1, 2],\n [2, 3, 4, 5, 6, 7, 1],\n [1, 2, 3, 4, 5, 6, 7]\n ];\n var WEEKEND_TYPES = [\n [],\n [6, 0],\n [0, 1],\n [1, 2],\n [2, 3],\n [3, 4],\n [4, 5],\n [5, 6],\n undefined,\n undefined,\n undefined, [0, 0],\n [1, 1],\n [2, 2],\n [3, 3],\n [4, 4],\n [5, 5],\n [6, 6]\n ];\n \n exports.DATE = function(year, month, day) {\n year = utils.parseNumber(year);\n month = utils.parseNumber(month);\n day = utils.parseNumber(day);\n if (utils.anyIsError(year, month, day)) {\n return error.value;\n }\n if (year < 0 || month < 0 || day < 0) {\n return error.num;\n }\n var date = new Date(year, month - 1, day);\n return date;\n };\n \n exports.DATEVALUE = function(date_text) {\n if (typeof date_text !== 'string') {\n return error.value;\n }\n var date = Date.parse(date_text);\n if (isNaN(date)) {\n return error.value;\n }\n if (date <= -2203891200000) {\n return (date - d1900) / 86400000 + 1;\n }\n return (date - d1900) / 86400000 + 2;\n };\n \n exports.DAY = function(serial_number) {\n var date = utils.parseDate(serial_number);\n if (date instanceof Error) {\n return date;\n }\n return date.getDate();\n };\n \n exports.DAYS = function(end_date, start_date) {\n end_date = utils.parseDate(end_date);\n start_date = utils.parseDate(start_date);\n if (end_date instanceof Error) {\n return end_date;\n }\n if (start_date instanceof Error) {\n return start_date;\n }\n return serial(end_date) - serial(start_date);\n };\n \n exports.DAYS360 = function(start_date, end_date, method) {\n };\n \n exports.EDATE = function(start_date, months) {\n start_date = utils.parseDate(start_date);\n if (start_date instanceof Error) {\n return start_date;\n }\n if (isNaN(months)) {\n return error.value;\n }\n months = parseInt(months, 10);\n start_date.setMonth(start_date.getMonth() + months);\n return serial(start_date);\n };\n \n exports.EOMONTH = function(start_date, months) {\n start_date = utils.parseDate(start_date);\n if (start_date instanceof Error) {\n return start_date;\n }\n if (isNaN(months)) {\n return error.value;\n }\n months = parseInt(months, 10);\n return serial(new Date(start_date.getFullYear(), start_date.getMonth() + months + 1, 0));\n };\n \n exports.HOUR = function(serial_number) {\n serial_number = utils.parseDate(serial_number);\n if (serial_number instanceof Error) {\n return serial_number;\n }\n return serial_number.getHours();\n };\n \n exports.INTERVAL = function(second) {\n if (typeof second !== 'number' && typeof second !== 'string') {\n return error.value;\n } else {\n second = parseInt(second, 10);\n }\n \n var year = Math.floor(second/946080000);\n second = second%946080000;\n var month = Math.floor(second/2592000);\n second = second%2592000;\n var day = Math.floor(second/86400);\n second = second%86400;\n \n var hour = Math.floor(second/3600);\n second = second%3600;\n var min = Math.floor(second/60);\n second = second%60;\n var sec = second;\n \n year = (year > 0) ? year + 'Y' : '';\n month = (month > 0) ? month + 'M' : '';\n day = (day > 0) ? day + 'D' : '';\n hour = (hour > 0) ? hour + 'H' : '';\n min = (min > 0) ? min + 'M' : '';\n sec = (sec > 0) ? sec + 'S' : '';\n \n return 'P' + year + month + day + 'T' + hour + min + sec;\n };\n \n exports.ISOWEEKNUM = function(date) {\n date = utils.parseDate(date);\n if (date instanceof Error) {\n return date;\n }\n \n date.setHours(0, 0, 0);\n date.setDate(date.getDate() + 4 - (date.getDay() || 7));\n var yearStart = new Date(date.getFullYear(), 0, 1);\n return Math.ceil((((date - yearStart) / 86400000) + 1) / 7);\n };\n \n exports.MINUTE = function(serial_number) {\n serial_number = utils.parseDate(serial_number);\n if (serial_number instanceof Error) {\n return serial_number;\n }\n return serial_number.getMinutes();\n };\n \n exports.MONTH = function(serial_number) {\n serial_number = utils.parseDate(serial_number);\n if (serial_number instanceof Error) {\n return serial_number;\n }\n return serial_number.getMonth() + 1;\n };\n \n exports.NETWORKDAYS = function(start_date, end_date, holidays) {\n };\n \n exports.NETWORKDAYS.INTL = function(start_date, end_date, weekend, holidays) {\n };\n \n exports.NOW = function() {\n return new Date();\n };\n \n exports.SECOND = function(serial_number) {\n serial_number = utils.parseDate(serial_number);\n if (serial_number instanceof Error) {\n return serial_number;\n }\n return serial_number.getSeconds();\n };\n \n exports.TIME = function(hour, minute, second) {\n hour = utils.parseNumber(hour);\n minute = utils.parseNumber(minute);\n second = utils.parseNumber(second);\n if (utils.anyIsError(hour, minute, second)) {\n return error.value;\n }\n if (hour < 0 || minute < 0 || second < 0) {\n return error.num;\n }\n return (3600 * hour + 60 * minute + second) / 86400;\n };\n \n exports.TIMEVALUE = function(time_text) {\n time_text = utils.parseDate(time_text);\n if (time_text instanceof Error) {\n return time_text;\n }\n return (3600 * time_text.getHours() + 60 * time_text.getMinutes() + time_text.getSeconds()) / 86400;\n };\n \n exports.TODAY = function() {\n return new Date();\n };\n \n exports.WEEKDAY = function(serial_number, return_type) {\n serial_number = utils.parseDate(serial_number);\n if (serial_number instanceof Error) {\n return serial_number;\n }\n if (return_type === undefined) {\n return_type = 1;\n }\n var day = serial_number.getDay();\n return WEEK_TYPES[return_type][day];\n };\n \n exports.WEEKNUM = function(serial_number, return_type) {\n };\n \n exports.WORKDAY = function(start_date, days, holidays) {\n };\n \n exports.WORKDAY.INTL = function(start_date, days, weekend, holidays) {\n };\n \n exports.YEAR = function(serial_number) {\n serial_number = utils.parseDate(serial_number);\n if (serial_number instanceof Error) {\n return serial_number;\n }\n return serial_number.getFullYear();\n };\n \n function isLeapYear(year) {\n return new Date(year, 1, 29).getMonth() === 1;\n }\n \n exports.YEARFRAC = function(start_date, end_date, basis) {\n };\n \n function serial(date) {\n var addOn = (date > -2203891200000)?2:1;\n return (date - d1900) / 86400000 + addOn;\n }\n \n return exports;\n })();\n \n jexcel.methods.database = (function() {\n var exports = {};\n \n function compact(array) {\n if (!array) {\n return array;\n }\n var result = [];\n for (var i = 0; i < array.length; ++i) {\n if (!array[i]) {\n continue;\n }\n result.push(array[i]);\n }\n return result;\n }\n \n exports.FINDFIELD = function(database, title) {\n var index = null;\n for (var i = 0; i < database.length; i++) {\n if (database[i][0] === title) {\n index = i;\n break;\n }\n }\n \n // Return error if the input field title is incorrect\n if (index == null) {\n return error.value;\n }\n return index;\n };\n \n function findResultIndex(database, criterias) {\n var matches = {};\n for (var i = 1; i < database[0].length; ++i) {\n matches[i] = true;\n }\n var maxCriteriaLength = criterias[0].length;\n for (i = 1; i < criterias.length; ++i) {\n if (criterias[i].length > maxCriteriaLength) {\n maxCriteriaLength = criterias[i].length;\n }\n }\n \n for (var k = 1; k < database.length; ++k) {\n for (var l = 1; l < database[k].length; ++l) {\n var currentCriteriaResult = false;\n var hasMatchingCriteria = false;\n for (var j = 0; j < criterias.length; ++j) {\n var criteria = criterias[j];\n if (criteria.length < maxCriteriaLength) {\n continue;\n }\n \n var criteriaField = criteria[0];\n if (database[k][0] !== criteriaField) {\n continue;\n }\n hasMatchingCriteria = true;\n for (var p = 1; p < criteria.length; ++p) {\n currentCriteriaResult = currentCriteriaResult\n || eval(database[k][l] + criteria[p]); // jshint\n // ignore:line\n }\n }\n if (hasMatchingCriteria) {\n matches[l] = matches[l] && currentCriteriaResult;\n }\n }\n }\n \n var result = [];\n for (var n = 0; n < database[0].length; ++n) {\n if (matches[n]) {\n result.push(n - 1);\n }\n }\n return result;\n }\n \n // Database functions\n exports.DAVERAGE = function(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && (typeof field !== \"string\")) {\n return error.value;\n }\n var resultIndexes = findResultIndex(database, criteria);\n var targetFields = [];\n if (typeof field === \"string\") {\n var index = exports.FINDFIELD(database, field);\n targetFields = utils.rest(database[index]);\n } else {\n targetFields = utils.rest(database[field]);\n }\n var sum = 0;\n for (var i = 0; i < resultIndexes.length; i++) {\n sum += targetFields[resultIndexes[i]];\n }\n return resultIndexes.length === 0 ? error.div0 : sum / resultIndexes.length;\n };\n \n exports.DCOUNT = function(database, field, criteria) {\n };\n \n exports.DCOUNTA = function(database, field, criteria) {\n };\n \n exports.DGET = function(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && (typeof field !== \"string\")) {\n return error.value;\n }\n var resultIndexes = findResultIndex(database, criteria);\n var targetFields = [];\n if (typeof field === \"string\") {\n var index = exports.FINDFIELD(database, field);\n targetFields = utils.rest(database[index]);\n } else {\n targetFields = utils.rest(database[field]);\n }\n // Return error if no record meets the criteria\n if (resultIndexes.length === 0) {\n return error.value;\n }\n // Returns the #NUM! error value because more than one record meets the\n // criteria\n if (resultIndexes.length > 1) {\n return error.num;\n }\n \n return targetFields[resultIndexes[0]];\n };\n \n exports.DMAX = function(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && (typeof field !== \"string\")) {\n return error.value;\n }\n var resultIndexes = findResultIndex(database, criteria);\n var targetFields = [];\n if (typeof field === \"string\") {\n var index = exports.FINDFIELD(database, field);\n targetFields = utils.rest(database[index]);\n } else {\n targetFields = utils.rest(database[field]);\n }\n var maxValue = targetFields[resultIndexes[0]];\n for (var i = 1; i < resultIndexes.length; i++) {\n if (maxValue < targetFields[resultIndexes[i]]) {\n maxValue = targetFields[resultIndexes[i]];\n }\n }\n return maxValue;\n };\n \n exports.DMIN = function(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && (typeof field !== \"string\")) {\n return error.value;\n }\n var resultIndexes = findResultIndex(database, criteria);\n var targetFields = [];\n if (typeof field === \"string\") {\n var index = exports.FINDFIELD(database, field);\n targetFields = utils.rest(database[index]);\n } else {\n targetFields = utils.rest(database[field]);\n }\n var minValue = targetFields[resultIndexes[0]];\n for (var i = 1; i < resultIndexes.length; i++) {\n if (minValue > targetFields[resultIndexes[i]]) {\n minValue = targetFields[resultIndexes[i]];\n }\n }\n return minValue;\n };\n \n exports.DPRODUCT = function(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && (typeof field !== \"string\")) {\n return error.value;\n }\n var resultIndexes = findResultIndex(database, criteria);\n var targetFields = [];\n if (typeof field === \"string\") {\n var index = exports.FINDFIELD(database, field);\n targetFields = utils.rest(database[index]);\n } else {\n targetFields = utils.rest(database[field]);\n }\n var targetValues = [];\n for (var i = 0; i < resultIndexes.length; i++) {\n targetValues[i] = targetFields[resultIndexes[i]];\n }\n targetValues = compact(targetValues);\n var result = 1;\n for (i = 0; i < targetValues.length; i++) {\n result *= targetValues[i];\n }\n return result;\n };\n \n exports.DSTDEV = function(database, field, criteria) {\n };\n \n exports.DSTDEVP = function(database, field, criteria) {\n };\n \n exports.DSUM = function(database, field, criteria) {\n };\n \n exports.DVAR = function(database, field, criteria) {\n };\n \n exports.DVARP = function(database, field, criteria) {\n };\n \n exports.MATCH = function(lookupValue, lookupArray, matchType) {\n if (!lookupValue && !lookupArray) {\n return error.na;\n }\n if (arguments.length === 2) {\n matchType = 1;\n }\n if (!(lookupArray instanceof Array)) {\n return error.na;\n }\n if (matchType !== -1 && matchType !== 0 && matchType !== 1) {\n return error.na;\n }\n \n var index;\n var indexValue;\n \n for (var idx = 0; idx < lookupArray.length; idx++) {\n if (matchType === 1) {\n if (lookupArray[idx] === lookupValue) {\n return idx + 1;\n } else if (lookupArray[idx] < lookupValue) {\n if (!indexValue) {\n index = idx + 1;\n indexValue = lookupArray[idx];\n } else if (lookupArray[idx] > indexValue) {\n index = idx + 1;\n indexValue = lookupArray[idx];\n }\n }\n } else if (matchType === 0) {\n if (typeof lookupValue === 'string') {\n lookupValue = lookupValue.replace(/\\?/g, '.');\n if (lookupArray[idx].toLowerCase().match(lookupValue.toLowerCase())) {\n return idx + 1;\n }\n } else {\n if (lookupArray[idx] === lookupValue) {\n return idx + 1;\n }\n }\n } else if (matchType === -1) {\n if (lookupArray[idx] === lookupValue) {\n return idx + 1;\n } else if (lookupArray[idx] > lookupValue) {\n if (!indexValue) {\n index = idx + 1;\n indexValue = lookupArray[idx];\n } else if (lookupArray[idx] < indexValue) {\n index = idx + 1;\n indexValue = lookupArray[idx];\n }\n }\n }\n }\n \n return index ? index : error.na;\n };\n \n return exports;\n })();\n \n jexcel.methods.engineering = (function() {\n var exports = {};\n \n function isValidBinaryNumber(number) {\n return (/^[01]{1,10}$/).test(number);\n }\n \n exports.BESSELI = function(x, n) {\n };\n \n exports.BESSELJ = function(x, n) {\n };\n \n exports.BESSELK = function(x, n) {\n };\n \n exports.BESSELY = function(x, n) {\n };\n \n exports.BIN2DEC = function(number) {\n // Return error if number is not binary or contains more than 10\n // characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return error.num;\n }\n \n // Convert binary number to decimal\n var result = parseInt(number, 2);\n \n // Handle negative numbers\n var stringified = number.toString();\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return parseInt(stringified.substring(1), 2) - 512;\n } else {\n return result;\n }\n };\n \n exports.BIN2HEX = function(number, places) {\n // Return error if number is not binary or contains more than 10\n // characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return error.num;\n }\n \n // Ignore places and return a 10-character hexadecimal number if number\n // is negative\n var stringified = number.toString();\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return (1099511627264 + parseInt(stringified.substring(1), 2)).toString(16);\n }\n \n // Convert binary number to hexadecimal\n var result = parseInt(number, 2).toString(16);\n \n // Return hexadecimal number using the minimum number of characters\n // necessary if places is undefined\n if (places === undefined) {\n return result;\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value;\n }\n \n // Return error if places is negative\n if (places < 0) {\n return error.num;\n }\n \n // Truncate places in case it is not an integer\n places = Math.floor(places);\n \n // Pad return value with leading 0s (zeros) if necessary (using\n // Underscore.string)\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\n }\n };\n \n exports.BIN2OCT = function(number, places) {\n // Return error if number is not binary or contains more than 10\n // characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return error.num;\n }\n \n // Ignore places and return a 10-character octal number if number is\n // negative\n var stringified = number.toString();\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return (1073741312 + parseInt(stringified.substring(1), 2)).toString(8);\n }\n \n // Convert binary number to octal\n var result = parseInt(number, 2).toString(8);\n \n // Return octal number using the minimum number of characters necessary\n // if places is undefined\n if (places === undefined) {\n return result;\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value;\n }\n \n // Return error if places is negative\n if (places < 0) {\n return error.num;\n }\n \n // Truncate places in case it is not an integer\n places = Math.floor(places);\n \n // Pad return value with leading 0s (zeros) if necessary (using\n // Underscore.string)\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\n }\n };\n \n exports.BITAND = function(number1, number2) {\n // Return error if either number is a non-numeric value\n number1 = utils.parseNumber(number1);\n number2 = utils.parseNumber(number2);\n if (utils.anyIsError(number1, number2)) {\n return error.value;\n }\n \n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return error.num;\n }\n \n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return error.num;\n }\n \n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return error.num;\n }\n \n // Return bitwise AND of two numbers\n return number1 & number2;\n };\n \n exports.BITLSHIFT = function(number, shift) {\n number = utils.parseNumber(number);\n shift = utils.parseNumber(shift);\n if (utils.anyIsError(number, shift)) {\n return error.value;\n }\n \n // Return error if number is less than 0\n if (number < 0) {\n return error.num;\n }\n \n // Return error if number is a non-integer\n if (Math.floor(number) !== number) {\n return error.num;\n }\n \n // Return error if number is greater than (2^48)-1\n if (number > 281474976710655) {\n return error.num;\n }\n \n // Return error if the absolute value of shift is greater than 53\n if (Math.abs(shift) > 53) {\n return error.num;\n }\n \n // Return number shifted by shift bits to the left or to the right if\n // shift is negative\n return (shift >= 0) ? number << shift : number >> -shift;\n };\n \n exports.BITOR = function(number1, number2) {\n number1 = utils.parseNumber(number1);\n number2 = utils.parseNumber(number2);\n if (utils.anyIsError(number1, number2)) {\n return error.value;\n }\n \n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return error.num;\n }\n \n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return error.num;\n }\n \n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return error.num;\n }\n \n // Return bitwise OR of two numbers\n return number1 | number2;\n };\n \n exports.BITRSHIFT = function(number, shift) {\n number = utils.parseNumber(number);\n shift = utils.parseNumber(shift);\n if (utils.anyIsError(number, shift)) {\n return error.value;\n }\n \n // Return error if number is less than 0\n if (number < 0) {\n return error.num;\n }\n \n // Return error if number is a non-integer\n if (Math.floor(number) !== number) {\n return error.num;\n }\n \n // Return error if number is greater than (2^48)-1\n if (number > 281474976710655) {\n return error.num;\n }\n \n // Return error if the absolute value of shift is greater than 53\n if (Math.abs(shift) > 53) {\n return error.num;\n }\n \n // Return number shifted by shift bits to the right or to the left if\n // shift is negative\n return (shift >= 0) ? number >> shift : number << -shift;\n };\n \n exports.BITXOR = function(number1, number2) {\n number1 = utils.parseNumber(number1);\n number2 = utils.parseNumber(number2);\n if (utils.anyIsError(number1, number2)) {\n return error.value;\n }\n \n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return error.num;\n }\n \n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return error.num;\n }\n \n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return error.num;\n }\n \n // Return bitwise XOR of two numbers\n return number1 ^ number2;\n };\n \n exports.COMPLEX = function(real, imaginary, suffix) {\n real = utils.parseNumber(real);\n imaginary = utils.parseNumber(imaginary);\n if (utils.anyIsError(real, imaginary)) {\n return real;\n }\n \n // Set suffix\n suffix = (suffix === undefined) ? 'i' : suffix;\n \n // Return error if suffix is neither \"i\" nor \"j\"\n if (suffix !== 'i' && suffix !== 'j') {\n return error.value;\n }\n \n // Return complex number\n if (real === 0 && imaginary === 0) {\n return 0;\n } else if (real === 0) {\n return (imaginary === 1) ? suffix : imaginary.toString() + suffix;\n } else if (imaginary === 0) {\n return real.toString();\n } else {\n var sign = (imaginary > 0) ? '+' : '';\n return real.toString() + sign + ((imaginary === 1) ? suffix : imaginary.toString() + suffix);\n }\n };\n \n exports.CONVERT = function(number, from_unit, to_unit) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n \n // List of units supported by CONVERT and units defined by the\n // International System of Units\n // [Name, Symbol, Alternate symbols, Quantity, ISU, CONVERT, Conversion\n // ratio]\n var units = [\n [\"a.u. of action\", \"?\", null, \"action\", false, false, 1.05457168181818e-34],\n [\"a.u. of charge\", \"e\", null, \"electric_charge\", false, false, 1.60217653141414e-19],\n [\"a.u. of energy\", \"Eh\", null, \"energy\", false, false, 4.35974417757576e-18],\n [\"a.u. of length\", \"a?\", null, \"length\", false, false, 5.29177210818182e-11],\n [\"a.u. of mass\", \"m?\", null, \"mass\", false, false, 9.10938261616162e-31],\n [\"a.u. of time\", \"?/Eh\", null, \"time\", false, false, 2.41888432650516e-17],\n [\"admiralty knot\", \"admkn\", null, \"speed\", false, true, 0.514773333],\n [\"ampere\", \"A\", null, \"electric_current\", true, false, 1],\n [\"ampere per meter\", \"A/m\", null, \"magnetic_field_intensity\", true, false, 1],\n [\"Ã¥ngström\", \"Ã…\", [\"ang\"], \"length\", false, true, 1e-10],\n [\"are\", \"ar\", null, \"area\", false, true, 100],\n [\"astronomical unit\", \"ua\", null, \"length\", false, false, 1.49597870691667e-11],\n [\"bar\", \"bar\", null, \"pressure\", false, false, 100000],\n [\"barn\", \"b\", null, \"area\", false, false, 1e-28],\n [\"becquerel\", \"Bq\", null, \"radioactivity\", true, false, 1],\n [\"bit\", \"bit\", [\"b\"], \"information\", false, true, 1],\n [\"btu\", \"BTU\", [\"btu\"], \"energy\", false, true, 1055.05585262],\n [\"byte\", \"byte\", null, \"information\", false, true, 8],\n [\"candela\", \"cd\", null, \"luminous_intensity\", true, false, 1],\n [\"candela per square metre\", \"cd/m?\", null, \"luminance\", true, false, 1],\n [\"coulomb\", \"C\", null, \"electric_charge\", true, false, 1],\n [\"cubic Ã¥ngström\", \"ang3\", [\"ang^3\"], \"volume\", false, true, 1e-30],\n [\"cubic foot\", \"ft3\", [\"ft^3\"], \"volume\", false, true, 0.028316846592],\n [\"cubic inch\", \"in3\", [\"in^3\"], \"volume\", false, true, 0.000016387064],\n [\"cubic light-year\", \"ly3\", [\"ly^3\"], \"volume\", false, true, 8.46786664623715e-47],\n [\"cubic metre\", \"m?\", null, \"volume\", true, true, 1],\n [\"cubic mile\", \"mi3\", [\"mi^3\"], \"volume\", false, true, 4168181825.44058],\n [\"cubic nautical mile\", \"Nmi3\", [\"Nmi^3\"], \"volume\", false, true, 6352182208],\n [\"cubic Pica\", \"Pica3\", [\"Picapt3\", \"Pica^3\", \"Picapt^3\"], \"volume\", false, true, 7.58660370370369e-8],\n [\"cubic yard\", \"yd3\", [\"yd^3\"], \"volume\", false, true, 0.764554857984],\n [\"cup\", \"cup\", null, \"volume\", false, true, 0.0002365882365],\n [\"dalton\", \"Da\", [\"u\"], \"mass\", false, false, 1.66053886282828e-27],\n [\"day\", \"d\", [\"day\"], \"time\", false, true, 86400],\n [\"degree\", \"°\", null, \"angle\", false, false, 0.0174532925199433],\n [\"degrees Rankine\", \"Rank\", null, \"temperature\", false, true, 0.555555555555556],\n [\"dyne\", \"dyn\", [\"dy\"], \"force\", false, true, 0.00001],\n [\"electronvolt\", \"eV\", [\"ev\"], \"energy\", false, true, 1.60217656514141],\n [\"ell\", \"ell\", null, \"length\", false, true, 1.143],\n [\"erg\", \"erg\", [\"e\"], \"energy\", false, true, 1e-7],\n [\"farad\", \"F\", null, \"electric_capacitance\", true, false, 1],\n [\"fluid ounce\", \"oz\", null, \"volume\", false, true, 0.0000295735295625],\n [\"foot\", \"ft\", null, \"length\", false, true, 0.3048],\n [\"foot-pound\", \"flb\", null, \"energy\", false, true, 1.3558179483314],\n [\"gal\", \"Gal\", null, \"acceleration\", false, false, 0.01],\n [\"gallon\", \"gal\", null, \"volume\", false, true, 0.003785411784],\n [\"gauss\", \"G\", [\"ga\"], \"magnetic_flux_density\", false, true, 1],\n [\"grain\", \"grain\", null, \"mass\", false, true, 0.0000647989],\n [\"gram\", \"g\", null, \"mass\", false, true, 0.001],\n [\"gray\", \"Gy\", null, \"absorbed_dose\", true, false, 1],\n [\"gross registered ton\", \"GRT\", [\"regton\"], \"volume\", false, true, 2.8316846592],\n [\"hectare\", \"ha\", null, \"area\", false, true, 10000],\n [\"henry\", \"H\", null, \"inductance\", true, false, 1],\n [\"hertz\", \"Hz\", null, \"frequency\", true, false, 1],\n [\"horsepower\", \"HP\", [\"h\"], \"power\", false, true, 745.69987158227],\n [\"horsepower-hour\", \"HPh\", [\"hh\", \"hph\"], \"energy\", false, true, 2684519.538],\n [\"hour\", \"h\", [\"hr\"], \"time\", false, true, 3600],\n [\"imperial gallon (U.K.)\", \"uk_gal\", null, \"volume\", false, true, 0.00454609],\n [\"imperial hundredweight\", \"lcwt\", [\"uk_cwt\", \"hweight\"], \"mass\", false, true, 50.802345],\n [\"imperial quart (U.K)\", \"uk_qt\", null, \"volume\", false, true, 0.0011365225],\n [\"imperial ton\", \"brton\", [\"uk_ton\", \"LTON\"], \"mass\", false, true, 1016.046909],\n [\"inch\", \"in\", null, \"length\", false, true, 0.0254],\n [\"international acre\", \"uk_acre\", null, \"area\", false, true, 4046.8564224],\n [\"IT calorie\", \"cal\", null, \"energy\", false, true, 4.1868],\n [\"joule\", \"J\", null, \"energy\", true, true, 1],\n [\"katal\", \"kat\", null, \"catalytic_activity\", true, false, 1],\n [\"kelvin\", \"K\", [\"kel\"], \"temperature\", true, true, 1],\n [\"kilogram\", \"kg\", null, \"mass\", true, true, 1],\n [\"knot\", \"kn\", null, \"speed\", false, true, 0.514444444444444],\n [\"light-year\", \"ly\", null, \"length\", false, true, 9460730472580800],\n [\"litre\", \"L\", [\"l\", \"lt\"], \"volume\", false, true, 0.001],\n [\"lumen\", \"lm\", null, \"luminous_flux\", true, false, 1],\n [\"lux\", \"lx\", null, \"illuminance\", true, false, 1],\n [\"maxwell\", \"Mx\", null, \"magnetic_flux\", false, false, 1e-18],\n [\"measurement ton\", \"MTON\", null, \"volume\", false, true, 1.13267386368],\n [\"meter per hour\", \"m/h\", [\"m/hr\"], \"speed\", false, true, 0.00027777777777778],\n [\"meter per second\", \"m/s\", [\"m/sec\"], \"speed\", true, true, 1],\n [\"meter per second squared\", \"m?s??\", null, \"acceleration\", true, false, 1],\n [\"parsec\", \"pc\", [\"parsec\"], \"length\", false, true, 30856775814671900],\n [\"meter squared per second\", \"m?/s\", null, \"kinematic_viscosity\", true, false, 1],\n [\"metre\", \"m\", null, \"length\", true, true, 1],\n [\"miles per hour\", \"mph\", null, \"speed\", false, true, 0.44704],\n [\"millimetre of mercury\", \"mmHg\", null, \"pressure\", false, false, 133.322],\n [\"minute\", \"?\", null, \"angle\", false, false, 0.000290888208665722],\n [\"minute\", \"min\", [\"mn\"], \"time\", false, true, 60],\n [\"modern teaspoon\", \"tspm\", null, \"volume\", false, true, 0.000005],\n [\"mole\", \"mol\", null, \"amount_of_substance\", true, false, 1],\n [\"morgen\", \"Morgen\", null, \"area\", false, true, 2500],\n [\"n.u. of action\", \"?\", null, \"action\", false, false, 1.05457168181818e-34],\n [\"n.u. of mass\", \"m?\", null, \"mass\", false, false, 9.10938261616162e-31],\n [\"n.u. of speed\", \"c?\", null, \"speed\", false, false, 299792458],\n [\"n.u. of time\", \"?/(me?c??)\", null, \"time\", false, false, 1.28808866778687e-21],\n [\"nautical mile\", \"M\", [\"Nmi\"], \"length\", false, true, 1852],\n [\"newton\", \"N\", null, \"force\", true, true, 1],\n [\"Å“rsted\", \"Oe \", null, \"magnetic_field_intensity\", false, false, 79.5774715459477],\n [\"ohm\", \"Ω\", null, \"electric_resistance\", true, false, 1],\n [\"ounce mass\", \"ozm\", null, \"mass\", false, true, 0.028349523125],\n [\"pascal\", \"Pa\", null, \"pressure\", true, false, 1],\n [\"pascal second\", \"Pa?s\", null, \"dynamic_viscosity\", true, false, 1],\n [\"pferdestärke\", \"PS\", null, \"power\", false, true, 735.49875],\n [\"phot\", \"ph\", null, \"illuminance\", false, false, 0.0001],\n [\"pica (1/6 inch)\", \"pica\", null, \"length\", false, true, 0.00035277777777778],\n [\"pica (1/72 inch)\", \"Pica\", [\"Picapt\"], \"length\", false, true, 0.00423333333333333],\n [\"poise\", \"P\", null, \"dynamic_viscosity\", false, false, 0.1],\n [\"pond\", \"pond\", null, \"force\", false, true, 0.00980665],\n [\"pound force\", \"lbf\", null, \"force\", false, true, 4.4482216152605],\n [\"pound mass\", \"lbm\", null, \"mass\", false, true, 0.45359237],\n [\"quart\", \"qt\", null, \"volume\", false, true, 0.000946352946],\n [\"radian\", \"rad\", null, \"angle\", true, false, 1],\n [\"second\", \"?\", null, \"angle\", false, false, 0.00000484813681109536],\n [\"second\", \"s\", [\"sec\"], \"time\", true, true, 1],\n [\"short hundredweight\", \"cwt\", [\"shweight\"], \"mass\", false, true, 45.359237],\n [\"siemens\", \"S\", null, \"electrical_conductance\", true, false, 1],\n [\"sievert\", \"Sv\", null, \"equivalent_dose\", true, false, 1],\n [\"slug\", \"sg\", null, \"mass\", false, true, 14.59390294],\n [\"square Ã¥ngström\", \"ang2\", [\"ang^2\"], \"area\", false, true, 1e-20],\n [\"square foot\", \"ft2\", [\"ft^2\"], \"area\", false, true, 0.09290304],\n [\"square inch\", \"in2\", [\"in^2\"], \"area\", false, true, 0.00064516],\n [\"square light-year\", \"ly2\", [\"ly^2\"], \"area\", false, true, 8.95054210748189e+31],\n [\"square meter\", \"m?\", null, \"area\", true, true, 1],\n [\"square mile\", \"mi2\", [\"mi^2\"], \"area\", false, true, 2589988.110336],\n [\"square nautical mile\", \"Nmi2\", [\"Nmi^2\"], \"area\", false, true, 3429904],\n [\"square Pica\", \"Pica2\", [\"Picapt2\", \"Pica^2\", \"Picapt^2\"], \"area\", false, true, 0.00001792111111111],\n [\"square yard\", \"yd2\", [\"yd^2\"], \"area\", false, true, 0.83612736],\n [\"statute mile\", \"mi\", null, \"length\", false, true, 1609.344],\n [\"steradian\", \"sr\", null, \"solid_angle\", true, false, 1],\n [\"stilb\", \"sb\", null, \"luminance\", false, false, 0.0001],\n [\"stokes\", \"St\", null, \"kinematic_viscosity\", false, false, 0.0001],\n [\"stone\", \"stone\", null, \"mass\", false, true, 6.35029318],\n [\"tablespoon\", \"tbs\", null, \"volume\", false, true, 0.0000147868],\n [\"teaspoon\", \"tsp\", null, \"volume\", false, true, 0.00000492892],\n [\"tesla\", \"T\", null, \"magnetic_flux_density\", true, true, 1],\n [\"thermodynamic calorie\", \"c\", null, \"energy\", false, true, 4.184],\n [\"ton\", \"ton\", null, \"mass\", false, true, 907.18474],\n [\"tonne\", \"t\", null, \"mass\", false, false, 1000],\n [\"U.K. pint\", \"uk_pt\", null, \"volume\", false, true, 0.00056826125],\n [\"U.S. bushel\", \"bushel\", null, \"volume\", false, true, 0.03523907],\n [\"U.S. oil barrel\", \"barrel\", null, \"volume\", false, true, 0.158987295],\n [\"U.S. pint\", \"pt\", [\"us_pt\"], \"volume\", false, true, 0.000473176473],\n [\"U.S. survey mile\", \"survey_mi\", null, \"length\", false, true, 1609.347219],\n [\"U.S. survey/statute acre\", \"us_acre\", null, \"area\", false, true, 4046.87261],\n [\"volt\", \"V\", null, \"voltage\", true, false, 1],\n [\"watt\", \"W\", null, \"power\", true, true, 1],\n [\"watt-hour\", \"Wh\", [\"wh\"], \"energy\", false, true, 3600],\n [\"weber\", \"Wb\", null, \"magnetic_flux\", true, false, 1],\n [\"yard\", \"yd\", null, \"length\", false, true, 0.9144],\n [\"year\", \"yr\", null, \"time\", false, true, 31557600]\n ];\n \n // Binary prefixes\n // [Name, Prefix power of 2 value, Previx value, Abbreviation, Derived\n // from]\n var binary_prefixes = {\n Yi: [\"yobi\", 80, 1208925819614629174706176, \"Yi\", \"yotta\"],\n Zi: [\"zebi\", 70, 1180591620717411303424, \"Zi\", \"zetta\"],\n Ei: [\"exbi\", 60, 1152921504606846976, \"Ei\", \"exa\"],\n Pi: [\"pebi\", 50, 1125899906842624, \"Pi\", \"peta\"],\n Ti: [\"tebi\", 40, 1099511627776, \"Ti\", \"tera\"],\n Gi: [\"gibi\", 30, 1073741824, \"Gi\", \"giga\"],\n Mi: [\"mebi\", 20, 1048576, \"Mi\", \"mega\"],\n ki: [\"kibi\", 10, 1024, \"ki\", \"kilo\"]\n };\n \n // Unit prefixes\n // [Name, Multiplier, Abbreviation]\n var unit_prefixes = {\n Y: [\"yotta\", 1e+24, \"Y\"],\n Z: [\"zetta\", 1e+21, \"Z\"],\n E: [\"exa\", 1e+18, \"E\"],\n P: [\"peta\", 1e+15, \"P\"],\n T: [\"tera\", 1e+12, \"T\"],\n G: [\"giga\", 1e+09, \"G\"],\n M: [\"mega\", 1e+06, \"M\"],\n k: [\"kilo\", 1e+03, \"k\"],\n h: [\"hecto\", 1e+02, \"h\"],\n e: [\"dekao\", 1e+01, \"e\"],\n d: [\"deci\", 1e-01, \"d\"],\n c: [\"centi\", 1e-02, \"c\"],\n m: [\"milli\", 1e-03, \"m\"],\n u: [\"micro\", 1e-06, \"u\"],\n n: [\"nano\", 1e-09, \"n\"],\n p: [\"pico\", 1e-12, \"p\"],\n f: [\"femto\", 1e-15, \"f\"],\n a: [\"atto\", 1e-18, \"a\"],\n z: [\"zepto\", 1e-21, \"z\"],\n y: [\"yocto\", 1e-24, \"y\"]\n };\n \n // Initialize units and multipliers\n var from = null;\n var to = null;\n var base_from_unit = from_unit;\n var base_to_unit = to_unit;\n var from_multiplier = 1;\n var to_multiplier = 1;\n var alt;\n \n // Lookup from and to units\n for (var i = 0; i < units.length; i++) {\n alt = (units[i][2] === null) ? [] : units[i][2];\n if (units[i][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\n from = units[i];\n }\n if (units[i][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\n to = units[i];\n }\n }\n \n // Lookup from prefix\n if (from === null) {\n var from_binary_prefix = binary_prefixes[from_unit.substring(0, 2)];\n var from_unit_prefix = unit_prefixes[from_unit.substring(0, 1)];\n \n // Handle dekao unit prefix (only unit prefix with two characters)\n if (from_unit.substring(0, 2) === 'da') {\n from_unit_prefix = [\"dekao\", 1e+01, \"da\"];\n }\n \n // Handle binary prefixes first (so that 'Yi' is processed before\n // 'Y')\n if (from_binary_prefix) {\n from_multiplier = from_binary_prefix[2];\n base_from_unit = from_unit.substring(2);\n } else if (from_unit_prefix) {\n from_multiplier = from_unit_prefix[1];\n base_from_unit = from_unit.substring(from_unit_prefix[2].length);\n }\n \n // Lookup from unit\n for (var j = 0; j < units.length; j++) {\n alt = (units[j][2] === null) ? [] : units[j][2];\n if (units[j][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\n from = units[j];\n }\n }\n }\n \n // Lookup to prefix\n if (to === null) {\n var to_binary_prefix = binary_prefixes[to_unit.substring(0, 2)];\n var to_unit_prefix = unit_prefixes[to_unit.substring(0, 1)];\n \n // Handle dekao unit prefix (only unit prefix with two characters)\n if (to_unit.substring(0, 2) === 'da') {\n to_unit_prefix = [\"dekao\", 1e+01, \"da\"];\n }\n \n // Handle binary prefixes first (so that 'Yi' is processed before\n // 'Y')\n if (to_binary_prefix) {\n to_multiplier = to_binary_prefix[2];\n base_to_unit = to_unit.substring(2);\n } else if (to_unit_prefix) {\n to_multiplier = to_unit_prefix[1];\n base_to_unit = to_unit.substring(to_unit_prefix[2].length);\n }\n \n // Lookup to unit\n for (var k = 0; k < units.length; k++) {\n alt = (units[k][2] === null) ? [] : units[k][2];\n if (units[k][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\n to = units[k];\n }\n }\n }\n \n // Return error if a unit does not exist\n if (from === null || to === null) {\n return error.na;\n }\n \n // Return error if units represent different quantities\n if (from[3] !== to[3]) {\n return error.na;\n }\n \n // Return converted number\n return number * from[6] * from_multiplier / (to[6] * to_multiplier);\n };\n \n exports.DEC2BIN = function(number, places) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n \n // Return error if number is not decimal, is lower than -512, or is\n // greater than 511\n if (!/^-?[0-9]{1,3}$/.test(number) || number < -512 || number > 511) {\n return error.num;\n }\n \n // Ignore places and return a 10-character binary number if number is\n // negative\n if (number < 0) {\n return '1' + REPT('0', 9 - (512 + number).toString(2).length) + (512 + number).toString(2);\n }\n \n // Convert decimal number to binary\n var result = parseInt(number, 10).toString(2);\n \n // Return binary number using the minimum number of characters necessary\n // if places is undefined\n if (typeof places === 'undefined') {\n return result;\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value;\n }\n \n // Return error if places is negative\n if (places < 0) {\n return error.num;\n }\n \n // Truncate places in case it is not an integer\n places = Math.floor(places);\n \n // Pad return value with leading 0s (zeros) if necessary (using\n // Underscore.string)\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\n }\n };\n \n exports.DEC2HEX = function(number, places) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n \n // Return error if number is not decimal, is lower than -549755813888,\n // or is greater than 549755813887\n if (!/^-?[0-9]{1,12}$/.test(number) || number < -549755813888 || number > 549755813887) {\n return error.num;\n }\n \n // Ignore places and return a 10-character hexadecimal number if number\n // is negative\n if (number < 0) {\n return (1099511627776 + number).toString(16);\n }\n \n // Convert decimal number to hexadecimal\n var result = parseInt(number, 10).toString(16);\n \n // Return hexadecimal number using the minimum number of characters\n // necessary if places is undefined\n if (typeof places === 'undefined') {\n return result;\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value;\n }\n \n // Return error if places is negative\n if (places < 0) {\n return error.num;\n }\n \n // Truncate places in case it is not an integer\n places = Math.floor(places);\n \n // Pad return value with leading 0s (zeros) if necessary (using\n // Underscore.string)\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\n }\n };\n \n exports.DEC2OCT = function(number, places) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n \n // Return error if number is not decimal, is lower than -549755813888,\n // or is greater than 549755813887\n if (!/^-?[0-9]{1,9}$/.test(number) || number < -536870912 || number > 536870911) {\n return error.num;\n }\n \n // Ignore places and return a 10-character octal number if number is\n // negative\n if (number < 0) {\n return (1073741824 + number).toString(8);\n }\n \n // Convert decimal number to octal\n var result = parseInt(number, 10).toString(8);\n \n // Return octal number using the minimum number of characters necessary\n // if places is undefined\n if (typeof places === 'undefined') {\n return result;\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value;\n }\n \n // Return error if places is negative\n if (places < 0) {\n return error.num;\n }\n \n // Truncate places in case it is not an integer\n places = Math.floor(places);\n \n // Pad return value with leading 0s (zeros) if necessary (using\n // Underscore.string)\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\n }\n };\n \n exports.DELTA = function(number1, number2) {\n // Set number2 to zero if undefined\n number2 = (number2 === undefined) ? 0 : number2;\n number1 = utils.parseNumber(number1);\n number2 = utils.parseNumber(number2);\n if (utils.anyIsError(number1, number2)) {\n return error.value;\n }\n \n // Return delta\n return (number1 === number2) ? 1 : 0;\n };\n \n exports.ERF = function(lower_bound, upper_bound) {\n };\n \n exports.ERF.PRECISE = function() {\n };\n \n exports.ERFC = function(x) {\n };\n \n exports.ERFC.PRECISE = function() {\n };\n \n exports.GESTEP = function(number, step) {\n step = step || 0;\n number = utils.parseNumber(number);\n if (utils.anyIsError(step, number)) {\n return number;\n }\n \n // Return delta\n return (number >= step) ? 1 : 0;\n };\n \n exports.HEX2BIN = function(number, places) {\n // Return error if number is not hexadecimal or contains more than ten\n // characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return error.num;\n }\n \n // Check if number is negative\n var negative = (number.length === 10 && number.substring(0, 1).toLowerCase() === 'f') ? true : false;\n \n // Convert hexadecimal number to decimal\n var decimal = (negative) ? parseInt(number, 16) - 1099511627776 : parseInt(number, 16);\n \n // Return error if number is lower than -512 or greater than 511\n if (decimal < -512 || decimal > 511) {\n return error.num;\n }\n \n // Ignore places and return a 10-character binary number if number is\n // negative\n if (negative) {\n return '1' + REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2);\n }\n \n // Convert decimal number to binary\n var result = decimal.toString(2);\n \n // Return binary number using the minimum number of characters necessary\n // if places is undefined\n if (places === undefined) {\n return result;\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value;\n }\n \n // Return error if places is negative\n if (places < 0) {\n return error.num;\n }\n \n // Truncate places in case it is not an integer\n places = Math.floor(places);\n \n // Pad return value with leading 0s (zeros) if necessary (using\n // Underscore.string)\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\n }\n };\n \n exports.HEX2DEC = function(number) {\n // Return error if number is not hexadecimal or contains more than ten\n // characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return error.num;\n }\n \n // Convert hexadecimal number to decimal\n var decimal = parseInt(number, 16);\n \n // Return decimal number\n return (decimal >= 549755813888) ? decimal - 1099511627776 : decimal;\n };\n \n exports.HEX2OCT = function(number, places) {\n // Return error if number is not hexadecimal or contains more than ten\n // characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return error.num;\n }\n \n // Convert hexadecimal number to decimal\n var decimal = parseInt(number, 16);\n \n // Return error if number is positive and greater than 0x1fffffff\n // (536870911)\n if (decimal > 536870911 && decimal < 1098974756864) {\n return error.num;\n }\n \n // Ignore places and return a 10-character octal number if number is\n // negative\n if (decimal >= 1098974756864) {\n return (decimal - 1098437885952).toString(8);\n }\n \n // Convert decimal number to octal\n var result = decimal.toString(8);\n \n // Return octal number using the minimum number of characters necessary\n // if places is undefined\n if (places === undefined) {\n return result;\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value;\n }\n \n // Return error if places is negative\n if (places < 0) {\n return error.num;\n }\n \n // Truncate places in case it is not an integer\n places = Math.floor(places);\n \n // Pad return value with leading 0s (zeros) if necessary (using\n // Underscore.string)\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\n }\n };\n \n exports.IMABS = function(inumber) {\n // Lookup real and imaginary coefficients using exports.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Return absolute value of complex number\n return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n };\n \n exports.IMAGINARY = function(inumber) {\n if (inumber === undefined || inumber === true || inumber === false) {\n return error.value;\n }\n \n // Return 0 if inumber is equal to 0\n if (inumber === 0 || inumber === '0') {\n return 0;\n }\n \n // Handle special cases\n if (['i', 'j'].indexOf(inumber) >= 0) {\n return 1;\n }\n \n // Normalize imaginary coefficient\n inumber = inumber.replace('+i', '+1i').replace('-i', '-1i').replace('+j', '+1j').replace('-j', '-1j');\n \n // Lookup sign\n var plus = inumber.indexOf('+');\n var minus = inumber.indexOf('-');\n if (plus === 0) {\n plus = inumber.indexOf('+', 1);\n }\n \n if (minus === 0) {\n minus = inumber.indexOf('-', 1);\n }\n \n // Lookup imaginary unit\n var last = inumber.substring(inumber.length - 1, inumber.length);\n var unit = (last === 'i' || last === 'j');\n \n if (plus >= 0 || minus >= 0) {\n // Return error if imaginary unit is neither i nor j\n if (!unit) {\n return error.num;\n }\n \n // Return imaginary coefficient of complex number\n if (plus >= 0) {\n return (isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))) ?\n error.num :\n Number(inumber.substring(plus + 1, inumber.length - 1));\n } else {\n return (isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))) ?\n error.num :\n -Number(inumber.substring(minus + 1, inumber.length - 1));\n }\n } else {\n if (unit) {\n return (isNaN(inumber.substring(0, inumber.length - 1))) ? error.num : inumber.substring(0, inumber.length - 1);\n } else {\n return (isNaN(inumber)) ? error.num : 0;\n }\n }\n };\n \n exports.IMARGUMENT = function(inumber) {\n // Lookup real and imaginary coefficients using exports.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Return error if inumber is equal to zero\n if (x === 0 && y === 0) {\n return error.div0;\n }\n \n // Return PI/2 if x is equal to zero and y is positive\n if (x === 0 && y > 0) {\n return Math.PI / 2;\n }\n \n // Return -PI/2 if x is equal to zero and y is negative\n if (x === 0 && y < 0) {\n return -Math.PI / 2;\n }\n \n // Return zero if x is negative and y is equal to zero\n if (y === 0 && x > 0) {\n return 0;\n }\n \n // Return zero if x is negative and y is equal to zero\n if (y === 0 && x < 0) {\n return -Math.PI;\n }\n \n // Return argument of complex number\n if (x > 0) {\n return Math.atan(y / x);\n } else if (x < 0 && y >= 0) {\n return Math.atan(y / x) + Math.PI;\n } else {\n return Math.atan(y / x) - Math.PI;\n }\n };\n \n exports.IMCONJUGATE = function(inumber) {\n // Lookup real and imaginary coefficients using exports.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Return conjugate of complex number\n return (y !== 0) ? exports.COMPLEX(x, -y, unit) : inumber;\n };\n \n exports.IMCOS = function(inumber) {\n // Lookup real and imaginary coefficients using exports.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Return cosine of complex number\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);\n };\n \n exports.IMCOSH = function(inumber) {\n // Lookup real and imaginary coefficients using exports.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Return hyperbolic cosine of complex number\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);\n };\n \n exports.IMCOT = function(inumber) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Return cotangent of complex number\n return exports.IMDIV(exports.IMCOS(inumber), exports.IMSIN(inumber));\n };\n \n exports.IMDIV = function(inumber1, inumber2) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var a = exports.IMREAL(inumber1);\n var b = exports.IMAGINARY(inumber1);\n var c = exports.IMREAL(inumber2);\n var d = exports.IMAGINARY(inumber2);\n \n if (utils.anyIsError(a, b, c, d)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit1 = inumber1.substring(inumber1.length - 1);\n var unit2 = inumber2.substring(inumber2.length - 1);\n var unit = 'i';\n if (unit1 === 'j') {\n unit = 'j';\n } else if (unit2 === 'j') {\n unit = 'j';\n }\n \n // Return error if inumber2 is null\n if (c === 0 && d === 0) {\n return error.num;\n }\n \n // Return exponential of complex number\n var den = c * c + d * d;\n return exports.COMPLEX((a * c + b * d) / den, (b * c - a * d) / den, unit);\n };\n \n exports.IMEXP = function(inumber) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Return exponential of complex number\n var e = Math.exp(x);\n return exports.COMPLEX(e * Math.cos(y), e * Math.sin(y), unit);\n };\n \n exports.IMLN = function(inumber) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Return exponential of complex number\n return exports.COMPLEX(Math.log(Math.sqrt(x * x + y * y)), Math.atan(y / x), unit);\n };\n \n exports.IMLOG10 = function(inumber) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Return exponential of complex number\n return exports.COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(10), Math.atan(y / x) / Math.log(10), unit);\n };\n \n exports.IMLOG2 = function(inumber) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Return exponential of complex number\n return exports.COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(2), Math.atan(y / x) / Math.log(2), unit);\n };\n \n exports.IMPOWER = function(inumber, number) {\n number = utils.parseNumber(number);\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n if (utils.anyIsError(number, x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Calculate power of modulus\n var p = Math.pow(exports.IMABS(inumber), number);\n \n // Calculate argument\n var t = exports.IMARGUMENT(inumber);\n \n // Return exponential of complex number\n return exports.COMPLEX(p * Math.cos(number * t), p * Math.sin(number * t), unit);\n };\n \n exports.IMPRODUCT = function() {\n // Initialize result\n var result = arguments[0];\n \n // Loop on all numbers\n for (var i = 1; i < arguments.length; i++) {\n // Lookup coefficients of two complex numbers\n var a = exports.IMREAL(result);\n var b = exports.IMAGINARY(result);\n var c = exports.IMREAL(arguments[i]);\n var d = exports.IMAGINARY(arguments[i]);\n \n if (utils.anyIsError(a, b, c, d)) {\n return error.value;\n }\n \n // Complute product of two complex numbers\n result = exports.COMPLEX(a * c - b * d, a * d + b * c);\n }\n \n // Return product of complex numbers\n return result;\n };\n \n exports.IMREAL = function(inumber) {\n if (inumber === undefined || inumber === true || inumber === false) {\n return error.value;\n }\n \n // Return 0 if inumber is equal to 0\n if (inumber === 0 || inumber === '0') {\n return 0;\n }\n \n // Handle special cases\n if (['i', '+i', '1i', '+1i', '-i', '-1i', 'j', '+j', '1j', '+1j', '-j', '-1j'].indexOf(inumber) >= 0) {\n return 0;\n }\n \n // Lookup sign\n var plus = inumber.indexOf('+');\n var minus = inumber.indexOf('-');\n if (plus === 0) {\n plus = inumber.indexOf('+', 1);\n }\n if (minus === 0) {\n minus = inumber.indexOf('-', 1);\n }\n \n // Lookup imaginary unit\n var last = inumber.substring(inumber.length - 1, inumber.length);\n var unit = (last === 'i' || last === 'j');\n \n if (plus >= 0 || minus >= 0) {\n // Return error if imaginary unit is neither i nor j\n if (!unit) {\n return error.num;\n }\n \n // Return real coefficient of complex number\n if (plus >= 0) {\n return (isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))) ?\n error.num :\n Number(inumber.substring(0, plus));\n } else {\n return (isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))) ?\n error.num :\n Number(inumber.substring(0, minus));\n }\n } else {\n if (unit) {\n return (isNaN(inumber.substring(0, inumber.length - 1))) ? error.num : 0;\n } else {\n return (isNaN(inumber)) ? error.num : inumber;\n }\n }\n };\n \n exports.IMSEC = function(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value;\n }\n \n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Return secant of complex number\n return exports.IMDIV('1', exports.IMCOS(inumber));\n };\n \n exports.IMSECH = function(inumber) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Return hyperbolic secant of complex number\n return exports.IMDIV('1', exports.IMCOSH(inumber));\n };\n \n exports.IMSIN = function(inumber) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Return sine of complex number\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);\n };\n \n exports.IMSINH = function(inumber) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Return hyperbolic sine of complex number\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);\n };\n \n exports.IMSQRT = function(inumber) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit = inumber.substring(inumber.length - 1);\n unit = (unit === 'i' || unit === 'j') ? unit : 'i';\n \n // Calculate power of modulus\n var s = Math.sqrt(exports.IMABS(inumber));\n \n // Calculate argument\n var t = exports.IMARGUMENT(inumber);\n \n // Return exponential of complex number\n return exports.COMPLEX(s * Math.cos(t / 2), s * Math.sin(t / 2), unit);\n };\n \n exports.IMCSC = function (inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value;\n }\n \n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.num;\n }\n \n // Return cosecant of complex number\n return exports.IMDIV('1', exports.IMSIN(inumber));\n };\n \n exports.IMCSCH = function (inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value;\n }\n \n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.num;\n }\n \n // Return hyperbolic cosecant of complex number\n return exports.IMDIV('1', exports.IMSINH(inumber));\n };\n \n exports.IMSUB = function(inumber1, inumber2) {\n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var a = this.IMREAL(inumber1);\n var b = this.IMAGINARY(inumber1);\n var c = this.IMREAL(inumber2);\n var d = this.IMAGINARY(inumber2);\n \n if (utils.anyIsError(a, b, c, d)) {\n return error.value;\n }\n \n // Lookup imaginary unit\n var unit1 = inumber1.substring(inumber1.length - 1);\n var unit2 = inumber2.substring(inumber2.length - 1);\n var unit = 'i';\n if (unit1 === 'j') {\n unit = 'j';\n } else if (unit2 === 'j') {\n unit = 'j';\n }\n \n // Return _ of two complex numbers\n return this.COMPLEX(a - c, b - d, unit);\n };\n \n exports.IMSUM = function() {\n var args = utils.flatten(arguments);\n \n // Initialize result\n var result = args[0];\n \n // Loop on all numbers\n for (var i = 1; i < args.length; i++) {\n // Lookup coefficients of two complex numbers\n var a = this.IMREAL(result);\n var b = this.IMAGINARY(result);\n var c = this.IMREAL(args[i]);\n var d = this.IMAGINARY(args[i]);\n \n if (utils.anyIsError(a, b, c, d)) {\n return error.value;\n }\n \n // Complute product of two complex numbers\n result = this.COMPLEX(a + c, b + d);\n }\n \n // Return sum of complex numbers\n return result;\n };\n \n exports.IMTAN = function(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value;\n }\n \n // Lookup real and imaginary coefficients using Formula.js\n // [http://formulajs.org]\n var x = exports.IMREAL(inumber);\n var y = exports.IMAGINARY(inumber);\n \n if (utils.anyIsError(x, y)) {\n return error.value;\n }\n \n // Return tangent of complex number\n return this.IMDIV(this.IMSIN(inumber), this.IMCOS(inumber));\n };\n \n exports.OCT2BIN = function(number, places) {\n // Return error if number is not hexadecimal or contains more than ten\n // characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return error.num;\n }\n \n // Check if number is negative\n var negative = (number.length === 10 && number.substring(0, 1) === '7') ? true : false;\n \n // Convert octal number to decimal\n var decimal = (negative) ? parseInt(number, 8) - 1073741824 : parseInt(number, 8);\n \n // Return error if number is lower than -512 or greater than 511\n if (decimal < -512 || decimal > 511) {\n return error.num;\n }\n \n // Ignore places and return a 10-character binary number if number is\n // negative\n if (negative) {\n return '1' + REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2);\n }\n \n // Convert decimal number to binary\n var result = decimal.toString(2);\n \n // Return binary number using the minimum number of characters necessary\n // if places is undefined\n if (typeof places === 'undefined') {\n return result;\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value;\n }\n \n // Return error if places is negative\n if (places < 0) {\n return error.num;\n }\n \n // Truncate places in case it is not an integer\n places = Math.floor(places);\n \n // Pad return value with leading 0s (zeros) if necessary (using\n // Underscore.string)\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\n }\n };\n \n exports.OCT2DEC = function(number) {\n // Return error if number is not octal or contains more than ten\n // characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return error.num;\n }\n \n // Convert octal number to decimal\n var decimal = parseInt(number, 8);\n \n // Return decimal number\n return (decimal >= 536870912) ? decimal - 1073741824 : decimal;\n };\n \n exports.OCT2HEX = function(number, places) {\n // Return error if number is not octal or contains more than ten\n // characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return error.num;\n }\n \n // Convert octal number to decimal\n var decimal = parseInt(number, 8);\n \n // Ignore places and return a 10-character octal number if number is\n // negative\n if (decimal >= 536870912) {\n return 'ff' + (decimal + 3221225472).toString(16);\n }\n \n // Convert decimal number to hexadecimal\n var result = decimal.toString(16);\n \n // Return hexadecimal number using the minimum number of characters\n // necessary if places is undefined\n if (places === undefined) {\n return result;\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value;\n }\n \n // Return error if places is negative\n if (places < 0) {\n return error.num;\n }\n \n // Truncate places in case it is not an integer\n places = Math.floor(places);\n \n // Pad return value with leading 0s (zeros) if necessary (using\n // Underscore.string)\n return (places >= result.length) ? REPT('0', places - result.length) + result : error.num;\n }\n };\n \n return exports;\n })();\n \n jexcel.methods.financial = (function() {\n var exports = {};\n \n function validDate(d) {\n return d && d.getTime && !isNaN(d.getTime());\n }\n \n function ensureDate(d) {\n return (d instanceof Date)?d:new Date(d);\n }\n \n exports.ACCRINT = function(issue, first, settlement, rate, par, frequency, basis) {\n // Return error if either date is invalid\n issue = ensureDate(issue);\n first = ensureDate(first);\n settlement = ensureDate(settlement);\n if (!validDate(issue) || !validDate(first) || !validDate(settlement)) {\n return '#VALUE!';\n }\n \n // Return error if either rate or par are lower than or equal to zero\n if (rate <= 0 || par <= 0) {\n return '#NUM!';\n }\n \n // Return error if frequency is neither 1, 2, or 4\n if ([1, 2, 4].indexOf(frequency) === -1) {\n return '#NUM!';\n }\n \n // Return error if basis is neither 0, 1, 2, 3, or 4\n if ([0, 1, 2, 3, 4].indexOf(basis) === -1) {\n return '#NUM!';\n }\n \n // Return error if settlement is before or equal to issue\n if (settlement <= issue) {\n return '#NUM!';\n }\n \n // Set default values\n par = par || 0;\n basis = basis || 0;\n \n // Compute accrued interest\n return par * rate * YEARFRAC(issue, settlement, basis);\n };\n \n exports.ACCRINTM = null;\n \n exports.AMORDEGRC = null;\n \n exports.AMORLINC = null;\n \n exports.COUPDAYBS = null;\n \n exports.COUPDAYS = null;\n \n exports.COUPDAYSNC = null;\n \n exports.COUPNCD = null;\n \n exports.COUPNUM = null;\n \n exports.COUPPCD = null;\n \n exports.CUMIPMT = function(rate, periods, value, start, end, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n // Credits: Hannes Stiebitzhofer for the translations of function and\n // variable names\n // Requires exports.FV() and exports.PMT() from exports.js\n // [http://stoic.com/exports/]\n \n rate = utils.parseNumber(rate);\n periods = utils.parseNumber(periods);\n value = utils.parseNumber(value);\n if (utils.anyIsError(rate, periods, value)) {\n return error.value;\n }\n \n // Return error if either rate, periods, or value are lower than or\n // equal to zero\n if (rate <= 0 || periods <= 0 || value <= 0) {\n return error.num;\n }\n \n // Return error if start < 1, end < 1, or start > end\n if (start < 1 || end < 1 || start > end) {\n return error.num;\n }\n \n // Return error if type is neither 0 nor 1\n if (type !== 0 && type !== 1) {\n return error.num;\n }\n \n // Compute cumulative interest\n var payment = exports.PMT(rate, periods, value, 0, type);\n var interest = 0;\n \n if (start === 1) {\n if (type === 0) {\n interest = -value;\n start++;\n }\n }\n \n for (var i = start; i <= end; i++) {\n if (type === 1) {\n interest += exports.FV(rate, i - 2, payment, value, 1) - payment;\n } else {\n interest += exports.FV(rate, i - 1, payment, value, 0);\n }\n }\n interest *= rate;\n \n // Return cumulative interest\n return interest;\n };\n \n exports.CUMPRINC = function(rate, periods, value, start, end, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n // Credits: Hannes Stiebitzhofer for the translations of function and\n // variable names\n \n rate = utils.parseNumber(rate);\n periods = utils.parseNumber(periods);\n value = utils.parseNumber(value);\n if (utils.anyIsError(rate, periods, value)) {\n return error.value;\n }\n \n // Return error if either rate, periods, or value are lower than or\n // equal to zero\n if (rate <= 0 || periods <= 0 || value <= 0) {\n return error.num;\n }\n \n // Return error if start < 1, end < 1, or start > end\n if (start < 1 || end < 1 || start > end) {\n return error.num;\n }\n \n // Return error if type is neither 0 nor 1\n if (type !== 0 && type !== 1) {\n return error.num;\n }\n \n // Compute cumulative principal\n var payment = exports.PMT(rate, periods, value, 0, type);\n var principal = 0;\n if (start === 1) {\n if (type === 0) {\n principal = payment + value * rate;\n } else {\n principal = payment;\n }\n start++;\n }\n for (var i = start; i <= end; i++) {\n if (type > 0) {\n principal += payment - (exports.FV(rate, i - 2, payment, value, 1) - payment) * rate;\n } else {\n principal += payment - exports.FV(rate, i - 1, payment, value, 0) * rate;\n }\n }\n \n // Return cumulative principal\n return principal;\n };\n \n exports.DB = function(cost, salvage, life, period, month) {\n // Initialize month\n month = (month === undefined) ? 12 : month;\n \n cost = utils.parseNumber(cost);\n salvage = utils.parseNumber(salvage);\n life = utils.parseNumber(life);\n period = utils.parseNumber(period);\n month = utils.parseNumber(month);\n if (utils.anyIsError(cost, salvage, life, period, month)) {\n return error.value;\n }\n \n // Return error if any of the parameters is negative\n if (cost < 0 || salvage < 0 || life < 0 || period < 0) {\n return error.num;\n }\n \n // Return error if month is not an integer between 1 and 12\n if ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].indexOf(month) === -1) {\n return error.num;\n }\n \n // Return error if period is greater than life\n if (period > life) {\n return error.num;\n }\n \n // Return 0 (zero) if salvage is greater than or equal to cost\n if (salvage >= cost) {\n return 0;\n }\n \n // Rate is rounded to three decimals places\n var rate = (1 - Math.pow(salvage / cost, 1 / life)).toFixed(3);\n \n // Compute initial depreciation\n var initial = cost * rate * month / 12;\n \n // Compute total depreciation\n var total = initial;\n var current = 0;\n var ceiling = (period === life) ? life - 1 : period;\n for (var i = 2; i <= ceiling; i++) {\n current = (cost - total) * rate;\n total += current;\n }\n \n // Depreciation for the first and last periods are special cases\n if (period === 1) {\n // First period\n return initial;\n } else if (period === life) {\n // Last period\n return (cost - total) * rate;\n } else {\n return current;\n }\n };\n \n exports.DDB = function(cost, salvage, life, period, factor) {\n // Initialize factor\n factor = (factor === undefined) ? 2 : factor;\n \n cost = utils.parseNumber(cost);\n salvage = utils.parseNumber(salvage);\n life = utils.parseNumber(life);\n period = utils.parseNumber(period);\n factor = utils.parseNumber(factor);\n if (utils.anyIsError(cost, salvage, life, period, factor)) {\n return error.value;\n }\n \n // Return error if any of the parameters is negative or if factor is\n // null\n if (cost < 0 || salvage < 0 || life < 0 || period < 0 || factor <= 0) {\n return error.num;\n }\n \n // Return error if period is greater than life\n if (period > life) {\n return error.num;\n }\n \n // Return 0 (zero) if salvage is greater than or equal to cost\n if (salvage >= cost) {\n return 0;\n }\n \n // Compute depreciation\n var total = 0;\n var current = 0;\n for (var i = 1; i <= period; i++) {\n current = Math.min((cost - total) * (factor / life), (cost - salvage - total));\n total += current;\n }\n \n // Return depreciation\n return current;\n };\n \n exports.DISC = null;\n \n exports.DOLLARDE = function(dollar, fraction) {\n // Credits: algorithm inspired by Apache OpenOffice\n \n dollar = utils.parseNumber(dollar);\n fraction = utils.parseNumber(fraction);\n if (utils.anyIsError(dollar, fraction)) {\n return error.value;\n }\n \n // Return error if fraction is negative\n if (fraction < 0) {\n return error.num;\n }\n \n // Return error if fraction is greater than or equal to 0 and less than\n // 1\n if (fraction >= 0 && fraction < 1) {\n return error.div0;\n }\n \n // Truncate fraction if it is not an integer\n fraction = parseInt(fraction, 10);\n \n // Compute integer part\n var result = parseInt(dollar, 10);\n \n // Add decimal part\n result += (dollar % 1) * Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN10)) / fraction;\n \n // Round result\n var power = Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN2) + 1);\n result = Math.round(result * power) / power;\n \n // Return converted dollar price\n return result;\n };\n \n exports.DOLLARFR = function(dollar, fraction) {\n // Credits: algorithm inspired by Apache OpenOffice\n \n dollar = utils.parseNumber(dollar);\n fraction = utils.parseNumber(fraction);\n if (utils.anyIsError(dollar, fraction)) {\n return error.value;\n }\n \n // Return error if fraction is negative\n if (fraction < 0) {\n return error.num;\n }\n \n // Return error if fraction is greater than or equal to 0 and less than\n // 1\n if (fraction >= 0 && fraction < 1) {\n return error.div0;\n }\n \n // Truncate fraction if it is not an integer\n fraction = parseInt(fraction, 10);\n \n // Compute integer part\n var result = parseInt(dollar, 10);\n \n // Add decimal part\n result += (dollar % 1) * Math.pow(10, -Math.ceil(Math.log(fraction) / Math.LN10)) * fraction;\n \n // Return converted dollar price\n return result;\n };\n \n exports.DURATION = null;\n \n exports.EFFECT = function(rate, periods) {\n rate = utils.parseNumber(rate);\n periods = utils.parseNumber(periods);\n if (utils.anyIsError(rate, periods)) {\n return error.value;\n }\n \n // Return error if rate <=0 or periods < 1\n if (rate <= 0 || periods < 1) {\n return error.num;\n }\n \n // Truncate periods if it is not an integer\n periods = parseInt(periods, 10);\n \n // Return effective annual interest rate\n return Math.pow(1 + rate / periods, periods) - 1;\n };\n \n exports.FV = function(rate, periods, payment, value, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n \n value = value || 0;\n type = type || 0;\n \n rate = utils.parseNumber(rate);\n periods = utils.parseNumber(periods);\n payment = utils.parseNumber(payment);\n value = utils.parseNumber(value);\n type = utils.parseNumber(type);\n if (utils.anyIsError(rate, periods, payment, value, type)) {\n return error.value;\n }\n \n // Return future value\n var result;\n if (rate === 0) {\n result = value + payment * periods;\n } else {\n var term = Math.pow(1 + rate, periods);\n if (type === 1) {\n result = value * term + payment * (1 + rate) * (term - 1) / rate;\n } else {\n result = value * term + payment * (term - 1) / rate;\n }\n }\n return -result;\n };\n \n exports.FVSCHEDULE = function(principal, schedule) {\n principal = utils.parseNumber(principal);\n schedule = utils.parseNumberArray(utils.flatten(schedule));\n if (utils.anyIsError(principal, schedule)) {\n return error.value;\n }\n \n var n = schedule.length;\n var future = principal;\n \n // Apply all interests in schedule\n for (var i = 0; i < n; i++) {\n // Apply scheduled interest\n future *= 1 + schedule[i];\n }\n \n // Return future value\n return future;\n };\n \n exports.INTRATE = null;\n \n exports.IPMT = function(rate, period, periods, present, future, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n \n future = future || 0;\n type = type || 0;\n \n rate = utils.parseNumber(rate);\n period = utils.parseNumber(period);\n periods = utils.parseNumber(periods);\n present = utils.parseNumber(present);\n future = utils.parseNumber(future);\n type = utils.parseNumber(type);\n if (utils.anyIsError(rate, period, periods, present, future, type)) {\n return error.value;\n }\n \n // Compute payment\n var payment = exports.PMT(rate, periods, present, future, type);\n \n // Compute interest\n var interest;\n if (period === 1) {\n if (type === 1) {\n interest = 0;\n } else {\n interest = -present;\n }\n } else {\n if (type === 1) {\n interest = exports.FV(rate, period - 2, payment, present, 1) - payment;\n } else {\n interest = exports.FV(rate, period - 1, payment, present, 0);\n }\n }\n \n // Return interest\n return interest * rate;\n };\n \n exports.IRR = function(values, guess) {\n // Credits: algorithm inspired by Apache OpenOffice\n \n guess = guess || 0;\n \n values = utils.parseNumberArray(utils.flatten(values));\n guess = utils.parseNumber(guess);\n if (utils.anyIsError(values, guess)) {\n return error.value;\n }\n \n // Calculates the resulting amount\n var irrResult = function(values, dates, rate) {\n var r = rate + 1;\n var result = values[0];\n for (var i = 1; i < values.length; i++) {\n result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);\n }\n return result;\n };\n \n // Calculates the first derivation\n var irrResultDeriv = function(values, dates, rate) {\n var r = rate + 1;\n var result = 0;\n for (var i = 1; i < values.length; i++) {\n var frac = (dates[i] - dates[0]) / 365;\n result -= frac * values[i] / Math.pow(r, frac + 1);\n }\n return result;\n };\n \n // Initialize dates and check that values contains at least one positive\n // value and one negative value\n var dates = [];\n var positive = false;\n var negative = false;\n for (var i = 0; i < values.length; i++) {\n dates[i] = (i === 0) ? 0 : dates[i - 1] + 365;\n if (values[i] > 0) {\n positive = true;\n }\n if (values[i] < 0) {\n negative = true;\n }\n }\n \n // Return error if values does not contain at least one positive value\n // and one negative value\n if (!positive || !negative) {\n return error.num;\n }\n \n // Initialize guess and resultRate\n guess = (guess === undefined) ? 0.1 : guess;\n var resultRate = guess;\n \n // Set maximum epsilon for end of iteration\n var epsMax = 1e-10;\n \n // Implement Newton's method\n var newRate, epsRate, resultValue;\n var contLoop = true;\n do {\n resultValue = irrResult(values, dates, resultRate);\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\n epsRate = Math.abs(newRate - resultRate);\n resultRate = newRate;\n contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);\n } while (contLoop);\n \n // Return internal rate of return\n return resultRate;\n };\n \n exports.ISPMT = function(rate, period, periods, value) {\n rate = utils.parseNumber(rate);\n period = utils.parseNumber(period);\n periods = utils.parseNumber(periods);\n value = utils.parseNumber(value);\n if (utils.anyIsError(rate, period, periods, value)) {\n return error.value;\n }\n \n // Return interest\n return value * rate * (period / periods - 1);\n };\n \n exports.MDURATION = null;\n \n exports.MIRR = function(values, finance_rate, reinvest_rate) {\n values = utils.parseNumberArray(utils.flatten(values));\n finance_rate = utils.parseNumber(finance_rate);\n reinvest_rate = utils.parseNumber(reinvest_rate);\n if (utils.anyIsError(values, finance_rate, reinvest_rate)) {\n return error.value;\n }\n \n // Initialize number of values\n var n = values.length;\n \n // Lookup payments (negative values) and incomes (positive values)\n var payments = [];\n var incomes = [];\n for (var i = 0; i < n; i++) {\n if (values[i] < 0) {\n payments.push(values[i]);\n } else {\n incomes.push(values[i]);\n }\n }\n \n // Return modified internal rate of return\n var num = -exports.NPV(reinvest_rate, incomes) * Math.pow(1 + reinvest_rate, n - 1);\n var den = exports.NPV(finance_rate, payments) * (1 + finance_rate);\n return Math.pow(num / den, 1 / (n - 1)) - 1;\n };\n \n exports.NOMINAL = function(rate, periods) {\n rate = utils.parseNumber(rate);\n periods = utils.parseNumber(periods);\n if (utils.anyIsError(rate, periods)) {\n return error.value;\n }\n \n // Return error if rate <=0 or periods < 1\n if (rate <= 0 || periods < 1) {\n return error.num;\n }\n \n // Truncate periods if it is not an integer\n periods = parseInt(periods, 10);\n \n // Return nominal annual interest rate\n return (Math.pow(rate + 1, 1 / periods) - 1) * periods;\n };\n \n exports.NPER = function(rate, payment, present, future, type) {\n type = (type === undefined) ? 0 : type;\n future = (future === undefined) ? 0 : future;\n \n rate = utils.parseNumber(rate);\n payment = utils.parseNumber(payment);\n present = utils.parseNumber(present);\n future = utils.parseNumber(future);\n type = utils.parseNumber(type);\n if (utils.anyIsError(rate, payment, present, future, type)) {\n return error.value;\n }\n \n // Return number of periods\n var num = payment * (1 + rate * type) - future * rate;\n var den = (present * rate + payment * (1 + rate * type));\n return Math.log(num / den) / Math.log(1 + rate);\n };\n \n exports.NPV = function() {\n var args = utils.parseNumberArray(utils.flatten(arguments));\n if (args instanceof Error) {\n return args;\n }\n \n // Lookup rate\n var rate = args[0];\n \n // Initialize net present value\n var value = 0;\n \n // Loop on all values\n for (var j = 1; j < args.length; j++) {\n value += args[j] / Math.pow(1 + rate, j);\n }\n \n // Return net present value\n return value;\n };\n \n exports.ODDFPRICE = null;\n \n exports.ODDFYIELD = null;\n \n exports.ODDLPRICE = null;\n \n exports.ODDLYIELD = null;\n \n exports.PDURATION = function(rate, present, future) {\n rate = utils.parseNumber(rate);\n present = utils.parseNumber(present);\n future = utils.parseNumber(future);\n if (utils.anyIsError(rate, present, future)) {\n return error.value;\n }\n \n // Return error if rate <=0\n if (rate <= 0) {\n return error.num;\n }\n \n // Return number of periods\n return (Math.log(future) - Math.log(present)) / Math.log(1 + rate);\n };\n \n exports.PMT = function(rate, periods, present, future, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n \n future = future || 0;\n type = type || 0;\n \n rate = utils.parseNumber(rate);\n periods = utils.parseNumber(periods);\n present = utils.parseNumber(present);\n future = utils.parseNumber(future);\n type = utils.parseNumber(type);\n if (utils.anyIsError(rate, periods, present, future, type)) {\n return error.value;\n }\n \n // Return payment\n var result;\n if (rate === 0) {\n result = (present + future) / periods;\n } else {\n var term = Math.pow(1 + rate, periods);\n if (type === 1) {\n result = (future * rate / (term - 1) + present * rate / (1 - 1 / term)) / (1 + rate);\n } else {\n result = future * rate / (term - 1) + present * rate / (1 - 1 / term);\n }\n }\n return -result;\n };\n \n exports.PPMT = function(rate, period, periods, present, future, type) {\n future = future || 0;\n type = type || 0;\n \n rate = utils.parseNumber(rate);\n periods = utils.parseNumber(periods);\n present = utils.parseNumber(present);\n future = utils.parseNumber(future);\n type = utils.parseNumber(type);\n if (utils.anyIsError(rate, periods, present, future, type)) {\n return error.value;\n }\n \n return exports.PMT(rate, periods, present, future, type) - exports.IPMT(rate, period, periods, present, future, type);\n };\n \n exports.PRICE = null;\n \n exports.PRICEDISC = null;\n \n exports.PRICEMAT = null;\n \n exports.PV = function(rate, periods, payment, future, type) {\n future = future || 0;\n type = type || 0;\n \n rate = utils.parseNumber(rate);\n periods = utils.parseNumber(periods);\n payment = utils.parseNumber(payment);\n future = utils.parseNumber(future);\n type = utils.parseNumber(type);\n if (utils.anyIsError(rate, periods, payment, future, type)) {\n return error.value;\n }\n \n // Return present value\n if (rate === 0) {\n return -payment * periods - future;\n } else {\n return (((1 - Math.pow(1 + rate, periods)) / rate) * payment * (1 + rate * type) - future) / Math.pow(1 + rate, periods);\n }\n };\n \n exports.RATE = function(periods, payment, present, future, type, guess) {\n // Credits: rabugento\n \n guess = (guess === undefined) ? 0.01 : guess;\n future = (future === undefined) ? 0 : future;\n type = (type === undefined) ? 0 : type;\n \n periods = utils.parseNumber(periods);\n payment = utils.parseNumber(payment);\n present = utils.parseNumber(present);\n future = utils.parseNumber(future);\n type = utils.parseNumber(type);\n guess = utils.parseNumber(guess);\n if (utils.anyIsError(periods, payment, present, future, type, guess)) {\n return error.value;\n }\n \n // Set maximum epsilon for end of iteration\n var epsMax = 1e-6;\n \n // Set maximum number of iterations\n var iterMax = 100;\n var iter = 0;\n var close = false;\n var rate = guess;\n \n while (iter < iterMax && !close) {\n var t1 = Math.pow(rate + 1, periods);\n var t2 = Math.pow(rate + 1, periods - 1);\n \n var f1 = future + t1 * present + payment * (t1 - 1) * (rate * type + 1) / rate;\n var f2 = periods * t2 * present - payment * (t1 - 1) *(rate * type + 1) / Math.pow(rate,2);\n var f3 = periods * payment * t2 * (rate * type + 1) / rate + payment * (t1 - 1) * type / rate;\n \n var newRate = rate - f1 / (f2 + f3);\n \n if (Math.abs(newRate - rate) < epsMax) close = true;\n iter++\n rate = newRate;\n }\n \n if (!close) return Number.NaN + rate;\n return rate;\n };\n \n // TODO\n exports.RECEIVED = null;\n \n exports.RRI = function(periods, present, future) {\n periods = utils.parseNumber(periods);\n present = utils.parseNumber(present);\n future = utils.parseNumber(future);\n if (utils.anyIsError(periods, present, future)) {\n return error.value;\n }\n \n // Return error if periods or present is equal to 0 (zero)\n if (periods === 0 || present === 0) {\n return error.num;\n }\n \n // Return equivalent interest rate\n return Math.pow(future / present, 1 / periods) - 1;\n };\n \n exports.SLN = function(cost, salvage, life) {\n cost = utils.parseNumber(cost);\n salvage = utils.parseNumber(salvage);\n life = utils.parseNumber(life);\n if (utils.anyIsError(cost, salvage, life)) {\n return error.value;\n }\n \n // Return error if life equal to 0 (zero)\n if (life === 0) {\n return error.num;\n }\n \n // Return straight-line depreciation\n return (cost - salvage) / life;\n };\n \n exports.SYD = function(cost, salvage, life, period) {\n // Return error if any of the parameters is not a number\n cost = utils.parseNumber(cost);\n salvage = utils.parseNumber(salvage);\n life = utils.parseNumber(life);\n period = utils.parseNumber(period);\n if (utils.anyIsError(cost, salvage, life, period)) {\n return error.value;\n }\n \n // Return error if life equal to 0 (zero)\n if (life === 0) {\n return error.num;\n }\n \n // Return error if period is lower than 1 or greater than life\n if (period < 1 || period > life) {\n return error.num;\n }\n \n // Truncate period if it is not an integer\n period = parseInt(period, 10);\n \n // Return straight-line depreciation\n return ((cost - salvage) * (life - period + 1) * 2) / (life * (life + 1));\n };\n \n exports.TBILLEQ = function(settlement, maturity, discount) {\n settlement = utils.parseDate(settlement);\n maturity = utils.parseDate(maturity);\n discount = utils.parseNumber(discount);\n if (utils.anyIsError(settlement, maturity, discount)) {\n return error.value;\n }\n \n // Return error if discount is lower than or equal to zero\n if (discount <= 0) {\n return error.num;\n }\n \n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return error.num;\n }\n \n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return error.num;\n }\n \n // Return bond-equivalent yield\n return (365 * discount) / (360 - discount * DAYS360(settlement, maturity, false));\n };\n \n exports.TBILLPRICE = function(settlement, maturity, discount) {\n settlement = utils.parseDate(settlement);\n maturity = utils.parseDate(maturity);\n discount = utils.parseNumber(discount);\n if (utils.anyIsError(settlement, maturity, discount)) {\n return error.value;\n }\n \n // Return error if discount is lower than or equal to zero\n if (discount <= 0) {\n return error.num;\n }\n \n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return error.num;\n }\n \n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return error.num;\n }\n \n // Return bond-equivalent yield\n return 100 * (1 - discount * DAYS360(settlement, maturity, false) / 360);\n };\n \n exports.TBILLYIELD = function(settlement, maturity, price) {\n settlement = utils.parseDate(settlement);\n maturity = utils.parseDate(maturity);\n price = utils.parseNumber(price);\n if (utils.anyIsError(settlement, maturity, price)) {\n return error.value;\n }\n \n // Return error if price is lower than or equal to zero\n if (price <= 0) {\n return error.num;\n }\n \n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return error.num;\n }\n \n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return error.num;\n }\n \n // Return bond-equivalent yield\n return (100 - price) * 360 / (price * DAYS360(settlement, maturity, false));\n };\n \n exports.VDB = null;\n \n exports.XIRR = function(values, dates, guess) {\n // Credits: algorithm inspired by Apache OpenOffice\n \n values = utils.parseNumberArray(utils.flatten(values));\n dates = utils.parseDateArray(utils.flatten(dates));\n guess = utils.parseNumber(guess);\n if (utils.anyIsError(values, dates, guess)) {\n return error.value;\n }\n \n // Calculates the resulting amount\n var irrResult = function(values, dates, rate) {\n var r = rate + 1;\n var result = values[0];\n for (var i = 1; i < values.length; i++) {\n result += values[i] / Math.pow(r, DAYS(dates[i], dates[0]) / 365);\n }\n return result;\n };\n \n // Calculates the first derivation\n var irrResultDeriv = function(values, dates, rate) {\n var r = rate + 1;\n var result = 0;\n for (var i = 1; i < values.length; i++) {\n var frac = DAYS(dates[i], dates[0]) / 365;\n result -= frac * values[i] / Math.pow(r, frac + 1);\n }\n return result;\n };\n \n // Check that values contains at least one positive value and one\n // negative value\n var positive = false;\n var negative = false;\n for (var i = 0; i < values.length; i++) {\n if (values[i] > 0) {\n positive = true;\n }\n if (values[i] < 0) {\n negative = true;\n }\n }\n \n // Return error if values does not contain at least one positive value\n // and one negative value\n if (!positive || !negative) {\n return error.num;\n }\n \n // Initialize guess and resultRate\n guess = guess || 0.1;\n var resultRate = guess;\n \n // Set maximum epsilon for end of iteration\n var epsMax = 1e-10;\n \n // Implement Newton's method\n var newRate, epsRate, resultValue;\n var contLoop = true;\n do {\n resultValue = irrResult(values, dates, resultRate);\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\n epsRate = Math.abs(newRate - resultRate);\n resultRate = newRate;\n contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);\n } while (contLoop);\n \n // Return internal rate of return\n return resultRate;\n };\n \n exports.XNPV = function(rate, values, dates) {\n rate = utils.parseNumber(rate);\n values = utils.parseNumberArray(utils.flatten(values));\n dates = utils.parseDateArray(utils.flatten(dates));\n if (utils.anyIsError(rate, values, dates)) {\n return error.value;\n }\n \n var result = 0;\n for (var i = 0; i < values.length; i++) {\n result += values[i] / Math.pow(1 + rate, DAYS(dates[i], dates[0]) / 365);\n }\n return result;\n };\n \n exports.YIELD = null;\n \n exports.YIELDDISC = null;\n \n exports.YIELDMAT = null;\n \n return exports;\n })();\n \n jexcel.methods.information = (function() {\n var exports = {};\n exports.CELL = null;\n \n exports.ERROR = {};\n exports.ERROR.TYPE = function(error_val) {\n switch (error_val) {\n case error.nil: return 1;\n case error.div0: return 2;\n case error.value: return 3;\n case error.ref: return 4;\n case error.name: return 5;\n case error.num: return 6;\n case error.na: return 7;\n case error.data: return 8;\n }\n return error.na;\n };\n \n exports.INFO = null;\n \n exports.ISBLANK = function(value) {\n return value === null;\n };\n \n exports.ISBINARY = function (number) {\n return (/^[01]{1,10}$/).test(number);\n };\n \n exports.ISERR = function(value) {\n return ([error.value, error.ref, error.div0, error.num, error.name, error.nil]).indexOf(value) >= 0 ||\n (typeof value === 'number' && (isNaN(value) || !isFinite(value)));\n };\n \n exports.ISERROR = function(value) {\n return exports.ISERR(value) || value === error.na;\n };\n \n exports.ISEVEN = function(number) {\n return (Math.floor(Math.abs(number)) & 1) ? false : true;\n };\n \n // TODO\n exports.ISFORMULA = null;\n \n exports.ISLOGICAL = function(value) {\n return value === true || value === false;\n };\n \n exports.ISNA = function(value) {\n return value === error.na;\n };\n \n exports.ISNONTEXT = function(value) {\n return typeof(value) !== 'string';\n };\n \n exports.ISNUMBER = function(value) {\n return typeof(value) === 'number' && !isNaN(value) && isFinite(value);\n };\n \n exports.ISODD = function(number) {\n return (Math.floor(Math.abs(number)) & 1) ? true : false;\n };\n \n exports.ISREF = null;\n \n exports.ISTEXT = function(value) {\n return typeof(value) === 'string';\n };\n \n exports.N = function(value) {\n if (this.ISNUMBER(value)) {\n return value;\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n if (value === true) {\n return 1;\n }\n if (value === false) {\n return 0;\n }\n if (this.ISERROR(value)) {\n return value;\n }\n return 0;\n };\n \n exports.NA = function() {\n return error.na;\n };\n \n exports.SHEET = null;\n \n exports.SHEETS = null;\n \n exports.TYPE = function(value) {\n if (this.ISNUMBER(value)) {\n return 1;\n }\n if (this.ISTEXT(value)) {\n return 2;\n }\n if (this.ISLOGICAL(value)) {\n return 4;\n }\n if (this.ISERROR(value)) {\n return 16;\n }\n if (Array.isArray(value)) {\n return 64;\n }\n };\n \n return exports;\n })();\n \n jexcel.methods.logical = (function() {\n var exports = {};\n \n exports.AND = function() {\n var args = utils.flatten(arguments);\n var result = true;\n for (var i = 0; i < args.length; i++) {\n if (!args[i]) {\n result = false;\n }\n }\n return result;\n };\n \n exports.CHOOSE = function() {\n if (arguments.length < 2) {\n return error.na;\n }\n \n var index = arguments[0];\n if (index < 1 || index > 254) {\n return error.value;\n }\n \n if (arguments.length < index + 1) {\n return error.value;\n }\n \n return arguments[index];\n };\n \n exports.FALSE = function() {\n return false;\n };\n \n exports.IF = function(test, then_value, otherwise_value) {\n return test ? then_value : otherwise_value;\n };\n \n exports.IFERROR = function(value, valueIfError) {\n if (ISERROR(value)) {\n return valueIfError;\n }\n return value;\n };\n \n exports.IFNA = function(value, value_if_na) {\n return value === error.na ? value_if_na : value;\n };\n \n exports.NOT = function(logical) {\n return !logical;\n };\n \n exports.OR = function() {\n var args = utils.flatten(arguments);\n var result = false;\n for (var i = 0; i < args.length; i++) {\n if (args[i]) {\n result = true;\n }\n }\n return result;\n };\n \n exports.TRUE = function() {\n return true;\n };\n \n exports.XOR = function() {\n var args = utils.flatten(arguments);\n var result = 0;\n for (var i = 0; i < args.length; i++) {\n if (args[i]) {\n result++;\n }\n }\n return (Math.floor(Math.abs(result)) & 1) ? true : false;\n };\n \n exports.SWITCH = function() {\n var result;\n if (arguments.length > 0) {\n var targetValue = arguments[0];\n var argc = arguments.length - 1;\n var switchCount = Math.floor(argc / 2);\n var switchSatisfied = false;\n var defaultClause = argc % 2 === 0 ? null : arguments[arguments.length - 1];\n \n if (switchCount) {\n for (var index = 0; index < switchCount; index++) {\n if (targetValue === arguments[index * 2 + 1]) {\n result = arguments[index * 2 + 2];\n switchSatisfied = true;\n break;\n }\n }\n }\n \n if (!switchSatisfied && defaultClause) {\n result = defaultClause;\n }\n }\n \n return result;\n };\n \n return exports;\n })();\n \n jexcel.methods.math = (function() {\n var exports = {};\n \n exports.ABS = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.abs(utils.parseNumber(number));\n };\n \n exports.ACOS = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.acos(number);\n };\n \n exports.ACOSH = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.log(number + Math.sqrt(number * number - 1));\n };\n \n exports.ACOT = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.atan(1 / number);\n };\n \n exports.ACOTH = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return 0.5 * Math.log((number + 1) / (number - 1));\n };\n \n exports.AGGREGATE = null\n \n exports.ARABIC = function(text) {\n // Credits: Rafa? Kukawski\n if (!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(text)) {\n return error.value;\n }\n var r = 0;\n text.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g, function(i) {\n r += {\n M: 1000,\n CM: 900,\n D: 500,\n CD: 400,\n C: 100,\n XC: 90,\n L: 50,\n XL: 40,\n X: 10,\n IX: 9,\n V: 5,\n IV: 4,\n I: 1\n }[i];\n });\n return r;\n };\n \n exports.ASIN = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.asin(number);\n };\n \n exports.ASINH = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.log(number + Math.sqrt(number * number + 1));\n };\n \n exports.ATAN = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.atan(number);\n };\n \n exports.ATAN2 = function(number_x, number_y) {\n number_x = utils.parseNumber(number_x);\n number_y = utils.parseNumber(number_y);\n if (utils.anyIsError(number_x, number_y)) {\n return error.value;\n }\n return Math.atan2(number_x, number_y);\n };\n \n exports.ATANH = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.log((1 + number) / (1 - number)) / 2;\n };\n \n exports.BASE = function(number, radix, min_length) {\n min_length = min_length || 0;\n \n number = utils.parseNumber(number);\n radix = utils.parseNumber(radix);\n min_length = utils.parseNumber(min_length);\n if (utils.anyIsError(number, radix, min_length)) {\n return error.value;\n }\n min_length = (min_length === undefined) ? 0 : min_length;\n var result = number.toString(radix);\n return new Array(Math.max(min_length + 1 - result.length, 0)).join('0') + result;\n };\n \n exports.CEILING = function(number, significance, mode) {\n significance = (significance === undefined) ? 1 : significance;\n mode = (mode === undefined) ? 0 : mode;\n \n number = utils.parseNumber(number);\n significance = utils.parseNumber(significance);\n mode = utils.parseNumber(mode);\n if (utils.anyIsError(number, significance, mode)) {\n return error.value;\n }\n if (significance === 0) {\n return 0;\n }\n \n significance = Math.abs(significance);\n if (number >= 0) {\n return Math.ceil(number / significance) * significance;\n } else {\n if (mode === 0) {\n return -1 * Math.floor(Math.abs(number) / significance) * significance;\n } else {\n return -1 * Math.ceil(Math.abs(number) / significance) * significance;\n }\n }\n };\n \n exports.CEILING.MATH = exports.CEILING;\n \n exports.CEILING.PRECISE = exports.CEILING;\n \n exports.COMBIN = function(number, number_chosen) {\n number = utils.parseNumber(number);\n number_chosen = utils.parseNumber(number_chosen);\n if (utils.anyIsError(number, number_chosen)) {\n return error.value;\n }\n return exports.FACT(number) / (exports.FACT(number_chosen) * exports.FACT(number - number_chosen));\n };\n \n exports.COMBINA = function(number, number_chosen) {\n number = utils.parseNumber(number);\n number_chosen = utils.parseNumber(number_chosen);\n if (utils.anyIsError(number, number_chosen)) {\n return error.value;\n }\n return (number === 0 && number_chosen === 0) ? 1 : exports.COMBIN(number + number_chosen - 1, number - 1);\n };\n \n exports.COS = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.cos(number);\n };\n \n exports.COSH = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return (Math.exp(number) + Math.exp(-number)) / 2;\n };\n \n exports.COT = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return 1 / Math.tan(number);\n };\n \n exports.COTH = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n var e2 = Math.exp(2 * number);\n return (e2 + 1) / (e2 - 1);\n };\n \n exports.CSC = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return 1 / Math.sin(number);\n };\n \n exports.CSCH = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return 2 / (Math.exp(number) - Math.exp(-number));\n };\n \n exports.DECIMAL = function(number, radix) {\n if (arguments.length < 1) {\n return error.value;\n }\n \n \n return parseInt(number, radix);\n };\n \n exports.DEGREES = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return number * 180 / Math.PI;\n };\n \n exports.EVEN = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return exports.CEILING(number, -2, -1);\n };\n \n exports.EXP = Math.exp;\n \n var MEMOIZED_FACT = [];\n exports.FACT = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n var n = Math.floor(number);\n if (n === 0 || n === 1) {\n return 1;\n } else if (MEMOIZED_FACT[n] > 0) {\n return MEMOIZED_FACT[n];\n } else {\n MEMOIZED_FACT[n] = exports.FACT(n - 1) * n;\n return MEMOIZED_FACT[n];\n }\n };\n \n exports.FACTDOUBLE = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n var n = Math.floor(number);\n if (n <= 0) {\n return 1;\n } else {\n return n * exports.FACTDOUBLE(n - 2);\n }\n };\n \n exports.FLOOR = function(number, significance, mode) {\n significance = (significance === undefined) ? 1 : significance;\n mode = (mode === undefined) ? 0 : mode;\n \n number = utils.parseNumber(number);\n significance = utils.parseNumber(significance);\n mode = utils.parseNumber(mode);\n if (utils.anyIsError(number, significance, mode)) {\n return error.value;\n }\n if (significance === 0) {\n return 0;\n }\n \n significance = Math.abs(significance);\n if (number >= 0) {\n return Math.floor(number / significance) * significance;\n } else {\n if (mode === 0) {\n return -1 * Math.ceil(Math.abs(number) / significance) * significance;\n } else {\n return -1 * Math.floor(Math.abs(number) / significance) * significance;\n }\n }\n };\n \n exports.FLOOR.MATH = exports.FLOOR;\n \n exports.GCD = null;\n \n exports.INT = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.floor(number);\n };\n \n exports.LCM = function() {\n // Credits: Jonas Raoni Soares Silva\n var o = utils.parseNumberArray(utils.flatten(arguments));\n if (o instanceof Error) {\n return o;\n }\n for (var i, j, n, d, r = 1;\n (n = o.pop()) !== undefined;) {\n while (n > 1) {\n if (n % 2) {\n for (i = 3, j = Math.floor(Math.sqrt(n)); i <= j && n % i; i += 2) {\n //empty\n }\n d = (i <= j) ? i : n;\n } else {\n d = 2;\n }\n for (n /= d, r *= d, i = o.length; i;\n (o[--i] % d) === 0 && (o[i] /= d) === 1 && o.splice(i, 1)) {\n //empty\n }\n }\n }\n return r;\n };\n \n exports.LN = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.log(number);\n };\n \n exports.LOG = function(number, base) {\n number = utils.parseNumber(number);\n base = (base === undefined) ? 10 : utils.parseNumber(base);\n \n if (utils.anyIsError(number, base)) {\n return error.value;\n }\n \n return Math.log(number) / Math.log(base);\n };\n \n exports.LOG10 = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.log(number) / Math.log(10);\n };\n \n exports.MDETERM = null;\n \n exports.MINVERSE = null;\n \n exports.MMULT = null;\n \n exports.MOD = function(dividend, divisor) {\n dividend = utils.parseNumber(dividend);\n divisor = utils.parseNumber(divisor);\n if (utils.anyIsError(dividend, divisor)) {\n return error.value;\n }\n if (divisor === 0) {\n return error.div0;\n }\n var modulus = Math.abs(dividend % divisor);\n return (divisor > 0) ? modulus : -modulus;\n };\n \n exports.MROUND = function(number, multiple) {\n number = utils.parseNumber(number);\n multiple = utils.parseNumber(multiple);\n if (utils.anyIsError(number, multiple)) {\n return error.value;\n }\n if (number * multiple < 0) {\n return error.num;\n }\n \n return Math.round(number / multiple) * multiple;\n };\n \n exports.MULTINOMIAL = function() {\n var args = utils.parseNumberArray(utils.flatten(arguments));\n if (args instanceof Error) {\n return args;\n }\n var sum = 0;\n var divisor = 1;\n for (var i = 0; i < args.length; i++) {\n sum += args[i];\n divisor *= exports.FACT(args[i]);\n }\n return exports.FACT(sum) / divisor;\n };\n \n exports.MUNIT = null;\n \n exports.ODD = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n var temp = Math.ceil(Math.abs(number));\n temp = (temp & 1) ? temp : temp + 1;\n return (number > 0) ? temp : -temp;\n };\n \n exports.PI = function() {\n return Math.PI;\n };\n \n exports.POWER = function(number, power) {\n number = utils.parseNumber(number);\n power = utils.parseNumber(power);\n if (utils.anyIsError(number, power)) {\n return error.value;\n }\n var result = Math.pow(number, power);\n if (isNaN(result)) {\n return error.num;\n }\n \n return result;\n };\n \n exports.PRODUCT = function() {\n var args = utils.parseNumberArray(utils.flatten(arguments));\n if (args instanceof Error) {\n return args;\n }\n var result = 1;\n for (var i = 0; i < args.length; i++) {\n result *= args[i];\n }\n return result;\n };\n \n exports.QUOTIENT = function(numerator, denominator) {\n numerator = utils.parseNumber(numerator);\n denominator = utils.parseNumber(denominator);\n if (utils.anyIsError(numerator, denominator)) {\n return error.value;\n }\n return parseInt(numerator / denominator, 10);\n };\n \n exports.RADIANS = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return number * Math.PI / 180;\n };\n \n exports.RAND = function() {\n return Math.random();\n };\n \n exports.RANDBETWEEN = function(bottom, top) {\n bottom = utils.parseNumber(bottom);\n top = utils.parseNumber(top);\n if (utils.anyIsError(bottom, top)) {\n return error.value;\n }\n // Creative Commons Attribution 3.0 License\n // Copyright (c) 2012 eqcode\n return bottom + Math.ceil((top - bottom + 1) * Math.random()) - 1;\n };\n \n exports.ROMAN = null;\n \n exports.ROUND = function(number, digits) {\n number = utils.parseNumber(number);\n digits = utils.parseNumber(digits);\n if (utils.anyIsError(number, digits)) {\n return error.value;\n }\n return Math.round(number * Math.pow(10, digits)) / Math.pow(10, digits);\n };\n \n exports.ROUNDDOWN = function(number, digits) {\n number = utils.parseNumber(number);\n digits = utils.parseNumber(digits);\n if (utils.anyIsError(number, digits)) {\n return error.value;\n }\n var sign = (number > 0) ? 1 : -1;\n return sign * (Math.floor(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\n };\n \n exports.ROUNDUP = function(number, digits) {\n number = utils.parseNumber(number);\n digits = utils.parseNumber(digits);\n if (utils.anyIsError(number, digits)) {\n return error.value;\n }\n var sign = (number > 0) ? 1 : -1;\n return sign * (Math.ceil(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\n };\n \n exports.SEC = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return 1 / Math.cos(number);\n };\n \n exports.SECH = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return 2 / (Math.exp(number) + Math.exp(-number));\n };\n \n exports.SERIESSUM = function(x, n, m, coefficients) {\n x = utils.parseNumber(x);\n n = utils.parseNumber(n);\n m = utils.parseNumber(m);\n coefficients = utils.parseNumberArray(coefficients);\n if (utils.anyIsError(x, n, m, coefficients)) {\n return error.value;\n }\n var result = coefficients[0] * Math.pow(x, n);\n for (var i = 1; i < coefficients.length; i++) {\n result += coefficients[i] * Math.pow(x, n + i * m);\n }\n return result;\n };\n \n exports.SIGN = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n if (number < 0) {\n return -1;\n } else if (number === 0) {\n return 0;\n } else {\n return 1;\n }\n };\n \n exports.SIN = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.sin(number);\n };\n \n exports.SINH = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return (Math.exp(number) - Math.exp(-number)) / 2;\n };\n \n exports.SQRT = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n if (number < 0) {\n return error.num;\n }\n return Math.sqrt(number);\n };\n \n exports.SQRTPI = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.sqrt(number * Math.PI);\n };\n \n exports.SUBTOTAL = null;\n \n exports.ADD = function (num1, num2) {\n if (arguments.length !== 2) {\n return error.na;\n }\n \n num1 = utils.parseNumber(num1);\n num2 = utils.parseNumber(num2);\n if (utils.anyIsError(num1, num2)) {\n return error.value;\n }\n \n return num1 + num2;\n };\n \n exports.MINUS = function (num1, num2) {\n if (arguments.length !== 2) {\n return error.na;\n }\n \n num1 = utils.parseNumber(num1);\n num2 = utils.parseNumber(num2);\n if (utils.anyIsError(num1, num2)) {\n return error.value;\n }\n \n return num1 - num2;\n };\n \n exports.DIVIDE = function (dividend, divisor) {\n if (arguments.length !== 2) {\n return error.na;\n }\n \n dividend = utils.parseNumber(dividend);\n divisor = utils.parseNumber(divisor);\n if (utils.anyIsError(dividend, divisor)) {\n return error.value;\n }\n \n if (divisor === 0) {\n return error.div0;\n }\n \n return dividend / divisor;\n };\n \n exports.MULTIPLY = function (factor1, factor2) {\n if (arguments.length !== 2) {\n return error.na;\n }\n \n factor1 = utils.parseNumber(factor1);\n factor2 = utils.parseNumber(factor2);\n if (utils.anyIsError(factor1, factor2)) {\n return error.value;\n }\n \n return factor1 * factor2;\n };\n \n exports.GTE = function (num1, num2) {\n if (arguments.length !== 2) {\n return error.na;\n }\n \n num1 = utils.parseNumber(num1);\n num2 = utils.parseNumber(num2);\n if (utils.anyIsError(num1, num2)) {\n return error.error;\n }\n \n return num1 >= num2;\n };\n \n exports.LT = function (num1, num2) {\n if (arguments.length !== 2) {\n return error.na;\n }\n \n num1 = utils.parseNumber(num1);\n num2 = utils.parseNumber(num2);\n if (utils.anyIsError(num1, num2)) {\n return error.error;\n }\n \n return num1 < num2;\n };\n \n exports.LTE = function (num1, num2) {\n if (arguments.length !== 2) {\n return error.na;\n }\n \n num1 = utils.parseNumber(num1);\n num2 = utils.parseNumber(num2);\n if (utils.anyIsError(num1, num2)) {\n return error.error;\n }\n \n return num1 <= num2;\n };\n \n exports.EQ = function (value1, value2) {\n if (arguments.length !== 2) {\n return error.na;\n }\n \n return value1 === value2;\n };\n \n exports.NE = function (value1, value2) {\n if (arguments.length !== 2) {\n return error.na;\n }\n \n return value1 !== value2;\n };\n \n exports.POW = function (base, exponent) {\n if (arguments.length !== 2) {\n return error.na;\n }\n \n base = utils.parseNumber(base);\n exponent = utils.parseNumber(exponent);\n if (utils.anyIsError(base, exponent)) {\n return error.error;\n }\n \n return exports.POWER(base, exponent);\n };\n \n exports.SUM = function() {\n var result = 0;\n var argsKeys = Object.keys(arguments);\n for (var i = 0; i < argsKeys.length; ++i) {\n var elt = arguments[argsKeys[i]];\n if (typeof elt === 'number') {\n result += elt;\n } else if (typeof elt === 'string') {\n var parsed = parseFloat(elt);\n !isNaN(parsed) && (result += parsed);\n } else if (Array.isArray(elt)) {\n result += exports.SUM.apply(null, elt);\n }\n }\n return result;\n };\n \n exports.SUMIF = function(range, criteria) {\n range = utils.parseNumberArray(utils.flatten(range));\n if (range instanceof Error) {\n return range;\n }\n var result = 0;\n for (var i = 0; i < range.length; i++) {\n result += (eval(range[i] + criteria)) ? range[i] : 0; // jshint ignore:line\n }\n return result;\n };\n \n exports.SUMIFS = function() {\n var args = utils.argsToArray(arguments);\n var range = utils.parseNumberArray(utils.flatten(args.shift()));\n if (range instanceof Error) {\n return range;\n }\n var criteria = args;\n \n var n_range_elements = range.length;\n var n_criterias = criteria.length;\n \n var result = 0;\n for (var i = 0; i < n_range_elements; i++) {\n var el = range[i];\n var condition = '';\n for (var c = 0; c < n_criterias; c++) {\n condition += el + criteria[c];\n if (c !== n_criterias - 1) {\n condition += '&&';\n }\n }\n if (eval(condition)) { // jshint ignore:line\n result += el;\n }\n }\n return result;\n };\n \n exports.SUMPRODUCT = null;\n \n exports.SUMSQ = function() {\n var numbers = utils.parseNumberArray(utils.flatten(arguments));\n if (numbers instanceof Error) {\n return numbers;\n }\n var result = 0;\n var length = numbers.length;\n for (var i = 0; i < length; i++) {\n result += (ISNUMBER(numbers[i])) ? numbers[i] * numbers[i] : 0;\n }\n return result;\n };\n \n exports.SUMX2MY2 = function(array_x, array_y) {\n array_x = utils.parseNumberArray(utils.flatten(array_x));\n array_y = utils.parseNumberArray(utils.flatten(array_y));\n if (utils.anyIsError(array_x, array_y)) {\n return error.value;\n }\n var result = 0;\n for (var i = 0; i < array_x.length; i++) {\n result += array_x[i] * array_x[i] - array_y[i] * array_y[i];\n }\n return result;\n };\n \n exports.SUMX2PY2 = function(array_x, array_y) {\n array_x = utils.parseNumberArray(utils.flatten(array_x));\n array_y = utils.parseNumberArray(utils.flatten(array_y));\n if (utils.anyIsError(array_x, array_y)) {\n return error.value;\n }\n var result = 0;\n array_x = utils.parseNumberArray(utils.flatten(array_x));\n array_y = utils.parseNumberArray(utils.flatten(array_y));\n for (var i = 0; i < array_x.length; i++) {\n result += array_x[i] * array_x[i] + array_y[i] * array_y[i];\n }\n return result;\n };\n \n exports.SUMXMY2 = function(array_x, array_y) {\n array_x = utils.parseNumberArray(utils.flatten(array_x));\n array_y = utils.parseNumberArray(utils.flatten(array_y));\n if (utils.anyIsError(array_x, array_y)) {\n return error.value;\n }\n var result = 0;\n array_x = utils.flatten(array_x);\n array_y = utils.flatten(array_y);\n for (var i = 0; i < array_x.length; i++) {\n result += Math.pow(array_x[i] - array_y[i], 2);\n }\n return result;\n };\n \n exports.TAN = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return Math.tan(number);\n };\n \n exports.TANH = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n var e2 = Math.exp(2 * number);\n return (e2 - 1) / (e2 + 1);\n };\n \n exports.TRUNC = function(number, digits) {\n digits = (digits === undefined) ? 0 : digits;\n number = utils.parseNumber(number);\n digits = utils.parseNumber(digits);\n if (utils.anyIsError(number, digits)) {\n return error.value;\n }\n var sign = (number > 0) ? 1 : -1;\n return sign * (Math.floor(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\n };\n \n return exports;\n })();\n \n jexcel.methods.misc = (function() {\n var exports = {};\n \n exports.UNIQUE = function () {\n var result = [];\n for (var i = 0; i < arguments.length; ++i) {\n var hasElement = false;\n var element = arguments[i];\n \n // Check if we've already seen this element.\n for (var j = 0; j < result.length; ++j) {\n hasElement = result[j] === element;\n if (hasElement) { break; }\n }\n \n // If we did not find it, add it to the result.\n if (!hasElement) {\n result.push(element);\n }\n }\n return result;\n };\n \n exports.FLATTEN = utils.flatten;\n \n exports.ARGS2ARRAY = function () {\n return Array.prototype.slice.call(arguments, 0);\n };\n \n exports.REFERENCE = function (context, reference) {\n try {\n var path = reference.split('.');\n var result = context;\n for (var i = 0; i < path.length; ++i) {\n var step = path[i];\n if (step[step.length - 1] === ']') {\n var opening = step.indexOf('[');\n var index = step.substring(opening + 1, step.length - 1);\n result = result[step.substring(0, opening)][index];\n } else {\n result = result[step];\n }\n }\n return result;\n } catch (error) {}\n };\n \n exports.JOIN = function (array, separator) {\n return array.join(separator);\n };\n \n exports.NUMBERS = function () {\n var possibleNumbers = utils.flatten(arguments);\n return possibleNumbers.filter(function (el) {\n return typeof el === 'number';\n });\n };\n \n exports.NUMERAL = null;\n \n return exports;\n })();\n \n jexcel.methods.text = (function() {\n var exports = {};\n \n exports.ASC = null;\n \n exports.BAHTTEXT = null;\n \n exports.CHAR = function(number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return String.fromCharCode(number);\n };\n \n exports.CLEAN = function(text) {\n text = text || '';\n var re = /[\\0-\\x1F]/g;\n return text.replace(re, \"\");\n };\n \n exports.CODE = function(text) {\n text = text || '';\n return text.charCodeAt(0);\n };\n \n exports.CONCATENATE = function() {\n var args = utils.flatten(arguments);\n \n var trueFound = 0;\n while ((trueFound = args.indexOf(true)) > -1) {\n args[trueFound] = 'TRUE';\n }\n \n var falseFound = 0;\n while ((falseFound = args.indexOf(false)) > -1) {\n args[falseFound] = 'FALSE';\n }\n \n return args.join('');\n };\n \n exports.DBCS = null;\n \n exports.DOLLAR = null;\n \n exports.EXACT = function(text1, text2) {\n return text1 === text2;\n };\n \n exports.FIND = function(find_text, within_text, position) {\n position = (position === undefined) ? 0 : position;\n return within_text ? within_text.indexOf(find_text, position - 1) + 1 : null;\n };\n \n exports.FIXED = null;\n \n exports.HTML2TEXT = function (value) {\n var result = '';\n \n if (value) {\n if (value instanceof Array) {\n value.forEach(function (line) {\n if (result !== '') {\n result += '\\n';\n }\n result += (line.replace(/<(?:.|\\n)*?>/gm, ''));\n });\n } else {\n result = value.replace(/<(?:.|\\n)*?>/gm, '');\n }\n }\n \n return result;\n };\n \n exports.LEFT = function(text, number) {\n number = (number === undefined) ? 1 : number;\n number = utils.parseNumber(number);\n if (number instanceof Error || typeof text !== 'string') {\n return error.value;\n }\n return text ? text.substring(0, number) : null;\n };\n \n exports.LEN = function(text) {\n if (arguments.length === 0) {\n return error.error;\n }\n \n if (typeof text === 'string') {\n return text ? text.length : 0;\n }\n \n if (text.length) {\n return text.length;\n }\n \n return error.value;\n };\n \n exports.LOWER = function(text) {\n if (typeof text !== 'string') {\n return error.value;\n }\n return text ? text.toLowerCase() : text;\n };\n \n exports.MID = function(text, start, number) {\n start = utils.parseNumber(start);\n number = utils.parseNumber(number);\n if (utils.anyIsError(start, number) || typeof text !== 'string') {\n return number;\n }\n \n var begin = start - 1;\n var end = begin + number;\n \n return text.substring(begin, end);\n };\n \n exports.NUMBERVALUE = null;\n \n exports.PRONETIC = null;\n \n exports.PROPER = function(text) {\n if (text === undefined || text.length === 0) {\n return error.value;\n }\n if (text === true) {\n text = 'TRUE';\n }\n if (text === false) {\n text = 'FALSE';\n }\n if (isNaN(text) && typeof text === 'number') {\n return error.value;\n }\n if (typeof text === 'number') {\n text = '' + text;\n }\n \n return text.replace(/\\w\\S*/g, function(txt) {\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n });\n };\n \n exports.REGEXEXTRACT = function (text, regular_expression) {\n var match = text.match(new RegExp(regular_expression));\n return match ? (match[match.length > 1 ? match.length - 1 : 0]) : null;\n };\n \n exports.REGEXMATCH = function (text, regular_expression, full) {\n var match = text.match(new RegExp(regular_expression));\n return full ? match : !!match;\n };\n \n exports.REGEXREPLACE = function (text, regular_expression, replacement) {\n return text.replace(new RegExp(regular_expression), replacement);\n };\n \n exports.REPLACE = function(text, position, length, new_text) {\n position = utils.parseNumber(position);\n length = utils.parseNumber(length);\n if (utils.anyIsError(position, length) ||\n typeof text !== 'string' ||\n typeof new_text !== 'string') {\n return error.value;\n }\n return text.substr(0, position - 1) + new_text + text.substr(position - 1 + length);\n };\n \n exports.REPT = function(text, number) {\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return new Array(number + 1).join(text);\n };\n \n exports.RIGHT = function(text, number) {\n number = (number === undefined) ? 1 : number;\n number = utils.parseNumber(number);\n if (number instanceof Error) {\n return number;\n }\n return text ? text.substring(text.length - number) : null;\n };\n \n exports.SEARCH = function(find_text, within_text, position) {\n var foundAt;\n if (typeof find_text !== 'string' || typeof within_text !== 'string') {\n return error.value;\n }\n position = (position === undefined) ? 0 : position;\n foundAt = within_text.toLowerCase().indexOf(find_text.toLowerCase(), position - 1)+1;\n return (foundAt === 0)?error.value:foundAt;\n };\n \n exports.SPLIT = function (text, separator) {\n return text.split(separator);\n };\n \n exports.SUBSTITUTE = function(text, old_text, new_text, occurrence) {\n if (!text || !old_text || !new_text) {\n return text;\n } else if (occurrence === undefined) {\n return text.replace(new RegExp(old_text, 'g'), new_text);\n } else {\n var index = 0;\n var i = 0;\n while (text.indexOf(old_text, index) > 0) {\n index = text.indexOf(old_text, index + 1);\n i++;\n if (i === occurrence) {\n return text.substring(0, index) + new_text + text.substring(index + old_text.length);\n }\n }\n }\n };\n \n exports.T = function(value) {\n return (typeof value === \"string\") ? value : '';\n };\n \n exports.TEXT = null;\n \n exports.TRIM = function(text) {\n if (typeof text !== 'string') {\n return error.value;\n }\n return text.replace(/ +/g, ' ').trim();\n };\n \n exports.UNICHAR = exports.CHAR;\n \n exports.UNICODE = exports.CODE;\n \n exports.UPPER = function(text) {\n if (typeof text !== 'string') {\n return error.value;\n }\n return text.toUpperCase();\n };\n \n exports.VALUE = null;\n \n return exports;\n })();\n \n jexcel.methods.stats = (function() {\n var exports = {};\n \n var SQRT2PI = 2.5066282746310002;\n \n exports.AVEDEV = null;\n \n exports.AVERAGE = function() {\n var range = utils.numbers(utils.flatten(arguments));\n var n = range.length;\n var sum = 0;\n var count = 0;\n for (var i = 0; i < n; i++) {\n sum += range[i];\n count += 1;\n }\n return sum / count;\n };\n \n exports.AVERAGEA = function() {\n var range = utils.flatten(arguments);\n var n = range.length;\n var sum = 0;\n var count = 0;\n for (var i = 0; i < n; i++) {\n var el = range[i];\n if (typeof el === 'number') {\n sum += el;\n }\n if (el === true) {\n sum++;\n }\n if (el !== null) {\n count++;\n }\n }\n return sum / count;\n };\n \n exports.AVERAGEIF = function(range, criteria, average_range) {\n average_range = average_range || range;\n range = utils.flatten(range);\n average_range = utils.parseNumberArray(utils.flatten(average_range));\n if (average_range instanceof Error) {\n return average_range;\n }\n var average_count = 0;\n var result = 0;\n for (var i = 0; i < range.length; i++) {\n if (eval(range[i] + criteria)) { // jshint ignore:line\n result += average_range[i];\n average_count++;\n }\n }\n return result / average_count;\n };\n \n exports.AVERAGEIFS = null;\n \n exports.COUNT = function() {\n return utils.numbers(utils.flatten(arguments)).length;\n };\n \n exports.COUNTA = function() {\n var range = utils.flatten(arguments);\n return range.length - exports.COUNTBLANK(range);\n };\n \n exports.COUNTIN = function (range, value) {\n var result = 0;\n for (var i = 0; i < range.length; i++) {\n if (range[i] === value) {\n result++;\n }\n }\n return result;\n };\n \n exports.COUNTBLANK = function() {\n var range = utils.flatten(arguments);\n var blanks = 0;\n var element;\n for (var i = 0; i < range.length; i++) {\n element = range[i];\n if (element === null || element === '') {\n blanks++;\n }\n }\n return blanks;\n };\n \n exports.COUNTIF = function(range, criteria) {\n range = utils.flatten(range);\n if (!/[<>=!]/.test(criteria)) {\n criteria = '==\"' + criteria + '\"';\n }\n var matches = 0;\n for (var i = 0; i < range.length; i++) {\n if (typeof range[i] !== 'string') {\n if (eval(range[i] + criteria)) { // jshint ignore:line\n matches++;\n }\n } else {\n if (eval('\"' + range[i] + '\"' + criteria)) { // jshint ignore:line\n matches++;\n }\n }\n }\n return matches;\n };\n \n exports.COUNTIFS = function() {\n var args = utils.argsToArray(arguments);\n var results = new Array(utils.flatten(args[0]).length);\n for (var i = 0; i < results.length; i++) {\n results[i] = true;\n }\n for (i = 0; i < args.length; i += 2) {\n var range = utils.flatten(args[i]);\n var criteria = args[i + 1];\n if (!/[<>=!]/.test(criteria)) {\n criteria = '==\"' + criteria + '\"';\n }\n for (var j = 0; j < range.length; j++) {\n if (typeof range[j] !== 'string') {\n results[j] = results[j] && eval(range[j] + criteria); // jshint ignore:line\n } else {\n results[j] = results[j] && eval('\"' + range[j] + '\"' + criteria); // jshint ignore:line\n }\n }\n }\n var result = 0;\n for (i = 0; i < results.length; i++) {\n if (results[i]) {\n result++;\n }\n }\n return result;\n };\n \n exports.COUNTUNIQUE = function () {\n return UNIQUE.apply(null, utils.flatten(arguments)).length;\n };\n \n exports.FISHER = function(x) {\n x = utils.parseNumber(x);\n if (x instanceof Error) {\n return x;\n }\n return Math.log((1 + x) / (1 - x)) / 2;\n };\n \n exports.FISHERINV = function(y) {\n y = utils.parseNumber(y);\n if (y instanceof Error) {\n return y;\n }\n var e2y = Math.exp(2 * y);\n return (e2y - 1) / (e2y + 1);\n };\n \n exports.FREQUENCY = function(data, bins) {\n data = utils.parseNumberArray(utils.flatten(data));\n bins = utils.parseNumberArray(utils.flatten(bins));\n if (utils.anyIsError(data, bins)) {\n return error.value;\n }\n var n = data.length;\n var b = bins.length;\n var r = [];\n for (var i = 0; i <= b; i++) {\n r[i] = 0;\n for (var j = 0; j < n; j++) {\n if (i === 0) {\n if (data[j] <= bins[0]) {\n r[0] += 1;\n }\n } else if (i < b) {\n if (data[j] > bins[i - 1] && data[j] <= bins[i]) {\n r[i] += 1;\n }\n } else if (i === b) {\n if (data[j] > bins[b - 1]) {\n r[b] += 1;\n }\n }\n }\n }\n return r;\n };\n \n exports.LARGE = function(range, k) {\n range = utils.parseNumberArray(utils.flatten(range));\n k = utils.parseNumber(k);\n if (utils.anyIsError(range, k)) {\n return range;\n }\n return range.sort(function(a, b) {\n return b - a;\n })[k - 1];\n };\n \n exports.MAX = function() {\n var range = utils.numbers(utils.flatten(arguments));\n return (range.length === 0) ? 0 : Math.max.apply(Math, range);\n };\n \n exports.MAXA = function() {\n var range = utils.arrayValuesToNumbers(utils.flatten(arguments));\n return (range.length === 0) ? 0 : Math.max.apply(Math, range);\n };\n \n exports.MIN = function() {\n var range = utils.numbers(utils.flatten(arguments));\n return (range.length === 0) ? 0 : Math.min.apply(Math, range);\n };\n \n exports.MINA = function() {\n var range = utils.arrayValuesToNumbers(utils.flatten(arguments));\n return (range.length === 0) ? 0 : Math.min.apply(Math, range);\n };\n \n exports.MODE = {};\n \n exports.MODE.MULT = function() {\n // Credits: Roönaän\n var range = utils.parseNumberArray(utils.flatten(arguments));\n if (range instanceof Error) {\n return range;\n }\n var n = range.length;\n var count = {};\n var maxItems = [];\n var max = 0;\n var currentItem;\n \n for (var i = 0; i < n; i++) {\n currentItem = range[i];\n count[currentItem] = count[currentItem] ? count[currentItem] + 1 : 1;\n if (count[currentItem] > max) {\n max = count[currentItem];\n maxItems = [];\n }\n if (count[currentItem] === max) {\n maxItems[maxItems.length] = currentItem;\n }\n }\n return maxItems;\n };\n \n exports.MODE.SNGL = function() {\n var range = utils.parseNumberArray(utils.flatten(arguments));\n if (range instanceof Error) {\n return range;\n }\n return exports.MODE.MULT(range).sort(function(a, b) {\n return a - b;\n })[0];\n };\n \n exports.PERCENTILE = {};\n \n exports.PERCENTILE.EXC = function(array, k) {\n array = utils.parseNumberArray(utils.flatten(array));\n k = utils.parseNumber(k);\n if (utils.anyIsError(array, k)) {\n return error.value;\n }\n array = array.sort(function(a, b) {\n {\n return a - b;\n }\n });\n var n = array.length;\n if (k < 1 / (n + 1) || k > 1 - 1 / (n + 1)) {\n return error.num;\n }\n var l = k * (n + 1) - 1;\n var fl = Math.floor(l);\n return utils.cleanFloat((l === fl) ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]));\n };\n \n exports.PERCENTILE.INC = function(array, k) {\n array = utils.parseNumberArray(utils.flatten(array));\n k = utils.parseNumber(k);\n if (utils.anyIsError(array, k)) {\n return error.value;\n }\n array = array.sort(function(a, b) {\n return a - b;\n });\n var n = array.length;\n var l = k * (n - 1);\n var fl = Math.floor(l);\n return utils.cleanFloat((l === fl) ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]));\n };\n \n exports.PERCENTRANK = {};\n \n exports.PERCENTRANK.EXC = function(array, x, significance) {\n significance = (significance === undefined) ? 3 : significance;\n array = utils.parseNumberArray(utils.flatten(array));\n x = utils.parseNumber(x);\n significance = utils.parseNumber(significance);\n if (utils.anyIsError(array, x, significance)) {\n return error.value;\n }\n array = array.sort(function(a, b) {\n return a - b;\n });\n var uniques = UNIQUE.apply(null, array);\n var n = array.length;\n var m = uniques.length;\n var power = Math.pow(10, significance);\n var result = 0;\n var match = false;\n var i = 0;\n while (!match && i < m) {\n if (x === uniques[i]) {\n result = (array.indexOf(uniques[i]) + 1) / (n + 1);\n match = true;\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\n result = (array.indexOf(uniques[i]) + 1 + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n + 1);\n match = true;\n }\n i++;\n }\n return Math.floor(result * power) / power;\n };\n \n exports.PERCENTRANK.INC = function(array, x, significance) {\n significance = (significance === undefined) ? 3 : significance;\n array = utils.parseNumberArray(utils.flatten(array));\n x = utils.parseNumber(x);\n significance = utils.parseNumber(significance);\n if (utils.anyIsError(array, x, significance)) {\n return error.value;\n }\n array = array.sort(function(a, b) {\n return a - b;\n });\n var uniques = UNIQUE.apply(null, array);\n var n = array.length;\n var m = uniques.length;\n var power = Math.pow(10, significance);\n var result = 0;\n var match = false;\n var i = 0;\n while (!match && i < m) {\n if (x === uniques[i]) {\n result = array.indexOf(uniques[i]) / (n - 1);\n match = true;\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\n result = (array.indexOf(uniques[i]) + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n - 1);\n match = true;\n }\n i++;\n }\n return Math.floor(result * power) / power;\n };\n \n exports.PERMUT = function(number, number_chosen) {\n number = utils.parseNumber(number);\n number_chosen = utils.parseNumber(number_chosen);\n if (utils.anyIsError(number, number_chosen)) {\n return error.value;\n }\n return FACT(number) / FACT(number - number_chosen);\n };\n \n exports.PERMUTATIONA = function(number, number_chosen) {\n number = utils.parseNumber(number);\n number_chosen = utils.parseNumber(number_chosen);\n if (utils.anyIsError(number, number_chosen)) {\n return error.value;\n }\n return Math.pow(number, number_chosen);\n };\n \n exports.PHI = function(x) {\n x = utils.parseNumber(x);\n if (x instanceof Error) {\n return error.value;\n }\n return Math.exp(-0.5 * x * x) / SQRT2PI;\n };\n \n exports.PROB = function(range, probability, lower, upper) {\n if (lower === undefined) {\n return 0;\n }\n upper = (upper === undefined) ? lower : upper;\n \n range = utils.parseNumberArray(utils.flatten(range));\n probability = utils.parseNumberArray(utils.flatten(probability));\n lower = utils.parseNumber(lower);\n upper = utils.parseNumber(upper);\n if (utils.anyIsError(range, probability, lower, upper)) {\n return error.value;\n }\n \n if (lower === upper) {\n return (range.indexOf(lower) >= 0) ? probability[range.indexOf(lower)] : 0;\n }\n \n var sorted = range.sort(function(a, b) {\n return a - b;\n });\n var n = sorted.length;\n var result = 0;\n for (var i = 0; i < n; i++) {\n if (sorted[i] >= lower && sorted[i] <= upper) {\n result += probability[range.indexOf(sorted[i])];\n }\n }\n return result;\n };\n \n exports.QUARTILE = {};\n \n exports.QUARTILE.EXC = function(range, quart) {\n range = utils.parseNumberArray(utils.flatten(range));\n quart = utils.parseNumber(quart);\n if (utils.anyIsError(range, quart)) {\n return error.value;\n }\n switch (quart) {\n case 1:\n return exports.PERCENTILE.EXC(range, 0.25);\n case 2:\n return exports.PERCENTILE.EXC(range, 0.5);\n case 3:\n return exports.PERCENTILE.EXC(range, 0.75);\n default:\n return error.num;\n }\n };\n \n exports.QUARTILE.INC = function(range, quart) {\n range = utils.parseNumberArray(utils.flatten(range));\n quart = utils.parseNumber(quart);\n if (utils.anyIsError(range, quart)) {\n return error.value;\n }\n switch (quart) {\n case 1:\n return exports.PERCENTILE.INC(range, 0.25);\n case 2:\n return exports.PERCENTILE.INC(range, 0.5);\n case 3:\n return exports.PERCENTILE.INC(range, 0.75);\n default:\n return error.num;\n }\n };\n \n exports.RANK = {};\n \n exports.RANK.AVG = function(number, range, order) {\n number = utils.parseNumber(number);\n range = utils.parseNumberArray(utils.flatten(range));\n if (utils.anyIsError(number, range)) {\n return error.value;\n }\n range = utils.flatten(range);\n order = order || false;\n var sort = (order) ? function(a, b) {\n return a - b;\n } : function(a, b) {\n return b - a;\n };\n range = range.sort(sort);\n \n var length = range.length;\n var count = 0;\n for (var i = 0; i < length; i++) {\n if (range[i] === number) {\n count++;\n }\n }\n \n return (count > 1) ? (2 * range.indexOf(number) + count + 1) / 2 : range.indexOf(number) + 1;\n };\n \n exports.RANK.EQ = function(number, range, order) {\n number = utils.parseNumber(number);\n range = utils.parseNumberArray(utils.flatten(range));\n if (utils.anyIsError(number, range)) {\n return error.value;\n }\n order = order || false;\n var sort = (order) ? function(a, b) {\n return a - b;\n } : function(a, b) {\n return b - a;\n };\n range = range.sort(sort);\n return range.indexOf(number) + 1;\n };\n \n exports.RSQ = function(data_x, data_y) { // no need to flatten here, PEARSON will take care of that\n data_x = utils.parseNumberArray(utils.flatten(data_x));\n data_y = utils.parseNumberArray(utils.flatten(data_y));\n if (utils.anyIsError(data_x, data_y)) {\n return error.value;\n }\n return Math.pow(exports.PEARSON(data_x, data_y), 2);\n };\n \n exports.SMALL = function(range, k) {\n range = utils.parseNumberArray(utils.flatten(range));\n k = utils.parseNumber(k);\n if (utils.anyIsError(range, k)) {\n return range;\n }\n return range.sort(function(a, b) {\n return a - b;\n })[k - 1];\n };\n \n exports.STANDARDIZE = function(x, mean, sd) {\n x = utils.parseNumber(x);\n mean = utils.parseNumber(mean);\n sd = utils.parseNumber(sd);\n if (utils.anyIsError(x, mean, sd)) {\n return error.value;\n }\n return (x - mean) / sd;\n };\n \n exports.STDEV = {};\n \n exports.STDEV.P = function() {\n var v = exports.VAR.P.apply(this, arguments);\n return Math.sqrt(v);\n };\n \n exports.STDEV.S = function() {\n var v = exports.VAR.S.apply(this, arguments);\n return Math.sqrt(v);\n };\n \n exports.STDEVA = function() {\n var v = exports.VARA.apply(this, arguments);\n return Math.sqrt(v);\n };\n \n exports.STDEVPA = function() {\n var v = exports.VARPA.apply(this, arguments);\n return Math.sqrt(v);\n };\n \n exports.VAR = {};\n \n exports.VAR.P = function() {\n var range = utils.numbers(utils.flatten(arguments));\n var n = range.length;\n var sigma = 0;\n var mean = exports.AVERAGE(range);\n for (var i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 2);\n }\n return sigma / n;\n };\n \n exports.VAR.S = function() {\n var range = utils.numbers(utils.flatten(arguments));\n var n = range.length;\n var sigma = 0;\n var mean = exports.AVERAGE(range);\n for (var i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 2);\n }\n return sigma / (n - 1);\n };\n \n exports.VARA = function() {\n var range = utils.flatten(arguments);\n var n = range.length;\n var sigma = 0;\n var count = 0;\n var mean = exports.AVERAGEA(range);\n for (var i = 0; i < n; i++) {\n var el = range[i];\n if (typeof el === 'number') {\n sigma += Math.pow(el - mean, 2);\n } else if (el === true) {\n sigma += Math.pow(1 - mean, 2);\n } else {\n sigma += Math.pow(0 - mean, 2);\n }\n \n if (el !== null) {\n count++;\n }\n }\n return sigma / (count - 1);\n };\n \n exports.VARPA = function() {\n var range = utils.flatten(arguments);\n var n = range.length;\n var sigma = 0;\n var count = 0;\n var mean = exports.AVERAGEA(range);\n for (var i = 0; i < n; i++) {\n var el = range[i];\n if (typeof el === 'number') {\n sigma += Math.pow(el - mean, 2);\n } else if (el === true) {\n sigma += Math.pow(1 - mean, 2);\n } else {\n sigma += Math.pow(0 - mean, 2);\n }\n \n if (el !== null) {\n count++;\n }\n }\n return sigma / count;\n };\n \n exports.WEIBULL = {};\n \n exports.WEIBULL.DIST = function(x, alpha, beta, cumulative) {\n x = utils.parseNumber(x);\n alpha = utils.parseNumber(alpha);\n beta = utils.parseNumber(beta);\n if (utils.anyIsError(x, alpha, beta)) {\n return error.value;\n }\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);\n };\n \n exports.Z = {};\n \n exports.Z.TEST = function(range, x, sd) {\n range = utils.parseNumberArray(utils.flatten(range));\n x = utils.parseNumber(x);\n if (utils.anyIsError(range, x)) {\n return error.value;\n }\n \n sd = sd || exports.STDEV.S(range);\n var n = range.length;\n return 1 - exports.NORM.S.DIST((exports.AVERAGE(range) - x) / (sd / Math.sqrt(n)), true);\n };\n \n return exports;\n })();\n\n jexcel.methods.utils = (function() {\n var exports = {};\n\n exports.PROGRESS = function(p, c) {\n var color = c ? c : 'red';\n var value = p ? p : '0';\n\n return '
';\n };\n\n exports.RATING = function(v) {\n var html = '
';\n for (var i = 0; i < 5; i++) {\n if (i < v) {\n html += '
';\n } else {\n html += '
';\n }\n }\n html += '
';\n return html;\n }\n\n return exports;\n })();\n\n for (var i = 0; i < Object.keys(jexcel.methods).length; i++) {\n var methods = jexcel.methods[Object.keys(jexcel.methods)[i]];\n for (var j = 0; j < Object.keys(methods).length; j++) {\n if (typeof(methods[Object.keys(methods)[j]]) == 'function') {\n window[Object.keys(methods)[j]] = methods[Object.keys(methods)[j]];\n } else {\n window[Object.keys(methods)[j]] = function() {\n return Object.keys(methods)[j] + 'Not implemented';\n }\n }\n }\n }\n\n return jexcel;\n})));","\r\n/**\r\n * (c) jSuites Javascript Web Components (v3.3)\r\n *\r\n * Author: Paul Hodel \r\n * Website: https://bossanova.uk/jsuites/\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) {\n var obj = {}\n\n obj.init = function() {\n }\n\n return obj;\n}\r\n\r\njSuites.ajax = (function(options, complete) {\n if (Array.isArray(options)) {\n // Create multiple request controller \n var multiple = {\n instance: [],\n complete: complete,\n }\n\n if (options.length > 0) {\n for (var i = 0; i < options.length; i++) {\n options[i].multiple = multiple;\n multiple.instance.push(jSuites.ajax(options[i]));\n }\n }\n\n return multiple;\n }\n\n if (! options.data) {\n options.data = {};\n }\n\n if (options.type) {\n options.method = options.type;\n }\n\n if (options.data) {\n // Parse object to variables format\n var parseData = function(value, key) {\n var vars = [];\n var keys = Object.keys(value);\n if (keys.length) {\n for (var i = 0; i < keys.length; i++) {\n if (key) {\n var k = key + '[' + keys[i] + ']';\n } else {\n var k = keys[i];\n }\n\n if (typeof(value[keys[i]]) == 'object') {\n var r = parseData(value[keys[i]], k);\n var o = Object.keys(r);\n for (var j = 0; j < o.length; j++) {\n vars[o[j]] = r[o[j]];\n }\n } else {\n vars[k] = value[keys[i]];\n }\n }\n }\n\n return vars;\n }\n\n var data = [];\n var d = parseData(options.data);\n var k = Object.keys(d);\n for (var i = 0; i < k.length; i++) {\n data.push(k[i] + '=' + encodeURIComponent(d[k[i]]));\n }\n\n if (options.method == 'GET' && data.length > 0) {\n if (options.url.indexOf('?') < 0) {\n options.url += '?';\n }\n options.url += data.join('&');\n }\n }\n\n var httpRequest = new XMLHttpRequest();\n httpRequest.open(options.method, options.url, true);\n httpRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\n if (options.method == 'POST') {\n httpRequest.setRequestHeader('Accept', 'application/json');\n httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n } else {\n if (options.dataType == 'json') {\n httpRequest.setRequestHeader('Content-Type', 'text/json');\n }\n }\n\n // No cache\n if (options.cache != true) {\n httpRequest.setRequestHeader('pragma', 'no-cache');\n httpRequest.setRequestHeader('cache-control', 'no-cache');\n }\n\n // Authentication\n if (options.withCredentials == true) {\n httpRequest.withCredentials = true\n }\n\n // Before send\n if (typeof(options.beforeSend) == 'function') {\n options.beforeSend(httpRequest);\n }\n\n httpRequest.onload = function() {\n if (httpRequest.status === 200) {\n if (options.dataType == 'json') {\n try {\n var result = JSON.parse(httpRequest.responseText);\n\n if (options.success && typeof(options.success) == 'function') {\n options.success(result);\n }\n } catch(err) {\n if (options.error && typeof(options.error) == 'function') {\n options.error(err, result);\n }\n }\n } else {\n var result = httpRequest.responseText;\n\n if (options.success && typeof(options.success) == 'function') {\n options.success(result);\n }\n }\n } else {\n if (options.error && typeof(options.error) == 'function') {\n options.error(httpRequest.responseText);\n }\n }\n\n // Global queue\n if (jSuites.ajax.queue && jSuites.ajax.queue.length > 0) {\n jSuites.ajax.send(jSuites.ajax.queue.shift());\n }\n\n // Global complete method\n if (jSuites.ajax.requests && jSuites.ajax.requests.length) {\n // Get index of this request in the container\n var index = jSuites.ajax.requests.indexOf(httpRequest);\n // Remove from the ajax requests container\n jSuites.ajax.requests.splice(index, 1);\n // Last one?\n if (! jSuites.ajax.requests.length) {\n if (options.complete && typeof(options.complete) == 'function') {\n options.complete(result);\n }\n }\n // Controllers\n if (options.multiple && options.multiple.instance) {\n // Get index of this request in the container\n var index = options.multiple.instance.indexOf(httpRequest);\n // Remove from the ajax requests container\n options.multiple.instance.splice(index, 1);\n // If this is the last one call method complete\n if (! options.multiple.instance.length) {\n if (options.multiple.complete && typeof(options.multiple.complete) == 'function') {\n options.multiple.complete(result);\n }\n }\n }\n }\n }\n\n // Data\n httpRequest.data = data;\n\n // Queue\n if (options.queue == true && jSuites.ajax.requests.length > 0) {\n jSuites.ajax.queue.push(httpRequest);\n } else {\n jSuites.ajax.send(httpRequest)\n }\n\n return httpRequest;\n});\n\njSuites.ajax.send = function(httpRequest) {\n if (httpRequest.data) {\n httpRequest.send(httpRequest.data.join('&'));\n } else {\n httpRequest.send();\n }\n\n jSuites.ajax.requests.push(httpRequest);\n}\n\njSuites.ajax.exists = function(url, __callback) {\n var http = new XMLHttpRequest();\n http.open('HEAD', url, false);\n http.send();\n if (http.status) {\n __callback(http.status);\n }\n}\n\njSuites.ajax.requests = [];\n\njSuites.ajax.queue = [];\r\n\r\njSuites.alert = function(message) {\n if (jSuites.getWindowWidth() < 800 && jSuites.dialog) {\n jSuites.dialog.open({\n title:'Alert',\n message:message,\n });\n } else {\n alert(message);\n }\n}\r\n\r\njSuites.animation = {};\n\njSuites.animation.slideLeft = function(element, direction, done) {\n if (direction == true) {\n element.classList.add('slide-left-in');\n setTimeout(function() {\n element.classList.remove('slide-left-in');\n if (typeof(done) == 'function') {\n done();\n }\n }, 400);\n } else {\n element.classList.add('slide-left-out');\n setTimeout(function() {\n element.classList.remove('slide-left-out');\n if (typeof(done) == 'function') {\n done();\n }\n }, 400);\n }\n}\n\njSuites.animation.slideRight = function(element, direction, done) {\n if (direction == true) {\n element.classList.add('slide-right-in');\n setTimeout(function() {\n element.classList.remove('slide-right-in');\n if (typeof(done) == 'function') {\n done();\n }\n }, 400);\n } else {\n element.classList.add('slide-right-out');\n setTimeout(function() {\n element.classList.remove('slide-right-out');\n if (typeof(done) == 'function') {\n done();\n }\n }, 400);\n }\n}\n\njSuites.animation.slideTop = function(element, direction, done) {\n if (direction == true) {\n element.classList.add('slide-top-in');\n setTimeout(function() {\n element.classList.remove('slide-top-in');\n if (typeof(done) == 'function') {\n done();\n }\n }, 400);\n } else {\n element.classList.add('slide-top-out');\n setTimeout(function() {\n element.classList.remove('slide-top-out');\n if (typeof(done) == 'function') {\n done();\n }\n }, 400);\n }\n}\n\njSuites.animation.slideBottom = function(element, direction, done) {\n if (direction == true) {\n element.classList.add('slide-bottom-in');\n setTimeout(function() {\n element.classList.remove('slide-bottom-in');\n if (typeof(done) == 'function') {\n done();\n }\n }, 400);\n } else {\n element.classList.add('slide-bottom-out');\n setTimeout(function() {\n element.classList.remove('slide-bottom-out');\n if (typeof(done) == 'function') {\n done();\n }\n }, 100);\n }\n}\n\njSuites.animation.fadeIn = function(element, done) {\n element.classList.add('fade-in');\n setTimeout(function() {\n element.classList.remove('fade-in');\n if (typeof(done) == 'function') {\n done();\n }\n }, 2000);\n}\n\njSuites.animation.fadeOut = function(element, done) {\n element.classList.add('fade-out');\n setTimeout(function() {\n element.classList.remove('fade-out');\n if (typeof(done) == 'function') {\n done();\n }\n }, 1000);\n}\r\n\r\njSuites.calendar = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // Global container\n if (! jSuites.calendar.current) {\n jSuites.calendar.current = null;\n }\n\n // Default configuration\n var defaults = {\n // Data\n data: null,\n // Inline or not\n type: null,\n // Restrictions\n validRange: null,\n // Starting weekday - 0 for sunday, 6 for saturday\n startingDay: null, \n // Date format\n format: 'DD/MM/YYYY',\n // Allow keyboard date entry\n readonly: true,\n // Today is default\n today: false,\n // Show timepicker\n time: false,\n // Show the reset button\n resetButton: true,\n // Placeholder\n placeholder: '',\n // Translations can be done here\n months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n weekdays: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],\n weekdays_short: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n textDone: 'Done',\n textReset: 'Reset',\n textUpdate: 'Update',\n // Value\n value: null,\n // Fullscreen (this is automatic set for screensize < 800)\n fullscreen: false,\n // Create the calendar closed as default\n opened: false,\n // Events\n onopen: null,\n onclose: null,\n onchange: null,\n // Internal mode controller\n mode: null,\n position: null,\n };\n\n // Loop through our object\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Value\n if (! obj.options.value) {\n if (el.tagName == 'INPUT' && el.value) {\n obj.options.value = el.value;\n }\n }\n\n // Make sure use upper case in the format\n obj.options.format = obj.options.format.toUpperCase();\n\n // Date\n obj.date = null;\n\n if (obj.options.value) {\n var date = obj.options.value.split(' ');\n var time = date[1];\n var date = date[0].split('-');\n var y = parseInt(date[0]);\n var m = parseInt(date[1]);\n var d = parseInt(date[2]);\n\n if (time) {\n var time = time.split(':');\n var h = parseInt(time[0]);\n var i = parseInt(time[1]);\n } else {\n var h = 0;\n var i = 0;\n }\n\n obj.date = [ y, m, d, h, i, 0 ];\n } else {\n if (obj.options.today) {\n var date = new Date();\n var y = date.getFullYear();\n var m = date.getMonth() + 1;\n var d = date.getDate();\n var h = date.getHours();\n var i = date.getMinutes();\n\n obj.date = [ y, m, d, h, i, 0 ];\n }\n }\n\n // Two digits\n var two = function(value) {\n value = '' + value;\n if (value.length == 1) {\n value = '0' + value;\n }\n return value;\n }\n\n // Calendar elements\n var calendarReset = document.createElement('div');\n calendarReset.className = 'jcalendar-reset';\n calendarReset.innerHTML = obj.options.textReset;\n\n var calendarConfirm = document.createElement('div');\n calendarConfirm.className = 'jcalendar-confirm';\n calendarConfirm.innerHTML = obj.options.textDone;\n\n var calendarControls = document.createElement('div');\n calendarControls.className = 'jcalendar-controls'\n if (obj.options.resetButton) {\n calendarControls.appendChild(calendarReset);\n }\n calendarControls.appendChild(calendarConfirm);\n\n var calendarContainer = document.createElement('div');\n calendarContainer.className = 'jcalendar-container';\n\n var calendarContent = document.createElement('div');\n calendarContent.className = 'jcalendar-content';\n calendarContent.appendChild(calendarControls);\n calendarContainer.appendChild(calendarContent);\n\n // Table container\n var calendarTableContainer = document.createElement('div');\n calendarTableContainer.className = 'jcalendar-table';\n calendarContent.appendChild(calendarTableContainer);\n\n // Main element\n if (el.tagName == 'INPUT') {\n var calendar = document.createElement('div');\n } else {\n var calendar = el;\n }\n calendar.className = 'jcalendar';\n calendar.appendChild(calendarContainer);\n\n // Previous button\n var calendarHeaderPrev = document.createElement('td');\n calendarHeaderPrev.setAttribute('colspan', '2');\n calendarHeaderPrev.className = 'jcalendar-prev';\n\n // Header with year and month\n var calendarLabelYear = document.createElement('span');\n calendarLabelYear.className = 'jcalendar-year';\n\n var calendarLabelMonth = document.createElement('span');\n calendarLabelMonth.className = 'jcalendar-month';\n\n var calendarHeaderTitle = document.createElement('td');\n calendarHeaderTitle.className = 'jcalendar-header';\n calendarHeaderTitle.setAttribute('colspan', '3');\n calendarHeaderTitle.appendChild(calendarLabelMonth);\n calendarHeaderTitle.appendChild(calendarLabelYear);\n\n var calendarHeaderNext = document.createElement('td');\n calendarHeaderNext.setAttribute('colspan', '2');\n calendarHeaderNext.className = 'jcalendar-next';\n\n var calendarHeaderRow = document.createElement('tr');\n calendarHeaderRow.appendChild(calendarHeaderPrev);\n calendarHeaderRow.appendChild(calendarHeaderTitle);\n calendarHeaderRow.appendChild(calendarHeaderNext);\n\n var calendarHeader = document.createElement('thead');\n calendarHeader.appendChild(calendarHeaderRow);\n\n var calendarBody = document.createElement('tbody');\n var calendarFooter = document.createElement('tfoot');\n\n // Calendar table\n var calendarTable = document.createElement('table');\n calendarTable.setAttribute('cellpadding', '0');\n calendarTable.setAttribute('cellspacing', '0');\n calendarTable.appendChild(calendarHeader);\n calendarTable.appendChild(calendarBody);\n calendarTable.appendChild(calendarFooter);\n calendarTableContainer.appendChild(calendarTable);\n\n var calendarSelectHour = document.createElement('select');\n calendarSelectHour.className = 'jcalendar-select';\n calendarSelectHour.onchange = function() {\n obj.date[3] = this.value; \n }\n\n for (var i = 0; i < 24; i++) {\n var element = document.createElement('option');\n element.value = i;\n element.innerHTML = two(i);\n calendarSelectHour.appendChild(element);\n }\n\n var calendarSelectMin = document.createElement('select');\n calendarSelectMin.className = 'jcalendar-select';\n calendarSelectMin.onchange = function() {\n obj.date[4] = this.value; \n }\n\n for (var i = 0; i < 60; i++) {\n var element = document.createElement('option');\n element.value = i;\n element.innerHTML = two(i);\n calendarSelectMin.appendChild(element);\n }\n\n // Footer controls\n var calendarControlsFooter = document.createElement('div');\n calendarControlsFooter.className = 'jcalendar-controls';\n\n var calendarControlsTime = document.createElement('div');\n calendarControlsTime.className = 'jcalendar-time';\n calendarControlsTime.style.maxWidth = '140px';\n calendarControlsTime.appendChild(calendarSelectHour);\n calendarControlsTime.appendChild(calendarSelectMin);\n\n var calendarControlsUpdateButton = document.createElement('input');\n calendarControlsUpdateButton.setAttribute('type', 'button');\n calendarControlsUpdateButton.className = 'jcalendar-update';\n calendarControlsUpdateButton.value = obj.options.textUpdate;\n\n var calendarControlsUpdate = document.createElement('div');\n calendarControlsUpdate.style.flexGrow = '10';\n calendarControlsUpdate.appendChild(calendarControlsUpdateButton);\n calendarControlsFooter.appendChild(calendarControlsTime);\n calendarControlsFooter.appendChild(calendarControlsUpdate);\n calendarContent.appendChild(calendarControlsFooter);\n\n var calendarBackdrop = document.createElement('div');\n calendarBackdrop.className = 'jcalendar-backdrop';\n calendar.appendChild(calendarBackdrop);\n\n // Update actions button\n var updateActions = function() {\n var currentDay = calendar.querySelector('.jcalendar-selected');\n\n if (currentDay && currentDay.classList.contains('jcalendar-disabled')) {\n calendarControlsUpdateButton.setAttribute('disabled', 'disabled');\n calendarSelectHour.setAttribute('disabled', 'disabled');\n calendarSelectMin.setAttribute('disabled', 'disabled');\n } else {\n calendarControlsUpdateButton.removeAttribute('disabled');\n calendarSelectHour.removeAttribute('disabled');\n calendarSelectMin.removeAttribute('disabled');\n }\n }\n\n // Methods\n obj.open = function (value) {\n if (! calendar.classList.contains('jcalendar-focus')) {\n if (jSuites.calendar.current) {\n jSuites.calendar.current.close();\n }\n // Current\n jSuites.calendar.current = obj;\n // Show calendar\n calendar.classList.add('jcalendar-focus');\n // Get days\n obj.getDays();\n // Hour\n if (obj.options.time) {\n calendarSelectHour.value = obj.date[3];\n calendarSelectMin.value = obj.date[4];\n }\n\n // Get the position of the corner helper\n if (jSuites.getWindowWidth() < 800 || obj.options.fullscreen) {\n // Full\n calendar.classList.add('jcalendar-fullsize');\n // Animation\n jSuites.animation.slideBottom(calendarContent, 1);\n } else {\n const rect = el.getBoundingClientRect();\n const rectContent = calendarContent.getBoundingClientRect();\n\n if (obj.options.position) {\n calendarContainer.style.position = 'fixed';\n if (window.innerHeight < rect.bottom + rectContent.height) {\n calendarContainer.style.top = (rect.top - (rectContent.height + 2)) + 'px';\n } else {\n calendarContainer.style.top = (rect.top + rect.height + 2) + 'px';\n }\n calendarContainer.style.left = rect.left + 'px';\n } else {\n if (window.innerHeight < rect.bottom + rectContent.height) {\n calendarContainer.style.bottom = (1 * rect.height + rectContent.height + 2) + 'px';\n } else {\n calendarContainer.style.top = 2 + 'px'; \n }\n }\n }\n\n // Events\n if (typeof(obj.options.onopen) == 'function') {\n obj.options.onopen(el);\n }\n }\n }\n\n obj.close = function (ignoreEvents, update) {\n if (jSuites.calendar.current) {\n // Current\n jSuites.calendar.current = null;\n\n if (update !== false) {\n var element = calendar.querySelector('.jcalendar-selected');\n\n if (typeof(update) == 'string') {\n var value = update;\n } else if (element && element.classList.contains('jcalendar-disabled')) {\n var value = obj.options.value\n } else {\n var value = obj.getValue();\n }\n\n obj.setValue(value);\n }\n\n // Events\n if (! ignoreEvents && typeof(obj.options.onclose) == 'function') {\n obj.options.onclose(el);\n }\n\n // Hide\n calendar.classList.remove('jcalendar-focus');\n }\n\n return obj.options.value;\n }\n\n obj.prev = function() {\n // Check if the visualization is the days picker or years picker\n if (obj.options.mode == 'years') {\n obj.date[0] = obj.date[0] - 12;\n\n // Update picker table of days\n obj.getYears();\n } else {\n // Go to the previous month\n if (obj.date[1] < 2) {\n obj.date[0] = obj.date[0] - 1;\n obj.date[1] = 12;\n } else {\n obj.date[1] = obj.date[1] - 1;\n }\n\n // Update picker table of days\n obj.getDays();\n }\n }\n\n obj.next = function() {\n // Check if the visualization is the days picker or years picker\n if (obj.options.mode == 'years') {\n obj.date[0] = parseInt(obj.date[0]) + 12;\n\n // Update picker table of days\n obj.getYears();\n } else {\n // Go to the previous month\n if (obj.date[1] > 11) {\n obj.date[0] = parseInt(obj.date[0]) + 1;\n obj.date[1] = 1;\n } else {\n obj.date[1] = parseInt(obj.date[1]) + 1;\n }\n\n // Update picker table of days\n obj.getDays();\n }\n }\n\n obj.setValue = function(val) {\n if (! val) {\n val = '' + val;\n }\n // Values\n var newValue = val;\n var oldValue = obj.options.value;\n // Set label\n var value = obj.setLabel(newValue, obj.options.format);\n var date = newValue.split(' ');\n if (! date[1]) {\n date[1] = '00:00:00';\n }\n var time = date[1].split(':')\n var date = date[0].split('-');\n var y = parseInt(date[0]);\n var m = parseInt(date[1]);\n var d = parseInt(date[2]);\n var h = parseInt(time[0]);\n var i = parseInt(time[1]);\n obj.date = [ y, m, d, h, i, 0 ];\n var val = obj.setLabel(newValue, obj.options.format);\n\n if (oldValue != newValue) {\n // Input value\n if (el.tagName == 'INPUT') {\n el.value = val;\n }\n // New value\n obj.options.value = newValue;\n // On change\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(el, newValue, oldValue);\n }\n }\n\n obj.getDays();\n }\n\n obj.getValue = function() {\n if (obj.date) {\n if (obj.options.time) {\n return two(obj.date[0]) + '-' + two(obj.date[1]) + '-' + two(obj.date[2]) + ' ' + two(obj.date[3]) + ':' + two(obj.date[4]) + ':' + two(0);\n } else {\n return two(obj.date[0]) + '-' + two(obj.date[1]) + '-' + two(obj.date[2]) + ' ' + two(0) + ':' + two(0) + ':' + two(0);\n }\n } else {\n return \"\";\n }\n }\n\n /**\n * Calendar\n */\n obj.update = function(element) {\n if (element.classList.contains('jcalendar-disabled')) {\n // Do nothing\n } else {\n obj.date[2] = element.innerText;\n\n if (! obj.options.time) {\n obj.close();\n } else {\n obj.date[3] = calendarSelectHour.value;\n obj.date[4] = calendarSelectMin.value;\n }\n\n var elements = calendar.querySelector('.jcalendar-selected');\n if (elements) {\n elements.classList.remove('jcalendar-selected');\n }\n element.classList.add('jcalendar-selected');\n }\n\n // Update\n updateActions();\n }\n\n /**\n * Set to blank\n */\n obj.reset = function() {\n // Close calendar\n obj.setValue('');\n obj.close(false, false);\n }\n\n /**\n * Get calendar days\n */\n obj.getDays = function() {\n // Mode\n obj.options.mode = 'days';\n\n // Setting current values in case of NULLs\n var date = new Date();\n\n // Current selection\n var year = obj.date && obj.date[0] ? obj.date[0] : parseInt(date.getFullYear());\n var month = obj.date && obj.date[1] ? obj.date[1] : parseInt(date.getMonth()) + 1;\n var day = obj.date && obj.date[2] ? obj.date[2] : parseInt(date.getDate());\n var hour = obj.date && obj.date[3] ? obj.date[3] : parseInt(date.getHours());\n var min = obj.date && obj.date[4] ? obj.date[4] : parseInt(date.getMinutes());\n\n // Selection container\n obj.date = [year, month, day, hour, min, 0 ];\n\n // Update title\n calendarLabelYear.innerHTML = year;\n calendarLabelMonth.innerHTML = obj.options.months[month - 1];\n\n // Current month and Year\n var isCurrentMonthAndYear = (date.getMonth() == month - 1) && (date.getFullYear() == year) ? true : false;\n var currentDay = date.getDate();\n\n // Number of days in the month\n var date = new Date(year, month, 0, 0, 0);\n var numberOfDays = date.getDate();\n\n // First day\n var date = new Date(year, month-1, 0, 0, 0);\n var firstDay = date.getDay() + 1;\n\n // Index value\n var index = obj.options.startingDay || 0;\n\n // First of day relative to the starting calendar weekday\n firstDay = firstDay - index;\n\n // Reset table\n calendarBody.innerHTML = '';\n\n // Weekdays Row\n var row = document.createElement('tr');\n row.setAttribute('align', 'center');\n calendarBody.appendChild(row);\n\n // Create weekdays row\n for (var i = 0; i < 7; i++) {\n var cell = document.createElement('td');\n cell.classList.add('jcalendar-weekday')\n cell.innerHTML = obj.options.weekdays_short[index];\n row.appendChild(cell);\n // Next week day\n index++;\n // Restart index\n if (index > 6) {\n index = 0;\n }\n }\n\n // Index of days\n var index = 0;\n var d = 0;\n \n // Calendar table\n for (var j = 0; j < 6; j++) {\n // Reset cells container\n var row = document.createElement('tr');\n row.setAttribute('align', 'center');\n // Data control\n var emptyRow = true;\n // Create cells\n for (var i = 0; i < 7; i++) {\n // Create cell\n var cell = document.createElement('td');\n cell.classList.add('jcalendar-set-day');\n\n if (index >= firstDay && index < (firstDay + numberOfDays)) {\n // Day cell\n d++;\n cell.innerHTML = d;\n\n // Selected\n if (d == day) {\n cell.classList.add('jcalendar-selected');\n }\n\n // Current selection day is today\n if (isCurrentMonthAndYear && currentDay == d) {\n cell.style.fontWeight = 'bold';\n }\n\n // Current selection day\n var current = jSuites.calendar.now(new Date(year, month-1, d), true);\n\n // Available ranges\n if (obj.options.validRange) {\n if (! obj.options.validRange[0] || current >= obj.options.validRange[0]) {\n var test1 = true;\n } else {\n var test1 = false;\n }\n\n if (! obj.options.validRange[1] || current <= obj.options.validRange[1]) {\n var test2 = true;\n } else {\n var test2 = false;\n }\n\n if (! (test1 && test2)) {\n cell.classList.add('jcalendar-disabled');\n }\n }\n\n // Control\n emptyRow = false;\n }\n // Day cell\n row.appendChild(cell);\n // Index\n index++;\n }\n\n // Add cell to the calendar body\n if (emptyRow == false) {\n calendarBody.appendChild(row);\n }\n }\n\n // Show time controls\n if (obj.options.time) {\n calendarControlsTime.style.display = '';\n } else {\n calendarControlsTime.style.display = 'none';\n }\n\n // Update\n updateActions();\n }\n\n obj.getMonths = function() {\n // Mode\n obj.options.mode = 'months';\n\n // Loading month labels\n var months = obj.options.months;\n\n // Update title\n calendarLabelYear.innerHTML = obj.date[0];\n calendarLabelMonth.innerHTML = '';\n\n // Create months table\n var html = '';\n\n for (i = 0; i < 12; i++) {\n if ((i > 0) && (!(i % 4))) {\n html += '';\n }\n\n var month = parseInt(i) + 1;\n html += '';\n }\n\n html += '
' + months[i] +'
';\n\n calendarBody.innerHTML = html;\n }\n\n obj.getYears = function() { \n // Mode\n obj.options.mode = 'years';\n\n // Array of years\n var y = [];\n for (i = 0; i < 25; i++) {\n y[i] = parseInt(obj.date[0]) + (i - 12);\n }\n\n // Assembling the year tables\n var html = '';\n\n for (i = 0; i < 25; i++) {\n if ((i > 0) && (!(i % 5))) {\n html += '';\n }\n html += '';\n }\n\n html += '
'+ y[i] +'
';\n\n calendarBody.innerHTML = html;\n }\n\n obj.setLabel = function(value, format) {\n return jSuites.calendar.getDateString(value, format);\n }\n\n obj.fromFormatted = function (value, format) {\n return jSuites.calendar.extractDateFromString(value, format);\n }\n\n var mouseUpControls = function(e) {\n var action = e.target.className;\n\n // Object id\n if (action == 'jcalendar-prev') {\n obj.prev();\n e.stopPropagation();\n e.preventDefault();\n } else if (action == 'jcalendar-next') {\n obj.next();\n e.stopPropagation();\n e.preventDefault();\n } else if (action == 'jcalendar-month') {\n obj.getMonths();\n e.stopPropagation();\n e.preventDefault();\n } else if (action == 'jcalendar-year') {\n obj.getYears();\n e.stopPropagation();\n e.preventDefault();\n } else if (action == 'jcalendar-set-year') {\n obj.date[0] = e.target.innerText;\n obj.getDays();\n e.stopPropagation();\n e.preventDefault();\n } else if (action == 'jcalendar-set-month') {\n obj.date[1] = parseInt(e.target.getAttribute('data-value'));\n obj.getDays();\n e.stopPropagation();\n e.preventDefault();\n } else if (action == 'jcalendar-confirm' || action == 'jcalendar-update') {\n obj.close();\n e.stopPropagation();\n e.preventDefault();\n } else if (action == 'jcalendar-close') {\n obj.close();\n e.stopPropagation();\n e.preventDefault();\n } else if (action == 'jcalendar-backdrop') {\n obj.close(false, false);\n e.stopPropagation();\n e.preventDefault();\n } else if (action == 'jcalendar-reset') {\n obj.reset();\n e.stopPropagation();\n e.preventDefault();\n } else if (e.target.classList.contains('jcalendar-set-day')) {\n if (e.target.innerText) {\n obj.update(e.target);\n e.stopPropagation();\n e.preventDefault();\n }\n }\n }\n\n var keyUpControls = function(e) {\n if (e.target.value && e.target.value.length > 3) {\n var test = jSuites.calendar.extractDateFromString(e.target.value, obj.options.format);\n if (test) {\n if (e.target.getAttribute('data-completed') == 'true') {\n obj.setValue(test);\n }\n }\n }\n }\n\n // Handle events\n el.addEventListener(\"keyup\", keyUpControls);\n\n // Add global events\n calendar.addEventListener(\"swipeleft\", function(e) {\n jSuites.animation.slideLeft(calendarTable, 0, function() {\n obj.next();\n jSuites.animation.slideRight(calendarTable, 1);\n });\n e.preventDefault();\n e.stopPropagation();\n });\n\n calendar.addEventListener(\"swiperight\", function(e) {\n jSuites.animation.slideRight(calendarTable, 0, function() {\n obj.prev();\n jSuites.animation.slideLeft(calendarTable, 1);\n });\n e.preventDefault();\n e.stopPropagation();\n });\n\n if ('ontouchend' in document.documentElement === true) {\n calendar.addEventListener(\"touchend\", mouseUpControls);\n\n el.addEventListener(\"touchend\", function(e) {\n obj.open();\n });\n } else {\n calendar.addEventListener(\"mouseup\", mouseUpControls);\n\n el.addEventListener(\"mouseup\", function(e) {\n obj.open();\n });\n }\n\n if (! jSuites.calendar.hasEvents) {\n if ('ontouchstart' in document.documentElement === true) {\n document.addEventListener(\"touchstart\", jSuites.calendar.isOpen);\n } else {\n document.addEventListener(\"mousedown\", jSuites.calendar.isOpen);\n }\n\n document.addEventListener(\"keydown\", function(e) {\n if (e.which == 13) {\n // ENTER\n if (jSuites.calendar.current) {\n jSuites.calendar.current.close(false, true);\n }\n } else if (e.which == 27) {\n // ESC\n if (jSuites.calendar.current) {\n jSuites.calendar.current.close(false, false);\n }\n }\n });\n\n jSuites.calendar.hasEvents = true;\n }\n\n // Append element to the DOM\n if (el.tagName == 'INPUT') {\n el.parentNode.insertBefore(calendar, el.nextSibling);\n // Add properties\n el.setAttribute('autocomplete', 'off');\n el.setAttribute('data-mask', obj.options.format.toLowerCase());\n\n if (obj.options.readonly) {\n el.setAttribute('readonly', 'readonly');\n }\n if (obj.options.placeholder) {\n el.setAttribute('placeholder', obj.options.placeholder);\n }\n // Element\n el.classList.add('jcalendar-input');\n // Value\n el.value = obj.setLabel(obj.getValue(), obj.options.format);\n }\n\n // Keep object available from the node\n el.calendar = obj;\n\n if (obj.options.opened == true) {\n obj.open();\n }\n\n return obj;\n});\n\njSuites.calendar.prettify = function(d, texts) {\n if (! texts) {\n var texts = {\n justNow: 'Just now',\n xMinutesAgo: '{0}m ago',\n xHoursAgo: '{0}h ago',\n xDaysAgo: '{0}d ago',\n xWeeksAgo: '{0}w ago',\n xMonthsAgo: '{0} mon ago',\n xYearsAgo: '{0}y ago',\n }\n }\n\n var d1 = new Date();\n var d2 = new Date(d);\n var total = parseInt((d1 - d2) / 1000 / 60);\n\n String.prototype.format = function(o) {\n return this.replace('{0}', o);\n }\n\n if (total == 0) {\n var text = texts.justNow;\n } else if (total < 90) {\n var text = texts.xMinutesAgo.format(total);\n } else if (total < 1440) { // One day\n var text = texts.xHoursAgo.format(Math.round(total/60));\n } else if (total < 20160) { // 14 days\n var text = texts.xDaysAgo.format(Math.round(total / 1440));\n } else if (total < 43200) { // 30 days\n var text = texts.xWeeksAgo.format(Math.round(total / 10080));\n } else if (total < 1036800) { // 24 months\n var text = texts.xMonthsAgo.format(Math.round(total / 43200));\n } else { // 24 months+\n var text = texts.xYearsAgo.format(Math.round(total / 525600));\n }\n\n return text;\n}\n\njSuites.calendar.prettifyAll = function() {\n var elements = document.querySelectorAll('.prettydate');\n for (var i = 0; i < elements.length; i++) {\n if (elements[i].getAttribute('data-date')) {\n elements[i].innerHTML = jSuites.calendar.prettify(elements[i].getAttribute('data-date'));\n } else {\n elements[i].setAttribute('data-date', elements[i].innerHTML);\n elements[i].innerHTML = jSuites.calendar.prettify(elements[i].innerHTML);\n }\n }\n}\n\njSuites.calendar.now = function(date, dateOnly) {\n if (! date) {\n var date = new Date();\n }\n var y = date.getFullYear();\n var m = date.getMonth() + 1;\n var d = date.getDate();\n var h = date.getHours();\n var i = date.getMinutes();\n var s = date.getSeconds();\n\n // Two digits\n var two = function(value) {\n value = '' + value;\n if (value.length == 1) {\n value = '0' + value;\n }\n return value;\n }\n\n if (dateOnly == true) {\n return two(y) + '-' + two(m) + '-' + two(d);\n } else {\n return two(y) + '-' + two(m) + '-' + two(d) + ' ' + two(h) + ':' + two(i) + ':' + two(s);\n }\n}\n\n// Helper to extract date from a string\njSuites.calendar.extractDateFromString = function(date, format) {\n var v1 = '' + date;\n var v2 = format.replace(/[0-9]/g,'');\n\n var test = 1;\n\n // Get year\n var y = v2.search(\"YYYY\");\n y = v1.substr(y,4);\n if (parseInt(y) != y) {\n test = 0;\n }\n\n // Get month\n var m = v2.search(\"MM\");\n m = v1.substr(m,2);\n if (parseInt(m) != m || d > 12) {\n test = 0;\n }\n\n // Get day\n var d = v2.search(\"DD\");\n d = v1.substr(d,2);\n if (parseInt(d) != d || d > 31) {\n test = 0;\n }\n\n // Get hour\n var h = v2.search(\"HH\");\n if (h >= 0) {\n h = v1.substr(h,2);\n if (! parseInt(h) || h > 23) {\n h = '00';\n }\n } else {\n h = '00';\n }\n \n // Get minutes\n var i = v2.search(\"MI\");\n if (i >= 0) {\n i = v1.substr(i,2);\n if (! parseInt(i) || i > 59) {\n i = '00';\n }\n } else {\n i = '00';\n }\n\n // Get seconds\n var s = v2.search(\"SS\");\n if (s >= 0) {\n s = v1.substr(s,2);\n if (! parseInt(s) || s > 59) {\n s = '00';\n }\n } else {\n s = '00';\n }\n\n if (test == 1 && date.length == v2.length) {\n // Update source\n var data = y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s;\n\n return data;\n }\n\n return '';\n}\n\n// Helper to convert date into string\njSuites.calendar.getDateString = function(value, format) {\n // Default calendar\n if (! format) {\n var format = 'DD/MM/YYYY';\n }\n\n if (value) {\n var d = ''+value;\n d = d.split(' ');\n\n var h = '';\n var m = '';\n var s = '';\n\n if (d[1]) {\n h = d[1].split(':');\n m = h[1] ? h[1] : '00';\n s = h[2] ? h[2] : '00';\n h = h[0] ? h[0] : '00';\n } else {\n h = '00';\n m = '00';\n s = '00';\n }\n\n d = d[0].split('-');\n\n if (d[0] && d[1] && d[2] && d[0] > 0 && d[1] > 0 && d[1] < 13 && d[2] > 0 && d[2] < 32) {\n var calendar = new Date(d[0], d[1]-1, d[2]);\n var weekday = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');\n var months = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');\n\n d[1] = (d[1].length < 2 ? '0' : '') + d[1];\n d[2] = (d[2].length < 2 ? '0' : '') + d[2];\n h = (h.length < 2 ? '0' : '') + h;\n m = (m.length < 2 ? '0' : '') + m;\n s = (s.length < 2 ? '0' : '') + s;\n\n value = format;\n value = value.replace('WD', weekday[calendar.getDay()]);\n value = value.replace('DD', d[2]);\n value = value.replace('MM', d[1]);\n value = value.replace('YYYY', d[0]);\n value = value.replace('YY', d[0].substring(2,4));\n value = value.replace('MON', months[parseInt(d[1])-1].toUpperCase());\n\n if (h) {\n value = value.replace('HH24', h);\n }\n\n if (h > 12) {\n value = value.replace('HH12', h - 12);\n value = value.replace('HH', h);\n } else {\n value = value.replace('HH12', h);\n value = value.replace('HH', h);\n }\n\n value = value.replace('MI', m);\n value = value.replace('MM', m);\n value = value.replace('SS', s);\n } else {\n value = '';\n }\n }\n\n return value;\n}\n\njSuites.calendar.isOpen = function(e) {\n if (jSuites.calendar.current) {\n if (! e.target.className || e.target.className.indexOf('jcalendar') == -1) {\n jSuites.calendar.current.close(false, false);\n }\n }\n}\n\r\n\r\njSuites.color = (function(el, options) {\n var obj = {};\n obj.options = {};\n obj.values = [];\n\n // Global container\n if (! jSuites.color.current) {\n jSuites.color.current = null;\n }\n\n /**\n * @typedef {Object} defaults\n * @property {(string|Array)} value - Initial value of the compontent\n * @property {string} placeholder - The default instruction text on the element\n * @property {requestCallback} onchange - Method to be execute after any changes on the element\n * @property {requestCallback} onclose - Method to be execute when the element is closed\n */\n var defaults = {\n placeholder: '',\n value: null,\n onclose: null,\n onchange: null,\n closeOnChange: true,\n palette: null,\n };\n\n // Loop through our object\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n if (! obj.options.palette) {\n // Default pallete\n obj.options.palette = [\n [ \"#ffebee\", \"#fce4ec\", \"#f3e5f5\", \"#e8eaf6\", \"#e3f2fd\", \"#e0f7fa\", \"#e0f2f1\", \"#e8f5e9\", \"#f1f8e9\", \"#f9fbe7\", \"#fffde7\", \"#fff8e1\", \"#fff3e0\", \"#fbe9e7\", \"#efebe9\", \"#fafafa\", \"#eceff1\" ],\n [ \"#ffcdd2\", \"#f8bbd0\", \"#e1bee7\", \"#c5cae9\", \"#bbdefb\", \"#b2ebf2\", \"#b2dfdb\", \"#c8e6c9\", \"#dcedc8\", \"#f0f4c3\", \"#fff9c4\", \"#ffecb3\", \"#ffe0b2\", \"#ffccbc\", \"#d7ccc8\", \"#f5f5f5\", \"#cfd8dc\" ],\n [ \"#ef9a9a\", \"#f48fb1\", \"#ce93d8\", \"#9fa8da\", \"#90caf9\", \"#80deea\", \"#80cbc4\", \"#a5d6a7\", \"#c5e1a5\", \"#e6ee9c\", \"#fff59d\", \"#ffe082\", \"#ffcc80\", \"#ffab91\", \"#bcaaa4\", \"#eeeeee\", \"#b0bec5\" ],\n [ \"#e57373\", \"#f06292\", \"#ba68c8\", \"#7986cb\", \"#64b5f6\", \"#4dd0e1\", \"#4db6ac\", \"#81c784\", \"#aed581\", \"#dce775\", \"#fff176\", \"#ffd54f\", \"#ffb74d\", \"#ff8a65\", \"#a1887f\", \"#e0e0e0\", \"#90a4ae\" ],\n [ \"#ef5350\", \"#ec407a\", \"#ab47bc\", \"#5c6bc0\", \"#42a5f5\", \"#26c6da\", \"#26a69a\", \"#66bb6a\", \"#9ccc65\", \"#d4e157\", \"#ffee58\", \"#ffca28\", \"#ffa726\", \"#ff7043\", \"#8d6e63\", \"#bdbdbd\", \"#78909c\" ],\n [ \"#f44336\", \"#e91e63\", \"#9c27b0\", \"#3f51b5\", \"#2196f3\", \"#00bcd4\", \"#009688\", \"#4caf50\", \"#8bc34a\", \"#cddc39\", \"#ffeb3b\", \"#ffc107\", \"#ff9800\", \"#ff5722\", \"#795548\", \"#9e9e9e\", \"#607d8b\" ],\n [ \"#e53935\", \"#d81b60\", \"#8e24aa\", \"#3949ab\", \"#1e88e5\", \"#00acc1\", \"#00897b\", \"#43a047\", \"#7cb342\", \"#c0ca33\", \"#fdd835\", \"#ffb300\", \"#fb8c00\", \"#f4511e\", \"#6d4c41\", \"#757575\", \"#546e7a\" ],\n [ \"#d32f2f\", \"#c2185b\", \"#7b1fa2\", \"#303f9f\", \"#1976d2\", \"#0097a7\", \"#00796b\", \"#388e3c\", \"#689f38\", \"#afb42b\", \"#fbc02d\", \"#ffa000\", \"#f57c00\", \"#e64a19\", \"#5d4037\", \"#616161\", \"#455a64\" ],\n [ \"#c62828\", \"#ad1457\", \"#6a1b9a\", \"#283593\", \"#1565c0\", \"#00838f\", \"#00695c\", \"#2e7d32\", \"#558b2f\", \"#9e9d24\", \"#f9a825\", \"#ff8f00\", \"#ef6c00\", \"#d84315\", \"#4e342e\", \"#424242\", \"#37474f\" ],\n [ \"#b71c1c\", \"#880e4f\", \"#4a148c\", \"#1a237e\", \"#0d47a1\", \"#006064\", \"#004d40\", \"#1b5e20\", \"#33691e\", \"#827717\", \"#f57f17\", \"#ff6f00\", \"#e65100\", \"#bf360c\", \"#3e2723\", \"#212121\", \"#263238\" ],\n ];\n }\n\n // Value\n if (obj.options.value) {\n el.value = obj.options.value;\n }\n\n // Table container\n var container = document.createElement('div');\n container.className = 'jcolor';\n\n // Table container\n var backdrop = document.createElement('div');\n backdrop.className = 'jcolor-backdrop';\n container.appendChild(backdrop);\n\n // Content\n var content = document.createElement('div');\n content.className = 'jcolor-content';\n\n // Close button\n var closeButton = document.createElement('div');\n closeButton.className = 'jcolor-close';\n closeButton.innerHTML = 'Done';\n closeButton.onclick = function() {\n obj.close();\n }\n content.appendChild(closeButton);\n\n // Table pallete\n var table = document.createElement('table');\n table.setAttribute('cellpadding', '7');\n table.setAttribute('cellspacing', '0');\n\n for (var j = 0; j < obj.options.palette.length; j++) {\n var tr = document.createElement('tr');\n for (var i = 0; i < obj.options.palette[j].length; i++) {\n var td = document.createElement('td');\n td.style.backgroundColor = obj.options.palette[j][i];\n td.setAttribute('data-value', obj.options.palette[j][i]);\n td.innerHTML = '';\n tr.appendChild(td);\n\n // Selected color\n if (obj.options.value == obj.options.palette[j][i]) {\n td.classList.add('jcolor-selected');\n }\n\n // Possible values\n obj.values[obj.options.palette[j][i]] = td;\n }\n table.appendChild(tr);\n }\n\n /**\n * Open color pallete\n */\n obj.open = function() {\n if (jSuites.color.current) {\n if (jSuites.color.current != obj) {\n jSuites.color.current.close();\n }\n }\n\n if (! jSuites.color.current) {\n // Persist element\n jSuites.color.current = obj;\n // Show colorpicker\n container.classList.add('jcolor-focus');\n\n const rectContent = content.getBoundingClientRect();\n\n if (jSuites.getWindowWidth() < 800) {\n content.style.top = '';\n content.classList.add('jcolor-fullscreen');\n jSuites.animation.slideBottom(content, 1);\n backdrop.style.display = 'block';\n } else {\n if (content.classList.contains('jcolor-fullscreen')) {\n content.classList.remove('jcolor-fullscreen');\n backdrop.style.display = '';\n }\n\n const rect = el.getBoundingClientRect();\n\n if (window.innerHeight < rect.bottom + rectContent.height) {\n content.style.top = -1 * (rectContent.height + rect.height + 2) + 'px';\n } else {\n content.style.top = '2px';\n }\n }\n\n container.focus();\n }\n }\n\n /**\n * Close color pallete\n */\n obj.close = function(ignoreEvents) {\n if (jSuites.color.current) {\n jSuites.color.current = null;\n if (! ignoreEvents && typeof(obj.options.onclose) == 'function') {\n obj.options.onclose(el);\n }\n container.classList.remove('jcolor-focus');\n }\n\n // Make sure backdrop is hidden\n backdrop.style.display = '';\n\n return obj.options.value;\n }\n\n /**\n * Set value\n */\n obj.setValue = function(color) {\n if (color) {\n el.value = color;\n obj.options.value = color;\n }\n\n // Remove current selecded mark\n var selected = container.querySelector('.jcolor-selected');\n if (selected) {\n selected.classList.remove('jcolor-selected');\n }\n\n // Mark cell as selected\n if (obj.values[color]) {\n obj.values[color].classList.add('jcolor-selected');\n }\n\n // Onchange\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(el, color);\n }\n\n if (obj.options.closeOnChange == true) {\n obj.close();\n }\n }\n\n /**\n * Get value\n */\n obj.getValue = function() {\n return obj.options.value;\n }\n\n /**\n * If element is focus open the picker\n */\n el.addEventListener(\"focus\", function(e) {\n obj.open();\n });\n\n el.addEventListener(\"mousedown\", function(e) {\n if (! jSuites.color.current) {\n setTimeout(function() {\n obj.open();\n e.preventDefault();\n }, 200);\n }\n });\n\n // Select color\n container.addEventListener(\"mouseup\", function(e) {\n if (e.target.tagName == 'TD') {\n jSuites.color.current.setValue(e.target.getAttribute('data-value'));\n\n if (jSuites.color.current) {\n jSuites.color.current.close();\n }\n }\n });\n\n // Close controller\n document.addEventListener(\"mousedown\", function(e) {\n if (jSuites.color.current) {\n var element = jSuites.findElement(e.target, 'jcolor');\n if (! element) {\n jSuites.color.current.close();\n }\n }\n });\n\n // Possible to focus the container\n container.setAttribute('tabindex', '900');\n\n // Placeholder\n if (obj.options.placeholder) {\n el.setAttribute('placeholder', obj.options.placeholder);\n }\n\n // Append to the table\n content.appendChild(table);\n container.appendChild(content);\n\n // Insert picker after the element\n if (el.tagName == 'INPUT') {\n el.parentNode.insertBefore(container, el.nextSibling);\n } else {\n el.appendChild(container);\n }\n\n // Keep object available from the node\n el.color = obj;\n\n return obj;\n});\n\r\n\r\njSuites.contextmenu = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // Default configuration\n var defaults = {\n items: null,\n onclick: null,\n };\n\n // Loop through our object\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Class definition\n el.classList.add('jcontextmenu');\n // Focusable\n el.setAttribute('tabindex', '900');\n\n /**\n * Open contextmenu\n */\n obj.open = function(e, items) {\n if (items) {\n // Update content\n obj.options.items = items;\n // Create items\n obj.create(items);\n }\n\n // Coordinates\n if ((obj.options.items && obj.options.items.length > 0) || el.children.length) {\n if (e.target) {\n var x = e.clientX;\n var y = e.clientY;\n } else {\n var x = e.x;\n var y = e.y;\n }\n\n el.classList.add('jcontextmenu-focus');\n el.focus();\n\n const rect = el.getBoundingClientRect();\n\n if (window.innerHeight < y + rect.height) {\n el.style.top = (y - rect.height) + 'px';\n } else {\n el.style.top = y + 'px';\n }\n\n if (window.innerWidth < x + rect.width) {\n if (x - rect.width > 0) {\n el.style.left = (x - rect.width) + 'px';\n } else {\n el.style.left = '10px';\n }\n } else {\n el.style.left = x + 'px';\n }\n }\n }\n\n /**\n * Close menu\n */\n obj.close = function() {\n if (el.classList.contains('jcontextmenu-focus')) {\n el.classList.remove('jcontextmenu-focus');\n }\n }\n\n /**\n * Create items based on the declared objectd\n * @param {object} items - List of object\n */\n obj.create = function(items) {\n // Update content\n el.innerHTML = '';\n\n // Append items\n for (var i = 0; i < items.length; i++) {\n if (items[i].type && (items[i].type == 'line' || items[i].type == 'divisor')) {\n var itemContainer = document.createElement('hr');\n } else {\n var itemContainer = document.createElement('div');\n var itemText = document.createElement('a');\n itemText.innerHTML = items[i].title;\n\n if (items[i].disabled) {\n itemContainer.className = 'jcontextmenu-disabled';\n } else if (items[i].onclick) {\n itemContainer.method = items[i].onclick;\n itemContainer.addEventListener(\"mouseup\", function() {\n // Execute method\n this.method(this);\n });\n }\n itemContainer.appendChild(itemText);\n\n if (items[i].shortcut) {\n var itemShortCut = document.createElement('span');\n itemShortCut.innerHTML = items[i].shortcut;\n itemContainer.appendChild(itemShortCut);\n }\n }\n\n el.appendChild(itemContainer);\n }\n }\n\n if (typeof(obj.options.onclick) == 'function') {\n el.addEventListener('click', function(e) {\n obj.options.onclick(obj);\n });\n }\n\n // Create items\n if (obj.options.items) {\n obj.create(obj.options.items);\n }\n\n el.addEventListener('blur', function(e) {\n setTimeout(function() {\n obj.close();\n }, 120);\n });\n\n if (! jSuites.contextmenu.hasEvents) {\n window.addEventListener(\"mousewheel\", function() {\n obj.close();\n });\n\n document.addEventListener(\"contextmenu\", function(e) {\n var id = jSuites.contextmenu.getElement(e.target);\n if (id) {\n var element = document.querySelector('#' + id);\n if (! element) {\n console.error('JSUITES: Contextmenu id not found');\n } else {\n element.contextmenu.open(e);\n e.preventDefault();\n }\n }\n });\n\n jSuites.contextmenu.hasEvents = true;\n }\n\n el.contextmenu = obj;\n\n return obj;\n});\n\njSuites.contextmenu.getElement = function(element) {\n var foundId = 0;\n\n function path (element) {\n if (element.parentNode && element.getAttribute('aria-contextmenu-id')) {\n foundId = element.getAttribute('aria-contextmenu-id')\n } else {\n if (element.parentNode) {\n path(element.parentNode);\n }\n }\n }\n\n path(element);\n\n return foundId;\n}\r\n\r\njSuites.dropdown = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // If the element is a SELECT tag, create a configuration object\n if (el.tagName == 'SELECT') {\n var ret = jSuites.dropdown.extractFromDom(el, options);\n el = ret.el;\n options = ret.options;\n }\n\n // Default configuration\n var defaults = {\n url: null,\n data: [],\n multiple: false,\n autocomplete: false,\n remoteSearch: false,\n lazyLoading: false,\n type: null,\n width: null,\n maxWidth: null,\n opened: false,\n value: null,\n placeholder: '',\n position: false,\n onchange: null,\n onload: null,\n onopen: null,\n onclose: null,\n onfocus: null,\n onblur: null,\n };\n\n // Loop through our object\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Global container\n if (! jSuites.dropdown.current) {\n jSuites.dropdown.current = null;\n }\n\n // Force autocomplete search\n if (obj.options.remoteSearch == true) {\n obj.options.autocomplete = true;\n }\n\n // Containers\n obj.items = [];\n obj.groups = [];\n obj.value = [];\n\n // Search options\n obj.search = '';\n obj.results = null;\n obj.numOfItems = 0;\n\n // Create dropdown\n el.classList.add('jdropdown');\n \n if (obj.options.type == 'searchbar') {\n el.classList.add('jdropdown-searchbar');\n } else if (obj.options.type == 'list') {\n el.classList.add('jdropdown-list');\n } else if (obj.options.type == 'picker') {\n el.classList.add('jdropdown-picker');\n } else {\n if (jSuites.getWindowWidth() < 800) {\n el.classList.add('jdropdown-picker');\n obj.options.type = 'picker';\n } else {\n if (obj.options.width) {\n el.style.width = obj.options.width;\n el.style.minWidth = obj.options.width;\n }\n el.classList.add('jdropdown-default');\n obj.options.type = 'default';\n }\n }\n\n // Header container\n var containerHeader = document.createElement('div');\n containerHeader.className = 'jdropdown-container-header';\n\n // Header\n obj.header = document.createElement('input');\n obj.header.className = 'jdropdown-header';\n obj.header.setAttribute('autocomplete', 'off');\n if (typeof(obj.options.onfocus) == 'function') {\n obj.header.onfocus = function() {\n obj.options.onfocus(el);\n }\n }\n if (typeof(obj.options.onblur) == 'function') {\n obj.header.onblur = function() {\n obj.options.onblur(el);\n }\n }\n\n // Container\n var container = document.createElement('div');\n container.className = 'jdropdown-container';\n\n // Dropdown content\n var content = document.createElement('div');\n content.className = 'jdropdown-content';\n\n // New items\n var newOptions = document.createElement('div');\n newOptions.className = 'jdropdown-create-option';\n newOptions.innerHTML = 'New option';\n //container.appendChild(newOptions);\n\n // Close button\n var closeButton = document.createElement('div');\n closeButton.className = 'jdropdown-close';\n closeButton.innerHTML = 'Done';\n\n // Reset button\n var resetButton = document.createElement('div');\n resetButton.className = 'jdropdown-reset';\n resetButton.innerHTML = 'x';\n resetButton.onclick = function() {\n obj.reset();\n obj.close();\n }\n\n // Create backdrop\n var backdrop = document.createElement('div');\n backdrop.className = 'jdropdown-backdrop';\n\n // Autocomplete\n if (obj.options.autocomplete == true) {\n el.setAttribute('data-autocomplete', true);\n\n // Handler\n var keyTimer = null;\n obj.header.addEventListener('keyup', function(e) {\n if (! keyTimer) {\n if (obj.search != obj.header.value.trim()) {\n keyTimer = setTimeout(function() {\n obj.find(obj.header.value.trim());\n keyTimer = null;\n }, 400);\n }\n\n if (! el.classList.contains('jdropdown-focus')) {\n obj.open();\n }\n }\n });\n } else {\n obj.header.setAttribute('readonly', 'readonly');\n }\n\n // Place holder\n if (! obj.options.placeholder && el.getAttribute('placeholder')) {\n obj.options.placeholder = el.getAttribute('placeholder');\n }\n\n if (obj.options.placeholder) {\n obj.header.setAttribute('placeholder', obj.options.placeholder);\n }\n\n // Append elements\n containerHeader.appendChild(obj.header);\n if (obj.options.type == 'searchbar') {\n containerHeader.appendChild(closeButton);\n } else {\n container.appendChild(closeButton);\n }\n if (! obj.options.type || obj.options.type == 'default') {\n //containerHeader.appendChild(resetButton);\n }\n container.appendChild(content);\n el.appendChild(containerHeader);\n el.appendChild(container);\n el.appendChild(backdrop);\n\n var filter = function(a) {\n return a.filter(function(v) {\n return v;\n });\n }\n\n /**\n * Init dropdown\n */\n obj.init = function() {\n if (obj.options.url && ! obj.options.data.length) {\n jSuites.ajax({\n url: obj.options.url,\n method: 'GET',\n dataType: 'json',\n success: function(data) {\n if (data) {\n // Set data\n obj.setData(data);\n // Set value\n if (obj.options.value != null) {\n obj.setValue(obj.options.value);\n }\n // Onload method\n if (typeof(obj.options.onload) == 'function') {\n obj.options.onload(el, obj, data);\n }\n }\n }\n });\n } else {\n var data = [];\n if (obj.options.data.length) {\n for (var j = 0; j < obj.options.data.length; j++) {\n data.push(obj.options.data[j]); \n }\n }\n // Set data\n obj.setData(data);\n // Set value\n if (obj.options.value != null) {\n obj.setValue(obj.options.value);\n }\n // Onload\n if (typeof(obj.options.onload) == 'function') {\n obj.options.onload(el, obj, obj.options.data);\n }\n }\n\n // Open dropdown\n if (obj.options.opened == true) {\n obj.open();\n }\n }\n\n obj.getUrl = function() {\n return obj.options.url;\n }\n\n obj.setUrl = function(url) {\n obj.options.url = url;\n\n jSuites.ajax({\n url: obj.options.url,\n method: 'GET',\n dataType: 'json',\n success: function(data) {\n obj.setData(data);\n }\n });\n }\n\n /**\n * Create a new item\n */\n obj.createItem = function(data, group) {\n var text = data.text || '';\n if (! text && data.name) {\n text = data.name;\n }\n if (! text.trim()) {\n text = ' ';\n }\n var value = data.value || '';\n if (! value && data.id) {\n value = data.id;\n }\n // Create item\n var item = {};\n item.element = document.createElement('div');\n item.element.className = 'jdropdown-item';\n item.element.indexValue = obj.items.length;\n item.value = value;\n item.text = text;\n item.textLowerCase = item.text.toLowerCase();\n\n // Id\n if (data.id) {\n item.element.setAttribute('id', data.id);\n }\n\n // Group reference\n if (group) {\n item.group = group;\n }\n\n // Image\n if (data.image) {\n var image = document.createElement('img');\n image.className = 'jdropdown-image';\n image.src = data.image;\n if (! data.title) {\n image.classList.add('jdropdown-image-small');\n }\n item.element.appendChild(image);\n }\n\n // Set content\n var node = document.createElement('div');\n node.className = 'jdropdown-description';\n node.innerHTML = text || ' ';\n\n // Title\n if (data.title) {\n var title = document.createElement('div');\n title.className = 'jdropdown-title';\n title.innerHTML = data.title;\n node.appendChild(title);\n }\n\n // Value\n if (obj.value && obj.value[data.value]) {\n item.element.classList.add('jdropdown-selected');\n item.selected = true;\n }\n\n // Keep DOM accessible\n obj.items.push(item);\n\n // Add node to item\n item.element.appendChild(node);\n\n return item;\n }\n\n obj.appendData = function(data) {\n // Create elements\n if (data.length) {\n // Reset counter\n obj.numOfItems = 0;\n\n // Helpers\n var items = [];\n var groups = [];\n\n // Prepare data\n for (var i = 0; i < data.length; i++) {\n // Process groups\n if (data[i].group) {\n if (! groups[data[i].group]) {\n groups[data[i].group] = [];\n }\n groups[data[i].group].push(i);\n } else {\n items.push(i);\n }\n }\n\n // Groups\n var groupNames = Object.keys(groups);\n\n // Append groups in case exists\n if (groupNames.length > 0) {\n for (var i = 0; i < groupNames.length; i++) {\n // Group container\n var group = document.createElement('div');\n group.className = 'jdropdown-group';\n // Group name\n var groupName = document.createElement('div');\n groupName.className = 'jdropdown-group-name';\n groupName.innerHTML = groupNames[i];\n // Group arrow\n var groupArrow = document.createElement('i');\n groupArrow.className = 'jdropdown-group-arrow jdropdown-group-arrow-down';\n groupName.appendChild(groupArrow);\n // Group items\n var groupContent = document.createElement('div');\n groupContent.className = 'jdropdown-group-items';\n for (var j = 0; j < groups[groupNames[i]].length; j++) {\n var item = obj.createItem(data[groups[groupNames[i]][j]], group);\n\n if (obj.options.lazyLoading == false || obj.numOfItems < 200) {\n groupContent.appendChild(item.element);\n obj.numOfItems++;\n }\n }\n // Group itens\n group.appendChild(groupName);\n group.appendChild(groupArrow);\n group.appendChild(groupContent);\n // Keep group DOM\n obj.groups.push(group);\n // Only add to the screen if children on the group\n if (groupContent.children.length > 0) {\n // Add DOM to the content\n content.appendChild(group);\n }\n }\n }\n\n if (items.length) {\n for (var i = 0; i < items.length; i++) {\n var item = obj.createItem(data[items[i]]);\n if (obj.options.lazyLoading == false || obj.numOfItems < 200) {\n content.appendChild(item.element);\n obj.numOfItems++;\n }\n }\n }\n }\n }\n\n obj.setData = function(data) {\n // Prepare data\n if (data.length) {\n for (var i = 0; i < data.length; i++) {\n // Compatibility\n if (typeof(data[i]) != 'object') {\n // Correct format\n data[i] = {\n value: data[i],\n text: data[i]\n }\n }\n }\n\n // Make sure the content container is blank\n content.innerHTML = '';\n\n // Reset\n obj.reset();\n\n // Reset items\n obj.items = [];\n\n // Append data\n obj.appendData(data);\n }\n\n // Update data\n obj.options.data = data;\n }\n\n /**\n * Get position of the item\n */\n obj.getPosition = function(value) {\n for (var i = 0; i < obj.items.length; i++) {\n if (obj.items[i].value == value) {\n return i;\n }\n }\n\n return 0;\n }\n\n /**\n * Get dropdown current text\n */\n obj.getText = function(asArray) {\n var v = [];\n var k = Object.keys(obj.value);\n for (var i = 0; i < k.length; i++) {\n v.push(obj.value[k[i]]);\n }\n if (asArray) {\n return v;\n } else {\n return v.join('; ');\n }\n }\n\n /**\n * Get dropdown current value\n */\n obj.getValue = function(asArray) {\n if (asArray) {\n return Object.keys(obj.value);\n } else {\n return Object.keys(obj.value).join(';');\n }\n }\n\n obj.setValue = function(value) {\n var setValue = function(item, value) {\n if (obj.items[item].value == value) {\n if (obj.items[item].element) {\n obj.items[item].element.classList.add('jdropdown-selected');\n }\n obj.items[item].selected = true;\n\n // Push to the values container\n obj.value[value] = obj.items[item].text;\n }\n }\n\n // Old value\n var oldValue = obj.getValue();\n\n // Remove selected\n for (var i = 0; i < obj.items.length; i++) {\n if (obj.items[i].selected == true) {\n if (obj.items[i].element) {\n obj.items[i].element.classList.remove('jdropdown-selected')\n }\n obj.items[i].selected = null;\n }\n } \n\n // Reset\n obj.value = [];\n\n // Set values\n if (value != null) {\n if (! Array.isArray(value)) {\n for (var i = 0; i < obj.items.length; i++) {\n setValue(i, value);\n }\n } else {\n for (var i = 0; i < obj.items.length; i++) {\n for (var j = 0; j < value.length; j++) {\n setValue(i, value[j]);\n }\n }\n }\n }\n\n obj.header.value = obj.getText();\n\n // Events\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(el, null, oldValue, obj.getValue());\n }\n }\n\n obj.resetSelected = function() {\n obj.setValue(null);\n } \n\n obj.selectIndex = function(index) {\n // Make sure is a number\n var index = parseInt(index);\n\n // Only select those existing elements\n if (obj.items && obj.items[index]) {\n // Current selection\n var oldValue = obj.getValue();\n\n // Reset cursor to a new position\n obj.setCursor(index, false);\n\n // Behaviour\n if (! obj.options.multiple) {\n // Update value\n if (! obj.value[obj.items[index].value]) {\n obj.setValue(obj.items[index].value);\n } else {\n obj.setValue(null);\n }\n obj.close();\n } else {\n // Toggle option\n if (obj.items[index].selected) {\n obj.items[index].element.classList.remove('jdropdown-selected');\n obj.items[index].selected = false;\n // Remove from selected list\n delete obj.value[obj.items[index].value];\n } else {\n // Select element\n obj.items[index].element.classList.add('jdropdown-selected');\n obj.items[index].selected = true;\n // Add to the selected list\n obj.value[obj.items[index].value] = obj.items[index].text;\n }\n\n // Update labels for multiple dropdown\n if (! obj.options.autocomplete) {\n obj.header.value = obj.getText();\n }\n\n // Events\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(el, index, oldValue, obj.getValue());\n }\n }\n }\n }\n\n obj.selectItem = function(item) {\n if (jSuites.dropdown.current) {\n obj.selectIndex(item.indexValue);\n }\n }\n\n obj.find = function(str) {\n if (obj.search == str.trim()) {\n return false;\n }\n\n // Results\n obj.numOfItems = 0;\n\n // Search term\n obj.search = str;\n\n // Force lowercase\n var str = str ? str.toLowerCase() : '';\n\n // Remove current items in the remote search\n if (obj.options.remoteSearch == true) {\n obj.currentIndex = null;\n obj.results = null;\n jSuites.ajax({\n url: obj.options.url + '?q=' + str,\n method: 'GET',\n dataType: 'json',\n success: function(result) {\n // Reset items\n obj.items = [];\n content.innerHTML = '';\n obj.appendData(result);\n\n if (! result.length) {\n content.style.display = 'none';\n } else {\n content.style.display = '';\n }\n }\n });\n } else {\n // Reset search\n obj.results = [];\n\n // Append options\n for (var i = 0; i < obj.items.length; i++) {\n if (str == null || obj.items[i].textLowerCase.indexOf(str) != -1 || obj.value[obj.items[i].value] != undefined) {\n obj.results.push(obj.items[i]);\n\n if (obj.items[i].group && obj.items[i].group.children[2].children[0]) {\n // Remove all nodes\n while (obj.items[i].group.children[2].children[0]) {\n obj.items[i].group.children[2].removeChild(obj.items[i].group.children[2].children[0]);\n }\n }\n }\n }\n\n // Remove all nodes\n while (content.children[0]) {\n content.removeChild(content.children[0]);\n }\n\n // Show 200 items at once\n var number = obj.results.length || 0;\n\n // Lazyloading\n if (obj.options.lazyLoading == true && number > 200) {\n number = 200;\n }\n\n for (var i = 0; i < number; i++) {\n if (obj.results[i].group) {\n if (! obj.results[i].group.parentNode) {\n content.appendChild(obj.results[i].group);\n }\n obj.results[i].group.children[2].appendChild(obj.results[i].element);\n } else {\n content.appendChild(obj.results[i].element);\n }\n obj.numOfItems++;\n }\n\n if (! obj.results.length) {\n content.style.display = 'none';\n } else {\n content.style.display = '';\n }\n }\n }\n\n obj.open = function() {\n if (jSuites.dropdown.current != el) {\n if (jSuites.dropdown.current) {\n jSuites.dropdown.current.dropdown.close();\n }\n jSuites.dropdown.current = el;\n }\n\n // Focus\n if (! el.classList.contains('jdropdown-focus')) {\n // Add focus\n el.classList.add('jdropdown-focus');\n\n // Animation\n if (jSuites.getWindowWidth() < 800) {\n if (obj.options.type == null || obj.options.type == 'picker') {\n jSuites.animation.slideBottom(container, 1);\n }\n }\n\n // Filter\n if (obj.options.autocomplete == true) {\n obj.header.value = obj.search;\n obj.header.focus();\n }\n\n // Set cursor for the first or first selected element\n var k = Object.keys(obj.value);\n if (k[0]) {\n var cursor = obj.getPosition(k[0]);\n if (cursor) {\n obj.setCursor(cursor);\n }\n }\n\n // Container Size\n if (! obj.options.type || obj.options.type == 'default') {\n const rect = el.getBoundingClientRect();\n const rectContainer = container.getBoundingClientRect();\n\n if (obj.options.position) {\n container.style.position = 'fixed';\n if (window.innerHeight < rect.bottom + rectContainer.height) {\n container.style.top = '';\n container.style.bottom = (window.innerHeight - rect.top ) + 1 + 'px';\n } else {\n container.style.top = rect.bottom + 'px';\n container.style.bottom = '';\n }\n container.style.left = rect.left + 'px';\n } else {\n if (window.innerHeight < rect.bottom + rectContainer.height) {\n container.style.top = '';\n container.style.bottom = rect.height + 1 + 'px';\n } else {\n container.style.top = '';\n container.style.bottom = '';\n }\n }\n\n container.style.minWidth = rect.width + 'px';\n\n if (obj.options.maxWidth) {\n container.style.maxWidth = obj.options.maxWidth;\n }\n\n if (! obj.items.length && obj.options.autocomplete == true) {\n content.style.display = 'none';\n } else {\n content.style.display = '';\n }\n }\n }\n\n // Events\n if (typeof(obj.options.onopen) == 'function') {\n obj.options.onopen(el);\n }\n }\n\n obj.close = function(ignoreEvents) {\n if (jSuites.dropdown.current) {\n // Remove controller\n jSuites.dropdown.current = null\n // Remove cursor\n obj.setCursor();\n // Update labels\n obj.header.value = obj.getText();\n // Events\n if (! ignoreEvents && typeof(obj.options.onclose) == 'function') {\n obj.options.onclose(el);\n }\n // Blur\n if (obj.header.blur) {\n obj.header.blur();\n }\n // Remove focus\n el.classList.remove('jdropdown-focus');\n }\n\n return obj.getValue();\n }\n\n /**\n * Set cursor\n */\n obj.setCursor = function(index, setPosition) {\n // Remove current cursor\n if (obj.currentIndex != null) {\n // Remove visual cursor\n if (obj.items && obj.items[obj.currentIndex]) {\n obj.items[obj.currentIndex].element.classList.remove('jdropdown-cursor');\n }\n }\n\n if (index == undefined) {\n obj.currentIndex = null;\n } else {\n parseInt(index);\n\n obj.items[index].element.classList.add('jdropdown-cursor');\n obj.currentIndex = index;\n\n // Update scroll to the cursor element\n if (setPosition !== false && obj.items[obj.currentIndex].element) {\n var container = content.scrollTop;\n var element = obj.items[obj.currentIndex].element;\n content.scrollTop = element.offsetTop - element.scrollTop + element.clientTop - 95;\n }\n }\n }\n\n // Compatibility\n obj.resetCursor = obj.setCursor;\n obj.updateCursor = obj.setCursor;\n\n /**\n * Reset cursor and selected items\n */\n obj.reset = function() {\n // Reset cursor\n obj.setCursor();\n\n // Reset selected\n obj.setValue(null);\n }\n\n /**\n * First visible item\n */\n obj.firstVisible = function() {\n var newIndex = null;\n for (var i = 0; i < obj.items.length; i++) {\n if (obj.items[i].element.style.display != 'none') {\n newIndex = i;\n break;\n }\n }\n\n if (newIndex == null) {\n return false;\n }\n\n obj.setCursor(newIndex);\n }\n\n /**\n * Navigation\n */\n obj.first = function() {\n var newIndex = null;\n for (var i = obj.currentIndex - 1; i >= 0; i--) {\n if (obj.items && obj.items[i] && obj.items[i].element.style.display != 'none') {\n newIndex = i;\n }\n }\n\n if (newIndex == null) {\n return false;\n }\n\n obj.setCursor(newIndex);\n }\n\n obj.last = function() {\n var newIndex = null;\n for (var i = obj.currentIndex + 1; i < obj.items.length; i++) {\n if (obj.items && obj.items[i] && obj.items[i].element.style.display != 'none') {\n newIndex = i;\n }\n }\n\n if (newIndex == null) {\n return false;\n }\n\n obj.setCursor(newIndex);\n }\n\n obj.next = function() {\n var newIndex = null;\n for (var i = obj.currentIndex + 1; i < obj.items.length; i++) {\n if (obj.items && obj.items[i] && obj.items[i].element.parentNode) {\n newIndex = i;\n break;\n }\n }\n\n if (newIndex == null) {\n return false;\n }\n\n obj.setCursor(newIndex);\n }\n\n obj.prev = function() {\n var newIndex = null;\n for (var i = obj.currentIndex - 1; i >= 0; i--) {\n if (obj.items && obj.items[i] && obj.items[i].element.parentNode) {\n newIndex = i;\n break;\n }\n }\n\n if (newIndex == null) {\n return false;\n }\n\n obj.setCursor(newIndex);\n }\n\n obj.loadUp = function() {\n return false;\n }\n\n obj.loadDown = function() {\n var test = false;\n\n // Search\n if (obj.results) {\n var results = obj.results;\n } else {\n var results = obj.items;\n }\n\n if (results.length > obj.numOfItems) {\n var numberOfItems = obj.numOfItems;\n var number = results.length - numberOfItems;\n if (number > 200) {\n number = 200;\n }\n\n for (var i = numberOfItems; i < numberOfItems + number; i++) {\n if (results[i].group) {\n if (! results[i].group.parentNode) {\n content.appendChild(results[i].group);\n }\n results[i].group.children[2].appendChild(results[i].element);\n } else {\n content.appendChild(results[i].element);\n }\n\n obj.numOfItems++;\n }\n\n // New item added\n test = true;\n }\n\n return test;\n }\n\n if (! jSuites.dropdown.hasEvents) {\n if ('ontouchsend' in document.documentElement === true) {\n document.addEventListener('touchsend', jSuites.dropdown.mouseup);\n } else {\n document.addEventListener('mouseup', jSuites.dropdown.mouseup);\n }\n document.addEventListener('keydown', jSuites.dropdown.onkeydown);\n\n jSuites.dropdown.hasEvents = true;\n }\n\n // Lazyloading\n if (obj.options.lazyLoading == true) {\n jSuites.lazyLoading(content, {\n loadUp: obj.loadUp,\n loadDown: obj.loadDown,\n });\n }\n\n // Start dropdown\n obj.init();\n\n // Keep object available from the node\n el.dropdown = obj;\n\n return obj;\n});\n\njSuites.dropdown.hasEvents = false;\n\njSuites.dropdown.mouseup = function(e) {\n var element = jSuites.findElement(e.target, 'jdropdown');\n if (element) {\n var dropdown = element.dropdown;\n if (e.target.classList.contains('jdropdown-header')) {\n if (element.classList.contains('jdropdown-focus') && element.classList.contains('jdropdown-default')) {\n if (dropdown.options.autocomplete == false) {\n dropdown.close();\n } else {\n var rect = element.getBoundingClientRect();\n\n if (e.changedTouches && e.changedTouches[0]) {\n var x = e.changedTouches[0].clientX;\n var y = e.changedTouches[0].clientY;\n } else {\n var x = e.clientX;\n var y = e.clientY;\n }\n\n if (rect.width - (x - rect.left) < 30) {\n dropdown.close();\n }\n }\n } else {\n dropdown.open();\n }\n } else if (e.target.classList.contains('jdropdown-group-name')) {\n var items = e.target.nextSibling.children;\n if (e.target.nextSibling.style.display != 'none') {\n for (var i = 0; i < items.length; i++) {\n if (items[i].style.display != 'none') {\n dropdown.selectItem(items[i]);\n }\n }\n }\n } else if (e.target.classList.contains('jdropdown-group-arrow')) {\n if (e.target.classList.contains('jdropdown-group-arrow-down')) {\n e.target.classList.remove('jdropdown-group-arrow-down');\n e.target.classList.add('jdropdown-group-arrow-up');\n e.target.parentNode.nextSibling.style.display = 'none';\n } else {\n e.target.classList.remove('jdropdown-group-arrow-up');\n e.target.classList.add('jdropdown-group-arrow-down');\n e.target.parentNode.nextSibling.style.display = '';\n }\n } else if (e.target.classList.contains('jdropdown-item')) {\n dropdown.selectItem(e.target);\n } else if (e.target.classList.contains('jdropdown-image')) {\n dropdown.selectItem(e.target.parentNode);\n } else if (e.target.classList.contains('jdropdown-description')) {\n dropdown.selectItem(e.target.parentNode);\n } else if (e.target.classList.contains('jdropdown-title')) {\n dropdown.selectItem(e.target.parentNode.parentNode);\n } else if (e.target.classList.contains('jdropdown-close') || e.target.classList.contains('jdropdown-backdrop')) {\n dropdown.close();\n }\n\n e.stopPropagation();\n e.preventDefault();\n } else {\n if (jSuites.dropdown.current) {\n jSuites.dropdown.current.dropdown.close();\n }\n }\n}\n\n// Keydown controls\njSuites.dropdown.onkeydown = function(e) {\n if (jSuites.dropdown.current) {\n // Element\n var element = jSuites.dropdown.current.dropdown;\n // Index\n var index = element.currentIndex;\n\n if (! e.shiftKey) {\n if (e.which == 13 || e.which == 27 || e.which == 35 || e.which == 36 || e.which == 38 || e.which == 40) {\n // Move cursor\n if (e.which == 13) {\n element.selectIndex(index);\n } else if (e.which == 38) {\n if (index == null) {\n element.firstVisible();\n } else if (index > 0) {\n element.prev();\n }\n } else if (e.which == 40) {\n if (index == null) {\n element.firstVisible();\n } else if (index + 1 < element.items.length) {\n element.next();\n }\n } else if (e.which == 36) {\n element.first();\n } else if (e.which == 35) {\n element.last();\n } else if (e.which == 27) {\n element.close();\n }\n\n e.stopPropagation();\n e.preventDefault();\n }\n }\n }\n}\n\njSuites.dropdown.extractFromDom = function(el, options) {\n // Keep reference\n var select = el;\n if (! options) {\n options = {};\n }\n // Prepare configuration\n if (el.getAttribute('multiple') && (! options || options.multiple == undefined)) {\n options.multiple = true;\n }\n if (el.getAttribute('placeholder') && (! options || options.placeholder == undefined)) {\n options.placeholder = el.getAttribute('placeholder');\n }\n if (el.getAttribute('data-autocomplete') && (! options || options.autocomplete == undefined)) {\n options.autocomplete = true;\n }\n if (! options || options.width == undefined) {\n options.width = el.offsetWidth;\n }\n if (el.value && (! options || options.value == undefined)) {\n options.value = el.value;\n }\n if (! options || options.data == undefined) {\n options.data = [];\n for (var j = 0; j < el.children.length; j++) {\n if (el.children[j].tagName == 'OPTGROUP') {\n for (var i = 0; i < el.children[j].children.length; i++) {\n options.data.push({\n value: el.children[j].children[i].value,\n text: el.children[j].children[i].innerHTML,\n group: el.children[j].getAttribute('label'),\n });\n }\n } else {\n options.data.push({\n value: el.children[j].value,\n text: el.children[j].innerHTML,\n });\n }\n }\n }\n if (! options || options.onchange == undefined) {\n options.onchange = function(a,b,c,d) {\n if (options.multiple == true) {\n if (obj.items[b].classList.contains('jdropdown-selected')) {\n select.options[b].setAttribute('selected', 'selected');\n } else {\n select.options[b].removeAttribute('selected');\n }\n } else {\n select.value = d;\n }\n }\n }\n // Create DIV\n var div = document.createElement('div');\n el.parentNode.insertBefore(div, el);\n el.style.display = 'none';\n el = div;\n\n return { el:el, options:options };\n}\r\n\r\n/**\n * (c) jTools Text Editor\n * https://github.com/paulhodel/jtools\n *\n * @author: Paul Hodel \n * @description: Inline richtext editor\n */\n\njSuites.editor = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // Default configuration\n var defaults = {\n // Initial HTML content\n value: null,\n // Initial snippet\n snippet: null,\n // Add toolbar\n toolbar: null,\n // Website parser is to read websites and images from cross domain\n remoteParser: null,\n // Parse URL\n parseURL: false,\n // Accept drop files\n dropZone: false,\n dropAsAttachment: false,\n acceptImages: false,\n acceptFiles: false,\n maxFileSize: 5000000, \n // Style\n border: true,\n padding: true,\n maxHeight: null,\n focus: false,\n // Events\n onclick: null,\n onfocus: null,\n onblur: null,\n onload: null,\n onkeyup: null,\n onkeydown: null,\n };\n\n // Loop through our object\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Private controllers\n var imageResize = 0;\n var editorTimer = null;\n var editorAction = null;\n\n // Make sure element is empty\n el.innerHTML = '';\n\n if (typeof(obj.options.onclick) == 'function') {\n el.onclick = function(e) {\n obj.options.onclick(el, obj, e);\n }\n }\n\n // Prepare container\n el.classList.add('jeditor-container');\n\n // Padding\n if (obj.options.padding == true) {\n el.classList.add('jeditor-padding');\n }\n\n // Border\n if (obj.options.border == false) {\n el.style.border = '0px';\n }\n\n // Snippet\n var snippet = document.createElement('div');\n snippet.className = 'jsnippet';\n snippet.setAttribute('contenteditable', false);\n\n // Toolbar\n var toolbar = document.createElement('div');\n toolbar.className = 'jeditor-toolbar';\n\n // Create editor\n var editor = document.createElement('div');\n editor.setAttribute('contenteditable', true);\n editor.setAttribute('spellcheck', false);\n editor.className = 'jeditor';\n\n // Max height\n if (obj.options.maxHeight) {\n editor.style.overflowY = 'auto';\n editor.style.maxHeight = obj.options.maxHeight;\n }\n\n // Set editor initial value\n if (obj.options.value) {\n var value = obj.options.value;\n } else {\n var value = el.innerHTML ? el.innerHTML : ''; \n }\n\n if (! value) {\n var value = '
';\n }\n\n /**\n * Extract images from a HTML string\n */\n var extractImageFromHtml = function(html) {\n // Create temp element\n var div = document.createElement('div');\n div.innerHTML = html;\n\n // Extract images\n var img = div.querySelectorAll('img');\n\n if (img.length) {\n for (var i = 0; i < img.length; i++) {\n obj.addImage(img[i].src);\n }\n }\n }\n\n /**\n * Insert node at caret\n */\n var insertNodeAtCaret = function(newNode) {\n var sel, range;\n\n if (window.getSelection) {\n sel = window.getSelection();\n if (sel.rangeCount) {\n range = sel.getRangeAt(0);\n var selectedText = range.toString();\n range.deleteContents();\n range.insertNode(newNode); \n // move the cursor after element\n range.setStartAfter(newNode);\n range.setEndAfter(newNode); \n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n }\n\n /**\n * Append snippet or thumbs in the editor\n * @Param object data\n */\n var appendElement = function(data) {\n // Reset snippet\n snippet.innerHTML = '';\n\n if (data.image) {\n var div = document.createElement('div');\n div.className = 'jsnippet-image';\n div.setAttribute('data-k', 'image');\n snippet.appendChild(div);\n\n var image = document.createElement('img');\n image.src = data.image;\n div.appendChild(image);\n }\n\n var div = document.createElement('div');\n div.className = 'jsnippet-title';\n div.setAttribute('data-k', 'title');\n div.innerHTML = data.title;\n snippet.appendChild(div);\n\n var div = document.createElement('div');\n div.className = 'jsnippet-description';\n div.setAttribute('data-k', 'description');\n div.innerHTML = data.description;\n snippet.appendChild(div);\n\n var div = document.createElement('div');\n div.className = 'jsnippet-host';\n div.setAttribute('data-k', 'host');\n div.innerHTML = data.host;\n snippet.appendChild(div);\n\n var div = document.createElement('div');\n div.className = 'jsnippet-url';\n div.setAttribute('data-k', 'url');\n div.innerHTML = data.url;\n snippet.appendChild(div);\n\n editor.appendChild(snippet);\n }\n\n var verifyEditor = function() {\n clearTimeout(editorTimer);\n editorTimer = setTimeout(function() {\n var snippet = editor.querySelector('.jsnippet');\n var thumbsContainer = el.querySelector('.jeditor-thumbs-container');\n\n if (! snippet && ! thumbsContainer) {\n var html = editor.innerHTML.replace(/\\n/g, ' ');\n var container = document.createElement('div');\n container.innerHTML = html;\n var thumbsContainer = container.querySelector('.jeditor-thumbs-container');\n if (thumbsContainer) {\n thumbsContainer.remove();\n }\n var text = container.innerText; \n var url = jSuites.editor.detectUrl(text);\n\n if (url) {\n if (url[0].substr(-3) == 'jpg' || url[0].substr(-3) == 'png' || url[0].substr(-3) == 'gif') {\n if (jSuites.editor.getDomain(url[0]) == window.location.hostname) {\n obj.importImage(url[0], '');\n } else {\n obj.importImage(obj.options.remoteParser + url[0], '');\n }\n } else {\n var id = jSuites.editor.youtubeParser(url[0]);\n obj.parseWebsite(url[0], id);\n }\n }\n }\n }, 1000);\n }\n\n obj.parseContent = function() {\n verifyEditor();\n }\n\n obj.parseWebsite = function(url, youtubeId) {\n if (! obj.options.remoteParser) {\n console.log('The remoteParser is not defined');\n } else {\n // Youtube definitions\n if (youtubeId) {\n var url = 'https://www.youtube.com/watch?v=' + youtubeId;\n }\n\n var p = {\n title: '',\n description: '',\n image: '',\n host: url.split('/')[2],\n url: url,\n }\n\n jSuites.ajax({\n url: obj.options.remoteParser + encodeURI(url.trim()),\n method: 'GET',\n dataType: 'json',\n success: function(result) {\n // Get title\n if (result.title) {\n p.title = result.title;\n }\n // Description\n if (result.description) {\n p.description = result.description;\n }\n // Image\n if (result.image) {\n p.image = result.image;\n } else if (result['og:image']) {\n p.image = result['og:image'];\n }\n // Host\n if (result.host) {\n p.host = result.host;\n }\n // Url\n if (result.url) {\n p.url = result.url;\n }\n\n appendElement(p);\n }\n });\n }\n }\n\n /**\n * Set editor value\n */\n obj.setData = function(html) {\n editor.innerHTML = html;\n jSuites.editor.setCursor(editor, true);\n }\n\n obj.getText = function() {\n return editor.innerText;\n }\n\n /**\n * Get editor data\n */\n obj.getData = function(json) {\n if (! json) {\n var data = editor.innerHTML;\n } else {\n var data = {\n content : '',\n }\n\n // Get tag users\n var tagged = editor.querySelectorAll('.post-tag');\n if (tagged.length) {\n data.users = [];\n for (var i = 0; i < tagged.length; i++) {\n var userId = tagged[i].getAttribute('data-user');\n if (userId) {\n data.users.push(userId);\n }\n }\n data.users = data.users.join(',');\n }\n\n if (snippet.innerHTML) {\n var index = 0;\n data.snippet = {};\n for (var i = 0; i < snippet.children.length; i++) {\n // Get key from element\n var key = snippet.children[i].getAttribute('data-k');\n if (key) {\n if (key == 'image') {\n data.snippet.image = snippet.children[i].children[0].getAttribute('src');\n } else {\n data.snippet[key] = snippet.children[i].innerHTML;\n }\n }\n }\n\n snippet.innerHTML = '';\n snippet.remove();\n }\n\n var text = editor.innerHTML;\n text = text.replace(/
/g, \"\\n\");\n text = text.replace(/<\\/div>/g, \"<\\/div>\\n\");\n text = text.replace(/<(?:.|\\n)*?>/gm, \"\");\n data.content = text.trim();\n data = JSON.stringify(data);\n }\n\n return data;\n }\n\n // Reset\n obj.reset = function() {\n editor.innerHTML = '';\n }\n\n obj.addPdf = function(data) {\n if (data.result.substr(0,4) != 'data') {\n console.error('Invalid source');\n } else {\n var canvas = document.createElement('canvas');\n canvas.width = 60;\n canvas.height = 60;\n\n var img = new Image();\n var ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n\n canvas.toBlob(function(blob) {\n var newImage = document.createElement('img');\n newImage.src = window.URL.createObjectURL(blob);\n newImage.setAttribute('data-extension', 'pdf');\n if (data.name) {\n newImage.setAttribute('data-name', data.name);\n }\n if (data.size) {\n newImage.setAttribute('data-size', data.size);\n }\n if (data.date) {\n newImage.setAttribute('data-date', data.date);\n }\n newImage.className = 'jfile pdf';\n\n insertNodeAtCaret(newImage);\n jSuites.files[newImage.src] = data.result.substr(data.result.indexOf(',') + 1);\n });\n }\n }\n\n obj.addImage = function(src, name, size, date) {\n if (src.substr(0,4) != 'data' && ! obj.options.remoteParser) {\n console.error('remoteParser not defined in your initialization');\n } else {\n // This is to process cross domain images\n if (src.substr(0,4) == 'data') {\n var extension = src.split(';')\n extension = extension[0].split('/');\n extension = extension[1];\n } else {\n var extension = src.substr(src.lastIndexOf('.') + 1);\n // Work for cross browsers\n src = obj.options.remoteParser + src;\n }\n\n var img = new Image();\n\n img.onload = function onload() {\n var canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n var ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n\n canvas.toBlob(function(blob) {\n var newImage = document.createElement('img');\n newImage.src = window.URL.createObjectURL(blob);\n newImage.setAttribute('tabindex', '900');\n newImage.setAttribute('data-extension', extension);\n if (name) {\n newImage.setAttribute('data-name', name);\n }\n if (size) {\n newImage.setAttribute('data-size', size);\n }\n if (date) {\n newImage.setAttribute('data-date', date);\n }\n newImage.className = 'jfile';\n var content = canvas.toDataURL();\n insertNodeAtCaret(newImage);\n\n jSuites.files[newImage.src] = content.substr(content.indexOf(',') + 1);\n });\n };\n\n img.src = src;\n }\n }\n\n obj.addFile = function(files) {\n var reader = [];\n\n for (var i = 0; i < files.length; i++) {\n if (files[i].size > obj.options.maxFileSize) {\n alert('The file is too big');\n } else {\n // Only PDF or Images\n var type = files[i].type.split('/');\n\n if (type[0] == 'image') {\n type = 1;\n } else if (type[1] == 'pdf') {\n type = 2;\n } else {\n type = 0;\n }\n\n if (type) {\n // Create file\n reader[i] = new FileReader();\n reader[i].index = i;\n reader[i].type = type;\n reader[i].name = files[i].name;\n reader[i].date = files[i].lastModified;\n reader[i].size = files[i].size;\n reader[i].addEventListener(\"load\", function (data) {\n // Get result\n if (data.target.type == 2) {\n if (obj.options.acceptFiles == true) {\n obj.addPdf(data.target);\n }\n } else {\n obj.addImage(data.target.result, data.target.name, data.total, data.target.lastModified);\n }\n }, false);\n\n reader[i].readAsDataURL(files[i])\n } else {\n alert('The extension is not allowed');\n }\n }\n }\n }\n\n // Destroy\n obj.destroy = function() {\n editor.removeEventListener('mouseup', editorMouseUp);\n editor.removeEventListener('mousedown', editorMouseDown);\n editor.removeEventListener('mousemove', editorMouseMove);\n editor.removeEventListener('keyup', editorKeyUp);\n editor.removeEventListener('keydown', editorKeyDown);\n editor.removeEventListener('dragstart', editorDragStart);\n editor.removeEventListener('dragenter', editorDragEnter);\n editor.removeEventListener('dragover', editorDragOver);\n editor.removeEventListener('drop', editorDrop);\n editor.removeEventListener('paste', editorPaste);\n\n if (typeof(obj.options.onblur) == 'function') {\n editor.removeEventListener('blur', editorBlur);\n }\n if (typeof(obj.options.onfocus) == 'function') {\n editor.removeEventListener('focus', editorFocus);\n }\n\n el.editor = null;\n el.classList.remove('jeditor-container');\n\n toolbar.remove();\n snippet.remove();\n editor.remove();\n }\n\n var isLetter = function (str) {\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;\n return str.match(regex) ? 1 : 0;\n }\n\n // Event handlers\n var editorMouseUp = function(e) {\n editorAction = false;\n }\n\n var editorMouseDown = function(e) {\n var close = function(snippet) {\n var rect = snippet.getBoundingClientRect();\n if (rect.width - (e.clientX - rect.left) < 40 && e.clientY - rect.top < 40) {\n snippet.innerHTML = '';\n snippet.remove();\n }\n }\n\n if (e.target.tagName == 'IMG') {\n if (e.target.style.cursor) {\n var rect = e.target.getBoundingClientRect();\n editorAction = {\n e: e.target,\n x: e.clientX,\n y: e.clientY,\n w: rect.width,\n h: rect.height,\n d: e.target.style.cursor,\n }\n\n if (! e.target.style.width) {\n e.target.style.width = rect.width + 'px';\n }\n\n if (! e.target.style.height) {\n e.target.style.height = rect.height + 'px';\n }\n\n var s = window.getSelection();\n if (s.rangeCount) {\n for (var i = 0; i < s.rangeCount; i++) {\n s.removeRange(s.getRangeAt(i));\n }\n }\n } else {\n editorAction = true;\n }\n } else { \n if (e.target.classList.contains('jsnippet')) {\n close(e.target);\n } else if (e.target.parentNode.classList.contains('jsnippet')) {\n close(e.target.parentNode);\n }\n\n editorAction = true;\n }\n }\n\n var editorMouseMove = function(e) {\n if (e.target.tagName == 'IMG') {\n if (e.target.getAttribute('tabindex')) {\n var rect = e.target.getBoundingClientRect();\n if (e.clientY - rect.top < 5) {\n if (rect.width - (e.clientX - rect.left) < 5) {\n e.target.style.cursor = 'ne-resize';\n } else if (e.clientX - rect.left < 5) {\n e.target.style.cursor = 'nw-resize';\n } else {\n e.target.style.cursor = 'n-resize';\n }\n } else if (rect.height - (e.clientY - rect.top) < 5) {\n if (rect.width - (e.clientX - rect.left) < 5) {\n e.target.style.cursor = 'se-resize';\n } else if (e.clientX - rect.left < 5) {\n e.target.style.cursor = 'sw-resize';\n } else {\n e.target.style.cursor = 's-resize';\n }\n } else if (rect.width - (e.clientX - rect.left) < 5) {\n e.target.style.cursor = 'e-resize';\n } else if (e.clientX - rect.left < 5) {\n e.target.style.cursor = 'w-resize';\n } else {\n e.target.style.cursor = '';\n }\n }\n }\n\n // Move\n if (e.which == 1 && editorAction && editorAction.d) {\n if (editorAction.d == 'e-resize' || editorAction.d == 'ne-resize' || editorAction.d == 'se-resize') {\n editorAction.e.style.width = (editorAction.w + (e.clientX - editorAction.x)) + 'px';\n\n if (e.shiftKey) {\n var newHeight = (e.clientX - editorAction.x) * (editorAction.h / editorAction.w);\n editorAction.e.style.height = editorAction.h + newHeight + 'px';\n } else {\n var newHeight = null;\n }\n }\n\n if (! newHeight) {\n if (editorAction.d == 's-resize' || editorAction.d == 'se-resize' || editorAction.d == 'sw-resize') {\n if (! e.shiftKey) {\n editorAction.e.style.height = editorAction.h + (e.clientY - editorAction.y) + 'px';\n }\n }\n }\n }\n }\n\n var editorKeyUp = function(e) {\n if (! editor.innerHTML) {\n editor.innerHTML = '

';\n }\n\n if (typeof(obj.options.onkeyup) == 'function') { \n obj.options.onkeyup(el, obj, e);\n }\n }\n\n\n var editorKeyDown = function(e) {\n // Check for URL\n if (obj.options.parseURL == true) {\n verifyEditor();\n }\n\n if (typeof(obj.options.onkeydown) == 'function') { \n obj.options.onkeydown(el, obj, e);\n }\n }\n\n var editorPaste = function(e) {\n if (e.clipboardData || e.originalEvent.clipboardData) {\n var html = (e.originalEvent || e).clipboardData.getData('text/html');\n var text = (e.originalEvent || e).clipboardData.getData('text/plain');\n var file = (e.originalEvent || e).clipboardData.files\n } else if (window.clipboardData) {\n var html = window.clipboardData.getData('Html');\n var text = window.clipboardData.getData('Text');\n var file = window.clipboardData.files\n }\n\n if (file.length) {\n // Paste a image from the clipboard\n obj.addFile(file);\n } else {\n // Paste text\n text = text.split('\\r\\n');\n var str = '';\n if (e.target.nodeName == 'DIV' && e.target.classList.contains('jeditor')) {\n for (var i = 0; i < text.length; i++) {\n var tmp = document.createElement('div');\n if (text[i]) {\n tmp.innerHTML = text[i];\n } else {\n tmp.innerHTML = '
';\n }\n e.target.appendChild(tmp);\n }\n } else {\n for (var i = 0; i < text.length; i++) {\n if (text[i]) {\n str += '
' + text[i] + \"
\\r\\n\";\n }\n }\n // Insert text\n document.execCommand('insertHtml', false, str);\n }\n\n // Extra images from the paste\n if (obj.options.acceptImages == true) {\n extractImageFromHtml(html);\n }\n }\n\n e.preventDefault();\n }\n\n var editorDragStart = function(e) {\n if (editorAction && editorAction.e) {\n e.preventDefault();\n }\n }\n\n var editorDragEnter = function(e) {\n if (editorAction || obj.options.dropZone == false) {\n // Do nothing\n } else {\n el.classList.add('jeditor-dragging');\n }\n }\n\n var editorDragOver = function(e) {\n if (editorAction || obj.options.dropZone == false) {\n // Do nothing\n } else {\n if (editorTimer) {\n clearTimeout(editorTimer);\n }\n\n editorTimer = setTimeout(function() {\n el.classList.remove('jeditor-dragging');\n }, 100);\n }\n }\n\n var editorDrop = function(e) {\n if (editorAction || obj.options.dropZone == false) {\n // Do nothing\n } else {\n // Position caret on the drop\n var range = null;\n if (document.caretRangeFromPoint) {\n range=document.caretRangeFromPoint(e.clientX, e.clientY);\n } else if (e.rangeParent) {\n range=document.createRange();\n range.setStart(e.rangeParent,e.rangeOffset);\n }\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n sel.anchorNode.parentNode.focus();\n\n var html = (e.originalEvent || e).dataTransfer.getData('text/html');\n var text = (e.originalEvent || e).dataTransfer.getData('text/plain');\n var file = (e.originalEvent || e).dataTransfer.files;\n \n if (file.length) {\n obj.addFile(file);\n } else if (text) {\n extractImageFromHtml(html);\n }\n\n el.classList.remove('jeditor-dragging');\n e.preventDefault();\n }\n }\n\n var editorBlur = function(e) {\n obj.options.onblur(el, obj, e);\n }\n\n var editorFocus = function(e) {\n obj.options.onfocus(el, obj, e);\n }\n\n editor.addEventListener('mouseup', editorMouseUp);\n editor.addEventListener('mousedown', editorMouseDown);\n editor.addEventListener('mousemove', editorMouseMove);\n editor.addEventListener('keyup', editorKeyUp);\n editor.addEventListener('keydown', editorKeyDown);\n editor.addEventListener('dragstart', editorDragStart);\n editor.addEventListener('dragenter', editorDragEnter);\n editor.addEventListener('dragover', editorDragOver);\n editor.addEventListener('drop', editorDrop);\n editor.addEventListener('paste', editorPaste);\n\n // Blur\n if (typeof(obj.options.onblur) == 'function') {\n editor.addEventListener('blur', editorBlur);\n }\n\n // Focus\n if (typeof(obj.options.onfocus) == 'function') {\n editor.addEventListener('focus', editorFocus);\n }\n\n // Onload\n if (typeof(obj.options.onload) == 'function') {\n obj.options.onload(el, obj, editor);\n }\n\n // Set value to the editor\n editor.innerHTML = value;\n\n // Append editor to the containre\n el.appendChild(editor);\n\n // Snippet\n if (obj.options.snippet) {\n appendElement(obj.options.snippet);\n }\n\n // Default toolbar\n if (obj.options.toolbar == null) {\n obj.options.toolbar = jSuites.editor.getDefaultToolbar();\n }\n\n // Add toolbar\n if (obj.options.toolbar) {\n // Create toolbar\n jSuites.toolbar(toolbar, {\n items: obj.options.toolbar\n });\n // Append to the DOM\n el.appendChild(toolbar);\n }\n\n // Focus to the editor\n if (obj.options.focus) {\n jSuites.editor.setCursor(editor, obj.options.focus == 'initial' ? true : false);\n }\n\n el.editor = obj;\n\n return obj;\n});\n\njSuites.editor.setCursor = function(element, first) {\n element.focus();\n document.execCommand('selectAll');\n var sel = window.getSelection();\n var range = sel.getRangeAt(0);\n if (first == true) {\n var node = range.startContainer;\n var size = 0;\n } else {\n var node = range.endContainer;\n var size = node.length;\n }\n range.setStart(node, size);\n range.setEnd(node, size);\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\njSuites.editor.getDomain = function(url) {\n return url.replace('http://','').replace('https://','').replace('www.','').split(/[/?#]/)[0].split(/:/g)[0];\n}\n\njSuites.editor.detectUrl = function(text) {\n var expression = /(((https?:\\/\\/)|(www\\.))[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|]+)/ig;\n var links = text.match(expression);\n\n if (links) {\n if (links[0].substr(0,3) == 'www') {\n links[0] = 'http://' + links[0];\n }\n }\n\n return links;\n}\n\njSuites.editor.youtubeParser = function(url) {\n var regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*/;\n var match = url.match(regExp);\n\n return (match && match[7].length == 11) ? match[7] : false;\n}\n\njSuites.editor.getDefaultToolbar = function() { \n return [\n {\n content: 'undo',\n onclick: function() {\n document.execCommand('undo');\n }\n },\n {\n content: 'redo',\n onclick: function() {\n document.execCommand('redo');\n }\n },\n {\n type:'divisor'\n },\n {\n content: 'format_bold',\n onclick: function(a,b,c) {\n document.execCommand('bold');\n\n if (document.queryCommandState(\"bold\")) {\n c.classList.add('selected');\n } else {\n c.classList.remove('selected');\n }\n }\n },\n {\n content: 'format_italic',\n onclick: function(a,b,c) {\n document.execCommand('italic');\n\n if (document.queryCommandState(\"italic\")) {\n c.classList.add('selected');\n } else {\n c.classList.remove('selected');\n }\n }\n },\n {\n content: 'format_underline',\n onclick: function(a,b,c) {\n document.execCommand('underline');\n\n if (document.queryCommandState(\"underline\")) {\n c.classList.add('selected');\n } else {\n c.classList.remove('selected');\n }\n }\n },\n {\n type:'divisor'\n },\n {\n content: 'format_list_bulleted',\n onclick: function(a,b,c) {\n document.execCommand('insertUnorderedList');\n\n if (document.queryCommandState(\"insertUnorderedList\")) {\n c.classList.add('selected');\n } else {\n c.classList.remove('selected');\n }\n }\n },\n {\n content: 'format_list_numbered',\n onclick: function(a,b,c) {\n document.execCommand('insertOrderedList');\n\n if (document.queryCommandState(\"insertOrderedList\")) {\n c.classList.add('selected');\n } else {\n c.classList.remove('selected');\n }\n }\n },\n {\n content: 'format_indent_increase',\n onclick: function(a,b,c) {\n document.execCommand('indent', true, null);\n\n if (document.queryCommandState(\"indent\")) {\n c.classList.add('selected');\n } else {\n c.classList.remove('selected');\n }\n }\n },\n {\n content: 'format_indent_decrease',\n onclick: function() {\n document.execCommand('outdent');\n\n if (document.queryCommandState(\"outdent\")) {\n this.classList.add('selected');\n } else {\n this.classList.remove('selected');\n }\n }\n }/*,\n {\n icon: ['format_align_left', 'format_align_right', 'format_align_center'],\n onclick: function() {\n document.execCommand('justifyCenter');\n\n if (document.queryCommandState(\"justifyCenter\")) {\n this.classList.add('selected');\n } else {\n this.classList.remove('selected');\n }\n }\n }\n {\n type:'select',\n items: ['Verdana','Arial','Courier New'],\n onchange: function() {\n }\n },\n {\n type:'select',\n items: ['10px','12px','14px','16px','18px','20px','22px'],\n onchange: function() {\n }\n },\n {\n icon:'format_align_left',\n onclick: function() {\n document.execCommand('JustifyLeft');\n\n if (document.queryCommandState(\"JustifyLeft\")) {\n this.classList.add('selected');\n } else {\n this.classList.remove('selected');\n }\n }\n },\n {\n icon:'format_align_center',\n onclick: function() {\n document.execCommand('justifyCenter');\n\n if (document.queryCommandState(\"justifyCenter\")) {\n this.classList.add('selected');\n } else {\n this.classList.remove('selected');\n }\n }\n },\n {\n icon:'format_align_right',\n onclick: function() {\n document.execCommand('justifyRight');\n\n if (document.queryCommandState(\"justifyRight\")) {\n this.classList.add('selected');\n } else {\n this.classList.remove('selected');\n }\n }\n },\n {\n icon:'format_align_justify',\n onclick: function() {\n document.execCommand('justifyFull');\n\n if (document.queryCommandState(\"justifyFull\")) {\n this.classList.add('selected');\n } else {\n this.classList.remove('selected');\n }\n }\n },\n {\n icon:'format_list_bulleted',\n onclick: function() {\n document.execCommand('insertUnorderedList');\n\n if (document.queryCommandState(\"insertUnorderedList\")) {\n this.classList.add('selected');\n } else {\n this.classList.remove('selected');\n }\n }\n }*/\n ];\n}\n\r\n\r\njSuites.files = (function(element) {\n if (! element) {\n console.error('No element defined in the arguments of your method');\n }\n\n var obj = {};\n obj.files = [];\n obj.get = function() {\n return obj.files;\n }\n obj.set = function() {\n // Get attachments\n var files = element.querySelectorAll('.jfile');\n\n if (files.length > 0) {\n var data = [];\n for (var i = 0; i < files.length; i++) {\n var file = {};\n\n var src = files[i].getAttribute('src');\n\n if (files[i].classList.contains('jremove')) {\n file.remove = 1;\n } else {\n if (src.substr(0,4) == 'data') {\n file.content = src.substr(src.indexOf(',') + 1);\n file.extension = files[i].getAttribute('data-extension');\n } else {\n file.file = src;\n file.extension = files[i].getAttribute('data-extension');\n if (! file.extension) {\n file.extension = src.substr(src.lastIndexOf('.') + 1);\n }\n if (obj.files[file.file]) {\n file.content = obj.files[file.file];\n }\n }\n\n // Optional file information\n if (files[i].getAttribute('data-name')) {\n file.name = files[i].getAttribute('data-name');\n }\n if (files[i].getAttribute('data-file')) {\n file.file = files[i].getAttribute('data-file');\n }\n if (files[i].getAttribute('data-size')) {\n file.size = files[i].getAttribute('data-size');\n }\n if (files[i].getAttribute('data-date')) {\n file.date = files[i].getAttribute('data-date');\n }\n if (files[i].getAttribute('data-cover')) {\n file.cover = files[i].getAttribute('data-cover');\n }\n }\n data[i] = file;\n }\n\n return data;\n }\n }\n\n obj.set();\n\n return obj;\n});\r\n\r\njSuites.form = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // Default configuration\n var defaults = {\n url: null,\n message: 'Are you sure? There are unsaved information in your form',\n ignore: false,\n currentHash: null,\n submitButton:null,\n validations: null,\n onload: null,\n onbeforesave: null,\n onsave: null,\n onerror: function(el, message) {\n jSuites.alert(message);\n }\n };\n\n // Loop through our object\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Validations\n if (! obj.options.validations) {\n obj.options.validations = {};\n }\n\n // submitButton\n if (obj.options.submitButton && obj.options.url) {\n obj.options.submitButton.onclick = function() {\n obj.save();\n }\n }\n\n if (! obj.options.validations.email) {\n obj.options.validations.email = function(data) {\n var reg = new RegExp(/^([\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4})?$/);\n return data && reg.test(data) ? true : false; \n }\n }\n\n if (! obj.options.validations.length) {\n obj.options.validations.length = function(data, element) {\n var len = element.getAttribute('data-length') || 5;\n return (data.length >= len) ? true : false;\n }\n }\n\n if (! obj.options.validations.required) {\n obj.options.validations.required = function(data) {\n return data.trim() ? true : false;\n }\n }\n\n obj.setUrl = function(url) {\n obj.options.url = url;\n }\n\n obj.load = function() {\n jSuites.ajax({\n url: obj.options.url,\n method: 'GET',\n dataType: 'json',\n success: function(data) {\n jSuites.form.setElements(el, data);\n\n if (typeof(obj.options.onload) == 'function') {\n obj.options.onload(el, data);\n }\n }\n });\n }\n\n obj.save = function() {\n var test = obj.validate();\n\n if (test) {\n obj.options.onerror(el, test);\n } else {\n var data = jSuites.form.getElements(el, true);\n\n if (typeof(obj.options.onbeforesave) == 'function') {\n var data = obj.options.onbeforesave(el, data);\n\n if (data === false) {\n console.log('Onbeforesave returned false');\n return; \n }\n }\n\n jSuites.ajax({\n url: obj.options.url,\n method: 'POST',\n dataType: 'json',\n data: data,\n success: function(result) {\n if (typeof(obj.options.onsave) == 'function') {\n obj.options.onsave(el, data, result);\n }\n\n obj.reset();\n }\n });\n }\n }\n\n var addError = function(element) {\n // Add error in the element\n element.classList.add('error');\n // Submit button\n if (obj.options.submitButton) {\n obj.options.submitButton.setAttribute('disabled', true);\n }\n // Return error message\n var error = element.getAttribute('data-error') || 'There is an error in the form';\n element.setAttribute('title', error);\n return error;\n }\n\n var delError = function(element) {\n var error = false;\n // Remove class from this element\n element.classList.remove('error');\n element.removeAttribute('title');\n // Get elements in the form\n var elements = el.querySelectorAll(\"input, select, textarea\");\n // Run all elements \n for (var i = 0; i < elements.length; i++) {\n if (elements[i].getAttribute('data-validation')) {\n if (elements[i].classList.contains('error')) {\n error = true;\n }\n }\n }\n\n if (obj.options.submitButton) {\n if (error) {\n obj.options.submitButton.setAttribute('disabled', true);\n } else {\n obj.options.submitButton.removeAttribute('disabled');\n }\n }\n }\n\n obj.validateElement = function(element) {\n // Test results\n var test = false;\n // Validation\n var validation = element.getAttribute('data-validation');\n // Parse\n if (typeof(obj.options.validations[validation]) == 'function' && ! obj.options.validations[validation](element.value, element)) {\n // Not passed in the test\n test = addError(element);\n } else {\n if (element.classList.contains('error')) {\n delError(element);\n }\n }\n\n return test;\n }\n\n obj.reset = function() {\n // Get elements in the form\n var elements = el.querySelectorAll(\"input, select, textarea\");\n // Run all elements \n for (var i = 0; i < elements.length; i++) {\n if (elements[i].tagName == 'INPUT' && elements[i].type == 'checkbox') {\n elements[i].removeAttribute('checked');\n } else {\n elements[i].value = '';\n }\n }\n }\n\n // Run form validation\n obj.validate = function() {\n var test = [];\n // Get elements in the form\n var elements = el.querySelectorAll(\"input, select, textarea\");\n // Run all elements \n for (var i = 0; i < elements.length; i++) {\n // Required\n if (elements[i].getAttribute('data-validation')) {\n var res = obj.validateElement(elements[i]);\n if (res) {\n test.push(res);\n }\n }\n }\n if (test.length > 0) {\n return test.join('
');\n } else {\n return false;\n }\n }\n\n // Check the form\n obj.getError = function() {\n // Validation\n return obj.validation() ? true : false;\n }\n\n // Return the form hash\n obj.setHash = function() {\n return obj.getHash(jSuites.form.getElements(el));\n }\n\n // Get the form hash\n obj.getHash = function(str) {\n var hash = 0, i, chr;\n\n if (str.length === 0) {\n return hash;\n } else {\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0;\n }\n }\n\n return hash;\n }\n\n // Is there any change in the form since start tracking?\n obj.isChanged = function() {\n var hash = obj.setHash();\n return (obj.options.currentHash != hash);\n }\n\n // Restart tracking\n obj.resetTracker = function() {\n obj.options.currentHash = obj.setHash();\n obj.options.ignore = false;\n }\n\n obj.reset = function() {\n obj.options.currentHash = obj.setHash();\n obj.options.ignore = false;\n }\n\n // Ignore flag\n obj.setIgnore = function(ignoreFlag) {\n obj.options.ignore = ignoreFlag ? true : false;\n }\n\n // Start tracking in one second\n setTimeout(function() {\n obj.options.currentHash = obj.setHash();\n }, 1000);\n\n // Validations\n el.addEventListener(\"keyup\", function(e) {\n if (e.target.getAttribute('data-validation')) {\n obj.validateElement(e.target);\n }\n });\n\n // Alert\n if (! jSuites.form.hasEvents) {\n window.addEventListener(\"beforeunload\", function (e) {\n if (obj.isChanged() && obj.options.ignore == false) {\n var confirmationMessage = obj.options.message? obj.options.message : \"\\o/\";\n\n if (confirmationMessage) {\n if (typeof e == 'undefined') {\n e = window.event;\n }\n\n if (e) {\n e.returnValue = confirmationMessage;\n }\n\n return confirmationMessage;\n } else {\n return void(0);\n }\n }\n });\n\n jSuites.form.hasEvents = true;\n }\n\n el.form = obj;\n\n return obj;\n});\n\n// Get form elements\njSuites.form.getElements = function(el, asArray) {\n var data = {};\n var elements = el.querySelectorAll(\"input, select, textarea\");\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i];\n var name = element.name;\n var value = element.value;\n\n if (name) {\n if (elements[i].type == 'checkbox' || elements[i].type == 'radio') {\n value = elements[i].checked;\n }\n data[name] = value;\n }\n }\n\n return asArray == true ? data : JSON.stringify(data);\n}\n\n//Get form elements\njSuites.form.setElements = function(el, data) {\n var elements = el.querySelectorAll(\"input, select, textarea\");\n\n for (var i = 0; i < elements.length; i++) {\n var name = elements[i].getAttribute('name');\n if (data[name]) {\n elements[i].value = data[name];\n }\n }\n}\n\n// Legacy\njSuites.tracker = jSuites.form;\r\n\r\njSuites.guid = function() {\n var guid = '';\n for (var i = 0; i < 32; i++) {\n guid += Math.floor(Math.random()*0xF).toString(0xF);\n }\n return guid;\n}\n\njSuites.getWindowWidth = function() {\n var w = window,\n d = document,\n e = d.documentElement,\n g = d.getElementsByTagName('body')[0],\n x = w.innerWidth || e.clientWidth || g.clientWidth;\n return x;\n}\n\njSuites.getWindowHeight = function() {\n var w = window,\n d = document,\n e = d.documentElement,\n g = d.getElementsByTagName('body')[0],\n y = w.innerHeight|| e.clientHeight|| g.clientHeight;\n return y;\n}\n\njSuites.getPosition = function(e) {\n if (e.changedTouches && e.changedTouches[0]) {\n var x = e.changedTouches[0].pageX;\n var y = e.changedTouches[0].pageY;\n } else {\n var x = (window.Event) ? e.pageX : e.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);\n var y = (window.Event) ? e.pageY : e.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);\n }\n\n return [ x, y ];\n}\n\njSuites.click = function(el) {\n if (el.click) {\n el.click();\n } else {\n var evt = new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window\n });\n el.dispatchEvent(evt);\n }\n}\n\njSuites.findElement = function(element, condition) {\n var foundElement = false;\n\n function path (element) {\n if (element && ! foundElement) {\n if (typeof(condition) == 'function') {\n foundElement = condition(element)\n } else if (typeof(condition) == 'string') {\n if (element.classList && element.classList.contains(condition)) {\n foundElement = element;\n }\n }\n }\n\n if (element.parentNode && ! foundElement) {\n path(element.parentNode);\n }\n }\n\n path(element);\n\n return foundElement;\n}\n\njSuites.sha512 = (function(str) {\n function int64(msint_32, lsint_32) {\n this.highOrder = msint_32;\n this.lowOrder = lsint_32;\n }\n\n var H = [new int64(0x6a09e667, 0xf3bcc908), new int64(0xbb67ae85, 0x84caa73b),\n new int64(0x3c6ef372, 0xfe94f82b), new int64(0xa54ff53a, 0x5f1d36f1),\n new int64(0x510e527f, 0xade682d1), new int64(0x9b05688c, 0x2b3e6c1f),\n new int64(0x1f83d9ab, 0xfb41bd6b), new int64(0x5be0cd19, 0x137e2179)];\n\n var K = [new int64(0x428a2f98, 0xd728ae22), new int64(0x71374491, 0x23ef65cd),\n new int64(0xb5c0fbcf, 0xec4d3b2f), new int64(0xe9b5dba5, 0x8189dbbc),\n new int64(0x3956c25b, 0xf348b538), new int64(0x59f111f1, 0xb605d019),\n new int64(0x923f82a4, 0xaf194f9b), new int64(0xab1c5ed5, 0xda6d8118),\n new int64(0xd807aa98, 0xa3030242), new int64(0x12835b01, 0x45706fbe),\n new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, 0xd5ffb4e2),\n new int64(0x72be5d74, 0xf27b896f), new int64(0x80deb1fe, 0x3b1696b1),\n new int64(0x9bdc06a7, 0x25c71235), new int64(0xc19bf174, 0xcf692694),\n new int64(0xe49b69c1, 0x9ef14ad2), new int64(0xefbe4786, 0x384f25e3),\n new int64(0x0fc19dc6, 0x8b8cd5b5), new int64(0x240ca1cc, 0x77ac9c65),\n new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),\n new int64(0x5cb0a9dc, 0xbd41fbd4), new int64(0x76f988da, 0x831153b5),\n new int64(0x983e5152, 0xee66dfab), new int64(0xa831c66d, 0x2db43210),\n new int64(0xb00327c8, 0x98fb213f), new int64(0xbf597fc7, 0xbeef0ee4),\n new int64(0xc6e00bf3, 0x3da88fc2), new int64(0xd5a79147, 0x930aa725),\n new int64(0x06ca6351, 0xe003826f), new int64(0x14292967, 0x0a0e6e70),\n new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),\n new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, 0x9d95b3df),\n new int64(0x650a7354, 0x8baf63de), new int64(0x766a0abb, 0x3c77b2a8),\n new int64(0x81c2c92e, 0x47edaee6), new int64(0x92722c85, 0x1482353b),\n new int64(0xa2bfe8a1, 0x4cf10364), new int64(0xa81a664b, 0xbc423001),\n new int64(0xc24b8b70, 0xd0f89791), new int64(0xc76c51a3, 0x0654be30),\n new int64(0xd192e819, 0xd6ef5218), new int64(0xd6990624, 0x5565a910),\n new int64(0xf40e3585, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),\n new int64(0x19a4c116, 0xb8d2d0c8), new int64(0x1e376c08, 0x5141ab53),\n new int64(0x2748774c, 0xdf8eeb99), new int64(0x34b0bcb5, 0xe19b48a8),\n new int64(0x391c0cb3, 0xc5c95a63), new int64(0x4ed8aa4a, 0xe3418acb),\n new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, 0xd6b2b8a3),\n new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),\n new int64(0x84c87814, 0xa1f0ab72), new int64(0x8cc70208, 0x1a6439ec),\n new int64(0x90befffa, 0x23631e28), new int64(0xa4506ceb, 0xde82bde9),\n new int64(0xbef9a3f7, 0xb2c67915), new int64(0xc67178f2, 0xe372532b),\n new int64(0xca273ece, 0xea26619c), new int64(0xd186b8c7, 0x21c0c207),\n new int64(0xeada7dd6, 0xcde0eb1e), new int64(0xf57d4f7f, 0xee6ed178),\n new int64(0x06f067aa, 0x72176fba), new int64(0x0a637dc5, 0xa2c898a6),\n new int64(0x113f9804, 0xbef90dae), new int64(0x1b710b35, 0x131c471b),\n new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),\n new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, 0x9c100d4c),\n new int64(0x4cc5d4be, 0xcb3e42b6), new int64(0x597f299c, 0xfc657e2a),\n new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)];\n\n var W = new Array(64);\n var a, b, c, d, e, f, g, h, i, j;\n var T1, T2;\n var charsize = 8;\n\n function utf8_encode(str) {\n return unescape(encodeURIComponent(str));\n }\n\n function str2binb(str) {\n var bin = [];\n var mask = (1 << charsize) - 1;\n var len = str.length * charsize;\n \n for (var i = 0; i < len; i += charsize) {\n bin[i >> 5] |= (str.charCodeAt(i / charsize) & mask) << (32 - charsize - (i % 32));\n }\n \n return bin;\n }\n\n function binb2hex(binarray) {\n var hex_tab = \"0123456789abcdef\";\n var str = \"\";\n var length = binarray.length * 4;\n var srcByte;\n\n for (var i = 0; i < length; i += 1) {\n srcByte = binarray[i >> 2] >> ((3 - (i % 4)) * 8);\n str += hex_tab.charAt((srcByte >> 4) & 0xF) + hex_tab.charAt(srcByte & 0xF);\n }\n\n return str;\n }\n\n function safe_add_2(x, y) {\n var lsw, msw, lowOrder, highOrder;\n\n lsw = (x.lowOrder & 0xFFFF) + (y.lowOrder & 0xFFFF);\n msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16);\n lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\n\n lsw = (x.highOrder & 0xFFFF) + (y.highOrder & 0xFFFF) + (msw >>> 16);\n msw = (x.highOrder >>> 16) + (y.highOrder >>> 16) + (lsw >>> 16);\n highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\n\n return new int64(highOrder, lowOrder);\n }\n\n function safe_add_4(a, b, c, d) {\n var lsw, msw, lowOrder, highOrder;\n\n lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF);\n msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16);\n lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\n\n lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (msw >>> 16);\n msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (lsw >>> 16);\n highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\n\n return new int64(highOrder, lowOrder);\n }\n\n function safe_add_5(a, b, c, d, e) {\n var lsw, msw, lowOrder, highOrder;\n\n lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF) + (e.lowOrder & 0xFFFF);\n msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (e.lowOrder >>> 16) + (lsw >>> 16);\n lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\n\n lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (e.highOrder & 0xFFFF) + (msw >>> 16);\n msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (e.highOrder >>> 16) + (lsw >>> 16);\n highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\n\n return new int64(highOrder, lowOrder);\n }\n\n function maj(x, y, z) {\n return new int64(\n (x.highOrder & y.highOrder) ^ (x.highOrder & z.highOrder) ^ (y.highOrder & z.highOrder),\n (x.lowOrder & y.lowOrder) ^ (x.lowOrder & z.lowOrder) ^ (y.lowOrder & z.lowOrder)\n );\n }\n\n function ch(x, y, z) {\n return new int64(\n (x.highOrder & y.highOrder) ^ (~x.highOrder & z.highOrder),\n (x.lowOrder & y.lowOrder) ^ (~x.lowOrder & z.lowOrder)\n );\n }\n\n function rotr(x, n) {\n if (n <= 32) {\n return new int64(\n (x.highOrder >>> n) | (x.lowOrder << (32 - n)),\n (x.lowOrder >>> n) | (x.highOrder << (32 - n))\n );\n } else {\n return new int64(\n (x.lowOrder >>> n) | (x.highOrder << (32 - n)),\n (x.highOrder >>> n) | (x.lowOrder << (32 - n))\n );\n }\n }\n\n function sigma0(x) {\n var rotr28 = rotr(x, 28);\n var rotr34 = rotr(x, 34);\n var rotr39 = rotr(x, 39);\n\n return new int64(\n rotr28.highOrder ^ rotr34.highOrder ^ rotr39.highOrder,\n rotr28.lowOrder ^ rotr34.lowOrder ^ rotr39.lowOrder\n );\n }\n\n function sigma1(x) {\n var rotr14 = rotr(x, 14);\n var rotr18 = rotr(x, 18);\n var rotr41 = rotr(x, 41);\n\n return new int64(\n rotr14.highOrder ^ rotr18.highOrder ^ rotr41.highOrder,\n rotr14.lowOrder ^ rotr18.lowOrder ^ rotr41.lowOrder\n );\n }\n\n function gamma0(x) {\n var rotr1 = rotr(x, 1), rotr8 = rotr(x, 8), shr7 = shr(x, 7);\n\n return new int64(\n rotr1.highOrder ^ rotr8.highOrder ^ shr7.highOrder,\n rotr1.lowOrder ^ rotr8.lowOrder ^ shr7.lowOrder\n );\n }\n\n function gamma1(x) {\n var rotr19 = rotr(x, 19);\n var rotr61 = rotr(x, 61);\n var shr6 = shr(x, 6);\n\n return new int64(\n rotr19.highOrder ^ rotr61.highOrder ^ shr6.highOrder,\n rotr19.lowOrder ^ rotr61.lowOrder ^ shr6.lowOrder\n );\n }\n\n function shr(x, n) {\n if (n <= 32) {\n return new int64(\n x.highOrder >>> n,\n x.lowOrder >>> n | (x.highOrder << (32 - n))\n );\n } else {\n return new int64(\n 0,\n x.highOrder << (32 - n)\n );\n }\n }\n\n var str = utf8_encode(str);\n var strlen = str.length*charsize;\n str = str2binb(str);\n\n str[strlen >> 5] |= 0x80 << (24 - strlen % 32);\n str[(((strlen + 128) >> 10) << 5) + 31] = strlen;\n\n for (var i = 0; i < str.length; i += 32) {\n a = H[0];\n b = H[1];\n c = H[2];\n d = H[3];\n e = H[4];\n f = H[5];\n g = H[6];\n h = H[7];\n\n for (var j = 0; j < 80; j++) {\n if (j < 16) {\n W[j] = new int64(str[j*2 + i], str[j*2 + i + 1]);\n } else {\n W[j] = safe_add_4(gamma1(W[j - 2]), W[j - 7], gamma0(W[j - 15]), W[j - 16]);\n }\n\n T1 = safe_add_5(h, sigma1(e), ch(e, f, g), K[j], W[j]);\n T2 = safe_add_2(sigma0(a), maj(a, b, c));\n h = g;\n g = f;\n f = e;\n e = safe_add_2(d, T1);\n d = c;\n c = b;\n b = a;\n a = safe_add_2(T1, T2);\n }\n\n H[0] = safe_add_2(a, H[0]);\n H[1] = safe_add_2(b, H[1]);\n H[2] = safe_add_2(c, H[2]);\n H[3] = safe_add_2(d, H[3]);\n H[4] = safe_add_2(e, H[4]);\n H[5] = safe_add_2(f, H[5]);\n H[6] = safe_add_2(g, H[6]);\n H[7] = safe_add_2(h, H[7]);\n }\n\n var binarray = [];\n for (var i = 0; i < H.length; i++) {\n binarray.push(H[i].highOrder);\n binarray.push(H[i].lowOrder);\n }\n\n return binb2hex(binarray);\n});\n\nif (! jSuites.login) {\n jSuites.login = {};\n jSuites.login.sha512 = jSuites.sha512;\n}\r\n\r\njSuites.image = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // Default configuration\n var defaults = {\n minWidth: false,\n onchange: null,\n singleFile: true,\n remoteParser: null,\n text:{\n extensionNotAllowed:'The extension is not allowed',\n imageTooSmall:'The resolution is too low, try a image with a better resolution. width > 800px',\n }\n };\n\n // Loop through our object\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Upload icon\n el.classList.add('jupload');\n\n // Add image\n obj.addImage = function(file) {\n if (! file.date) {\n file.date = '';\n }\n var img = document.createElement('img');\n img.setAttribute('data-date', file.lastmodified ? file.lastmodified : file.date);\n img.setAttribute('data-name', file.name);\n img.setAttribute('data-size', file.size);\n img.setAttribute('data-small', file.small ? file.small : '');\n img.setAttribute('data-cover', file.cover ? 1 : 0);\n img.setAttribute('data-extension', file.extension);\n img.setAttribute('src', file.file);\n img.className = 'jfile';\n img.style.width = '100%';\n\n return img;\n }\n\n // Add image\n obj.addImages = function(files) {\n if (obj.options.singleFile == true) {\n el.innerHTML = '';\n }\n\n for (var i = 0; i < files.length; i++) {\n el.appendChild(obj.addImage(files[i]));\n }\n }\n\n obj.addFromFile = function(file) {\n var type = file.type.split('/');\n if (type[0] == 'image') {\n if (obj.options.singleFile == true) {\n el.innerHTML = '';\n }\n\n var imageFile = new FileReader();\n imageFile.addEventListener(\"load\", function (v) {\n\n var img = new Image();\n\n img.onload = function onload() {\n var canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n var ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n\n var data = {\n file: canvas.toDataURL(),\n extension: file.name.substr(file.name.lastIndexOf('.') + 1),\n name: file.name,\n size: file.size,\n lastmodified: file.lastModified,\n }\n var newImage = obj.addImage(data);\n el.appendChild(newImage);\n\n // Onchange\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(newImage);\n }\n };\n\n img.src = v.srcElement.result;\n });\n\n imageFile.readAsDataURL(file);\n } else {\n alert(text.extentionNotAllowed);\n }\n }\n\n obj.addFromUrl = function(src) {\n if (src.substr(0,4) != 'data' && ! obj.options.remoteParser) {\n console.error('remoteParser not defined in your initialization');\n } else {\n // This is to process cross domain images\n if (src.substr(0,4) == 'data') {\n var extension = src.split(';')\n extension = extension[0].split('/');\n extension = extension[1];\n } else {\n var extension = src.substr(src.lastIndexOf('.') + 1);\n // Work for cross browsers\n src = obj.options.remoteParser + src;\n }\n\n var img = new Image();\n\n img.onload = function onload() {\n var canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n var ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n\n canvas.toBlob(function(blob) {\n var data = {\n file: window.URL.createObjectURL(blob),\n extension: extension\n }\n var newImage = obj.addImage(data);\n el.appendChild(newImage);\n\n // Keep base64 ready to go\n var content = canvas.toDataURL();\n jSuites.files[data.file] = content.substr(content.indexOf(',') + 1);\n\n // Onchange\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(newImage);\n }\n });\n };\n\n img.src = src;\n }\n }\n\n var attachmentInput = document.createElement('input');\n attachmentInput.type = 'file';\n attachmentInput.setAttribute('accept', 'image/*');\n attachmentInput.onchange = function() {\n for (var i = 0; i < this.files.length; i++) {\n obj.addFromFile(this.files[i]);\n }\n }\n\n el.addEventListener(\"dblclick\", function(e) {\n jSuites.click(attachmentInput);\n });\n\n el.addEventListener('dragenter', function(e) {\n el.style.border = '1px dashed #000';\n });\n\n el.addEventListener('dragleave', function(e) {\n el.style.border = '1px solid #eee';\n });\n\n el.addEventListener('dragstop', function(e) {\n el.style.border = '1px solid #eee';\n });\n\n el.addEventListener('dragover', function(e) {\n e.preventDefault();\n });\n\n el.addEventListener('drop', function(e) {\n e.preventDefault(); \n e.stopPropagation();\n\n\n var html = (e.originalEvent || e).dataTransfer.getData('text/html');\n var file = (e.originalEvent || e).dataTransfer.files;\n\n if (file.length) {\n for (var i = 0; i < e.dataTransfer.files.length; i++) {\n obj.addFromFile(e.dataTransfer.files[i]);\n }\n } else if (html) {\n if (obj.options.singleFile == true) {\n el.innerHTML = '';\n }\n\n // Create temp element\n var div = document.createElement('div');\n div.innerHTML = html;\n\n // Extract images\n var img = div.querySelectorAll('img');\n\n if (img.length) {\n for (var i = 0; i < img.length; i++) {\n obj.addFromUrl(img[i].src);\n }\n }\n }\n\n el.style.border = '1px solid #eee';\n\n return false;\n });\n\n el.image = obj;\n\n return obj;\n});\r\n\r\njSuites.lazyLoading = (function(el, options) {\n var obj = {}\n\n // Mandatory options\n if (! options.loadUp || typeof(options.loadUp) != 'function') {\n options.loadUp = function() {\n return false;\n }\n }\n if (! options.loadDown || typeof(options.loadDown) != 'function') {\n options.loadDown = function() {\n return false;\n }\n }\n // Timer ms\n if (! options.timer) {\n options.timer = 100;\n }\n\n // Timer\n var timeControlLoading = null;\n\n // Controls\n var scrollControls = function(e) {\n if (timeControlLoading == null) {\n var scrollTop = el.scrollTop;\n if (el.scrollTop + (el.clientHeight * 2) >= el.scrollHeight) {\n if (options.loadDown()) {\n if (scrollTop == el.scrollTop) {\n el.scrollTop = el.scrollTop - (el.clientHeight);\n }\n }\n } else if (el.scrollTop <= el.clientHeight) {\n if (options.loadUp()) {\n if (scrollTop == el.scrollTop) {\n el.scrollTop = el.scrollTop + (el.clientHeight);\n }\n }\n }\n\n timeControlLoading = setTimeout(function() {\n timeControlLoading = null;\n }, options.timer);\n }\n }\n\n // Onscroll\n el.onscroll = function(e) {\n scrollControls(e);\n }\n\n el.onwheel = function(e) {\n scrollControls(e);\n }\n\n return obj;\n});\r\n\r\njSuites.loading = (function() {\n var obj = {};\n\n var loading = null;\n\n obj.show = function() {\n if (! loading) {\n loading = document.createElement('div');\n loading.className = 'jloading';\n }\n document.body.appendChild(loading);\n }\n\n obj.hide = function() {\n if (loading) {\n document.body.removeChild(loading);\n }\n }\n\n return obj;\n})();\r\n\r\njSuites.mask = (function() {\n var obj = {};\n var index = 0;\n var values = []\n var pieces = [];\n\n obj.run = function(value, mask, decimal) {\n if (value && mask) {\n if (! decimal) {\n decimal = '.';\n }\n if (value == Number(value)) {\n var number = (''+value).split('.');\n var value = number[0];\n var valueDecimal = number[1];\n } else {\n value = '' + value;\n }\n index = 0;\n values = [];\n // Create mask token\n obj.prepare(mask);\n // Current value\n var currentValue = value;\n if (currentValue) {\n // Checking current value\n for (var i = 0; i < currentValue.length; i++) {\n if (currentValue[i] != null) {\n obj.process(currentValue[i]);\n }\n }\n }\n if (valueDecimal) {\n obj.process(decimal);\n var currentValue = valueDecimal;\n if (currentValue) {\n // Checking current value\n for (var i = 0; i < currentValue.length; i++) {\n if (currentValue[i] != null) {\n obj.process(currentValue[i]);\n }\n }\n }\n }\n // Formatted value\n return values.join('');\n } else {\n return '';\n }\n }\n\n obj.apply = function(e) {\n if (e.target && ! e.target.getAttribute('readonly')) {\n var mask = e.target.getAttribute('data-mask');\n if (mask) {\n index = 0;\n values = [];\n // Create mask token\n obj.prepare(mask);\n // Current value\n if (e.target.selectionStart < e.target.selectionEnd) {\n var currentValue = e.target.value.substring(0, e.target.selectionStart); \n } else {\n var currentValue = e.target.value;\n }\n if (currentValue) {\n // Checking current value\n for (var i = 0; i < currentValue.length; i++) {\n if (currentValue[i] != null) {\n obj.process(currentValue[i]);\n }\n }\n }\n // New input\n if (e.keyCode > 46) {\n obj.process(obj.fromKeyCode(e));\n // Prevent default\n e.preventDefault();\n }\n // Update value to the element\n e.target.value = values.join('');\n if (pieces.length == values.length && pieces[pieces.length-1].length == values[values.length-1].length) {\n e.target.setAttribute('data-completed', 'true');\n } else {\n e.target.setAttribute('data-completed', 'false');\n }\n }\n }\n }\n\n /**\n * Process inputs and save to values\n */\n obj.process = function(input) {\n do {\n if (pieces[index] == 'mm') {\n if (values[index] == null || values[index] == '') {\n if (parseInt(input) > 1 && parseInt(input) < 10) {\n values[index] = '0' + input;\n index++;\n return true;\n } else if (parseInt(input) < 10) {\n values[index] = input;\n return true;\n } else {\n return false;\n }\n } else {\n if (values[index] == 1 && values[index] < 2 && parseInt(input) < 3) {\n values[index] += input;\n index++;\n return true;\n } else if (values[index] == 0 && values[index] < 10) {\n values[index] += input;\n index++;\n return true;\n } else {\n return false\n }\n }\n } else if (pieces[index] == 'dd') {\n if (values[index] == null || values[index] == '') {\n if (parseInt(input) > 3 && parseInt(input) < 10) {\n values[index] = '0' + input;\n index++;\n return true;\n } else if (parseInt(input) < 10) {\n values[index] = input;\n return true;\n } else {\n return false;\n }\n } else {\n if (values[index] == 3 && parseInt(input) < 2) {\n values[index] += input;\n index++;\n return true;\n } else if (values[index] < 3 && parseInt(input) < 10) {\n values[index] += input;\n index++;\n return true;\n } else {\n return false\n }\n }\n } else if (pieces[index] == 'hh24') {\n if (values[index] == null || values[index] == '') {\n if (parseInt(input) > 2 && parseInt(input) < 10) {\n values[index] = '0' + input;\n index++;\n return true;\n } else if (parseInt(input) < 10) {\n values[index] = input;\n return true;\n } else {\n return false;\n }\n } else {\n if (values[index] == 2 && parseInt(input) < 4) {\n values[index] += input;\n index++;\n return true;\n } else if (values[index] < 2 && parseInt(input) < 10) {\n values[index] += input;\n index++;\n return true;\n } else {\n return false\n }\n }\n } else if (pieces[index] == 'hh') {\n if (values[index] == null || values[index] == '') {\n if (parseInt(input) > 1 && parseInt(input) < 10) {\n values[index] = '0' + input;\n index++;\n return true;\n } else if (parseInt(input) < 10) {\n values[index] = input;\n return true;\n } else {\n return false;\n }\n } else {\n if (values[index] == 1 && parseInt(input) < 3) {\n values[index] += input;\n index++;\n return true;\n } else if (values[index] < 1 && parseInt(input) < 10) {\n values[index] += input;\n index++;\n return true;\n } else {\n return false\n }\n }\n } else if (pieces[index] == 'mi' || pieces[index] == 'ss') {\n if (values[index] == null || values[index] == '') {\n if (parseInt(input) > 5 && parseInt(input) < 10) {\n values[index] = '0' + input;\n index++;\n return true;\n } else if (parseInt(input) < 10) {\n values[index] = input;\n return true;\n } else {\n return false;\n }\n } else {\n if (parseInt(input) < 10) {\n values[index] += input;\n index++;\n return true;\n } else {\n return false\n }\n }\n } else if (pieces[index] == 'yy' || pieces[index] == 'yyyy') {\n if (parseInt(input) < 10) {\n if (values[index] == null || values[index] == '') {\n values[index] = input;\n } else {\n values[index] += input;\n }\n \n if (values[index].length == pieces[index].length) {\n index++;\n }\n return true;\n } else {\n return false;\n }\n } else if (pieces[index] == '#' || pieces[index] == '#.##' || pieces[index] == '#,##' || pieces[index] == '# ##') {\n if (input.match(/[0-9]/g)) {\n if (pieces[index] == '#.##') {\n var separator = '.';\n } else if (pieces[index] == '#,##') {\n var separator = ',';\n } else if (pieces[index] == '# ##') {\n var separator = ' ';\n } else {\n var separator = '';\n }\n if (values[index] == null || values[index] == '') {\n values[index] = input;\n } else {\n values[index] += input;\n if (separator) {\n values[index] = values[index].match(/[0-9]/g).join('');\n var t = [];\n var s = 0;\n for (var j = values[index].length - 1; j >= 0 ; j--) {\n t.push(values[index][j]);\n s++;\n if (! (s % 3)) {\n t.push(separator);\n }\n }\n t = t.reverse();\n values[index] = t.join('');\n if (values[index].substr(0,1) == separator) {\n values[index] = values[index].substr(1);\n } \n }\n }\n return true;\n } else {\n if (pieces[index] == '#.##' && input == '.') {\n // Do nothing\n } else if (pieces[index] == '#,##' && input == ',') {\n // Do nothing\n } else if (pieces[index] == '# ##' && input == ' ') {\n // Do nothing\n } else {\n if (values[index]) {\n index++;\n if (pieces[index]) {\n if (pieces[index] == input) {\n values[index] = input;\n return true;\n } else {\n if (pieces[index] == '0' && pieces[index+1] == input) {\n index++;\n values[index] = input;\n return true;\n }\n }\n }\n }\n }\n\n return false;\n }\n } else if (pieces[index] == '0') {\n if (input.match(/[0-9]/g)) {\n values[index] = input;\n index++;\n return true;\n } else {\n return false;\n }\n } else if (pieces[index] == 'a') {\n if (input.match(/[a-zA-Z]/g)) {\n values[index] = input;\n index++;\n return true;\n } else {\n return false;\n }\n } else {\n if (pieces[index] != null) {\n if (pieces[index] == '\\\\a') {\n var v = 'a';\n } else if (pieces[index] == '\\\\0') {\n var v = '0';\n } else if (pieces[index] == '[-]') {\n if (input == '-' || input == '+') {\n var v = input;\n } else {\n var v = ' ';\n }\n } else {\n var v = pieces[index];\n }\n values[index] = v;\n if (input == v) {\n index++;\n return true;\n }\n }\n }\n\n index++;\n } while (pieces[index]);\n }\n\n /**\n * Create tokens for the mask\n */\n obj.prepare = function(mask) {\n pieces = [];\n for (var i = 0; i < mask.length; i++) {\n if (mask[i].match(/[0-9]|[a-z]|\\\\/g)) {\n if (mask[i] == 'y' && mask[i+1] == 'y' && mask[i+2] == 'y' && mask[i+3] == 'y') {\n pieces.push('yyyy');\n i += 3;\n } else if (mask[i] == 'y' && mask[i+1] == 'y') {\n pieces.push('yy');\n i++;\n } else if (mask[i] == 'm' && mask[i+1] == 'm' && mask[i+2] == 'm' && mask[i+3] == 'm') {\n pieces.push('mmmm');\n i += 3;\n } else if (mask[i] == 'm' && mask[i+1] == 'm' && mask[i+2] == 'm') {\n pieces.push('mmm');\n i += 2;\n } else if (mask[i] == 'm' && mask[i+1] == 'm') {\n pieces.push('mm');\n i++;\n } else if (mask[i] == 'd' && mask[i+1] == 'd') {\n pieces.push('dd');\n i++;\n } else if (mask[i] == 'h' && mask[i+1] == 'h' && mask[i+2] == '2' && mask[i+3] == '4') {\n pieces.push('hh24');\n i += 3;\n } else if (mask[i] == 'h' && mask[i+1] == 'h') {\n pieces.push('hh');\n i++;\n } else if (mask[i] == 'm' && mask[i+1] == 'i') {\n pieces.push('mi');\n i++;\n } else if (mask[i] == 's' && mask[i+1] == 's') {\n pieces.push('ss');\n i++;\n } else if (mask[i] == 'a' && mask[i+1] == 'm') {\n pieces.push('am');\n i++;\n } else if (mask[i] == 'p' && mask[i+1] == 'm') {\n pieces.push('pm');\n i++;\n } else if (mask[i] == '\\\\' && mask[i+1] == '0') {\n pieces.push('\\\\0');\n i++;\n } else if (mask[i] == '\\\\' && mask[i+1] == 'a') {\n pieces.push('\\\\a');\n i++;\n } else {\n pieces.push(mask[i]);\n }\n } else {\n if (mask[i] == '#' && mask[i+1] == '.' && mask[i+2] == '#' && mask[i+3] == '#') {\n pieces.push('#.##');\n i += 3;\n } else if (mask[i] == '#' && mask[i+1] == ',' && mask[i+2] == '#' && mask[i+3] == '#') {\n pieces.push('#,##');\n i += 3;\n } else if (mask[i] == '#' && mask[i+1] == ' ' && mask[i+2] == '#' && mask[i+3] == '#') {\n pieces.push('# ##');\n i += 3;\n } else if (mask[i] == '[' && mask[i+1] == '-' && mask[i+2] == ']') {\n pieces.push('[-]');\n i += 2;\n } else {\n pieces.push(mask[i]);\n }\n }\n }\n }\n\n /** \n * Thanks for the collaboration\n */\n obj.fromKeyCode = function(e) {\n var _to_ascii = {\n '188': '44',\n '109': '45',\n '190': '46',\n '191': '47',\n '192': '96',\n '220': '92',\n '222': '39',\n '221': '93',\n '219': '91',\n '173': '45',\n '187': '61', //IE Key codes\n '186': '59', //IE Key codes\n '189': '45' //IE Key codes\n }\n\n var shiftUps = {\n \"96\": \"~\",\n \"49\": \"!\",\n \"50\": \"@\",\n \"51\": \"#\",\n \"52\": \"$\",\n \"53\": \"%\",\n \"54\": \"^\",\n \"55\": \"&\",\n \"56\": \"*\",\n \"57\": \"(\",\n \"48\": \")\",\n \"45\": \"_\",\n \"61\": \"+\",\n \"91\": \"{\",\n \"93\": \"}\",\n \"92\": \"|\",\n \"59\": \":\",\n \"39\": \"\\\"\",\n \"44\": \"<\",\n \"46\": \">\",\n \"47\": \"?\"\n };\n\n var c = e.which;\n\n if (_to_ascii.hasOwnProperty(c)) {\n c = _to_ascii[c];\n }\n\n if (!e.shiftKey && (c >= 65 && c <= 90)) {\n c = String.fromCharCode(c + 32);\n } else if (e.shiftKey && shiftUps.hasOwnProperty(c)) {\n c = shiftUps[c];\n } else if (96 <= c && c <= 105) {\n c = String.fromCharCode(c - 48);\n } else {\n c = String.fromCharCode(c);\n }\n\n return c;\n }\n\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', function(e) {\n if (jSuites.mask) {\n jSuites.mask.apply(e);\n }\n });\n }\n\n return obj;\n})();\n\r\n\r\n/**\n * (c) jSuites modal\n * https://github.com/paulhodel/jsuites\n *\n * @author: Paul Hodel \n * @description: Modal\n */\n\njSuites.modal = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // Default configuration\n var defaults = {\n url: null,\n onopen: null,\n onclose: null,\n closed: false,\n width: null,\n height: null,\n title: null,\n };\n\n // Loop through our object\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Title\n if (! obj.options.title && el.getAttribute('title')) {\n obj.options.title = el.getAttribute('title');\n }\n\n var temp = document.createElement('div');\n for (var i = 0; i < el.children.length; i++) {\n temp.appendChild(el.children[i]);\n }\n\n obj.content = document.createElement('div');\n obj.content.className = 'jmodal_content';\n obj.content.innerHTML = el.innerHTML;\n\n for (var i = 0; i < temp.children.length; i++) {\n obj.content.appendChild(temp.children[i]);\n }\n\n obj.container = document.createElement('div');\n obj.container.className = 'jmodal';\n obj.container.appendChild(obj.content);\n\n if (obj.options.width) {\n obj.container.style.width = obj.options.width;\n }\n if (obj.options.height) {\n obj.container.style.height = obj.options.height;\n }\n if (obj.options.title) {\n obj.container.setAttribute('title', obj.options.title);\n } else {\n obj.container.classList.add('no-title');\n }\n el.innerHTML = '';\n el.style.display = 'none';\n el.appendChild(obj.container);\n\n // Backdrop\n var backdrop = document.createElement('div');\n backdrop.className = 'jmodal_backdrop';\n el.appendChild(backdrop);\n\n obj.open = function() {\n el.style.display = 'block';\n // Fullscreen\n const rect = obj.container.getBoundingClientRect();\n if (jSuites.getWindowWidth() < rect.width) {\n obj.container.style.top = '';\n obj.container.style.left = '';\n obj.container.classList.add('jmodal_fullscreen');\n jSuites.animation.slideBottom(obj.container, 1);\n } else {\n backdrop.style.display = 'block';\n }\n // Current\n jSuites.modal.current = obj;\n // Event\n if (typeof(obj.options.onopen) == 'function') {\n obj.options.onopen(el, obj);\n }\n }\n\n obj.resetPosition = function() {\n obj.container.style.top = '';\n obj.container.style.left = '';\n }\n\n obj.isOpen = function() {\n return el.style.display != 'none' ? true : false;\n }\n\n obj.close = function() {\n el.style.display = 'none';\n // Backdrop\n backdrop.style.display = '';\n // Current\n jSuites.modal.current = null;\n // Remove fullscreen class\n obj.container.classList.remove('jmodal_fullscreen');\n // Event\n if (typeof(obj.options.onclose) == 'function') {\n obj.options.onclose(el, obj);\n }\n }\n\n if (! jSuites.modal.hasEvents) {\n jSuites.modal.current = obj;\n\n if ('ontouchstart' in document.documentElement === true) {\n document.addEventListener(\"touchstart\", jSuites.modal.mouseDownControls);\n } else {\n document.addEventListener('mousedown', jSuites.modal.mouseDownControls);\n document.addEventListener('mousemove', jSuites.modal.mouseMoveControls);\n document.addEventListener('mouseup', jSuites.modal.mouseUpControls);\n }\n\n document.addEventListener('keydown', jSuites.modal.keyDownControls);\n\n jSuites.modal.hasEvents = true;\n }\n\n if (obj.options.url) {\n jSuites.ajax({\n url: obj.options.url,\n method: 'GET',\n success: function(data) {\n obj.content.innerHTML = data;\n\n if (! obj.options.closed) {\n obj.open();\n }\n }\n });\n } else {\n if (! obj.options.closed) {\n obj.open();\n }\n }\n\n // Keep object available from the node\n el.modal = obj;\n\n return obj;\n});\n\njSuites.modal.current = null;\njSuites.modal.position = null;\n\njSuites.modal.keyDownControls = function(e) {\n if (e.which == 27) {\n if (jSuites.modal.current) {\n jSuites.modal.current.close();\n }\n }\n}\n\njSuites.modal.mouseUpControls = function(e) {\n if (jSuites.modal.current) {\n jSuites.modal.current.container.style.cursor = 'auto';\n }\n jSuites.modal.position = null;\n}\n\njSuites.modal.mouseMoveControls = function(e) {\n if (jSuites.modal.current && jSuites.modal.position) {\n if (e.which == 1 || e.which == 3) {\n var position = jSuites.modal.position;\n jSuites.modal.current.container.style.top = (position[1] + (e.clientY - position[3]) + (position[5] / 2)) + 'px';\n jSuites.modal.current.container.style.left = (position[0] + (e.clientX - position[2]) + (position[4] / 2)) + 'px';\n jSuites.modal.current.container.style.cursor = 'move';\n } else {\n jSuites.modal.current.container.style.cursor = 'auto';\n }\n }\n}\n\njSuites.modal.mouseDownControls = function(e) {\n jSuites.modal.position = [];\n\n if (e.target.classList.contains('jmodal')) {\n setTimeout(function() {\n // Get target info\n var rect = e.target.getBoundingClientRect();\n\n if (e.changedTouches && e.changedTouches[0]) {\n var x = e.changedTouches[0].clientX;\n var y = e.changedTouches[0].clientY;\n } else {\n var x = e.clientX;\n var y = e.clientY;\n }\n\n if (rect.width - (x - rect.left) < 50 && (y - rect.top) < 50) {\n setTimeout(function() {\n jSuites.modal.current.close();\n }, 100);\n } else {\n if (e.target.getAttribute('title') && (y - rect.top) < 50) {\n if (document.selection) {\n document.selection.empty();\n } else if ( window.getSelection ) {\n window.getSelection().removeAllRanges();\n }\n\n jSuites.modal.position = [\n rect.left,\n rect.top,\n e.clientX,\n e.clientY,\n rect.width,\n rect.height,\n ];\n }\n }\n }, 100);\n }\n}\n\r\n\r\njSuites.notification = (function(options) {\n var obj = {};\n obj.options = {};\n\n // Default configuration\n var defaults = {\n icon: null,\n name: 'Notification',\n date: null,\n title: null,\n message: null,\n timeout: 4000,\n autoHide: true,\n closeable: true,\n };\n\n // Loop through our object\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n var notification = document.createElement('div');\n notification.className = 'jnotification';\n\n var notificationContainer = document.createElement('div');\n notificationContainer.className = 'jnotification-container';\n notification.appendChild(notificationContainer);\n\n var notificationHeader = document.createElement('div');\n notificationHeader.className = 'jnotification-header';\n notificationContainer.appendChild(notificationHeader);\n\n var notificationImage = document.createElement('div');\n notificationImage.className = 'jnotification-image';\n notificationHeader.appendChild(notificationImage);\n\n if (obj.options.icon) {\n var notificationIcon = document.createElement('img');\n notificationIcon.src = obj.options.icon;\n notificationImage.appendChild(notificationIcon);\n }\n\n var notificationName = document.createElement('div');\n notificationName.className = 'jnotification-name';\n notificationName.innerHTML = obj.options.name;\n notificationHeader.appendChild(notificationName);\n\n if (obj.options.closeable == true) {\n var notificationClose = document.createElement('div');\n notificationClose.className = 'jnotification-close';\n notificationClose.onclick = function() {\n obj.hide();\n }\n notificationHeader.appendChild(notificationClose);\n }\n\n var notificationDate = document.createElement('div');\n notificationDate.className = 'jnotification-date';\n notificationHeader.appendChild(notificationDate);\n\n var notificationContent = document.createElement('div');\n notificationContent.className = 'jnotification-content';\n notificationContainer.appendChild(notificationContent);\n\n if (obj.options.title) {\n var notificationTitle = document.createElement('div');\n notificationTitle.className = 'jnotification-title';\n notificationTitle.innerHTML = obj.options.title;\n notificationContent.appendChild(notificationTitle);\n }\n\n var notificationMessage = document.createElement('div');\n notificationMessage.className = 'jnotification-message';\n notificationMessage.innerHTML = obj.options.message;\n notificationContent.appendChild(notificationMessage);\n\n obj.show = function() {\n document.body.appendChild(notification);\n if (jSuites.getWindowWidth() > 800) { \n jSuites.animation.fadeIn(notification);\n } else {\n jSuites.animation.slideTop(notification, 1);\n }\n }\n\n obj.hide = function() {\n if (jSuites.getWindowWidth() > 800) { \n jSuites.animation.fadeOut(notification, function() {\n if (notification.parentNode) {\n notification.parentNode.removeChild(notification);\n if (notificationTimeout) {\n clearTimeout(notificationTimeout);\n }\n }\n });\n } else {\n jSuites.animation.slideTop(notification, 0, function() {\n if (notification.parentNode) {\n notification.parentNode.removeChild(notification);\n if (notificationTimeout) {\n clearTimeout(notificationTimeout);\n }\n }\n });\n }\n };\n\n obj.show();\n\n if (obj.options.autoHide == true) {\n var notificationTimeout = setTimeout(function() {\n obj.hide();\n }, obj.options.timeout);\n }\n\n if (jSuites.getWindowWidth() < 800) {\n notification.addEventListener(\"swipeup\", function(e) {\n obj.hide();\n e.preventDefault();\n e.stopPropagation();\n });\n }\n\n return obj;\n});\n\njSuites.notification.isVisible = function() {\n var j = document.querySelector('.jnotification');\n return j && j.parentNode ? true : false;\n}\r\n\r\n\njSuites.progressbar = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // Default configuration\n var defaults = {\n value: 0,\n onchange: null,\n width: null,\n };\n\n // Loop through the initial configuration\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Class\n el.classList.add('jprogressbar');\n el.setAttribute('tabindex', 1);\n el.setAttribute('data-value', obj.options.value);\n\n var bar = document.createElement('div');\n bar.style.width = obj.options.value + '%';\n bar.style.color = '#fff';\n el.appendChild(bar);\n\n if (obj.options.width) {\n el.style.width = obj.options.width;\n }\n\n // Set value\n obj.setValue = function(value) {\n value = parseInt(value);\n obj.options.value = value;\n bar.style.width = value + '%';\n el.setAttribute('data-value', value + '%');\n\n if (value < 6) {\n el.style.color = '#000';\n } else {\n el.style.color = '#fff';\n }\n\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(el, value);\n }\n }\n\n obj.getValue = function() {\n return obj.options.value;\n }\n\n var action = function(e) {\n if (e.which) {\n // Get target info\n var rect = el.getBoundingClientRect();\n\n if (e.changedTouches && e.changedTouches[0]) {\n var x = e.changedTouches[0].clientX;\n var y = e.changedTouches[0].clientY;\n } else {\n var x = e.clientX;\n var y = e.clientY;\n }\n\n obj.setValue(Math.round((x - rect.left) / rect.width * 100));\n }\n }\n\n // Events\n if ('touchstart' in document.documentElement === true) {\n el.addEventListener('touchstart', action);\n el.addEventListener('touchend', action);\n } else {\n el.addEventListener('mousedown', action);\n el.addEventListener(\"mousemove\", action);\n }\n\n el.progressbar = obj;\n\n return obj;\n});\r\n\r\njSuites.rating = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // Default configuration\n var defaults = {\n number: 5,\n value: 0,\n tooltip: [ 'Very bad', 'Bad', 'Average', 'Good', 'Very good' ],\n onchange: null,\n };\n\n // Loop through the initial configuration\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Class\n el.classList.add('jrating');\n\n // Add elements\n for (var i = 0; i < obj.options.number; i++) {\n var div = document.createElement('div');\n div.setAttribute('data-index', (i + 1))\n div.setAttribute('title', obj.options.tooltip[i])\n el.appendChild(div);\n }\n\n // Set value\n obj.setValue = function(index) {\n for (var i = 0; i < obj.options.number; i++) {\n if (i < index) {\n el.children[i].classList.add('jrating-selected');\n } else {\n el.children[i].classList.remove('jrating-over');\n el.children[i].classList.remove('jrating-selected');\n }\n }\n\n obj.options.value = index;\n\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(el, index);\n }\n }\n\n obj.getValue = function() {\n return obj.options.value;\n }\n\n if (obj.options.value) {\n for (var i = 0; i < obj.options.number; i++) {\n if (i < obj.options.value) {\n el.children[i].classList.add('jrating-selected');\n }\n }\n }\n\n // Events\n el.addEventListener(\"click\", function(e) {\n var index = e.target.getAttribute('data-index');\n if (index != undefined) {\n if (index == obj.options.value) {\n obj.setValue(0);\n } else {\n obj.setValue(index);\n }\n }\n });\n\n el.addEventListener(\"mouseover\", function(e) {\n var index = e.target.getAttribute('data-index');\n for (var i = 0; i < obj.options.number; i++) {\n if (i < index) {\n el.children[i].classList.add('jrating-over');\n } else {\n el.children[i].classList.remove('jrating-over');\n }\n }\n });\n\n el.addEventListener(\"mouseout\", function(e) {\n for (var i = 0; i < obj.options.number; i++) {\n el.children[i].classList.remove('jrating-over');\n }\n });\n\n el.rating = obj;\n\n return obj;\n});\n\r\n\r\n/**\n * (c) Image slider\n * https://github.com/paulhodel/jtools\n *\n * @author: Paul Hodel \n * @description: Image Slider\n */\n\njSuites.slider = (function(el, options) {\n var obj = {};\n obj.options = {};\n obj.currentImage = null;\n\n if (options) {\n obj.options = options;\n }\n\n // Items\n obj.options.items = [];\n\n if (! el.classList.contains('jslider')) {\n el.classList.add('jslider');\n\n // Create container\n var container = document.createElement('div');\n container.className = 'jslider-container';\n\n // Move children inside\n if (el.children.length > 0) {\n // Keep children items\n for (var i = 0; i < el.children.length; i++) {\n obj.options.items.push(el.children[i]);\n }\n }\n if (obj.options.items.length > 0) {\n for (var i = 0; i < obj.options.items.length; i++) {\n obj.options.items[i].classList.add('jfile');\n var index = obj.options.items[i].src.lastIndexOf('/');\n if (index < 0) {\n obj.options.items[i].setAttribute('data-name', obj.options.items[i].src);\n } else {\n obj.options.items[i].setAttribute('data-name', obj.options.items[i].src.substr(index + 1));\n }\n var index = obj.options.items[i].src.lastIndexOf('/');\n\n container.appendChild(obj.options.items[i]);\n }\n }\n el.appendChild(container);\n // Add close buttom\n var close = document.createElement('div');\n close.className = 'jslider-close';\n close.innerHTML = '';\n close.onclick = function() {\n obj.close();\n }\n el.appendChild(close);\n } else {\n var container = el.querySelector('slider-container');\n }\n\n obj.show = function(target) {\n if (! target) {\n var target = container.children[0];\n }\n\n if (! container.classList.contains('jslider-preview')) {\n container.classList.add('jslider-preview');\n close.style.display = 'block';\n }\n\n // Hide all images\n for (var i = 0; i < container.children.length; i++) {\n container.children[i].style.display = 'none';\n }\n\n // Show clicked only\n target.style.display = 'block';\n\n // Is there any previous\n if (target.previousSibling) {\n container.classList.add('jslider-left');\n } else {\n container.classList.remove('jslider-left');\n }\n\n // Is there any next\n if (target.nextSibling) {\n container.classList.add('jslider-right');\n } else {\n container.classList.remove('jslider-right');\n }\n\n obj.currentImage = target;\n }\n\n obj.open = function() {\n obj.show();\n\n // Event\n if (typeof(obj.options.onopen) == 'function') {\n obj.options.onopen(el);\n }\n }\n\n obj.close = function() {\n container.classList.remove('jslider-preview');\n container.classList.remove('jslider-left');\n container.classList.remove('jslider-right');\n\n for (var i = 0; i < container.children.length; i++) {\n container.children[i].style.display = '';\n }\n\n close.style.display = '';\n\n obj.currentImage = null;\n\n // Event\n if (typeof(obj.options.onclose) == 'function') {\n obj.options.onclose(el);\n }\n }\n\n obj.reset = function() {\n container.innerHTML = '';\n }\n\n obj.addFile = function(v, ignoreEvents) {\n var img = document.createElement('img');\n img.setAttribute('data-lastmodified', v.lastmodified);\n img.setAttribute('data-name', v.name);\n img.setAttribute('data-size', v.size);\n img.setAttribute('data-extension', v.extension);\n img.setAttribute('data-cover', v.cover);\n img.setAttribute('src', v.file);\n img.className = 'jfile';\n container.appendChild(img);\n obj.options.items.push(img);\n\n // Onchange\n if (! ignoreEvents) {\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(el, v);\n }\n }\n }\n\n obj.addFiles = function(files) {\n for (var i = 0; i < files.length; i++) {\n obj.addFile(files[i]);\n }\n }\n\n obj.next = function() {\n if (obj.currentImage.nextSibling) {\n obj.show(obj.currentImage.nextSibling);\n }\n }\n \n obj.prev = function() {\n if (obj.currentImage.previousSibling) {\n obj.show(obj.currentImage.previousSibling);\n }\n }\n\n obj.getData = function() {\n return jSuites.files(container).get();\n }\n\n // Append data\n if (obj.options.data && obj.options.data.length) {\n for (var i = 0; i < obj.options.data.length; i++) {\n if (obj.options.data[i]) {\n obj.addFile(obj.options.data[i]);\n }\n }\n }\n\n // Allow insert\n if (obj.options.allowAttachment) {\n var attachmentInput = document.createElement('input');\n attachmentInput.type = 'file';\n attachmentInput.className = 'slider-attachment';\n attachmentInput.setAttribute('accept', 'image/*');\n attachmentInput.style.display = 'none';\n attachmentInput.onchange = function() {\n var reader = [];\n\n for (var i = 0; i < this.files.length; i++) {\n var type = this.files[i].type.split('/');\n\n if (type[0] == 'image') {\n var extension = this.files[i].name;\n extension = extension.split('.');\n extension = extension[extension.length-1];\n\n var file = {\n size: this.files[i].size,\n name: this.files[i].name,\n extension: extension,\n cover: 0,\n lastmodified: this.files[i].lastModified,\n }\n\n reader[i] = new FileReader();\n reader[i].addEventListener(\"load\", function (e) {\n file.file = e.target.result;\n obj.addFile(file);\n }, false);\n\n reader[i].readAsDataURL(this.files[i]);\n } else {\n alert('The extension is not allowed');\n }\n };\n }\n\n var attachmentIcon = document.createElement('i');\n attachmentIcon.innerHTML = 'attachment';\n attachmentIcon.className = 'jslider-attach material-icons';\n attachmentIcon.onclick = function() {\n jSuites.click(attachmentInput);\n }\n\n el.appendChild(attachmentInput);\n el.appendChild(attachmentIcon);\n }\n\n // Push to refresh\n var longTouchTimer = null;\n\n var mouseDown = function(e) {\n if (e.target.tagName == 'IMG') {\n // Remove\n var targetImage = e.target;\n longTouchTimer = setTimeout(function() {\n if (e.target.src.substr(0,4) == 'data') {\n e.target.remove();\n } else {\n if (e.target.classList.contains('jremove')) {\n e.target.classList.remove('jremove');\n } else {\n e.target.classList.add('jremove');\n }\n }\n\n // Onchange\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(el, e.target);\n }\n }, 1000);\n }\n }\n\n var mouseUp = function(e) {\n if (longTouchTimer) {\n clearTimeout(longTouchTimer);\n }\n\n // Open slider\n if (e.target.tagName == 'IMG') {\n if (! e.target.classList.contains('jremove')) {\n obj.show(e.target);\n }\n } else {\n // Arrow controls\n if (e.target.clientWidth - e.offsetX < 40) {\n // Show next image\n obj.next();\n } else if (e.offsetX < 40) {\n // Show previous image\n obj.prev();\n }\n }\n }\n\n container.addEventListener('mousedown', mouseDown);\n container.addEventListener('touchstart', mouseDown);\n container.addEventListener('mouseup', mouseUp);\n container.addEventListener('touchend', mouseUp);\n\n // Add global events\n el.addEventListener(\"swipeleft\", function(e) {\n obj.next();\n e.preventDefault();\n e.stopPropagation();\n });\n\n el.addEventListener(\"swiperight\", function(e) {\n obj.prev();\n e.preventDefault();\n e.stopPropagation();\n });\n\n if (! jSuites.slider.hasEvents) {\n document.addEventListener('keydown', function(e) {\n if (e.which == 27) {\n obj.close();\n }\n });\n\n jSuites.slider.hasEvents = true;\n }\n\n el.slider = obj;\n\n return obj;\n});\r\n\r\n/**\n * (c) jTools v1.0.1 - Element sorting\n * https://github.com/paulhodel/jtools\n *\n * @author: Paul Hodel \n * @description: Element drag and drop sorting\n */\n\njSuites.sorting = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n var defaults = {\n pointer: null,\n direction: null,\n ondragstart: null,\n ondragend: null,\n ondrop: null,\n }\n\n var dragElement = null;\n\n // Loop through the initial configuration\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n el.classList.add('jsorting');\n\n el.addEventListener('dragstart', function(e) {\n var position = Array.prototype.indexOf.call(e.target.parentNode.children, e.target);\n dragElement = {\n element: e.target,\n o: position,\n d: position\n }\n e.target.style.opacity = '0.25';\n\n if (typeof(obj.options.ondragstart) == 'function') {\n obj.options.ondragstart(el, e.target, e);\n }\n });\n\n el.addEventListener('dragover', function(e) {\n e.preventDefault();\n\n if (getElement(e.target) && dragElement) {\n if (e.target.getAttribute('draggable') == 'true' && dragElement.element != e.target) {\n if (! obj.options.direction) {\n var condition = e.target.clientHeight / 2 > e.offsetY;\n } else {\n var condition = e.target.clientWidth / 2 > e.offsetX;\n }\n\n if (condition) {\n e.target.parentNode.insertBefore(dragElement.element, e.target);\n } else {\n e.target.parentNode.insertBefore(dragElement.element, e.target.nextSibling);\n }\n\n dragElement.d = Array.prototype.indexOf.call(e.target.parentNode.children, dragElement.element);\n }\n }\n });\n\n el.addEventListener('dragleave', function(e) {\n e.preventDefault();\n });\n\n el.addEventListener('dragend', function(e) {\n e.preventDefault();\n\n if (dragElement) {\n if (typeof(obj.options.ondragend) == 'function') {\n obj.options.ondragend(el, dragElement.element, e);\n }\n\n // Cancelled put element to the original position\n if (dragElement.o < dragElement.d) {\n e.target.parentNode.insertBefore(dragElement.element, e.target.parentNode.children[dragElement.o]);\n } else {\n e.target.parentNode.insertBefore(dragElement.element, e.target.parentNode.children[dragElement.o].nextSibling);\n }\n\n dragElement.element.style.opacity = '';\n dragElement = null;\n }\n });\n\n el.addEventListener('drop', function(e) {\n e.preventDefault();\n\n if (dragElement && (dragElement.o != dragElement.d)) {\n if (typeof(obj.options.ondrop) == 'function') {\n obj.options.ondrop(el, dragElement.o, dragElement.d, dragElement.element, e.target, e);\n }\n }\n\n dragElement.element.style.opacity = '';\n dragElement = null;\n });\n\n var getElement = function(element) {\n var sorting = false;\n\n function path (element) {\n if (element.className) {\n if (element.classList.contains('jsorting')) {\n sorting = true;\n }\n }\n\n if (! sorting) {\n path(element.parentNode);\n }\n }\n\n path(element);\n\n return sorting;\n }\n\n for (var i = 0; i < el.children.length; i++) {\n if (! el.children[i].hasAttribute('draggable')) {\n el.children[i].setAttribute('draggable', 'true');\n }\n }\n\n return el;\n});\r\n\r\njSuites.tabs = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // Default configuration\n var defaults = {\n data: null,\n position: null,\n allowCreate: false,\n allowChangePosition: false,\n onclick: null,\n onload: null,\n onchange: null,\n oncreate: null,\n ondelete: null,\n onbeforecreate: null,\n onchangeposition: null,\n animation: false,\n hideHeaders: false\n };\n\n // Loop through the initial configuration\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Class\n el.classList.add('jtabs');\n\n if (obj.options.animation == true) {\n // Border\n var border = document.createElement('div');\n border.className = 'jtabs-border';\n el.appendChild(border);\n\n var setBorder = function(index) {\n var rect = obj.headers.children[index].getBoundingClientRect();\n var rectContent = obj.content.children[index].getBoundingClientRect();\n border.style.width = rect.width + 'px';\n border.style.left = (rect.left - rectContent.left) + 'px';\n border.style.top = rect.height + 'px';\n }\n }\n\n // Set value\n obj.open = function(index) {\n var previous = null;\n for (var i = 0; i < obj.headers.children.length; i++) {\n if (obj.headers.children[i].classList.contains('jtabs-selected')) {\n // Current one\n previous = i;\n // Remote selected\n obj.headers.children[i].classList.remove('jtabs-selected');\n if (obj.content.children[i]) {\n obj.content.children[i].classList.remove('jtabs-selected');\n }\n }\n }\n\n obj.headers.children[index].classList.add('jtabs-selected');\n if (obj.content.children[index]) {\n obj.content.children[index].classList.add('jtabs-selected');\n }\n\n if (previous != index && typeof(obj.options.onchange) == 'function') {\n if (obj.content.children[index]) {\n obj.options.onchange(el, obj, index, obj.headers.children[index], obj.content.children[index]);\n }\n }\n\n if (obj.content.children[index]) {\n if (typeof(obj.options.onclick) == 'function') {\n obj.options.onclick(el, obj, index, obj.headers.children[index], obj.content.children[index]);\n }\n }\n\n // Hide\n if (obj.options.hideHeaders == true && (obj.headers.children.length < 2 && obj.options.allowCreate == false)) {\n obj.headers.style.display = 'none';\n } else {\n obj.headers.style.display = '';\n // Set border\n if (obj.options.animation == true) {\n setTimeout(function() {\n setBorder(index);\n }, 100);\n }\n }\n }\n\n obj.selectIndex = function(a) {\n var index = Array.prototype.indexOf.call(obj.headers.children, a);\n if (index >= 0) {\n obj.open(index);\n }\n }\n\n obj.create = function(title) {\n if (typeof(obj.options.onbeforecreate) == 'function') {\n var ret = obj.options.onbeforecreate();\n if (ret === false) {\n return false;\n } else {\n title = ret;\n }\n }\n\n var div = obj.appendElement(title);\n\n if (typeof(obj.options.oncreate) == 'function') {\n obj.options.oncreate(el, div)\n }\n\n return div;\n }\n\n obj.nextNumber = function() {\n var num = 0;\n for (var i = 0; i < obj.headers.children.length; i++) {\n var tmp = obj.headers.children[i].innerText.match(/[0-9].*/);\n if (tmp > num) {\n num = parseInt(tmp);\n }\n }\n if (! num) {\n num = 1;\n } else {\n num++;\n }\n\n return num;\n }\n\n obj.deleteElement = function(index) {\n if (! obj.headers.children[index]) {\n return false;\n } else {\n obj.headers.removeChild(obj.headers.children[index]);\n obj.content.removeChild(obj.content.children[index]);\n }\n\n obj.open(0);\n\n if (typeof(obj.options.ondelete) == 'function') {\n obj.options.ondelete(el, index)\n }\n }\n\n obj.appendElement = function(title) {\n if (! title) {\n var title = prompt('Title?', '');\n }\n\n if (title) {\n // Add content\n var div = document.createElement('div');\n obj.content.appendChild(div);\n\n // Add headers\n var header = document.createElement('div');\n header.innerHTML = title;\n header.content = div;\n if (obj.options.allowCreate) {\n obj.headers.insertBefore(header, obj.headers.lastChild);\n } else {\n obj.headers.appendChild(header);\n }\n // Sortable\n if (obj.options.allowChangePosition) {\n header.setAttribute('draggable', 'true');\n }\n // Open new tab\n obj.selectIndex(header);\n\n // Return element\n return div;\n }\n }\n\n obj.init = function() {\n // New\n if (obj.options.allowCreate == true) {\n var add = document.createElement('i');\n add.className = 'jtabs-add';\n add.setAttribute('draggable', 'false');\n obj.headers.appendChild(add);\n }\n\n // Events\n obj.headers.addEventListener(\"click\", function(e) {\n if (e.target.tagName == 'DIV') {\n obj.selectIndex(e.target);\n } else {\n obj.create();\n }\n });\n\n obj.headers.addEventListener(\"contextmenu\", function(e) {\n if (e.target.tagName == 'DIV') {\n obj.selectIndex(e.target);\n }\n });\n\n if (obj.headers.children.length) {\n obj.open(0);\n }\n\n if (obj.options.allowChangePosition == true) {\n jSuites.sorting(obj.headers, {\n direction: 1,\n ondrop: function(a,b,c,d,e,f) {\n // Ondrop update position of content\n if (b > c) {\n obj.content.insertBefore(obj.content.children[b], obj.content.children[c]);\n } else {\n obj.content.insertBefore(obj.content.children[b], obj.content.children[c].nextSibling);\n }\n // Open destination tab\n obj.open(c);\n // Call event\n if (typeof(obj.options.onchangeposition) == 'function') {\n obj.options.onchangeposition(a,b,c,d,e,f);\n }\n },\n });\n }\n }\n\n // Create from data\n if (obj.options.data) {\n // Make sure the component is blank\n el.innerHTML = '';\n obj.headers = document.createElement('div');\n obj.content = document.createElement('div');\n obj.headers.classList.add('jtabs-headers');\n obj.content.classList.add('jtabs-content');\n el.appendChild(obj.headers);\n el.appendChild(obj.content);\n\n for (var i = 0; i < obj.options.data.length; i++) {\n var headersItem = document.createElement('div');\n obj.headers.appendChild(headersItem);\n var contentItem = document.createElement('div');\n obj.content.appendChild(contentItem);\n\n headersItem.innerHTML = obj.options.data[i].title;\n if (obj.options.data[i].content) {\n contentItem.innerHTML = obj.options.data[i].content;\n } else if (obj.options.data[i].url) {\n jSuites.ajax({\n url: obj.options.data[i].url,\n type: 'GET',\n success: function(result) {\n contentItem.innerHTML = result;\n },\n complete: function() {\n if (typeof(obj.options.onload) == 'function') {\n obj.options.onload(el);\n\n obj.init();\n obj.open(0);\n }\n }\n });\n }\n }\n } else if (el.children[0] && el.children[1]) {\n // Create from existing elements\n obj.headers = el.children[0];\n obj.content = el.children[1];\n obj.headers.classList.add('jtabs-headers');\n obj.content.classList.add('jtabs-content');\n obj.init();\n } else {\n el.innerHTML = '';\n obj.headers = document.createElement('div');\n obj.content = document.createElement('div');\n obj.headers.classList.add('jtabs-headers');\n obj.content.classList.add('jtabs-content');\n el.appendChild(obj.headers);\n el.appendChild(obj.content);\n obj.init();\n }\n\n el.tabs = obj;\n\n return obj;\n});\r\n\r\njSuites.tags = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n /**\n * @typedef {Object} defaults\n * @property {(string|Array)} value - Initial value of the compontent\n * @property {number} limit - Max number of tags inside the element\n * @property {string} search - The URL for suggestions\n * @property {string} placeholder - The default instruction text on the element\n * @property {validation} validation - Method to validate the tags\n * @property {requestCallback} onbeforechange - Method to be execute before any changes on the element\n * @property {requestCallback} onchange - Method to be execute after any changes on the element\n * @property {requestCallback} onfocus - Method to be execute when on focus\n * @property {requestCallback} onblur - Method to be execute when on blur\n * @property {requestCallback} onload - Method to be execute when the element is loaded\n */\n var defaults = {\n value: null,\n limit: null,\n limitMessage: 'The limit of entries is: ',\n search: null,\n placeholder: null,\n validation: null,\n onbeforechange: null,\n onchange: null,\n onfocus: null,\n onblur: null,\n onload: null,\n colors: null,\n };\n\n // Loop through though the default configuration\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n // Search helpers\n var searchContainer = null;\n var searchTerms = null;\n var searchIndex = 0;\n var searchTimer = 0;\n\n /**\n * Add a new tag to the element\n * @param {(?string|Array)} value - The value of the new element\n */\n obj.add = function(value, focus) {\n if (typeof(obj.options.onbeforechange) == 'function') {\n var v = obj.options.onbeforechange(el, obj, value);\n if (v != null) {\n value = v;\n }\n }\n\n // Close search\n if (searchContainer) {\n searchContainer.style.display = '';\n }\n\n if (obj.options.limit > 0 && el.children.length >= obj.options.limit) {\n alert(obj.options.limitMessage + ' ' + obj.options.limit);\n } else {\n // Get node\n var node = getSelectionStart();\n\n // Mix argument string or array\n if (! value || typeof(value) == 'string') {\n var div = document.createElement('div');\n div.innerHTML = value ? value : '
';\n if (node && node.parentNode.classList.contains('jtags')) {\n el.insertBefore(div, node.nextSibling);\n } else {\n el.appendChild(div);\n }\n } else {\n if (node && node.parentNode.classList.contains('jtags')) {\n if (! node.innerText.replace(\"\\n\", \"\")) {\n el.removeChild(node);\n }\n }\n\n for (var i = 0; i <= value.length; i++) {\n if (! obj.options.limit || el.children.length < obj.options.limit) {\n var div = document.createElement('div');\n div.innerHTML = value[i] ? value[i] : '
';\n el.appendChild(div);\n }\n }\n }\n\n // Place caret\n if (focus) {\n setTimeout(function() {\n caret(div);\n }, 0);\n }\n\n // Filter\n filter();\n\n if (typeof(obj.options.onchange) == 'function') {\n obj.options.onchange(el, obj, value ? value : '');\n }\n }\n }\n\n obj.remove = function(node) {\n // Remove node\n node.parentNode.removeChild(node);\n if (! el.children.length) {\n obj.add('');\n }\n }\n\n /**\n * Get all tags in the element\n * @return {Array} data - All tags as an array\n */\n obj.getData = function() {\n var data = [];\n for (var i = 0; i < el.children.length; i++) {\n // Get value\n var text = el.children[i].innerText.replace(\"\\n\", \"\");\n // Get id\n var value = el.children[i].getAttribute('data-value');\n if (! value) {\n value = text;\n }\n // Item\n if (text || value) {\n data.push({ text: text, value: value });\n }\n }\n return data;\n }\n\n /**\n * Get the value of one tag. Null for all tags\n * @param {?number} index - Tag index number. Null for all tags.\n * @return {string} value - All tags separated by comma\n */\n obj.getValue = function(index) {\n var value = null;\n\n if (index != null) {\n // Get one individual value\n value = el.children[index].getAttribute('data-value');\n if (! value) {\n value = el.children[index].innerText.replace(\"\\n\", \"\");\n }\n } else {\n // Get all\n var data = [];\n for (var i = 0; i < el.children.length; i++) {\n value = el.children[i].innerText.replace(\"\\n\", \"\");\n if (value) {\n data.push(obj.getValue(i));\n }\n }\n value = data.join(',');\n }\n\n return value;\n }\n\n /**\n * Set the value of the element based on a string separeted by (,|;|\\r\\n)\n * @param {string} value - A string with the tags\n */\n obj.setValue = function(text) {\n // Remove whitespaces\n text = text.trim();\n\n if (text) {\n // Tags\n var data = extractTags(text);\n // Add tags to the element\n obj.add(data);\n }\n }\n\n obj.reset = function() {\n el.innerHTML = '

';\n }\n\n /**\n * Verify if all tags in the element are valid\n * @return {boolean}\n */\n obj.isValid = function() {\n var test = 0;\n for (var i = 0; i < el.children.length; i++) {\n if (el.children[i].classList.contains('jtags_error')) {\n test++;\n }\n }\n return test == 0 ? true : false;\n }\n\n /**\n * Add one element from the suggestions to the element\n * @param {object} item - Node element in the suggestions container\n */ \n obj.selectIndex = function(item) {\n // Reset terms\n searchTerms = '';\n var node = getSelectionStart();\n // Append text to the caret\n node.innerText = item.children[1].innerText;\n // Set node id\n if (item.children[1].getAttribute('data-value')) {\n node.setAttribute('data-value', item.children[1].getAttribute('data-value'));\n }\n // Close container\n if (searchContainer) {\n searchContainer.style.display = '';\n searchContainer.innerHTML = '';\n }\n // Remove any error\n node.classList.remove('jtags_error');\n // Add new item\n obj.add();\n }\n\n /**\n * Search for suggestions\n * @param {object} node - Target node for any suggestions\n */\n obj.search = function(node) {\n // Create and append search container to the DOM\n if (! searchContainer) {\n var div = document.createElement('div');\n div.style.position = 'relative';\n el.parentNode.insertBefore(div, el.nextSibling);\n\n // Create container\n searchContainer = document.createElement('div');\n searchContainer.classList.add('jtags_search');\n div.appendChild(searchContainer);\n }\n\n // Search for\n var terms = node.anchorNode.nodeValue;\n\n // Search\n if (node.anchorNode.nodeValue && terms != searchTerms) {\n // Terms\n searchTerms = node.anchorNode.nodeValue;\n // Reset index\n searchIndex = 0;\n // Get remove results\n jSuites.ajax({\n url: obj.options.search + searchTerms,\n method: 'GET',\n dataType: 'json',\n success: function(data) {\n // Reset container\n searchContainer.innerHTML = '';\n\n // Print results\n if (! data.length) {\n // Show container\n searchContainer.style.display = '';\n } else {\n // Show container\n searchContainer.style.display = 'block';\n\n // Show items\n var len = data.length < 11 ? data.length : 10;\n for (var i = 0; i < len; i++) {\n // Legacy\n var text = data[i].text;\n if (! text && data[i].name) {\n text = data[i].name;\n }\n var value = data[i].value;\n if (! value && data[i].id) {\n value = data[i].id;\n }\n\n var div = document.createElement('div');\n if (i == 0) {\n div.classList.add('selected');\n }\n var img = document.createElement('img');\n if (data[i].image) {\n img.src = data[i].image;\n } else {\n img.style.display = 'none';\n }\n div.appendChild(img);\n\n var item = document.createElement('div');\n item.setAttribute('data-value', value);\n item.innerHTML = text;\n div.onclick = function() {\n // Add item\n obj.selectIndex(this);\n }\n div.appendChild(item);\n // Append item to the container\n searchContainer.appendChild(div);\n }\n }\n }\n });\n }\n }\n\n // Destroy tags element\n obj.destroy = function() {\n // Bind events\n el.removeEventListener('mouseup', tagsMouseUp);\n el.removeEventListener('keydown', tagsKeyDown);\n el.removeEventListener('keyup', tagsKeyUp);\n el.removeEventListener('paste', tagsPaste);\n el.removeEventListener('focus', tagsFocus);\n el.removeEventListener('blur', tagsBlur);\n // Remove element\n el.parentNode.removeChild(el);\n }\n\n var getRandomColor = function(index) {\n var rand = function(min, max) {\n return min + Math.random() * (max - min);\n }\n return 'hsl(' + rand(1, 360) + ',' + rand(40, 70) + '%,' + rand(65, 72) + '%)';\n }\n\n /**\n * Filter tags\n */\n var filter = function() {\n for (var i = 0; i < el.children.length; i++) {\n // Create label design\n if (! obj.getValue(i)) {\n el.children[i].classList.remove('jtags_label');\n } else {\n el.children[i].classList.add('jtags_label');\n\n // Validation in place\n if (typeof(obj.options.validation) == 'function') {\n if (obj.getValue(i)) {\n if (! obj.options.validation(el.children[i], el.children[i].innerText, el.children[i].getAttribute('data-value'))) {\n el.children[i].classList.add('jtags_error');\n } else {\n el.children[i].classList.remove('jtags_error');\n }\n } else {\n el.children[i].classList.remove('jtags_error');\n }\n }\n }\n }\n }\n\n /**\n * Place caret in the element node\n */\n var caret = function(e) {\n var range = document.createRange();\n var sel = window.getSelection();\n range.setStart(e, e.innerText.length);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n\n /**\n * Selection\n */\n var getSelectionStart = function() {\n var node = document.getSelection().anchorNode;\n if (node) {\n return (node.nodeType == 3 ? node.parentNode : node);\n } else {\n return null;\n }\n }\n\n /**\n * Extract tags from a string\n * @param {string} text - Raw string\n * @return {Array} data - Array with extracted tags\n */\n var extractTags = function(text) {\n /** @type {Array} */\n var data = [];\n\n /** @type {string} */\n var word = '';\n\n // Remove whitespaces\n text = text.trim();\n\n if (text) {\n for (var i = 0; i < text.length; i++) {\n if (text[i] == ',' || text[i] == ';' || text[i] == '\\r\\n') {\n if (word) {\n data.push(word);\n word = '';\n }\n } else {\n word += text[i];\n }\n }\n\n if (word) {\n data.push(word);\n }\n }\n\n return data;\n }\n\n /** @type {number} */\n var anchorOffset = 0;\n\n /**\n * Processing event keydown on the element\n * @param e {object}\n */\n var tagsKeyDown = function(e) {\n // Anchoroffset\n anchorOffset = window.getSelection().anchorOffset;\n\n // Verify content\n if (! el.children.length) {\n var div = document.createElement('div');\n div.innerHTML = '
';\n el.appendChild(div);\n }\n // Comma\n if (e.which == 9 || e.which == 186 || e.which == 188) {\n var n = window.getSelection().anchorOffset;\n if (n > 1) {\n if (! obj.options.limit || el.children.length < obj.options.limit) {\n obj.add('', true);\n }\n }\n e.preventDefault();\n } else if (e.which == 13) {\n // Enter\n if (searchContainer && searchContainer.style.display != '') {\n obj.selectIndex(searchContainer.children[searchIndex]);\n } else {\n var n = window.getSelection().anchorOffset;\n if (n > 1) {\n if (! obj.options.limit || el.children.length < obj.options.limit) {\n obj.add('', true);\n }\n }\n }\n e.preventDefault();\n } else if (e.which == 38) {\n // Up\n if (searchContainer && searchContainer.style.display != '') {\n searchContainer.children[searchIndex].classList.remove('selected');\n if (searchIndex > 0) {\n searchIndex--;\n }\n searchContainer.children[searchIndex].classList.add('selected');\n e.preventDefault();\n }\n } else if (e.which == 40) {\n // Down\n if (searchContainer && searchContainer.style.display != '') {\n searchContainer.children[searchIndex].classList.remove('selected');\n if (searchIndex < 9) {\n searchIndex++;\n }\n searchContainer.children[searchIndex].classList.add('selected');\n e.preventDefault();\n }\n }\n }\n\n /**\n * Processing event keyup on the element\n * @param e {object}\n */\n var tagsKeyUp = function(e) {\n if (e.which == 39) {\n var n = window.getSelection().anchorOffset;\n if (n > 1 && n == anchorOffset) {\n obj.add('', true);\n }\n } else if (e.which == 13 || e.which == 38 || e.which == 40) {\n e.preventDefault();\n } else {\n if (searchTimer) {\n clearTimeout(searchTimer);\n }\n\n searchTimer = setTimeout(function() {\n // Current node\n var node = window.getSelection();\n // Search\n if (obj.options.search) {\n obj.search(node);\n }\n searchTimer = null;\n }, 300);\n }\n\n filter();\n }\n\n /**\n * Processing event paste on the element\n * @param e {object}\n */\n var tagsPaste = function(e) {\n if (e.clipboardData || e.originalEvent.clipboardData) {\n var html = (e.originalEvent || e).clipboardData.getData('text/html');\n var text = (e.originalEvent || e).clipboardData.getData('text/plain');\n } else if (window.clipboardData) {\n var html = window.clipboardData.getData('Html');\n var text = window.clipboardData.getData('Text');\n }\n\n obj.setValue(text);\n e.preventDefault();\n }\n\n /**\n * Processing event mouseup on the element\n * @param e {object}\n */\n var tagsMouseUp = function(e) {\n if (e.target.parentNode && e.target.parentNode.classList.contains('jtags')) {\n if (e.target.classList.contains('jtags_label') || e.target.classList.contains('jtags_error')) {\n const rect = e.target.getBoundingClientRect();\n if (rect.width - (e.clientX - rect.left) < 16) {\n obj.remove(e.target);\n }\n }\n }\n\n if (searchContainer) {\n searchContainer.style.display = '';\n }\n }\n\n /**\n * Processing event focus on the element\n * @param e {object}\n */\n var tagsFocus = function(e) {\n if (! el.children.length || obj.getValue(el.children.length - 1)) {\n if (! obj.options.limit || el.children.length < obj.options.limit) {\n var div = document.createElement('div');\n div.innerHTML = '
';\n el.appendChild(div);\n }\n }\n\n if (typeof(obj.options.onfocus) == 'function') {\n obj.options.onfocus(el, obj, obj.getValue());\n }\n }\n\n /**\n * Processing event blur on the element\n * @param e {object}\n */\n var tagsBlur = function(e) {\n if (searchContainer) {\n setTimeout(function() {\n searchContainer.style.display = '';\n }, 200);\n }\n\n for (var i = 0; i < el.children.length - 1; i++) {\n // Create label design\n if (! obj.getValue(i)) {\n el.removeChild(el.children[i]);\n }\n }\n\n if (typeof(obj.options.onblur) == 'function') {\n obj.options.onblur(el, obj, obj.getValue());\n }\n }\n\n // Bind events\n el.addEventListener('mouseup', tagsMouseUp);\n el.addEventListener('keydown', tagsKeyDown);\n el.addEventListener('keyup', tagsKeyUp);\n el.addEventListener('paste', tagsPaste);\n el.addEventListener('focus', tagsFocus);\n el.addEventListener('blur', tagsBlur);\n\n // Prepare container\n el.classList.add('jtags');\n el.setAttribute('contenteditable', true);\n el.setAttribute('spellcheck', false);\n\n if (obj.options.placeholder) {\n el.placeholder = obj.options.placeholder;\n }\n\n // Make sure element is empty\n if (obj.options.value) {\n obj.setValue(obj.options.value);\n } else {\n el.innerHTML = '

';\n }\n\n if (typeof(obj.options.onload) == 'function') {\n obj.options.onload(el, obj);\n }\n\n el.tags = obj;\n\n return obj;\n});\r\n\r\njSuites.toolbar = (function(el, options) {\n var obj = {};\n obj.options = {};\n\n // Default configuration\n var defaults = {\n app: null,\n badge: false,\n title: false,\n items: [],\n }\n\n // Loop through our object\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n obj.options[property] = defaults[property];\n }\n }\n\n if (! el && options.app && options.app.el) {\n el = document.createElement('div');\n options.app.el.appendChild(el);\n }\n\n obj.selectItem = function(element) {\n var elements = toolbarContent.children;\n for (var i = 0; i < elements.length; i++) {\n if (element != elements[i]) {\n elements[i].classList.remove('jtoolbar-selected');\n }\n }\n element.classList.add('jtoolbar-selected');\n }\n\n obj.hide = function() {\n jSuites.animation.slideBottom(el, 0, function() {\n el.style.display = 'none';\n });\n }\n\n obj.show = function() {\n el.style.display = '';\n jSuites.animation.slideBottom(el, 1);\n }\n\n obj.get = function() {\n return el;\n }\n\n obj.setBadge = function(index, value) {\n toolbarContent.children[index].children[1].firstChild.innerHTML = value;\n }\n\n obj.destroy = function() {\n toolbar.remove();\n el.innerHTML = '';\n }\n\n obj.create = function(items) {\n // Reset anything in the toolbar\n toolbarContent.innerHTML = '';\n // Create elements in the toolbar\n for (var i = 0; i < items.length; i++) {\n var toolbarItem = document.createElement('div');\n toolbarItem.classList.add('jtoolbar-item');\n\n if (items[i].width) {\n toolbarItem.style.width = parseInt(items[i].width) + 'px'; \n }\n\n if (items[i].k) {\n toolbarItem.k = items[i].k;\n }\n\n if (items[i].tooltip) {\n toolbarItem.setAttribute('title', items[i].tooltip);\n }\n\n // Id\n if (items[i].id) {\n toolbarItem.setAttribute('id', items[i].id);\n }\n\n if (! items[i].type || items[i].type == 'i') {\n // Material icons\n var toolbarIcon = document.createElement('i');\n toolbarIcon.classList.add('material-icons');\n toolbarIcon.innerHTML = items[i].content ? items[i].content : '';\n toolbarItem.appendChild(toolbarIcon);\n\n // Badge options\n if (obj.options.badge == true) {\n var toolbarBadge = document.createElement('div');\n toolbarBadge.classList.add('jbadge');\n var toolbarBadgeContent = document.createElement('div');\n toolbarBadgeContent.innerHTML = items[i].badge ? items[i].badge : '';\n toolbarBadge.appendChild(toolbarBadgeContent);\n toolbarItem.appendChild(toolbarBadge);\n }\n\n // Title\n if (items[i].title) {\n if (obj.options.title == true) {\n var toolbarTitle = document.createElement('span');\n toolbarTitle.innerHTML = items[i].title;\n toolbarItem.appendChild(toolbarTitle);\n } else {\n toolbarItem.setAttribute('title', items[i].title);\n }\n }\n\n if (obj.options.app && items[i].route) {\n // Route\n toolbarItem.route = items[i].route;\n // Onclick for route\n toolbarItem.onclick = function() {\n options.app.pages(this.route);\n }\n\n // Create pages\n obj.options.app.pages(items[i].route, {\n toolbarItem: toolbarItem,\n closed: true,\n onenter: function() {\n obj.selectItem(this.toolbarItem);\n }\n });\n } else if (items[i].onclick) {\n toolbarItem.onclick = (function (a) {\n var b = a;\n return function () {\n items[b].onclick(el, obj, this);\n };\n })(i);\n }\n } else if (items[i].type == 'select' || items[i].type == 'dropdown') {\n if (items[i].options) {\n toolbarItem.classList.add('jtoolbar-dropdown');\n toolbarItem.setAttribute('tabindex', '0');\n toolbarItem.onblur = function() {\n this.classList.remove('jtoolbar-focus');\n }\n\n // Dropdown header\n if (items[i].content) {\n var dropdown = document.createElement('div');\n dropdown.innerHTML = '' + items[i].content + '';\n } else {\n var dropdown = document.createElement('div');\n dropdown.innerHTML = '';\n }\n dropdown.classList.add('jtoolbar-dropdown-header');\n dropdown.onclick = function(e) {\n if (this.parentNode.classList.contains('jtoolbar-focus')) {\n this.parentNode.classList.remove('jtoolbar-focus');\n } else {\n var e = this.parentNode.parentNode.querySelectorAll('.jtoolbar-item');\n for (var j = 0; j < e.length; j++) {\n e[j].classList.remove('jtoolbar-focus');\n }\n\n this.parentNode.classList.add('jtoolbar-focus');\n\n const rectHeader = this.getBoundingClientRect();\n const rectContent = this.nextSibling.getBoundingClientRect();\n\n if (window.innerHeight < rectHeader.bottom + rectContent.height) {\n this.nextSibling.style.top = '';\n this.nextSibling.style.bottom = rectHeader.height + 1 + 'px';\n } else {\n this.nextSibling.style.top = '';\n this.nextSibling.style.bottom = '';\n }\n }\n }\n\n // Dropdown\n var dropdownContent = document.createElement('div');\n dropdownContent.classList.add('jtoolbar-dropdown-content');\n toolbarItem.appendChild(dropdown);\n toolbarItem.appendChild(dropdownContent);\n\n for (var j = 0; j < items[i].options.length; j++) {\n var dropdownItem = document.createElement('div');\n if (typeof(items[i].render) == 'function') {\n var value = items[i].render(items[i].options[j]);\n } else {\n var value = items[i].options[j];\n }\n dropdownItem.p = toolbarItem;\n dropdownItem.k = j;\n dropdownItem.v = items[i].options[j];\n dropdownItem.innerHTML = value;\n dropdownItem.onchange = items[i].onchange;\n if (items[i].content) {\n dropdownItem.onclick = function() {\n this.onchange(el, obj, this.p, this.v, this.k);\n this.p.classList.remove('jtoolbar-focus');\n }\n } else {\n dropdownItem.onclick = function() {\n this.parentNode.parentNode.firstChild.innerHTML = this.innerHTML;\n this.onchange(el, obj, this.p, this.v, this.k);\n this.p.classList.remove('jtoolbar-focus');\n }\n }\n dropdownContent.appendChild(dropdownItem);\n\n if (! items[i].content && j == 0) {\n dropdown.innerHTML = value;\n }\n }\n }\n\n if (items[i].onclick) {\n toolbarItem.onclick = (function (a) {\n var b = a;\n return function () {\n items[b].onclick(el, obj, this);\n };\n })(i);\n }\n } else if (items[i].type == 'color') {\n toolbarItem\n } else if (items[i].type == 'divisor') {\n toolbarItem.classList.add('jtoolbar-divisor');\n }\n\n toolbarContent.appendChild(toolbarItem);\n }\n }\n\n el.classList.add('jtoolbar');\n\n el.innerHTML = '';\n el.onclick = function(e) {\n var element = jSuites.findElement(e.target, 'jtoolbar-item');\n if (element) {\n obj.selectItem(element);\n }\n }\n\n var toolbarContent = document.createElement('div');\n el.appendChild(toolbarContent);\n\n if (obj.options.app) {\n el.classList.add('jtoolbar-mobile');\n }\n\n obj.create(obj.options.items);\n\n el.toolbar = obj;\n\n return obj;\n});\r\n\r\n\r\n\r\n return jSuites;\r\n\r\n})));"],"sourceRoot":""}