/** * @Author 宋义深 1371033826@qq.com * @Description MixIO-组件逻辑文件 * @Version 2.8.30 */ tbd = undefined; lastFacePublishTime = false; function add_block(width, height, contents, attrs) { var itemdiv = $("
") itemdiv.attr("class", "item") itemdiv.css("width", standardWidth * width + 4 * (width - 1) - (standardWidth * width + 4 * (width - 1)) % 20 + "px") itemdiv.css("height", standardWidth * height + 4 * (height - 1) - (standardWidth * height + 4 * (height - 1)) % 20 + "px") itemdiv.css("border-radius", "10px") contentdiv = $("
") contentdiv.attr("class", "item-content") contentdiv.css("display", "flex") contentdiv.css("flex-direction", "column") contentdiv.css("align-items", "center") contentdiv.css("justify-content", "center") for (content in contents) contentdiv.append(contents[content]) for (attr in attrs) itemdiv.attr(attrs[attr][0], attrs[attr][1]) itemdiv.append(contentdiv) grid.append(itemdiv[0]) itemdiv.bind('mousedown', function(event) { startX = event.pageX startY = event.pageY isOpen = false }) itemdiv.bind('mouseup', function(event) { endX = event.pageX endY = event.pageY if (typeof(isOpen) != "undefined" && !isOpen) itemdiv.click() isOpen = true }) itemdiv.bind('mousedown', function(event) { if(itemdiv.attr('user-type') != 'magic') grid.append(itemdiv[0]) else grid.prepend(itemdiv[0]) }) itemdiv.draggable({ onStopDrag: function() { var stdLeft = parseInt(itemdiv.css('left')) - (parseInt(itemdiv.css('left')) % 20) + (parseInt(itemdiv.css('left')) % 20 > 10 ? 1 : 0) * 20 var stdTop = parseInt(itemdiv.css('top')) - (parseInt(itemdiv.css('top')) % 20) + (parseInt(itemdiv.css('top')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('left', (stdLeft>0?stdLeft:0) + 'px') itemdiv.css('top', (stdTop>0?stdTop:0) + 'px') // 对于tmpInnerItems中的所有item,也进行同样的处理 if(itemdiv.attr('user-type') == 'magic') { for(var i=0;i 10 ? 1 : 0) * 20 var top = parseInt(item.css('top')) - (parseInt(item.css('top')) % 20) + (parseInt(item.css('top')) % 20 > 10 ? 1 : 0) * 20 item.css('left', (left>0?left:0) + 'px') item.css('top', (top>0?top:0) + 'px') } } tmpInnerItems = [] }, onStartDrag: function(event) { lastDragX = event.pageX lastDragY = event.pageY if(itemdiv.attr('user-type') == 'magic') { // 包围在块内部的所有item tmpInnerItems = [] // magic块的边界坐标 var magicLeft = parseInt(itemdiv.css('left')) var magicTop = parseInt(itemdiv.css('top')) var magicRight = magicLeft + parseInt(itemdiv.css('width')) var magicBottom = magicTop + parseInt(itemdiv.css('height')) // 遍历所有.item var items = $(".item") tmpOriHeight = parseInt(itemdiv.css('height')) tmpOriWidth = parseInt(itemdiv.css('width')) for(var i=0;i= magicLeft && right-5 <= magicRight && top+5 >= magicTop && bottom-5 <= magicBottom) tmpInnerItems.push(i) } } console.log(tmpInnerItems) } }, onDrag: function(event) { var dx = event.pageX - lastDragX var dy = event.pageY - lastDragY lastDragX = event.pageX lastDragY = event.pageY var items = $(".item") if(itemdiv.attr('user-type') == 'magic') { if(tmpOriWidth==parseInt(itemdiv.css('width')) && tmpOriHeight==parseInt(itemdiv.css('height'))) for(var i=0;i 10 ? 1 : 0) * 20 var stdTop = parseInt(itemdiv.css('top')) - parseInt(itemdiv.css('top')) % 20 + (parseInt(itemdiv.css('top')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('left', stdLeft) itemdiv.css('top', stdTop) var stdWidth = parseInt(itemdiv.css('width')) - parseInt(itemdiv.css('width')) % 20 + (parseInt(itemdiv.css('width')) % 20 > 10 ? 1 : 0) * 20 var stdHeight = parseInt(itemdiv.css('height')) - parseInt(itemdiv.css('height')) % 20 + (parseInt(itemdiv.css('height')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('width', stdWidth) itemdiv.css('height', stdHeight) } }) return itemdiv } function add_pixel(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var pixelDiv = $("
") var xpixel = parseInt(user_content.split(',')[0]) var ypixel = parseInt(user_content.split(',')[1]) for(var i=0;i") for(var j=0;j") row.append(pixel) } pixelDiv.append(row) } contents.push(pixelDiv) var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } attrs = [ ['user-type', 'pixel'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(3, 3, contents, attrs) var stdwidth = xpixel*20 + 20 + "px" var stdheight = ypixel*20 + 60 + "px" itemdiv.css('width', stdwidth) itemdiv.css('height', stdheight) var editForm = $("
") var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) editForm.append($('
' + JSLang[lang].xpixel + '
')) var xpixel_input_div = $('
') var xpixel_input = $("") xpixel_input_div.append(xpixel_input) editForm.append(xpixel_input_div) editForm.append($('
' + JSLang[lang].ypixel + '
')) var ypixel_input_div = $('
') var ypixel_input = $("") ypixel_input_div.append(ypixel_input) editForm.append(ypixel_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) // Aug 2025 itemdiv.bind(MixIO.actionTags.PIXEL_SWITCH, function(event, x, y, status) { var color = "#EEEEEE" if(status) color = "#4E73DF" itemdiv.find('.pixelrow').eq(x).find('.pixel').eq(y).css('background-color', color) }) client.on('message', function(topic1, message1) { if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == topic.text()) { // Aug 2025 var content = message1.toString() if(content == "cls") { itemdiv.find('.pixelrow').find('.pixel').css('background-color', "#EEEEEE") } else { var pixels = content.split(',') for (var i = 0; i < pixels.length; i++) { var pixel = pixels[i].split('-') var x = parseInt(pixel[0]) var y = parseInt(pixel[1]) var color = pixel[2] if(color == '0') color = '#EEEEEE' else if(color == '1') color = '#4E73DF' var pixel = itemdiv.find('.pixelrow').eq(x).find('.pixel').eq(y) pixel.css('background-color', color) } } } }) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (xpixel_input.val() > 0 && xpixel_input.val() < 101 && ypixel_input.val() > 0 && ypixel_input.val() < 101) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { xpixel = xpixel_input.val() ypixel = ypixel_input.val() title.text(title_input.val()) topic.text(topic_input.val()) title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) title.parent().parent().attr('user-content', xpixel + ',' + ypixel) pixelDiv.empty() console.log(xpixel) console.log(ypixel) for(var i=0;i") for(var j=0;j") row.append(pixel) } pixelDiv.append(row) } var stdwidth = xpixel*20 + 20 + "px" var stdheight = ypixel*20 + 60 + "px" itemdiv.css('width', stdwidth) itemdiv.css('height', stdheight) modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext(JSLang[lang].invalidPixel) else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) xpixel_input.val(xpixel) ypixel_input.val(ypixel) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_button(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var button = $("") var button2 = $("") if (user_content == 2) { button.attr("hidden", "hidden") button2.removeAttr("hidden") } else { button2.attr("hidden", "hidden") button.removeAttr("hidden") } button2.click(function(event) { event.stopPropagation() }) var checkbox = $("") if (user_content == 1) checkbox.prop('checked', true) else checkbox.prop('checked', false) var checkDiv = $("
") button.append(checkbox) checkDiv.click(function(event) { event.stopPropagation(); }) checkDiv.mousedown(function(event) { event.stopPropagation(); }) button.click(function(event) { event.stopPropagation(); event.preventDefault(); }) button.mouseup(function(event) { if (checkbox.prop('checked')) { checkbox.prop('checked', false) title.parent().parent().attr('user-content', 0) publish(topic.text(), '0') } else { checkbox.prop('checked', true) title.parent().parent().attr('user-content', 1) publish(topic.text(), '1') } itemdiv.trigger(MixIO.eventTags.BUTTON_LOOSED) }) var isMobile = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i); if(!isMobile) { button2.mouseup(function(event) { event.stopPropagation(); event.preventDefault(); publish(topic.text(), '0') itemdiv.trigger(MixIO.eventTags.BUTTON_LOOSED) }) button2.mousedown(function(event) { event.stopPropagation(); event.preventDefault(); publish(topic.text(), '1') itemdiv.trigger(MixIO.eventTags.BUTTON_PRESSED) }) } else{ button2[0].addEventListener('touchstart', function(event) { event.stopPropagation(); event.preventDefault(); button2.attr('class', 'pushButton2') publish(topic.text(), '1') itemdiv.trigger(MixIO.eventTags.BUTTON_PRESSED) } ) button2[0].addEventListener('touchend', function(event) { event.stopPropagation(); event.preventDefault(); button2.attr('class', 'pushButton') publish(topic.text(), '0') itemdiv.trigger(MixIO.eventTags.BUTTON_LOOSED) }) } button.append(checkDiv) contents.push(button) contents.push(button2) client.on('message', function(topic1, message1) { if (isAlive && isRunning) if (title.parent().parent().attr('user-content') != 2 && topic1.split("/")[(isMixly ? 3 : 2)] == topic.text()) { if (message1 == 0) { checkbox.prop('checked', false) title.parent().parent().attr('user-content', 0) } else if (message1 == 1) { checkbox.prop('checked', true) title.parent().parent().attr('user-content', 1) } itemdiv.trigger(MixIO.eventTags.BUTTON_CHANGED, [Uint8ArrayToString(message1)]) } }) var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { console.log(modifyDia) if (modeCheckbox.prop("checked")) editForm.find("img").attr("src", "icons/input_button2.svg") else editForm.find("img").attr("src", "icons/input_button.svg") modifyDia.showModal() if (tbd) tbd.remove() } attrs = [ ['user-type', 'input_button'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(1, 1, contents, attrs) itemdiv.bind(MixIO.actionTags.BUTTON_SWITCH, function(event, status) { checkbox.prop('checked', !!status) MixIO.publish(topic.text(), (!!status) ? 1 : 0) }) var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) editForm.append($('
' + JSLang[lang].feedbackMode + '
')) var modeButton = $("") var modeCheckbox = $("") modeCheckbox.click(function() { if (modeCheckbox.prop("checked")) editForm.find("img").attr("src", "icons/input_button2.svg") else editForm.find("img").attr("src", "icons/input_button.svg") }) if (user_content == 2) modeCheckbox.prop("checked", true) else modeCheckbox.prop("checked", false) var modeCheckDiv = $("
") modeButton.append(modeCheckbox) modeButton.append(modeCheckDiv) var modeDiv = $("
") modeDiv.append($("" + JSLang[lang].switch+"")) modeDiv.append(modeButton) modeDiv.append($("" + JSLang[lang].button + "")) editForm.append(modeDiv) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) title.text(title_input.val()) topic.text(topic_input.val()) if (modeCheckbox.prop('checked')) { title.parent().parent().attr('user-content', 2) button.attr("hidden", "hidden") button2.removeAttr("hidden") } else { title.parent().parent().attr('user-content', 0) button2.attr("hidden", "hidden") button.removeAttr("hidden") } modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) { bubble.append(editButton) bubble.append(deleteButton) } if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (user_style != undefined) itemdiv.attr('style', user_style) if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) } function add_slider(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var sliderDiv = $("
") var slider = $("") slider.on('input propertychange', () => { mark.val(slider.val()) publish(topic.text(), slider.val()) title.parent().parent().attr('user-content', slider.attr('min') + "," + slider.attr('max') + "," + slider.attr('step') + "," + slider.val()) itemdiv.trigger(MixIO.eventTags.SLIDER_SLIDED) }) var mark = $("") mark.val(0) mark.on('change', function() { publish(topic.text(), mark.val()) var val = parseFloat(mark.val()) if (val >= slider.attr('min') && val <= slider.attr('max')) { slider.val(val) title.parent().parent().attr('user-content', slider.attr('min') + "," + slider.attr('max') + "," + slider.attr('step') + "," + slider.val()) } }) slider.bind('click', function(event) { event.stopPropagation() }) slider.bind('pointerdown', function(event) { event.stopPropagation() }) slider.bind('mousedown', function(event) { event.stopPropagation() }) slider.bind('mouseup', function(event) { event.stopPropagation() }) slider[0].addEventListener('touchstart', function(event) { event.stopPropagation() }, { passive: false }) mark.bind('click', function(event) { event.stopPropagation() }) mark.bind('pointerdown', function(event) { event.stopPropagation() }) mark.bind('mousedown', function(event) { event.stopPropagation() }) mark.bind('mouseup', function(event) { event.stopPropagation() }) mark[0].addEventListener('touchstart', function(event) { event.stopPropagation() }, { passive: false }) sliderDiv.append(slider) sliderDiv.append(mark) contents.push(sliderDiv) var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } attrs = [ ['user-type', 'input_slider'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(3, 1, contents, attrs) client.on('message', function(topic1, message1) { if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == topic.text()) { if (!isNaN(parseFloat(message1))) { var val = parseFloat(message1) if (val >= slider.attr('min') && val <= slider.attr('max')) { slider.val(val) mark.val(val) title.parent().parent().attr('user-content', slider.attr('min') + "," + slider.attr('max') + "," + slider.attr('step') + "," + slider.val()) } } itemdiv.trigger(MixIO.eventTags.SLIDER_CHANGED, [parseFloat(message1)]) } }) itemdiv.bind(MixIO.actionTags.SLIDER_SEND, function(event, val) { if (val >= slider.attr('min') && val <= slider.attr('max')) { slider.val(val) mark.val(val) } MixIO.publish(topic.text(), val) }) var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { if (!isNaN(parseFloat(minInput.val())) && !isNaN(parseFloat(maxInput.val())) && !isNaN(parseFloat(paceInput.val())) && (parseFloat(paceInput.val()) > 0) && (parseFloat(maxInput.val()) > parseFloat(minInput.val())) && ((parseFloat(maxInput.val()) - parseFloat(minInput.val())) > parseFloat(paceInput.val()))) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) slider.attr('min', minInput.val()) slider.attr('max', maxInput.val()) slider.attr('step', paceInput.val()) title.parent().parent().attr('user-content', slider.attr('min') + "," + slider.attr('max') + "," + slider.attr('step') + "," + slider.val()) title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() } else { showtext(JSLang[lang].invalidSlideRange) } } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var vals = user_content.split(',') slider.attr('min', vals[0]) slider.attr('max', vals[1]) slider.attr('step', vals[2]) slider.val(vals[3]) mark.val(vals[3]) editForm.append($('
' + JSLang[lang].slideRange + '
')) var rangeDiv = $("
") var minInput = $("") rangeDiv.append(minInput) rangeDiv.append("-") var maxInput = $("") rangeDiv.append(maxInput) rangeDiv.append($('' + JSLang[lang].step + '')) var paceInput = $("") rangeDiv.append(paceInput) editForm.append(rangeDiv) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) minInput.val(slider.attr('min')) maxInput.val(slider.attr('max')) paceInput.val(slider.attr('step')) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_controller(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var controllerDiv = $("
") contents.push(controllerDiv) var controllerID = randomString() + 'con' controllerDiv.attr('id', controllerID) attrs = [ ['user-type', 'input_controller'], ['user-title', user_title], ['user-content', "0,0"], ['user-topic', user_topic], ['title-hidden', title_style] ] var itemdiv = add_block(2, 2, contents, attrs) var joy = new JoyStick(controllerID) controllerDiv.children().bind('click', function(event) { event.stopPropagation() }) controllerDiv.children().bind('pointerdown', function(event) { event.stopPropagation() }) controllerDiv.children().bind('mousedown', function(event) { event.stopPropagation() }) var pressed = 0 var minInterval = 500 setInterval(function() { if (pressed == 1) { var parseX = parseInt(joy.GetX() / 110 * 100 > 100 ? 100 : ((parseInt(joy.GetX() / 110 * 100) < -100) ? -100 : parseInt(joy.GetX() / 110 * 100))) var parseY = parseInt(joy.GetY() / 110 * 100 > 100 ? 100 : ((parseInt(joy.GetY() / 110 * 100) < -100) ? -100 : parseInt(joy.GetY() / 110 * 100))) publish(topic.text(), parseX + "," + parseY) title.parent().parent().attr('user-content', parseX + "," + parseY) itemdiv.trigger(MixIO.eventTags.JOYSTICK_CHANGED, [parseX, parseY]) } }, minInterval) itemdiv.bind(MixIO.actionTags.JOYSTICK_SEND, function(event, x, y) { publish(topic.text(), x + "," + y) }) controllerDiv.children()[0].addEventListener("mousedown", function() { pressed = 1 }, false); controllerDiv.children()[0].addEventListener("mouseup", function() { pressed = 0 title.parent().parent().attr('user-content', "0,0") publish(topic.text(), "0,0") }, false); controllerDiv.children()[0].addEventListener("touchstart", function() { pressed = 1 }, false); controllerDiv.children()[0].addEventListener("touchend", function() { pressed = 0 title.parent().parent().attr('user-content', "0,0") publish(topic.text(), "0,0") }, false); var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) title.parent().parent().attr('user-content', "0,0") title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_keyboard(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) attrs = [ ['user-type', 'input_keyboard'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var keyDiv = $("
") var messDiv = $("") messDiv.val(stringendecoder.decodeHtml(user_content)) messDiv.click(function(event) { event.stopPropagation() }) messDiv.bind('mousedown', function(event) { event.stopPropagation() }) messDiv.bind('mouseup', function(event) { event.stopPropagation() }) messDiv.bind('input', function() { title.parent().parent().attr('user-content', stringendecoder.encodeHtml(messDiv.val())) }) messDiv.bind('touchstart', function(event) { event.stopPropagation() }) messDiv.bind('touchend', function(event) { event.stopPropagation() }) keyDiv.append(messDiv) var sendIcon = $(' 800) sendIcon.bind('click', function(event) { event.stopPropagation() publish(topic.text(), messDiv.val()) sendIcon.removeClass("btn-primary") sendIcon.addClass("btn-success") sendIcon.children().removeClass('fa-paper-plane') sendIcon.children().addClass("fa-check") setTimeout(function() { sendIcon.removeClass("btn-success") sendIcon.addClass("btn-primary") sendIcon.children().removeClass('fa-check') sendIcon.children().addClass("fa-paper-plane") }, 300) itemdiv.trigger(MixIO.eventTags.KEYBOARD_SENT, messDiv.val()) }) else sendIcon.bind('touchend', function(event) { event.stopPropagation() publish(topic.text(), messDiv.val()) sendIcon.removeClass("btn-primary") sendIcon.addClass("btn-success") sendIcon.children().removeClass('fa-paper-plane') sendIcon.children().addClass("fa-check") setTimeout(function() { sendIcon.removeClass("btn-success") sendIcon.addClass("btn-primary") sendIcon.children().removeClass('fa-check') sendIcon.children().addClass("fa-paper-plane") }, 300) itemdiv.trigger(MixIO.eventTags.KEYBOARD_SENT, messDiv.val()) }) contents.push(keyDiv) var itemdiv = add_block(3, 1, contents, attrs) itemdiv.bind(MixIO.actionTags.KEYBOARD_SEND, function(event, message) { messDiv.val(message) publish(topic.text(), messDiv.val()) sendIcon.removeClass("btn-primary") sendIcon.addClass("btn-success") sendIcon.children().removeClass('fa-paper-plane') sendIcon.children().addClass("fa-check") setTimeout(function() { sendIcon.removeClass("btn-success") sendIcon.addClass("btn-primary") sendIcon.children().removeClass('fa-check') sendIcon.children().addClass("fa-paper-plane") }, 300) }) var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) if (title.parent().parent().attr('user-content') == undefined) title.parent().parent().attr('user-content', "") title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_tinydb(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) attrs = [ ['user-type', 'tinydb'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var keyDiv = $("
") var messDiv = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) editForm.append($('
' + JSLang[lang].options + '
')) var options_input_div = $('
') var options_input = $("") options_input_div.append(options_input) editForm.append(options_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) title.parent().parent().attr('user-content', options_input.val()) title.text(title_input.val()) topic.text(topic_input.val()) messDiv.empty() var options = options_input.val().split(',') for (var i = 0; i < options.length; i++) { var option = $("") messDiv.append(option) } modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) options_input.val(title.parent().parent().attr('user-content')) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_mic(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var isRecording = false var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) attrs = [ ['user-type', 'input_mic'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var keyDiv = $("
") var messDiv = $("") messDiv.val(stringendecoder.decodeHtml(user_content)) messDiv.click(function(event) { event.stopPropagation() }) messDiv.bind('mousedown', function(event) { event.stopPropagation() }) messDiv.bind('mouseup', function(event) { event.stopPropagation() }) messDiv.bind('input', function() { title.parent().parent().attr('user-content', stringendecoder.encodeHtml(messDiv.val())) }) keyDiv.append(messDiv) var sendIcon = $(' 800) sendIcon.bind('click', function(event) { event.stopPropagation() if(!isRecording) { sendIcon.removeClass("btn-primary") sendIcon.addClass("btn-danger") sendIcon.children().removeClass('fa-microphone') sendIcon.children().addClass("fa-stop") // start recording, use web speech api recognition = new webkitSpeechRecognition(); recognition.lang = 'zh-CN'; recognition.continuous = true; recognition.interimResults = true; recognition.start(); recognition.onresult = function(event) { // update the result var recordRes = '' for(var i = 0; i < event.results.length; i++) recordRes += event.results[i][0].transcript messDiv.val(recordRes) } isRecording = true } else { sendIcon.removeClass("btn-danger") sendIcon.addClass("btn-primary") sendIcon.children().removeClass('fa-stop') sendIcon.children().addClass("fa-microphone") recognition.stop(); publish(topic.text(), messDiv.val()) itemdiv.trigger(MixIO.eventTags.MIC_SENT, messDiv.val()) isRecording = false } }) else sendIcon.bind('touchend', function(event) { event.stopPropagation() if(!isRecording) { sendIcon.removeClass("btn-primary") sendIcon.addClass("btn-danger") sendIcon.children().removeClass('fa-microphone') sendIcon.children().addClass("fa-stop") // start recording, use web speech api recognition = new webkitSpeechRecognition(); recognition.lang = 'zh-CN'; recognition.continuous = true; recognition.interimResults = true; recognition.start(); recognition.onresult = function(event) { // update the result var recordRes = '' for(var i = 0; i < event.results.length; i++) recordRes += event.results[i][0].transcript messDiv.val(recordRes) } isRecording = true } else { sendIcon.removeClass("btn-danger") sendIcon.addClass("btn-primary") sendIcon.children().removeClass('fa-stop') sendIcon.children().addClass("fa-microphone") recognition.stop(); publish(topic.text(), messDiv.val()) itemdiv.trigger(MixIO.eventTags.MIC_SENT, messDiv.val()) isRecording = false } }) contents.push(keyDiv) var itemdiv = add_block(3, 1, contents, attrs) var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) if (title.parent().parent().attr('user-content') == undefined) title.parent().parent().attr('user-content', "") title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_bulb(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var bulb = $("
") contents.push(bulb) if (user_content == 0) bulb.attr('class', 'bulb0') else if (user_content == 1) bulb.attr('class', 'bulb1') else if (user_content == 2) bulb.attr('class', 'bulb2') else if (user_content == 3) bulb.attr('class', 'bulb3') attrs = [ ['user-type', 'output_bulb'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(1, 1, contents, attrs) itemdiv.bind(MixIO.actionTags.BULB_CHANGE, function(event, status) { MixIO.publish(topic.text(), status) }) client.on('message', function(topic1, message1) { if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == topic.text()) { if (message1 == 0) { title.parent().parent().attr('user-content', 0) bulb.attr('class', 'bulb0') bulb.css('background-color', "#DCD9D4"); bulb.css('box-shadow', ''); } else if (message1 == 1) { title.parent().parent().attr('user-content', 1) bulb.attr('class', 'bulb1') bulb.css('background-color', "#1CC88A"); bulb.css('box-shadow', '#1CC88A 1px 1px 8px'); } else if (message1 == 2) { title.parent().parent().attr('user-content', 2) bulb.attr('class', 'bulb2') bulb.css('background-color', "#f6c23e"); bulb.css('box-shadow', '#f6c23e 1px 1px 8px'); } else if (message1 == 3) { title.parent().parent().attr('user-content', 3) bulb.attr('class', 'bulb3') bulb.css('background-color', "#e74a3b"); bulb.css('box-shadow', '#e74a3b 1px 1px 8px'); } else{ if (message1.toString().indexOf("#") != -1) { title.parent().parent().attr('user-content', message1); bulb.css('background-color', message1); bulb.css('box-shadow', message1 + ' 1px 1px 8px') } else if (message1.toString().split(",").length == 3) { title.parent().parent().attr('user-content', message1); bulb.css('background-color', 'rgb(' + message1 + ')'); bulb.css('box-shadow', 'rgb(' + message1 + ') 1px 1px 8px') } else{ var availableMessageStrings = [ "红", "橙", "黄", "绿", "青", "蓝", "紫", "白", "黑", "灰", "棕", "red", "orange", "yellow", "green", "cyan", "blue", "purple", "white", "black", "grey", "brown" ] for (var avaMessage of availableMessageStrings) { console.log(message1.toString(), avaMessage) if (message1.toString()=== avaMessage) { title.parent().parent().attr('user-content', avaMessage); bulb.css('background-color', message1); bulb.css('box-shadow', message1 + ' 1px 1px 8px') break; } } } } itemdiv.trigger(MixIO.eventTags.BULB_CHANGED, [Uint8ArrayToString(message1)]) } }) var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) if (title.parent().parent().attr('user-content') == undefined) title.parent().parent().attr('user-content', "") title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_ble(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] if(user_style != undefined) user_content = JSLang[lang].select var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) attrs = [ ['user-type', 'ble'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var bletarget = user_content var bleconnect = function(){ if(bletarget != JSLang[lang].select) { var ble = globalBLE[bletarget] console.log(ble) ble.addEventListener('gattserverdisconnected', function() { showtext("Bluetooth Disconnected") clearInterval(blink) ble_icon.css('color', '#E74A3B') delete globalBLE[bletarget] bletarget = JSLang[lang].select ble_target.val(JSLang[lang].select) title.parent().parent().attr('user-content', JSLang[lang].select) }) var blinkStatus = false var blink = setInterval(function() { ble_icon.css('color', blinkStatus ? '#858796' : '#4e73df') blinkStatus = !blinkStatus }, 500) ble.gatt.connect().then(function(server) { console.log(server) var Rok = false var Tok = false var serviceUuid = "6e400001-b5a3-f393-e0a9-e50e24dcca9e" var uartRxCharacteristicUuid = "6e400002-b5a3-f393-e0a9-e50e24dcca9e" var uartTxCharacteristicUuid = "6e400003-b5a3-f393-e0a9-e50e24dcca9e" server.getPrimaryService(serviceUuid).then(function(service) { service.getCharacteristic(uartRxCharacteristicUuid).then(function(uartRxCharacteristic) { Rok = true if (Rok && Tok) { clearInterval(blink) ble_icon.css('color', '#4e73df') } client.on('message', function(topic1, message1) { if(isAlive && topic1.split("/")[(isMixly ? 3 : 2)] == topic.text().split(",")[1]) { var encoder = new TextEncoder('utf-8'); uartRxCharacteristic.writeValue(encoder.encode(message1)) ble_icon.css('color', '#1cc88a') setTimeout(function() { ble_icon.css('color', '#36b9cc') }, 300) } }) }).catch(function(error) { clearInterval(blink) showtext(error) console.log(error) ble_icon.css('color', '#E74A3B') delete globalBLE[bletarget] bletarget = JSLang[lang].select ble_target.val(JSLang[lang].select) title.parent().parent().attr('user-content', JSLang[lang].select) }) service.getCharacteristic(uartTxCharacteristicUuid).then(function(uartTxCharacteristic) { console.log(uartTxCharacteristic) uartTxCharacteristic.startNotifications().then(function() { Tok = true if (Rok && Tok) { clearInterval(blink) ble_icon.css('color', '#4e73df') } uartTxCharacteristic.addEventListener('characteristicvaluechanged', function(event) { // get data var decoder = new TextDecoder('utf-8'); var value = decoder.decode(event.target.value); if(isAlive) { publish(topic.text().split(",")[0], value) // Aug 2025 itemdiv.trigger(MixIO.eventTags.BLUETOOTH_TRIGGERED, value) ble_icon.css('color', '#1cc88a') setTimeout(function() { ble_icon.css('color', '#4e73df') }, 300) } }) }).catch(function(error) { clearInterval(blink) showtext(error) console.log(error) ble_icon.css('color', '#E74A3B') delete globalBLE[bletarget] bletarget = JSLang[lang].select ble_target.val(JSLang[lang].select) title.parent().parent().attr('user-content', JSLang[lang].select) }) }).catch(function(error) { clearInterval(blink) showtext(error) console.log(error) ble_icon.css('color', '#E74A3B') delete globalBLE[bletarget] bletarget = JSLang[lang].select ble_target.val(JSLang[lang].select) title.parent().parent().attr('user-content', JSLang[lang].select) }) }).catch(function(error) { clearInterval(blink) showtext(error) console.log(error) ble_icon.css('color', '#E74A3B') delete globalBLE[bletarget] bletarget = JSLang[lang].select ble_target.val(JSLang[lang].select) title.parent().parent().attr('user-content', JSLang[lang].select) }) }).catch(function(error) { clearInterval(blink) showtext(error) console.log(error) ble_icon.css('color', '#E74A3B') delete globalBLE[bletarget] bletarget = JSLang[lang].select ble_target.val(JSLang[lang].select) title.parent().parent().attr('user-content', JSLang[lang].select) }) } else { ble_icon.css('color', '#858796') } } var icon_div = $('
') var ble_icon = $('') icon_div.append(ble_icon) contents.push(icon_div) var itemdiv = add_block(1, 1, contents, attrs) // Aug 2025 itemdiv.bind(MixIO.actionTags.BLUETOOTH_SENT, function(event, value) { MixIO.publish(topic.text().split(",")[1], value) }) bleconnect() var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].readMessTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) editForm.append($('
' + JSLang[lang].writeMessTopic + '
')) var topic_input_div_2 = $('
') var topic_input_2 = $("") topic_input_div_2.append(topic_input_2) editForm.append(topic_input_div_2) editForm.append($('
' + JSLang[lang].bleTarget + '
')) var ble_target_div = $('
') var ble_target = $("") ble_target.val(JSLang[lang].select) ble_target_div.append(ble_target) ble_target.click(function() { // use web bluetooth to select device, no filter if (navigator.bluetooth) { navigator.bluetooth.requestDevice({ acceptAllDevices: true, // read and write to device characteristic (for example, to send data to a micro:bit) optionalServices: ['6e400001-b5a3-f393-e0a9-e50e24dcca9e', '6e400002-b5a3-f393-e0a9-e50e24dcca9e', '6e400003-b5a3-f393-e0a9-e50e24dcca9e'] }).then(function(device) { var old_ble_target = ble_target.val() if(old_ble_target != JSLang[lang].select) { globalBLE[old_ble_target].gatt.disconnect() delete globalBLE[old_ble_target] } ble_target.val(device.name + ' (' + device.id + ')') globalBLE[device.name + ' (' + device.id + ')'] = device }).catch(function(error) { var old_ble_target = ble_target.val() // if user cancel the selection(NotFoundError) if(error.name == "NotFoundError") { if(old_ble_target != JSLang[lang].select) { globalBLE[old_ble_target].gatt.disconnect() delete globalBLE[old_ble_target] } ble_target.val(JSLang[lang].select) title.parent().parent().attr('user-content', JSLang[lang].select) } else showtext(error) }) } else { showtext(JSLang[lang].noWebBluetooth) } }) editForm.append(ble_target_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11 && getByteLen(topic_input_2.val()) > 0 && getByteLen(topic_input_2.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) title.parent().parent().attr('user-content', ble_target.val()) bletarget = ble_target.val() title.text(title_input.val()) topic.text(topic_input.val() + "," + topic_input_2.val()) modifyDia.close() bleconnect() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text().split(",")[0]) topic_input_2.val(topic.text().split(",")[1]) ble_target.val(bletarget) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_magic(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var bgColor = user_content var title = $("

" + user_title + "

") var transparentDiv = $('
') contents.push(title) contents.push(transparentDiv) attrs = [ ['user-type', 'magic'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(5, 5, contents, attrs) itemdiv.css('background-color', 'rgba(0,0,0,0)') itemdiv.css('box-shadow', user_content + ' 10px 10px 20px') var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].color + '
')) var color_input_div = $('
') var color_select = $('") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].triggerTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) editForm.append($('
' + JSLang[lang].triggerMessage + '
')) var moreButtonDiv = $('
') var currTimeBtn = $('实时时间') var ranNumBtn = $('随机整数(1-99)') moreButtonDiv.append(currTimeBtn) moreButtonDiv.append(ranNumBtn) editForm.append(moreButtonDiv) var message_input_div = $('
') var message_input = $("") message_input_div.append(message_input) editForm.append(message_input_div) currTimeBtn.click(function(){ message_input.val("$CURR_TIME$") }) ranNumBtn.click(function(){ message_input.val("$RAN_NUM$") }) editForm.append($('
' + JSLang[lang].triggerInterval + '
')) var trigger_interval_div = $('
') var trigger_interval = $("") trigger_interval_div.append(trigger_interval) editForm.append(trigger_interval_div) editForm.append($('
' + JSLang[lang].triggerTimes + '
')) var trigger_times_div = $('
') var trigger_times = $("") trigger_times_div.append(trigger_times) editForm.append(trigger_times_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (getByteLen(message_input.val()) > 0) { if (true) { if (parseInt(trigger_interval.val()) && parseInt(trigger_interval.val()) >= 500) { if (!isNaN(parseInt(trigger_times.val())) && parseInt(trigger_times.val()) >= 0) { var oldKey = title.text() title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val() + "$$$" + message_input.val()) title.parent().parent().attr('user-content', trigger_interval.val() + "," + trigger_times.val()) title.text(title_input.val()) topic.text(topic_input.val()) triggerTopic = topic_input.val() triggerMessage = message_input.val() triggerInterval = trigger_interval.val() triggerTimes = trigger_times.val() if (title.text() != oldKey) { MixIO.triggers[title.text()] = MixIO.triggers[oldKey] delete MixIO.triggers[oldKey] } MixIO.triggersToPreCode() MixIO.editor.setValue(MixIO.preCode + Blockly.JavaScript.workspaceToCode(workspace)) modifyDia.close() } else showtext(JSLang[lang].illegalTimes) } else showtext(JSLang[lang].illegalInterval) } else showtext(JSLang[lang].sameUnit) } else showtext(JSLang[lang].messageLenIllegal) else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) message_input.val(triggerMessage) trigger_interval.val(triggerInterval) trigger_times.val(triggerTimes) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } async function add_trigger(user_title, user_topic, user_content, user_style, title_style, isObserve) { if(MixIO.editor == undefined) { initCodeMirror = true await init_codemirror() } var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic.split("$$$")[0] + "") topicDiv.append($("")) topicDiv.append(topic) var bulb = $("") contents.push(bulb) attrs = [ ['user-type', 'trigger'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var condition1_1 = user_content.split("$$$")[0] var condition1_2 = user_content.split("$$$")[1] var condition2_1 = user_content.split("$$$")[2] var condition2_2 = user_content.split("$$$")[3] var conditionRelation = user_content.split("$$$")[4] var dstTopic = user_content.split("$$$")[5] var dstMessage = user_content.split("$$$")[6] var itemdiv = add_block(1, 1, contents, attrs) var relationLogic = function(message, condition_1, condition_2) { var condition_2 = parseFloat(condition_2) if (condition_1 == ">") return message > condition_2 else if (condition_1 == "≥") return message >= condition_2 else if (condition_1 == "<") return message < condition_2 else if (condition_1 == "≤") return message <= condition_2 else if (condition_1 == "=") return message == condition_2 else if (condition_1 == "≠") return message != condition_2 else if (condition_1 == "--") return true } MixIO.triggers[title.text()] = function() { // Aug 2025 var localTime = 0 title.parent().parent().attr('user-times', localTime) MixIO.onMessage(function(topic1, message) { var message = String(message) if (topic1 == topic.text()) { if (conditionRelation == "AND") { if (relationLogic(message, condition1_1, condition1_2) && relationLogic(message, condition2_1, condition2_2)) { itemdiv.addClass("triggered") setTimeout(function() { itemdiv.removeClass("triggered") }, 150) MixIO.publish(dstTopic, dstMessage) localTime = localTime + 1 title.parent().parent().attr('user-times', localTime) itemdiv.trigger(MixIO.eventTags.TRIGGER_TRIGGERED, dstMessage) } else { itemdiv.addClass("imtriggered") setTimeout(function() { itemdiv.removeClass("imtriggered") }, 150) } } else if (conditionRelation == "OR") { if (relationLogic(message, condition1_1, condition1_2) || relationLogic(message, condition2_1, condition2_2)) { itemdiv.addClass("triggered") setTimeout(function() { itemdiv.removeClass("triggered") }, 150) MixIO.publish(dstTopic, dstMessage) localTime = localTime + 1 title.parent().parent().attr('user-times', localTime) itemdiv.trigger(MixIO.eventTags.TRIGGER_TRIGGERED, dstMessage) } else { itemdiv.addClass("imtriggered") setTimeout(function() { itemdiv.removeClass("imtriggered") }, 150) } } else if (conditionRelation == "XOR") { if (relationLogic(message, condition1_1, condition1_2) ^ relationLogic(message, condition2_1, condition2_2)) { itemdiv.addClass("triggered") setTimeout(function() { itemdiv.removeClass("triggered") }, 150) MixIO.publish(dstTopic, dstMessage) localTime = localTime + 1 title.parent().parent().attr('user-times', localTime) itemdiv.trigger(MixIO.eventTags.TRIGGER_TRIGGERED, dstMessage) } else { itemdiv.addClass("imtriggered") setTimeout(function() { itemdiv.removeClass("imtriggered") }, 150) } } } }) } MixIO.triggersToPreCode() if(!isObserve) MixIO.editor.setValue(MixIO.preCode + Blockly.JavaScript.workspaceToCode(workspace)) var delete_on_click = function() { title.parent().parent().remove(); isAlive = false delete MixIO.triggers[title.text()] MixIO.triggersToPreCode() MixIO.editor.setValue(MixIO.preCode + Blockly.JavaScript.workspaceToCode(workspace)) if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].srcTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) editForm.append($('
' + JSLang[lang].condition + '1
')) var condition1_input_div = $('
') var condition1_input1 = $("") condition1_input_div.append(condition1_input1) condition1_input_div.append(condition1_input2) editForm.append(condition1_input_div) editForm.append($('
' + JSLang[lang].condition + '2
')) var condition2_input_div = $('
') var condition2_input1 = $("") condition2_input_div.append(condition2_input1) condition2_input_div.append(condition2_input2) editForm.append(condition2_input_div) editForm.append($('
' + JSLang[lang].conditionRelation + '
')) var condition_relation_div = $('
') var condition_relation = $("") dstTopic_input_div.append(dstTopic_input) editForm.append(dstTopic_input_div) editForm.append($('
' + JSLang[lang].dstMessage + '
')) var dstMessage_input_div = $('
') var dstMessage_input = $("") dstMessage_input_div.append(dstMessage_input) editForm.append(dstMessage_input_div) condition2_input1.bind("change", function() { if (condition2_input1.val() == "--") condition2_input2.attr("disabled", "disabled") else condition2_input2.removeAttr("disabled") }) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (getByteLen(condition1_input2.val()) > 0 && (condition2_input1.val() == "--" || getByteLen(condition2_input2.val()) > 0)) { if (true) { if (getByteLen(dstTopic_input.val()) > 0) { if (getByteLen(dstMessage_input.val()) > 0) { var oldKey = title.text() title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) title.parent().parent().attr('user-content', [condition1_input1.val(), condition1_input2.val(), condition2_input1.val(), condition2_input2.val(), condition_relation.val(), dstTopic_input.val(), dstMessage_input.val()].join("$$$")) title.text(title_input.val()) topic.text(topic_input.val()) condition1_1 = condition1_input1.val() condition1_2 = condition1_input2.val() condition2_1 = condition2_input1.val() condition2_2 = condition2_input2.val() conditionRelation = condition_relation.val() dstTopic = dstTopic_input.val() dstMessage = dstMessage_input.val() if (title.text() != oldKey) { MixIO.triggers[title.text()] = MixIO.triggers[oldKey] delete MixIO.triggers[oldKey] } MixIO.triggersToPreCode() MixIO.editor.setValue(MixIO.preCode + Blockly.JavaScript.workspaceToCode(workspace)) modifyDia.close() } else showtext(JSLang[lang].dstMessageLenIllegal) } else showtext(JSLang[lang].dstTopicLenIllegal) } else showtext(JSLang[lang].sameUnit) } else showtext(JSLang[lang].conditionLenIllegal) else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) condition1_input1.val(condition1_1) condition1_input2.val(condition1_2) condition2_input1.val(condition2_1) condition2_input2.val(condition2_2) condition_relation.val(conditionRelation) dstTopic_input.val(dstTopic) dstMessage_input.val(dstMessage) if (condition2_input1.val() == "--") condition2_input2.attr("disabled", "disabled") else condition2_input2.removeAttr("disabled") if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_rgb(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var Rtopic = $("" + user_topic.split('/')[0] + "") topicDiv.append($("")) topicDiv.append(Rtopic) var Gtopic = $("" + user_topic.split('/')[1] + "") topicDiv.append($("")) topicDiv.append(Gtopic) var Btopic = $("" + user_topic.split('/')[2] + "") topicDiv.append($("")) topicDiv.append(Btopic) var pickerID = randomString() + 'rgb' var pickerRGBDiv = $("
") var pickerDiv = $("
") pickerDiv.attr('id', pickerID) pickerDiv.bind('click', function(event) { event.stopPropagation() title.parent().parent().attr('user-content', RInput.val() + "," + GInput.val() + "," + BInput.val()) publish(Rtopic.text(), RInput.val()) publish(Gtopic.text(), GInput.val()) publish(Btopic.text(), BInput.val()) itemdiv.trigger(MixIO.eventTags.RGB_PICKER_PICKED, [RInput.val(), GInput.val(), BInput.val()]) }) pickerDiv.bind('pointerdown', function(event) { event.stopPropagation() }) pickerDiv[0].addEventListener('touchstart', function(event) { event.stopPropagation() title.parent().parent().attr('user-content', RInput.val() + "," + GInput.val() + "," + BInput.val()) publish(Rtopic.text(), RInput.val()) publish(Gtopic.text(), GInput.val()) publish(Btopic.text(), BInput.val()) itemdiv.trigger(MixIO.eventTags.RGB_PICKER_PICKED, [RInput.val(), GInput.val(), BInput.val()]) }) pickerDiv[0].addEventListener('touchend', function(event) { event.stopPropagation() title.parent().parent().attr('user-content', RInput.val() + "," + GInput.val() + "," + BInput.val()) publish(Rtopic.text(), RInput.val()) publish(Gtopic.text(), GInput.val()) publish(Btopic.text(), BInput.val()) itemdiv.trigger(MixIO.eventTags.RGB_PICKER_PICKED, [RInput.val(), GInput.val(), BInput.val()]) }) pickerDiv.css("transform", "scale(0.8)") var RGBDiv = $("
") var colorDiv = $("") colorDiv.attr('id', pickerID + 'cl') contents.push(colorDiv) var RDiv = $("
") var GDiv = $("
") var BDiv = $("
") RDiv.append($("

R

")) GDiv.append($("

G

")) BDiv.append($("

B

")) var RInput = $("") var GInput = $("") var BInput = $("") RInput.val(user_content.split(',')[0]) GInput.val(user_content.split(',')[1]) BInput.val(user_content.split(',')[2]) RDiv.append(RInput) GDiv.append(GInput) BDiv.append(BInput) RGBDiv.append(RDiv) RGBDiv.append(GDiv) RGBDiv.append(BDiv) pickerRGBDiv.append(pickerDiv) pickerRGBDiv.append(RGBDiv) contents.push(pickerRGBDiv) attrs = [ ['user-type', 'input_rgb'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(3, 3, contents, attrs) itemdiv.bind(MixIO.actionTags.RGB_PICKER_SEND, function(event, r, g, b) { MixIO.publish(Rtopic.text(), r) MixIO.publish(Gtopic.text(), g) MixIO.publish(Btopic.text(), b) }) client.on('message', function(topic1, message1) { if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == Rtopic.text()) { if (!isNaN(parseInt(message1))) { var val = parseInt(message1) if (val >= 0 && val <= 255) { RInput.val(val) $.farbtastic(far).setColor(RGB2Hex(parseInt(RInput.val()), parseInt(GInput.val()), parseInt(BInput.val()))) title.parent().parent().attr('user-content', RInput.val() + "," + GInput.val() + "," + BInput.val()) itemdiv.trigger(MixIO.eventTags.RGB_PICKER_CHANGED, [val, -1, -1]) } } } if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == Gtopic.text()) { if (!isNaN(parseInt(message1))) { var val = parseInt(message1) if (val >= 0 && val <= 255) { GInput.val(val) $.farbtastic(far).setColor(RGB2Hex(parseInt(RInput.val()), parseInt(GInput.val()), parseInt(BInput.val()))) title.parent().parent().attr('user-content', RInput.val() + "," + GInput.val() + "," + BInput.val()) itemdiv.trigger(MixIO.eventTags.RGB_PICKER_CHANGED, [-1, val, -1]) } } } if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == Btopic.text()) { if (!isNaN(parseInt(message1))) { var val = parseInt(message1) if (val >= 0 && val <= 255) { BInput.val(val) $.farbtastic(far).setColor(RGB2Hex(parseInt(RInput.val()), parseInt(GInput.val()), parseInt(BInput.val()))) title.parent().parent().attr('user-content', RInput.val() + "," + GInput.val() + "," + BInput.val()) itemdiv.trigger(MixIO.eventTags.RGB_PICKER_CHANGED, [-1, -1, val]) } } } }) var far = $("#" + pickerID).farbtastic(function(color) { $('#' + pickerID + 'cl').css('background-color', color) RInput.val(HEX2RGB(color)[0]) GInput.val(HEX2RGB(color)[1]) BInput.val(HEX2RGB(color)[2]) }) $.farbtastic(far).setColor(RGB2Hex(parseInt(RInput.val()), parseInt(GInput.val()), parseInt(BInput.val()))) var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '(R)
')) var Rtopic_input_div = $('
') var Rtopic_input = $("") Rtopic_input_div.append(Rtopic_input) editForm.append(Rtopic_input_div) editForm.append($('
' + JSLang[lang].messTopic + '(G)
')) var Gtopic_input_div = $('
') var Gtopic_input = $("") Gtopic_input_div.append(Gtopic_input) editForm.append(Gtopic_input_div) editForm.append($('
' + JSLang[lang].messTopic + '(B)
')) var Btopic_input_div = $('
') var Btopic_input = $("") Btopic_input_div.append(Btopic_input) editForm.append(Btopic_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(Rtopic_input.val()) > 0 && getByteLen(Rtopic_input.val()) < 11 && getByteLen(Gtopic_input.val()) > 0 && getByteLen(Gtopic_input.val()) < 11 && getByteLen(Btopic_input.val()) > 0 && getByteLen(Btopic_input.val()) < 11) if (re.test(Rtopic_input.val()) && re.test(Gtopic_input.val()) && re.test(Btopic_input.val())) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', Rtopic_input.val() + "/" + Gtopic_input.val() + "/" + Btopic_input.val()) title.text(title_input.val()) Rtopic.text(Rtopic_input.val()) Gtopic.text(Gtopic_input.val()) Btopic.text(Btopic_input.val()) modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) Rtopic_input.val(Rtopic.text()) Gtopic_input.val(Gtopic.text()) Btopic_input.val(Btopic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_bar(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var titleDiv = $("
") var title = $("

" + user_title + "

") title.attr("hidden", title_style) titleDiv.append(title) contents.push(titleDiv) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var chartDiv = $("
") chartDiv.css("width", (standardWidth * 3) + "px") chartDiv.css("height", (standardWidth * 3 - 50) + "px") var chartTarget = echarts.init(chartDiv[0]) var chartOption = { dataZoom: [{ id: 'dataZoomX', type: 'slider', xAxisIndex: [0] }], grid: { top: 10, left: 40, right: 30, bottom: 75 }, xAxis: { type: 'category', data: [] }, yAxis: { type: 'value' }, series: [{ data: [], type: 'bar', showBackground: true, backgroundStyle: { color: 'rgba(180, 180, 180, 0.2)' } }] }; chartTarget.setOption(chartOption) chartDiv.bind('click', function(event) { event.stopPropagation() }) contents.push(chartDiv) if (user_content.length > 2) { var dataStr = user_content.substring(2) var dataArray = dataStr.split(',') var dataLength = dataArray.length / 2 for (var i = 0; i < dataLength; i += 1) { var prevX = chartTarget.getOption().xAxis[0] var prevY = chartTarget.getOption().series[0] prevX.data.push(dataArray[i]) prevY.data.push(dataArray[i + dataLength]) chartTarget.setOption({ xAxis: prevX, series: prevY }) } } var sync_export = function() { var dataset = chartTarget.getOption().series[0].data var labelset = chartTarget.getOption().xAxis[0].data var testData = [] for (data in dataset) { testData.push({ 'time': labelset[data], 'value': dataset[data] }) } var str = JSLang[lang].option + `,` + JSLang[lang].value + `\n`; for (var i = 0, len = testData.length; i < len; ++i) { for (var item in testData[i]) { str += `${testData[i][item]},`; } str += '\n'; } exportButton.attr("href", "data:text/csv;charset=utf-8,\ufeff" + encodeURIComponent(str)) } client.on('message', function(topic1, message1) { if (isAlive && isRunning) if ((topic1.split("/")[(isMixly ? 3 : 2)] == topic.text())) { var data = String(message1) itemdiv.trigger(MixIO.eventTags.BAR_CHART_CHANGED, [data]) var usrContent = titleDiv.parent().parent().attr('user-content').substring(0, 2) var prevX = chartTarget.getOption().xAxis[0] var prevY = chartTarget.getOption().series[0] console.log(prevY.data) if (titleDiv.parent().parent().attr('user-content')[1] == "0") { var datalen = prevX.data.length for (var ct = 0; ct <= datalen - 1; ct = ct + 1) { if (data == prevX.data[ct]) prevY.data[ct] = parseInt(prevY.data[ct]) + 1 } } else if (titleDiv.parent().parent().attr('user-content')[1] == "1") { var datalen = prevX.data.length for (var ct = 0; ct <= datalen - 1; ct = ct + 1) { if (data.indexOf(prevX.data[ct]) != -1) prevY.data[ct] = parseInt(prevY.data[ct]) + 1 } } chartTarget.setOption({ xAxis: prevX, series: prevY }) var dataset = chartTarget.getOption().series[0].data var labelset = chartTarget.getOption().xAxis[0].data var mixset = [] for (data in labelset) { mixset.push(labelset[data]) } for (data in dataset) { mixset.push(dataset[data]) } var mixstr = mixset.join(',') titleDiv.parent().parent().attr('user-content', usrContent + mixstr) sync_export() } }) var delete_on_click = function() { title.parent().parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() modeCheckbox.prop("checked", titleDiv.parent().parent().attr('user-content')[1] == 1) if (tbd) tbd.remove() } attrs = [ ['user-type', 'output_bar'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(3, 3, contents, attrs) itemdiv.bind(MixIO.actionTags.BAR_CHART_CHANGE, function(event, message) { MixIO.publish(topic.text(), message) }) itemdiv.bind(MixIO.actionTags.BAR_CHART_CLEAR, function() { clearButton.click() }) itemdiv.addClass("moveDiv") var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) editForm.append($('
' + JSLang[lang].choicesList + '
')) var option_input_div = $('
') var option_input = $("") option_input_div.append(option_input) editForm.append(option_input_div) editForm.append($('
' + JSLang[lang].recvMode + '
')) var modeButton = $("") var modeCheckbox = $("") if (user_content[1] == 1) modeCheckbox.prop("checked", true) else modeCheckbox.prop("checked", false) var modeCheckDiv = $("
") modeButton.append(modeCheckbox) modeButton.append(modeCheckDiv) var modeDiv = $("
") modeDiv.append($("" + JSLang[lang].single + "")) modeDiv.append(modeButton) modeDiv.append($("" + JSLang[lang].multiple + "")) editForm.append(modeDiv) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (option_input.val() != "") { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { titleDiv.parent().parent().attr('user-title', title_input.val()) titleDiv.parent().parent().attr('user-topic', topic_input.val()) var usrContent = titleDiv.parent().parent().attr('user-content') title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() var prevX = chartTarget.getOption().xAxis[0] var prevY = chartTarget.getOption().series[0] var optionList = option_input.val().split(',') var newXData = [] var newYData = [] for (option in optionList) { var isFoundInPrev = false for (prevOption in prevX.data) { if (prevX.data[prevOption] == optionList[option]) { newXData.push(optionList[option]) newYData.push(prevY.data[prevOption]) isFoundInPrev = true break } } if (!isFoundInPrev) { newXData.push(optionList[option]) newYData.push(0) } } prevX.data = newXData prevY.data = newYData chartTarget.setOption({ xAxis: prevX, series: prevY }) titleDiv.parent().parent().attr('user-content', usrContent[0] + (modeCheckbox.prop("checked") ? "1" : "0") + newXData.join(',') + ',' + newYData.join(',')) } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) } else showtext(JSLang[lang].listEmpty) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var editButton = $('') var deleteButton = $('') var clearButton = $('') var exportButton = $('') clearButton.click(function() { var prevX = chartTarget.getOption().xAxis[0] var prevY = chartTarget.getOption().series[0] prevY.data = [] for (tmp in prevX.data) { prevY.data.push(0) } chartTarget.setOption({ xAxis: prevX, series: prevY }) var dataset = chartTarget.getOption().series[0].data var labelset = chartTarget.getOption().xAxis[0].data var mixset = [] for (data in labelset) { mixset.push(labelset[data]) } for (data in dataset) { mixset.push(dataset[data]) } var mixstr = mixset.join(',') var usrContent = titleDiv.parent().parent().attr('user-content').substring(0, 2) titleDiv.parent().parent().attr('user-content', usrContent + mixstr) sync_export() }) editButton.click(edit_on_click) deleteButton.click(delete_on_click) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; if (!isRunning) bubble.append(editButton) bubble.append(clearButton) if (window.screen.height > 800) bubble.append(exportButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) option_input.val(chartTarget.getOption().xAxis[0].data.join(',')) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) sync_export() chartDiv.css("width", itemdiv.width() - 8 + "px") chartDiv.css("height", itemdiv.height() - 58 + "px") chartTarget.resize() chartDiv.bind('mousedown', function(event) { event.stopPropagation() }) chartDiv.bind('click', function(event) { event.stopPropagation() }) chartDiv.bind('wheel', function(event) { event.stopPropagation() }) itemdiv.resizable({ minWidth: 300, minHeight: 300, onResize: function() { chartDiv.css("width", itemdiv.width() - 8 + "px") chartDiv.css("height", itemdiv.height() - 58 + "px") chartTarget.resize() }, onStopResize: function() { var stdLeft = parseInt(itemdiv.css('left')) - parseInt(itemdiv.css('left')) % 20 + (parseInt(itemdiv.css('left')) % 20 > 10 ? 1 : 0) * 20 var stdTop = parseInt(itemdiv.css('top')) - parseInt(itemdiv.css('top')) % 20 + (parseInt(itemdiv.css('top')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('left', stdLeft) itemdiv.css('top', stdTop) var stdWidth = parseInt(itemdiv.css('width')) - parseInt(itemdiv.css('width')) % 20 + (parseInt(itemdiv.css('width')) % 20 > 10 ? 1 : 0) * 20 var stdHeight = parseInt(itemdiv.css('height')) - parseInt(itemdiv.css('height')) % 20 + (parseInt(itemdiv.css('height')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('width', stdWidth) itemdiv.css('height', stdHeight) chartDiv.css("width", itemdiv.width() - 8 + "px") chartDiv.css("height", itemdiv.height() - 58 + "px") chartTarget.resize() } }) } function add_dashboard(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var dashDiv = $("
") var dashCanvas = $("") dashDiv.append(dashCanvas) var dashID = randomString() + "dash" dashCanvas.attr('id', dashID) contents.push(dashDiv) attrs = [ ['user-type', 'output_dashboard'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(2, 2, contents, attrs) var gauge = new RadialGauge({ renderTo: dashID, highlights: [] }) gauge.draw(); client.on('message', function(topic1, message1) { if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == topic.text()) { if (!isNaN(parseFloat(message1))) { gauge.value = parseFloat(message1) title.parent().parent().attr('user-content', gauge.options.minValue + ',' + gauge.options.maxValue + ',' + gauge.value) itemdiv.trigger(MixIO.eventTags.DASHBOARD_CHANGED, [parseFloat(message1)]) } } }) itemdiv.bind(MixIO.actionTags.DASHBOARD_CHANGE, function(event, value) { MixIO.publish(topic.text(), value) }) var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) editForm.append($('
' + JSLang[lang].displayRange + '
')) var range_input_div = $('
') var min_input = $("") var max_input = $("") gauge.options.minValue = parseInt(title.parent().parent().attr('user-content').split(',')[0]) gauge.options.maxValue = parseInt(title.parent().parent().attr('user-content').split(',')[1]) min_input.val(title.parent().parent().attr('user-content').split(',')[0]) max_input.val(title.parent().parent().attr('user-content').split(',')[1]) gauge.value = title.parent().parent().attr('user-content').split(',')[2] var max = gauge.options.maxValue var min = gauge.options.minValue var step = (gauge.options.maxValue - gauge.options.minValue) / 5 gauge.options.majorTicks = [min, min + step, min + step * 2, min + step * 3, min + step * 4, max] gauge.update() range_input_div.append(min_input) range_input_div.append("-") range_input_div.append(max_input) editForm.append(range_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { if (parseInt(max_input.val()) - parseInt(min_input.val()) >= 5 && (parseInt(max_input.val()) - parseInt(min_input.val())) % 5 == 0) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) gauge.options.minValue = parseInt(min_input.val()) gauge.options.maxValue = parseInt(max_input.val()) var max = gauge.options.maxValue var min = gauge.options.minValue var step = (gauge.options.maxValue - gauge.options.minValue) / 5 gauge.options.majorTicks = [min, min + step, min + step * 2, min + step * 3, min + step * 4, max] gauge.update() console.log(gauge) title.parent().parent().attr('user-content', gauge.options.minValue + ',' + gauge.options.maxValue + ',' + gauge.value) title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() } else showtext(JSLang[lang].mod5) } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_map(user_title, user_topic, user_content, user_style, title_style) { var modald = showmodaltext("

加载地图引擎...

") if(baidu_ak!='') { $.getScript("//api.map.baidu.com/getscript?type=webgl&v=3.0&ak="+baidu_ak, function() { modald.close().remove() var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var randomName = randomString() + "map" var mapDiv = $("
") mapDiv.attr("id", randomName) mapDiv.bind('click', function(event) { event.stopPropagation() }) mapDiv.bind('pointerdown', function(event) { event.stopPropagation() }) mapDiv.bind('mousedown', function(event) { event.stopPropagation() }) mapDiv[0].addEventListener('touchstart', function(event) { event.stopPropagation() }, { passive: false }) contents.push(mapDiv) attrs = [ ['user-type', 'output_map'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(3, 3, contents, attrs) var maxLeft = mapDiv[0].clientWidth var maxTop = mapDiv[0].clientHeight var markers = [] var setContent = function() { var tmp = [] for (marker in markers) { console.log(markers[marker]) tmp.push(markers[marker].long) tmp.push(markers[marker].lat) tmp.push(markers[marker].time) tmp.push(markers[marker].message) tmp.push(markers[marker].clientid) } title.parent().parent().attr('user-content', tmp.join("@#@$@")) } itemdiv.bind(MixIO.actionTags.DATA_MAP_CHANGE, function(event, message) { MixIO.publish(topic.text(), JSON.stringify(message)) }) itemdiv.bind(MixIO.actionTags.DATA_MAP_CLEAR, function() { clear_on_click() }) client.on('message', function(topic1, message1) { if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == topic.text()) { var label = ((new Date().getHours() < 10 ? "0" : "") + new Date().getHours() + ":" + (new Date().getMinutes() < 10 ? "0" : "") + new Date().getMinutes() + ":" + (new Date().getSeconds() < 10 ? "0" : "") + new Date().getSeconds()) if (isJSON(String(message1)) && ("long" in JSON.parse(String(message1))) && ("lat" in JSON.parse(String(message1))) && JSON.parse(String(message1)).clientid) { var jsonMessage = JSON.parse(String(message1)) console.log(jsonMessage) itemdiv.trigger(MixIO.eventTags.DATA_MAP_CHANGED, [jsonMessage.clientid, jsonMessage.long, jsonMessage.lat, jsonMessage.message]) var newOrNot = true var markerIndex = -1 for (marker in markers) { if (jsonMessage.clientid == markers[marker].clientid) { newOrNot = false markerIndex = marker break } } if (newOrNot) { var msgstr = "" if (typeof jsonMessage.message == "string") jsonMessage.message = JSON.parse(jsonMessage.message) for (msg in jsonMessage.message) { msgstr = msgstr + jsonMessage.message[msg].label + ":" + jsonMessage.message[msg].value + "
" } var point = new BMapGL.Point(jsonMessage.long, jsonMessage.lat) var newMarker = new BMapGL.Marker(point) markerIndex = markers.length var bubble = create_a_map_bubble(msgstr, label, point) newMarker.bubble = bubble console.log(msgstr) markers.push({ "clientid": jsonMessage.clientid, "long": jsonMessage.long, "lat": jsonMessage.lat, "time": label, "message": msgstr, "target": newMarker, "point": point }) if (markers.length == 1) { map.centerAndZoom(markers[markerIndex].point, 17); } map.addOverlay(newMarker) newMarker.addEventListener('click', function() { if (map.getOverlays().indexOf(bubble) == -1) map.addOverlay(bubble) else map.removeOverlay(bubble) }) map.addOverlay(bubble) } else { markers[markerIndex].time = label var msgstr = "" if (typeof jsonMessage.message == "string") jsonMessage.message = JSON.parse(jsonMessage.message) for (msg in jsonMessage.message) { msgstr = msgstr + jsonMessage.message[msg].label + ":" + jsonMessage.message[msg].value + "
" } var point = new BMapGL.Point(jsonMessage.long, jsonMessage.lat) markers[markerIndex].long = jsonMessage.long markers[markerIndex].lat = jsonMessage.lat markers[markerIndex].point = point markers[markerIndex].message = msgstr markers[markerIndex].target.bubble.setPosition(point) markers[markerIndex].target.setPosition(point) markers[markerIndex].target.bubble.setContent(label + "
" + msgstr) if (map.getOverlays().indexOf(bubble) == -1) map.addOverlay(bubble) } setContent() } else { showtext(JSLang[lang].mapJSON) } } }) var map = new BMapGL.Map(randomName) map.centerAndZoom(new BMapGL.Point(116.373, 39.967), 17) map.enableScrollWheelZoom(true); map.disableContinuousZoom(); map.disableInertialDragging(); var opts = { offset: new BMapGL.Size(0, 0) }; var label = new BMapGL.Label(); label.setStyle({ color: '#4e73df', borderRadius: '5px', borderColor: '#ccc', backgroundColor: 'rgba(255,255,255,0.8)', padding: '8px', fontSize: '1rem', fontFamily: 'Nunito' }); map.addEventListener('mousemove', function(e) { if (!isRunning) { map.addOverlay(label) label.setContent(e.latlng.lng.toFixed(4) + ',' + e.latlng.lat.toFixed(4)) label.setPosition(new BMapGL.Point(e.latlng.lng, e.latlng.lat)) } else map.removeOverlay(label) }); var toBeAdded = user_content.split("@#@$@") var addLength = toBeAdded.length / 5 console.log(toBeAdded) for (var tmpi = 0; tmpi <= addLength - 1; tmpi = tmpi + 1) { var point = new BMapGL.Point(toBeAdded[tmpi * 5], toBeAdded[tmpi * 5 + 1]) var newMarker = new BMapGL.Marker(point) var bubble = create_a_map_bubble(toBeAdded[tmpi * 5 + 3], toBeAdded[tmpi * 5 + 2], point) newMarker.bubble = bubble markers.push({ "long": toBeAdded[tmpi * 5], "lat": toBeAdded[tmpi * 5 + 1], "time": toBeAdded[tmpi * 5 + 2], "message": toBeAdded[tmpi * 5 + 3], "clientid": toBeAdded[tmpi * 5 + 4], "target": newMarker, "point": point }) if (markers.length == 1) { map.centerAndZoom(point, 17); } map.addOverlay(newMarker) newMarker.addEventListener('click', function(bubble) { return function() { if (map.getOverlays().indexOf(bubble) == -1) map.addOverlay(bubble) else map.removeOverlay(bubble) } }(bubble)) map.addOverlay(bubble) } setContent() var delete_on_click = function() { $("#trashbin").append(mapDiv) title.parent().parent().remove(); isAlive = false; if (tbd) tbd.remove() } var clear_on_click = function() { map.clearOverlays() markers = [] setContent() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) if (title.parent().parent().attr('user-content') == undefined) title.parent().parent().attr('user-content', "") title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var clearButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) clearButton.click(clear_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) bubble.append(clearButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) itemdiv.resizable({ minWidth: 300, minHeight: 300, onStopResize: function() { var stdLeft = parseInt(itemdiv.css('left')) - parseInt(itemdiv.css('left')) % 20 + (parseInt(itemdiv.css('left')) % 20 > 10 ? 1 : 0) * 20 var stdTop = parseInt(itemdiv.css('top')) - parseInt(itemdiv.css('top')) % 20 + (parseInt(itemdiv.css('top')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('left', stdLeft) itemdiv.css('top', stdTop) var stdWidth = parseInt(itemdiv.css('width')) - parseInt(itemdiv.css('width')) % 20 + (parseInt(itemdiv.css('width')) % 20 > 10 ? 1 : 0) * 20 var stdHeight = parseInt(itemdiv.css('height')) - parseInt(itemdiv.css('height')) % 20 + (parseInt(itemdiv.css('height')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('width', stdWidth) itemdiv.css('height', stdHeight) } }) },true); } else if(tencent_key!='') { $.getScript("//map.qq.com/api/gljs?v=1.exp&key="+tencent_key, function() { modald.close().remove() var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var randomName = randomString() + "map" var mapDiv = $("
") mapDiv.attr("id", randomName) mapDiv.bind('click', function(event) { event.stopPropagation() }) mapDiv.bind('pointerdown', function(event) { event.stopPropagation() }) mapDiv.bind('mousedown', function(event) { event.stopPropagation() }) mapDiv[0].addEventListener('touchstart', function(event) { event.stopPropagation() }, { passive: false }) contents.push(mapDiv) attrs = [ ['user-type', 'output_map'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(3, 3, contents, attrs) var maxLeft = mapDiv[0].clientWidth var maxTop = mapDiv[0].clientHeight var markers = [] var setContent = function() { var tmp = [] var markergeos = [] var layergeos = [] try{ for (marker in markers) { tmp.push(markers[marker].long) tmp.push(markers[marker].lat) tmp.push(markers[marker].time) tmp.push(markers[marker].message) tmp.push(markers[marker].clientid) markergeos.push({ "id": markers[marker].clientid + "marker", "styleId": "myStyle", "position": new TMap.LatLng(markers[marker].lat, markers[marker].long) }) layergeos.push({ "id": markers[marker].clientid + "layer", "styleId": "label", "position": new TMap.LatLng(markers[marker].lat, markers[marker].long), "content": markers[marker].message + " " + markers[marker].time }) } if(markergeos.length == 1){ map.setCenter(new TMap.LatLng(markers[0].lat, markers[0].long)) } title.parent().parent().attr('user-content', tmp.join("@#@$@")) markerLayer.setGeometries(markergeos) mapTextLayer.setGeometries(layergeos) } catch(e){ showtext(e.message.replace("LatLng.", "")) } } itemdiv.bind(MixIO.actionTags.DATA_MAP_CHANGE, function(event, message) { MixIO.publish(topic.text(), JSON.stringify(message)) }) itemdiv.bind(MixIO.actionTags.DATA_MAP_CLEAR, function() { clear_on_click() }) client.on('message', function(topic1, message1) { if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == topic.text()) { var label = ((new Date().getHours() < 10 ? "0" : "") + new Date().getHours() + ":" + (new Date().getMinutes() < 10 ? "0" : "") + new Date().getMinutes() + ":" + (new Date().getSeconds() < 10 ? "0" : "") + new Date().getSeconds()) if (isJSON(String(message1)) && ("long" in JSON.parse(String(message1))) && ("lat" in JSON.parse(String(message1))) && JSON.parse(String(message1)).clientid) { var jsonMessage = JSON.parse(String(message1)) console.log(jsonMessage) itemdiv.trigger(MixIO.eventTags.DATA_MAP_CHANGED, [jsonMessage.clientid, jsonMessage.long, jsonMessage.lat, jsonMessage.message]) var newOrNot = true var markerIndex = -1 for (marker in markers) { if (jsonMessage.clientid == markers[marker].clientid) { newOrNot = false markerIndex = marker break } } if (newOrNot) { var msgstr = "" if (typeof jsonMessage.message == "string") jsonMessage.message = JSON.parse(jsonMessage.message) for (msg in jsonMessage.message) { msgstr = msgstr + jsonMessage.message[msg].label + ": " + jsonMessage.message[msg].value + " " } markers.push({ "clientid": jsonMessage.clientid, "long": jsonMessage.long, "lat": jsonMessage.lat, "time": label, "message": msgstr }) } else { markers[markerIndex].time = label var msgstr = "" if (typeof jsonMessage.message == "string") jsonMessage.message = JSON.parse(jsonMessage.message) for (msg in jsonMessage.message) { msgstr = msgstr + jsonMessage.message[msg].label + ": " + jsonMessage.message[msg].value + " " } markers[markerIndex].long = jsonMessage.long markers[markerIndex].lat = jsonMessage.lat markers[markerIndex].message = msgstr } setContent() } else { showtext(JSLang[lang].mapJSON) } } }) var map = new TMap.Map(document.getElementById(randomName), { center: new TMap.LatLng(39.967, 116.373), zoom: 17, pitch: 43.5, rotation: 45 }); var markerLayer = new TMap.MultiMarker({ map: map, //指定地图容器 styles: { //创建一个styleId为"myStyle"的样式(styles的子属性名即为styleId) "myStyle": new TMap.MarkerStyle({ "width": 25, // 点标记样式宽度(像素) "height": 35, // 点标记样式高度(像素) "src": 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABkCAMAAAAIYWa2AAAC8VBMVEVHcEwAAAAAAAAAAAAAAAAzMzPQRUXlSUnnS0vqS0vrTEzhSEgAAADFRUXmS0vtTk7xTU3yTk7yTk6vPz/oTEzvTk7yTk7MRETrS0vyT0/FQUHFPj7uTU3yTk7sTExVKiroS0vyTk5IJCS4QEDuTU3SRETxTU0AAADhSkreSUkAAADoSkryTk7pSkoAAADoTEzmTEziSUndSEjMRETDQUFtJCTwTU3vTExfHx/mSUkAAADFPz/yTk68PDztTEwAAADMRUXBQUHsTEzqTEyzPj7yTk6lOTnjSUnfSEjuTk7yUVH2iYn6wMD95OT+9vYAAADBPT32hob95ub///+2OTkAAADfSUnyT0/5ra3aR0cAAADqS0vwTU3vTU0AAABmKChbJCTBPT24OjrQQkIAAADXRUXRQ0PVRUUAAADcR0fYRkYAAADXRETQQkLNRETIQkLDQUG9Pj6qNzegNTUhCwvxTk4cCQkAAADrTEwAAAAAAADkSkriSEgAAADLQUFnIiLyTk5gHx/oS0vnSkoAAAAAAADOQ0NLHh7wTk4/FRXaRkbXRUVuJSXxTU1vKCgAAADfSEjZRkYAAADwTU3vTU1XHBzSRETIQEAmDw/rTEzoSkoIBQWhNDSMLS3NQkIAAAAAAAAlDw/oSkrnSkqBKyvwTU3vTU1lISG5PT2qODgAAADURUXKQkIBAQHjSUncRkYAAAAAAAA1FBTkSkoYCgpjISHsS0s/FxcAAABtJSXsTU3pS0tTGhp0JibsTExYHR1bHBzsTExpIyOVMzPuTU19KyujNjbxTk7uTU2MLS2xOTnxTk6bMTHCPj60OTniSEjcR0fuTU07FxefNDTbR0fTRUXpS0uiNDThSEiDKyvXRkZ6JyfhSUmSLi7pS0vIQUFQGBjmSkrGQUGCKSntTEzrTEzdSEjbR0edMzOYMTHZR0eTLy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6Ei6pAAAA+3RSTlMAAQIDBAUhRVhlcUYFFlSTzvX/EGC6/B6P8h8YmPiZBmvtBxe7MNwGVlcHhf6PCHx8WlwtLw7T1BCDCSz3LrQLNzqwsSX9KICC2///////DjL///81CnP//3UMtOPkERkcPkFcDWdqdg98fhBvcmFjUlY8Phf4GxTRFxKlqBZsJfopwMIaE3ci7iSRky/5MhimnBvy7C2DeiHVzSBIQoceFSLQxTvw6zVnWx2Qgh+3qSEZJsAkMtssHDbh1jE73zQ14jpL6UFU9e9IXfRScma0p+crU56T0k2vOpQ0rULLdCm4cTHY1JeWPD6aQC42PDkwKCsvMjQsKSUnKiijw/sAAAUASURBVHgB1M8DcoRBEIbhNNbutW3EtnP/E2V/rDUzKeUpo9/q7+gfATA/tSAiORARpjQLiMTs8fr8gWAw4A95PWEmO6SRII5EY/GEzCXisWgkzIodu5BMpTOyIZNOJZmsjEIim8vLDvlcIXwgYw3hYqkse5QrRTuz741qrS4H1GsN3lmx3mimRUGrGabtkwAo3O6Ikk67u3USIIV7eVGU7w82JwEgdYcjUTYablasRk60jCdrFQDqHoumk3ll3jgVbWfWokUDw+d50Za/GND8FUC+vBID1zddt2KNGdyKkdu7MLoR7N4/iJGHR3cQIN89iaGnZ+cVoO7LSAyNXicMYD/yJsben7sI1iMfn2Ls82vC0wjffcsf/DyH8ZdUskbLIIyBcJCSag+BQ4+36+7uisv58d+T6pt23ic6sH1wJ5CEKMmKqiqyJJKIoB3vwM6xTgKGaf3LNEjIdnZh99IlXM+3luR7BBaEB7B3FxGub63IJ7BIO4ZjLSZ2sdZEbJSkl3Ce4UkTzfUipojnLXfgssAbSNaGJJwsQ3Aq3JI3i8g4WdVw1+CWsllEwclWgzDALXWziIqTXQ/1wFpknKC+Z13n4bvII+thn1Kon1lf/DJB/cqxhY17myB8v2aL/cdXKWYNHLcWheGlcmt3r32URP2E1FeqQoatDJrRpI0sJTIzyTEzoxIzY9gMYWY0M1fRXWXOsizdvf18c/6Dv3SNNpBspH8DGMlRhgv8df9WwQ0h1HDaFuXfUopiSQNBR8f4sx5jYvkLhn9ChTh/FnV8AkPImy0xyR9IEidvNstpJjkFn5GSypJWeduHCmn4kPQE5rTFYJL1ZGTiMjKzhFD57hgtBC1m40Ju5vAXrCbkTgLZjFw8Rl4+RxFm+RbLoTBiAR6kMIdXDIo9lKJiHEZJqYACsUPkrHBlMRhmqzzBdsEeCKJYST4nXT+korIqVPFsinsMraqu0cuoLRWZ02CHkeNixLp6fYyGxhweeS2jw5XLgpp02b+AZskhBgSx0i09kNstHA1i0FMqJLS0ame0tXfYKwMQ5RPhAiN2lmhldHUn8IH/gBjntHT09Gpj1PT1s6GODxXntAQm5gwMamEMDUtVFOHCgLTIyc0ZGdXAuCMJNPq+8ISg5Iay/SMhxzF671Z6ZQCFquovb1Bn3LtfydEXrJBUD4oVUR6otu7DRy0c450BlNNUlTQ27psxMYkYUFxfFFqQpnzu3OmZFlGdAZTKWV+QuVLRRqow4K/DaYZrmffOeNzewasygIIGIP+JN8bo05zEwP/NJnUGDEDClJe9EPBMgmZXeTAAbP9zT8iLFoEmjmfAXqCETo9ZfNkN06+JYr1g63jlJihgsj/RY/rV0xKY2P/arTItAkyudkFvXFpufKCDgT8D2gUluOT2rcTqEOM4Re9inK5dj0jrEQOnqOO9A5Ldn2j/oNf1UG6ryoBx8gMKRIcYCMWW8BFOpqQnEHgoKwL4yk8djM5AoEB87F9/0vq5KlBnIBAKxX1RIPM5NjiZekMh2asK5CtHybcb63+5nNpvSm2yWMWaYer5jiA/kBojHsT0D8n+RJBfeGqgVRam5RW/yGLVBlqlanFpaRm8GVYoTPvK6tra+ka7TbcagEibW9s7q6u7G3v7lbgQy8Hh/tbe9vbK1tHhgcWA+Yj+w839o62j/cN+ApeBskIyPM8EQlaxQcd32W/E9Jewb6BBFAAAAABJRU5ErkJggg==', //图片路径 //焦点在图片中的像素位置,一般大头针类似形式的图片以针尖位置做为焦点,圆形点以圆心位置为焦点 "anchor": { x: 16, y: 32 } }) } }); var mapTextLayer = new TMap.MultiLabel({ id: 'mapTextLayer', map: map, styles: { 'label': new TMap.LabelStyle({ 'color': '#3777FF', //颜色属性 'strokeColor': '#ffffff', 'size': 14, //文字大小属性 'offset': { x: 0, y: 10 }, //文字偏移属性单位为像素 'angle': 0, //文字旋转属性 'alignment': 'center', //文字水平对齐属性 'verticalAlignment': 'top' //文字垂直对齐属性 }) } }); var toBeAdded = user_content.split("@#@$@") var addLength = toBeAdded.length / 5 for (var tmpi = 0; tmpi <= addLength - 1; tmpi = tmpi + 1) { markers.push({ "long": toBeAdded[tmpi * 5], "lat": toBeAdded[tmpi * 5 + 1], "time": toBeAdded[tmpi * 5 + 2], "message": toBeAdded[tmpi * 5 + 3], "clientid": toBeAdded[tmpi * 5 + 4] }) } setContent() var delete_on_click = function() { $("#trashbin").append(mapDiv) title.parent().parent().remove(); isAlive = false; if (tbd) tbd.remove() } var clear_on_click = function() { markers = [] setContent() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) if (title.parent().parent().attr('user-content') == undefined) title.parent().parent().attr('user-content', "") title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var clearButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) clearButton.click(clear_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) bubble.append(clearButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) itemdiv.resizable({ minWidth: 300, minHeight: 300, onStopResize: function() { var stdLeft = parseInt(itemdiv.css('left')) - parseInt(itemdiv.css('left')) % 20 + (parseInt(itemdiv.css('left')) % 20 > 10 ? 1 : 0) * 20 var stdTop = parseInt(itemdiv.css('top')) - parseInt(itemdiv.css('top')) % 20 + (parseInt(itemdiv.css('top')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('left', stdLeft) itemdiv.css('top', stdTop) var stdWidth = parseInt(itemdiv.css('width')) - parseInt(itemdiv.css('width')) % 20 + (parseInt(itemdiv.css('width')) % 20 > 10 ? 1 : 0) * 20 var stdHeight = parseInt(itemdiv.css('height')) - parseInt(itemdiv.css('height')) % 20 + (parseInt(itemdiv.css('height')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('width', stdWidth) itemdiv.css('height', stdHeight) } }) },true); } } function create_a_map_bubble(messageBody, time, point) { var opts = { position: point, offset: new BMapGL.Size(0, 0) }; var label = new BMapGL.Label(time + "
" + messageBody, opts); label.setStyle({ color: '#4e73df', borderRadius: '5px', borderColor: '#ccc', backgroundColor: 'rgba(255,255,255,0.8)', padding: '8px', fontSize: '1rem', fontFamily: 'Nunito' }); return label } function add_text(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var textDiv = $("
") textDiv.html(stringendecoder.decodeHtml(user_content)) var minFontSize = 1 var fontSize = 3 - user_content.length / 3 if (fontSize < minFontSize) fontSize = minFontSize textDiv.css('font-size', fontSize + 'rem') textDiv.attr('class', 'mid_screen') contents.push(textDiv) attrs = [ ['user-type', 'output_text'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(2, 2, contents, attrs) itemdiv.bind(MixIO.actionTags.TEXT_SCREEN_CHANGE, function(event, message) { MixIO.publish(topic.text(), message) }) client.on('message', function(topic1, message1) { if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == topic.text()) { textDiv.animate({ opacity: 0 }, 200); setTimeout(function() { textDiv.empty() // set innerHTML textDiv.html(stringendecoder.decodeHtml(String(message1))) var minFontSize = 1 var fontSize = 3 - String(message1).length / 3 if (fontSize < minFontSize) fontSize = minFontSize textDiv.css('font-size', fontSize + 'rem') textDiv.animate({ opacity: 1 }, 200); title.parent().parent().attr('user-content', stringendecoder.encodeHtml(String(message1))) itemdiv.trigger(MixIO.eventTags.TEXT_SCREEN_CHANGED, [String(message1)]) }, 200) } }) var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) if (title.parent().parent().attr('user-content') == undefined) title.parent().parent().attr('user-content', "") title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_table(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true client.on('message', function(topic1, message1) { if (isRunning) if (isAlive && isRunning) if (topic1.split("/")[(isMixly ? 3 : 2)] == topic.text()) { var cols = [] // if not JSON if(!isJSON(String(message1))) { for (datafield in datafields) { if (datafields[datafield].type != "control" && datafields[datafield].name != "时间" && datafields[datafield].name != "時間" && datafields[datafield].name != "time") cols.push(datafields[datafield].name) } var message = String(message1).split(',') itemdiv.trigger(MixIO.eventTags.DATA_TABLE_CHANGED, [message]) var toBePushed = {} var index = 0 toBePushed["時間"] = timeStamp2String() toBePushed["时间"] = timeStamp2String() toBePushed["time"] = timeStamp2String() for (datafield in cols) { toBePushed[cols[datafield]] = message[index] ? message[index] : '' index = index + 1 } dataset.unshift(toBePushed) console.log(dataset) init_table() setContent() } else { // use JSON's keys as columns var message = JSON.parse(String(message1)) itemdiv.trigger(MixIO.eventTags.DATA_TABLE_CHANGED, [message]) // make datafield datafields = [] // push time datafields.push({ "name": JSLang[lang].time, "type": "text", "align": "center" }) for (datafield in message) { datafields.push({ "name": datafield, "type": "text", "align": "center" }) } var cols = [] for (datafield in datafields) { cols.push(datafields[datafield].name) } count_input.val(cols.join(',')) // make dataset var toBePushed = {} toBePushed["時間"] = timeStamp2String() toBePushed["时间"] = timeStamp2String() toBePushed["time"] = timeStamp2String() for (datafield in message) { toBePushed[datafield] = message[datafield] } dataset.unshift(toBePushed) console.log(dataset) init_table() setContent() } } }) var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var tableDiv = $("
") tableDiv.click(function(event) { event.stopPropagation() }) tableDiv.bind('mousedown', function(event) { event.stopPropagation() }) tableDiv.bind('pointerdown', function(event) { event.stopPropagation() }) contents.push(tableDiv) var textDiv = $("
") textDiv.text(stringendecoder.decodeHtml(user_content)) textDiv.attr('class', 'mid_screen') //contents.push(textDiv) attrs = [ ['user-type', 'table'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(3, 3, contents, attrs) itemdiv.bind(MixIO.actionTags.DATA_TABLE_CHANGE, function(event, message) { MixIO.publish(topic.text(), message) }) itemdiv.bind(MixIO.actionTags.DATA_TABLE_CLEAR, function() { clear_on_click() }) itemdiv.addClass("moveDiv") var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() if (tbd) tbd.remove() } var clear_on_click = function() { dataset = [] init_table() setContent() sync_export() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) editForm.append($('
' + JSLang[lang].columns + '
')) var count_input_div = $('
') var count_input = $("") count_input_div.append(count_input) editForm.append(count_input_div) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { if (count_input.val() != "") { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) title.text(title_input.val()) topic.text(topic_input.val()) var colNames = count_input.val().split(',') datafields = [] for (colName in colNames) { datafields.push({ name: colNames[colName], align: 'center', type: 'text' }) } init_table() setContent() modifyDia.close() } else showtext(JSLang[lang].columnsSet) } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var exportButton = $('') var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var clearButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) clearButton.click(clear_on_click) if (!isRunning) bubble.append(editButton) if (window.screen.width > 800) bubble.append(exportButton) bubble.append(clearButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } var sync_export = function() { var cols = [] for (datafield in datafields) { if (datafields[datafield].type != "control") cols.push(datafields[datafield].name) } var colNameStr = '' for (datafield in cols) { colNameStr = colNameStr + cols[datafield] + "," } colNameStr = colNameStr + '\n' var colValStr = '' for (data in dataset) { var dataArray = dataset[data] for (datafield in cols) { if (dataArray[cols[datafield]]) colValStr = colValStr + dataArray[cols[datafield]] + "," else colValStr = colValStr + ',' } colValStr += '\n'; } exportButton.attr("href", "data:text/csv;charset=utf-8,\ufeff" + encodeURIComponent(colNameStr + colValStr)) } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) var dataset = []; var colCount = parseInt(user_content.split(',')[0]) var colNames = user_content.split(',').slice(1, 1 + colCount) console.log(colNames) count_input.val(colNames.join(',')) var colVals = user_content.split(',').slice(1 + colCount) var rowNum = colVals.length / colCount for (var rowct = 1; rowct <= rowNum; rowct = rowct + 1) { var toBePushed = {} for (var colct = 1; colct <= colCount; colct = colct + 1) { toBePushed[colNames[colct - 1]] = colVals[(rowct - 1) * colCount + colct - 1] } dataset.push(toBePushed) } var datafields = [] for (colName in colNames) { datafields.push({ name: colNames[colName], align: 'center', type: 'text' }) } var setContent = function() { var cols = [] for (datafield in datafields) { if (datafields[datafield].type != "control") cols.push(datafields[datafield].name) } var colNameStr = '' for (datafield in cols) { colNameStr = colNameStr + "," + cols[datafield] } var colValStr = '' for (data in dataset) { var dataArray = dataset[data] for (datafield in cols) { if (dataArray[cols[datafield]]) colValStr = colValStr + ',' + dataArray[cols[datafield]] else colValStr = colValStr + ',' } } title.parent().parent().attr('user-content', cols.length + colNameStr + colValStr) } var init_table = function() { if (dataset.length != 0 && datafields[datafields.length - 1].type != 'control') datafields.push({ type: 'control' }) if (dataset.length == 0 && datafields[datafields.length - 1].type == 'control') datafields.pop() tableDiv.jsGrid({ width: "calc(100% - 40px)", height: "calc(100% - 80px)", noDataContent: JSLang[lang].noData, editing: true, data: dataset, confirmDeleting: false, fields: datafields, onItemDeleted: function() { setContent() sync_export() }, onItemUpdated: function() { setContent() sync_export() } }); sync_export() } init_table() itemdiv.resizable({ minWidth: 300, minHeight: 300, onResize: function() { tableDiv.jsGrid("refresh") }, onStopResize: function() { var stdLeft = parseInt(itemdiv.css('left')) - parseInt(itemdiv.css('left')) % 20 + (parseInt(itemdiv.css('left')) % 20 > 10 ? 1 : 0) * 20 var stdTop = parseInt(itemdiv.css('top')) - parseInt(itemdiv.css('top')) % 20 + (parseInt(itemdiv.css('top')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('left', stdLeft) itemdiv.css('top', stdTop) var stdWidth = parseInt(itemdiv.css('width')) - parseInt(itemdiv.css('width')) % 20 + (parseInt(itemdiv.css('width')) % 20 > 10 ? 1 : 0) * 20 var stdHeight = parseInt(itemdiv.css('height')) - parseInt(itemdiv.css('height')) % 20 + (parseInt(itemdiv.css('height')) % 20 > 10 ? 1 : 0) * 20 itemdiv.css('width', stdWidth) itemdiv.css('height', stdHeight) tableDiv.jsGrid("refresh") } }) } last_weather_synced = new Date() function add_weather(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var contents = [] var title = $("

" + user_title + "

") title.attr("hidden", title_style) contents.push(title) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var weatherDiv = $("
") contents.push(weatherDiv) var dscname = $("

 

") weatherDiv.append(dscname) var tmmper = $("

 

") weatherDiv.append(tmmper) var tmmper2 = $("

 

") weatherDiv.append(tmmper2) var buttonDiv = $("
") var syncIcon = $('') var sendIcon = $('') var district = '' var weather_type = '' var temperature = '' var humidity = '' var wind_dir = '' var wind_class = '' sendIcon.click(function(event) { event.stopPropagation() var weather = { 'district': district, 'weather_type': weather_type, 'temperature': temperature, 'humidity': humidity, 'wind_dir': wind_dir, 'wind_class': wind_class } publish(topic.text(), JSON.stringify(weather)) itemdiv.trigger(MixIO.eventTags.WEATHER_SENT, [district, weather_type, temperature, humidity, wind_dir, wind_class]) }) sendIcon.bind('mousedown', function(event) { event.stopPropagation() }) sendIcon.bind('mouseup', function(event) { event.stopPropagation() }) buttonDiv.append(syncIcon) syncIcon.bind('mousedown', function(event) { event.stopPropagation() }) syncIcon.bind('mouseup', function(event) { event.stopPropagation() }) var sync_weather = function(event) { if (event != undefined) event.stopPropagation() syncIcon.children().attr('class', 'fa fa-refresh fa-spin') weatherDiv.css('background-color', '#e74a3b') tmmper.html(JSLang[lang].updating) $.get('getWeather', { 'dsc_code': title.parent().parent().attr('user-content').split(',')[0].split('w')[0] }, function(res) { syncIcon.children().attr('class', 'fa fa-refresh') var resJSON = JSON.parse(res) if (resJSON.status == 0) { sendIcon.removeAttr('disabled') weatherDiv.css('background-color', '#1cc88a') dscname.html(resJSON.result.location.name) district = resJSON.result.location.name tmmper.html(resJSON.result.now.temp + "℃  " + resJSON.result.now.text + "  " + resJSON.result.now.rh + "%RH") weather_type = resJSON.result.now.text temperature = resJSON.result.now.temp humidity = resJSON.result.now.rh tmmper2.html(resJSON.result.now.wind_dir + "  " + resJSON.result.now.wind_class) wind_dir = resJSON.result.now.wind_dir wind_class = resJSON.result.now.wind_class title.parent().parent().attr('user-content', [title.parent().parent().attr('user-content').split(',')[0], district, weather_type, temperature, humidity, wind_dir, wind_class].join(',')) } else { sendIcon.attr('disabled', 'disabled') dscname.html(" ") tmmper.html(JSLang[lang].updateF) tmmper2.html(" ") } itemdiv.trigger(MixIO.eventTags.WEATHER_SYNCED, [district, weather_type, temperature, humidity, wind_dir, wind_class]) }) } syncIcon.bind('click', sync_weather) buttonDiv.append(sendIcon) contents.push(buttonDiv) attrs = [ ['user-type', 'input_weather'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(2, 2, contents, attrs) itemdiv.bind(MixIO.actionTags.WEATHER_SYNC, function() { sync_weather() }) itemdiv.bind(MixIO.actionTags.WEATHER_SEND, function() { var weather = { 'district': district, 'weather_type': weather_type, 'temperature': temperature, 'humidity': humidity, 'wind_dir': wind_dir, 'wind_class': wind_class } publish(topic.text(), JSON.stringify(weather)) }) sync_weather() if (title.parent().parent().attr('user-content').split(',')[0].split('w').length == 3) { var syncInterval = parseInt(title.parent().parent().attr('user-content').split(',')[0].split('w')[1]) if (syncInterval != 0) { MixIO.setInterval(function() { if (isRunning && isAlive) syncIcon.click() }, syncInterval * 60000) } var sendInterval = parseInt(title.parent().parent().attr('user-content').split(',')[0].split('w')[2]) if (sendInterval != 0) { MixIO.setInterval(function() { if (isRunning && isAlive) { sendIcon.click() } }, sendInterval * 60000) } } var delete_on_click = function() { title.parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { if (title.parent().parent().attr('user-content').substring(2, 6) == "0000") province_input.val(title.parent().parent().attr('user-content').split(',')[0].split('w')[0]).trigger('change') else if (title.parent().parent().attr('user-content').substring(4, 6) == "00") { province_input.val(title.parent().parent().attr('user-content').substring(0, 2) + "0000").trigger('change') city_input.val(title.parent().parent().attr('user-content').split(',')[0].split('w')[0]).trigger('change') } else { province_input.val(title.parent().parent().attr('user-content').substring(0, 2) + "0000").trigger('change') city_input.val(title.parent().parent().attr('user-content').substring(0, 4) + "00").trigger('change') district_input.val(title.parent().parent().attr('user-content').split(',')[0].split('w')[0]).trigger('change') } if (title.parent().parent().attr('user-content').split(',')[0].split('w').length < 3) { sync_input.val(0) send_input.val(0) } else { sync_input.val(title.parent().parent().attr('user-content').split(',')[0].split('w')[1]) send_input.val(title.parent().parent().attr('user-content').split(',')[0].split('w')[2]) } modifyDia.showModal() if (tbd) tbd.remove() } var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) editForm.append($('
' + JSLang[lang].syncInterval + '
')) var sync_input_div = $('
') var sync_input = $("") sync_input.append($("")) sync_input.append($("")) sync_input.append($("")) sync_input.append($("")) sync_input_div.append(sync_input) editForm.append(sync_input_div) editForm.append($('
' + JSLang[lang].sendInterval + '
')) var send_input_div = $('
') var send_input = $("") send_input.append($("")) send_input.append($("")) send_input.append($("")) send_input.append($("")) send_input.append($("")) send_input_div.append(send_input) editForm.append(send_input_div) editForm.append($('
' + JSLang[lang].location + '
')) var province_input = $("") province_input.append($("")) for (district in districts) { province_input.append($("")) } editForm.append(province_input) var city_input = $("") city_input.append($("")) editForm.append(city_input) province_input.change(function() { city_input.empty() city_input.append($("")) district_input.empty() district_input.append($("")) district_input.attr('disabled', 'disabled') if (province_input.val() != "unselected") { for (district in districts[province_input.val()].child) { city_input.append($("")) } city_input.removeAttr('disabled') } else city_input.attr('disabled', 'disabled') }) var district_input = $("") district_input.append($("")) editForm.append(district_input) city_input.change(function() { district_input.empty() district_input.append($("")) if (city_input.val() != "unselected") { console.log(province_input.val()) for (district in (districts[province_input.val()].child)[city_input.val()].child) { district_input.append($("")) } district_input.removeAttr('disabled') } else district_input.attr('disabled', 'disabled') }) var bottomDiv = $('
') var confirmEdit = $('') bottomDiv.append(confirmEdit) confirmEdit.click(function() { var placecode = province_input.val() == "unselected" ? "unselected" : (city_input.val() == "unselected" ? province_input.val() : (district_input.val() == "unselected" ? city_input.val() : district_input.val())) if (placecode == "unselected") showtext(JSLang[lang].locationSet) else { if (getByteLen(title_input.val()) > 0 && getByteLen(title_input.val()) < 21) { var re = /^[a-z0-9]+$/i; if (getByteLen(topic_input.val()) > 0 && getByteLen(topic_input.val()) < 11) if (true) { if (countSubstr(grid.html(), 'user-title=\"' + title_input.val() + '\"', false) <= (title_input.val() == title.text() ? 1 : 0)) { title.parent().parent().attr('user-title', title_input.val()) title.parent().parent().attr('user-topic', topic_input.val()) title.parent().parent().attr('user-content', placecode + "w" + sync_input.val() + "w" + send_input.val()) if (title.parent().parent().attr('user-content') == undefined) title.parent().parent().attr('user-content', "") title.text(title_input.val()) topic.text(topic_input.val()) modifyDia.close() sync_weather() } else showtext(JSLang[lang].sameUnit) } else showtext("") else showtext(JSLang[lang].topicLenIllegal) } else showtext(JSLang[lang].nameLenIllegal) } }) var cancelEdit = $('') cancelEdit.click(function() { modifyDia.close() }) bottomDiv.append(cancelEdit) editForm.append(bottomDiv) var modifyDia = dialog({ content: editForm[0], cancel: false }) var showEditBubble = function(event) { if(tbd) tbd.remove() if (typeof startX != "undefined" && (startX - endX < 5 && endX - startX < 5) && (startY - endY < 5 && endY - startY < 5)) { var editButton = $('') var deleteButton = $('') var bubble = $('
') bubble.append(topicDiv) var d = dialog({ align: 'top', content: bubble[0], quickClose: true, autofocus: false }); tbd = d; editButton.click(edit_on_click) deleteButton.click(delete_on_click) if (!isRunning) bubble.append(editButton) if (!isRunning) bubble.append(deleteButton) if (!isRunning) { copyButton.attr("user-origin", title.text()) bubble.append(copyButton) styleButton.attr("user-origin", title.text()) bubble.append(styleButton) helpButton.attr("user-origin", attrs[0][1]) bubble.append(helpButton) } title_input.val(title.text()) topic_input.val(topic.text()) if (!d.open) { d.show(itemdiv[0]); setTimeout(function() { $(".ui-popup-backdrop").css("pointer-events", "auto") },100) } else d.close() } } if (window.screen.width > 800) { itemdiv.click(showEditBubble) itemdiv.on('contextmenu', function(event) { event.preventDefault() event.stopPropagation() showEditBubble(event) }) } else itemdiv[0].addEventListener('touchend', function(event) { event.preventDefault() showEditBubble(event) }) itemdiv[0].addEventListener('touchmove', function(e) { e.preventDefault() }) if (user_style != undefined) itemdiv.attr('style', user_style) } function add_chart(user_title, user_topic, user_content, user_style, title_style) { var isAlive = true var isTable = false var contents = [] var titleDiv = $("
") var title = $("

" + user_title + "

") title.attr("hidden", title_style) titleDiv.append(title) contents.push(titleDiv) var topicDiv = $("
") var topic = $("" + user_topic + "") topicDiv.append($("")) topicDiv.append(topic) var tableDiv = $("
") tableDiv.click(function(event) { event.stopPropagation() }) tableDiv.bind('mousedown', function(event) { event.stopPropagation() }) tableDiv.bind('pointerdown', function(event) { event.stopPropagation() }) var convert_on_click = function() { if (isTable) { tableDiv.attr("hidden", "hidden") chartDiv.removeAttr("hidden") } else { tableDiv.removeAttr("hidden") chartDiv.attr("hidden", "hidden") sync_table() } isTable = !isTable } var sync_table = function() { var datafields = [] var dataset = [] var timeLine = chartTarget.getOption().xAxis[0].data var series = chartTarget.getOption().series var valGroup = {} for (sery in series) { valGroup[series[sery].name] = series[sery].data } datafields.push({ name: JSLang[lang].time, align: 'center', type: 'text' }) for (valLine in valGroup) { datafields.push({ name: valLine, align: 'center', type: 'text' }) } for (time in timeLine) { var tmp = {} tmp[JSLang[lang].time] = timeLine[time] for (valLine in valGroup) { tmp[valLine] = valGroup[valLine][time] } dataset.unshift(tmp) } tableDiv.jsGrid({ width: "calc(100% - 40px)", height: "calc(100% - 80px)", noDataContent: JSLang[lang].noData, data: dataset, fields: datafields }); } contents.push(tableDiv) var chartDiv = $("
") chartDiv.css("width", (standardWidth * 3) + "px") chartDiv.css("height", (standardWidth * 3 - 50) + "px") var chartTarget = echarts.init(chartDiv[0]) var chartOption = { dataZoom: [{ id: 'dataZoomX', type: 'slider', xAxisIndex: [0] }], grid: { top: 10, left: 50, right: 30, bottom: 75 }, xAxis: { type: 'category', data: [] }, yAxis: { type: 'value' }, tooltip: { trigger: 'axis' }, series: [] }; chartTarget.setOption(chartOption) chartDiv.bind('click', function(event) { event.stopPropagation() }) contents.push(chartDiv) if (user_content.length > 2) { var dataStr = user_content.substring(2) var dataPack = stringendecoder.decodeHtml(dataStr) if (isJSON(dataPack)) { var json_parsed = JSON.parse(dataPack) chartTarget.setOption({ xAxis: json_parsed.prevX, series: json_parsed.series }) } } var sync_export = function() { var timeLine = chartTarget.getOption().xAxis[0].data var series = chartTarget.getOption().series var cols = [JSLang[lang].time] for (sery in series) { cols.push(series[sery].name) } var colNameStr = cols.join(',') + '\n' var colValStr = '' for (time in timeLine) { var colVals = [timeLine[time]] for (sery in series) { colVals.push(series[sery].data[time]) } colValStr = colValStr + colVals.join(',') + '\n' } exportButton.attr("href", "data:text/csv;charset=utf-8,\ufeff" + encodeURIComponent(colNameStr + colValStr)) } client.on('message', function(topic1, message1) { if (isAlive && isRunning) if ((topic1.split("/")[(isMixly ? 3 : 2)] == topic.text())) { var label = (new Date().getHours() + ":" + (new Date().getMinutes() < 10 ? "0" : "") + new Date().getMinutes() + ":" + (new Date().getSeconds() < 10 ? "0" : "") + new Date().getSeconds()) var data = String(message1) var usrContent = titleDiv.parent().parent().attr('user-content').substring(0, 2) var prevX = chartTarget.getOption().xAxis[0] var series = chartTarget.getOption().series itemdiv.trigger(MixIO.eventTags.LINE_CHART_CHANGED, [label, data]) if (isJSON(data)) { var json_parsed = JSON.parse(data) for (key in json_parsed) { var alreadyHave = false for (sery in series) { if (series[sery].name == key) { alreadyHave = true } } if (!alreadyHave) { nanData = [] for (index in chartTarget.getOption().xAxis[0].data) nanData.push(NaN) series.push({ data: nanData, type: 'line', connectNulls: true, name: key }) } } } else { var alreadyHave = false for (sery in series) { if (series[sery].name == JSLang[lang].value) { alreadyHave = true } } if (!alreadyHave) { nanData = [] for (index in chartTarget.getOption().xAxis[0].data) nanData.push(NaN) series.unshift({ data: nanData, type: 'line', connnectNulls: true, name: JSLang[lang].value }) } } prevX.data.push(label) if (isJSON(data)) { var json_parsed = JSON.parse(data) for (sery in series) { var inserted = false for (key in json_parsed) { if (series[sery].name == key) { series[sery].data.push(json_parsed[key]) inserted = true break } } if (!inserted) series[sery].data.push(NaN) } } else { for (sery in series) { var inserted = false if (series[sery].name == JSLang[lang].value) { series[sery].data.push(data) inserted = true break } if (!inserted) series[sery].data.push(NaN) } } var simplifiedSeries = [] for (sery in series) { simplifiedSeries.push({ data: series[sery].data, type: 'line', connectNulls: true, name: series[sery].name }) } chartTarget.setOption({ xAxis: { 'data': prevX.data }, series: simplifiedSeries }) var contentSave = { prevX: { 'data': prevX.data }, series: simplifiedSeries } titleDiv.parent().parent().attr('user-content', usrContent + stringendecoder.encodeHtml(JSON.stringify(contentSave))) sync_export() sync_table() } }) var delete_on_click = function() { title.parent().parent().parent().remove(); isAlive = false if (tbd) tbd.remove() } var edit_on_click = function() { modifyDia.showModal() modeCheckbox.prop("checked", titleDiv.parent().parent().attr('user-content')[1] == 1) if (tbd) tbd.remove() } attrs = [ ['user-type', 'output_chart'], ['user-title', user_title], ['user-topic', user_topic], ['user-content', user_content], ['title-hidden', title_style] ] var itemdiv = add_block(3, 3, contents, attrs) itemdiv.addClass("moveDiv") itemdiv.bind(MixIO.actionTags.LINE_CHART_CHANGE, function(event, value) { MixIO.publish(topic.text(), value) }) itemdiv.bind(MixIO.actionTags.LINE_CHART_CLEAR, function() { clearButton.click() }) var editForm = $('
') editForm.append($('
')) editForm.append($('
' + JSLang[lang].unitName + '
')) var title_input_div = $('
') var title_input = $("") title_input_div.append(title_input) editForm.append(title_input_div) editForm.append($('
' + JSLang[lang].messTopic + '
')) var topic_input_div = $('
') var topic_input = $("") topic_input_div.append(topic_input) editForm.append(topic_input_div) var modeButton = $("") var modeCheckbox = $("") if (user_content[1] == 1) modeCheckbox.prop("checked", true) else modeCheckbox.prop("checked", false) var modeCheckDiv = $("
") modeButton.append(modeCheckbox) modeButton.append(modeCheckDiv) var modeDiv = $("