function strip_html(html) { var tmp = document.createElement("DIV"); tmp.innerHTML = html; var tmp2 = document.createElement("DIV"); tmp2.innerHTML = tmp.textContent || tmp.innerText || ""; return tmp2.textContent || tmp2.innerText || ""; } var appasyncadd = appasyncadd || []; (function() { var app = {}, am = {}, self = {}; var loader = function(an_app) { app = an_app; am = app.misc; app.script = module; self = module; self.init(); }; setTimeout(function() { appasyncadd.push(loader); }, 0); var busy, edit, desk, jsp = null; var module = { role: null, _isHs: null, view_notes: [], starred: { data: [], readonly: false, _shrinkString: function(string, len = 35) { let ret = string; if (ret.length > len) { let trimmedString = ret.substr(0, len); ret = trimmedString.substr(0, Math.min(trimmedString.length, trimmedString.lastIndexOf(" "))); ret = ret + " ..."; } if (ret.trim() === "") ret = Translator.trans('default_step_title') return ret; }, itemHtml: function(id, title, withControls = true) { return '
  • ' + '
    ' + (withControls ? '' : '') + '' + title + '' + (withControls ? '' : '') + '
    ' + '
  • '; }, _getItemCategory(id) { let cat = this.data.filter((g) => Array.isArray(g.s) ? g.s.includes(id) : null); if (!cat || (Array.isArray(cat) && cat.length === 0)) return null; return cat[0].n; }, _getStepTitle: function(id, steps = null) { let ret = ''; let filtered = []; if (steps) { filtered = steps.filter(step => step.id === id); } else if (self.steps) { filtered = self.steps.filter(step => step.id === id); } else { filtered = self.view.runningScriptData.steps.filter(step => step.id === id); } let step; if (filtered.length > 0) { step = filtered[0]; if (step.title && step.title.trim().length > 0) ret = strip_html(step.title); else ret = strip_html(step.text); } else { ret = $('#' + id).find('.text').text(); } ret = this._shrinkString(ret, 35); return ret; }, selectOperator(stepId) { let fav_box = $('.js_starred_box'); fav_box.find('.js_starred_item').removeClass('selected'); fav_box.find('.js_starred_item[data-id=' + stepId + ']').addClass('selected'); fav_box.find('.js_starred_item[data-id=' + stepId + ']').addClass('visited'); }, clearBox: function() { let ul = $(".js_starred_list_sorting"); ul.html(""); }, renderBox: function() { this.bindStarredEvents(); let ul = $(".js_starred_list_sorting"); ul.html(""); this.data.forEach(function(group, index) { if (group.s && Array.isArray(group.s)) { let itemsUl = ''; if (group.s.length > 0) ul.append('
  • ' + group.n + "
    " + itemsUl + "
  • "); } }); $.each($('.js_starred_group'), function(index, el) { $(el).children('div').prepend(''); let others = Translator.trans('step_category.others'); if ($(el).data("id") !== others) $(el).children('div').append('' + ''); }); $.each($('.js_starred_item'), function(i, e) { let stepId = $(e).data('id'); let filtered = self.steps.filter(step => step.id === stepId); let starred = false; if (filtered.length > 0) { starred = filtered[0].is_starred; } else { starred = $('#' + stepId).hasClass('is_starred'); } self.starred.setDisabled($(e), !starred); }); self.starred._bindSortables(); }, _bindSortables: function() { let ul = $(".js_starred_list_sorting"); let ulItems = $(".starred-group-items"); try { ul.sortable('destroy'); ulItems.sortable('destroy'); } catch (e) {} ul.sortable({ connectWith: '.js_starred_list_sorting', stop: function(e, ui) { self.starred.refreshSorting(); } }); ulItems.sortable({ connectWith: '.starred-group-items', stop: function(e, ui) { self.starred.refreshSorting(); } }); }, setDisabled: function(itemEl, disabled) { if (disabled) { itemEl.find('.starred-eye-icon').removeClass('glyphicon-eye-close').addClass('glyphicon-eye-open'); itemEl.addClass('disabled'); } else { itemEl.find('.starred-eye-icon').addClass('glyphicon-eye-close').removeClass('glyphicon-eye-open'); itemEl.removeClass('disabled'); } }, bindStarredEvents: function() { // search $('.js_starred_search').off().on('change keyup', function() { self.starred.search($(this)); }); let ul = $(".js_starred_list_sorting"); ul.off(); // item click ul.on('click', '.js_starred_item a', function(e) { e.preventDefault(); let stepId = $(this).data('id'); let stepEl = $('#' + stepId); self.constructor.onStepSelected(stepEl); $('.js_constructor_box').show(); $('.js_view_box').hide(); $('.js_scripts_action_view').addClass('open').removeClass('active'); $('.js_show_constructor').addClass('active'); $('html, body').animate({ scrollTop: stepEl.offset().top - 150, scrollLeft: stepEl.offset().left - 350 }, 300); }); //enabled/disabled ul.on('click', '.starred-eye-icon', function(e) { e.preventDefault(); let itemEl = $(this).closest('.js_starred_item'); let isStarred = itemEl.hasClass('disabled'); self.starred.setDisabled(itemEl, !isStarred); let id = itemEl.data("id"); let s = $('#' + id); s.data('is_starred', isStarred); s.data('starred_text', ''); s[isStarred ? 'addClass' : 'removeClass']('is_starred'); am.trigger('constructor step is_starred changed', [s]); }); ul.on('click', '.group-fold', function(e) { e.preventDefault(); $(this).closest('.js_starred_group').find('.starred-group-items').toggleClass('folded'); }); // group edit ul.on('click', '.starred-edit', function(e) { e.preventDefault(); let groupLi = $(this).parents('.js_starred_group'); let category = groupLi.data("id"); app.get('all').done(function(all) { let input = ''; all.addition.show(Translator.trans('rename_starred_group_message'), input, function() { let newName = $('#rename_starred_group_input').val(); self.starred.data.map((g) => { if (g.n === category) { g.n = newName; } }); groupLi.attr("data-id", newName); groupLi.children('div').children('a').text(newName); self.starred.onDataChanged(); am.trigger("constructor starred category renamed"); }); }); }); // group delete ul.on('click', '.starred-remove', function(e) { e.preventDefault(); let groupLi = $(this).parents('.js_starred_group'); let category = groupLi.data("id"); app.get('all').done(function(all) { all.confirm.show(Translator.trans('confirm_remove_starred_group') + " \"" + category + "\"?", function() { let gsToRemove = self.starred.data.filter((g) => g.n === category); if (Array.isArray(gsToRemove)) gsToRemove = gsToRemove[0]; else return; // move steps to others let others = Translator.trans('step_category.others'); self.starred.data.map((g) => { if (g.n === others) { gsToRemove.s.forEach((s) => { g.s.push(s); }); } }) self.starred.data = self.starred.data.filter((g) => g.n !== category); self.starred.onDataChanged(); groupLi.remove(); am.trigger("constructor starred category removed"); self.starred.renderBox(); }); }); }); }, refreshSorting: function() { let ul = $(".js_starred_list_sorting"); let newData = []; $.each(ul.find('.js_starred_group'), function(index, el) { let group = $(el).data("id"); let steps = [] $.each($(el).find('.js_starred_item'), function(idx, s) { steps.push($(s).data("id")); }); newData.push({ "n": group, "s": steps }); }); this.data = newData; self.starred.onDataChanged(); am.trigger("constructor starred order changed"); }, remove: function(steps) { $.each(steps, function(idx, jel) { let sId = jel.attr("id"); self.starred.data.map((g) => { g.s = g.s.filter(s => sId !== s); }); $('.js_starred_item[data-id=' + sId + ']').remove(); }); self.starred.onDataChanged(); }, add: function(steps) { let others = Translator.trans('step_category.others'); $.each(steps, function(idx, jel) { let id = $(jel).attr("id"); if (self.starred.data.filter((g) => g.n === others).length < 1) { //add new cat if not exist self.starred.data.push({ "n": others, "s": [] }); let ul = $(".js_starred_list_sorting"); let title = $(jel).find(".text").text(); ul.append('
  • ' + '' + '' + others + '' + '
    ' + '' + "
  • "); } self.starred.data.map((g) => { if (g.n === others) { g.s.push(id); } }); $.each($('.js_starred_group>div>a'), function(idx, el) { if ($(el).text().includes(others)) { let ul = $(el).parents('.js_starred_group').find('.starred-group-items'); let title = $(jel).find(".text").text(); ul.append(self.starred.itemHtml(id, title)); } }); self.starred.onDataChanged(); self.starred._bindSortables(); }) }, change: function(steps) { $.each(steps, function(idx, jel) { let id = $(jel).attr("id"); let title = $(jel).find(".text").text(); title = self.starred._shrinkString(title, 40); $('.js_starred_item[data-id=' + id + ']>div>a').text(title); let newCategory = $(jel).data('category'); let oldCategory = self.starred._getItemCategory(id); if (newCategory && newCategory !== oldCategory) { if (self.starred.data.filter((g) => g.n === newCategory).length < 1) { //add new cat if not exist self.starred.data.push({ "n": newCategory, "s": [] }); } self.starred.data.map((g) => { if (g.n === oldCategory) { let idx = g.s.indexOf(id); if (idx > -1) { g.s.splice(idx, 1); } } if (g.n === newCategory) { if (!g.s) g.s = []; g.s.push(id); } }); self.starred.onDataChanged(); self.starred.renderBox(); } }) }, search: function(el) { let q = el.val().toLowerCase(); let filtered = []; if (self.steps) { filtered = self.steps.filter(step => { return (step.text && step.text.toLowerCase().includes(q)) || (step.title && step.title.toLowerCase().includes(q)); }); } else { filtered = self.view.runningScriptData.steps.filter(step => { return (step.text && step.text.toLowerCase().includes(q)) || (step.title && step.title.toLowerCase().includes(q)); }); } $('.js_starred_item').hide(); $('.js_starred_group').hide(); filtered.forEach(s => { let stEl = $('.js_starred_item[data-id=' + s.id + ']'); let parent = stEl.parents('.js_starred_group'); parent.show(); parent.find('.folded').removeClass('folded'); stEl.show(); }) }, set readOnly(readonly) { this.readonly = readonly; let ul = $(".js_starred_list_sorting"); if (readonly) { ul.addClass('readonly'); } else { ul.removeClass('readonly'); } }, get readOnly() { return this.readonly; }, onDataChanged() { // drop empty cats this.data = this.data.filter((g) => Array.isArray(g.s) && g.s.length > 0); // hide empty cats $('.js_starred_group').hide(); this.data.forEach(g => { $('.js_starred_group[data-id=\'' + g.n + '\']').show(); }) }, }, isHs: function() { if (self._isHs === null) { self._isHs = $('body').hasClass('hs'); $('body').removeClass('hs'); } return self._isHs; }, view: { setProgress: function(percent) { percent = Math.min(100, am.naturalize(percent)); $('.progressBar .progressPercent').text(percent); $('.progressBar .progressLineFill').width(Math.round($('.progressBar .progressLineBack').width() * percent / 100)); }, nlToArray: function(str) { if (typeof str === 'number') str = str.toString(); if (typeof str !== 'string') str = ''; str = str.trim(); var arr = str.split('\n'); if (arr.length === 1) return str; return arr; }, convertScript: function(data) { if (!data || !data.steps || !$.isArray(data.steps)) { throw 'Некорректные данные'; } var hash = {}; var list = []; $.each(data.steps, function(i, o) { if (!o.id) { throw 'Некорректный шаг в данных'; } hash[o.id] = { id: o.entity_id, name: o.id, is_starred: o.is_starred, is_goal: o.is_goal, starred_text: o.starred_text, starred_sorting: o.starred_sorting, text: self.view.nlToArray(o.text), buttons: [], tasks: o.tasks }; list.push(hash[o.id]); }); if (data.connections && $.isArray(data.connections)) { $.each(data.connections, function(i, o) { if (!o.source || !o.target || typeof o.condition !== 'string') { throw 'Некорректная связь в данных'; } var s = o.source; var t = o.target; if (!hash[s] || !hash[t]) { throw 'Некорректная связь в данных'; } hash[s].buttons.push({ state: t, text: o.condition, id: o.id, status: o.status }); }); } return self.view.setNodeDistances(list); }, setNodeDistances: function(data) { if (!$.isArray(data) || data.length < 1) return data; var Node = function(id) { this.id = id; this.distanceFromStart = null; this.distanceToEnd = null; this.parents = []; this.children = []; }; var start = null; var net = {}; $.each(data, function(i, o) { net[o.name] = new Node(o.name); if (o.name === 'start') { start = net[o.name]; } }); if (!start) { start = data[0]; } $.each(data, function(i, o) { if (!$.isArray(o.buttons)) return; $.each(o.buttons, function(i, b) { net[o.name].children.push(net[b.state]); if ($.inArray(net[o.name], net[b.state].parents) < 0) { net[b.state].parents.push(net[o.name]); } }); }); var ends = []; $.each(net, function(i, o) { if (o.children.length < 1) { ends.push(o); } }); var updateDistance = function(waveFrontNodes, distProp, listProp, dist, waveName) { if (waveFrontNodes.length < 1) return; var nextWaveFrontNodes = []; $.each(waveFrontNodes, function(i, o) { if (o['wave' + waveName + 'passed']) return; o['wave' + waveName + 'passed'] = true; o[distProp] = dist; nextWaveFrontNodes = nextWaveFrontNodes.concat(o[listProp]); }); updateDistance(nextWaveFrontNodes, distProp, listProp, dist + 1, waveName); }; updateDistance([start], 'distanceFromStart', 'children', 0, 'start'); updateDistance(ends, 'distanceToEnd', 'parents', 0, 'ends'); $.each(net, function(i, o) { if (o.distanceFromStart === null) { o.distanceFromStart = 0; } if (o.distanceToEnd === null) { o.distanceToEnd = Infinity; } }); $.each(data, function(i, o) { var fromStart = net[o.name].distanceFromStart; var total = fromStart + net[o.name].distanceToEnd; o.progress = total > 0 ? Math.round(fromStart / total * 1000) / 10 : 0; }); return data; }, appendUnexpectedBoxToLogItem: function(id) { var box = $('.log').find('.item[data-id=' + id + ']'); var html = '
    ' + '' + '
    '; box.append(html); }, logStep: function(step, status, cid) { am.trigger('log step', [step, status, cid]); //If step from other script var matches = step.name.match(/^(\d+)_(s\d+|start)/); if (matches) { var scriptId = matches[1], stepName = matches[2]; //self.view.stopScriptAndSaveLog('cross', true); busy = true; $.fancybox.showLoading(); $('.log .item').addClass('previous-item'); self.crossScript = true; let params = {}; params.method = 'api.getIntegrationScript'; params.user = self.view.scriptUser; params.key = self.view.scriptUserKey; params.apikey = self.view.scriptApiKey; params.id = scriptId; $.post(myDomain + '/ajax', params, function(data) { let result = data.response; busy = false; $.fancybox.hideLoading(); let fields = result.fields; $.each(fields, function(i, field) { let val = app.addField.getFieldValueByName(field.name); if (val) { field.value = val; } }); app.addField.setFields(fields); self.view.launchScript(result.id, result.ver, result.name, result.data, result.target, stepName); }); return; } cid = cid || ''; var lel = $('.log'); lel.find('.unexpected_answer').remove(); var buttonsIsArray = step.buttons && $.isArray(step.buttons); var html = [ '
    ', '
    ' + (lel.find('.item').length + 1) + ' >
    ', '
    ' + ($.isArray(step.text) ? step.text.join(' ') : step.text) + '
    ', (buttonsIsArray ? $.map(step.buttons, function(b) { var className = (b.status === 'positive' ? 'btn-success' : '') + (b.status === 'negative' ? 'btn-danger' : '') + (b.status !== 'positive' && b.status !== 'negative' ? 'btn-default' : ''); var button = $('' : ' '), '
    ' ].join('\n'); lel.find('.item').fadeTo(0, 0.5); html = app.addField.replaceFields(html, true); lel.append(html); lel.find('.js_script_field_multilist').each(function(index, select) { var placeholder = $(this).attr('placeholder'); $(this).select2({ width: '196px', placeholder: placeholder }); }); lel.scrollTop(lel[0].scrollHeight); $('.js_view_box .progressBar .talk_is_over')[step.progress && step.progress >= 100 ? 'hide' : 'show'](); self.starred.selectOperator(step.name); }, testProgressBar: function() { var pr = 0; var pi = setInterval(function() { self.view.setProgress(pr++); if (pr > 100) clearInterval(pi); }, 100); }, testLogHeight: function() { for (var i = 0; i < 50; i++) { $('.log').append('
    ' + i + ' ' + Math.random() + '
    '); } }, openAndLaunchScript: function(id, ver, name, data, target) { self.view.lastOpenData = [id, ver, name, data, target]; let vbel = $('.js_view_box'); vbel.find('.js_starred_search').val(''); vbel.find('.log').html(''); vbel.find('.progressPercent').text(0); vbel.find('.progressLineFill').width(0); self.view.launchScript(id, ver, name, data, target); }, lastOpenData: [], reopenAndLaunchScript: function() { self.view.openAndLaunchScript.apply(self.view, self.view.lastOpenData); }, runningScriptId: null, runningScriptVer: null, scriptUser: null, scriptUserKey: null, scriptApiKey: null, withoutSaving: null, runningScriptData: null, launchScript: function(id, ver, name, data, target, toState, cid) { toState = toState || null; cid = cid || null; self.view.runningScriptData = data; $('.log .heading h2').text(name); $('.log .heading').show(); if (target) { $('.script-target').show().find('.target-content').text(target); } else { $('.script-target').hide(); } var f = new app.Fsm(); f.disableToCheck(); f.addState('init', { name: 'init', off: function() { $('.log .heading').remove(); } }); var steps = null; try { steps = self.view.convertScript(data); } catch (e) { alert('Что-то пошло не так при запуске скрипта, попробуйте перезагрузить страницу'); return; } $.each(steps, function(i, s) { f.addState(s.name, { name: s.name, on: function(data) { var cid; if (typeof data != 'undefined') { cid = data.cid; } self.view.logStep(s, this.next, cid); self.view.setProgress(s.progress ? s.progress : 0); } }); }); if (data.starred) self.starred.data = data.starred; self.view.renderStarredBox(steps); f.init('init'); self.view.fsm = f; let vbel = $('.js_view_box'); vbel.unbind('click.setState').on('click.setState', '.js_starred_item>div>a, .item .set_state, button.set_state', function(e) { e.preventDefault(); let button = $(this); let par = button.parents('.item').first(); let removeCount = 0; if (!par.is($('.log .item').last())) { removeCount = par.nextAll().length; par.nextAll().remove(); } let nextState = button.data('state') || button.data('id'); if (!nextState) { return; } let cid = button.data('id'); let script = par.data('script'); if (script && script.id != self.view.runningScriptId) { busy = true; $.fancybox.showLoading(); let params = {}; params.method = 'api.getIntegrationScript'; params.user = self.view.scriptUser; params.key = self.view.scriptUserKey; params.apikey = self.view.scriptApiKey; params.id = script.id; $.post(myDomain + '/ajax', params, function(data) { let result = data.response; busy = false; $.fancybox.hideLoading(); let fields = result.fields; app.addField.setFields(fields); self.view.launchScript( result.id, result.ver, result.name, result.data, result.target, button.data('state'), cid ); }); } else { f.to(nextState, { cid: cid }); } try { top.postMessage({ type: 'state_changed', z: self.view.runningScriptId, s: nextState, c: cid, r: removeCount }, '*') } catch (e) {} }); vbel.unbind('keyup.jsField change.jsField click.jsField') .on('keyup.jsField change.jsField click.jsField', '.js_script_field', function() { $('.js_view_box .js_field').removeClass('active'); $(this).parents('.js_field').addClass('active'); var value = $(this).val(); var fieldId = $(this).parents('.js_field').data('id'); var field = app.addField.getField(fieldId); if (!field) return; app.addField.setFieldValue(fieldId, value); if (field.type === 'checkbox') { app.addField.setFieldValue(fieldId, (($(this).is(':checked')) ? 1 : 0)); let checkboxes = $('.js_view_box .js_field[data-id=' + fieldId + ']').not('.active').find('.js_script_field'); if ($(this).is(':checked')) { checkboxes.prop('checked', true); } else { checkboxes.prop('checked', false); } try { top.postMessage({ type: 'field_changed', z: self.view.runningScriptId, id: fieldId, t: field.type, v: $(this).is(':checked') }, '*') } catch (e) {} } else if (field.type === 'multilist') { let multiField = $('.js_view_box .js_field[data-id=' + fieldId + ']').not('.active'); multiField.find('.js_script_field').val(value).trigger('change.select2'); multiField.find('.field__value').text(value); } else { let elnactive = $('.js_view_box .js_field[data-id=' + fieldId + ']').not('.active'); elnactive.find('.js_script_field').val(value); elnactive.find('.field__value').text(value); // пересчет полей с формулами if (field.type === 'number') { $.each(app.addField.getFields(), function(id, fieldFormulas) { if (fieldFormulas.type === 'number' && fieldFormulas.options.numberFormula && fieldFormulas.options.numberFormula.value && fieldFormulas.options.numberFormula.value.indexOf('data-id="' + field.id + '"') !== -1) { let nffValue = app.addField.calcNumberFormula( fieldFormulas.options.numberFormula.value ); app.addField.setFieldValue(fieldFormulas.id, nffValue); let fField = $('.js_view_box .js_field[data-id=' + fieldFormulas.id + ']').not('.active'); fField.find('.js_script_field').val(nffValue); fField.find('.field__value').text(nffValue); } }); } try { top.postMessage({ type: 'field_changed', z: self.view.runningScriptId, id: fieldId, t: field.type, v: value }, '*') } catch (e) {} } self.view.renderNotesBox($('.js_outnotes_box .outnotes_box-search input').val()); }); $('.js_view_box .progressBar .talk_is_over').show(); self.view.runningScriptId = id; self.view.runningScriptVer = ver; self.view.renderFieldsBox(); if (self.isHs() && !toState) { f.to('start'); } else if (toState) { if (cid) { f.to(toState, { cid: cid }); } else { f.to(toState); } } try { top.postMessage('send_history', '*') } catch (e) {} self.view.renderNotesBox(); $('.js_render_widgets, .js_starred_box, .js_outfields_box, .js_outnotes_box').removeClass('view_box__closed'); $('.outnotes_box-search input').val(''); $('.js_render_widgets').addClass('view_box__closed'); if (true) { $('.js_outfields_box').addClass('view_box__closed'); $('.js_outnotes_box').addClass('view_box__closed'); } else { $('.js_outfields_box').addClass('view_box__closed'); } //self.view.renderClosedViewBox(); am.trigger('start script'); }, renderStarredBox: function(steps) { let box = $('.js_starred_box'); box.parent('.view_box_sidebar').show(); box.hide(); let ul = $(".js_starred_list_operator"); ul.find('.js_starred_group').remove(); ul.html(""); let stepsStarred = self.starred.data; if (!stepsStarred.length) { return; } ul.off('click', '.group-fold').on('click', '.group-fold', function(e) { e.preventDefault(); $(this).closest('.js_starred_group').find('.starred-group-items').toggleClass('folded'); $(this).toggleClass('folded'); }); stepsStarred.forEach(function(group, index) { if (group.s && Array.isArray(group.s)) { let ss = group.s.filter(s => { let starred = false; steps.forEach(function(step) { if (step.name === s) { starred = step.is_starred; } }); return starred; }); let itemsUl = ''; if (ss.length > 0) ul.append('
  • ' + group.n + "
    " + itemsUl + "
  • "); } }); box.show(); $('.js_starred_search').off().on('change keyup', function() { self.starred.search($(this)); }); }, renderNotesBox: function(search) { search = search || null; var recommendNotes = app.notes.getRecommendNotes(); var box = $('.js_outnotes_box'); box.show(); box.find('.outnotes_box-item').remove(); box.find('.outnotes_box-ul').remove(); if (typeof self.view_notes != 'object' || self.view_notes.length === 0) { box.hide(); return; } var array = []; $.each(self.view_notes, function(i, item) { item.style = null; if ($.inArray(item.id, recommendNotes) != -1) { item.priority = 999999 + item.priority; item.style = 'font-weight: bold'; } array.push(item); }); var view_notes_sorted = array.sort(function(a, b) { return b.priority - a.priority; }); if (search) { view_notes_sorted = $(view_notes_sorted).filter(function(i, o) { if (o.title.toLowerCase().indexOf(search.toLowerCase()) == -1 && o.content.toLowerCase().indexOf(search.toLowerCase()) == -1) { return; } return true; }); } var categories = []; var categories_other = []; $.each(view_notes_sorted, function(j, o) { var ids = categories.map(function(value) { return value.id }); if (o.category_id && $.inArray(o.category_id, ids) < 0) { categories.push({ id: o.category_id, text: o.category, childs: [] }); } ids = categories.map(function(value) { return value.id }); var cat = $.inArray(o.category_id, ids); if (cat > -1) { categories[cat].childs.push(o); } else { categories_other.push(o); } }); $(categories_other).each(function(k, v) { var div = $('
    ', { class: "outnotes_box-item", text: v.title, style: v.style }).data('id', v.id); box.append(div); }); var ul = $('