LSP: warning when sublist is not saved; added streamname_with_wildcard_and_variables validate
This commit is contained in:
parent
503ffbc248
commit
3a025c8a03
3 changed files with 129 additions and 46 deletions
File diff suppressed because one or more lines are too long
|
@ -25,18 +25,19 @@ Triggers:{LTSonly:!1},Logs:{},Statistics:{},"Server Stats":{}},{Disconnect:{clas
|
|||
i)for(f in h=$("<span>").addClass("hiddenmenu"),m.append(h),i.hiddenmenu)h.append(a(f,i.hiddenmenu[f]))}}d=$("<div>").attr("id","ih_button").text("?").click(function(){$("body").toggleClass("helpme");UI.stored.saveOpt("helpme",$("body").hasClass("helpme"))}).attr("title","Click to toggle the display of integrated help");UI.stored.getOpts().helpme&&$("body").addClass("helpme");c.after(d).after($("<div>").addClass("separator"))},findInput:function(a){return this.findInOutput("inputs",a)},findOutput:function(a){return this.findInOutput("connectors",
|
||||
a)},findInOutput:function(a,c){if("capabilities"in mist.data){var d=!1,b=mist.data.capabilities[a];c in b&&(d=b[c]);c+".exe"in b&&(d=b[c+".exe"]);return d}throw"Request capabilities first";},buildUI:function(a){var c=$("<div>").addClass("input_container"),d;for(d in a){var b=a[d];if(b instanceof jQuery)c.append(b);else if("help"==b.type){var i=$("<span>").addClass("text_container").append($("<span>").addClass("description").append(b.help));c.append(i);if("classes"in b)for(var m in b.classes)i.addClass(b.classes[m])}else if("text"==
|
||||
b.type)c.append($("<span>").addClass("text_container").append($("<span>").addClass("text").append(b.text)));else if("custom"==b.type)c.append(b.custom);else if("buttons"==b.type)for(m in i=$("<span>").addClass("button_container").on("keydown",function(a){a.stopPropagation()}),"css"in b&&i.css(b.css),c.append(i),b.buttons){var h=b.buttons[m],f=$("<button>").text(h.label).data("opts",h);"css"in h&&f.css(h.css);if("classes"in h)for(var r in h.classes)f.addClass(h.classes[r]);i.append(f);switch(h.type){case "cancel":f.addClass("cancel").click(h["function"]);
|
||||
break;case "save":f.addClass("save").click(function(){var a=$(this).closest(".input_container"),b=!1;a.find('.hasValidate:visible, input[type="hidden"].hasValidate').each(function(){if(b=$(this).data("validate")(this,!0))return!1});b||(a.find('.isSetting:visible, input[type="hidden"].isSetting').each(function(){var a=$(this).getval(),b=$(this).data("pointer");if(""==a)if("default"in $(this).data("opts"))a=$(this).data("opts")["default"];else return b.main[b.index]=null,!0;b.main[b.index]=a}),(a=$(this).data("opts")["function"])&&
|
||||
a(this))});break;default:f.click(h["function"])}}else{var j=$("<label>").addClass("UIelement");c.append(j);"css"in b&&j.css(b.css);j.append($("<span>").addClass("label").html("label"in b?b.label+":":""));i=$("<span>").addClass("field_container");j.append(i);var l;switch(b.type){case "password":l=$("<input>").attr("type","password");break;case "int":l=$("<input>").attr("type","number");"min"in b&&l.attr("min",b.min);"max"in b&&l.attr("max",b.max);"validate"in b?b.validate.push("int"):b.validate=["int"];
|
||||
break;case "span":l=$("<span>");break;case "debug":b.select=[["","Default"],[0,"0 - All debugging messages disabled"],[1,"1 - Messages about failed operations"],[2,"2 - Previous level, and error messages"],[3,"3 - Previous level, and warning messages"],[4,"4 - Previous level, and status messages for development"],[5,"5 - Previous level, and more status messages for development"],[6,"6 - Previous level, and verbose debugging messages"],[7,"7 - Previous level, and very verbose debugging messages"],
|
||||
[8,"8 - Report everything in extreme detail"],[9,"9 - Report everything in insane detail"],[10,"10 - All messages enabled"]];case "select":l=$("<select>");for(m in b.select)f=$("<option>"),"string"==typeof b.select[m]?f.text(b.select[m]):f.val(b.select[m][0]).text(b.select[m][1]),l.append(f);break;case "textarea":l=$("<textarea>").on("keydown",function(a){a.stopPropagation()});break;case "checkbox":l=$("<input>").attr("type","checkbox");break;case "hidden":l=$("<input>").attr("type","hidden");j.hide();
|
||||
break;case "email":l=$("<input>").attr("type","email").attr("autocomplete","on").attr("required","");break;case "browse":l=$("<input>").attr("type","text");"filetypes"in b&&l.data("filetypes",b.filetypes);break;case "geolimited":case "hostlimited":l=$("<input>").attr("type","hidden");break;case "radioselect":l=$("<div>").addClass("radioselect");for(d in b.radioselect)if(h=$("<input>").attr("type","radio").val(b.radioselect[d][0]).attr("name",b.label),("LTSonly"in b&&!mist.data.LTS||b.readonly)&&h.prop("disabled",
|
||||
!0),f=$("<label>").append(h).append($("<span>").html(b.radioselect[d][1])),l.append(f),2<b.radioselect[d].length)for(m in h=$("<select>").change(function(){$(this).parent().find("input[type=radio]:enabled").prop("checked","true")}),f.append(h),("LTSonly"in b&&!mist.data.LTS||b.readonly)&&h.prop("disabled",!0),b.radioselect[d][2])f=$("<option>"),h.append(f),b.radioselect[d][2][m]instanceof Array?f.val(b.radioselect[d][2][m][0]).html(b.radioselect[d][2][m][1]):f.html(b.radioselect[d][2][m]);break;case "checklist":l=
|
||||
$("<div>").addClass("checkcontainer");$controls=$("<div>").addClass("controls");$checklist=$("<div>").addClass("checklist");l.append($checklist);for(d in b.checklist)"string"==typeof b.checklist[d]&&(b.checklist[d]=[b.checklist[d],b.checklist[d]]),$checklist.append($("<label>").text(b.checklist[d][1]).prepend($("<input>").attr("type","checkbox").attr("name",b.checklist[d][0])));break;case "DOMfield":l=b.DOMfield;break;case "unix":l=$("<input>").attr("type","datetime-local").attr("step",1);b.unit=
|
||||
$("<button>").text("Now").click(function(){$(this).closest(".field_container").find(".field").setval((new Date).getTime()/1E3)});break;case "selectinput":l=$("<div>").addClass("selectinput");h=$("<select>");l.append(h);h.data("input",!1);"LTSonly"in b&&!mist.data.LTS&&h.prop("disabled",!0);for(d in b.selectinput)f=$("<option>"),h.append(f),"string"==typeof b.selectinput[d]?f.text(b.selectinput[d]):(f.text(b.selectinput[d][1]),"string"==typeof b.selectinput[d][0]?f.val(b.selectinput[d][0]):(f.val("CUSTOM"),
|
||||
h.data("input")||h.data("input",UI.buildUI([b.selectinput[d][0]]).children())));h.data("input")&&l.append(h.data("input"));h.change(function(){"CUSTOM"==$(this).val()?$(this).data("input").css("display","flex"):$(this).data("input").hide()});h.trigger("change");break;case "inputlist":l=$("<div>").addClass("inputlist");l.data("newitem",function(){var a=$("<input>").attr("type","text").addClass("listitem");("LTSonly"in b&&!mist.data.LTS||b.readonly)&&a.prop("disabled",!0);var c=function(b){$(this).is(":last-child")?
|
||||
""!=$(this).val()?$(this).after(a.clone().keyup(c).val("")):8==b.which&&$(this).prev().focus():""==$(this).val()&&($(this).next().focus(),$(this).remove())};a.keyup(c);return a});l.append(l.data("newitem"));break;case "sublist":l=$("<div>").addClass("sublist");h=$("<div>").addClass("curvals");h.append($("<span>").text("None."));var u=$("<div>").addClass("itemsettings"),g=$("<button>").text("New "+b.itemLabel),e=b.sublist;l.data("build",function(a,c){for(var d in b.saveas)d in a||delete b.saveas[d];
|
||||
b.saveas=Object.assign(b.saveas,a);d="New";"undefined"!=typeof c&&(d="Edit");d=UI.buildUI([$("<h4>").text(d+" "+b.itemLabel)].concat(e).concat([{type:"buttons",buttons:[{label:"Cancel",type:"cancel","function":function(){u.html("");g.show();j.show()}},{label:"Save "+b.itemLabel,type:"save","function":function(){var a=l.getval(),d=Object.assign({},b.saveas),e;for(e in d)null===d[e]&&delete d[e];"undefined"==typeof c?a.push(d):a[c]=d;l.setval(a);u.html("");g.show();j.show()}}]}]));u.html(d);g.hide();
|
||||
j.hide()});g.click(function(){l.data("build")({})});e.unshift({type:"str",label:"Human readable name",placeholder:"none",help:"A convenient name to describe this "+b.itemLabel+". It won't be used by MistServer.",pointer:{main:b.saveas,index:"x-LSP-name"}});l.data("savelist",[]);l.append(h).append(g);c.append(u);break;default:l=$("<input>").attr("type","text")}l.addClass("field").data("opts",b);"pointer"in b&&l.attr("name",b.pointer.index);i.append(l);if("classes"in b)for(m in b.classes)l.addClass(b.classes[m]);
|
||||
break;case "save":f.addClass("save").click(function(){var a=$(this).data("opts").preSave;a&&a.call(this);var b=$(this).closest(".input_container"),c=!1;b.find('.hasValidate:visible, input[type="hidden"].hasValidate').each(function(){if(c=$(this).data("validate")(this,!0))return!1});(a=$(this).data("opts").failedValidate)&&a.call(this);c||(b.find('.isSetting:visible, input[type="hidden"].isSetting').each(function(){var a=$(this).getval(),b=$(this).data("pointer");if(""==a)if("default"in $(this).data("opts"))a=
|
||||
$(this).data("opts")["default"];else return b.main[b.index]=null,!0;b.main[b.index]=a}),(a=$(this).data("opts")["function"])&&a(this))});break;default:f.click(h["function"])}}else{var j=$("<label>").addClass("UIelement");c.append(j);"css"in b&&j.css(b.css);j.append($("<span>").addClass("label").html("label"in b?b.label+":":""));if("classes"in b)for(r in b.classes)j.addClass(b.classes[r]);i=$("<span>").addClass("field_container");j.append(i);var l;switch(b.type){case "password":l=$("<input>").attr("type",
|
||||
"password");break;case "int":l=$("<input>").attr("type","number");"min"in b&&l.attr("min",b.min);"max"in b&&l.attr("max",b.max);"validate"in b?b.validate.push("int"):b.validate=["int"];break;case "span":l=$("<span>");break;case "debug":b.select=[["","Default"],[0,"0 - All debugging messages disabled"],[1,"1 - Messages about failed operations"],[2,"2 - Previous level, and error messages"],[3,"3 - Previous level, and warning messages"],[4,"4 - Previous level, and status messages for development"],[5,
|
||||
"5 - Previous level, and more status messages for development"],[6,"6 - Previous level, and verbose debugging messages"],[7,"7 - Previous level, and very verbose debugging messages"],[8,"8 - Report everything in extreme detail"],[9,"9 - Report everything in insane detail"],[10,"10 - All messages enabled"]];case "select":l=$("<select>");for(m in b.select)f=$("<option>"),"string"==typeof b.select[m]?f.text(b.select[m]):f.val(b.select[m][0]).text(b.select[m][1]),l.append(f);break;case "textarea":l=$("<textarea>").on("keydown",
|
||||
function(a){a.stopPropagation()});break;case "checkbox":l=$("<input>").attr("type","checkbox");break;case "hidden":l=$("<input>").attr("type","hidden");j.hide();break;case "email":l=$("<input>").attr("type","email").attr("autocomplete","on").attr("required","");break;case "browse":l=$("<input>").attr("type","text");"filetypes"in b&&l.data("filetypes",b.filetypes);break;case "geolimited":case "hostlimited":l=$("<input>").attr("type","hidden");break;case "radioselect":l=$("<div>").addClass("radioselect");
|
||||
for(d in b.radioselect)if(h=$("<input>").attr("type","radio").val(b.radioselect[d][0]).attr("name",b.label),("LTSonly"in b&&!mist.data.LTS||b.readonly)&&h.prop("disabled",!0),f=$("<label>").append(h).append($("<span>").html(b.radioselect[d][1])),l.append(f),2<b.radioselect[d].length)for(m in h=$("<select>").change(function(){$(this).parent().find("input[type=radio]:enabled").prop("checked","true")}),f.append(h),("LTSonly"in b&&!mist.data.LTS||b.readonly)&&h.prop("disabled",!0),b.radioselect[d][2])f=
|
||||
$("<option>"),h.append(f),b.radioselect[d][2][m]instanceof Array?f.val(b.radioselect[d][2][m][0]).html(b.radioselect[d][2][m][1]):f.html(b.radioselect[d][2][m]);break;case "checklist":l=$("<div>").addClass("checkcontainer");$controls=$("<div>").addClass("controls");$checklist=$("<div>").addClass("checklist");l.append($checklist);for(d in b.checklist)"string"==typeof b.checklist[d]&&(b.checklist[d]=[b.checklist[d],b.checklist[d]]),$checklist.append($("<label>").text(b.checklist[d][1]).prepend($("<input>").attr("type",
|
||||
"checkbox").attr("name",b.checklist[d][0])));break;case "DOMfield":l=b.DOMfield;break;case "unix":l=$("<input>").attr("type","datetime-local").attr("step",1);b.unit=$("<button>").text("Now").click(function(){$(this).closest(".field_container").find(".field").setval((new Date).getTime()/1E3)});break;case "selectinput":l=$("<div>").addClass("selectinput");h=$("<select>");l.append(h);h.data("input",!1);"LTSonly"in b&&!mist.data.LTS&&h.prop("disabled",!0);for(d in b.selectinput)f=$("<option>"),h.append(f),
|
||||
"string"==typeof b.selectinput[d]?f.text(b.selectinput[d]):(f.text(b.selectinput[d][1]),"string"==typeof b.selectinput[d][0]?f.val(b.selectinput[d][0]):(f.val("CUSTOM"),h.data("input")||h.data("input",UI.buildUI([b.selectinput[d][0]]).children())));h.data("input")&&l.append(h.data("input"));h.change(function(){"CUSTOM"==$(this).val()?$(this).data("input").css("display","flex"):$(this).data("input").hide()});h.trigger("change");break;case "inputlist":l=$("<div>").addClass("inputlist");l.data("newitem",
|
||||
function(){var a=$("<input>").attr("type","text").addClass("listitem");("LTSonly"in b&&!mist.data.LTS||b.readonly)&&a.prop("disabled",!0);var c=function(b){$(this).is(":last-child")?""!=$(this).val()?$(this).after(a.clone().keyup(c).val("")):8==b.which&&$(this).prev().focus():""==$(this).val()&&($(this).next().focus(),$(this).remove())};a.keyup(c);return a});l.append(l.data("newitem"));break;case "sublist":l=$("<div>").addClass("sublist");h=$("<div>").addClass("curvals");h.append($("<span>").text("None."));
|
||||
var u=$("<div>").addClass("itemsettings"),g=$("<button>").text("New "+b.itemLabel),e=b.sublist;l.data("build",function(a,c){for(var d in b.saveas)d in a||delete b.saveas[d];b.saveas=Object.assign(b.saveas,a);d="New";"undefined"!=typeof c&&(d="Edit");d=UI.buildUI([$("<h4>").text(d+" "+b.itemLabel)].concat(e).concat([{label:"Save first",type:"str",classes:["onlyshowhelp"],validate:[function(){return{msg:"Did you want to save this "+b.itemLabel+"?",classes:["red"]}}]},{type:"buttons",buttons:[{label:"Cancel",
|
||||
type:"cancel","function":function(){u.html("");g.show();j.show()}},{label:"Save "+b.itemLabel,type:"save",preSave:function(){$(this).closest(".input_container").find(".onlyshowhelp").closest("label").hide()},failedValidate:function(){$(this).closest(".input_container").find(".onlyshowhelp").closest("label").show()},"function":function(){var a=l.getval(),d=Object.assign({},b.saveas),e;for(e in d)null===d[e]&&delete d[e];"undefined"==typeof c?a.push(d):a[c]=d;l.setval(a);u.html("");g.show();j.show()}}]}]));
|
||||
u.html(d);g.hide();j.hide()});g.click(function(){l.data("build")({})});e.unshift({type:"str",label:"Human readable name",placeholder:"none",help:"A convenient name to describe this "+b.itemLabel+". It won't be used by MistServer.",pointer:{main:b.saveas,index:"x-LSP-name"}});l.data("savelist",[]);l.append(h).append(g);c.append(u);break;default:l=$("<input>").attr("type","text")}l.addClass("field").data("opts",b);"pointer"in b&&l.attr("name",b.pointer.index);i.append(l);if("classes"in b)for(m in b.classes)l.addClass(b.classes[m]);
|
||||
"placeholder"in b&&l.attr("placeholder",b.placeholder);"default"in b&&l.attr("placeholder",b["default"]);"unit"in b&&i.append($("<span>").addClass("unit").html(b.unit));"readonly"in b&&(l.attr("readonly","readonly"),l.click(function(){$(this).select()}));"qrcode"in b&&i.append($("<span>").addClass("unit").html($("<button>").text("QR").on("keydown",function(a){a.stopPropagation()}).click(function(){var a=String($(this).closest(".field_container").find(".field").getval()),b=$("<div>").addClass("qrcode");
|
||||
UI.popup.show($("<span>").addClass("qr_container").append($("<p>").text(a)).append(b));b.qrcode({text:a,size:Math.min(b.width(),b.height())})})));"clipboard"in b&&document.queryCommandSupported("copy")&&i.append($("<span>").addClass("unit").html($("<button>").text("Copy").on("keydown",function(a){a.stopPropagation()}).click(function(){var a=String($(this).closest(".field_container").find(".field").getval()),b=document.createElement("textarea");b.value=a;document.body.appendChild(b);b.select();var c=
|
||||
false;try{c=document.execCommand("copy")}catch(d){}if(c){$(this).text("Copied to clipboard!");document.body.removeChild(b);var e=$(this);setTimeout(function(){e.text("Copy")},5E3)}else{document.body.removeChild(b);alert("Failed to copy:\n"+a)}})));"rows"in b&&l.attr("rows",b.rows);"LTSonly"in b&&!mist.data.LTS&&(i.addClass("LTSonly"),l.prop("disabled",!0));if("dependent"in b)for(d in b.dependent)j.attr("data-dependent-"+d,b.dependent[d]);switch(b.type){case "browse":h=$("<div>").addClass("grouper").append(j);
|
||||
|
@ -50,32 +51,33 @@ l.getval()||null==l.getval())&&"value"in b&&l.setval(b.value);if("datalist"in b)
|
|||
if("validate"in b){h=[];for(m in b.validate){f=b.validate[m];if("function"!=typeof f)switch(f){case "required":f=function(a){return a==""||a==null?{msg:"This is a required field.",classes:["red"]}:false};break;case "int":f=function(a,b){var c=$(b).data("opts");if(!$(b)[0].validity.valid){var d=[];"min"in c&&d.push(" greater than or equal to "+c.min);"max"in c&&d.push(" smaller than or equal to "+c.max);return{msg:"Please enter an integer"+d.join(" and")+".",classes:["red"]}}if(parseInt(Number(a))!=
|
||||
a)return{msg:"Please enter an integer.",classes:["red"]}};break;case "streamname":f=function(a,b){if(a!=""){if(!isNaN(a.charAt(0)))return{msg:"The first character may not be a number.",classes:["red"]};if(a.toLowerCase()!=a)return{msg:"Uppercase letters are not allowed.",classes:["red"]};if(a.replace(/[^\da-z_]/g,"")!=a)return{msg:"Special characters (except for underscores) are not allowed.",classes:["red"]};if("streams"in mist.data&&a in mist.data.streams&&$(b).data("pointer").main.name!=a)return{msg:"This streamname already exists.<br>If you want to edit an existing stream, please click edit on the the streams tab.",
|
||||
classes:["red"]}}};break;case "streamname_with_wildcard":f=function(a){if(a!=""){streampart=a.split("+");var b=streampart.slice(1).join("+");streampart=streampart[0];if(!isNaN(streampart.charAt(0)))return{msg:"The first character may not be a number.",classes:["red"]};if(streampart.toLowerCase()!=streampart)return{msg:"Uppercase letters are not allowed in a stream name.",classes:["red"]};if(streampart.replace(/[^\da-z_]/g,"")!=streampart)return{msg:"Special characters (except for underscores) are not allowed in a stream name.",
|
||||
classes:["red"]};if(streampart!=a&&b.replace(/[\00|\0|\/]/g,"")!=b)return{msg:"Slashes or null bytes are not allowed in wildcards.",classes:["red"]}}};break;default:f=function(){}}h.push(f)}l.data("validate_functions",h).data("help_container",i).data("validate",function(a,b){if($(a).is(":visible")){var c=$(a).getval(),d=$(a).data("validate_functions"),g=$(a).data("help_container");g.find(".err_balloon").remove();for(var e in d){var f=d[e](c,a);if(f){$err=$("<span>").addClass("err_balloon").html(f.msg);
|
||||
for(var h in f.classes)$err.addClass(f.classes[h]);g.prepend($err);b&&$(a).focus();return typeof f=="object"&&"break"in f?f["break"]:true}}return false}}).addClass("hasValidate").on("change keyup",function(){$(this).data("validate")($(this))});""!=l.getval()&&l.trigger("change")}"function"in b&&(l.on("change keyup",b["function"]),l.trigger("change"))}}c.on("keydown",function(a){var b=!1;switch(a.which){case 13:b=$(this).find("button.save").first();break;case 27:b=$(this).find("button.cancel").first()}b&&
|
||||
b.length&&(b.trigger("click"),a.stopPropagation())});return c},buildVheaderTable:function(a){var c=$("<table>").css("margin","0.2em"),d=$("<tr>").addClass("header").append($("<td>").addClass("vheader").attr("rowspan",a.labels.length+1).append($("<span>").text(a.vheader))),b=[];d.append($("<td>"));for(var i in a.labels)b.push($("<tr>").append($("<td>").html(""==a.labels[i]?" ":a.labels[i]+":")));for(var m in a.content)for(i in d.append($("<td>").html(a.content[m].header)),a.content[m].body)b[i].append($("<td>").html(a.content[m].body[i]));
|
||||
c.append($("<tbody>").append(d).append(b));return c},plot:{addGraph:function(a,c){var d={id:a.id,xaxis:a.xaxis,datasets:[],elements:{cont:$("<div>").addClass("graph"),plot:$("<div>").addClass("plot"),legend:$("<div>").addClass("legend").attr("draggable","true")}};UI.draggable(d.elements.legend);d.elements.cont.append(d.elements.plot).append(d.elements.legend);c.append(d.elements.cont);return d},go:function(a){if(!(1>Object.keys(a).length)){var c={totals:[],clients:[]},d;for(d in a)for(var b in a[d].datasets){var i=
|
||||
a[d].datasets[b];switch(i.datatype){case "clients":case "upbps":case "downbps":switch(i.origin[0]){case "total":c.totals.push({fields:[i.datatype],end:-15});break;case "stream":c.totals.push({fields:[i.datatype],streams:[i.origin[1]],end:-15});break;case "protocol":c.totals.push({fields:[i.datatype],protocols:[i.origin[1]],end:-15})}break;case "cpuload":case "memload":c.capabilities={}}}0==c.totals.length&&delete c.totals;0==c.clients.length&&delete c.clients;mist.send(function(){for(var b in a){var c=
|
||||
a[b];if(1>c.datasets.length){c.elements.plot.html("");c.elements.legend.html("");break}switch(c.xaxis){case "time":var d=[];c.yaxes={};var i=[],j;for(j in c.datasets){var l=c.datasets[j];l.display&&(l.getdata(),l.yaxistype in c.yaxes||(d.push(UI.plot.yaxes[l.yaxistype]),c.yaxes[l.yaxistype]=d.length),l.yaxis=c.yaxes[l.yaxistype],i.push(l))}d[0]&&(d[0].color=0);c.plot=$.plot(c.elements.plot,i,{legend:{show:!1},xaxis:UI.plot.xaxes[c.xaxis],yaxes:d,grid:{hoverable:!0,borderWidth:{top:0,right:0,bottom:1,
|
||||
left:1},color:"black",backgroundColor:{colors:["rgba(0,0,0,0)","rgba(0,0,0,0.025)"]}},crosshair:{mode:"x"}});d=$("<table>").addClass("legend-list").addClass("nolay").html($("<tr>").html($("<td>").html($("<h3>").text(c.id))).append($("<td>").css("padding-right","2em").css("text-align","right").html($("<span>").addClass("value")).append($("<button>").data("opts",c).text("X").addClass("close").click(function(){var b=$(this).data("opts");if(confirm("Are you sure you want to remove "+b.id+"?")){b.elements.cont.remove();
|
||||
var c=$(".graph_ids option:contains("+b.id+")"),d=c.parent();c.remove();UI.plot.del(b.id);delete a[b.id];d.trigger("change");UI.plot.go(a)}}))));c.elements.legend.html(d);var u=function(a){var b=c.elements.legend.find(".value"),d=1;if(typeof a=="undefined")b.eq(0).html("Latest:");else{var g=c.plot.getXAxes()[0],a=Math.min(g.max,a),a=Math.max(g.min,a);b.eq(0).html(UI.format.time(a/1E3))}for(var f in c.datasets){var i=" ";if(c.datasets[f].display){var g=UI.plot.yaxes[c.datasets[f].yaxistype].tickFormatter,
|
||||
j=c.datasets[f].data;if(a)for(var l in j){if(j[l][0]==a){i=g(j[l][1]);break}if(j[l][0]>a){if(l!=0){i=j[l];j=j[l-1];i=g(i[1]+(a-i[0])*(j[1]-i[1])/(j[0]-i[0]))}break}}else i=g(c.datasets[f].data[c.datasets[f].data.length-1][1])}b.eq(d).html(i);d++}};c.plot.getOptions();for(j in c.datasets)i=$("<input>").attr("type","checkbox").data("index",j).data("graph",c).click(function(){var a=$(this).data("graph");$(this).is(":checked")?a.datasets[$(this).data("index")].display=true:a.datasets[$(this).data("index")].display=
|
||||
false;var b={};b[a.id]=a;UI.plot.go(b)}),c.datasets[j].display&&i.attr("checked","checked"),d.append($("<tr>").html($("<td>").html($("<label>").html(i).append($("<div>").addClass("series-color").css("background-color",c.datasets[j].color)).append(c.datasets[j].label))).append($("<td>").css("padding-right","2em").css("text-align","right").html($("<span>").addClass("value")).append($("<button>").text("X").addClass("close").data("index",j).data("graph",c).click(function(){var b=$(this).data("index"),
|
||||
c=$(this).data("graph");if(confirm("Are you sure you want to remove "+c.datasets[b].label+" from "+c.id+"?")){c.datasets.splice(b,1);if(c.datasets.length==0){c.elements.cont.remove();var b=$(".graph_ids option:contains("+c.id+")"),d=b.parent();b.remove();d.trigger("change");UI.plot.del(c.id);delete a[c.id];UI.plot.go(a)}else{UI.plot.save(c);b={};b[c.id]=c;UI.plot.go(b)}}}))));u();var g=!1;c.elements.plot.on("plothover",function(a,b,c){if(b.x!=g){u(b.x);g=b.x}if(c){a=$("<span>").append($("<h3>").text(c.series.label).prepend($("<div>").addClass("series-color").css("background-color",
|
||||
c.series.color))).append($("<table>").addClass("nolay").html($("<tr>").html($("<td>").text("Time:")).append($("<td>").html(UI.format.dateTime(c.datapoint[0]/1E3,"long")))).append($("<tr>").html($("<td>").text("Value:")).append($("<td>").html(c.series.yaxis.tickFormatter(c.datapoint[1],c.series.yaxis)))));UI.tooltip.show(b,a.children())}else UI.tooltip.hide()}).on("mouseout",function(){u()})}}},c)}},save:function(a){var c={id:a.id,xaxis:a.xaxis,datasets:[]},d;for(d in a.datasets)c.datasets.push({origin:a.datasets[d].origin,
|
||||
datatype:a.datasets[d].datatype});a=mist.stored.get().graphs||{};a[c.id]=c;mist.stored.set("graphs",a)},del:function(a){var c=mist.stored.get().graphs||{};delete c[a];mist.stored.set("graphs",c)},datatype:{getOptions:function(a){var c=$.extend(!0,{},UI.plot.datatype.templates.general),d=$.extend(!0,{},UI.plot.datatype.templates[a.datatype]),a=$.extend(!0,d,a),a=$.extend(!0,c,a);switch(a.origin[0]){case "total":switch(a.datatype){case "cpuload":case "memload":break;default:a.label+=" (total)"}break;
|
||||
case "stream":case "protocol":a.label+=" ("+a.origin[1]+")"}var c=[],b;for(b in a.basecolor)d=a.basecolor[b],d+=50*(0.5-Math.random()),d=Math.round(d),d=Math.min(255,Math.max(0,d)),c.push(d);a.color="rgb("+c.join(",")+")";return a},templates:{general:{display:!0,datatype:"general",label:"",yaxistype:"amount",data:[],lines:{show:!0},points:{show:!1},getdata:function(){var a=mist.data.totals["stream"==this.origin[0]?this.origin[1]:"all_streams"]["protocol"==this.origin[0]?this.origin[1]:"all_protocols"][this.datatype];
|
||||
return this.data=a}},cpuload:{label:"CPU use",yaxistype:"percentage",basecolor:[237,194,64],cores:1,getdata:function(){var a=!1,c;for(c in this.data)this.data[c][0]<1E3*(mist.data.config.time-600)&&(a=c);!1!==a&&this.data.splice(0,Number(a)+1);this.data.push([1E3*mist.data.config.time,mist.data.capabilities.cpu_use/10]);return this.data}},memload:{label:"Memory load",yaxistype:"percentage",basecolor:[175,216,248],getdata:function(){var a=!1,c;for(c in this.data)this.data[c][0]<1E3*(mist.data.config.time-
|
||||
600)&&(a=c);!1!==a&&this.data.splice(0,Number(a)+1);this.data.push([1E3*mist.data.config.time,mist.data.capabilities.load.memory]);return this.data}},clients:{label:"Connections",basecolor:[203,75,75]},upbps:{label:"Bandwidth up",yaxistype:"bytespersec",basecolor:[77,167,77]},downbps:{label:"Bandwidth down",yaxistype:"bytespersec",basecolor:[148,64,237]}}},yaxes:{percentage:{name:"percentage",color:"black",tickColor:0,tickDecimals:0,tickFormatter:function(a){return UI.format.addUnit(UI.format.number(a),
|
||||
"%")},tickLength:0,min:0,max:100},amount:{name:"amount",color:"black",tickColor:0,tickDecimals:0,tickFormatter:function(a){return UI.format.number(a)},tickLength:0,min:0},bytespersec:{name:"bytespersec",color:"black",tickColor:0,tickDecimals:1,tickFormatter:function(a){return UI.format.bytes(a,!0)},tickLength:0,ticks:function(a){var c=0.3*Math.sqrt($(".graph").first().height()),c=(a.max-a.min)/c,d=Math.floor(Math.log(Math.abs(c))/Math.log(1024)),b=c/Math.pow(1024,d),i=-Math.floor(Math.log(b)/Math.LN10),
|
||||
m=a.tickDecimals;null!=m&&i>m&&(i=m);var h=Math.pow(10,-i),b=b/h,f;if(1.5>b)f=1;else if(3>b){if(f=2,2.25<b&&(null==m||i+1<=m))f=2.5,++i}else f=7.5>b?5:10;f=f*h*Math.pow(1024,d);null!=a.minTickSize&&f<a.minTickSize&&(f=a.minTickSize);a.delta=c;a.tickDecimals=Math.max(0,null!=m?m:i);a.tickSize=f;c=[];d=a.tickSize*Math.floor(a.min/a.tickSize);i=0;m=Number.NaN;do h=m,m=d+i*a.tickSize,c.push(m),++i;while(m<a.max&&m!=h);return c},min:0}},xaxes:{time:{name:"time",mode:"time",timezone:"browser",ticks:5}}},
|
||||
draggable:function(a){a.attr("draggable",!0);a.on("dragstart",function(a){$(this).css("opacity",0.4).data("dragstart",{click:{x:a.originalEvent.pageX,y:a.originalEvent.pageY},ele:{x:this.offsetLeft,y:this.offsetTop}})}).on("dragend",function(a){var d=$(this).data("dragstart"),b=d.ele.x-d.click.x+a.originalEvent.pageX,a=d.ele.y-d.click.y+a.originalEvent.pageY;$(this).css({opacity:1,top:a,left:b,right:"auto",bottom:"auto"})});a.parent().on("dragleave",function(){})},format:{time:function(a,c){var d=
|
||||
new Date(1E3*a),b=[];b.push(("0"+d.getHours()).slice(-2));b.push(("0"+d.getMinutes()).slice(-2));"short"!=c&&b.push(("0"+d.getSeconds()).slice(-2));return b.join(":")},date:function(a,c){var d=new Date(1E3*a),b="Sun Mon Tue Wed Thu Fri Sat".split(" "),i=[];"long"==c&&i.push(b[d.getDay()]);i.push(("0"+d.getDate()).slice(-2));i.push("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ")[d.getMonth()]);"short"!=c&&i.push(d.getFullYear());return i.join(" ")},dateTime:function(a,c){return UI.format.date(a,
|
||||
c)+", "+UI.format.time(a,c)},duration:function(a){var c=[0.001,1E3,60,60,24,7,52,1E9],d="ms sec min hr day week year".split(" "),b={},i;for(i in d){var a=a/c[i],m=Math.round(a%c[Number(i)+1]);b[d[i]]=m;a-=m}var h;for(i=d.length-1;0<=i;i--)if(0<b[d[i]]){h=d[i];break}c=$("<span>");switch(h){case "year":c.append(UI.format.addUnit(b.year,"years, ")).append(UI.format.addUnit(b.week,"wks"));break;case "week":c.append(UI.format.addUnit(b.week,"wks, ")).append(UI.format.addUnit(b.day,"days"));break;case "day":c.append(UI.format.addUnit(b.day,
|
||||
"days, ")).append(UI.format.addUnit(b.hr,"hrs"));break;default:c.append([("0"+b.hr).slice(-2),("0"+b.min).slice(-2),("0"+b.sec).slice(-2)+(b.ms?"."+b.ms:"")].join(":"))}return c[0].innerHTML},number:function(a){if(isNaN(Number(a))||0==a)return a;var c=Math.pow(10,3-Math.floor(Math.log(a)/Math.LN10)-1),a=Math.round(a*c)/c;if(1E4<a){number=a.toString().split(".");for(a=/(\d+)(\d{3})/;a.test(number[0]);)number[0]=number[0].replace(a,"$1 $2");a=number.join(".")}return a},status:function(a){var c=$("<span>");
|
||||
if("undefined"==typeof a.online)return c.text("Unknown, checking.."),"undefined"!=typeof a.error&&c.text(a.error),c;switch(a.online){case -1:c.text("Enabling");break;case 0:c.text("Unavailable").addClass("red");break;case 1:c.text("Active").addClass("green");break;case 2:c.text("Standby").addClass("orange");break;default:c.text(a.online)}"error"in a&&c.text(a.error);return c},capital:function(a){return a.charAt(0).toUpperCase()+a.substring(1)},addUnit:function(a,c){var d=$("<span>").html(a);d.append($("<span>").addClass("unit").html(c));
|
||||
return d[0].innerHTML},bytes:function(a,c){var d="bytes KiB MiB GiB TiB PiB".split(" ");if(0==a)unit=d[0];else{var b=Math.floor(Math.log(Math.abs(a))/Math.log(1024));0>b?unit=d[0]:(a/=Math.pow(1024,b),unit=d[b])}return UI.format.addUnit(UI.format.number(a),unit+(c?"/s":""))}},navto:function(a,c){var d=location.hash,b=d.split("@");b[0]=[mist.user.name,mist.user.host].join("&");b[1]=[a,c].join("&");"undefined"!=typeof screenlog&&screenlog.navto(b[1]);location.hash=b.join("@");location.hash==d&&$(window).trigger("hashchange")},
|
||||
showTab:function(a,c){var d=UI.elements.main;if(mist.user.loggedin){if(!("ui_settings"in mist.data)){d.html("Loading..");mist.send(function(){UI.showTab(a,c)},{ui_settings:!0});return}mist.data.config.serverid&&(document.title=mist.data.config.serverid+" - MistServer MI")}var b=UI.elements.menu.removeClass("hide").find('.plain:contains("'+a+'")').closest(".button");0<b.length&&(UI.elements.menu.find(".button.active").removeClass("active"),b.addClass("active"));MistVideoObject&&MistVideoObject.reference&&
|
||||
MistVideoObject.reference.unload();UI.interval.clear();d.html($("<h2>").text(a));switch(a){case "Login":if(mist.user.loggedin){UI.navto("Overview");return}document.title="MistServer MI";UI.elements.menu.addClass("hide");UI.elements.connection.status.text("Disconnected").removeClass("green").addClass("red");d.append(UI.buildUI([{type:"help",help:"Please provide your account details.<br>You were asked to set these when MistController was started for the first time. If you did not yet set any account details, log in with your desired credentials to create a new account."},
|
||||
classes:["red"]};if(streampart!=a&&b.replace(/[\00|\0|\/]/g,"")!=b)return{msg:"Slashes or null bytes are not allowed in wildcards.",classes:["red"]}}};break;case "streamname_with_wildcard_and_variables":f=function(a){if(a!=""){streampart=a.split("+");var b=streampart.slice(1).join("+");streampart=streampart[0];if(!isNaN(streampart.charAt(0)))return{msg:"The first character may not be a number.",classes:["red"]};if(streampart.toLowerCase()!=streampart)return{msg:"Uppercase letters are not allowed in a stream name.",
|
||||
classes:["red"]};if(streampart.replace(/[^\da-z_$]/g,"")!=streampart)return{msg:"Special characters (except for underscores) are not allowed in a stream name.",classes:["red"]};if(streampart!=a&&b.replace(/[\00|\0|\/]/g,"")!=b)return{msg:"Slashes or null bytes are not allowed in wildcards.",classes:["red"]}}};break;default:f=function(){}}h.push(f)}l.data("validate_functions",h).data("help_container",i).data("validate",function(a,b){if($(a).is(":visible")||$(a).is('input[type="hidden"]')){var c=$(a).getval(),
|
||||
d=$(a).data("validate_functions"),g=$(a).data("help_container");g.find(".err_balloon").remove();for(var e in d){var f=d[e](c,a);if(f){$err=$("<span>").addClass("err_balloon").html(f.msg);for(var h in f.classes)$err.addClass(f.classes[h]);g.prepend($err);b&&$(a).focus();return typeof f=="object"&&"break"in f?f["break"]:true}}return false}}).addClass("hasValidate").on("change keyup",function(){$(this).data("validate")($(this))});""!=l.getval()&&l.trigger("change")}"function"in b&&(l.on("change keyup",
|
||||
b["function"]),l.trigger("change"))}}c.on("keydown",function(a){var b=!1;switch(a.which){case 13:b=$(this).find("button.save").first();break;case 27:b=$(this).find("button.cancel").first()}b&&b.length&&(b.trigger("click"),a.stopPropagation())});return c},buildVheaderTable:function(a){var c=$("<table>").css("margin","0.2em"),d=$("<tr>").addClass("header").append($("<td>").addClass("vheader").attr("rowspan",a.labels.length+1).append($("<span>").text(a.vheader))),b=[];d.append($("<td>"));for(var i in a.labels)b.push($("<tr>").append($("<td>").html(""==
|
||||
a.labels[i]?" ":a.labels[i]+":")));for(var m in a.content)for(i in d.append($("<td>").html(a.content[m].header)),a.content[m].body)b[i].append($("<td>").html(a.content[m].body[i]));c.append($("<tbody>").append(d).append(b));return c},plot:{addGraph:function(a,c){var d={id:a.id,xaxis:a.xaxis,datasets:[],elements:{cont:$("<div>").addClass("graph"),plot:$("<div>").addClass("plot"),legend:$("<div>").addClass("legend").attr("draggable","true")}};UI.draggable(d.elements.legend);d.elements.cont.append(d.elements.plot).append(d.elements.legend);
|
||||
c.append(d.elements.cont);return d},go:function(a){if(!(1>Object.keys(a).length)){var c={totals:[],clients:[]},d;for(d in a)for(var b in a[d].datasets){var i=a[d].datasets[b];switch(i.datatype){case "clients":case "upbps":case "downbps":switch(i.origin[0]){case "total":c.totals.push({fields:[i.datatype],end:-15});break;case "stream":c.totals.push({fields:[i.datatype],streams:[i.origin[1]],end:-15});break;case "protocol":c.totals.push({fields:[i.datatype],protocols:[i.origin[1]],end:-15})}break;case "cpuload":case "memload":c.capabilities=
|
||||
{}}}0==c.totals.length&&delete c.totals;0==c.clients.length&&delete c.clients;mist.send(function(){for(var b in a){var c=a[b];if(1>c.datasets.length){c.elements.plot.html("");c.elements.legend.html("");break}switch(c.xaxis){case "time":var d=[];c.yaxes={};var i=[],j;for(j in c.datasets){var l=c.datasets[j];l.display&&(l.getdata(),l.yaxistype in c.yaxes||(d.push(UI.plot.yaxes[l.yaxistype]),c.yaxes[l.yaxistype]=d.length),l.yaxis=c.yaxes[l.yaxistype],i.push(l))}d[0]&&(d[0].color=0);c.plot=$.plot(c.elements.plot,
|
||||
i,{legend:{show:!1},xaxis:UI.plot.xaxes[c.xaxis],yaxes:d,grid:{hoverable:!0,borderWidth:{top:0,right:0,bottom:1,left:1},color:"black",backgroundColor:{colors:["rgba(0,0,0,0)","rgba(0,0,0,0.025)"]}},crosshair:{mode:"x"}});d=$("<table>").addClass("legend-list").addClass("nolay").html($("<tr>").html($("<td>").html($("<h3>").text(c.id))).append($("<td>").css("padding-right","2em").css("text-align","right").html($("<span>").addClass("value")).append($("<button>").data("opts",c).text("X").addClass("close").click(function(){var b=
|
||||
$(this).data("opts");if(confirm("Are you sure you want to remove "+b.id+"?")){b.elements.cont.remove();var c=$(".graph_ids option:contains("+b.id+")"),d=c.parent();c.remove();UI.plot.del(b.id);delete a[b.id];d.trigger("change");UI.plot.go(a)}}))));c.elements.legend.html(d);var u=function(a){var b=c.elements.legend.find(".value"),d=1;if(typeof a=="undefined")b.eq(0).html("Latest:");else{var g=c.plot.getXAxes()[0],a=Math.min(g.max,a),a=Math.max(g.min,a);b.eq(0).html(UI.format.time(a/1E3))}for(var f in c.datasets){var i=
|
||||
" ";if(c.datasets[f].display){var g=UI.plot.yaxes[c.datasets[f].yaxistype].tickFormatter,j=c.datasets[f].data;if(a)for(var l in j){if(j[l][0]==a){i=g(j[l][1]);break}if(j[l][0]>a){if(l!=0){i=j[l];j=j[l-1];i=g(i[1]+(a-i[0])*(j[1]-i[1])/(j[0]-i[0]))}break}}else i=g(c.datasets[f].data[c.datasets[f].data.length-1][1])}b.eq(d).html(i);d++}};c.plot.getOptions();for(j in c.datasets)i=$("<input>").attr("type","checkbox").data("index",j).data("graph",c).click(function(){var a=$(this).data("graph");$(this).is(":checked")?
|
||||
a.datasets[$(this).data("index")].display=true:a.datasets[$(this).data("index")].display=false;var b={};b[a.id]=a;UI.plot.go(b)}),c.datasets[j].display&&i.attr("checked","checked"),d.append($("<tr>").html($("<td>").html($("<label>").html(i).append($("<div>").addClass("series-color").css("background-color",c.datasets[j].color)).append(c.datasets[j].label))).append($("<td>").css("padding-right","2em").css("text-align","right").html($("<span>").addClass("value")).append($("<button>").text("X").addClass("close").data("index",
|
||||
j).data("graph",c).click(function(){var b=$(this).data("index"),c=$(this).data("graph");if(confirm("Are you sure you want to remove "+c.datasets[b].label+" from "+c.id+"?")){c.datasets.splice(b,1);if(c.datasets.length==0){c.elements.cont.remove();var b=$(".graph_ids option:contains("+c.id+")"),d=b.parent();b.remove();d.trigger("change");UI.plot.del(c.id);delete a[c.id];UI.plot.go(a)}else{UI.plot.save(c);b={};b[c.id]=c;UI.plot.go(b)}}}))));u();var g=!1;c.elements.plot.on("plothover",function(a,b,c){if(b.x!=
|
||||
g){u(b.x);g=b.x}if(c){a=$("<span>").append($("<h3>").text(c.series.label).prepend($("<div>").addClass("series-color").css("background-color",c.series.color))).append($("<table>").addClass("nolay").html($("<tr>").html($("<td>").text("Time:")).append($("<td>").html(UI.format.dateTime(c.datapoint[0]/1E3,"long")))).append($("<tr>").html($("<td>").text("Value:")).append($("<td>").html(c.series.yaxis.tickFormatter(c.datapoint[1],c.series.yaxis)))));UI.tooltip.show(b,a.children())}else UI.tooltip.hide()}).on("mouseout",
|
||||
function(){u()})}}},c)}},save:function(a){var c={id:a.id,xaxis:a.xaxis,datasets:[]},d;for(d in a.datasets)c.datasets.push({origin:a.datasets[d].origin,datatype:a.datasets[d].datatype});a=mist.stored.get().graphs||{};a[c.id]=c;mist.stored.set("graphs",a)},del:function(a){var c=mist.stored.get().graphs||{};delete c[a];mist.stored.set("graphs",c)},datatype:{getOptions:function(a){var c=$.extend(!0,{},UI.plot.datatype.templates.general),d=$.extend(!0,{},UI.plot.datatype.templates[a.datatype]),a=$.extend(!0,
|
||||
d,a),a=$.extend(!0,c,a);switch(a.origin[0]){case "total":switch(a.datatype){case "cpuload":case "memload":break;default:a.label+=" (total)"}break;case "stream":case "protocol":a.label+=" ("+a.origin[1]+")"}var c=[],b;for(b in a.basecolor)d=a.basecolor[b],d+=50*(0.5-Math.random()),d=Math.round(d),d=Math.min(255,Math.max(0,d)),c.push(d);a.color="rgb("+c.join(",")+")";return a},templates:{general:{display:!0,datatype:"general",label:"",yaxistype:"amount",data:[],lines:{show:!0},points:{show:!1},getdata:function(){var a=
|
||||
mist.data.totals["stream"==this.origin[0]?this.origin[1]:"all_streams"]["protocol"==this.origin[0]?this.origin[1]:"all_protocols"][this.datatype];return this.data=a}},cpuload:{label:"CPU use",yaxistype:"percentage",basecolor:[237,194,64],cores:1,getdata:function(){var a=!1,c;for(c in this.data)this.data[c][0]<1E3*(mist.data.config.time-600)&&(a=c);!1!==a&&this.data.splice(0,Number(a)+1);this.data.push([1E3*mist.data.config.time,mist.data.capabilities.cpu_use/10]);return this.data}},memload:{label:"Memory load",
|
||||
yaxistype:"percentage",basecolor:[175,216,248],getdata:function(){var a=!1,c;for(c in this.data)this.data[c][0]<1E3*(mist.data.config.time-600)&&(a=c);!1!==a&&this.data.splice(0,Number(a)+1);this.data.push([1E3*mist.data.config.time,mist.data.capabilities.load.memory]);return this.data}},clients:{label:"Connections",basecolor:[203,75,75]},upbps:{label:"Bandwidth up",yaxistype:"bytespersec",basecolor:[77,167,77]},downbps:{label:"Bandwidth down",yaxistype:"bytespersec",basecolor:[148,64,237]}}},yaxes:{percentage:{name:"percentage",
|
||||
color:"black",tickColor:0,tickDecimals:0,tickFormatter:function(a){return UI.format.addUnit(UI.format.number(a),"%")},tickLength:0,min:0,max:100},amount:{name:"amount",color:"black",tickColor:0,tickDecimals:0,tickFormatter:function(a){return UI.format.number(a)},tickLength:0,min:0},bytespersec:{name:"bytespersec",color:"black",tickColor:0,tickDecimals:1,tickFormatter:function(a){return UI.format.bytes(a,!0)},tickLength:0,ticks:function(a){var c=0.3*Math.sqrt($(".graph").first().height()),c=(a.max-
|
||||
a.min)/c,d=Math.floor(Math.log(Math.abs(c))/Math.log(1024)),b=c/Math.pow(1024,d),i=-Math.floor(Math.log(b)/Math.LN10),m=a.tickDecimals;null!=m&&i>m&&(i=m);var h=Math.pow(10,-i),b=b/h,f;if(1.5>b)f=1;else if(3>b){if(f=2,2.25<b&&(null==m||i+1<=m))f=2.5,++i}else f=7.5>b?5:10;f=f*h*Math.pow(1024,d);null!=a.minTickSize&&f<a.minTickSize&&(f=a.minTickSize);a.delta=c;a.tickDecimals=Math.max(0,null!=m?m:i);a.tickSize=f;c=[];d=a.tickSize*Math.floor(a.min/a.tickSize);i=0;m=Number.NaN;do h=m,m=d+i*a.tickSize,
|
||||
c.push(m),++i;while(m<a.max&&m!=h);return c},min:0}},xaxes:{time:{name:"time",mode:"time",timezone:"browser",ticks:5}}},draggable:function(a){a.attr("draggable",!0);a.on("dragstart",function(a){$(this).css("opacity",0.4).data("dragstart",{click:{x:a.originalEvent.pageX,y:a.originalEvent.pageY},ele:{x:this.offsetLeft,y:this.offsetTop}})}).on("dragend",function(a){var d=$(this).data("dragstart"),b=d.ele.x-d.click.x+a.originalEvent.pageX,a=d.ele.y-d.click.y+a.originalEvent.pageY;$(this).css({opacity:1,
|
||||
top:a,left:b,right:"auto",bottom:"auto"})});a.parent().on("dragleave",function(){})},format:{time:function(a,c){var d=new Date(1E3*a),b=[];b.push(("0"+d.getHours()).slice(-2));b.push(("0"+d.getMinutes()).slice(-2));"short"!=c&&b.push(("0"+d.getSeconds()).slice(-2));return b.join(":")},date:function(a,c){var d=new Date(1E3*a),b="Sun Mon Tue Wed Thu Fri Sat".split(" "),i=[];"long"==c&&i.push(b[d.getDay()]);i.push(("0"+d.getDate()).slice(-2));i.push("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ")[d.getMonth()]);
|
||||
"short"!=c&&i.push(d.getFullYear());return i.join(" ")},dateTime:function(a,c){return UI.format.date(a,c)+", "+UI.format.time(a,c)},duration:function(a){var c=[0.001,1E3,60,60,24,7,52,1E9],d="ms sec min hr day week year".split(" "),b={},i;for(i in d){var a=a/c[i],m=Math.round(a%c[Number(i)+1]);b[d[i]]=m;a-=m}var h;for(i=d.length-1;0<=i;i--)if(0<b[d[i]]){h=d[i];break}c=$("<span>");switch(h){case "year":c.append(UI.format.addUnit(b.year,"years, ")).append(UI.format.addUnit(b.week,"wks"));break;case "week":c.append(UI.format.addUnit(b.week,
|
||||
"wks, ")).append(UI.format.addUnit(b.day,"days"));break;case "day":c.append(UI.format.addUnit(b.day,"days, ")).append(UI.format.addUnit(b.hr,"hrs"));break;default:c.append([("0"+b.hr).slice(-2),("0"+b.min).slice(-2),("0"+b.sec).slice(-2)+(b.ms?"."+b.ms:"")].join(":"))}return c[0].innerHTML},number:function(a){if(isNaN(Number(a))||0==a)return a;var c=Math.pow(10,3-Math.floor(Math.log(a)/Math.LN10)-1),a=Math.round(a*c)/c;if(1E4<a){number=a.toString().split(".");for(a=/(\d+)(\d{3})/;a.test(number[0]);)number[0]=
|
||||
number[0].replace(a,"$1 $2");a=number.join(".")}return a},status:function(a){var c=$("<span>");if("undefined"==typeof a.online)return c.text("Unknown, checking.."),"undefined"!=typeof a.error&&c.text(a.error),c;switch(a.online){case -1:c.text("Enabling");break;case 0:c.text("Unavailable").addClass("red");break;case 1:c.text("Active").addClass("green");break;case 2:c.text("Standby").addClass("orange");break;default:c.text(a.online)}"error"in a&&c.text(a.error);return c},capital:function(a){return a.charAt(0).toUpperCase()+
|
||||
a.substring(1)},addUnit:function(a,c){var d=$("<span>").html(a);d.append($("<span>").addClass("unit").html(c));return d[0].innerHTML},bytes:function(a,c){var d="bytes KiB MiB GiB TiB PiB".split(" ");if(0==a)unit=d[0];else{var b=Math.floor(Math.log(Math.abs(a))/Math.log(1024));0>b?unit=d[0]:(a/=Math.pow(1024,b),unit=d[b])}return UI.format.addUnit(UI.format.number(a),unit+(c?"/s":""))}},navto:function(a,c){var d=location.hash,b=d.split("@");b[0]=[mist.user.name,mist.user.host].join("&");b[1]=[a,c].join("&");
|
||||
"undefined"!=typeof screenlog&&screenlog.navto(b[1]);location.hash=b.join("@");location.hash==d&&$(window).trigger("hashchange")},showTab:function(a,c){var d=UI.elements.main;if(mist.user.loggedin){if(!("ui_settings"in mist.data)){d.html("Loading..");mist.send(function(){UI.showTab(a,c)},{ui_settings:!0});return}mist.data.config.serverid&&(document.title=mist.data.config.serverid+" - MistServer MI")}var b=UI.elements.menu.removeClass("hide").find('.plain:contains("'+a+'")').closest(".button");0<b.length&&
|
||||
(UI.elements.menu.find(".button.active").removeClass("active"),b.addClass("active"));MistVideoObject&&MistVideoObject.reference&&MistVideoObject.reference.unload();UI.interval.clear();d.html($("<h2>").text(a));switch(a){case "Login":if(mist.user.loggedin){UI.navto("Overview");return}document.title="MistServer MI";UI.elements.menu.addClass("hide");UI.elements.connection.status.text("Disconnected").removeClass("green").addClass("red");d.append(UI.buildUI([{type:"help",help:"Please provide your account details.<br>You were asked to set these when MistController was started for the first time. If you did not yet set any account details, log in with your desired credentials to create a new account."},
|
||||
{label:"Host",help:"Url location of the MistServer API. Generally located at http://MistServerIP:4242/api","default":"http://localhost:4242/api",pointer:{main:mist.user,index:"host"}},{label:"Username",help:"Please enter your username here.",validate:["required"],pointer:{main:mist.user,index:"name"}},{label:"Password",type:"password",help:"Please enter your password here.",validate:["required"],pointer:{main:mist.user,index:"rawpassword"}},{type:"buttons",buttons:[{label:"Login",type:"save","function":function(){mist.user.password=
|
||||
MD5(mist.user.rawpassword);delete mist.user.rawpassword;mist.send(function(){UI.navto("Overview")})}}]}]));break;case "Create a new account":UI.elements.menu.addClass("hide");d.append($("<p>").text("No account has been created yet in the MistServer at ").append($("<i>").text(mist.user.host)).append("."));d.append(UI.buildUI([{type:"buttons",buttons:[{label:"Select other host",type:"cancel",css:{"float":"left"},"function":function(){UI.navto("Login")}}]},{type:"custom",custom:$("<br>")},{label:"Desired username",
|
||||
type:"str",validate:["required"],help:"Enter your desired username. In the future, you will need this to access the Management Interface.",pointer:{main:mist.user,index:"name"}},{label:"Desired password",type:"password",validate:["required",function(a,b){$(".match_password").not($(b)).trigger("change");return false}],help:"Enter your desired password. In the future, you will need this to access the Management Interface.",pointer:{main:mist.user,index:"rawpassword"},classes:["match_password"]},{label:"Repeat password",
|
||||
|
@ -114,8 +116,8 @@ d.append(h);h.stupidtable();var m=function(){var a=[],b;for(b in mist.data.activ
|
|||
"undefined"){var w=mist.data.totals[d].all_protocols.clients,e=0;if(w.length){for(a in w)e=e+w[a][1];e=Math.round(e/w.length)}}f.html(UI.format.number(e));if(e==0&&g.online==1)g.online=2;e=$("<td>").css("text-align","right").css("white-space","nowrap");(!("ischild"in g)||!g.ischild)&&e.html($("<button>").text("Settings").click(function(){UI.navto("Edit",$(this).closest("tr").data("index"))})).append($("<button>").text("Delete").click(function(){var a=$(this).closest("tr").data("index");if(confirm('Are you sure you want to delete the stream "'+
|
||||
a+'"?')){delete mist.data.streams[a];var b={};mist.data.LTS?b.deletestream=[a]:b.streams=mist.data.streams;mist.send(function(){UI.navto("Streams")},b)}}));w=$("<span>").text(g.name);g.ischild&&w.css("padding-left","1em");var h=UI.format.status(g),i=$("<button>").text("Preview").click(function(){UI.navto("Preview",$(this).closest("tr").data("index"))}),ja=$("<button>").text("Embed").click(function(){UI.navto("Embed",$(this).closest("tr").data("index"))});if("filesfound"in z[d]||g.online<0){h.html("");
|
||||
i="";f.html("");ja=""}o.append($("<tr>").data("index",d).html($("<td>").html(w).attr("title",g.name=="..."?"The results were truncated":g.name).addClass("overflow_ellipsis")).append($("<td>").text(g.source).attr("title",g.source).addClass("description").addClass("overflow_ellipsis").css("max-width","20em")).append($("<td>").data("sort-value",g.online).html(h)).append(f).append($("<td>").css("white-space","nowrap").html(i).append(ja)).append(e));a++}},{totals:a,active_streams:true})};if(mist.data.LTS){var p=
|
||||
0,q=0;for(e in mist.data.streams){h=mist.data.capabilities.inputs.Folder||mist.data.capabilities.inputs["Folder.exe"];if(!h)break;if(mist.inputMatch(h.source_match,mist.data.streams[e].source)){z[e].source=z[e].source+"*";z[e].filesfound=null;mist.send(function(a,b){var c=b.stream,d=0,g;a:for(g in a.browse.files){var f;for(f in mist.data.capabilities.inputs)if(!(f.indexOf("Buffer")>=0||f.indexOf("Buffer.exe")>=0||f.indexOf("Folder")>=0||f.indexOf("Folder.exe")>=0)&&mist.inputMatch(mist.data.capabilities.inputs[f].source_match,
|
||||
"/"+a.browse.files[g])){var e=c+"+"+a.browse.files[g];z[e]=U(e,mist.data.streams[c]);z[e].source=mist.data.streams[c].source+a.browse.files[g];d++;if(d>=500){z[c+"+zzzzzzzzz"]={ischild:true,name:"...",online:-1};break a}}}"files"in a.browse&&a.browse.files.length?z[c].filesfound=true:mist.data.streams[c].filesfound=false;q++;if(p==q){mist.send(function(){m()},{active_streams:true});UI.interval.set(function(){m()},5E3)}},{browse:mist.data.streams[e].source},{stream:e});p++}}if(p==0){mist.send(function(){m()},
|
||||
0,r=0;for(e in mist.data.streams){h=mist.data.capabilities.inputs.Folder||mist.data.capabilities.inputs["Folder.exe"];if(!h)break;if(mist.inputMatch(h.source_match,mist.data.streams[e].source)){z[e].source=z[e].source+"*";z[e].filesfound=null;mist.send(function(a,b){var c=b.stream,d=0,g;a:for(g in a.browse.files){var f;for(f in mist.data.capabilities.inputs)if(!(f.indexOf("Buffer")>=0||f.indexOf("Buffer.exe")>=0||f.indexOf("Folder")>=0||f.indexOf("Folder.exe")>=0)&&mist.inputMatch(mist.data.capabilities.inputs[f].source_match,
|
||||
"/"+a.browse.files[g])){var e=c+"+"+a.browse.files[g];z[e]=U(e,mist.data.streams[c]);z[e].source=mist.data.streams[c].source+a.browse.files[g];d++;if(d>=500){z[c+"+zzzzzzzzz"]={ischild:true,name:"...",online:-1};break a}}}"files"in a.browse&&a.browse.files.length?z[c].filesfound=true:mist.data.streams[c].filesfound=false;r++;if(p==r){mist.send(function(){m()},{active_streams:true});UI.interval.set(function(){m()},5E3)}},{browse:mist.data.streams[e].source},{stream:e});p++}}if(p==0){mist.send(function(){m()},
|
||||
{active_streams:true});UI.interval.set(function(){m()},5E3)}}else{mist.send(function(){m()},{active_streams:true});UI.interval.set(function(){m()},5E3)}}};if(mist.data.LTS){var W=0,ka=0,s={},la=[];for(g in mist.data.streams)if(mist.inputMatch((mist.data.capabilities.inputs.Folder||mist.data.capabilities.inputs["Folder.exe"]).source_match,mist.data.streams[g].source))la.push(g),mist.send(function(a,b){var d=b.stream,g=0,f;a:for(f in a.browse.files){var e;for(e in mist.data.capabilities.inputs)if(!(e.indexOf("Buffer")>=
|
||||
0||e.indexOf("Folder")>=0)&&mist.inputMatch(mist.data.capabilities.inputs[e].source_match,"/"+a.browse.files[f])){s[d+"+"+a.browse.files[f]]=true;g++;if(g>=500){s[d+"+zzzzzzzzz"]=true;break a}}}ka++;W==ka&&mist.send(function(){for(var a in mist.data.active_streams){var b=mist.data.active_streams[a].split("+");if(b.length>1&&b[0]in mist.data.streams){s[mist.data.active_streams[a]]=true;z[mist.data.active_streams[a]]=U(mist.data.active_streams[a],mist.data.streams[b[0]])}}s=Object.keys(s);s=s.concat(Object.keys(mist.data.streams));
|
||||
s.sort();V(c,s,la)},{active_streams:true})},{browse:mist.data.streams[g].source},{stream:g}),W++;0==W&&mist.send(function(){for(var a in mist.data.active_streams){var b=mist.data.active_streams[a].split("+");if(b.length>1&&b[0]in mist.data.streams){s[mist.data.active_streams[a]]=true;z[mist.data.active_streams[a]]=U(mist.data.active_streams[a],mist.data.streams[b[0]])}}s=Object.keys(s);mist.data.streams&&(s=s.concat(Object.keys(mist.data.streams)));s.sort();V(c,s)},{active_streams:!0})}else V(c,Object.keys(mist.data.streams));
|
||||
|
@ -221,8 +223,9 @@ a[d].replace(/[^\w\s]/g,"\\$&"),b=b.replace(/\\\*/g,".*");if(RegExp("^(?:[a-zA-Z
|
|||
d.select[f][1];break}}if("help"in d)e.help=d.help;if("unit"in d)e.unit=d.unit;if("placeholder"in d)e.placeholder=d.placeholder;if("type"in d)switch(d.type){case "int":e.type="int";if("max"in d)e.max=d.max;if("min"in d)e.min=d.min;break;case "uint":e.type="int";e.min=0;if("max"in d)e.max=d.max;if("min"in d)e.min=Math.max(e.min,d.min);break;case "debug":e.type="debug";break;case "radioselect":e.type="radioselect";e.radioselect=d.radioselect;break;case "select":e.type="select";e.select=d.select.slice(0);
|
||||
e.validate.indexOf("required")>=0&&e.select.unshift(["","placeholder"in e?"Default ("+e.placeholder+")":""]);break;case "sublist":e.type="sublist";e.saveas={};e.itemLabel=d.itemLabel;e.sublist=mist.convertBuildOptions(d,e.saveas);break;default:e.type="str"}else e.type="checkbox";"influences"in d&&(e["function"]=function(){var a=$(this).closest(".UIelement"),c=a.find("style");if(c.length)c=c[0];else{c=$("<style>").addClass("dependencies")[0];a.append(c)}c.innerHTML=".UIelement[data-dependent-"+b+"]:not([data-dependent-"+
|
||||
b+'~="'+$(this).getval()+'"]) { display: none; }\n';$(c).data("content",c.innerHTML);$("style.dependencies.hidden").each(function(){$(this).html($(this).data("content")).removeClass("hidden")});$(".UIelement:not(:visible) style.dependencies:not(.hidden)").each(function(){$(this).addClass("hidden");$(this).html("")})});if("dependent"in d)e.dependent=d.dependent;if("value"in d)e.value=d.value;if("validate"in d)e.validate=e.validate.concat(d.validate);return e}var b=[],i=["required","optional"];"desc"in
|
||||
a&&b.push({type:"help",help:a.desc});if("sort"in a){var m=[],h;for(h in i)if(a[i[h]])for(var f in a[i[h]]){var r=a[i[h]][f];if(Array.isArray(r))for(var j in r){r[j].validate=i[h];r[j].id=f;m.push(r[j])}else{r.validate=i[h];r.id=f;m.push(r)}}m.sort(function(b,c){return(""+b[a.sort]).localeCompare(c[a.sort])});for(f in m){r=m[f];b.push(d(r.validate,r.id,r))}}else for(h in i)if(a[i[h]]){b.push($("<h4>").text(UI.format.capital(i[h])+" parameters"));for(f in a[i[h]]){r=a[i[h]][f];if(Array.isArray(r))for(j in r)b.push(d(h,
|
||||
f,r[j]));else b.push(d(h,f,r))}}return b},stored:{get:function(){return mist.data.ui_settings||{}},set:function(a,c){var d=this.get();d[a]=c;mist.send(function(){},{ui_settings:d})},del:function(a){delete mist.data.ui_settings[a];mist.send(function(){},{ui_settings:mist.data.ui_settings})}}};function log(){try{UI.debug&&[].push.call(arguments,Error().stack);[].unshift.call(arguments,"["+UI.format.time((new Date).getTime()/1E3)+"]");console.log.apply(console,arguments)}catch(a){}}
|
||||
a&&b.push({type:"help",help:a.desc});if("sort"in a){var m=[],h;for(h in i)if(a[i[h]])for(var f in a[i[h]]){var r=a[i[h]][f];if(Array.isArray(r))for(var j in r){if(!("validate"in r[j]))r[j].validate=[];r[j].validate=i[h];r[j].id=f;m.push(r[j])}else{if(!("validate"in r))r.validate=[];r.validate.push(i[h]);r.id=f;m.push(r)}}m.sort(function(b,c){return(""+b[a.sort]).localeCompare(c[a.sort])});for(f in m){r=m[f];b.push(d(r.validate,r.id,r))}}else for(h in i)if(a[i[h]]){b.push($("<h4>").text(UI.format.capital(i[h])+
|
||||
" parameters"));for(f in a[i[h]]){r=a[i[h]][f];if(Array.isArray(r))for(j in r)b.push(d(h,f,r[j]));else b.push(d(h,f,r))}}return b},stored:{get:function(){return mist.data.ui_settings||{}},set:function(a,c){var d=this.get();d[a]=c;mist.send(function(){},{ui_settings:d})},del:function(a){delete mist.data.ui_settings[a];mist.send(function(){},{ui_settings:mist.data.ui_settings})}}};
|
||||
function log(){try{UI.debug&&[].push.call(arguments,Error().stack);[].unshift.call(arguments,"["+UI.format.time((new Date).getTime()/1E3)+"]");console.log.apply(console,arguments)}catch(a){}}
|
||||
$.fn.getval=function(){var a=$(this).data("opts"),c=$(this).val();if(a&&"type"in a)switch(a.type){case "span":c=$(this).html();break;case "checkbox":c=$(this).prop("checked");break;case "radioselect":a=$(this).find("label > input[type=radio]:checked").parent();if(a.length){c=[];c.push(a.children("input[type=radio]").val());a=a.children("select");a.length&&c.push(a.val())}else c="";break;case "checklist":c=[];$(this).find(".checklist input[type=checkbox]:checked").each(function(){c.push($(this).attr("name"))});
|
||||
break;case "unix":c!=""&&(c=Math.round(new Date($(this).val())/1E3));break;case "selectinput":c=$(this).children("select").first().val();c=="CUSTOM"&&(c=$(this).children("label").first().find(".field_container").children().first().getval());break;case "inputlist":c=[];$(this).children().each(function(){$(this).val()!=""&&c.push($(this).val())});break;case "sublist":c=$(this).data("savelist")}return c};
|
||||
$.fn.setval=function(a){var c=$(this).data("opts");$(this).val(a);if(c&&"type"in c)switch(c.type){case "span":$(this).html(a);break;case "checkbox":$(this).prop("checked",a);break;case "geolimited":case "hostlimited":c=$(this).closest(".field_container").data("subUI");if(typeof a=="undefined"||a.length==0)a="-";c.blackwhite.val(a.charAt(0));var a=a.substr(1).split(" "),d;for(d in a)c.values.append(c.prototype.clone(true).val(a[d]));c.blackwhite.trigger("change");break;case "radioselect":if(typeof a==
|
||||
|
|
79
lsp/mist.js
79
lsp/mist.js
|
@ -439,11 +439,14 @@ var UI = {
|
|||
break;
|
||||
case 'save':
|
||||
$b.addClass('save').click(function(e){
|
||||
var fn = $(this).data('opts')['preSave'];
|
||||
if (fn) { fn.call(this); }
|
||||
|
||||
var $ic = $(this).closest('.input_container');
|
||||
|
||||
//skip any hidden fields
|
||||
|
||||
//validate$()
|
||||
//validate
|
||||
var error = false;
|
||||
$ic.find('.hasValidate:visible, input[type="hidden"].hasValidate').each(function(){
|
||||
var vf = $(this).data('validate');
|
||||
|
@ -452,6 +455,8 @@ var UI = {
|
|||
return false; //break loop
|
||||
}
|
||||
});
|
||||
var fn = $(this).data('opts')['failedValidate'];
|
||||
if (fn) { fn.call(this); }
|
||||
if (error) { return; } //validation failed
|
||||
|
||||
//for all inputs
|
||||
|
@ -497,6 +502,11 @@ var UI = {
|
|||
$e.append(
|
||||
$('<span>').addClass('label').html(('label' in e ? e.label+':' : ''))
|
||||
);
|
||||
if ('classes' in e) {
|
||||
for (var k in e.classes) {
|
||||
$e.addClass(e.classes[k]);
|
||||
}
|
||||
}
|
||||
|
||||
//field
|
||||
var $fc = $('<span>').addClass('field_container');
|
||||
|
@ -739,6 +749,16 @@ var UI = {
|
|||
sublist
|
||||
).concat([
|
||||
{
|
||||
label: "Save first",
|
||||
type: "str",
|
||||
classes: ["onlyshowhelp"],
|
||||
validate: [function(){
|
||||
return {
|
||||
msg: "Did you want to save this "+e.itemLabel+"?",
|
||||
classes: ["red"]
|
||||
};
|
||||
}]
|
||||
},{
|
||||
type: "buttons",
|
||||
buttons: [{
|
||||
label: "Cancel",
|
||||
|
@ -751,6 +771,12 @@ var UI = {
|
|||
},{
|
||||
label: "Save "+e.itemLabel,
|
||||
type: "save",
|
||||
preSave: function(){
|
||||
$(this).closest('.input_container').find(".onlyshowhelp").closest("label").hide();
|
||||
},
|
||||
failedValidate: function(){
|
||||
$(this).closest('.input_container').find(".onlyshowhelp").closest("label").show();
|
||||
},
|
||||
"function": function(){
|
||||
var savelist = $field.getval();
|
||||
var save = Object.assign({},e.saveas);
|
||||
|
@ -1240,6 +1266,47 @@ var UI = {
|
|||
};
|
||||
break;
|
||||
}
|
||||
case 'streamname_with_wildcard_and_variables': {
|
||||
f = function(val,me) {
|
||||
if (val == "") { return; }
|
||||
|
||||
streampart = val.split("+");
|
||||
var wildpart = streampart.slice(1).join("+");
|
||||
streampart = streampart[0];
|
||||
|
||||
//validate streampart
|
||||
if (!isNaN(streampart.charAt(0))) {
|
||||
return {
|
||||
msg: 'The first character may not be a number.',
|
||||
classes: ['red']
|
||||
};
|
||||
}
|
||||
if (streampart.toLowerCase() != streampart) {
|
||||
return {
|
||||
msg: 'Uppercase letters are not allowed in a stream name.',
|
||||
classes: ['red']
|
||||
};
|
||||
}
|
||||
if (streampart.replace(/[^\da-z_$]/g,'') != streampart) {
|
||||
return {
|
||||
msg: 'Special characters (except for underscores) are not allowed in a stream name.',
|
||||
classes: ['red']
|
||||
};
|
||||
}
|
||||
|
||||
if (streampart != val) {
|
||||
//validate wildcard part
|
||||
//anything is allowed except / and nullbytes
|
||||
if (wildpart.replace(/[\00|\0|\/]/g,'') != wildpart) {
|
||||
return {
|
||||
msg: 'Slashes or null bytes are not allowed in wildcards.',
|
||||
classes: ['red']
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
break;
|
||||
}
|
||||
case 'track_selector': {
|
||||
//something like "audio=1&video=eng"
|
||||
//keep at default for now..
|
||||
|
@ -1252,7 +1319,7 @@ var UI = {
|
|||
fs.push(f);
|
||||
}
|
||||
$field.data('validate_functions',fs).data('help_container',$ihc).data('validate',function(me,focusonerror){
|
||||
if (!$(me).is(":visible")) { return; }
|
||||
if ((!$(me).is(":visible")) && (!$(me).is("input[type=\"hidden\"]"))) { return; }
|
||||
|
||||
var val = $(me).getval();
|
||||
var fs = $(me).data('validate_functions');
|
||||
|
@ -6623,13 +6690,19 @@ var mist = {
|
|||
var ele = input[type[j]][i];
|
||||
if (Array.isArray(ele)) {
|
||||
for (var m in ele) {
|
||||
if (!("validate" in ele[m])) {
|
||||
ele[m].validate = [];
|
||||
}
|
||||
ele[m].validate = type[j];
|
||||
ele[m].id = i;
|
||||
list.push(ele[m]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
ele.validate = type[j];
|
||||
if (!("validate" in ele)) {
|
||||
ele.validate = [];
|
||||
}
|
||||
ele.validate.push(type[j]);
|
||||
ele.id = i;
|
||||
list.push(ele);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue