PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/assets/tvs/multitv/js/multitv.js

https://github.com/good-web-master/modx.evo.custom
JavaScript | 442 lines | 403 code | 22 blank | 17 comment | 56 complexity | 09a1b42e8571ca0a60dd3e2580c38268 MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-1.0, GPL-2.0, MIT, BSD-3-Clause
  1. var $j = jQuery.noConflict();
  2. var lastImageCtrl;
  3. var lastFileCtrl;
  4. if (!String.prototype.supplant) {
  5. String.prototype.supplant = function (o) {
  6. return this.replace(/{([^{}]*)}/g,
  7. function (a, b) {
  8. var r = o[b];
  9. return typeof r === 'string' || typeof r === 'number' ? r : a;
  10. }
  11. );
  12. };
  13. }
  14. function SetUrl(url, width, height, alt) {
  15. if(lastFileCtrl) {
  16. var fileCtrl = $j('#' + lastFileCtrl);
  17. fileCtrl.val(url);
  18. fileCtrl.trigger('change');
  19. lastFileCtrl = '';
  20. } else if(lastImageCtrl) {
  21. var imageCtrl = $j('#' + lastImageCtrl);
  22. imageCtrl.val(url);
  23. imageCtrl.trigger('change');
  24. lastImageCtrl = '';
  25. } else {
  26. return;
  27. }
  28. }
  29. function TransformField(tvid, tvmode, tvfields, tvlanguage) {
  30. var field = $j('#' + tvid);
  31. var fieldMode = tvmode;
  32. var fieldValue = new Array();
  33. var fieldSettings = new Object();
  34. var fieldHeading = $j('#' + tvid + 'heading');
  35. var fieldNames = tvfields['fieldnames'];
  36. var fieldTypes = tvfields['fieldtypes'];
  37. var fieldCsvSeparator = tvfields['csvseparator'];
  38. var fieldList = $j('#' + tvid + 'list');
  39. var fieldListElement = fieldList.find('li:first');
  40. var fieldListElementEmpty = fieldListElement.clone();
  41. var fieldEdit = $j('#' + tvid + 'edit');
  42. var fieldClear = $j('#' + tvid + 'clear');
  43. var fieldPaste = $j('#' + tvid + 'paste');
  44. var fieldPasteForm = $j('#' + tvid + 'pasteform');
  45. var fieldPasteArea = $j('#' + tvid + 'pastearea');
  46. var fieldListCounter = 1;
  47. var pasteBox;
  48. function DuplicateElement(element, elementCount) {
  49. var clone = element.clone(true).hide();
  50. var elementId;
  51. clone.find('[id]').each(function() {
  52. elementId = $j(this).attr('id');
  53. $j(this).attr('id', elementId + (elementCount));
  54. });
  55. clone.find('[name]').each(function() {
  56. $j(this).attr('name', $j(this).attr('name') + (elementCount));
  57. });
  58. AddElementEvents(clone);
  59. // clear inputs/textarea
  60. var inputs = clone.find(':input');
  61. inputs.each(function() {
  62. var type = $j(this).attr('type');
  63. switch(type) {
  64. case 'button':
  65. break;
  66. case 'reset':
  67. break;
  68. case 'submit':
  69. break;
  70. case 'checkbox':
  71. case 'radio':
  72. $j(this).attr('checked', false);
  73. break;
  74. default:
  75. $j(this).val('');
  76. }
  77. });
  78. return clone;
  79. }
  80. function setMultiValue() {
  81. var multiElements = fieldList.children('li');
  82. var values = [];
  83. multiElements.each(function() {
  84. var multiElement = $j(this);
  85. var fieldValues = [];
  86. $j.each(fieldNames, function() {
  87. var fieldInput = multiElement.find('[name^="'+tvid+this+'_mtv"][type!="hidden"]');
  88. var fieldValue = fieldInput.getValue();
  89. fieldValues.push(fieldValue);
  90. if (fieldInput.hasClass('image')) {
  91. setThumbnail(fieldValue, fieldInput.attr('name'), multiElement);
  92. }
  93. if (fieldInput.hasClass('setdefault') && fieldInput.getValue() == '') {
  94. fieldInput.setValue(fieldInput.attr('alt').supplant({
  95. i: fieldSettings.autoincrement,
  96. alias: $j('[name="alias"]').getValue()
  97. }));
  98. fieldSettings.autoincrement++;
  99. }
  100. });
  101. values.push(fieldValues);
  102. });
  103. field.setValue($j.toJSON({
  104. fieldValue: values,
  105. fieldSettings: fieldSettings
  106. }));
  107. }
  108. function AddElementEvents(element) {
  109. // datepicker
  110. element.find('.DatePicker').datetimepicker({
  111. changeMonth: true,
  112. changeYear: true,
  113. dateFormat: 'dd-mm-yy',
  114. timeFormat: 'h:mm:ss'
  115. });
  116. // file field browser
  117. element.find('.browsefile').click(function() {
  118. var field = $j(this).prev('input').attr('id');
  119. BrowseFileServer(field);
  120. return false;
  121. });
  122. // image field browser
  123. element.find('.browseimage').click(function() {
  124. var field = $j(this).prev('input').attr('id');
  125. BrowseServer(field);
  126. return false;
  127. });
  128. // add element
  129. element.find('.copy').click(function() {
  130. var clone = DuplicateElement(fieldListElementEmpty, fieldListCounter);
  131. $j(this).parents('.element').after(clone);
  132. clone.show('fast', function() {
  133. $j(this).removeAttr('style');
  134. });
  135. setMultiValue();
  136. fieldListCounter++;
  137. return false;
  138. });
  139. // remove element
  140. element.find('.remove').click(function() {
  141. if(fieldList.find('.element').length > 1) {
  142. $j(this).parents('.element').hide('fast', function(){
  143. $j(this).remove();
  144. setMultiValue();
  145. });
  146. } else {
  147. // clear inputs/textarea
  148. var inputs = $j(this).parent().find('[name]');
  149. inputs.each(function() {
  150. var type = $j(this).attr('type');
  151. switch(type) {
  152. case 'button':
  153. break;
  154. case 'reset':
  155. break;
  156. case 'submit':
  157. break;
  158. case 'checkbox':
  159. case 'radio':
  160. $j(this).attr('checked', false);
  161. break;
  162. default:
  163. $j(this).val('');
  164. }
  165. });
  166. }
  167. return false;
  168. });
  169. // change field
  170. element.find('[name]').bind('change keyup mouseup', function() {
  171. setMultiValue();
  172. return false;
  173. });
  174. }
  175. function setThumbnail(fieldValue, fieldName, listElement) {
  176. var thumbPath = fieldValue.split('/');
  177. var thumbName = thumbPath.pop();
  178. var thumbId = fieldName.replace(/^(.*?)(\d*)$/, '#$1preview$2');
  179. if (thumbName != '') {
  180. listElement.find(thumbId).html('<img src="../'+thumbPath.join("/")+'/.thumb_'+thumbName+'" />');
  181. } else {
  182. listElement.find(thumbId).html('');
  183. }
  184. }
  185. function prefillInputs(fieldValue) {
  186. if (fieldMode == 'single'){
  187. fieldValue = [fieldValue[0]];
  188. }
  189. if(fieldValue){
  190. $j.each(fieldValue, function() {
  191. var values = this;
  192. var i = 0;
  193. if (fieldListCounter == 1) {
  194. $j.each(values, function() {
  195. var fieldInput = fieldListElement.find('[name^="'+tvid+fieldNames[i]+'_mtv"][type!="hidden"]');
  196. fieldInput.setValue(values[i]);
  197. if (fieldInput.hasClass('image')) {
  198. setThumbnail(values[i], fieldInput.attr('name'), fieldListElement);
  199. }
  200. if (fieldInput.hasClass('setdefault') && fieldInput.getValue() == '') {
  201. fieldInput.setValue(fieldInput.attr('alt').supplant({
  202. i: fieldSettings.autoincrement,
  203. alias: $j('[name="alias"]').getValue()
  204. }))
  205. fieldSettings.autoincrement++;
  206. }
  207. i++;
  208. })
  209. } else {
  210. var clone = DuplicateElement(fieldListElementEmpty, fieldListCounter);
  211. clone.show();
  212. fieldList.append(clone);
  213. $j.each(values, function() {
  214. var fieldInput = clone.find('[name^="'+tvid+fieldNames[i]+'_mtv"][type!="hidden"]');
  215. fieldInput.setValue(values[i]);
  216. if (fieldInput.hasClass('image')) {
  217. setThumbnail(values[i], fieldInput.attr('name'), clone);
  218. }
  219. if (fieldInput.hasClass('setdefault') && fieldInput.getValue() == '') {
  220. fieldInput.setValue(fieldInput.attr('alt').supplant({
  221. i: fieldSettings.autoincrement,
  222. alias: $j('[name="alias"]').getValue()
  223. }))
  224. fieldSettings.autoincrement++;
  225. }
  226. i++;
  227. })
  228. }
  229. fieldListCounter++;
  230. });
  231. }
  232. field.addClass('transformed');
  233. }
  234. if (!field.hasClass('transformed')) {
  235. // reset all event
  236. fieldClear.find('a').click(function() {
  237. var answer = confirm(tvlanguage.confirmclear);
  238. if (answer) {
  239. fieldList.children('li').remove();
  240. field.val('');
  241. fieldClear.hide();
  242. fieldPaste.hide();
  243. fieldHeading.hide();
  244. fieldEdit.show();
  245. }
  246. return false;
  247. });
  248. // start edit event
  249. fieldEdit.find('a').click(function() {
  250. var clone = fieldListElementEmpty.clone(true);
  251. fieldList.append(clone);
  252. field.val('[]');
  253. fieldList.show();
  254. fieldClear.show();
  255. fieldPaste.show();
  256. fieldHeading.show();
  257. fieldEdit.hide();
  258. // sortable
  259. fieldList.sortable({
  260. stop : function() {
  261. setMultiValue();
  262. },
  263. axis: 'y',
  264. helper: 'clone'
  265. });
  266. AddElementEvents(clone);
  267. return false;
  268. });
  269. // paste box
  270. pasteBox = fieldPaste.find('a').click(function(e){
  271. e.preventDefault();
  272. $j.colorbox({
  273. inline: true,
  274. href: $j(this).attr('href'),
  275. width:"500px",
  276. height:"350px",
  277. onClosed:function() {
  278. fieldPasteArea.html('');
  279. },
  280. close:'',
  281. open:true
  282. });
  283. });
  284. // close paste box
  285. fieldPasteForm.find('.cancel').click(function() {
  286. pasteBox.colorbox.close();
  287. return false;
  288. });
  289. // save pasted form
  290. fieldPasteForm.find('.replace, .append').click(function() {
  291. var pastedArray = [];
  292. var mode = $j(this).attr('class');
  293. var pasteas = $j('input:radio[name=pasteas]:checked').val();
  294. var clean;
  295. switch(pasteas) {
  296. case 'google':
  297. clean = fieldPasteArea.htmlClean({
  298. allowedTags:['div','span']
  299. });
  300. clean.find('div').each(function() {
  301. var pastedRow = [];
  302. var tableData = $j(this).html().split('<span></span>');
  303. if (tableData.length > 0) {
  304. var i = 0;
  305. $j.each(tableData, function() {
  306. if (fieldTypes[i] == 'thumb') {
  307. pastedRow.push('');
  308. i++;
  309. }
  310. pastedRow.push($j.trim(this));
  311. i++;
  312. });
  313. pastedArray.push(pastedRow);
  314. }
  315. });
  316. break;
  317. case 'csv':
  318. clean = fieldPasteArea.htmlClean({
  319. allowedTags:['div','p']
  320. });
  321. clean.find('div, p').each(function() {
  322. var pastedRow = [];
  323. // CSV Parser credit goes to Brian Huisman, from his blog entry entitled "CSV String to Array in JavaScript": http://www.greywyvern.com/?post=258
  324. for (var tableData = $j(this).html().split(fieldCsvSeparator), x = tableData.length - 1, tl; x >= 0; x--) {
  325. if (tableData[x].replace(/"\s+$/, '"').charAt(tableData[x].length - 1) == '"') {
  326. if ((tl = tableData[x].replace(/^\s+"/, '"')).length > 1 && tl.charAt(0) == '"') {
  327. tableData[x] = tableData[x].replace(/^\s*"|"\s*$/g, '').replace(/""/g, '"');
  328. } else if (x) {
  329. tableData.splice(x - 1, 2, [tableData[x - 1], tableData[x]].join(fieldCsvSeparator));
  330. } else tableData = tableData.shift().split(fieldCsvSeparator).concat(tableData);
  331. } else tableData[x].replace(/""/g, '"');
  332. }
  333. if (tableData.length > 0) {
  334. var i = 0;
  335. $j.each(tableData, function() {
  336. if (fieldTypes[i] == 'thumb') {
  337. pastedRow.push('');
  338. i++;
  339. }
  340. pastedRow.push($j.trim(this));
  341. i++;
  342. });
  343. pastedArray.push(pastedRow);
  344. }
  345. });
  346. break;
  347. case 'word':
  348. default:
  349. clean = fieldPasteArea.htmlClean({
  350. allowedTags:['table','tbody','tr','td']
  351. }).html();
  352. clean = clean.replace(/\n/mg, '').replace(/.*<table>/mg,'<table>').replace(/<\/table>.*/mg,'</table>');
  353. $j(clean).find('tr').each(function() {
  354. var pastedRow = [];
  355. var tableData = $j(this).find('td');
  356. if (tableData.length > 0) {
  357. var i = 0;
  358. tableData.each(function() {
  359. if (fieldTypes[i] == 'thumb') {
  360. pastedRow.push('');
  361. i++;
  362. }
  363. pastedRow.push($j(this).text());
  364. i++;
  365. });
  366. pastedArray.push(pastedRow);
  367. }
  368. });
  369. break;
  370. }
  371. fieldList.find('li:gt(0)').remove();
  372. fieldListCounter = 1;
  373. if(mode == 'append') {
  374. pastedArray = $j.merge(fieldValue, pastedArray);
  375. }
  376. prefillInputs(pastedArray);
  377. setMultiValue();
  378. pasteBox.colorbox.close();
  379. return false;
  380. });
  381. }
  382. // transform the input
  383. if (field.val() != '@INHERIT') {
  384. if (!field.hasClass('transformed')) {
  385. var jsonValue = $j.evalJSON(field.val());
  386. if (jsonValue) {
  387. if (jsonValue.constructor == Array) {
  388. fieldValue = jsonValue;
  389. fieldSettings.autoincrement = fieldValue.length + 1;
  390. } else {
  391. fieldValue = jsonValue.fieldValue;
  392. fieldSettings = jsonValue.fieldSettings;
  393. }
  394. } else {
  395. fieldValue = [];
  396. fieldSettings.autoincrement = 1;
  397. }
  398. field.hide();
  399. fieldEdit.hide();
  400. AddElementEvents(fieldListElement);
  401. // sortable
  402. if (fieldMode != 'single'){
  403. fieldList.sortable({
  404. stop : function() {
  405. setMultiValue();
  406. },
  407. axis: 'y',
  408. helper: 'clone'
  409. });
  410. }
  411. prefillInputs(fieldValue);
  412. }
  413. } else {
  414. fieldHeading.hide();
  415. fieldList.hide();
  416. field.hide();
  417. fieldClear.hide();
  418. fieldPaste.hide();
  419. }
  420. }