{"version":3,"sources":["Atrix.js"],"names":["QuerySelectorAll","node","selector","Array","from","querySelectorAll","GetAttribute","attribute","getAttribute","setAttribute","value","arguments","length","undefined","RemoveAttribute","Object","setPrototypeOf","window","Atrix","console","$this","this","document","addEventListener","event","writable","enumerable","DOMLoaded","setTimeout","EventSupport","Images","Actions","setActions","docEvent","SupportEventTypes","eventTypes","isEventSupported","eventName","EventTypeIsSupported","onEventName","select","change","submit","reset","error","load","abort","virtualDomElement","SetAttribute","defineProperty","eventType","setProperty","type","init","push","isSupported","sizes","width","options","rootMargin","getOffsetWidthFromParent","setSizes","image","setWidth","classList","contains","setImageSize","hasAttribute","setImageData","size","imgSize","x","dataset","remove","className","entries","forEach","imageObserver","isIntersecting","perfect_size","src","entry","target","unobserve","threshold","observe","section","lazyloadImages","actionElements","getCallerReference","callData","splitCallerData","caller","split","data","_setActions","element","_ref","typeEventExists","includes","log","_docEvent","callerFromPath","path","composedPath","eventPaths","eventPathsLength","_ref2","eventTypeFromPath","actionType","actionCall","body","bubbling","Search","Buttons","test","access","DomIsLoaded"],"mappings":"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","file":"atrix.min.js","sourcesContent":["(function () {\r\n function QuerySelector ( node, selector ) {\r\n return node.querySelector( selector );\r\n }\r\n /**\r\n * Standart Funktion querySelectorAll Rückgabe als Array\r\n * @param node\r\n * @param selector\r\n * @return {Array}\r\n * @constructor\r\n */\r\n function QuerySelectorAll ( node, selector ) {\r\n return Array.from( node.querySelectorAll( selector ) );\r\n }\r\n\r\n /**\r\n * Standart Funktion hasAttribute Rückgabe boolean\r\n * @param node\r\n * @param attribute\r\n * @return {boolean}\r\n * @constructor\r\n */\r\n function HasAttribute ( node, attribute ) {\r\n return node.hasAttribute( attribute );\r\n }\r\n\r\n /**\r\n * Standard Funktion getAttribute\r\n * @param node\r\n * @param attribute\r\n * @return {string}\r\n * @constructor\r\n */\r\n function GetAttribute ( node, attribute ) {\r\n return node.getAttribute( attribute );\r\n }\r\n\r\n /**\r\n * Standard Funktion setAttribute\r\n * @param node\r\n * @param attribute\r\n * @param value\r\n * @constructor\r\n */\r\n function SetAttribute ( node, attribute, value = false ) {\r\n return node.setAttribute( attribute, value );\r\n }\r\n\r\n /**\r\n * Standard Funktion removeAttribute\r\n * @param node\r\n * @param attribute\r\n * @constructor\r\n */\r\n function RemoveAttribute ( node, attribute ) {\r\n return node.removeAttribute ( attribute );\r\n }\r\n\r\n window.Atrix = function () {};\r\n Object.setPrototypeOf( window.Atrix, {\r\n\r\n init : function () {\r\n let $this = this;\r\n console.log('Atrix initializes');\r\n\r\n /* Setze Standard Event DOMContentLoaded */\r\n document.addEventListener('DOMContentLoaded', event => {\r\n /* DOM ist geladen, setzte dem Objekt Atrix eine Property DomIsLoaded zur Möglichkeit andere Events daran zu knüpfen,\r\n ohne ein weiteres DOMContentLoaded Event zu setzten\r\n */\r\n /* TODO erstellen eines Event Object in Form eines Proxy... */\r\n Object.defineProperty ( $this, 'DomIsLoaded', {\r\n value : true,\r\n writable : false,\r\n enumerable : false\r\n } );\r\n\r\n $this.DOMLoaded( event );\r\n });\r\n /* Initialisierung der Prüfung welche Events vom Browser unterstützt werden */\r\n setTimeout( () => $this.EventSupport() );\r\n /* Initialisierung des Intersection Observer für das LazyLoading der Images */\r\n setTimeout( $this.Images,1 );\r\n let Actions = $this.Actions();\r\n setTimeout( () => Actions.setActions(),1 );\r\n setTimeout( () => Actions.docEvent(),1 );\r\n },\r\n /**\r\n * Prüft ob das mit gereichte Event vom Browser unterstützt wird, gibt einen booleschen Wert zurück.\r\n *\r\n * @example EventSupport('click');\r\n * @param { string } type\r\n * @return { boolean }\r\n * @constructor\r\n */\r\n EventSupport : function ( type = 'click' ) {\r\n var [ SupportEventTypes, eventTypes ] = [\r\n {},\r\n [\r\n 'mousedown',\r\n 'mousemove',\r\n 'mouseup',\r\n 'click',\r\n //'touchstart',\r\n //'touchmove',\r\n 'touchend',\r\n 'touchcancel'\r\n ]\r\n ];\r\n var init = function () {\r\n\r\n let initEventSupport = function () {\r\n eventTypes.forEach ( function ( eventType ) {\r\n if ( !SupportEventTypes[ eventType ] ) {\r\n setProperty ( eventType );\r\n }\r\n } );\r\n };\r\n let isEventSupported = function ( eventName ) {\r\n if ( typeof (eventName) != 'string' || eventName.length === 0 ) return false;\r\n\r\n var [ tagName, onEventName ] = [\r\n {\r\n 'select' : 'input', 'change' : 'input',\r\n 'submit' : 'form', 'reset' : 'form',\r\n 'error' : 'img', 'load' : 'img', 'abort' : 'img'\r\n },\r\n 'on' + eventName.toLowerCase()\r\n ];\r\n\r\n var virtualDomElement = document.createElement ( tagName[ onEventName ] || 'div' ),\r\n EventTypeIsSupported = (onEventName in virtualDomElement);\r\n\r\n // Ergebniss ist false\r\n if ( !EventTypeIsSupported ) {\r\n\r\n try {\r\n // setzte auf das Element ein fake event als Attribute\r\n SetAttribute( virtualDomElement, onEventName, 'return;');\r\n // Prüfung ob das Attribute vom Type function ist, wenn ja ist es ein Valider Event type\r\n EventTypeIsSupported = typeof virtualDomElement[onEventName] == 'function';\r\n } catch ( e ) {}\r\n }\r\n // unset element\r\n virtualDomElement = null;\r\n\r\n return EventTypeIsSupported;\r\n };\r\n let setProperty = function ( eventType ) {\r\n\r\n // setzten einer schreibgeschützten Globalen Variable\r\n Object.defineProperty ( SupportEventTypes, eventType, {\r\n value : isEventSupported ( eventType ),\r\n writable : false,\r\n enumerable : false\r\n } );\r\n };\r\n initEventSupport();\r\n };\r\n\r\n var isSupported = function ( type ) {\r\n if ( typeof type != 'string' || type.length === 0 ) return false;\r\n if ( SupportEventTypes[ type ] === undefined ) {\r\n eventTypes.push( type );\r\n init();\r\n }\r\n return SupportEventTypes[ type ];\r\n };\r\n return isSupported( type );\r\n },\r\n Images : function () {\r\n let [ imgSize, sizes, width, options, className ] = [\r\n 0,\r\n null,\r\n null,\r\n {\r\n rootMargin: \"0px 0px 50px 0px\",\r\n threshold: 1,\r\n },\r\n 'sah_perfect_size'\r\n ];\r\n\r\n let setSizes = function ( image ) {\r\n sizes = image.dataset.size.split(',');\r\n };\r\n let getOffsetWidthFromParent = function ( node ) {\r\n return +node.parentElement.offsetWidth;\r\n };\r\n let setWidth = function ( image ) {\r\n if ( HasAttribute( image, 'width') ) {\r\n if ( getOffsetWidthFromParent( image ) < +GetAttribute(image, 'width') )\r\n width = getOffsetWidthFromParent( image );\r\n else\r\n width = GetAttribute( image,'width');\r\n } else {\r\n width = getOffsetWidthFromParent( image );\r\n }\r\n };\r\n let setImageSize = function () {\r\n for ( let size, x = sizes.length -1; x >= 0; x-- ) {\r\n size = +sizes[x];\r\n if ( size >= width ) imgSize = size;\r\n else break;\r\n }\r\n };\r\n let setImageData = function ( image ) {\r\n image.dataset.src += imgSize + 'x.' + image.dataset.type;\r\n image.width = imgSize;\r\n RemoveAttribute( image, 'data-size' );\r\n RemoveAttribute( image, 'data-type' );\r\n image.classList.remove( className );\r\n };\r\n let perfect_size = function ( image ) {\r\n if ( image.classList.contains( className ) ) {\r\n setSizes( image );\r\n setWidth( image );\r\n setImageSize();\r\n setImageData( image );\r\n }\r\n return image;\r\n };\r\n\r\n /* TODO prüfen ob else teil funktioniert */\r\n if ( !!window.IntersectionObserver ) {\r\n let imageObserver = new IntersectionObserver (function (entries) {\r\n entries.forEach(function( entry ) {\r\n\r\n if (entry.isIntersecting) {\r\n let image = perfect_size( entry.target );\r\n image.src = image.dataset.src;\r\n image.classList.remove(\"lazy_img\");\r\n imageObserver.unobserve(image);\r\n }\r\n });\r\n }, options );\r\n\r\n let initImageObserver = function () {\r\n let lazyloadImages = QuerySelectorAll( document, \".lazy_img\");\r\n lazyloadImages.forEach(function( section ){\r\n imageObserver.observe( section );\r\n });\r\n };\r\n initImageObserver();\r\n } else {\r\n let lazyloadImages = QuerySelectorAll( document, \".lazy_img\");\r\n lazyloadImages.forEach(function( image ){\r\n image = perfect_size( image.target );\r\n image.src = image.dataset.src;\r\n });\r\n }\r\n\r\n },\r\n Actions : function () {\r\n let $this = this;\r\n let actionElements = null,\r\n eventTypes = [\r\n 'click',\r\n 'DOMContentLoaded'\r\n ];\r\n\r\n /**\r\n * Splitte Caller Informationen nach Delimiter '.'\r\n * @param callData\r\n * @return {*|string[]}\r\n */\r\n let splitCallerData = function ( callData ) {\r\n return callData.split('.');\r\n };\r\n /**\r\n * Generiere des Call Aufruf, window.Atrix wird als Basis Object gesetzt.\r\n * Iteration Über das Array callData, wobei caller immer tiefer ins Object geht und Referenz zur Funktion zurück gibt.\r\n * @param callData\r\n * @return {any}\r\n */\r\n let getCallerReference = function ( callData ) {\r\n if ( callData === null ) return null;\r\n var caller = $this;\r\n splitCallerData(callData).forEach(function(data) {\r\n caller = caller[data];\r\n });\r\n return caller;\r\n };\r\n let typeEventExists = function ( type ) {\r\n return eventTypes.includes( type );\r\n };\r\n /**\r\n * dynamisches setzen der Events\r\n *\r\n * Ablauf\r\n * => hole alle Elemente mit data-action=\"true\"\r\n * => in data-action-type=\"type\" enthält den Event Typen\r\n * => data-action-call=\"Object.function\" enthält die Funktion die auf das Event folgen soll\r\n */\r\n let setActions = function () {\r\n\r\n /* hole alle Elemente die mit data-action=\"true\" gesetzt sind */\r\n let actionElements = QuerySelectorAll( document, '[data-action=\"true\"]');\r\n\r\n\r\n /* iteriere über alle Elemente */\r\n actionElements.forEach( function ( element ) {\r\n\r\n var [ type, caller ] = [ GetAttribute( element, 'data-action-type' ), getCallerReference( GetAttribute( element, 'data-action-call') ) ];\r\n\r\n console.log('setAction: ', type, $this.EventSupport( type ) );\r\n if ( !!type && typeEventExists( type ) && !!caller ) {\r\n switch (type) {\r\n case 'DOMContentLoaded' :\r\n document.addEventListener( type, caller );\r\n break;\r\n default :\r\n // setTimeout( () => element.addEventListener( type, caller ), 1 );\r\n }\r\n } else {\r\n console.log('');\r\n }\r\n });\r\n };\r\n\r\n /**\r\n *\r\n */\r\n let docEvent = function () {\r\n\r\n const bubbling = function ( event ) {\r\n\r\n var [ x, eventType, eventPaths, eventPathsLength, path, callerFromPath, eventTypeFromPath ] = [ 0, event.type, event.path || (event.composedPath && event.composedPath()) ];\r\n\r\n /* TODO Fallback für Events erstellen falls ein Event vom Browser nicht unterstützt wird */\r\n\r\n console.log('docEvent => bubbling: ', eventType, $this.EventSupport( eventType ) );\r\n /**\r\n * Itteratiion über die Dom Elemente die beim bubbling mitgereicht werden\r\n */\r\n console.log('eventPaths: ', eventPaths );\r\n console.log('eventPaths.length: ', eventPaths.length );\r\n console.log( event );\r\n for ( eventPathsLength = eventPaths.length; x < eventPathsLength && path !== null; ) {\r\n path = eventPaths[ x ];\r\n\r\n /*\r\n * Prüfe ob das aktuelle Element die Informationen dataset actionType und dataset actionCall aufweisen\r\n */\r\n if ( !!path.dataset.actionType && !!path.dataset.actionCall ) {\r\n\r\n callerFromPath = getCallerReference( path.dataset.actionCall );\r\n eventTypeFromPath = path.dataset.actionType;\r\n\r\n if ( eventType === eventTypeFromPath ) {\r\n callerFromPath( event );\r\n }\r\n }\r\n\r\n if ( path.id !== '' || path === document.body ) {\r\n path = null;\r\n x = eventPathsLength;\r\n } else {\r\n path = eventPaths[ ++x ];\r\n }\r\n }\r\n }\r\n document.addEventListener('click', function ( event ) {\r\n bubbling( event );\r\n });\r\n };\r\n return {\r\n docEvent : () => docEvent(),\r\n setActions : () => setActions()\r\n };\r\n },\r\n Search : {\r\n dispatch : function () {\r\n\r\n }\r\n },\r\n Buttons : {\r\n chat : function () {\r\n let test = 1;\r\n\r\n console.log('click chat button');\r\n console.log(test++ + ' action');\r\n },\r\n access : function () {\r\n return this;\r\n }\r\n },\r\n DOMLoaded : function ( event ) {\r\n console.log( 'DomIsLoaded: ', this.DomIsLoaded );\r\n let test = function ( event ) {\r\n console.log('DomLoaded', event );\r\n };\r\n test( event );\r\n }\r\n });\r\n window.Atrix.init();\r\n})();"]}