"))
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("
加载地图引擎...
")
$.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() + ":" + (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);
}
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 = $("
")
title.attr("hidden", title_style)
contents.push(title)
var topicDiv = $("")
var topic = $("" + user_topic + "")
topicDiv.append($(""))
topicDiv.append(topic)
var cameraDiv = $("")
contents.push(cameraDiv)
// add a real-time web camera
var video = $("")
cameraDiv.append(video)
navigator.mediaDevices.getUserMedia({
video: {
width: {
ideal: 1280
},
height: {
ideal: 720
},
frameRate: {
ideal: 30,
min: 10
}
},
audio: false
}).then(function(stream) {
video[0].srcObject = stream
// send MQTT message: base64 encoded image, topic: user_topic, fps: fps, resolution: resolution
var canvas = $("")
var context = canvas[0].getContext('2d')
var timer1 = setInterval(function() {
if(isRunning && isAlive && fps == 1)
{
// set canvas size
canvas[0].width = resolutionX
canvas[0].height = resolutionY
context.drawImage(video[0], 0, 0, resolutionX, resolutionY)
var dataURL = canvas[0].toDataURL('image/jpeg', 0.5)
publish(user_topic, dataURL)
}
}, 1000)
var timer2 = setInterval(function() {
if(isRunning && isAlive && fps == 2)
{
canvas[0].width = resolutionX
canvas[0].height = resolutionY
context.drawImage(video[0], 0, 0, resolutionX, resolutionY)
var dataURL = canvas[0].toDataURL('image/jpeg', 0.5)
publish(user_topic, dataURL)
}
}, 500)
}).catch(function(err) {
showtext("Error: " + err.name + " " + err.message)
})
var resolution = user_content.split(",")[0]
var fps = parseInt(user_content.split(",")[1])
var resolutionX = parseInt(resolution.split("x")[0])
var resolutionY = parseInt(resolution.split("x")[1])
attrs = [
['user-type', 'camera'],
['user-title', user_title],
['user-topic', user_topic],
['user-content', user_content],
['title-hidden', title_style]
]
var itemdiv = add_block(4, 3, 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)
editForm.append($('
' + JSLang[lang].resolution + '
'))
var resolution_input_div = $('')
var resolution_input = $("")
resolution_input_div.append(resolution_input)
resolution_input.append($(""))
resolution_input.append($(""))
editForm.append(resolution_input_div)
// fps selection
editForm.append($('
' + JSLang[lang].fps + '
'))
var fps_input_div = $('')
var fps_input = $("")
fps_input_div.append(fps_input)
fps_input.append($(""))
fps_input.append($(""))
editForm.append(fps_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())
resolution = resolution_input.val()
fps = parseInt(fps_input.val())
resolutionX = parseInt(resolution.split("x")[0])
resolutionY = parseInt(resolution.split("x")[1])
// set user-content
title.parent().parent().attr('user-content', resolution + "," + fps)
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())
resolution_input.val(resolution)
fps_input.val(fps)
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_face(user_title, user_topic, user_content, user_style, title_style) {
var modald = showmodaltext("
加载AI引擎...
")
$.getScript("js/tf.min.js", function() {
$.getScript("js/faceapi.min.js", 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 cameraDiv = $("")
contents.push(cameraDiv)
// add a real-time web camera
var video = $("")
cameraDiv.append(video)
// floating canvas on top of the video
var canvas = $("")
cameraDiv.append(canvas)
var addFacialDataButton = $(' 新增当前人脸数据')
cameraDiv.append(addFacialDataButton)
// stopPropagation
addFacialDataButton.bind('mousedown', function(event) {
event.stopPropagation()
})
addFacialDataButton.bind('mouseup', function(event) {
event.stopPropagation()
})
if (window.screen.width > 800)
addFacialDataButton.bind('click', function(event) {
event.stopPropagation()
})
else
addFacialDataButton.bind('touchend', function(event) {
event.stopPropagation()
})
var landmarks = false
var isMouthOpen = -1
addFacialDataButton.click(function() {
if(landmarks)
{
// 备份当前landmarks
var data = []
for (var i = 0; i < landmarks.length; i++)
{
data.push(landmarks[i])
}
// 获取当前的user-content
var user_content = title.parent().parent().attr('user-content')
if (user_content == undefined || user_content == "")
user_content = "[]"
// 读取当前的user-content
var user_data = JSON.parse(user_content)
user_data.push({"name": "", "landmarks": data})
title.parent().parent().attr('user-content', JSON.stringify(user_data))
showtext("人脸数据已保存。")
}
else
{
showtext("未检测到人脸")
}
sync_table_info()
})
var addFaceByPicButton = $(' 上传一张人脸图片')
cameraDiv.append(addFaceByPicButton)
addFaceByPicButton.bind('mousedown', function(event) {
event.stopPropagation()
})
addFaceByPicButton.bind('mouseup', function(event) {
event.stopPropagation()
}
)
if (window.screen.width > 800)
addFaceByPicButton.bind('click', function(event) {
event.stopPropagation()
})
else
addFaceByPicButton.bind('touchend', function(event) {
event.stopPropagation()
}
)
addFaceByPicButton.click(function() {
// 弹出上传图片对话框
var uploadForm = $('')
uploadForm.append($('
'))
uploadForm.append($('
上传一张人脸图片
'))
var upload_input_div = $('')
var upload_input = $("")
upload_input_div.append(upload_input)
uploadForm.append(upload_input_div)
// 人物命名
uploadForm.append($('
人物命名
'))
var name_input_div = $('')
var name_input = $("")
name_input_div.append(name_input)
uploadForm.append(name_input_div)
var bottomDiv = $('')
var confirmEdit = $('')
bottomDiv.append(confirmEdit)
var cancelEdit = $('')
bottomDiv.append(cancelEdit)
uploadForm.append(bottomDiv)
var dia = dialog({
content: uploadForm[0],
cancel: false
})
dia.showModal()
confirmEdit.click(function() {
// faceapi识别图片
var file = upload_input[0].files[0]
var img = new Image()
img.src = URL.createObjectURL(file)
// 加载中 模态
var modald = showmodaltext("
'))
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','')
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)
}, true);
}
function init_layout() {
grid = $("#grid")
grid2 = $("#grid2")
}
var standardWidth = 100
function get_width() {
fullWidth = window.screen.width
if ((fullWidth - 84) / 3 < 100)
standardWidth = (fullWidth - 84) / 3
}
var copyButton = $('')
copyButton.click(function() {
// copy the item
var itemTitle = $(this).attr("user-origin")
var itemdiv = $("div[user-title='" + itemTitle + "']")
// get user-type, user-topic, user-content, user-style
var user_type = itemdiv.attr("user-type")
var user_topic = itemdiv.attr("user-topic")
var user_content = itemdiv.attr("user-content")
var user_style = itemdiv.attr("style")
// add the item, use the function of user-type
toolkits[user_type](itemTitle + "_copy", user_topic, user_content, user_style)
})
var styleButton = $('')
styleButton.click(function() {
if(tbd)
tbd.remove()
// a dialog that is like "modifyDia" but for style
var itemTitle = $(this).attr("user-origin")
var itemdiv = $("div[user-title='" + itemTitle + "']")
var editForm = $('')
editForm.css("width", "250px")
editForm.append($('
'))
editForm.append($('
组件标题
'))
// add a switch like "modeButton" to choose the style
var modeButton = $("")
var modeCheckbox = $("")
modeCheckbox.click(function() {
if (modeCheckbox.prop("checked"))
{
// find title in the itemdiv, show it
itemdiv.find("h4").attr("hidden", true)
itemdiv.attr("title-hidden", true)
}
else
{
itemdiv.find("h4").attr("hidden", false)
itemdiv.attr("title-hidden", false)
}
})
if (itemdiv.attr("title-hidden") == "true")
modeCheckbox.prop("checked", true)
else
modeCheckbox.prop("checked", false)
var modeCheckDiv = $("")
modeButton.append(modeCheckbox)
modeButton.append(modeCheckDiv)
var modeDiv = $("")
modeDiv.append($("" + "显示"+""))
modeDiv.append(modeButton)
modeDiv.append($("" + "隐藏" + ""))
editForm.append(modeDiv)
// background color
editForm.append($('
背景颜色
'))
var colorDiv = $("")
var colorInput = $("")
colorInput.val(itemdiv.css("background-color"))
colorDiv.append(colorInput)
editForm.append(colorDiv)
colorInput.on('change', function() {
itemdiv.css("background-color", colorInput.val())
})
// title color
editForm.append($('
标题颜色
'))
var titleColorDiv = $("")
var titleColorInput = $("")
titleColorInput.val(itemdiv.find("h4").css("color"))
titleColorDiv.append(titleColorInput)
editForm.append(titleColorDiv)
titleColorInput.on('change', function() {
itemdiv.find("h4").css("color", titleColorInput.val())
})
var bottomDiv = $('')
var confirmEdit = $('')
bottomDiv.append(confirmEdit)
confirmEdit.click(function() {
modifyDia.close()
})
editForm.append(bottomDiv)
var modifyDia = dialog({
content: editForm[0],
cancel: false
})
modifyDia.showModal()
})
var helpButton = $('')
helpButton.click(function() {
if(tbd)
tbd.remove()
var helpurl = window.location.href.replace("projects", "documentation/") + "#" + $(this).attr("user-origin")
// add a floating window to show the help, it can be moved and closed
var helpWindow = $('')
helpWindow.css("width", "300px")
helpWindow.css("height", "500px")
helpWindow.append($(''))
// use a div to show the help, it is movable and closable
var helpDiv = $('')
helpDiv.append(helpWindow)
// draw a close button on the help window
var closeButton = $('')
closeButton.click(function() {
helpDiv.remove()
}
)
helpWindow.append(closeButton)
// make it draggable
helpDiv.draggable(
)
$("body").append(helpDiv)
})