design.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. //delete = delets from DB
  2. //remove = removes from HTML
  3. //save = save to DB
  4. //add = changes HTML
  5. //get = get from DB
  6. //new = changes HTML
  7. var pictureWidth = 1280;
  8. var pictureHeight = 720;
  9. function overlayOn(value, showimage=false) {
  10. url = "https://centurio.work/customers/evva/universal-storage/ui/?iframe"
  11. document.getElementById("overlay").style.display = "block";
  12. var iframe = $('#overlaycontentsize').append("<iframe id='overlaycontent' src='" + url + "' width='900' height='600'></iframe>");
  13. iframe.find("#overlaycontent").bind('load',{"ka": value}, function(event){
  14. var ref = this.contentWindow.ref;
  15. //You can think that ref = $(this.contentWindow.test) but thery are different
  16. //they are two diferent references this might be a bug
  17. ref.bind('getUrl',{"xyz": event.data.ka}, function(event, extra1){
  18. var data = event.data
  19. overlayOff();
  20. //fill input with url
  21. if(!showimage){
  22. $(data.xyz).parent().parent().find(".abbreviationInput").val(extra1.url)
  23. }
  24. else{
  25. $("#sliceImg").attr("src",extra1.url)
  26. }
  27. });
  28. });
  29. }
  30. function overlayOnImg(data) {
  31. var url = new URL("" + data, document.baseURI).href
  32. document.getElementById("overlay").style.display = "block";
  33. const imageext = ["png", "jpg", "svg"]
  34. const movieext = ["mp4"]
  35. var ext = url.substr(url.lastIndexOf('.') + 1);
  36. if(imageext.includes(ext)){
  37. $('#overlaycontentsize').load(url, function(){
  38. var width = $(this).children("svg").attr("width")
  39. var height = $(this).children("svg").attr("height")
  40. $(this).children("svg").attr("viewBox","0 0 " + width + " " + height);
  41. $(this).children("svg").attr("width",window.innerWidth * 0.7);
  42. $(this).children("svg").attr("height",window.innerHeight *0.7);
  43. });
  44. }
  45. else if(movieext.includes(ext)){
  46. $('#overlaycontentsize').append("<video id='overlaycontent' controls> <source src=" + url + " type=\"video/mp4\">Your browser does not support the video tag.</video>");
  47. }
  48. else{
  49. $('#overlaycontentsize').append("<iframe id='overlaycontent' src=" + url + "></iframe>");
  50. }
  51. }
  52. function overlayOff() {
  53. document.getElementById("overlay").style.display = "none";
  54. $('#overlaycontentsize').text("");
  55. }
  56. function saveStation() { //Save 2 DB
  57. if (confirm('Are you really, really, REALLY sure you want to create a New Station?')) {
  58. $.ajax({
  59. type: "POST",
  60. url: "../server/",
  61. success: function(res) {
  62. location.reload();
  63. }
  64. });
  65. }
  66. }
  67. function getStations(stationID , patternID ){ //Get DB 2 HTML
  68. $('#stations').text("");
  69. $.ajax({
  70. type: "GET",
  71. url: "../server/",
  72. dataType: "xml",
  73. success: function(xml) {
  74. $(xml).find('station').each(function(index){
  75. var clone = document.importNode(document.querySelector('#line').content,true);
  76. $('[data-class=station]',clone).text($(this).attr('id'));
  77. $('[data-class=pattern] a',clone).before("[");
  78. $('[data-class=pattern] a',clone).text("Add Pattern");
  79. $('[data-class=pattern] a',clone).after("]");
  80. $('[data-class=pattern] a',clone).attr('href','javascript:newPattern('+ $(this).attr('id') + ');');
  81. $('[data-class=duplicate]',clone).text("");
  82. $('[data-class=delete]',clone).text("");
  83. $('#stations').append(clone);
  84. var curstation=$(this).attr('id');
  85. $(this).find('pattern').each(function(index){
  86. var clonePattern = document.importNode(document.querySelector('#line').content,true);
  87. $('[data-class=pattern] a',clonePattern).text($(this).attr('value'));
  88. $('[data-class=pattern] a',clonePattern).attr('href','javascript:getPattern(' + curstation + ','+ $(this).attr('id') + ');');
  89. $('[data-class=date]',clonePattern).text($.format.date(Date.parse($(this).attr('changed')), 'yyyy/MM/dd HH:mm:ss'));
  90. $('[data-class=duplicate] a',clonePattern).attr('href','javascript:duplicatePattern(' + curstation + ','+ $(this).attr('id') + ');');
  91. $('[data-class=delete] a',clonePattern).attr('href','javascript:deletePattern(' + curstation + ','+ $(this).attr('id') + ');');
  92. if (patternID != null && patternID == $(this).attr('id')){
  93. $('tr',clonePattern).css("background-color","#99cce6");
  94. }
  95. $('#stations').append(clonePattern);
  96. });
  97. });
  98. }
  99. });
  100. }
  101. function newPattern(stationID) { //HTML
  102. getPattern(stationID);
  103. }
  104. function getPattern(stationID, patternID){ //Get DB 2 HTML
  105. getStations(stationID, patternID)
  106. if (patternID == null){
  107. $('#patternform').attr('onsubmit', "savePattern("+stationID+")");
  108. $('#pattern_ID').text("");
  109. $('#pattern_description').val("");
  110. $('#imageListing').text("");
  111. $('#images').css("display", "none");
  112. $('#remove_pattern').css("display", "none");
  113. $('#error').css("display", "none");
  114. $('#replacements').css("display", "none");
  115. }
  116. else{
  117. $('#patternform').attr('onsubmit', "saveChangedPattern("+stationID+","+ patternID +")");
  118. $('#pattern_ID').text(patternID);
  119. getImages(stationID, patternID);
  120. $('#remove_pattern').css("display", "block");
  121. $('#remove_pattern').attr('onclick', "javascript:deletePattern("+stationID+","+ patternID +")");
  122. getError(stationID, patternID);
  123. getReplaceImages(stationID, patternID);
  124. $.ajax({
  125. type: "GET",
  126. url: "../server/"+stationID+ "/" + patternID,
  127. dataType: "xml",
  128. success: function(xml) {
  129. $(xml).find('pattern').each(function(index){
  130. var pattern = $(this).attr('value').split(".")
  131. for(var i = 0; i < pattern.length; i++)
  132. {
  133. if(i == 0){
  134. $("#patternInput .patternPartInput").val(pattern[i]);
  135. $("#patternInput .patternPartInput").attr('size', pattern[i].length);
  136. }
  137. else{
  138. var clone = document.importNode(document.querySelector('#patternClone').content,true);
  139. $('[data-class=part]',clone).val(pattern[i]);
  140. $('[data-class=part]',clone).limitkeypress({ rexp: keypressRegex() });
  141. $('[data-class=part]',clone).attr('size', pattern[i].length);
  142. $("#patternInput").append(clone);
  143. }
  144. }
  145. $('#pattern').val($(this).attr('value'));
  146. $('#pattern_description').val($(this).attr('description'));
  147. });
  148. }
  149. });
  150. }
  151. $('#pattern_details').css("display", "block");
  152. $('#pattern_station').text(stationID);
  153. $('#pattern_description').text("");
  154. //Reset Pattern
  155. $('#patternInput').text("");
  156. var clone = document.importNode(document.querySelector('#patternClone').content,true);
  157. $('[data-class=part]',clone).limitkeypress({rexp: keypressRegex()});
  158. $("#patternInput").append(clone);
  159. }
  160. function keypressRegex(){ //Helper Function
  161. return /^.{1,10}$/;
  162. //return /^[A-Za-z0-9\*]*$/; //Ohne Sonderzeichen
  163. }
  164. function removePatternPart(value) { //HTML
  165. if($( ".patternPart" ).length > 1)
  166. value.parent().remove();
  167. }
  168. function addPatternPart(useLast, curclass) { //HTML
  169. var clone = document.importNode(document.querySelector('#patternClone').content,true);
  170. $('[data-class=part]',clone).val("*");
  171. $('[data-class=part]',clone).limitkeypress({rexp: keypressRegex()});
  172. if(useLast){
  173. $("#" + curclass).children(".patternPart").last().after(clone);
  174. $("#" + curclass).last().children(".patternPartInput").focus();
  175. }else{
  176. $(':focus').parent().after(clone);
  177. $(':focus').parent().next().children(".patternPartInput").focus();
  178. }
  179. }
  180. function getPatternString(){ //Helper Function
  181. var val = "";
  182. var first = true;
  183. $(".patternPartInput").each(function() {
  184. if(first){
  185. first = false
  186. val += $(this).val()
  187. }
  188. else{
  189. val += "." + $(this).val()
  190. }
  191. });
  192. return val;
  193. }
  194. function savePattern(stationID) { //Save 2 DB
  195. var xmlDocument = $.parseXML("<pattern/>");
  196. $(xmlDocument).find("pattern").attr('id','0');
  197. $(xmlDocument).find("pattern").attr('value',getPatternString());
  198. $(xmlDocument).find("pattern").attr('description',$('#pattern_description').val());
  199. $(xmlDocument).find("pattern").attr('changed',new Date().toISOString());
  200. $.ajax({
  201. type: "POST",
  202. headers: {"content-id": "pattern"},
  203. data: (new XMLSerializer()).serializeToString(xmlDocument),
  204. contentType: "application/xml; charset=utf-8",
  205. url: "../server/"+stationID,
  206. success: function(res) {
  207. getPattern(stationID, res.id)
  208. },
  209. error: function (request, status, error) {
  210. alert(request.responseText + status + error);
  211. }
  212. });
  213. }
  214. function saveChangedPattern(stationID, patternID) { //Save 2 DB
  215. var xmlDocument = $.parseXML("<pattern/>");
  216. $(xmlDocument).find("pattern").attr('id',$('#pattern_ID').text());
  217. $(xmlDocument).find("pattern").attr('value',getPatternString());
  218. $(xmlDocument).find("pattern").attr('description',$('#pattern_description').val());
  219. $(xmlDocument).find("pattern").attr('changed',new Date().toISOString());
  220. //Save Pattern
  221. $.ajax({
  222. type: "PUT",
  223. headers: {"content-id": "pattern"},
  224. data: (new XMLSerializer()).serializeToString(xmlDocument),
  225. contentType: "application/xml; charset=utf-8",
  226. url: "../server/"+stationID + "/" + patternID,
  227. //processData: false,
  228. success: function(res) {
  229. },
  230. error: function (request, status, error) {
  231. alert(request.responseText + status + error);
  232. }
  233. });
  234. //Update Labels
  235. $(".imageInput").each(function() {
  236. //Optimization only update if lable changed
  237. if($(this).val() != $(this).attr("origValue"))
  238. $.ajax({
  239. type: "PUT",
  240. data: { 'label' : $(this).val()},
  241. headers: {"content-id": "label"},
  242. url: "../server/"+stationID + "/" + patternID + "/images/" + $(this).parent().find(".imageID").text() +"/" + $('#image_language option:selected').text(),
  243. success: function(res) {
  244. },
  245. error: function (request, status, error) {
  246. alert(request.responseText + status + error);
  247. }
  248. });
  249. });
  250. //Update Image Ordering
  251. var order = []
  252. $(".imageID").each(function() {
  253. order.push(parseInt($(this).text()))
  254. });
  255. $.ajax({
  256. type: "PUT",
  257. data: JSON.stringify(order),
  258. headers: {"content-id": "orderlist"},
  259. contentType: "application/json",
  260. url: "../server/"+stationID + "/" + patternID + "/images/reorder/" + $('#image_language option:selected').text(),
  261. success: function(res) {
  262. },
  263. error: function (request, status, error) {
  264. alert(request.responseText + status + error);
  265. }
  266. });
  267. //Update Error
  268. var errorList = $.parseXML("<error/>");
  269. $(".errorInput").each(function() {
  270. $(errorList).find("error").append("<reason>" +$(this).val()+"</reason>")
  271. });
  272. $.ajax({
  273. type: "PUT",
  274. headers: {"content-id": "error"},
  275. data: (new XMLSerializer()).serializeToString(errorList),
  276. contentType: "application/xml; charset=utf-8",
  277. url: "../server/"+stationID + "/" + patternID + "/error",
  278. success: function(res) {
  279. },
  280. error: function (request, status, error) {
  281. alert(request.responseText + status + error);
  282. }
  283. });
  284. //Update Replacement
  285. var replaceList = $.parseXML("<replacement/>");
  286. $(".replaceInput").each(function() {
  287. //console.log($(this).find('.abbreviation').val())
  288. //console.log($(this).find('.url').val())
  289. $(replaceList).find("replacement").append("<item>" + "<abbreviation>" + $(this).find('.abbreviation').val() + "</abbreviation>" + "<url>" + $(this).find('.url').val() + "</url>"+"</item>")
  290. });
  291. $.ajax({
  292. type: "PUT",
  293. headers: {"content-id": "replacement"},
  294. data: (new XMLSerializer()).serializeToString(replaceList),
  295. contentType: "application/xml; charset=utf-8",
  296. url: "../server/"+stationID + "/" + patternID + "/replacement",
  297. success: function(res) {
  298. },
  299. error: function (request, status, error) {
  300. alert(request.responseText + status + error);
  301. }
  302. });
  303. getPattern(stationID, patternID)
  304. }
  305. function deletePattern(stationID, patternID) { //Delete From DB
  306. if (confirm('Are you really, really, REALLY sure!')) {
  307. $.ajax({
  308. type: "DELETE",
  309. url: "../server/" + stationID + "/" + patternID,
  310. success: function(res) {
  311. location.reload();
  312. }
  313. });
  314. }
  315. }
  316. function duplicatePattern(stationID, patternID){ //Get DB 2 HTML
  317. $.ajax({
  318. type: "PUT",
  319. headers: {"content-id": "patternID"},
  320. data: { "patternID":patternID},
  321. contentType: "application/json",
  322. url: "../server/"+stationID + "/" + patternID,
  323. success: function(res) {
  324. getPattern(stationID, res["id"])
  325. },
  326. error: function (request, status, error) {
  327. alert(request.responseText + status + error);
  328. }
  329. });
  330. }
  331. function getImages(stationID, patternID){ //Get From DB 2 HTML
  332. $('#images').css("display", "block");
  333. $('#imageListing').text("");
  334. $('#imgUpload').attr("action", "../server/" + stationID + "/" + patternID + "/images");
  335. $('#addExternalImageUrl').val("");
  336. $('#addExternalImage').attr("onclick", "addExternalImage(" + stationID + "," + patternID + ")");
  337. //Image preview needs pattern
  338. $.ajax({
  339. type: "GET",
  340. url: "../server/"+stationID+ "/" + patternID,
  341. dataType: "xml",
  342. success: function(xml) {
  343. pattern = xml.getElementsByTagName('pattern')[0].getAttribute("value");
  344. //get all images
  345. $.ajax({
  346. type: "GET",
  347. url: "../server/"+stationID+ "/" + patternID + "/images",
  348. dataType: "xml",
  349. success: function(xml) {
  350. var count = 0;
  351. $(xml).find('image').each(function(index){
  352. curID = $(this).attr('id')
  353. $(this).find('variant').each(function(){
  354. if($(this).attr('lang') == $('#image_language option:selected').text()){
  355. ++count;
  356. var clone = document.importNode(document.querySelector('#imagePreview').content,true);
  357. var imgsrcsingle = "../images/uploads/"+stationID+ "/" + patternID + "/" + curID + "/"+ $(this).attr('lang') + ".svg";
  358. var imgsrc = imgsrcsingle + "?" + Date.now();
  359. //$('[data-class=image]',clone).append('<img id="theImg" src="' + imgsrc +'" onclick="overlayOnImg(\'' +imgsrcsingle + '\')" height="100px" />')
  360. //$('[data-class=image]',clone).append('<object class="theImg" id="theImg" data="' + imgsrc +'" onclick="overlayOnImg(\'' +imgsrcsingle + '\')" height="100px" />')
  361. //managing that internal and external pictures look the same
  362. $('[data-class=image]',clone).load(imgsrc, function(){
  363. var width = $(this).children("svg").attr("width")
  364. var height = $(this).children("svg").attr("height")
  365. $(this).children("svg").attr("viewBox","0 0 " + pictureWidth + " " + pictureHeight + "");
  366. $(this).children("svg").attr("width","200");
  367. $(this).children("svg").attr("height","100");
  368. });
  369. $('[data-class=image]',clone).attr("onclick", "overlayOnImg('" + imgsrcsingle + "')" );
  370. //Image Preview
  371. $('[data-class=showimage]',clone).attr("href", "imageReplacement.php?___image___="+stationID+ "/" + patternID + "/" + curID + "/"+ $(this).attr('lang') + ".svg" +"&ProductCode=" + pattern );
  372. //$('[data-class=image]',clone).append('<object class="theImg" id="theImg" data="' + imgsrc +'" onclick="overlayOnImg(\'' +imgsrcsingle + '\')" height="100px" />')
  373. //$('[data-class=image]',clone).append('<div style="background-image: url(' + imgsrc+ ')" height="100px" />')
  374. $('[data-class=label]',clone).val($(this).attr('label'));
  375. $('[data-class=label]',clone).attr("origValue", $(this).attr('label'));
  376. $('[data-class=imageId]',clone).text(curID);
  377. $('[data-class=imageId]',clone).attr("class", "imageID")
  378. $('[data-class=options] a',clone).attr('href','javascript:deleteImage(' + stationID + ','+ patternID + ',' + curID + ',"' + $(this).attr('lang') + '");');
  379. $('#imageListing').append(clone);
  380. }
  381. });
  382. });
  383. $('#image_count').text(count);
  384. /*
  385. $(".image").each(function() {
  386. alert("mhm");
  387. $(this).children().attr("viewBox","0 0 " + "300" + " 300");
  388. });
  389. */
  390. }
  391. });
  392. }
  393. });
  394. new Sortable(document.getElementById('imageListing'),{
  395. handle: '.handle',
  396. animation: 150
  397. });
  398. new Sortable(document.getElementById('replaceImages'),{
  399. handle: '.handle2',
  400. animation: 150
  401. });
  402. }
  403. function addExternalImage(stationID, patternID){
  404. var extImage = $.parseXML("<externalImage/>");
  405. $(extImage).find("externalImage").append("<url>" + $('#addExternalImageUrl').val() +"</url>");
  406. $(extImage).find("externalImage").append("<lang>" + $('#image_language option:selected').text() + "</lang>");
  407. console.log(extImage);
  408. $.ajax({
  409. type: "POST",
  410. headers: {"content-id": "externalImage"},
  411. data: (new XMLSerializer()).serializeToString(extImage),
  412. contentType: "application/xml; charset=utf-8",
  413. url: "../server/" + stationID + "/" + patternID + "/images",
  414. success: function(res) {
  415. getPattern(stationID, patternID)
  416. }
  417. });
  418. }
  419. function deleteImage(stationID, patternID, imageID, lang) { //Delete From DB
  420. $.ajax({
  421. type: "DELETE",
  422. url: "../server/" + stationID + "/" + patternID + "/images/" + imageID + "/" + lang,
  423. success: function(res) {
  424. getPattern(stationID, patternID)
  425. }
  426. });
  427. }
  428. function addError() { //HTML
  429. //Will be added from DB on save
  430. var clone = document.importNode(document.querySelector('#errorCode').content,true);
  431. $('#errorCodes').append(clone);
  432. }
  433. function getError(stationID, patternID){ //Get From DB 2 HTML
  434. $('#error').css("display", "block");
  435. $('#errorCodes').text("");
  436. $.ajax({
  437. type: "GET",
  438. url: "../server/"+stationID+ "/" + patternID + "/error",
  439. dataType: "xml",
  440. success: function(xml) {
  441. $(xml).find('reason').each(function(index){
  442. var clone = document.importNode(document.querySelector('#errorCode').content,true);
  443. $('[data-class=errorInput]',clone).val($(this).text());
  444. $('#errorCodes').append(clone);
  445. });
  446. }
  447. });
  448. }
  449. function removeError(value) { //HTML
  450. //Will be removed from DB on save
  451. value.parent().parent().parent().remove();
  452. }
  453. function addBlankReplacement() { //HTML
  454. //Will be added from DB on save
  455. var clone = document.importNode(document.querySelector('#imageReplacements').content,true);
  456. $('#replaceImages').append(clone);
  457. }
  458. function getReplaceImages(stationID, patternID){ //Get From DB 2 HTML
  459. $('#replacements').css("display", "block");
  460. $('#replaceImages').text("");
  461. $.ajax({
  462. type: "GET",
  463. url: "../server/"+stationID+ "/" + patternID + "/replacement",
  464. dataType: "xml",
  465. success: function(xml) {
  466. $(xml).find('item').each(function(index){
  467. var clone = document.importNode(document.querySelector('#imageReplacements').content,true);
  468. $('[data-class=abbreviation]',clone).val($(this).find('abbreviation').text());
  469. $('[data-class=url]',clone).val($(this).find('url').text());
  470. $('#replaceImages').append(clone);
  471. });
  472. }
  473. });
  474. }
  475. function removeReplacement(value) { //HTML
  476. //Will be removed from DB on save
  477. value.parent().parent().parent().remove();
  478. }
  479. //Go to next PatternInput on . or space keydown
  480. $(window).keydown(function(e) {
  481. if ((e.which === 32 || e.which === 190) && $(':focus').attr('class') === "patternPartInput") {
  482. e.preventDefault();
  483. addPatternPart(false);
  484. }
  485. });
  486. $(document).ready(function() {
  487. getStations(); //Get all Stations
  488. $("#image_language" ).change(function() {
  489. getImages($('#pattern_station').text(), $('#pattern_ID').text())
  490. });
  491. $(document).on('submit', '#patternform', function() { //prevent page reload on form submit
  492. return false;
  493. });
  494. $('.patternPartInput').limitkeypress({rexp: keypressRegex()});
  495. });