Advertisement
Guest User

Untitled

a guest
Feb 8th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.47 KB | None | 0 0
  1. (function( globalContext, libraryName ){
  2. "use strict";
  3.  
  4. let libraryContext = {};
  5.  
  6.  
  7. (function( moduleName ) {
  8.  
  9. class Event {
  10. constructor() {
  11. initialization();
  12. document.addEventListener('dblclick', addNewEventToCalendar)
  13. }
  14. }
  15.  
  16. function checktypeOfCalendar() {
  17. let container = document.getElementById( 'big-calendar' );
  18. let contClass = container.className;
  19.  
  20. switch ( contClass ) {
  21. case 'month-table':
  22. return 'month';
  23. case 'week-table':
  24. return 'week';
  25. case 'workweek-table':
  26. return 'week';
  27. default:
  28. throw new Error("Календарь не определен");
  29. }
  30. }
  31.  
  32. function initialization() {
  33. getEventsData( '../data/events.json' );
  34. }
  35.  
  36. function addNewEventToCalendar(e) {
  37. let data = newEventData();
  38.  
  39. foreachEvents( data );
  40. }
  41.  
  42. function getEventsData( url ) {
  43.  
  44. fetch( url )
  45. .then(function( response ) {
  46. if ( response.status !== 200 ) {
  47. console.log(`Looks like there was a problem. Status Code: ${response.status}`);
  48. return;
  49. }
  50.  
  51. response.json().then(function( data ) {
  52. foreachEvents( data.events );
  53. });
  54. })
  55. .catch(function( err ) {
  56. console.log('Fetch Error', err);
  57. });
  58. }
  59.  
  60. function foreachEvents( data ) {
  61. let layout = document.querySelector( '.big-calendar-layout' );
  62. let events = [];
  63. let event, parent, options;
  64.  
  65. console.log(data.length)
  66. if (data.length === 1) {
  67. event = createEvent(data);
  68. parent = getEventParent( data );
  69. options = getEventOptions( parent );
  70.  
  71. event.parent = parent;
  72.  
  73. addEventOptions( event, options );
  74. events.push( event );
  75. layout.appendChild( event );
  76. } else {
  77. for (let i = 0; i < data.length; i++) {
  78. event = createEvent(data[ i ]);
  79. parent = getEventParent( data[ i ] );
  80. options = getEventOptions( parent );
  81.  
  82. event.parent = parent;
  83.  
  84. addEventOptions( event, options );
  85. events.push( event );
  86. layout.appendChild( event );
  87. }
  88. }
  89.  
  90. dragEvent( event, parent );
  91.  
  92. if ( checktypeOfCalendar() === 'week' ) {
  93. resizeEvent( events, parent );
  94. }
  95.  
  96. window.addEventListener('resize', resizeAllEvents)
  97.  
  98. }
  99.  
  100. function newEventData() {
  101. let data = {};
  102. let date = new Date();
  103.  
  104. data.startHour = date.getHours();
  105. data.startMinutes = '00';
  106. data.length = 1;
  107. data.day = date.getDay();
  108. data.date = date.getDate();
  109. data.month = date.getMonth();
  110. data.title = 'Новое событие';
  111.  
  112. return data;
  113. }
  114.  
  115. function createEvent( data ) {
  116. let event = document.createElement( 'div' );
  117.  
  118. event.className = 'event-container';
  119. event.innerHTML = data.title;
  120.  
  121. event.setAttribute( 'startHour', data.startHour );
  122. event.setAttribute( 'startMinutes', data.startMinutes );
  123. event.setAttribute( 'length', data.length );
  124. event.setAttribute( 'day', data.day );
  125. event.setAttribute( 'date', data.date );
  126. event.setAttribute( 'month', data.month );
  127.  
  128. return event;
  129. }
  130.  
  131. function getEventParent( data ) {
  132. let container = document.getElementById( 'big-calendar' );
  133. let selectorWeek = `.date-container[hour='${data.startHour}'][minutes='${data.startMinutes}'][date='${data.date}'][day='${data.day}']`;
  134. let selectorMonth = `.date-container[month='${data.month}'][date='${data.date}']`;
  135. let parent;
  136.  
  137. if ( checktypeOfCalendar() === 'month' ) {
  138. parent = container.querySelector( selectorMonth );
  139. } else if ( checktypeOfCalendar() === 'week' ) {
  140. parent = container.querySelector( selectorWeek );
  141. }
  142.  
  143. console.log(selectorWeek)
  144.  
  145. return parent;
  146. }
  147.  
  148. function getEvent() {
  149. let event = addEventOptions();
  150.  
  151. return event;
  152. }
  153.  
  154. function getEventOptions( parent ) {
  155. let width = parent.offsetWidth;
  156. let height = parent.offsetHeight;
  157. let posX = parent.offsetLeft;
  158. let posY = parent.offsetTop;
  159. let options = new Map();
  160.  
  161. options.set('width', width)
  162. options.set('height', height)
  163. options.set('posX', posX)
  164. options.set('posY', posY)
  165.  
  166. return options;
  167. }
  168.  
  169. function addEventOptions( event, options ) {
  170. event.style.width = `${options.get( 'width' )}px`;
  171. event.style.height = `${options.get( 'height' ) * 2 * event.getAttribute( 'length' )}px`;
  172. event.style.left = `${options.get( 'posX' )}px`;
  173. event.style.top = `${options.get( 'posY' )}px`;
  174.  
  175. if ( checktypeOfCalendar() === 'month' ) {
  176. event.style.height = `${options.get( 'height' )}px`;
  177. }
  178.  
  179. return event;
  180. }
  181.  
  182. function appendEvent() {
  183. let container = document.querySelector( '.big-calendar-layout' );
  184. let event = getEvent();
  185. dragEvent( event );
  186.  
  187. if ( checktypeOfCalendar() === 'week' ) {
  188. resizeEvent( event );
  189. }
  190.  
  191. container.appendChild( event )
  192. }
  193.  
  194. function dragEvent( element, parent ) {
  195. let container = document.getElementById( 'big-calendar' );
  196. let model = container.querySelectorAll( '.date-container' );
  197. let modelFirst = model[0];
  198. let modelLast = model[model.length- 1];
  199. let dragObject = {};
  200.  
  201. function findTarget( element ) {
  202. for (let k = 0; k < model.length; k++) {
  203. if ( model[ k ].offsetLeft >= (element.offsetLeft - (element.offsetWidth * 0.5))
  204. && model[ k ].offsetTop <= element.offsetTop + 5
  205. && model[ k ].offsetTop >= element.offsetTop - 5 )
  206. {
  207. return model[ k ];
  208. }
  209. }
  210. }
  211.  
  212. function onMouseDown(e) {
  213. if (e.which !== 1) return;
  214.  
  215. let elem = e.target;
  216.  
  217. if (elem.className !== element.className) return;
  218.  
  219. dragObject.elem = elem;
  220. dragObject.posX = e.pageX;
  221. dragObject.posY = e.pageY;
  222. dragObject.width = elem.offsetWidth;
  223. dragObject.height = elem.offsetHeight;
  224. }
  225.  
  226. function onMouseMove(e) {
  227. if (!dragObject.elem) return;
  228.  
  229. let target = findTarget( dragObject.elem );
  230. let stepX = target.offsetWidth;
  231. let stepY = target.offsetHeight;
  232. let elemOption = dragObject.elem.getBoundingClientRect();
  233.  
  234. if (e.pageX > elemOption.left + elemOption.width)
  235. {
  236. let newOffsetX = dragObject.elem.offsetLeft;
  237.  
  238. dragObject.posX += stepX;
  239. newOffsetX += stepX;
  240.  
  241. if (e.target.hasAttribute( 'date' )) {
  242. newOffsetX = e.target.offsetLeft;
  243. dragObject.elem.style.width = `${e.target.offsetWidth}px`;
  244. }
  245.  
  246. if ( newOffsetX <= modelLast.offsetLeft + modelLast.offsetWidth - 10 ) {
  247. dragObject.elem.style.left = `${newOffsetX}px`;
  248. }
  249. }
  250. else if (e.pageX < elemOption.left)
  251. {
  252. let newOffsetX = dragObject.elem.offsetLeft;
  253.  
  254. dragObject.posX -= stepX;
  255. newOffsetX -= stepX;
  256.  
  257. if (e.target.hasAttribute( 'date' )) {
  258. newOffsetX = e.target.offsetLeft;
  259. dragObject.elem.style.width = `${e.target.offsetWidth}px`;
  260. }
  261.  
  262. if ( newOffsetX >= modelFirst.offsetLeft - 10 ) {
  263. dragObject.elem.style.left = `${newOffsetX}px`;
  264. }
  265. }
  266.  
  267.  
  268. if (e.pageY > elemOption.top + stepY)
  269. {
  270. let newOffsetY = dragObject.elem.offsetTop;
  271.  
  272. dragObject.posY += stepY;
  273. newOffsetY += stepY;
  274.  
  275. if ( newOffsetY + dragObject.height <= modelLast.offsetTop + modelLast.offsetHeight + 10 ) {
  276. dragObject.elem.style.top = `${newOffsetY}px`;
  277. }
  278. }
  279. else if (e.pageY < elemOption.top)
  280. {
  281. let newOffsetY = dragObject.elem.offsetTop;
  282.  
  283. dragObject.posY -= stepY;
  284. newOffsetY -= stepY;
  285.  
  286. if ( newOffsetY >= modelFirst.offsetTop - 10 ) {
  287. dragObject.elem.style.top = `${newOffsetY}px`;
  288. }
  289. }
  290.  
  291. dragObject.lastTarget = target;
  292. }
  293.  
  294. function onMouseUp(e) {
  295. if (!dragObject.elem) return;
  296.  
  297. let lastTarget = findTarget( dragObject.elem );
  298. let elem = dragObject.elem;
  299.  
  300. if ( dragObject.lastTarget ) {
  301. elem.parent = lastTarget;
  302.  
  303. elem.setAttribute( 'startHour', lastTarget.getAttribute( 'hour' ) || elem.getAttribute( 'hour' ));
  304. elem.setAttribute( 'startMinutes', lastTarget.getAttribute( 'minutes' ) || elem.getAttribute( 'minutes' ));
  305. elem.setAttribute( 'day', lastTarget.getAttribute( 'day' ) || elem.getAttribute( 'day' ));
  306. elem.setAttribute( 'date', lastTarget.getAttribute( 'date' ) || elem.getAttribute( 'date' ));
  307. elem.setAttribute( 'month', lastTarget.getAttribute( 'month' ) || elem.getAttribute( 'month' ));
  308.  
  309. }
  310.  
  311. dragObject = {};
  312. }
  313.  
  314. document.addEventListener('mousedown', onMouseDown)
  315. document.addEventListener('mousemove', onMouseMove)
  316. document.addEventListener('mouseup', onMouseUp)
  317. }
  318.  
  319.  
  320. function resizeEvent( elements, parent ) {
  321. let container = document.getElementById( 'big-calendar' );
  322. let model = container.querySelectorAll( '.date-container' );
  323. let modelFirst = model[0];
  324. let modelLast = model[model.length- 1];
  325. let resizeObject = {};
  326. let element;
  327. let ancor;
  328.  
  329. for ( let i = 0; i < elements.length; i++ ) {
  330. ancor = document.createElement( 'div' );
  331. ancor.className = 'resize-ancor';
  332.  
  333. elements[ i ].appendChild( ancor );
  334. }
  335.  
  336. function onMouseDown(e) {
  337. if (e.which != 1) return;
  338.  
  339. let elem = e.target.parentElement;
  340.  
  341. if (elem.className !== ancor.parentElement.className) return;
  342.  
  343. resizeObject.elem = elem;
  344. resizeObject.height = elem.offsetHeight;
  345. }
  346.  
  347. function onMouseMove(e) {
  348. if (!resizeObject.elem) return;
  349.  
  350. let step = modelFirst.offsetHeight;
  351. let elemOption = resizeObject.elem.children[0].getBoundingClientRect();
  352.  
  353. if (e.pageY > elemOption.top + step)
  354. {
  355. let newHeight = resizeObject.elem.offsetHeight;
  356.  
  357. resizeObject.height += step;
  358. newHeight += step;
  359.  
  360. if ( newHeight + resizeObject.elem.offsetTop <= modelLast.offsetTop + modelLast.offsetHeight + 10 ) {
  361. resizeObject.elem.setAttribute( 'length', (+resizeObject.elem.getAttribute( 'length' ) + 0.5) );
  362. resizeObject.elem.style.height = `${newHeight}px`;
  363. }
  364. }
  365. else if (e.pageY < elemOption.top)
  366. {
  367. let newHeight = resizeObject.elem.offsetHeight;
  368.  
  369. resizeObject.height -= step;
  370. newHeight -= step;
  371.  
  372. if ( newHeight >= modelFirst.offsetTop - 10 ) {
  373. resizeObject.elem.setAttribute( 'length', (+resizeObject.elem.getAttribute( 'length' ) - 0.5) );
  374. resizeObject.elem.style.height = `${newHeight}px`;
  375. }
  376. }
  377. }
  378.  
  379. function onMouseUp(e) {
  380. if (!resizeObject.elem) return;
  381.  
  382. resizeObject = {};
  383. }
  384.  
  385. document.addEventListener('mousedown', onMouseDown)
  386. document.addEventListener('mousemove', onMouseMove)
  387. document.addEventListener('mouseup', onMouseUp)
  388. }
  389.  
  390. function resizeAllEvents() {
  391. let events = document.querySelectorAll( '.event-container' );
  392. let event, parent, options;
  393.  
  394. for ( let i = 0; i < events.length; i++ ) {
  395. event = events[ i ];
  396. parent = event.parent;
  397. options = getEventOptions( parent );
  398.  
  399. addEventOptions( events[ i ], options )
  400. }
  401. }
  402.  
  403.  
  404. libraryContext[ moduleName ] = Event;
  405.  
  406. })( "Events" );
  407.  
  408. globalContext[ libraryName ] = libraryContext;
  409.  
  410. })( window, 'EventPlugin' )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement