From 6750762449f50fc5259fcbfc4d6aefc64515bbe9 Mon Sep 17 00:00:00 2001 From: Maximilian Lauterbach Date: Fri, 22 Apr 2016 13:32:16 +0200 Subject: [PATCH 1/6] removed plentymarketsCMStools.js.map 'cause of conflicts if you tried to debug in browser use of waitscreen is possible in markup now (UI.js) improved modal handling in checkout, if shipping address changes (CheckoutService.js) adapted validation of required form fields (ValidationService.js) --- GruntFile.js | 3 +- dist/plentymarketsCMStools-1.0.8.js | 96 +- dist/plentymarketsCMStools-1.0.8.js.map | 1 - dist/plentymarketsCMStools-1.0.8.min.js | 6 +- dist/plentymarketsCMStools-1.0.8.min.js.map | 931 +++++++++++++++++++- src/directives/UI.js | 24 +- src/services/CheckoutService.js | 67 +- src/services/ValidationService.js | 6 +- tools/scripts.json | 22 - 9 files changed, 1051 insertions(+), 105 deletions(-) delete mode 100644 dist/plentymarketsCMStools-1.0.8.js.map delete mode 100644 tools/scripts.json diff --git a/GruntFile.js b/GruntFile.js index caee9de..1a35684 100644 --- a/GruntFile.js +++ b/GruntFile.js @@ -42,7 +42,7 @@ module.exports = function( grunt ) concat: { debug: { options: { - sourceMap: true + sourceMap: false }, src : [ 'tmp/templates.js', @@ -78,7 +78,6 @@ module.exports = function( grunt ) options: { sourceMap : true, sourceMapIncludeSources: true, - sourceMapIn : 'debug/<%= pkg.name %>-<%= pkg.version %>.js.map', banner : '/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n*/' }, files : { diff --git a/dist/plentymarketsCMStools-1.0.8.js b/dist/plentymarketsCMStools-1.0.8.js index ad1222f..c758838 100644 --- a/dist/plentymarketsCMStools-1.0.8.js +++ b/dist/plentymarketsCMStools-1.0.8.js @@ -1380,7 +1380,7 @@ TemplateCache["waitscreen/waitscreen.html"] = "
marked with * data-plenty-checkout-form="guestRegistration" @@ -4692,9 +4712,10 @@ PlentyFramework.cssClasses = { if ( response.error.error_stack[i].code == 651 ) { // notify atriga validation errors - Checkout.reloadContainer( 'MethodsOfPaymentList' ).done(function() { - $(document).trigger('plenty.AtrigaValidationFailed'); - }); + Checkout.reloadContainer( 'MethodsOfPaymentList' ).done( function() + { + $( document ).trigger( 'plenty.AtrigaValidationFailed' ); + } ); } else { @@ -4703,9 +4724,9 @@ PlentyFramework.cssClasses = { } // display remaining errors - if( errorStack.length > 0 ) + if ( errorStack.length > 0 ) { - UI.printErrors(errorStack); + UI.printErrors( errorStack ); } } catch ( e ) @@ -4739,10 +4760,10 @@ PlentyFramework.cssClasses = { } */ - if( !paymentID ) + if ( !paymentID ) { // FIX for older callisto layouts (< 3.3): get payment id from input field - paymentID = $('input[name="MethodOfPaymentID"]:checked').val(); + paymentID = $( 'input[name="MethodOfPaymentID"]:checked' ).val(); } Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID; @@ -6355,7 +6376,7 @@ PlentyFramework.cssClasses = { var hasError = false; // check every required input inside form - $form.find( '[data-plenty-validate], input.Required' ).each( function( i, elem ) + $form.find( '[data-plenty-validate], :required' ).each( function( i, elem ) { attrValidate = $( elem ).attr( 'data-plenty-validate' ); formControls = getFormControl( elem ) @@ -6656,5 +6677,4 @@ var plenty = PlentyFramework.getInstance(); jQuery( document ).ready( function() { plenty.bindDirectives(); -} ); -//# sourceMappingURL=plentymarketsCMStools-1.0.8.js.map \ No newline at end of file +} ); \ No newline at end of file diff --git a/dist/plentymarketsCMStools-1.0.8.js.map b/dist/plentymarketsCMStools-1.0.8.js.map deleted file mode 100644 index bc6d9e2..0000000 --- a/dist/plentymarketsCMStools-1.0.8.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../tmp/templates.js","../libs/mustache.min.js","../tmp/plentyFramework.js","../src/directives/Authentication.js","../src/directives/Basket.js","../src/directives/Checkout.js","../src/directives/MobileDropdown.js","../src/directives/Redirect.js","../src/directives/Tab.js","../src/directives/UI.js","../src/directives/Validator.js","../src/factories/APIFactory.js","../src/factories/CMSFactory.js","../src/factories/CheckoutFactory.js","../src/factories/ModalFactory.js","../src/factories/UIFactory.js","../src/factories/yuidoc-module.js","../src/helpers/Object.equals.js","../src/partials/cssClasses.js","../src/partials/error/error.js","../src/partials/modal/modal.js","../src/partials/partialsInitialization.js","../src/partials/waitscreen/waitscreen.js","../src/services/AddressDoctorService.js","../src/services/AuthenticationService.js","../src/services/BasketService.js","../src/services/CheckoutService.js","../src/services/FeedbackService.js","../src/services/MediaSizeService.js","../src/services/NavigatorService.js","../src/services/PostfinderService.js","../src/services/SocialShareService.js","../src/services/ValidationService.js","../src/services/yuidoc-module.js","../src/plentyFrameworkCompiler.js"],"names":[],"mappings":"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","file":"plentymarketsCMStools-1.0.8.js","sourcesContent":["var TemplateCache = {};\n\nTemplateCache[\"addressSuggestions/addressDoctor.html\"] = \"\";\n\nTemplateCache[\"addressSuggestions/postFinder.html\"] = \"{{#addresses}}\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"{{/addresses}}\\n\" +\n \"\";\n\nTemplateCache[\"error/errorMessage.html\"] = \"
\\n\" +\n \" Code {{code}}:\\n\" +\n \" {{{message}}}\\n\" +\n \"
\\n\" +\n \"\";\n\nTemplateCache[\"error/errorPopup.html\"] = \"
\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\";\n\nTemplateCache[\"modal/modal.html\"] = \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\\n\" +\n \" {{#title}}\\n\" +\n \"
\\n\" +\n \" \\n\" +\n \"

{{{title}}}

\\n\" +\n \"
\\n\" +\n \" {{/title}}\\n\" +\n \"\\n\" +\n \"
{{{content}}}
\\n\" +\n \"\\n\" +\n \"
\\n\" +\n \"\\n\" +\n \" {{#labelDismiss}}\\n\" +\n \" \\n\" +\n \" {{/labelDismiss}}\\n\" +\n \"\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\";\n\nTemplateCache[\"waitscreen/waitscreen.html\"] = \"
\";\n","(function defineMustache(global,factory){if(typeof exports===\"object\"&&exports&&typeof exports.nodeName!==\"string\"){factory(exports)}else if(typeof define===\"function\"&&define.amd){define([\"exports\"],factory)}else{global.Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)===\"[object Array]\"};function isFunction(object){return typeof object===\"function\"}function typeStr(obj){return isArray(obj)?\"array\":typeof obj}function escapeRegExp(string){return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")}function hasProperty(obj,propName){return obj!=null&&typeof obj===\"object\"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"/\":\"/\"};function escapeHtml(string){return String(string).replace(/[&<>\"'\\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\\s*/;var spaceRe=/\\s+/;var equalsRe=/\\s*=/;var curlyRe=/\\s*\\}/;var tagRe=/#|\\^|\\/|>|\\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile===\"string\")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error(\"Invalid tags: \"+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+\"\\\\s*\");closingTagRe=new RegExp(\"\\\\s*\"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp(\"\\\\s*\"+escapeRegExp(\"}\"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===\"\"};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return\"\";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail=\"\";break;case 0:match=\"\";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={\".\":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(\".\")>0){value=context.view;names=name.split(\".\");index=0;while(value!=null&&index\")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol===\"&\")value=this.unescapedValue(token,context);else if(symbol===\"name\")value=this.escapedValue(token,context);else if(symbol===\"text\")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer=\"\";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j\n * =====================================================================================\n */\n\n/**\n * @module PlentyFramework\n */\n(function( $ )\n{\n // will be overridden by grunt\n var version = \"1.0.8\";\n\n /**\n * Collection of uncompiled registered factories & services.\n * See {{#crossLink \"PlentyFramework/compile:method\"}}.compile(){{/crossLink}}\n * @attribute components\n * @static\n * @type {{factories: {}, services: {}}}\n */\n var components = {\n factories : {},\n services : {},\n directives: {}\n };\n\n /**\n * Framework providing client functions for plentymarkets Webshops.\n * @class PlentyFramework\n * @constructor\n */\n PlentyFramework = function()\n {\n };\n\n var instance = null;\n PlentyFramework.getInstance = function()\n {\n instance = instance || new PlentyFramework();\n return instance;\n };\n\n PlentyFramework.version = (function() {\n\n return {\n get: function() {\n return version;\n },\n equals: function( v ) {\n return compare(v) == 0;\n },\n compare: compare\n };\n\n function compare( compare )\n {\n var localVersion = version.split(\".\");\n var compareVersion = compare.split(\".\");\n\n for( var i = 0; i < compareVersion.length; i++ )\n {\n if( localVersion[i] === compareVersion[i] || compareVersion[i] === \"*\" )\n {\n continue;\n }\n\n if( parseInt(localVersion[i]) < parseInt(compareVersion[i]) )\n {\n return -1;\n }\n\n if( parseInt(localVersion[i]) > parseInt(compareVersion[i]) )\n {\n return 1;\n }\n }\n return 0;\n }\n\n })();\n\n /**\n * Customizable controls for partials will be injected here.\n * (e.g. Modal)\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.partials = {};\n\n /**\n * Collection of registered global variables\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.globals = {};\n\n /**\n * Set a global variable.\n * @function setGlobal\n * @static\n * @param {string} identifier A unique identifier to reference this variable\n * @param {*} value The value to set\n * @return {*} The value\n */\n PlentyFramework.setGlobal = function( identifier, value )\n {\n if ( PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n console.error( 'Global variable \"' + identifier + '\" already exists and cannot be overridden.' );\n return null;\n }\n\n PlentyFramework.globals[identifier] = value;\n\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Get the value of a global variable or undefined if not exists\n * @function getGlobal\n * @static\n * @param identifier The identifier of the requested variable\n * @return {*} The value of the variable\n */\n PlentyFramework.getGlobal = function( identifier, fallbackValue )\n {\n if( !PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n return fallbackValue;\n }\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Collection of registered directives\n * @type {Array}\n * @static\n */\n PlentyFramework.directives = {};\n\n /**\n * Register directive. Directives can be bound to dynamically added nodes by calling pm.bindPlentyFunctions();\n * @function directive\n * @static\n * @param {string} selector jQuery selector of the DOM-elements to bind the directive to\n * @param {function} callback Function to add directives behaviour\n * @param {Array} dependencies List of required services. Services will be passed to callback function\n * @param {boolean} allowDuplicates Defines if a directive can be bound to the same element multiple times\n * @return {object} The created directive\n */\n PlentyFramework.directive = function( directiveName, directiveFunctions, dependencies )\n {\n // Catch type mismatching for 'directiveName'\n if ( typeof directiveName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof directiveName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof directiveFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof directiveFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.directives[directiveName] = {\n name : directiveName,\n dependencies: dependencies,\n setup : directiveFunctions\n };\n };\n\n /**\n * Bind registered directives.\n * @function bindDirectives\n * @param {string} [directiveSelector] restrict binding to elements matching this selector\n */\n PlentyFramework.prototype.bindDirectives = function( rootElement )\n {\n\n rootElement = rootElement || 'html';\n\n $( rootElement ).find( '[data-plenty]' ).each( function( i, element )\n {\n\n var directives = parseDirectives( $( element ).attr( 'data-plenty' ), $( element ) );\n\n if ( directives.length <= 0 )\n {\n // continue\n return;\n }\n\n addCustomEvents( element );\n\n for ( var i = 0; i < directives.length; i++ )\n {\n var directive = directives[i];\n if ( !!PlentyFramework.directives[directive.class] && PlentyFramework.directives.hasOwnProperty( directive.class ) )\n {\n\n var callback = PlentyFramework.directives[directive.class][directive.method];\n if ( !!callback && typeof callback == \"function\" )\n {\n\n if ( directive.event == \"ready\" )\n {\n callback.apply( null, directive.params );\n }\n else\n {\n bindEventCallback( $( element ), directive.event, callback, directive.params );\n /*\n $( element ).on( directive.event, function( e )\n {\n directive = injectEvent( directive, e );\n return callback.apply( null, directive.params );\n } );\n */\n }\n\n }\n else\n {\n console.error( \"Method not found: \" + directive.method + \" in \" + directive.class );\n }\n\n }\n else\n {\n console.error( \"Directive not found: \" + directive.class );\n }\n }\n } );\n\n $( document ).trigger( 'initPartials', rootElement );\n };\n\n var eventStack = [];\n\n PlentyFramework.getRecentEvent = function( eventType )\n {\n var lastEventIdx = eventStack.length - 1;\n if ( !eventType )\n {\n return eventStack[lastEventIdx];\n }\n else\n {\n for ( var i = lastEventIdx; i >= 0; i-- )\n {\n if ( eventType == eventStack[i].type )\n {\n return eventStack[i];\n }\n }\n }\n\n return null;\n\n };\n\n PlentyFramework.pushEvent = function( event )\n {\n eventStack.push( event );\n };\n\n /**\n * Bind event to element by eventType.\n * If cms says \"click:Foo.bar(this, event)\" eventType is \"click\".\n *\n * @param $elem - jQuery object on which event was triggered\n * @param eventType - type of event\n * @param callback - callback function of directive [example: \"bar(this, event)\"]\n * @param params - list of parameters for callback function.\n */\n function bindEventCallback( $elem, eventType, callback, params )\n {\n $elem.on( eventType, function( event )\n {\n eventStack.push( event );\n return callback.apply( null, params );\n } );\n\n if( document.readyState === \"complete\" && eventType === \"ready\" )\n {\n // execute 'ready' directives directly if document is already loaded\n callback.apply( null, params );\n }\n }\n\n function addCustomEvents( element )\n {\n\n var $elem = $( element );\n\n if ( $elem.is( 'input[type=\"checkbox\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n if ( $elem.is( ':checked' ) )\n {\n $elem.trigger( 'check' );\n }\n else\n {\n $elem.trigger( 'uncheck' );\n }\n } );\n }\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n var radioGroup = $elem.attr( 'name' );\n\n $( 'input[type=\"radio\"][name=\"' + radioGroup + '\"]' ).each( function( i, radio )\n {\n var $radio = $( radio );\n if ( $radio.is( ':checked' ) )\n {\n $radio.trigger( 'check' );\n }\n else\n {\n $radio.trigger( 'uncheck' );\n }\n\n } );\n\n } );\n }\n }\n\n function parseDirectives( input, thisValue )\n {\n var directivePattern = /^(([\\w]+):)?([\\w]+)\\.([\\w]+)(\\((.*)\\))?$/;\n var expressions = input.split( ';' );\n var directives = [];\n\n for ( var i = 0; i < expressions.length; i++ )\n {\n var expression = expressions[i].trim();\n\n if ( !expression )\n {\n continue;\n }\n\n if ( !directivePattern.test( expression ) )\n {\n // console.warn( \"Invalid directive: \" + expression );\n continue;\n }\n\n var match = expression.match( directivePattern );\n\n if ( !match[3] || match[3].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Class name not set.\" );\n continue;\n }\n\n if ( !match[4] || match[4].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Method not set.\" );\n continue;\n }\n\n var directive = {\n event : match[2] || 'ready',\n class : match[3],\n method: match[4],\n params: []\n };\n\n if ( !!match[6] && match[6].length > 0 )\n {\n var params = match[6].match( /(['][^']+['])|([\\w-]+)|([\"][^\"]+[\"])/g );\n for ( var j = 0; j < params.length; j++ )\n {\n var param = params[j].trim();\n if ( !isNaN( parseFloat( param ) ) )\n {\n directive.params.push( parseFloat( param ) );\n }\n else if ( param.toLowerCase() == 'true' )\n {\n directive.params.push( true );\n }\n else if ( param.toLowerCase() == 'false' )\n {\n directive.params.push( false );\n }\n else if ( param.toLowerCase() == 'this' )\n {\n directive.params.push( thisValue );\n }\n else\n {\n directive.params.push( param.replace( /^['\"]|['\"]$/g, '' ) );\n }\n }\n }\n\n directives.push( directive );\n\n }\n return directives;\n }\n\n /**\n * Register a new service\n * @function service\n * @static\n * @param {string} serviceName Unique identifier of the service to get/ create\n * @param {function} serviceFunctions Callback containing all public functions of this service.\n * @param {Array} [dependencies] Identifiers of required services to inject in serviceFunctions\n * @return {object} The object described in serviceFunctions(). Can be received via\n * PlentyFramework.[serviceName]\n */\n PlentyFramework.service = function( serviceName, serviceFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof serviceName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof serviceName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof serviceFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof serviceFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.services[serviceName] = {\n name : serviceName,\n dependencies: dependencies,\n setup : serviceFunctions\n };\n\n };\n\n /**\n * Collection of compiled factories\n * @attribute factories\n * @static\n * @type {object}\n */\n PlentyFramework.factories = {};\n\n /**\n * Register a new factory\n * @function factory\n * @static\n * @param {string} factoryName A unique name of the new factory\n * @param {function} factoryFunctions The function describing the factory\n * @param {Array} dependencies List of required factories to inject\n */\n PlentyFramework.factory = function( factoryName, factoryFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof factoryName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof factoryName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof factoryFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof factoryFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n components.factories[factoryName] = {\n name : factoryName,\n dependencies: dependencies,\n setup : factoryFunctions\n }\n\n };\n\n /**\n * Renders html template. Will provide given data to templates scope.\n * Uses Mustache syntax for data-binding.\n * @function compileTemplate\n * @static\n * @param {String} template relative path to partials template to load. Base path = '/src/partials/'\n * @param {Object} data data to privide to templates scope.\n * @returns {String} The rendered html string\n */\n PlentyFramework.compileTemplate = function( template, data )\n {\n data = data || {};\n data.translate = function()\n {\n return function( text, render )\n {\n return render( PlentyFramework.translate( text ) );\n };\n };\n return Mustache.render( TemplateCache[template], data );\n };\n\n /**\n * The path on the server where the script is located in.\n * @attribute\n * @static\n * @type {String}\n */\n PlentyFramework.scriptPath = '';\n\n /**\n * Collection of locale strings will be injected here after reading language file.\n * @attribute\n * @static\n * @type {Object}\n */\n PlentyFramework.Strings = {};\n\n /**\n * Load language file containing translations of locale strings.\n * @function loadLanguageFile\n * @static\n * @param fileName relative path to language file.\n */\n PlentyFramework.loadLanguageFile = function( fileName )\n {\n $.ajax({\n url: PlentyFramework.scriptPath + fileName,\n dataType: 'json'\n }).done( function( response ) {\n PlentyFramework.Strings = response;\n });\n };\n\n /**\n * Try to get locale translation of given string.\n * Render translated string using Mustache syntax\n * if additional parameters are given.\n * @function translate\n * @static\n * @param {String} string The string to translate\n * @param {Object} [params] additional data for rendering\n * @returns {String} The translation of the given string if found. Otherwise returns the original string.\n */\n PlentyFramework.translate = function( string, params )\n {\n var localeString;\n if ( PlentyFramework.Strings.hasOwnProperty( string ) )\n {\n localeString = PlentyFramework.Strings[string];\n }\n else\n {\n localeString = string;\n console.warn( 'No translation found for \"' + localeString + '\".' );\n }\n\n if ( !!params )\n {\n localeString = Mustache.render( localeString, params );\n }\n\n return localeString;\n\n };\n\n /**\n * Compile registered factories & services\n * @function compile\n * @static\n */\n PlentyFramework.compile = function()\n {\n\n for ( var factory in components.factories )\n {\n if ( !PlentyFramework.factories.hasOwnProperty( factory ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.factories[factory], 3 );\n }\n }\n\n for ( var service in components.services )\n {\n if ( !PlentyFramework.prototype.hasOwnProperty( service ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.services[service], 2 );\n }\n }\n\n for ( var directive in components.directives )\n {\n if ( !PlentyFramework.directives.hasOwnProperty( directive ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.directives[directive], 1 );\n }\n }\n\n var scripts = document.getElementsByTagName( 'SCRIPT' );\n for( var i = scripts.length - 1; i >= 0; i-- ) {\n var path = scripts[i].src.match( /(.*)\\/(.*)\\.js(\\?\\S*)?$/ );\n if( !!path ) {\n PlentyFramework.scriptPath = path[1];\n break;\n }\n }\n\n };\n\n // Level: 1 = directive, 2 = service, 3 = factory\n function compileComponent( component, componentLevel, dependencyStack )\n {\n dependencyStack = dependencyStack || [];\n\n // resolve dependencies\n var compiledDependencies = [];\n for ( var i = 0; i < component.dependencies.length; i++ )\n {\n var dependency = component.dependencies[i];\n if ( $.inArray( dependency, dependencyStack ) < 0 )\n {\n // add dependency to stack to avoid cyclic injection\n dependencyStack.push( dependency );\n\n if ( components.factories.hasOwnProperty( dependency ) )\n {\n // required dependency is a factory\n if ( !PlentyFramework.factories.hasOwnProperty( dependency ) )\n {\n // factory is not compiled yet\n compileComponent( components.factories[dependency], 3, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.factories[dependency] );\n continue;\n }\n\n if ( componentLevel <= 2 && components.services.hasOwnProperty( dependency ) )\n {\n // required dependency is a service\n if ( !PlentyFramework.prototype.hasOwnProperty( dependency ) )\n {\n // service is not compiled yet\n compileComponent( components.services[dependency], 2, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.prototype[dependency] );\n continue;\n }\n\n if ( componentLevel <= 1 && components.directives.hasOwnProperty( dependency ) )\n {\n // required dependency is a directive\n if ( !PlentyFramework.directives.hasOwnProperty( dependency ) )\n {\n // directive is not compiled yet\n compileComponent( components.directives[dependency], 1, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.directives[dependency] );\n continue;\n }\n\n console.error( 'Cannot inject dependency \"' + dependency + '\": Object not found.' );\n }\n else\n {\n console.error( 'Cyclic dependency injection: ' + dependencyStack.join( ' -> ' ) + ' -> ' + dependency );\n }\n }\n\n // compile component\n if ( componentLevel == 3 )\n {\n PlentyFramework.factories[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 2 )\n {\n PlentyFramework.prototype[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 1 )\n {\n PlentyFramework.directives[component.name] = component.setup.apply( null, compiledDependencies );\n }\n }\n\n}( jQuery ));\n\n\n\n","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.directive( 'Authentication', function( AuthenticationService )\n {\n return {\n login: login\n };\n\n function login( elem )\n {\n pm.getRecentEvent().preventDefault();\n AuthenticationService.customerLogin( $( elem ) );\n }\n }, [\"AuthenticationService\"] );\n\n}( jQuery, PlentyFramework ));","(function( $, pm )\n{\n pm.directive( 'Basket', function( BasketService )\n {\n\n return {\n addBasketItem : addBasketItem,\n changeItemQuantity: changeItemQuantity,\n setItemQuantity : setItemQuantity\n };\n\n function addBasketItem( elem )\n {\n pm.getRecentEvent().preventDefault();\n //init\n var basketItemsList = {};\n var $elem = $( elem );\n var parentForm = $elem.parents( 'form' );\n\n basketItemsList.BasketItemItemID = parentForm.find( '[name=\"ArticleID\"]' ).val();\n basketItemsList.BasketItemPriceID = parentForm.find( '[name=\"SYS_P_ID\"]' ).val();\n basketItemsList.BasketItemQuantity = parentForm.find( '[name=\"ArticleQuantity\"]' ).val();\n basketItemsList.BasketItemBranchID = parentForm.find( '[name=\"source_category\"]' ).val();\n\n //attributes\n var attributeInputsList = parentForm.find( '[name^=\"ArticleAttribute\"]' );\n var attributesList = [];\n\n $.each( attributeInputsList, function( idx, elem )\n {\n var match = elem.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( elem ).val()\n } );\n }\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItemsList.BasketItemAttributesList = attributesList;\n }\n\n //add basketItem and refresh previewLists\n BasketService.addItem( [basketItemsList] );\n\n }\n\n function changeItemQuantity( elem, increment )\n {\n var $elem = $( elem );\n var $quantityInput = $elem.parent().find( 'input' );\n var maxLength = parseInt( $quantityInput.attr( 'maxlength' ) ) || 5;\n var value = parseInt( $quantityInput.val() ) + increment;\n\n var isBasketView = $elem.parents( '[data-basket-item-id]' ).length > 0;\n\n if ( isBasketView )\n {\n if ( (value + '').length <= maxLength && value >= 0 )\n {\n $quantityInput.val( value );\n }\n\n var timeout = $elem.data( 'timeout' );\n\n if ( !!timeout )\n {\n window.clearTimeout( timeout );\n }\n\n timeout = window.setTimeout( function()\n {\n $quantityInput.trigger( 'change' );\n }, 1000 );\n\n $elem.data( 'timeout', timeout );\n }\n else\n {\n if ( (value + '').length <= maxLength && value >= 1 )\n {\n $quantityInput.val( value );\n }\n }\n }\n\n function setItemQuantity( basketItemID, input )\n {\n BasketService.setItemQuantity(\n basketItemID,\n parseInt( $( input ).val() )\n ).fail( function()\n {\n // reset input's value on cancel\n var basketItem = BasketService.getItem( basketItemID );\n $( input ).val( basketItem.BasketItemQuantity );\n } );\n }\n\n }, ['BasketService'] );\n}( jQuery, PlentyFramework ));","(function( $, pm )\n{\n pm.directive( 'Checkout', function( CheckoutService )\n {\n\n return {\n setMethodOfPayment: setMethodOfPayment,\n confirmAtrigaPaymax: confirmAtrigaPaymax\n };\n\n function setMethodOfPayment( paymentID )\n {\n CheckoutService.setMethodOfPayment( paymentID );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxConfirmed )\n {\n CheckoutService.confirmAtrigaPaymax( atrigaPaymaxConfirmed );\n }\n }, ['CheckoutService'] );\n})( jQuery, PlentyFramework );","/**\n * Mobile dropdowns\n * Toggles dropdowns using css class 'open' instead of pseudo class :hover\n * Usage:\n *
  • \n * ...\n *
  • \n *\n * possible values for CONDITION\n * \"touch\" : use 'open'-class if device is touch-device AND media size is 'md' or 'lg'\n * \"toggle-xs-sm-or-touch\" : use 'open'-class if device is \"touch\" (as above) OR media size is 'xs' or 'sm'\n *\n */\n(function( $, pm )\n{\n pm.directive( 'MobileDropdown', function( MediaSize )\n {\n // store all dropdown elements\n var dropdownElements = [];\n\n // store dropdown elements which should be closed by clicking outside the element itself\n var closableDropdownElements = [];\n\n return {\n initDropdowns: initDropdowns,\n openDropdown : openDropdown,\n slideDropdown: slideDropdown\n };\n\n function initDropdowns()\n {\n $( window ).on( 'orientationchange sizeChange', function()\n {\n resetDropdowns( dropdownElements );\n resetDropdowns( closableDropdownElements );\n } );\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", function( event )\n {\n resetDropdowns( closableDropdownElements, event );\n } );\n }\n\n function resetDropdowns( dropdownList, event )\n {\n var $current;\n for ( var i = 0; i < dropdownList.length; i++ )\n {\n $current = $( dropdownList[i] );\n if ( !!event )\n {\n if ( $current.find( $( event.target ) ).length === 0 )\n {\n $current.removeClass( 'open' );\n }\n }\n else\n {\n $current.removeClass( 'open' );\n }\n }\n\n }\n\n function openDropdown( elem, alwaysClickable )\n {\n var $elem = $( elem );\n var $parent = $elem.parent();\n\n // case 1: xs || sm || ( touch && ( md || lg ) ) -> open/close via click on small devices, open/close via\n // css-hover on desktop, open/close via click on touch-desktop (e.g. top navigation)\n\n if ( !!alwaysClickable && ( MediaSize.isInterval( 'xs, sm' ) || ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n // if href\n if ( !$elem.attr( 'href' ) )\n {\n avoidRedirectinStopPropagation( $parent.not( $elem ) );\n }\n }\n else\n {\n if ( !$elem.attr( 'href' ) )\n {\n // hide dropdown\n $parent.removeClass( 'open' );\n }\n }\n }\n\n // case 2: touch && ( md || lg ) -> open via 1st click on touch-desktop, return false (e.g. main navigation)\n\n if ( !alwaysClickable && ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n avoidRedirectinStopPropagation( $parent );\n }\n else\n {\n // redirect to href if dropdown is already open\n // do nothing\n }\n }\n }\n\n function showDropdownHideOthers( elem, parent )\n {\n var $parent = $( parent );\n\n // hide other dropdowns\n resetDropdowns( closableDropdownElements );\n\n // remember opened dropdown\n if ( $.inArray( $parent[0], closableDropdownElements ) < 0 )\n {\n closableDropdownElements.push( $parent[0] );\n }\n\n // show dropdown\n $parent.addClass( 'open' );\n }\n\n function avoidRedirectinStopPropagation( elem )\n {\n var $elem = $( elem );\n\n // avoid redirecting\n pm.getRecentEvent().preventDefault();\n\n // avoid closing popup by clicking itself\n $elem.off( 'click' );\n $elem.on( 'click', function( e )\n {\n e.stopPropagation();\n } );\n }\n\n function slideDropdown( elem )\n {\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n // size interval query is required since function is used on document ready to initial open active\n // navigation (on small devices)\n if ( MediaSize.isInterval( 'xs, sm' ) )\n {\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 400, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n if ( $.inArray( $elemParent[0], dropdownElements ) < 0 )\n {\n dropdownElements.push( $elemParent[0] );\n }\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n }\n\n }, ['MediaSizeService'] );\n}( jQuery, PlentyFramework ));","(function( $, pm )\n{\n pm.directive( 'Redirect', function( MediaSizeService, NavigatorService )\n {\n\n return {\n to : to,\n toCheckoutTab: toCheckoutTab\n };\n\n function to( href )\n {\n if ( MediaSizeService.interval() != 'xs' )\n {\n if ( typeof href === 'string' && href.indexOf('/') == -1 && $( href ).length > 0 )\n {\n window.location.assign( $( href ).attr( 'href' ) );\n }\n else\n {\n window.location.assign( href );\n }\n }\n }\n\n function toCheckoutTab( tabID )\n {\n NavigatorService.goToID( tabID );\n }\n\n }, ['MediaSizeService', 'NavigatorService'] );\n}( jQuery, PlentyFramework ));","(function( $, pm )\n{\n pm.directive( 'Tab', function( MediaSize )\n {\n\n var tabGroups = {};\n\n return {\n showTab : showTab,\n initRemoteLabel: initRemoteLabel,\n initRemoteTab : initRemoteTab,\n showRemoteTab : showRemoteTab\n };\n\n function showTab( tabSelector )\n {\n $( tabSelector ).tab( 'show' );\n }\n\n function initRemoteLabel( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).addLabel( $elem );\n }\n\n function initRemoteTab( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).setContent( $elem );\n }\n\n function showRemoteTab( tabID, groupID, interval )\n {\n if ( MediaSize.isInterval( interval ) )\n {\n pm.getRecentEvent().preventDefault();\n\n if ( !!tabGroups[groupID] && !!tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].showTab( tabID );\n }\n\n }\n }\n\n function TabGroup()\n {\n var tabs = {};\n var activeTab;\n\n return {\n addTab : addTab,\n showTab : showTab,\n getTab : getTab,\n resetTabs: resetTabs\n };\n\n function addTab( tabID )\n {\n tabs[tabID] = new Tab( tabID );\n return tabs[tabID];\n }\n\n function showTab( tabID )\n {\n var zIndex = 0;\n if ( !!activeTab )\n {\n // activeTab is set\n zIndex = parseInt( activeTab.getContent().parent().css( 'zIndex' ) );\n activeTab.hide();\n activeTab.getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n else\n {\n // activeTab not set before\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n var currentZ = parseInt( tabs[tab].getContent().parent().css( 'zIndex' ) );\n if ( zIndex == 0 || currentZ < zIndex )\n {\n zIndex = currentZ;\n }\n tabs[tab].hide();\n }\n }\n\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n }\n\n $( window ).on( 'sizeChange', resetTabs );\n }\n\n activeTab = tabs[tabID];\n activeTab.getContent().parent().css( 'zIndex', zIndex );\n activeTab.show();\n }\n\n function getTab( tabID )\n {\n return tabs[tabID];\n }\n\n function resetTabs()\n {\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].show();\n }\n }\n\n activeTab = null;\n }\n }\n\n function Tab( id )\n {\n var $content;\n var $labels = [];\n var tabID = id;\n\n return {\n addLabel : addLabel,\n setContent: setContent,\n getContent: getContent,\n getID : getID,\n show : show,\n hide : hide\n };\n\n function getID()\n {\n return tabID;\n }\n\n function addLabel( label )\n {\n $labels.push( label );\n return this;\n }\n\n function setContent( content )\n {\n $content = content;\n return this;\n }\n\n function getContent()\n {\n return $content;\n }\n\n function show()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].addClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.show().addClass( 'in' );\n }\n\n }\n\n function hide()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].removeClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.hide().removeClass( 'in' );\n }\n }\n }\n\n }, ['MediaSizeService'] );\n})( jQuery, PlentyFramework );","/**\n * Add fancy ui modifications - the visual stuff - here.\n * Respond functionality like 'event':UI.myFunctionality(currentElement)\n *\n * Example:\n * \n *\n */\n(function( $, pm )\n{\n pm.directive( 'UI', function( MediaSizeService, SocialShareService )\n {\n // elements to calculate height.\n var equalHeightElementList = [];\n var toTopButtonList = [];\n\n return {\n initUIWindowEvents : initUIWindowEvents,\n addContentPageSlider: addContentPageSlider,\n equalHeight : equalHeight,\n initToTop : initToTop,\n initLazyload : initLazyload,\n initSlideToggle : initSlideToggle,\n slideDown : slideDown,\n slideUp : slideUp,\n slideToggle : slideToggle,\n toggleHideShow : toggleHideShow,\n toggleSocialShare : toggleSocialShare,\n toggleClass : toggleClass,\n addClass : addClass,\n removeClass : removeClass\n };\n\n function initUIWindowEvents()\n {\n // resize elements on window size change.\n $( window ).on( 'sizeChange contentChanged', function()\n {\n fireEqualHeight();\n } );\n\n $( window ).on( \"scroll resize\", function()\n {\n if ( toTopButtonList.length > 0 )\n {\n if ( $( document ).scrollTop() > 100 )\n {\n doToArrayElements( toTopButtonList, \"addClass\", \"visible\" );\n }\n else\n {\n doToArrayElements( toTopButtonList, \"removeClass\", \"visible\" );\n }\n }\n } );\n }\n\n /**\n * Adds content page slider (owlCarousel)\n *\n * usage:\n *
    \n *
    \n * ...\n *
    \n *
    \n * ...\n *
    \n * ...\n *
    \n *\n * Legacy directive selector: data-plenty=\"contentpageSlider\"\n *\n * @param elem\n */\n function addContentPageSlider( elem )\n {\n $( elem ).owlCarousel( {\n navigation : true,\n navigationText : false,\n slideSpeed : 1000,\n paginationSpeed: 1000,\n singleItem : true,\n autoPlay : 6000,\n stopOnHover : true,\n afterMove : function( current )\n {\n $( current ).find( '[data-plenty-rel=\"lazyload\"]' ).trigger( 'appear' );\n }\n } );\n }\n\n /**\n * Equal Box height\n * Calculates equal box height for chosen elements.\n *\n * Legacy directive selector: data-plenty-equal\n *\n * @param elem\n * @param elementExists - default false\n */\n function equalHeight( elem, mediaSizes, elementExists )\n {\n var $elem = $( elem );\n var maxHeight = 0;\n var $equalTarget = {};\n var $equalTargetList = $elem.find( '[data-plenty-rel=\"equal-target\"]' ).length > 0 ? $elem.find( '[data-plenty-rel=\"equal-target\"]' ) : $elem.children();\n\n // if element wasn't pushed before.\n if ( elementExists !== true )\n {\n equalHeightElementList.push( elem );\n }\n\n for ( var i = $equalTargetList.length; i >= 0; i-- )\n {\n $equalTarget = $( $equalTargetList[i] );\n $equalTarget.css( 'height', '' );\n\n if ( $equalTarget.outerHeight( true ) > maxHeight )\n {\n maxHeight = $equalTarget.outerHeight( true );\n }\n }\n\n if ( !mediaSizes || MediaSizeService.isInterval( mediaSizes ) )\n {\n $equalTargetList.height( maxHeight );\n }\n }\n\n /**\n * Scroll page to top.\n * Just add without events.\n *\n * Legacy directive selector: data-plenty=\"toTop\"\n *\n * @param elem\n */\n function initToTop( elem )\n {\n var $elem = $( elem );\n\n $elem.click( function()\n {\n $( 'html, body' ).animate( {\n scrollTop: 0\n }, 400 );\n return false;\n } );\n\n if ( !!$.inArray( $elem, toTopButtonList ) )\n {\n toTopButtonList.push( $elem );\n }\n }\n\n /**\n * lazy load on ready.\n *\n * Legacy directive selector: img[data-plenty-lazyload]\n *\n * @param elem\n */\n function initLazyload( elem, effect )\n {\n var $elem = $( elem );\n\n $elem.lazyload( {\n effect: effect\n } );\n if ( $elem.is( 'img' ) )\n {\n $elem.on( 'loaded', function()\n {\n $elem.css( 'display', 'inline-block' );\n } );\n }\n }\n\n /**\n * Toggle show and hide animation.\n *\n * Legacy directive selector: data-plenty=\"openCloseToggle\"\n *\n * @param elem\n */\n function toggleHideShow( elem )\n {\n\n console.log( elem );\n\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 200, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n /**\n * Toggle target content on click.\n * Bind to checked-/ unchecked-property of radio buttons\n *\n * Legacy directive selector: data-plenty-slidetoggle\n *\n * @param elem\n */\n function initSlideToggle( elem, checked )\n {\n var $elem = $( elem );\n var $targetElement = $( $elem.attr( 'data-plenty-rel' ) );\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n // is radio button\n var $radioGroupList = $( 'input[type=\"radio\"][name=\"' + ( $elem.attr( 'name' ) ) + '\"]' );\n var visibleOnChecked = !checked || checked == 'checked';\n\n $radioGroupList.change( function()\n {\n var $self = $( this );\n $targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n if ( $self.is( ':checked' ) && $self[0] === $elem[0] && visibleOnChecked == true )\n {\n // checked\n $targetElement.slideDown( 400, function()\n {\n fireEqualHeight();\n } );\n }\n else\n {\n // unchecked (since other radio button has been checked)\n $targetElement.slideUp( 400, function()\n {\n fireEqualHeight();\n } );\n }\n } );\n }\n else\n {\n // is not radio button\n $elem.click( function()\n {\n //$targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n $elem.addClass( 'animating' );\n $targetElement.slideToggle( 400, function()\n {\n $elem.removeClass( 'animating' );\n $elem.toggleClass( 'active' );\n fireEqualHeight();\n } );\n } );\n }\n }\n\n function slideDown( target, duration )\n {\n slideAction( $( target ), duration, 'slideDown' );\n }\n\n function slideUp( target, duration )\n {\n slideAction( $( target ), duration, 'slideUp' );\n }\n\n function slideToggle( target, duration )\n {\n slideAction( $( target ), duration, 'slideToggle' );\n }\n\n function slideAction( $target, duration, callbackString )\n {\n duration = duration || 400;\n $target.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n $target[callbackString]( duration, function()\n {\n fireEqualHeight();\n } );\n }\n\n /**\n * TODO check comment\n * Social Share Activation\n * Activate and load share-buttons manually by clicking a separate button\n * Usage / data-attributes:\n *
    \n * Will be used to activate the service set in\n * data-plenty-social=\"\"\n * Will be replaced with loaded share button\n *
    \n *\n * possible values for data-plenty-social:\n * \"facebook-like\" : Load Facebooks \"Like\"-Button\n * \"facebook-recommend\" : Load Facebooks \"Recommend\"-Button\n * \"twitter\" : Load Twitter Button\n * \"google-plus\" : Load google \"+1\"-Button\n *\n * Additional Tooltips\n * You can extend the parent element with a (bootstrap) tooltip by adding data-toggle=\"tooltip\" and\n * title=\"TOOLTIP CONTENT\" Tooltip will be destroyed after activating a social service\n * (!) Requires bootstrap.js\n *\n * Legacy directive selector: data-plenty-social\n *\n * @param elem\n */\n function toggleSocialShare( elem, socialShareService )\n {\n var $elem = $( elem );\n var $toggle = $elem.find( '[data-plenty-rel=\"social-switch\"]' );\n\n // append container to put / delete service.html\n $elem.append( '
    ' );\n\n // add \"off\" class to switch, if neither \"off\" or \"on\" is set\n // replaced hasClass() with is() benchmark: http://jsperf.com/hasclasstest\n if ( !$toggle.is( 'off, on' ) )\n {\n $toggle.addClass( 'off' );\n }\n\n // toggle switch\n $toggle.on( 'click', function()\n {\n if ( $toggle.hasClass( 'off' ) )\n {\n // TODO remove bootstrap dependency\n if ( $elem.attr( \"data-toggle\" ) == \"tooltip\" )\n {\n $elem.tooltip( 'destroy' )\n }\n $toggle.removeClass( 'off' ).addClass( 'on' );\n // hide dummy button\n $elem.find( '[data-plenty-rel=\"social-placeholder\"]' ).hide();\n // load HTML defined in 'api'\n $elem.find( '.social-container' ).append( SocialShareService.getSocialService( socialShareService ) );\n }\n // do not disable social medias after activation\n } );\n }\n\n /**\n * Toggle Class\n * toggle style-classes on click\n * Usage / data-attribute:\n *
    \n * target : jQuery selector to toggle the class at.\n * class : class(es) to toggle at target element\n * media : only toggle class on given media sizes (optional)\n *\n * (!) using data-plenty-toggle on -elements will prevent redirecting to href=\"\"\n *\n * Legacy directive selector: data-plenty-toggle\n *\n * @param cssClass\n * @param target\n * @param interval\n */\n function toggleClass( cssClass, target, interval )\n {\n var $target = $( target );\n /* FIXME\n * Callisto 3.1 Design adaption:\n * NavigationCategoriesList\n * Line 8\n * BEFORE:\n *
  • \n * AFTER:\n *
  • \n *\n * Line 10\n * BEFORE:\n * \n * AFTER:\n * \n *\n * */\n if ( $target.parents( \".navbar-main\" ).length > 0 )\n {\n var $elem = $target.children( \"span\" );\n pm.directives[\"MobileDropdown\"].slideDropdown( $elem );\n return true;\n }\n\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $target.toggleClass( cssClass );\n return false;\n }\n }\n\n function addClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).addClass( cssClass );\n return false;\n }\n }\n\n function removeClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).removeClass( cssClass );\n return false;\n }\n }\n\n /*\n ##### PRIVATE FUNCTIONS ######\n */\n\n function fireEqualHeight()\n {\n for ( var i = equalHeightElementList.length - 1; i >= 0; i-- )\n {\n equalHeight( equalHeightElementList[i], '', true );\n }\n }\n\n function doToArrayElements( array, func, params )\n {\n for ( var i = array.length - 1; i >= 0; i-- )\n {\n array[i][func]( params );\n }\n }\n\n }, ['MediaSizeService', 'SocialShareService'] );\n}( jQuery, PlentyFramework ));","(function( $, pm )\n{\n pm.directive( 'Validator', function( ValidationService )\n {\n\n return {\n validate: validate\n };\n\n function validate( form, errorClass )\n {\n return ValidationService.validate( form, errorClass );\n }\n\n }, ['ValidationService'] );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Handles requests to ReST API. Provides a {{#crossLink \"APIFactory/handleError:method\"}}default\n * error-handling{{/crossLink}}. Request parameters will be parsed to json internally
    \n * Requires:\n *
      \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class APIFactory\n * @static\n */\n pm.factory( 'APIFactory', function( UI, Modal )\n {\n\n var sessionExpirationTimeout = null;\n $( document ).ready( function()\n {\n renewLoginSession();\n } );\n\n return {\n get : _get,\n post : _post,\n put : _put,\n delete: _delete,\n idle : _idle\n };\n\n function renewLoginSession()\n {\n if ( !pm.getGlobal( 'LoginSession' ) )\n {\n return;\n }\n\n if ( !!sessionExpirationTimeout )\n {\n clearTimeout( sessionExpirationTimeout );\n }\n\n sessionExpirationTimeout = setTimeout( function()\n {\n $( window ).trigger( 'login-expired' );\n\n if ( pm.getGlobal( 'PageDesign' ) === \"Checkout\" )\n {\n Modal.prepare()\n .setTitle( pm.translate( 'Your session has expired.' ) )\n .setContent( pm.translate( 'Please log in again to continue shopping.' ) )\n .setLabelDismiss( null )\n .setLabelConfirm( pm.translate( 'OK' ) )\n .onConfirm( function()\n {\n window.location.assign( '/' );\n } )\n .onDismiss( function()\n {\n window.location.assign( '/' );\n } )\n .show();\n }\n\n }, pm.getGlobal( 'LoginSessionExpiration' ) );\n }\n\n /**\n * Is called by default if a request failed.
    \n * Can be prevented by setting the requests last parameter to false.\n *\n * @function handleError\n * @private\n *\n * @param {object} jqXHR
    jQuery\n * deferred Object\n */\n function handleError( jqXHR )\n {\n try\n {\n var responseText = $.parseJSON( jqXHR.responseText );\n UI.printErrors( responseText.error.error_stack );\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n }\n\n /**\n * Sends a GET request to ReST-API\n *\n * @function get\n *\n * @param {string} url The URL to send the request to\n * @param {object} params The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _get( url, params, ignoreErrors, runInBackground, sync )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'GET',\n data : params,\n dataType: 'json',\n async : !sync,\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a POST request to ReST-API\n *\n * @function post\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _post( url, data, ignoreErrors, runInBackground )\n {\n\n var params = {\n type : 'POST',\n dataType: 'json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n };\n\n if ( !!data && data.isFile )\n {\n params.cache = data.cache;\n params.processData = data.processData;\n params.data = data.data;\n params.contentType = false;\n }\n else\n {\n params.data = JSON.stringify( data );\n params.contentType = 'application/json';\n }\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url, params\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n }\n\n /**\n * Sends a PUT request to ReST-API\n *\n * @function put\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _put( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'PUT',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a DELETE request to ReST-API\n *\n * @function delete\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @returns {object} jQuery\n * deferred Object\n */\n function _delete( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'DELETE',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Get a idle request doing nothing for chaining methods\n * @returns {object} jQuery\n * deferred Object\n */\n function _idle()\n {\n return $.Deferred().resolve();\n }\n\n }, ['UIFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Provide methods for receiving layout containers, layout parameters\n * or category content from API
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    \n * @class CMSFactory\n * @static\n */\n pm.factory( 'CMSFactory', function( API )\n {\n\n return {\n getContainer : getContainer,\n getParams : getParams,\n getCategoryContent: getCategoryContent\n };\n\n /**\n * Prepare the request to receive HTML-Content from CMS\n * @function getContainer\n * @param {string} containerName The Layoutcontainer to receive.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the location in\n * the CMS\n * (e.g. 'Checkout')\n * @example\n * CMSFactory.getContainer( 'CheckoutTotals' ).from( 'Checkout' )\n * .done(function( response ) {\n * // container content\n * var html = response.data[0]\n * });\n */\n function getContainer( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/container_' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n\n }\n\n /**\n * Prepare the request to receive Layout parameters for a template\n * @function getParams\n * @param {string} containerName The Layoutcontainer to receive the parameteres of.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the\n * location in the CMS\n * (e.g. 'ItemView')\n * @example\n * CMSFactory.getParams( 'BasketItemsList' ).from( 'ItemView' )\n * .done(function( response ) {\n * // BasketItems\n * var items = response.data;\n * });\n */\n function getParams( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n }\n\n /**\n * Get the content of a category specified by its ID\n * @function getCategoryContent\n * @param {number} categoryID The ID of the category to get the content from\n * @returns {object} jQuery deferred\n * Object\n */\n function getCategoryContent( categoryID )\n {\n return API.get( '/rest/categoryview/categorycontentbody/?categoryID=' + categoryID );\n }\n\n }, ['APIFactory'] );\n}( PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Holds checkout data for global access and provides methods\n * for reloading content dynamically-
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutFactory\n * @static\n */\n pm.factory( 'CheckoutFactory', function( API, CMS, UI )\n {\n\n // data received from ReST API\n var checkoutData;\n\n // instance wrapped checkout object for global access\n var checkout;\n\n return {\n getCheckout : getCheckout,\n setCheckout : setCheckout,\n loadCheckout : loadCheckout,\n reloadContainer : reloadContainer,\n reloadCatContent : reloadCatContent,\n reloadItemContainer: reloadItemContainer\n };\n\n function Checkout()\n {\n return checkoutData;\n }\n\n /**\n * Returns instance of wrapped checkout object\n * @function getCheckout\n * @returns {Checkout} Instance of checkout object\n */\n function getCheckout( copy )\n {\n if ( !checkout || !checkoutData )\n {\n loadCheckout( true );\n }\n\n if ( !!copy )\n {\n return $.extend( true, {}, checkoutData );\n }\n return checkout;\n }\n\n /**\n * Receive global checkout data from ReST-API\n * @function loadCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function loadCheckout( sync )\n {\n\n return API.get( '/rest/checkout/', null, false, false, sync )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n }\n\n /**\n * Update checkout data on server\n * @function setCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function setCheckout()\n {\n\n return API.put( '/rest/checkout', checkout )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-checkout-template=\"...\"\n * @function reloadContainer\n * @param {string} container Name of the template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadContainer( container )\n {\n\n return CMS.getContainer( \"checkout\" + container ).from( 'checkout' )\n .done( function( response )\n {\n $( '[data-plenty-checkout-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n } );\n } );\n }\n\n /**\n * Get category content from server and replace received HTML\n * in containers marked with data-plenty-checkout-catcontent=\"...\"\n * @function reloadCatContent\n * @param {number} catId ID of the category to load content (description 1) from server\n * @return {object} jQuery deferred\n * Object\n * @deprecated\n */\n function reloadCatContent( catId )\n {\n\n return CMS.getCategoryContent( catId )\n .done( function( response )\n {\n $( '[data-plenty-checkout-catcontent=\"' + catId + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-itemview-template=\"...\"\n * @function reloadItemContainer\n * @param {string} container Name of the (item view) template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadItemContainer( container )\n {\n\n return CMS.getContainer( 'itemview' + container ).from( 'itemview' )\n .done( function( response )\n {\n $( '[data-plenty-itemview-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n }, ['APIFactory', 'CMSFactory', 'UIFactory'] );\n}( PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Provides methods for creating and displaying modal popups.\n * @class ModalFactory\n * @static\n */\n pm.factory( 'ModalFactory', function()\n {\n\n return {\n prepare: prepare,\n isModal: isModal\n };\n\n /**\n * Detect if given html contains a valid modal\n * @function isModal\n * @param {string} html\n * @returns {boolean}\n */\n function isModal( html )\n {\n return PlentyFramework.partials.Modal.isModal( html );\n }\n\n /**\n * Create a new Instance of {{#crossLink \"ModalFactory.Modal\"}}Modal{{/crossLink}}\n * @function prepare\n * @returns {Modal}\n */\n function prepare( selector )\n {\n return new Modal( selector );\n }\n\n /**\n * Holds configuration of a modal and provides methods for displaying and hiding the modal\n * @class Modal\n * @for ModalFactory\n * @returns {Modal}\n * @constructor\n */\n function Modal( selector )\n {\n\n var modal = this;\n modal.selector = selector;\n\n /**\n * The title of the modal\n * @attribute title\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.title = '';\n\n modal.cssClass = '';\n\n /**\n * The content of the modal\n * @attribute content\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.content = '';\n\n /**\n * The content of the dismiss-button\n * @attribute labelDismiss\n * @type {string}\n * @private\n * @default \"Abbrechen\"\n */\n modal.labelDismiss = pm.translate( \"Cancel\" );\n\n /**\n * the label of the confirmation button\n * @attribute labelConfirm\n * @type {string}\n * @private\n * @default \"Bestätigen\"\n */\n modal.labelConfirm = pm.translate( \"Confirm\" );\n\n /**\n * Callback when modal is confirmed by clicking confirmation button.\n * Modal will not be dismissed if callback returns false.\n * @attribute onConfirm\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onConfirm = function()\n {\n };\n\n /**\n * Callback when modal is dismissed by closing the modal\n * @attribute onDismiss\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onDismiss = function()\n {\n };\n\n /**\n * jQuery selector of the container element to display the modal in.\n * @attribute container\n * @type {string}\n * @private\n * @default \"body\"\n */\n modal.container = 'body';\n\n /**\n * Timeout to close the modal automatically. Set <0 to disable.\n * @attribute timeout\n * @type {number}\n * @private\n * @default -1\n */\n modal.timeout = -1;\n\n modal.hide = hide;\n modal.startTimeout = startTimeout;\n modal.stopTimeout = stopTimeout;\n modal.pauseTimeout = pauseTimeout;\n modal.continueTimeout = continueTimeout;\n\n var bsModal;\n var timeout, interval;\n var timeRemaining, timeStart;\n var paused = false;\n\n return {\n setTitle : setTitle,\n setClass : setClass,\n setContent : setContent,\n setContainer : setContainer,\n setLabelConfirm: setLabelConfirm,\n setLabelDismiss: setLabelDismiss,\n onConfirm : onConfirm,\n onDismiss : onDismiss,\n setTimeout : setTimeout,\n show : show,\n hide : hide\n };\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/title:attribute}}title{{/crossLink}} of the modal\n * @function setTitle\n * @param {string} title The title\n * @returns {Modal} Modal object for chaining methods\n */\n function setTitle( title )\n {\n modal.title = title;\n return this;\n }\n\n function setClass( cssClass )\n {\n modal.cssClass = cssClass;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/content:attribute}}content{{/crossLink}} of the modal\n * @function setContent\n * @param {string} content The content\n * @returns {Modal} Modal object for chaining methods\n */\n function setContent( content )\n {\n modal.content = content;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelConfirm:attribute}}label of the confirmation\n * button{{/crossLink}} of the modal\n * @function setLabelConfirm\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelConfirm( label )\n {\n modal.labelConfirm = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelDismiss:attribute}}label if the dismiss\n * button{{/crossLink}} of the modal\n * @function setLabelDismiss\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelDismiss( label )\n {\n modal.labelDismiss = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onConfirm:attribute}}confirmation callback{{/crossLink}} of the\n * modal\n * @function onConfirm\n * @param {function} callback The callback if modal is confirmed\n * @returns {Modal} Modal object for chaining methods\n */\n function onConfirm( callback )\n {\n modal.onConfirm = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onDismiss:attribute}}dismiss callback{{/crossLink}} of the modal\n * @function onDismiss\n * @param {function} callback The callback if modal is dismissed\n * @returns {Modal} Modal object for chaining methods\n */\n function onDismiss( callback )\n {\n modal.onDismiss = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/container:attribute}}container{{/crossLink}} of the modal\n * @function setContainer\n * @param {string} container The jQuery selector of the container to display the modal in\n * @returns {Modal} Modal object for chaining methods\n */\n function setContainer( container )\n {\n modal.container = container;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/timeout:attribute}}timeout{{/crossLink}} of the modal\n * @function setTimeout\n * @param {number} timeout The timeout to close the modal automatically. Set <0 to disable\n * @returns {Modal} Modal object for chaining methods\n */\n function setTimeout( timeout )\n {\n modal.timeout = timeout;\n return this;\n }\n\n /**\n * Inject modal data in default template if not template is given\n * and display the modal inside the configured container.
    \n * Start timer to hide the modal automatically if timeout is set.\n * @function show\n */\n function show()\n {\n if( !!modal.selector )\n {\n bsModal = $( modal.selector );\n }\n else\n {\n if ( isModal( modal.content ) )\n {\n bsModal = PlentyFramework.partials.Modal.getModal( modal.content );\n }\n else\n {\n bsModal = $( PlentyFramework.compileTemplate( 'modal/modal.html', modal ) );\n }\n\n $( modal.container ).append( bsModal );\n\n // append additional scripts executable\n var scripts = $( modal.content ).filter( 'script' );\n if ( scripts.length > 0 )\n {\n scripts.each( function( i, script )\n {\n var element = document.createElement( 'script' );\n element.type = 'text/javascript';\n element.innerHTML = $( script ).text();\n $( modal.container ).append( element );\n } );\n }\n }\n\n // bind callback functions\n PlentyFramework.partials.Modal.init( bsModal, modal );\n bsModal.find( '[data-plenty-modal=\"confirm\"]' ).click( function()\n {\n var close = modal.onConfirm();\n\n if ( typeof close == \"undefined\" )\n {\n close = true;\n }\n\n if ( close )\n {\n hide( true );\n }\n } );\n\n PlentyFramework.partials.Modal.show( bsModal );\n\n if ( modal.timeout > 0 )\n {\n startTimeout();\n }\n\n }\n\n /**\n * Hide the modal.\n * @function hide\n * @param {boolean} confirmed Flag indicating of modal is closed by confirmation button or dismissed\n */\n function hide( confirmed )\n {\n PlentyFramework.partials.Modal.hide( bsModal );\n\n if ( !confirmed )\n {\n modal.onDismiss();\n }\n }\n\n /**\n * Start the configured timeout initially\n * @function startTimeout\n * @private\n */\n function startTimeout()\n {\n timeRemaining = modal.timeout;\n timeStart = (new Date()).getTime();\n\n timeout = window.setTimeout( function()\n {\n window.clearInterval( interval );\n hide();\n }, modal.timeout );\n\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( timeRemaining / 1000 );\n interval = window.setInterval( function()\n {\n if ( !paused )\n {\n var secondsRemaining = timeRemaining - (new Date()).getTime() + timeStart;\n secondsRemaining = Math.round( secondsRemaining / 1000 );\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( secondsRemaining );\n }\n }, 1000 )\n }\n\n /**\n * Pause the timeout (e.g. on hover)\n * @function pauseTimeout\n * @private\n */\n function pauseTimeout()\n {\n paused = true;\n timeRemaining -= (new Date()).getTime() - timeStart;\n window.clearTimeout( timeout );\n }\n\n /**\n * Continue paused timeout\n * @function continueTimeout\n * @private\n */\n function continueTimeout()\n {\n paused = false;\n timeStart = (new Date()).getTime();\n timeout = window.setTimeout( function()\n {\n hide();\n window.clearInterval( interval );\n }, timeRemaining );\n }\n\n /**\n * Stop timeout. Stopped timeouts cannot be continued.\n * @function stopTimeout\n * @private\n */\n function stopTimeout()\n {\n window.clearTimeout( timeout );\n window.clearInterval( interval );\n }\n\n }\n\n } );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Displaying error messages and handling wait screen\n * @class UIFactory\n * @static\n */\n pm.factory( 'UIFactory', function()\n {\n /**\n * Increased/ decreased when showing/ hiding wait screen to avoid stacking\n * multiple instances of overlays.\n * @attribute waitScreenCount\n * @private\n * @type {number}\n * @default 0\n */\n var waitScreenCount = 0;\n var waitScreen;\n var errorPopup = null;\n\n return {\n throwError : throwError,\n printErrors : printErrors,\n showWaitScreen: showWaitScreen,\n hideWaitScreen: hideWaitScreen\n };\n\n /**\n * Display a single error message.\n * @function throwError\n * @param {number} code A code identifying this error\n * @param {string} msg The error message to display\n */\n function throwError( code, msg )\n {\n printErrors( [{code: code, message: msg}] );\n }\n\n /**\n * Wrap error messages in error popup, if popup doesn't already contain this error\n * If popup is already visible, append new errors to popup's inner HTML\n * otherwise create new popup\n * @function printErrors\n * @param {Array} errorMessages A list of errors to display\n */\n function printErrors( errorMessages )\n {\n\n // create error-popup if not exist\n if ( !errorPopup || $( 'body' ).has( errorPopup ).length <= 0 )\n {\n errorPopup = $( pm.compileTemplate( 'error/errorPopup.html' ) );\n $( 'body' ).append( errorPopup );\n pm.partials.Error.init( errorPopup );\n }\n\n $.each( errorMessages, function( key, error )\n {\n // add additional error, if not exist.\n pm.partials.Error.addError( errorPopup, $( pm.compileTemplate( 'error/errorMessage.html', error ) ) );\n } );\n\n pm.partials.Error.show( errorPopup );\n\n hideWaitScreen( true );\n }\n\n /**\n * Show wait screen if not visible and increase\n * {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * @function showWaitScreen\n */\n function showWaitScreen()\n {\n waitScreenCount = waitScreenCount || 0;\n\n // create wait-overlay if not exist\n if ( !waitScreen || $( 'body' ).has( waitScreen ).length <= 0 )\n {\n waitScreen = $( pm.compileTemplate( 'waitscreen/waitscreen.html' ) );\n $( 'body' ).append( waitScreen );\n }\n\n pm.partials.WaitScreen.show( waitScreen );\n\n // increase instance counter to avoid showing multiple overlays\n waitScreenCount++;\n return waitScreenCount;\n }\n\n /**\n * Decrease {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * and hide wait screen if waitScreenCount is 0\n * @function hideWaitScreen\n * @param {boolean} forceClose set true to hide wait screen independent from the value of waitScreenCount.\n */\n function hideWaitScreen( forceClose )\n {\n\n // decrease overlay count\n waitScreenCount--;\n\n // hide if all instances of overlays has been closed\n // or if closing is forced by user\n if ( waitScreenCount <= 0 || !!forceClose )\n {\n waitScreenCount = 0;\n pm.partials.WaitScreen.hide( waitScreen );\n }\n return waitScreenCount;\n }\n\n } );\n}( jQuery, PlentyFramework ));","/**\n * Factories provide static functions and can be injected into\n * {{#crossLinkModule \"Services\"}}services{{/crossLinkModule}}.
    \n * Factories also can inject other factories. Compared to services,\n * factories are not visible in instances of {{#crossLinkModule \"PlentyFramework\"}}PlentyFramework{{/crossLinkModule}}.\n *\n * @module Factories\n * @main Factories\n */","Object.equals = function( a, b )\n{\n if ( a === b )\n {\n return true;\n }\n if ( !(a instanceof Object) || !(b instanceof Object) )\n {\n return false;\n }\n if ( a.constructor !== b.constructor )\n {\n return false;\n }\n\n for ( var key in a )\n {\n if ( !a.hasOwnProperty( key ) )\n {\n continue;\n }\n if ( !b.hasOwnProperty( key ) )\n {\n return false;\n }\n if ( a[key] === b[key] )\n {\n continue;\n }\n if ( typeof( a[key] ) !== \"object\" )\n {\n return false;\n }\n if ( !Object.equals( a[key], b[key] ) )\n {\n return false;\n }\n }\n\n for ( var key in b )\n {\n if ( b.hasOwnProperty( key ) && !a.hasOwnProperty( key ) )\n {\n return false;\n }\n }\n\n return true;\n\n};","PlentyFramework.cssClasses = {\n\n active: \"active\"\n\n};","(function( $, pm )\n{\n\n pm.partials.Error = {\n\n /**\n * Will be called, after the error popup was created and injected in DOM.\n * @param {HTMLElement} popup The injected element of the popup\n */\n init: function( popup )\n {\n $( popup ).find( '.close' ).click( function()\n {\n pm.partials.Error.hideAll();\n } );\n },\n\n /**\n * Will be called for each thrown error. Has to be injected in DOM manually.\n * @param {HTMLElement} popup The error popup element\n * @param {HTMLElement} error The error message element\n */\n addError: function( popup, error )\n {\n var errorCode = $( error ).attr( 'data-plenty-error-code' );\n\n if ( $( popup ).find( '[data-plenty-error-code=\"' + errorCode + '\"]' ).length <= 0 )\n {\n $( popup ).find( '.plentyErrorBoxInner' ).append( error );\n }\n },\n\n /**\n * Will be called, after initialization and injection of all errors\n * @param {HTMLElement} popup The error popup element\n */\n show: function( popup )\n {\n $( popup ).show();\n },\n\n hideAll: function() {\n $( '#CheckoutErrorPane' ).hide();\n $( '#CheckoutErrorPane' ).find( '.plentyErrorBoxInner' ).html( '' );\n }\n\n }\n\n})( jQuery, PlentyFramework );","(function( $, pm )\n{\n\n pm.partials.Modal = {\n\n /**\n * Will be called after a new modal was created and injected into DOM\n * @param {HTMLElement} element The injected modal element\n * @param {Modal} modal The instance of the current modal\n */\n init: function( element, modal )\n {\n element.on( 'hidden.bs.modal', function()\n {\n modal.hide();\n if( !modal.selector )\n {\n //Do not remove static modals\n element.remove();\n }\n } );\n\n if ( modal.timeout > 0 )\n {\n element.on( 'hide.bs.modal', modal.stopTimeout );\n element.find( '.modal-content' ).hover( function()\n {\n modal.pauseTimeout();\n }, function()\n {\n if ( element.is( '.in' ) )\n {\n modal.continueTimeout();\n }\n } );\n }\n },\n\n /**\n * Will be called if a Modal requests to show.\n * @param {HTMLElement} element The injected modal element\n */\n show: function( element )\n {\n element.modal( 'show' );\n },\n\n /**\n * Will be called if a Modal requests to hide.\n * @param {HTMLElement} element The injected modal element\n */\n hide: function( element )\n {\n element.modal( 'hide' );\n },\n\n /**\n * Detect if a given HTML string contains a modal\n * @param {HTMLElement} html the element to search a modal in.\n * @returns {boolean} true if a modal was found\n */\n isModal: function( html )\n {\n return $( html ).filter( '.modal' ).length + $( html ).find( '.modal' ).length > 0;\n },\n\n /**\n * Filter a modal from a given HTML string\n * @param {HTMLElement} html the element to get a modal from.\n * @returns {HTMLElement} the filtered modal element\n */\n getModal: function( html )\n {\n var modal = $( html );\n if ( modal.length > 1 )\n {\n modal = $( html ).filter( '.modal' ) || $( html ).find( '.modal' );\n }\n\n return modal;\n }\n\n };\n\n}( jQuery, PlentyFramework ));","(function( $ )\n{\n\n $( document ).on( 'initPartials', function( e, root )\n {\n\n $( root ).find( '[data-toggle=\"tooltip\"]' ).tooltip( {\n container: 'body'\n } );\n\n } );\n\n})( jQuery );","(function( $, pm )\n{\n\n pm.partials.WaitScreen = {\n\n /**\n * Will be called if the wait screen should be shown\n * @param {HTMLElement} element The wait screen element\n */\n show: function( element )\n {\n element.addClass( 'in' );\n },\n\n /**\n * Will be called if the wait screen should be hidden\n * @param {HTMLElement} element The wait screen element\n */\n hide: function( element )\n {\n element.removeClass( 'in' );\n }\n\n };\n\n})( jQuery, PlentyFramework );","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.service( 'AddressDoctorService', function( API )\n {\n return {\n validateAddress: validateAddress\n };\n\n function validateAddress( addressForms )\n {\n var addressIsValid = true;\n addressForms = addressForms || '[data-plenty-address-doctor]';\n $( addressForms ).filter( '[data-plenty-address-doctor]:visible' ).each( function( i, form )\n {\n var addressDoctor = new AddressDoctor( form );\n var requiredFields = $( form ).attr( 'data-plenty-address-doctor' ).replace( /\\s/g, '' ).split( ',' );\n if ( !addressDoctor.isValid( requiredFields ) )\n {\n addressIsValid = false;\n }\n\n } );\n\n return addressIsValid;\n }\n\n function AddressDoctor( form )\n {\n var $form = $( form );\n var $inputs = {\n Street : $form.find( 'input[name=\"Street\"]' ),\n ZIP : $form.find( 'input[name=\"ZIP\"]' ),\n City : $form.find( 'input[name=\"City\"]' ),\n HouseNo: $form.find( 'input[name=\"HouseNo\"]' )\n };\n var $suggestionContainer = {};\n\n var suggestions;\n var requiredFields;\n\n return {\n isValid: isValid\n };\n\n function isValid( fields )\n {\n\n if ( isPackstation() )\n {\n return true;\n }\n\n suggestions = new AddressList( $form.getFormValues() );\n requiredFields = fields;\n\n refreshView();\n\n return suggestions.getAddresses().length == 1;\n }\n\n function refreshView()\n {\n $( '.suggestion-list' ).remove();\n\n var suggestionListVisible = false;\n for ( var i = 0; i < requiredFields.length; i++ )\n {\n if ( !validateInput( requiredFields[i], suggestionListVisible ) )\n {\n $form.trigger( 'validationFailed' );\n suggestionListVisible = true;\n }\n }\n\n if ( suggestions.houseNoAllowed( $inputs.HouseNo.val() ) || suggestions.getAddresses().length == 1 )\n {\n $inputs.HouseNo.removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs.HouseNo.addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n }\n else\n {\n $inputs.HouseNo.removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs.HouseNo.addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n }\n }\n\n function validateInput( key, suggestionListVisible )\n {\n var valueList = suggestions.getList( key );\n\n if ( !!$suggestionContainer[key] )\n {\n $suggestionContainer[key].remove();\n }\n\n if ( !$inputs[key] )\n {\n return true;\n }\n\n if ( valueList.length == 1 )\n {\n $inputs[key].val( valueList[0] );\n\n $inputs[key].removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs[key].addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n return true;\n }\n else\n {\n $inputs[key].removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs[key].addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n\n if ( !suggestionListVisible )\n {\n buildSuggestionList( $inputs[key], valueList );\n }\n $inputs[key].off( 'focus' );\n $inputs[key].focus();\n return false;\n\n }\n }\n\n function positionSuggestionList( $parent, suggestionKey )\n {\n $suggestionContainer[suggestionKey].css( {\n 'width': $parent.outerWidth( true ),\n 'left' : $parent.position().left,\n 'top' : $parent.position().top + $parent.outerHeight( true )\n } );\n }\n\n function buildSuggestionList( $parent, values )\n {\n var suggestionKey = $parent.attr( 'name' );\n\n // render html content\n $suggestionContainer[suggestionKey] = $( pm.compileTemplate( 'addressSuggestions/addressDoctor.html', {values: values} ) );\n\n positionSuggestionList( $parent, suggestionKey );\n\n $( window ).on( 'sizeChange', function()\n {\n positionSuggestionList( $parent, suggestionKey );\n } );\n\n // bind click event to list elements\n $suggestionContainer[suggestionKey].find( '[data-address-value]' ).each( function( i, elem )\n {\n\n var $elem = $( elem );\n var value = $elem.attr( 'data-address-value' );\n\n $elem.click( function()\n {\n // insert clicked value in input\n $parent.val( value );\n\n // filter addresses and show remaining suggestions\n var filterAddress = {};\n filterAddress[$parent.attr( 'name' )] = value;\n suggestions.filter( filterAddress );\n\n // refresh suggestion lists\n refreshView();\n\n } );\n\n } );\n\n // inject html\n $parent.parent().append( $suggestionContainer[suggestionKey] );\n }\n\n function isPackstation()\n {\n return ( $inputs.Street.val().toUpperCase() == \"PACKSTATION\" || $inputs.Street.val().toUpperCase() == \"POSTFILIALE\" );\n }\n\n }\n\n function AddressList( addressInput )\n {\n var addresses = [];\n\n init();\n\n return {\n getAddresses : getAddresses,\n getList : getList,\n filter : filter,\n houseNoAllowed: houseNoAllowed\n };\n\n function init()\n {\n API.get( '/rest/checkout/addresssuggestionresultslist/', {\n suggestionType: \"addressdoctor\",\n street : addressInput.Street,\n ZIP : addressInput.ZIP,\n city : addressInput.City,\n houseNo : addressInput.HouseNo,\n country : addressInput.CountryID\n }, false, false, true ).done( function( response )\n {\n\n var responseLength = response.data.length;\n\n for ( var i = 0; i < responseLength; i++ )\n {\n var currentResponse = response.data[i];\n\n var address = getAddress( currentResponse )\n if ( !address )\n {\n currentResponse.HouseNo = [currentResponse.HouseNo];\n addresses.push( currentResponse );\n }\n else\n {\n address.HouseNo.push( currentResponse.HouseNo );\n }\n\n }\n\n } );\n }\n\n function getAddress( suggestion )\n {\n var addressCount = addresses.length;\n\n for ( var j = 0; j < addressCount; j++ )\n {\n if ( suggestion.Street == addresses[j].Street && addresses.ZIP == addresses[j].ZIP && suggestion.City == addresses[j].City )\n {\n return addresses[j];\n }\n }\n\n return null;\n\n }\n\n function getAddresses()\n {\n return addresses;\n }\n\n function getList( key )\n {\n var results = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( $.inArray( address[key], results ) < 0 )\n {\n results.push( address[key] );\n }\n }\n\n return results;\n }\n\n function filter( filterAddress )\n {\n var filteredAddresses = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( (!!filterAddress.Street && filterAddress.Street == address.Street)\n || (!!filterAddress.ZIP && filterAddress.ZIP == address.ZIP)\n || (!!filterAddress.City && filterAddress.City == address.City) )\n {\n filteredAddresses.push( address );\n }\n }\n\n addresses = filteredAddresses;\n }\n\n function houseNoAllowed( houseNo )\n {\n houseNo = parseInt( houseNo );\n\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n\n for ( var j = 0; j < address.HouseNo.length; j++ )\n {\n var range = address.HouseNo[j].split( '-' );\n if ( ( range.length == 1 && houseNo == range[0] )\n || range.length == 2 && houseNo >= range[0] && houseNo <= range[1] )\n {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for logging in and out and registering new customers.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    \n * @class AuthenticationService\n * @static\n */\n pm.service( 'AuthenticationService', function( API, Checkout, UI )\n {\n\n return {\n resetPassword : resetPassword,\n customerLogin : customerLogin,\n setInvoiceAddress: setInvoiceAddress,\n registerCustomer : registerCustomer\n };\n\n /**\n * Reading E-Mail from form marked with data-plenty-checkout=\"lostPasswordForm\"\n * and sends request to provide a new password to the entered E-Mail-Address.\n *\n * @function resetPasswort\n * @return {object} jQuery deferred\n * Object\n */\n function resetPassword()\n {\n\n var form = $( '[data-plenty-checkout=\"lostPasswordForm\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n var params = {\n Email: values.Email\n };\n\n return API.post( \"/rest/checkout/lostpassword/\", params )\n .done( function( response )\n {\n if ( response.data.IsMailSend == true )\n {\n $( '[data-plenty-checkout=\"lostPasswordTextContainer\"]' ).hide();\n $( '[data-plenty-checkout=\"lostPasswordSuccessMessage\"]' ).show();\n }\n } );\n\n }\n }\n\n /**\n * Try to login in with credentials read from given <form> - element.\n * On success redirect to forms 'action' attribute.\n *\n * @function customerLogin\n * @param {object} form The jQuery-wrapped form-element to read the credentials from\n * @return {object} jQuery deferred\n * Object\n */\n function customerLogin( form )\n {\n if ( form.validateForm() )\n {\n var values = form.getFormValues();\n\n var params = {\n Email : values.loginMail,\n Password: values.loginPassword\n };\n\n UI.showWaitScreen();\n return API.post( \"/rest/checkout/login/\", params )\n .done( function()\n {\n // successful login -> go to form's target referenced by action-attribute\n window.location.assign( form.attr( 'action' ) );\n\n } );\n }\n }\n\n /**\n * Setting the invoice address of a newly registered customer or a guest.\n *\n * @function setInvoiceAddress\n * @param {object} invoiceAddress containing address-data sent to server\n * @return {object} jQuery deferred\n * Object\n */\n function setInvoiceAddress( invoiceAddress )\n {\n\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n Checkout.getCheckout().CustomerInvoiceAddress = response.data;\n } );\n }\n\n /**\n * Prepare address-data to register new customer. Read the address-data from a <form> marked with\n * data-plenty-checkout-form=\"customerRegistration\"
    \n * On success, redirect to forms target referenced by action-attribute\n *\n * @function registerCustomer\n * @return {object} jQuery deferred\n * Object\n */\n function registerCustomer()\n {\n var form = $( '[data-plenty-checkout-form=\"customerRegistration\"]' );\n\n if ( form.validateForm() && pm.getInstance().AddressDoctorService.validateAddress() )\n {\n var values = form.getFormValues();\n values.LoginType = 2;\n\n if ( values.checkout\n && values.checkout.customerInvoiceAddress\n && values.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = values.checkout.customerInvoiceAddress.CustomerProperty;\n values.CustomerPropertiesList = values.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n values.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n return setInvoiceAddress( values )\n .done( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } );\n }\n }\n }, ['APIFactory', 'CheckoutFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for adding, editing or removing basket items and coupon codes
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class BasketService\n * @static\n */\n pm.service( 'BasketService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n addItem : addBasketItem,\n removeItem : removeBasketItem,\n getItem : getBasketItem,\n setItemQuantity : setItemQuantity,\n editItemAttributes: editItemAttributes,\n editOrderParams : editOrderParams,\n addCoupon : addCoupon,\n removeCoupon : removeCoupon\n };\n\n /**\n * Add item to basket. Will fail and show a popup if item has order params\n * @function addBasketItem\n * @param {Array} article Array containing the item to add\n * @param {boolean} [isUpdate=false] Indicating if item's OrderParams are updated\n * @return {object} jQuery deferred\n * Object\n */\n function addBasketItem( article )\n {\n\n if ( !!article )\n {\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/',\n {\n itemID : article[0].BasketItemItemID,\n quantity: article[0].BasketItemQuantity\n }, false, true ).done( function( resp )\n {\n // checking for order params!\n if ( resp.data[0].indexOf( \"form-group\" ) > 0 )\n {\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Select order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n addArticle( saveOrderParams( article ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n }\n else\n {\n addArticle( article );\n }\n } );\n }\n }\n\n /**\n * Read OrderParams from <form> marked with data-plenty-checkout-form=\"OrderParamsForm\" and inject\n * read values in 'addBasketList'. Update item by calling addBasketItem() again\n * @function saveOrderParams\n * @private\n * @param {Array} articleWithParams Containing the current item to add. Read OrderParams will be injected\n */\n function saveOrderParams( articleWithParams )\n {\n //TODO use $(\"[data-plenty-checkout-form='OrderParamsForm']\").serializeArray() to get order params\n var orderParamsForm = $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' );\n var $self = {};\n var attrType = \"\";\n var match;\n\n //Groups\n orderParamsForm.find( '[name^=\"ParamGroup\"]' ).each( function()\n {\n match = this.name.match( /^ParamGroup\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], $( this ).val(), $( this ).val() );\n } );\n\n //Values\n orderParamsForm.find( '[name^=\"ParamValue\"]' ).each( function()\n {\n $self = $( this );\n attrType = $self.attr( 'type' );\n\n if ( ((attrType == 'checkbox' && $self.is( ':checked' )) ||\n (attrType == 'radio' && $self.is( ':checked' )) ||\n (attrType != 'radio' && attrType != 'checkbox')) && attrType != 'file' && attrType != 'hidden' )\n {\n\n var match = $self[0].name.match( /^ParamValue\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], $self.val() );\n\n }\n else if ( attrType == 'file' )\n {\n if ( $self[0].files && $self[0].files.length > 0 )\n {\n articleWithParams = orderParamFileUpload( $self, articleWithParams );\n }\n else\n {\n var match = $self[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n var paramValue = $( 'input[type=\"hidden\"][name=\"ParamValue[' + match[1] + '][' + match[2] + ']\"]' ).val();\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], paramValue );\n }\n }\n } );\n\n return articleWithParams;\n }\n\n function addArticle( article )\n {\n API.post( '/rest/checkout/basketitemslist/', article, true )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n // Show confirmation popup\n CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', {ArticleID: article[0].BasketItemItemID} ).from( 'ItemView' )\n .done( function( response )\n {\n var timeout = pm.getGlobal( 'TimeoutItemToBasketOverlay', 5000 );\n var modal = Modal.prepare().setContent( response.data[0] );\n\n if ( timeout > 0 )\n {\n modal.setTimeout( timeout );\n }\n\n modal.show();\n } );\n } );\n } ).fail( function( jqXHR )\n {\n // some other error occured\n UI.printErrors( JSON.parse( jqXHR.responseText ).error.error_stack );\n } );\n }\n\n function updateArticle( article )\n {\n API.put( '/rest/checkout/basketitemslist/', article )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n } );\n } )\n }\n\n function orderParamFileUpload( $input, articleWithParams )\n {\n var key = $input[0].id;\n var orderParamUploadFiles = {};\n var orderParamFileIdStack = [];\n var formData;\n var fileData;\n var params = {\n type : 'POST',\n data : {},\n isFile : true,\n cache : false,\n dataType : 'json',\n processData: false,\n contentType: false\n };\n\n orderParamUploadFiles[key] = $input[0].files;\n\n // if input not pushed before.\n if ( orderParamFileIdStack.indexOf( key ) == -1 )\n {\n orderParamFileIdStack.push( key );\n }\n\n for ( var i = 0, length = orderParamFileIdStack.length; i < length; ++i )\n {\n formData = new FormData();\n fileData = orderParamUploadFiles[orderParamFileIdStack[i]];\n formData.append( \"0\", fileData[0], fileData[0].name );\n\n params.data = formData;\n\n API.post( \"/rest/checkout/orderparamfile/\", params );\n }\n\n var match = $input[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n\n return addOrderParamValue( articleWithParams, match[1], match[2], orderParamUploadFiles[key][0]['name'] );\n }\n\n /**\n * Inject an OrderParam.\n * @function addOrderParamValue\n * @private\n * @param {Array} basketList The target to inject the value in.\n * @param {number} position Position where to inject the value\n * @param {number} paramId The ID of the OrderParam to inject\n * @param {string|number} paramValue the value of the OrderParam to inject\n * @returns {Array} Containing the item and the injected OrderParam\n */\n function addOrderParamValue( basketList, position, paramId, paramValue )\n {\n if ( position > 0 && basketList[position] == undefined )\n {\n basketList[position] = $.extend( true, {}, basketList[0] );\n basketList[position].BasketItemOrderParamsList = [];\n }\n\n if ( basketList[position] != undefined )\n {\n basketList[position].BasketItemQuantity = 1;\n if ( basketList[position].BasketItemOrderParamsList == undefined )\n {\n basketList[position].BasketItemOrderParamsList = [];\n }\n if ( paramValue )\n {\n basketList[position].BasketItemOrderParamsList.push( {\n BasketItemOrderParamID : paramId,\n BasketItemOrderParamValue: paramValue\n } );\n }\n }\n\n return basketList;\n }\n\n function editItemAttributes( BasketItemID )\n {\n var modal = $( '[data-plenty-basket-item=\"' + BasketItemID + '\"]' );\n modal.modal( 'show' );\n modal.find( '[data-plenty-modal=\"confirm\"]' ).on( 'click', function()\n {\n var basketItem = getBasketItem( BasketItemID );\n var attributesList = [];\n\n // check for select or list of images\n modal.find( 'select, .PlentyFormContainer.AttrImage > input[type=\"hidden\"]' ).each( function( i, attributeSelect )\n {\n var match = attributeSelect.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( attributeSelect ).val()\n } );\n }\n\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItem.BasketItemAttributesList = attributesList;\n }\n //update basketItem and refresh previewLists\n updateArticle( [basketItem] );\n\n } );\n }\n\n function editOrderParams( BasketItemID )\n {\n\n var basketItem = getBasketItem( BasketItemID );\n // FIX: unset old order params\n\n basketItem.BasketItemOrderParamsList = [];\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/', {\n itemID : basketItem.BasketItemItemID,\n quantity : basketItem.BasketItemQuantity,\n basketItemID: BasketItemID\n } ).done( function( resp )\n {\n // checking for order params!\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Edit order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n updateArticle( saveOrderParams( [basketItem] ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n } );\n }\n\n function getBasketItem( BasketItemID )\n {\n var basketItems = Checkout.getCheckout().BasketItemsList;\n for ( var i = 0; i < basketItems.length; i++ )\n {\n if ( basketItems[i].BasketItemID == BasketItemID )\n {\n return basketItems[i];\n }\n }\n\n return null;\n }\n\n /**\n * Remove item from basket. Will show a confirmation popup at first.\n * @function removeBasketItem\n * @param {number} BasketItemID The ID of the basket item to remove\n * @param {boolean} [forceDelete=false] Set true to remove the basket item without showing a confirmation popup\n * @return Promise\n */\n function removeBasketItem( BasketItemID, forceDelete )\n {\n\n var deferred = $.Deferred();\n\n // get item name\n var itemName = getBasketItem( BasketItemID ).BasketItemNameMap[1];\n\n // calling the delete request\n function doDelete()\n {\n API.delete( '/rest/checkout/basketitemslist/?basketItemIdsList[0]=' + BasketItemID )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n //$( '[data-basket-item-id=\"' + BasketItemID + '\"]' ).remove();\n\n if ( !Checkout.getCheckout().BasketItemsList || Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n }\n else\n {\n // FALLBACK if design not support selector\n // [data-plenty-checkout-template=\"BasketItemsList\"]\n if ( $( '[data-plenty-checkout-template=\"BasketItemsList\"]' ).length >= 0 )\n {\n API.get( \"/rest/checkout/container_checkoutbasketitemslist/\" ).done( function( response )\n {\n var $oldBasketList = $( '[data-basket-item-id]' ).parents( \"ul\" );\n var $basketListContainer = $oldBasketList.parents( \".panel-body\" );\n $oldBasketList.fadeOut( function()\n {\n $( this ).siblings( \":not('[data-plenty-checkout-template]')\" ).remove();\n $( this ).remove();\n $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn(function() {\n pm.getInstance().bindDirectives( $basketListContainer );\n });\n } );\n } );\n }\n else\n {\n Checkout.reloadContainer( 'BasketItemsList' );\n }\n Checkout.reloadContainer( 'Totals' );\n }\n\n refreshBasketPreview();\n\n deferred.resolve();\n } );\n } );\n }\n\n if ( !forceDelete )\n {\n // show confirmation popup\n Modal.prepare()\n .setTitle( pm.translate( 'Please confirm' ) )\n .setContent( '

    ' + pm.translate( \"Do you really want to remove \\\"{{item}}\\\" from your basket?\", {item: itemName} ) + '

    ' )\n .onDismiss( function()\n {\n //$('[data-basket-item-id=\"' + BasketItemID +\n // '\"]').find('[data-plenty=\"quantityInput\"]').val(originalItemQuantity);\n deferred.reject();\n } )\n .onConfirm( function()\n {\n doDelete();\n } )\n .setLabelConfirm( pm.translate( \"Delete\" ) )\n .show();\n }\n else\n {\n doDelete();\n }\n\n return deferred;\n }\n\n /**\n * Set a new quantity for the given BasketItem. If quantity is set to 0,\n * remove the item.\n * @function setItemQuantity\n * @param {number} BasketItemID The ID of the basket item to change the quantity of\n * @param {number} BasketItemQuantity The new quantity to set or 0 to remove the item\n */\n function setItemQuantity( BasketItemID, BasketItemQuantity )\n {\n // delete item if quantity is 0\n if ( BasketItemQuantity <= 0 )\n {\n return removeBasketItem( BasketItemID );\n }\n\n var deferred = $.Deferred();\n var params = Checkout.getCheckout().BasketItemsList;\n var basketItem;\n var basketItemIndex;\n\n for ( var i = 0; i < params.length; i++ )\n {\n if ( params[i].BasketItemID == BasketItemID )\n {\n basketItemIndex = i;\n basketItem = params[i];\n break;\n\n }\n }\n\n if ( !!basketItem && basketItem.BasketItemQuantity != BasketItemQuantity )\n {\n params[basketItemIndex].BasketItemQuantity = parseInt( BasketItemQuantity );\n\n API.post( \"/rest/checkout/basketitemslist/\", params )\n .done( function()\n {\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n refreshBasketPreview();\n deferred.resolve();\n } );\n } );\n }\n\n return deferred;\n }\n\n /**\n * Reload BasketPreview-Template and update basket totals\n * @function refreshBasketPreview\n * @private\n */\n function refreshBasketPreview()\n {\n\n Checkout.reloadItemContainer( 'BasketPreviewList' )\n .done( function()\n {\n\n $( '[data-plenty-basket-empty]' ).each( function( i, elem )\n {\n var toggleClass = $( elem ).attr( 'data-plenty-basket-empty' );\n if ( Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n $( elem ).addClass( toggleClass );\n }\n else\n {\n $( elem ).removeClass( toggleClass );\n }\n } );\n\n } );\n\n //update quantity\n var itemQuantityTotal = 0;\n $.each( Checkout.getCheckout().BasketItemsList, function( i, basketItem )\n {\n itemQuantityTotal += basketItem.BasketItemQuantity;\n } );\n\n $( '[data-plenty-basket-preview=\"itemQuantityTotal\"]' ).text( itemQuantityTotal );\n $( '[data-plenty-basket-preview=\"totalsItemSum\"]' ).text( Checkout.getCheckout().Totals.TotalsItemSum );\n }\n\n /**\n * Read the coupon code from an <input> element marked with data-plenty-checkout-form=\"couponCode\"\n * and try to add this coupon.\n * @function addCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function addCoupon()\n {\n var params = {\n CouponActiveCouponCode: $( '[data-plenty-checkout-form=\"couponCode\"]' ).val()\n };\n\n return API.post( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n\n updateContainer();\n } );\n } );\n }\n\n /**\n * Remove the currently added coupon\n * @function removeCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function removeCoupon()\n {\n var params = {\n CouponActiveCouponCode: Checkout.getCheckout().Coupon.CouponActiveCouponCode\n };\n\n return API.delete( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n delete Checkout.getCheckout().Coupon;\n\n updateContainer();\n } );\n } );\n }\n\n // update container\n function updateContainer()\n {\n Checkout.reloadContainer( 'Coupon' );\n // reload totals, if we are at basket\n if ( $( '[data-plenty-checkout-template=\"Totals\"]' ).length > 0 )\n {\n Checkout.reloadContainer( 'Totals' );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for checkout process like setting shipping & payment information and placing the order.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutService\n * @static\n */\n pm.service( 'CheckoutService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n init : init,\n setCustomerSignAndInfo: setCustomerSignAndInfo,\n registerGuest : registerGuest,\n setShippingProfile : setShippingProfile,\n saveShippingAddress : saveShippingAddress,\n loadAddressSuggestion : loadAddressSuggestion,\n preparePayment : preparePayment,\n setMethodOfPayment : setMethodOfPayment,\n confirmAtrigaPaymax : confirmAtrigaPaymax,\n editBankDetails : editBankDetails,\n editCreditCard : editCreditCard,\n placeOrder : placeOrder\n };\n\n /**\n * Load checkout data initially on page load\n * @function init\n */\n function init()\n {\n Checkout.loadCheckout( true );\n }\n\n /**\n * Read customer sign and order information text from <form> marked with\n * data-plenty-checkout-form=\"details\" and update checkout.\n * @function setCustomerSignAndInfo\n * @return {object} jQuery deferred\n * Object\n */\n function setCustomerSignAndInfo()\n {\n var form = $( '[data-plenty-checkout-form=\"details\"]' );\n var values = form.getFormValues();\n\n // initialize CustomerSign & InfoText to avoid updating empty values\n if ( !Checkout.getCheckout().CheckoutCustomerSign )\n {\n Checkout.getCheckout().CheckoutCustomerSign = \"\";\n }\n if ( !Checkout.getCheckout().CheckoutOrderInfoText )\n {\n Checkout.getCheckout().CheckoutOrderInfoText = \"\";\n }\n\n if ( ( Checkout.getCheckout().CheckoutCustomerSign !== values.CustomerSign && $( form ).find( '[name=\"CustomerSign\"]' ).length > 0 )\n || ( Checkout.getCheckout().CheckoutOrderInfoText !== values.OrderInfoText && $( form ).find( '[name=\"OrderInfoText\"]' ).length > 0 ) )\n {\n\n Checkout.getCheckout().CheckoutCustomerSign = values.CustomerSign;\n Checkout.getCheckout().CheckoutOrderInfoText = values.OrderInfoText;\n\n return Checkout.setCheckout();\n\n }\n else\n {\n // No changes detected -> Do nothing\n return API.idle();\n }\n }\n\n /**\n * Read address data from <form> marked with data-plenty-checkout-form=\"shippingAddress\".\n * Create new shipping address or update the shipping address ID.\n * @function saveShippingAddress\n * @param {boolean} [validateForm = false] validate form before processing requests\n * @return {object} jQuery deferred\n * Object\n */\n function saveShippingAddress( validateForm )\n {\n var form = $( '[data-plenty-checkout-form=\"shippingAddress\"]' );\n\n if ( !validateForm && !form.validateForm() )\n {\n return false;\n }\n\n if ( !validateForm && !pm.getInstance().AddressDoctorService.validateAddress( form ) )\n {\n return false;\n }\n\n var values = form.getFormValues();\n var shippingAddressID = $( '[name=\"shippingAddressID\"]:checked' ).val();\n\n // TODO: move bootstrap specific function\n $( '#shippingAdressSelect' ).modal( 'hide' );\n //Modal.prepare( '#shippingAdressSelect' ).hide();\n\n if ( shippingAddressID < 0 )\n {\n // save separate\n var shippingAddress = values;\n\n if ( !addressesAreEqual( shippingAddress, Checkout.getCheckout().CustomerShippingAddress ) )\n {\n if ( shippingAddress.Street == \"PACKSTATION\" )\n {\n shippingAddress.IsPackstation = 1;\n shippingAddress.PackstationNo = shippingAddress.HouseNo;\n }\n else if ( shippingAddress.Street == \"POSTFILIALE\" )\n {\n shippingAddress.IsPostfiliale = 1;\n shippingAddress.PostfilialNo = shippingAddress.HouseNo;\n }\n\n // new shipping address\n return API.post( \"/rest/checkout/customershippingaddress/\", shippingAddress )\n .done( function( response )\n {\n\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = response.data.ID;\n Checkout.getCheckout().CheckoutShippingCountryID = response.data.CountryID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n } );\n } );\n }\n else\n {\n // no changes detected\n return API.idle();\n }\n\n }\n else\n {\n if ( shippingAddressID != Checkout.getCheckout().CheckoutCustomerShippingAddressID )\n {\n // change shipping address id\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = shippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n } );\n }\n else\n {\n return API.idle();\n }\n }\n }\n\n /**\n * Prepare address-data to register a guest. Reads the address-data from a <form> marked with\n * data-plenty-checkout-form=\"guestRegistration\"\n * @function registerGuest\n * @return {object} jQuery deferred\n * Object\n */\n function registerGuest()\n {\n var form = $( '[data-plenty-checkout-form=\"guestRegistration\"]' );\n\n var invoiceAddress = form.getFormValues();\n invoiceAddress.LoginType = 1;\n\n if ( invoiceAddress.checkout\n && invoiceAddress.checkout.customerInvoiceAddress\n && invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty;\n invoiceAddress.CustomerPropertiesList = invoiceAddress.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n invoiceAddress.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n if ( !addressesAreEqual( invoiceAddress, Checkout.getCheckout().CustomerInvoiceAddress ) )\n {\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n saveShippingAddress().done( Checkout.loadCheckout );\n } );\n }\n else\n {\n return saveShippingAddress();\n }\n }\n\n /**\n * Check if values of addresses are equal\n * @function addressesAreEqual\n * @private\n * @param {object} address1\n * @param {object} address2\n * @returns {boolean}\n */\n function addressesAreEqual( address1, address2 )\n {\n for ( var key in address1 )\n {\n if ( address1[key] + '' !== address2[key] + '' && key !== 'EmailRepeat' )\n {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Set the shipping profile used for this order and update checkout. Selected shipping profile will be\n * read from <form> marked with data-plenty-checkout-form=\"shippingProfileSelect\"\n * @function setShippingProfile\n * @return {object} jQuery deferred\n * Object\n */\n function setShippingProfile()\n {\n\n var values = $( '[data-plenty-checkout-form=\"shippingProfileSelect\"]' ).getFormValues();\n\n Checkout.getCheckout().CheckoutShippingProfileID = values.ShippingProfileID;\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n\n }\n\n /**\n * Prepare method of payment to check if external checkout is used or addition content should be displayed\n * @function preparePayment\n * @return {object} jQuery deferred\n * Object\n */\n function preparePayment()\n {\n var paymentID = Checkout.getCheckout().CheckoutMethodOfPaymentID;\n var paymentData = $( 'input[type=\"radio\"][name=\"MethodOfPaymentID\"][value=\"' + paymentID + '\"]' ).parent().getFormValues();\n return API.post( \"/rest/checkout/preparepayment/\", paymentData, true )\n .done( function( response )\n {\n if ( response.data.CheckoutMethodOfPaymentRedirectURL != '' )\n {\n\n document.location.assign( response.data.CheckoutMethodOfPaymentRedirectURL );\n\n }\n else if ( !!response.data.CheckoutMethodOfPaymentAdditionalContent )\n {\n\n var isBankDetails = $( response.data.CheckoutMethodOfPaymentAdditionalContent ).find( '[data-plenty-checkout-form=\"bankDetails\"]' ).length > 0;\n Modal.prepare()\n .setContent( response.data.CheckoutMethodOfPaymentAdditionalContent )\n .onConfirm( function()\n {\n if ( isBankDetails )\n {\n return saveBankDetails();\n }\n else\n {\n return saveCreditCard();\n }\n } )\n .show();\n }\n } )\n .fail( function( jqXHR )\n {\n try\n {\n var response = $.parseJSON( jqXHR.responseText );\n\n var errorStack = [];\n for ( var i = 0; i < response.error.error_stack.length; i++ )\n {\n if ( response.error.error_stack[i].code == 651 )\n {\n // notify atriga validation errors\n Checkout.reloadContainer( 'MethodsOfPaymentList' ).done(function() {\n $(document).trigger('plenty.AtrigaValidationFailed');\n });\n }\n else\n {\n errorStack.push( response.error.error_stack[i] );\n }\n }\n\n // display remaining errors\n if( errorStack.length > 0 )\n {\n UI.printErrors(errorStack);\n }\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n } );\n\n }\n\n /**\n * Set the method of payment used for this order.\n * @function setMethodOfPayment\n * @param {number|undefined} paymentID ID of the method of payment to use. Read from <form> marked with\n * data-plenty-checkout-form=\"methodOfPayment\" if unset.\n * @return {object} jQuery deferred\n * Object\n */\n function setMethodOfPayment( paymentID )\n {\n /*\n var methodsOfPaymentList = Checkout.getCheckout().MethodsOfPaymentList;\n var methodOfPayment;\n for( var i = 0; i < methodsOfPaymentList.length; i++ )\n {\n if( methodsOfPaymentList[i].MethodOfPaymentID == paymentID )\n {\n methodOfPayment = methodsOfPaymentList[i];\n break;\n }\n }\n */\n\n if( !paymentID )\n {\n // FIX for older callisto layouts (< 3.3): get payment id from input field\n paymentID = $('input[name=\"MethodOfPaymentID\"]:checked').val();\n }\n\n Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID;\n\n if ( !pm.getGlobal( 'Checkout.AtrigaRequireUserConfirmation' ) )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = true;\n }\n\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'ShippingProfilesList' );\n } );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxChecked )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = !!atrigaPaymaxChecked;\n return API.put( '/rest/checkout', {\n CheckoutAtrigapaymaxChecked: !!atrigaPaymaxChecked\n } );\n //return Checkout.setCheckout();\n }\n\n /**\n * Display the popup to enter or edit customers bank details\n * @function editBankDetails\n */\n function editBankDetails()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationBankDetails' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveBankDetails();\n } )\n .show();\n } );\n\n }\n\n /**\n * Read entered bank details from data-plenty-checkout-form=\"bankDetails\" and update checkout.\n * @function saveBankDetails\n * @private\n * @return {boolean} the result of form validation\n */\n function saveBankDetails()\n {\n var form = $( '[data-plenty-checkout-form=\"bankDetails\"]' );\n\n if ( form.validateForm() )\n {\n var values = form.getFormValues().checkout.customerBankDetails;\n\n var bankDetails = {\n CustomerBankName : values.bankName,\n CustomerBLZ : values.blz,\n CustomerAccountNumber: values.accountNo,\n CustomerAccountOwner : values.accountOwner,\n CustomerIBAN : values.iban,\n CustomerBIC : values.bic\n };\n\n API.post( \"/rest/checkout/paymentinformationbankdetails/\", bankDetails )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n setMethodOfPayment( 3 );\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing credit card form\n * @function editCreditCard\n */\n function editCreditCard()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationCreditCard' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveCreditCard();\n } )\n .show();\n } );\n }\n\n /**\n * Read values from <form> marked with data-plenty-checkout-form=\"creditCard\" and update checkout.\n * @function saveCreditCard\n * @private\n * @return {boolean} the result of form validation\n */\n function saveCreditCard()\n {\n var form = $( '[data-plenty-checkout-form=\"creditCard\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues().checkout.paymentInformationCC;\n\n var creditCard = {\n Owner : values.owner,\n Cvv2 : values.cvv2,\n Number : values.number,\n Year : values.year,\n Month : values.month,\n Provider: values.provider\n };\n\n API.post( '/rest/checkout/paymentinformationcreditcard/', creditCard )\n .done( function()\n {\n Checkout.loadCheckout();\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing address suggestions\n * @param {string} type\n */\n function loadAddressSuggestion( type )\n {\n\n //check login type\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n var values = $( '[data-plenty-checkout-form=\"shippingAddress\"]' ).getFormValues();\n }\n else\n {\n var values = $( '[data-plenty-checkout-form=\"guestRegistration\"]' ).getFormValues();\n }\n\n var params = {\n street : values.Street,\n houseNo : values.HouseNo,\n ZIP : values.ZIP,\n city : values.City,\n postnummer : values.Postnummer,\n suggestionType: 'postfinder'\n };\n\n CMS.getContainer( 'CheckoutAddressSuggestionResultsList', params ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .show();\n } );\n }\n\n /**\n * Place the order prepared before and finish the checkout process.
    \n * Validate required checkboxes in data-plenty-checkout-form=\"placeOrder\"\n * @function placeOrder\n * @return {object} jQuery deferred\n * Object\n */\n function placeOrder()\n {\n var form = $( '[data-plenty-checkout-form=\"placeOrder\"]' );\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n // if not shown in layout set default 1 for mandatory fields\n var params = {\n TermsAndConditionsCheck : values.termsAndConditionsCheck || 0,\n WithdrawalCheck : values.withdrawalCheck || 0,\n PrivacyPolicyCheck : values.privacyPolicyCheck || 0,\n AgeRestrictionCheck : values.ageRestrictionCheck || 0,\n NewsletterCheck : values.newsletterCheck || 0,\n KlarnaTermsAndConditionsCheck: values.klarnaTermsAndConditionsCheck || 0,\n PayoneDirectDebitMandateCheck: values.payoneDirectDebitMandateCheck || 0,\n PayoneInvoiceCheck : values.payoneInvoiceCheck || 0\n };\n\n return API.post( \"/rest/checkout/placeorder/\", params )\n .done( function( response )\n {\n if ( response.data.MethodOfPaymentRedirectURL != '' )\n {\n\n window.location.assign( response.data.MethodOfPaymentRedirectURL );\n\n }\n else if ( response.data.MethodOfPaymentAdditionalContent != '' )\n {\n\n Modal.prepare()\n .setContent( response.data.MethodOfPaymentAdditionalContent )\n .setLabelDismiss( '' )\n .onDismiss( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).onConfirm( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).show();\n\n }\n else\n {\n\n window.location.assign( form.attr( 'action' ) );\n\n }\n } );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n pm.service( 'FeedbackService', function( API )\n {\n\n return {\n getFeedbacks : getFeedbacks,\n addFeedback : addFeedback,\n ArticleTypes : articleTypes(),\n FeedbackTypes: feedbackTypes()\n };\n\n /*\n FeedbackService\n .getFeedbacks().between('2014-12-03', '2015-07-01')\n .for( FeedbackService.ArticleTypes.ITEM, 2732, FeedbackService.FeedbackTypes.COMMENTS_ONLY );\n */\n function getFeedbacks()\n {\n var feedbackInterval = {\n dateStart: null,\n dateEnd : null\n };\n\n return {\n between: setFeedbackInterval,\n for : listFeedbacks\n };\n\n function setFeedbackInterval( start, end )\n {\n feedbackInterval.dateStart = start;\n feedbackInterval.dateEnd = end;\n return this;\n }\n\n function listFeedbacks( articleType, referenceId, feedbackType )\n {\n\n var params = {\n ReferenceId : referenceId,\n FromDate : feedbackInterval.dateStart,\n ToDate : feedbackInterval.dateEnd,\n FeedbackType: feedbackType || feedbackTypes().COMMENTS_AND_RATINGS\n };\n return API.get( '/rest/feedback/' + articleType + '/', params );\n\n }\n }\n\n /*\n FeedbackService\n .addFeedback()\n .withRating( 5 )\n .withComment( 'Hallo' )\n .withAuthor( 'Felix', 'felix.dausch@plentymarkets.com', 123456 )\n .to( FeedbackService.ArticleTypes.ITEM, 2732 );\n */\n function addFeedback()\n {\n\n var params = {\n Rating : 1.0,\n Text : '',\n Author : '',\n Email : '',\n CustomerId: 0\n };\n\n return {\n withRating : withRating,\n withComment: withComment,\n withAuthor : withAuthor,\n to : sendFeedback\n };\n\n function withRating( rating )\n {\n params.Rating = rating;\n return this;\n }\n\n function withComment( comment )\n {\n params.Text = comment;\n return this;\n }\n\n function withAuthor( author, mail, customerID )\n {\n params.Author = author;\n if ( !!mail )\n {\n params.Email = mail;\n }\n if ( !!customerID )\n {\n params.CustomerId = customerID;\n }\n return this;\n }\n\n function sendFeedback( articleType, referenceId )\n {\n return API.post( '/rest/feedback/' + articleType + '/', params );\n\n }\n\n }\n\n function feedbackTypes()\n {\n return {\n COMMENTS_ONLY : 'comments_only',\n RATINGS_ONLY : 'ratings_only',\n COMMENTS_AND_RATINGS: 'comments_with_ratings'\n }\n }\n\n function articleTypes()\n {\n return {\n ITEM : 'item',\n CATEGORY: 'category',\n BLOG : 'blog'\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Listens to window's size and trigger 'sizeChange' event if the Bootstrap interval changes.\n * @class MediaSizeService\n * @static\n * @example\n * $(window).on('sizeChange', function(newValue, oldValue) {\n * console.log('The interval changed from ' + oldValue + ' to ' + newValue.');\n * });\n */\n pm.service( 'MediaSizeService', function()\n {\n\n var bsInterval;\n\n // recalculation of the current interval on window resize\n $( window ).resize( calculateMediaSize );\n\n // initially calculation of the interval\n $( document ).ready( calculateMediaSize );\n\n return {\n interval : getInterval,\n isInterval: isInterval\n };\n\n /**\n * Get the currently used Bootstrap interval\n * @function getInterval\n * @return {\"xs\"|\"sm\"|\"md\"|\"lg\"}\n */\n function getInterval()\n {\n if ( !!bsInterval )\n {\n calculateMediaSize();\n }\n\n return bsInterval;\n }\n\n /**\n * Calculate the currently used Bootstrap interval\n * @function calculateMediaSize\n * @private\n */\n function calculateMediaSize()\n {\n var size;\n if ( !!window.matchMedia )\n { // FIX IE support\n if ( window.matchMedia( '(min-width:1200px)' ).matches )\n {\n size = 'lg';\n }\n else if ( window.matchMedia( '(min-width:992px)' ).matches )\n {\n size = 'md';\n }\n else if ( window.matchMedia( '(min-width:768px)' ).matches )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n else\n {\n if ( $( window ).width() >= 1200 )\n {\n size = 'lg';\n }\n else if ( $( window ).width() >= 992 )\n {\n size = 'md';\n }\n else if ( $( window ).width() >= 768 )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n if ( size != bsInterval || size === 'xs' )\n {\n var oldValue = bsInterval;\n bsInterval = size;\n $( window ).trigger( 'sizeChange', [bsInterval, oldValue] );\n }\n }\n\n function isInterval( interval )\n {\n var intervalList = interval.replace( /\\s/g, '' ).split( ',' );\n for ( var i = 0; i < intervalList.length; i++ )\n {\n if ( intervalList[i] == bsInterval )\n {\n return true;\n }\n }\n return false;\n }\n\n } );\n\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Handling navigation while checkout processes\n * @class NavigatorService\n * @static\n *\n */\n pm.service( 'NavigatorService', function( CMS, Checkout )\n {\n var navigation = [];\t\t// contains navigation list elements\n var container = [];\t\t// content containers\n var current = -1;\t\t// index of currently shown content container\n var buttonPrev = {};\t\t// navigation buttons\n var buttonNext = {};\n var interceptors = {\n beforeChange: [],\n afterChange : []\n };\n var checkoutStates = [];\n\n return {\n init : init,\n getCurrentContainer: getCurrentContainer,\n goTo : goTo,\n beforeChange : beforeChange,\n afterChange : afterChange,\n continueChange : continueChange,\n next : next,\n previous : previous,\n goToID : goToID,\n fillNavigation : fillNavigation\n };\n\n /**\n * Initialize checkout navigation. Shows first container.\n * @function init\n * @example\n * ```html\n * \n *
      \n *
    • Checkout Step 1
    • \n *
    • Checkout Step 2
    • \n *
    • ...
    • \n *
    \n * \n *\n *
    \n *
    \n * Checkout Step 1 Content\n *
    \n *
    \n * Checkout Step 2 Content\n *
    \n *
    ...
    \n *
    \n * ```\n */\n function init()\n {\n\n // get elements from DOM\n navigation = $( '[data-plenty-checkout=\"navigation\"] > li' );\n container = $( '[data-plenty-checkout=\"container\"] > div' );\n buttonNext = $( '[data-plenty-checkout=\"next\"]' );\n buttonPrev = $( '[data-plenty-checkout=\"prev\"]' );\n\n if ( navigation.length == container.length && container.length > 0 )\n {\n var checkout = Checkout.getCheckout();\n\n container.hide();\n\n // initialize navigation\n navigation.each( function( i, elem )\n {\n $( elem ).addClass( 'disabled' );\n // handle navigation click events\n $( elem ).click( function()\n {\n if ( !$( this ).is( '.disabled' ) )\n {\n goTo( i );\n }\n } );\n } );\n\n buttonNext.attr( \"disabled\", \"disabled\" );\n buttonNext.click( function()\n {\n next();\n } );\n\n buttonPrev.attr( \"disabled\", \"disabled\" );\n buttonPrev.click( function()\n {\n previous();\n } );\n\n window.addEventListener( 'hashchange', function()\n {\n if ( window.location.hash.length > 0 )\n {\n goToID( window.location.hash );\n }\n else\n {\n goTo( 0 );\n }\n }, false );\n\n // initialize GUI\n // check url param for jumping to tab\n $.urlParam = function( name )\n {\n var results = new RegExp( '[\\?&]' + name + '=([^&#]*)' ).exec( window.location.href );\n if ( results == null )\n {\n return null;\n }\n else\n {\n return results[1] || 0;\n }\n };\n\n var param = $.urlParam( 'gototab' );\n // jump to hash from url param 'gototab'\n if ( window.location.hash.length == 0 && !!param && $( '[data-plenty-checkout-id=\"' + param + '\"]' ).length > 0 )\n {\n window.location.hash = param;\n }\n // jump to hash\n else if ( !goToID( window.location.hash ) && current >= 0 )\n {\n goTo( current );\n }\n else\n {\n goTo( 0 );\n }\n\n fillNavigation();\n $( window ).on( 'sizeChange', fillNavigation );\n $( window ).resize( function()\n {\n if ( pm.getInstance().MediaSizeService.interval() == 'xs' )\n {\n fillNavigation();\n }\n } );\n\n }\n }\n\n /**\n * Get the currently active checkout container.\n * @function getCurrentContainer\n * @return {{id: string, index: number}}\n */\n function getCurrentContainer()\n {\n if ( current >= 0 )\n {\n return {\n id : $( container[current] ).attr( 'data-plenty-checkout-id' ),\n index: current\n };\n }\n else\n {\n return null;\n }\n }\n\n /**\n * Register an interceptor called before each tab change.\n * Tabchange will break if any interceptor returns false.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n * @example\n * plenty.NavigatorService.beforeChange( function(targetContainer) {\n * if( targetContainer.id === 'details' ) {\n * // stop tabchange if user tries to access checkout container with id \"details\"\n * return false;\n * }\n * return true;\n * });\n */\n function beforeChange( interceptor )\n {\n interceptors.beforeChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Register an interceptor called after each tab change.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n */\n function afterChange( interceptor )\n {\n interceptors.afterChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Call registered interceptors. Break if any interceptor returns false.\n * Do not call beforeChange-interceptors on initially tabchange\n * @function resolveInterceptors\n * @private\n * @param {\"beforeChange\"|\"afterChange\"} identifier Describe which interceptors should be called\n * @param {number} index the index of the target container\n * @returns {boolean} Conjunction of all interceptor return values\n */\n function resolveInterceptors( identifier, index )\n {\n var continueTabChange = true;\n\n if ( current >= 0 || identifier === 'afterChange' )\n {\n\n var currentContainer = getCurrentContainer();\n var targetContainer = {\n index: index,\n id : $( container[index] ).attr( 'data-plenty-checkout-id' )\n };\n\n $.each( interceptors[identifier], function( i, interceptor )\n {\n if ( interceptor( currentContainer, targetContainer ) === false )\n {\n continueTabChange = false;\n return false;\n }\n } );\n }\n\n return continueTabChange;\n }\n\n /**\n * Show checkout tab given by index\n * @function goTo\n * @param {number} index Index of target tab, starting at 0\n * @param {boolean} [ignoreInterceptors=false] Set true to not call registered interceptors and force changing\n * tab\n */\n function goTo( index, ignoreInterceptors )\n {\n\n var contentChanged = current !== index;\n\n if ( contentChanged && !ignoreInterceptors )\n {\n if ( !resolveInterceptors( \"beforeChange\", index ) )\n {\n return;\n }\n }\n\n current = index;\n\n if ( !Object.equals( checkoutStates[current], Checkout.getCheckout( true ) ) && contentChanged && !!$( container[current] ).attr( 'data-plenty-checkout-content' ) )\n {\n checkoutStates[current] = Checkout.getCheckout( true );\n // reload tab content\n CMS.getCategoryContent( $( container[current] ).attr( 'data-plenty-checkout-content' ) )\n .done( function( response )\n {\n $( container[current] ).html( response.data[0] );\n // continue tab change\n proceedTabChange( contentChanged );\n pm.getInstance().bindDirectives( container[current] );\n $( window ).trigger( 'contentChanged' );\n } );\n }\n else\n {\n // continue tab change without reloading tab content\n proceedTabChange( contentChanged );\n //pm.getInstance().bindDirectives();\n }\n\n }\n\n function proceedTabChange( contentChanged )\n {\n\n // hide content containers\n $( container ).hide();\n\n // refresh navigation elements\n var $elem;\n $( navigation ).each( function( i, elem )\n {\n $elem = $( elem );\n $elem.removeClass( 'disabled active' );\n\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'false' );\n\n if ( i < current )\n {\n // set current element as active\n $elem.addClass( 'visited' );\n }\n else\n {\n if ( i == current )\n {\n $elem.addClass( 'active visited' );\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'true' );\n }\n else\n {\n if ( i > current && !$elem.is( '.visited' ) )\n {\n // disable elements behind active\n $elem.addClass( 'disabled' );\n }\n }\n }\n } );\n fillNavigation();\n\n // hide \"previous\"-button if first content container is shown\n if ( current <= 0 )\n {\n buttonPrev.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonPrev.removeAttr( \"disabled\" );\n }\n\n // hide \"next\"-button if last content container is shown\n if ( current + 1 == navigation.length )\n {\n buttonNext.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonNext.removeAttr( \"disabled\" );\n }\n\n // show current content container\n $( container[current] ).show();\n\n // set location hash\n if ( current > 0 )\n {\n window.location.hash = $( container[current] ).attr( 'data-plenty-checkout-id' );\n }\n else\n {\n if ( window.location.hash.length > 0 )\n {\n window.location.hash = '';\n }\n }\n\n if ( contentChanged )\n {\n resolveInterceptors( \"afterChange\", current );\n }\n }\n\n /**\n * Continue interrupted tabchange. Shorthand for: goTo(targetContainer.index, true)\n * @function continueChange\n * @param targetContainer The tab-object received from an interceptor\n */\n function continueChange( targetContainer )\n {\n goTo( targetContainer.index, true );\n }\n\n /**\n * Show next checkout tab if available. Shorthand for\n * \n * if (current < navigation.length - 1) {\n * goTo(current + 1);\n * }\n * \n * @function next\n */\n function next()\n {\n if ( current < navigation.length - 1 )\n {\n goTo( current + 1 );\n }\n }\n\n /**\n * Show previous checkout tab if available\n * @function next\n */\n function previous()\n {\n if ( current > 0 )\n {\n goTo( current - 1 );\n }\n }\n\n /**\n * Show checkout tab given by ID\n * @function goToID\n * @param {string} containerID ID of tab to show. Target tab must be marked with\n * data-plenty-checkout-id=\"#...\"\n */\n function goToID( containerID )\n {\n if ( containerID == 'next' )\n {\n next();\n return true;\n }\n else if ( containerID == 'prev' )\n {\n previous();\n return true;\n }\n else\n {\n containerID = containerID.replace( '#', '' );\n $( container ).each( function( i, elem )\n {\n if ( $( elem ).attr( 'data-plenty-checkout-id' ) == containerID )\n {\n goTo( i );\n return true;\n }\n } );\n }\n\n return false;\n }\n\n /**\n * Calculate navigation's width to match its parent element\n * by increasing its items padding.\n * @function fillNavigation\n */\n function fillNavigation()\n {\n // break if manager has not been initialized\n var navigationCount = navigation.length;\n if ( navigationCount <= 0 )\n {\n return;\n }\n\n // reset inline styles\n $( navigation ).removeAttr( 'style' );\n $( navigation ).children( 'span' ).removeAttr( 'style' );\n $( buttonNext ).removeAttr( 'style' );\n $( buttonPrev ).removeAttr( 'style' );\n\n var buttonWidth = ($( buttonPrev ).outerWidth() < $( buttonNext ).outerWidth()) ? $( buttonNext ).outerWidth( true ) + 1 : $( buttonPrev ).outerWidth( true ) + 1;\n $( buttonNext ).css( {width: buttonWidth + 'px'} );\n $( buttonPrev ).css( {width: buttonWidth + 'px'} );\n\n // calculate width to fill\n var width = $( navigation ).parent().parent().outerWidth( true ) - ( 2 * buttonWidth);\n width -= parseInt( $( navigation ).parent().css( 'marginLeft' ) ) + parseInt( $( navigation ).parent().css( 'marginRight' ) );\n\n var padding = width;\n var tabWidth = [];\n\n $( navigation ).each( function( i, elem )\n {\n padding -= parseInt( $( elem ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).css( 'marginRight' ) );\n\n tabWidth[i] = $( elem ).children( 'span' ).width();\n padding -= tabWidth[i];\n\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginRight' ) );\n } );\n\n var paddingEachItem = parseInt( padding / navigationCount );\n\n var paddingLeft, paddingRight;\n if ( paddingEachItem % 2 == 1 )\n {\n paddingLeft = ( paddingEachItem / 2 ) + 0.5;\n paddingRight = ( paddingEachItem / 2 ) - 0.5;\n }\n else\n {\n paddingLeft = paddingEachItem / 2;\n paddingRight = paddingEachItem / 2;\n }\n\n var paddingLastItem = parseInt( padding - ( ( navigationCount - 1 ) * ( paddingLeft + paddingRight ) ) );\n var paddingLastLeft, paddingLastRight;\n if ( paddingLastItem % 2 == 1 )\n {\n paddingLastLeft = ( paddingLastItem / 2 ) + 0.5;\n paddingLastRight = ( paddingLastItem / 2) - 0.5;\n }\n else\n {\n paddingLastLeft = paddingLastItem / 2;\n paddingLastRight = paddingLastItem / 2;\n }\n\n var diff = width;\n $( navigation ).each( function( i, elem )\n {\n if ( i < navigationCount - 1 )\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLeft + 'px', 'paddingRight': paddingRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLeft + paddingRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n else\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLastLeft + 'px', 'paddingRight': paddingLastRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLastLeft + paddingLastRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n } );\n\n //$(navigation).parent().css('marginRight', 0);\n }\n\n }, ['CMSFactory', 'CheckoutFactory'] );\n\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Magnus Martin \n * =====================================================================================\n */\n\n\n(function( $, pm )\n{\n pm.service( 'PostfinderService', function( API, Modal, UIFactory )\n {\n var packstationID = '';\n var shippingFields = {};\n var numberOfResults = {};\n var result = {};\n\n return {\n openPostfinderModal: openPostfinderModal,\n isPackstation : isPackstation\n };\n\n function isPackstation()\n {\n var street = $( 'input[name=\"Street\"]' ).val();\n return ( street.toUpperCase() == \"PACKSTATION\" || street.toUpperCase() == \"POSTFILIALE\" );\n }\n\n function openPostfinderModal()\n {\n shippingFields = {\n PostfinderItemStreet : $( 'input[name=\"Street\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemZIP : $( 'input[name=\"ZIP\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemCity : $( 'input[name=\"City\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemHouseNo: $( 'input[name=\"HouseNo\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' )\n\n };\n\n shippingFields.PostfinderItemStreet.val( '' );\n\n if ( (shippingFields.PostfinderItemZIP.val().length > 2 || shippingFields.PostfinderItemCity.val().length > 2) )\n {\n\n API.get( '/rest/checkout/shippingaddresspostfinderlist/',\n {\n suggestionType: \"postfinder\",\n zip : shippingFields.PostfinderItemZIP.val(),\n city : shippingFields.PostfinderItemCity.val()\n } )\n\n .done( function( response )\n {\n result = response.data;\n numberOfResults = result.length;\n\n if ( numberOfResults == 0 )\n {\n showErrorMessage();\n }\n\n var params = {\n addresses: []\n };\n\n for ( var i = 0; i < numberOfResults; i++ )\n {\n var dimension = 'km';\n var distInMeters = result[i].PostfinderItemDistance;\n var distInKilometers = distInMeters / 1000;\n distInKilometers = ((Math.round( distInKilometers * 100 ) / 100).toFixed( 2 )).replace( '.', ',' );\n\n if ( distInMeters < 1000 )\n {\n distInKilometers = distInMeters;\n dimension = 'm';\n }\n\n params.addresses.push( {\n index : i,\n dimension: dimension,\n type : result[i].PostfinderItemIsPackstation ? 'Packstation' : 'Postfiliale',\n number : result[i].PostfinderItemIsPackstation ? result[i].PostfinderItemPackstationNo : result[i].PostfinderItemPostfilialNo,\n street : result[i].PostfinderItemStreet,\n houseNo : result[i].PostfinderItemHouseNo,\n zip : result[i].PostfinderItemZIP,\n city : result[i].PostfinderItemCity,\n district : result[i].PostfinderItemDistrict,\n distance : distInKilometers,\n remark : result[i].PostfinderItemRemark\n } );\n }\n\n var html = pm.compileTemplate( 'addressSuggestions/postFinder.html', params );\n\n Modal.prepare()\n .setTitle( pm.translate( 'Packstations and post offices in your area' ) )\n .setContent( html )\n .setClass( 'checkout' )\n .onConfirm( function()\n {\n shippingFields.PostfinderItemCity.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemStreet.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemStreet.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemHouseNo.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemHouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n packstationID = $( 'input[type=\"radio\"][name=\"postfinder\"]:checked' ).val();\n\n if ( result[packstationID].PostfinderItemIsPackstation )\n {\n $( shippingFields.PostfinderItemStreet ).val( 'PACKSTATION' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPackstationNo );\n }\n else\n {\n $( shippingFields.PostfinderItemStreet ).val( 'POSTFILIALE' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPostfilialNo );\n }\n $( shippingFields.PostfinderItemStreet ).trigger( 'change' );\n\n $( shippingFields.PostfinderItemCity ).val( result[packstationID].PostfinderItemCity );\n $( shippingFields.PostfinderItemZIP ).val( result[packstationID].PostfinderItemZIP );\n return true;\n } )\n .show()\n } );\n }\n else\n {\n showErrorMessage();\n }\n\n }\n\n function showErrorMessage()\n {\n UIFactory.throwError( 0, pm.translate( 'Please enter a ZIP code and/or a city.' ) );\n\n shippingFields.PostfinderItemCity.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemCity.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n\n shippingFields.PostfinderItemZIP.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n }\n }, ['APIFactory', 'ModalFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide templates for social share providers to inject them dynamically.\n * @class SocialShareService\n * @static\n */\n pm.service( 'SocialShareService', function()\n {\n\n //TODO: move to global variables\n if ( typeof(socialLangLocale) == 'undefined' )\n {\n socialLangLocale = 'en_US';\n }\n if ( typeof(socialLang) == 'undefined' )\n {\n socialLang = 'en';\n }\n\n return {\n getSocialService: getService\n };\n\n /**\n * Get the template for social media provider\n * @function getService\n * @param {string} identifier name of the social media provider to get the template for\n * @returns {string} the template to inject in DOM\n */\n function getService( identifier )\n {\n var services = {\n 'facebook-like': '',\n\n 'facebook-recommend': '',\n\n 'twitter': '',\n\n 'google-plus': '
    '\n + '',\n };\n\n return services[identifier];\n }\n\n /**\n * get the canonical URL if defined\n * @function getURL\n * @private\n * @return {string} The Canonical URL if defined or the current URI\n */\n function getURI()\n {\n var uri = document.location.href;\n var canonical = $( \"link[rel=canonical]\" ).attr( \"href\" );\n\n if ( canonical && canonical.length > 0 )\n {\n if ( canonical.indexOf( \"http\" ) < 0 )\n {\n canonical = document.location.protocol + \"//\" + document.location.host + canonical;\n }\n uri = canonical;\n }\n\n return uri;\n }\n\n /**\n * returns content of <meta name=\"\" content=\"\"> tags or '' if empty/non existant\n * @function getMeta\n * @private\n * @param {string} name The meta name to get the value of;\n */\n function getMeta( name )\n {\n var metaContent = $( 'meta[name=\"' + name + '\"]' ).attr( 'content' );\n return metaContent || '';\n }\n\n /**\n * create tweet text from content of <meta name=\"DC.title\"> and <meta name=\"DC.creator\">\n * fallback to content of <title> tag\n * @function getTweetText\n * @private\n */\n function getTweetText()\n {\n var title = getMeta( 'DC.title' );\n var creator = getMeta( 'DC.creator' );\n\n if ( title.length > 0 && creator.length > 0 )\n {\n title += ' - ' + creator;\n }\n else\n {\n title = $( 'title' ).text();\n }\n\n return encodeURIComponent( title );\n }\n\n } );\n\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide methods for client-side form validation.\n * @class ValidationService\n * @static\n */\n pm.service( 'ValidationService', function()\n {\n\n return {\n validate: validate\n };\n\n /**\n * Check if element is a form element (input, select, textarea) or search for child form elements\n * @function getFormControl\n * @private\n * @param {object} element the element to get the form element from\n * @return {object} a valid form element (input, select, textarea)\n */\n function getFormControl( element )\n {\n element = $( element );\n if ( element.is( 'input' ) || element.is( 'select' ) || element.is( 'textarea' ) )\n {\n return element;\n }\n else\n {\n if ( element.find( 'input' ).length > 0 )\n {\n return element.find( 'input' );\n }\n\n else if ( element.find( 'select' ).length > 0 )\n {\n return element.find( 'select' );\n }\n\n else if ( element.find( 'textarea' ).length > 0 )\n {\n return element.find( 'textarea' );\n }\n\n else\n {\n return null;\n }\n }\n\n }\n\n /**\n * Check given element has any value\n * @function validateText\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateText( formControl )\n {\n // check if formControl is no checkbox or radio\n if ( formControl.is( 'input' ) || formControl.is( 'select' ) || formControl.is( 'textarea' ) )\n {\n // check if length of trimmed value is greater then zero\n return $.trim( formControl.val() ).length > 0;\n\n }\n else\n {\n console.error( 'Validation Error: Cannot validate Text for <' + formControl.prop( \"tagName\" ) + '>' );\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid email-address\n * @function validateMail\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateMail( formControl )\n {\n var mailRegExp = /[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n if ( validateText( formControl ) )\n {\n return mailRegExp.test( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid number\n * @function validateNumber\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateNumber( formControl )\n {\n if ( validateText( formControl ) )\n {\n return $.isNumeric( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is equal to a references value\n * @function validateValue\n * @private\n * @param {object} formControl the form element to validate\n * @param {string} reference the required value\n * @return {boolean}\n */\n function validateValue( formControl, reference )\n {\n if ( $( reference ).length > 0 )\n {\n return $.trim( formControl.val() ) == $.trim( $( reference ).val() );\n }\n else\n {\n return $.trim( formControl.val() ) == reference;\n }\n }\n\n function visibility( formControl )\n {\n return formControl.is( ':visible' );\n }\n\n function isEnabled( formControl )\n {\n return formControl.is( ':enabled' );\n }\n\n /**\n * Validate a form. Triggers event 'validationFailed' if any element has an invalid value\n * @function validate\n * @param {object} form The form element to validate\n * @returns {boolean}\n * @example\n * ```html\n * \n *
    \n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n *
    \n * \n * \n *
    \n *\n *
    \n * ```\n *\n * @example\n * $(form).on('validationFailed', function(missingFields) {\n * // handle missing fields\n * });\n */\n function validate( form, errorClass )\n {\n var formControl, formControls, validationKey, currentHasError, group, checked, checkedMin, checkedMax, attrValidate, validationKeys, formControlAttrType;\n var $form = $( form );\n errorClass = errorClass || 'has-error';\n var missingFields = [];\n var hasError = false;\n\n // check every required input inside form\n $form.find( '[data-plenty-validate], input.Required' ).each( function( i, elem )\n {\n attrValidate = $( elem ).attr( 'data-plenty-validate' );\n formControls = getFormControl( elem )\n // validate text inputs\n validationKeys = !!attrValidate ? attrValidate : 'text';\n validationKeys = validationKeys.split( ',' );\n\n for ( var i = 0, length = formControls.length; i < length; i++ )\n {\n formControl = $( formControls[i] );\n formControlAttrType = formControl.attr( 'type' );\n\n if ( !visibility( formControl ) || !isEnabled( formControl ) )\n {\n return;\n }\n\n validationKey = validationKeys[i].trim() || validationKeys[0].trim();\n currentHasError = false;\n\n // formControl is textfield (text, mail, password) or textarea\n if ( (formControl.is( 'input' )\n && formControlAttrType != 'radio'\n && formControlAttrType != 'checkbox')\n || formControl.is( 'textarea' ) )\n {\n switch ( validationKey )\n {\n\n case 'text':\n currentHasError = !validateText( formControl );\n break;\n\n case 'mail':\n currentHasError = !validateMail( formControl );\n break;\n\n case 'number':\n currentHasError = !validateNumber( formControl );\n break;\n\n case 'value':\n currentHasError = !validateValue( formControl, $( elem ).attr( 'data-plenty-validation-value' ) );\n break;\n\n case 'none':\n // do not validate\n break;\n\n default:\n console.error( 'Form validation error: unknown validate property: \"' + attrValidate + '\"' );\n break;\n }\n }\n else if ( formControl.is( 'input' )\n && (formControlAttrType == 'radio'\n || formControlAttrType == 'checkbox') )\n {\n // validate radio buttons\n group = formControl.attr( 'name' );\n checked = $form.find( 'input[name=\"' + group + '\"]:checked' ).length;\n\n if ( formControlAttrType == 'radio' )\n {\n checkedMin = 1;\n checkedMax = 1;\n }\n else\n {\n var minMax = (new Function(\"return \" + attrValidate))() || {min: 1, max: 1};\n checkedMin = minMax.min;\n checkedMax = minMax.max;\n }\n\n currentHasError = ( checked < checkedMin || checked > checkedMax );\n\n }\n else if ( formControl.is( 'select' ) )\n {\n // validate selects\n currentHasError = ( formControl.val() == '' || formControl.val() == '-1' );\n }\n else\n {\n console.error( 'Form validation error: ' + $( elem ).prop( \"tagName\" ) + ' does not contain an form element' );\n return;\n }\n\n if ( currentHasError )\n {\n hasError = true;\n missingFields.push( formControl );\n\n if ( formControls.length > 1 )\n {\n formControl.addClass( errorClass );\n $form.find( 'label[for=\"' + formControl.attr( 'id' ) + '\"]' ).addClass( errorClass );\n }\n else\n {\n $( elem ).addClass( errorClass );\n }\n }\n }\n\n } );\n\n // scroll to element on 'validationFailed'\n $form.on( 'validationFailed', function()\n {\n var distanceTop = 50;\n var $error = $form.find( '.' + errorClass ).first();\n var errorOffset = $error.offset().top;\n var $scrollTarget = $( 'html, body' );\n\n // if form is inside of modal, scroll modal instead of body\n if ( $form.parents( '.modal' ).length > 0 )\n {\n $scrollTarget = $form.parents( '.modal' ).find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n\n }\n else if ( $form.is( '.modal' ) )\n {\n $scrollTarget = $form.find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n }\n\n // only scroll if error is outside of viewport\n if ( errorOffset - distanceTop < window.pageYOffset || errorOffset > (window.pageYOffset + window.innerHeight) )\n {\n $scrollTarget.animate( {\n scrollTop: errorOffset - distanceTop\n } );\n }\n } );\n\n if ( hasError )\n {\n // remove error class on focus\n $form.find( '.' + errorClass ).each( function( i, elem )\n {\n formControl = $( getFormControl( elem ) );\n formControl.on( 'focus click', function()\n {\n var $errorElement = $( elem );\n $errorElement.removeClass( errorClass );\n $form.find( 'label[for=\"' + $( this ).attr( 'id' ) + '\"]' ).removeClass( errorClass );\n } );\n } );\n\n $form.trigger( 'validationFailed', [missingFields] );\n }\n\n var callback = $form.attr( 'data-plenty-callback' );\n\n if ( !hasError && !!callback && callback != \"submit\" && typeof window[callback] == \"function\" )\n {\n\n var fields = {};\n $form.find( 'input, textarea, select' ).each( function()\n {\n if ( $( this ).attr( 'type' ) == 'checkbox' )\n {\n fields[$( this ).attr( 'name' )] = $( this ).is( ':checked' );\n }\n else\n {\n fields[$( this ).attr( 'name' )] = $( this ).val();\n }\n } );\n\n window[callback]( fields );\n return false;\n }\n else\n {\n return !hasError;\n }\n }\n } );\n\n /**\n * jQuery-Plugin to calling {{#crossLink \"ValidationService/validate\"}}ValidationService.validate{{/crossLink}}\n * on jQuery wrapped elements.\n * @return {boolean}\n */\n $.fn.validateForm = function()\n {\n return pm.getInstance().ValidationService.validate( this );\n };\n\n /**\n * jQuery-Plugin to get the values of contained form elements.\n * @return {object}\n */\n $.fn.getFormValues = function()\n {\n\n var form = this;\n var values = {};\n\n function inject( position, value )\n {\n var match = position.match( /^([^\\[]+)(.*)/ );\n\n if ( !!match[2] )\n {\n var exp = /\\[([^\\]]+)]/g;\n var child;\n var children = [];\n children[0] = match[1];\n while ( (child = exp.exec( match[2] )) !== null )\n {\n children.push( child[1] );\n }\n\n for ( var i = children.length - 1; i >= 0; i-- )\n {\n var val = {};\n val[children[i]] = value;\n value = val;\n }\n values = $.extend( true, values, value );\n }\n else\n {\n values[match[1]] = value;\n }\n }\n\n form.find( 'input, select, textarea' ).each( function( i, elem )\n {\n if ( !!$( elem ).attr( 'name' ) )\n {\n if ( $( elem ).attr( 'type' ) == \"checkbox\" )\n {\n // get checkbox group\n var groupValues = [];\n $( form ).find( '[name=\"' + $( elem ).attr( 'name' ) + '\"]:checked' ).each( function( j, checkbox )\n {\n groupValues.push( $( checkbox ).val() );\n } );\n inject( $( elem ).attr( 'name' ), groupValues );\n }\n else if ( $( elem ).attr( 'type' ) == 'radio' )\n {\n if ( $( elem ).is( ':checked' ) )\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n else\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n\n } );\n return values;\n }\n}( jQuery, PlentyFramework ));","/**\n * Services provide functions to be called from the instanced PlentyFramework.
    \n * Services can inject Factories and can be injected into Directives. The are also\n * available from the global instance of PlentyFramework\n * @module Services\n * @main Services\n * @example\n * PlentyFramework.service('ServiceName', serviceFunctions() {\n * return {\n * functionInService: function() {}\n * }\n * });\n * //...\n * plenty.ServiceName.functionInService/();\n */","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\nPlentyFramework.compile();\n\n// Create global instance of PlentyFramework for usage in Webshop-Layouts\nvar plenty = PlentyFramework.getInstance();\n\n/*\n * initially bind all registered directives\n *\n * will not be tested. reasons:\n * http://stackoverflow.com/questions/29153733/how-to-unit-test-a-document-ready-function-using-jasmine\n */\njQuery( document ).ready( function()\n{\n plenty.bindDirectives();\n} );"]} \ No newline at end of file diff --git a/dist/plentymarketsCMStools-1.0.8.min.js b/dist/plentymarketsCMStools-1.0.8.min.js index 40cfee0..5af6958 100644 --- a/dist/plentymarketsCMStools-1.0.8.min.js +++ b/dist/plentymarketsCMStools-1.0.8.min.js @@ -6,7 +6,7 @@ * @author Felix Dausch * ===================================================================================== */ -var TemplateCache={};TemplateCache["addressSuggestions/addressDoctor.html"]='',TemplateCache["addressSuggestions/postFinder.html"]='{{#addresses}}\n
    \n
    \n \n
    \n
    \n{{/addresses}}\n',TemplateCache["error/errorMessage.html"]='
    \n Code {{code}}:\n {{{message}}}\n
    \n',TemplateCache["error/errorPopup.html"]='
    \n \n
    \n
    \n
    \n',TemplateCache["modal/modal.html"]='\n',TemplateCache["waitscreen/waitscreen.html"]='
    ',function(a,b){"object"==typeof exports&&exports&&"string"!=typeof exports.nodeName?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):(a.Mustache={},b(Mustache))}(this,function(a){function b(a){return"function"==typeof a}function c(a){return p(a)?"array":typeof a}function d(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function e(a,b){return null!=a&&"object"==typeof a&&b in a}function f(a,b){return q.call(a,b)}function g(a){return!f(r,a)}function h(a){return String(a).replace(/[&<>"'\/]/g,function(a){return s[a]})}function i(b,c){function e(){if(r&&!s)for(;q.length;)delete o[q.pop()];else q=[];r=!1,s=!1}function f(a){if("string"==typeof a&&(a=a.split(u,2)),!p(a)||2!==a.length)throw new Error("Invalid tags: "+a);h=new RegExp(d(a[0])+"\\s*"),i=new RegExp("\\s*"+d(a[1])),m=new RegExp("\\s*"+d("}"+a[1]))}if(!b)return[];var h,i,m,n=[],o=[],q=[],r=!1,s=!1;f(c||a.tags);for(var y,z,A,B,C,D,E=new l(b);!E.eos();){if(y=E.pos,A=E.scanUntil(h))for(var F=0,G=A.length;G>F;++F)B=A.charAt(F),g(B)?q.push(o.length):s=!0,o.push(["text",B,y,y+1]),y+=1,"\n"===B&&e();if(!E.scan(h))break;if(r=!0,z=E.scan(x)||"name",E.scan(t),"="===z?(A=E.scanUntil(v),E.scan(v),E.scanUntil(i)):"{"===z?(A=E.scanUntil(m),E.scan(w),E.scanUntil(i),z="&"):A=E.scanUntil(i),!E.scan(i))throw new Error("Unclosed tag at "+E.pos);if(C=[z,A,y,E.pos],o.push(C),"#"===z||"^"===z)n.push(C);else if("/"===z){if(D=n.pop(),!D)throw new Error('Unopened section "'+A+'" at '+y);if(D[1]!==A)throw new Error('Unclosed section "'+D[1]+'" at '+y)}else"name"===z||"{"===z||"&"===z?s=!0:"="===z&&f(A)}if(D=n.pop())throw new Error('Unclosed section "'+D[1]+'" at '+E.pos);return k(j(o))}function j(a){for(var b,c,d=[],e=0,f=a.length;f>e;++e)b=a[e],b&&("text"===b[0]&&c&&"text"===c[0]?(c[1]+=b[1],c[3]=b[3]):(d.push(b),c=b));return d}function k(a){for(var b,c,d=[],e=d,f=[],g=0,h=a.length;h>g;++g)switch(b=a[g],b[0]){case"#":case"^":e.push(b),f.push(b),e=b[4]=[];break;case"/":c=f.pop(),c[5]=b[2],e=f.length>0?f[f.length-1][4]:d;break;default:e.push(b)}return d}function l(a){this.string=a,this.tail=a,this.pos=0}function m(a,b){this.view=a,this.cache={".":this.view},this.parent=b}function n(){this.cache={}}var o=Object.prototype.toString,p=Array.isArray||function(a){return"[object Array]"===o.call(a)},q=RegExp.prototype.test,r=/\S/,s={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},t=/\s*/,u=/\s+/,v=/\s*=/,w=/\s*\}/,x=/#|\^|\/|>|\{|&|=|!/;l.prototype.eos=function(){return""===this.tail},l.prototype.scan=function(a){var b=this.tail.match(a);if(!b||0!==b.index)return"";var c=b[0];return this.tail=this.tail.substring(c.length),this.pos+=c.length,c},l.prototype.scanUntil=function(a){var b,c=this.tail.search(a);switch(c){case-1:b=this.tail,this.tail="";break;case 0:b="";break;default:b=this.tail.substring(0,c),this.tail=this.tail.substring(c)}return this.pos+=b.length,b},m.prototype.push=function(a){return new m(a,this)},m.prototype.lookup=function(a){var c,d=this.cache;if(d.hasOwnProperty(a))c=d[a];else{for(var f,g,h=this,i=!1;h;){if(a.indexOf(".")>0)for(c=h.view,f=a.split("."),g=0;null!=c&&gi;++i)g=void 0,e=a[i],f=e[0],"#"===f?g=this.renderSection(e,b,c,d):"^"===f?g=this.renderInverted(e,b,c,d):">"===f?g=this.renderPartial(e,b,c,d):"&"===f?g=this.unescapedValue(e,b):"name"===f?g=this.escapedValue(e,b):"text"===f&&(g=this.rawValue(e)),void 0!==g&&(h+=g);return h},n.prototype.renderSection=function(a,c,d,e){function f(a){return g.render(a,c,d)}var g=this,h="",i=c.lookup(a[1]);if(i){if(p(i))for(var j=0,k=i.length;k>j;++j)h+=this.renderTokens(a[4],c.push(i[j]),d,e);else if("object"==typeof i||"string"==typeof i||"number"==typeof i)h+=this.renderTokens(a[4],c.push(i),d,e);else if(b(i)){if("string"!=typeof e)throw new Error("Cannot use higher-order sections without the original template");i=i.call(c.view,e.slice(a[3],a[5]),f),null!=i&&(h+=i)}else h+=this.renderTokens(a[4],c,d,e);return h}},n.prototype.renderInverted=function(a,b,c,d){var e=b.lookup(a[1]);return!e||p(e)&&0===e.length?this.renderTokens(a[4],b,c,d):void 0},n.prototype.renderPartial=function(a,c,d){if(d){var e=b(d)?d(a[1]):d[a[1]];return null!=e?this.renderTokens(this.parse(e),c,d,e):void 0}},n.prototype.unescapedValue=function(a,b){var c=b.lookup(a[1]);return null!=c?c:void 0},n.prototype.escapedValue=function(b,c){var d=c.lookup(b[1]);return null!=d?a.escape(d):void 0},n.prototype.rawValue=function(a){return a[1]},a.name="mustache.js",a.version="2.1.3",a.tags=["{{","}}"];var y=new n;a.clearCache=function(){return y.clearCache()},a.parse=function(a,b){return y.parse(a,b)},a.render=function(a,b,d){if("string"!=typeof a)throw new TypeError('Invalid template! Template should be a "string" but "'+c(a)+'" was given as the first argument for mustache#render(template, view, partials)');return y.render(a,b,d)},a.to_html=function(c,d,e,f){var g=a.render(c,d,e);return b(f)?void f(g):g},a.escape=h,a.Scanner=l,a.Context=m,a.Writer=n}),function(a){function b(a,b,c,d){a.on(b,function(a){return i.push(a),c.apply(null,d)}),"complete"===document.readyState&&"ready"===b&&c.apply(null,d)}function c(b){var c=a(b);c.is('input[type="checkbox"]')&&c.on("change",function(){c.is(":checked")?c.trigger("check"):c.trigger("uncheck")}),c.is('input[type="radio"]')&&c.on("change",function(){var b=c.attr("name");a('input[type="radio"][name="'+b+'"]').each(function(b,c){var d=a(c);d.is(":checked")?d.trigger("check"):d.trigger("uncheck")})})}function d(a,b){for(var c=/^(([\w]+):)?([\w]+)\.([\w]+)(\((.*)\))?$/,d=a.split(";"),e=[],f=0;f0)for(var j=h[6].match(/(['][^']+['])|([\w-]+)|(["][^"]+["])/g),k=0;k=c&&g.services.hasOwnProperty(i)){PlentyFramework.prototype.hasOwnProperty(i)||e(g.services[i],2,d),f.push(PlentyFramework.prototype[i]);continue}if(1>=c&&g.directives.hasOwnProperty(i)){PlentyFramework.directives.hasOwnProperty(i)||e(g.directives[i],1,d),f.push(PlentyFramework.directives[i]);continue}console.error('Cannot inject dependency "'+i+'": Object not found.')}else console.error("Cyclic dependency injection: "+d.join(" -> ")+" -> "+i)}3==c?PlentyFramework.factories[b.name]=b.setup.apply(null,f):2==c?PlentyFramework.prototype[b.name]=b.setup.apply(null,f):1==c&&(PlentyFramework.directives[b.name]=b.setup.apply(null,f))}var f="1.0.8",g={factories:{},services:{},directives:{}};PlentyFramework=function(){};var h=null;PlentyFramework.getInstance=function(){return h=h||new PlentyFramework},PlentyFramework.version=function(){function a(a){for(var b=f.split("."),c=a.split("."),d=0;dparseInt(c[d]))return 1}return 0}return{get:function(){return f},equals:function(b){return 0==a(b)},compare:a}}(),PlentyFramework.partials={},PlentyFramework.globals={},PlentyFramework.setGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?(console.error('Global variable "'+a+'" already exists and cannot be overridden.'),null):(PlentyFramework.globals[a]=b,PlentyFramework.globals[a])},PlentyFramework.getGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?PlentyFramework.globals[a]:b},PlentyFramework.directives={},PlentyFramework.directive=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.directives[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.prototype.bindDirectives=function(e){e=e||"html",a(e).find("[data-plenty]").each(function(e,f){var g=d(a(f).attr("data-plenty"),a(f));if(!(g.length<=0)){c(f);for(var e=0;e=0;c--)if(a==i[c].type)return i[c];return null},PlentyFramework.pushEvent=function(a){i.push(a)},PlentyFramework.service=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.services[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.factories={},PlentyFramework.factory=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.factories[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.compileTemplate=function(a,b){return b=b||{},b.translate=function(){return function(a,b){return b(PlentyFramework.translate(a))}},Mustache.render(TemplateCache[a],b)},PlentyFramework.scriptPath="",PlentyFramework.Strings={},PlentyFramework.loadLanguageFile=function(b){a.ajax({url:PlentyFramework.scriptPath+b,dataType:"json"}).done(function(a){PlentyFramework.Strings=a})},PlentyFramework.translate=function(a,b){var c;return PlentyFramework.Strings.hasOwnProperty(a)?c=PlentyFramework.Strings[a]:(c=a,console.warn('No translation found for "'+c+'".')),b&&(c=Mustache.render(c,b)),c},PlentyFramework.compile=function(){for(var a in g.factories)PlentyFramework.factories.hasOwnProperty(a)||e(g.factories[a],3);for(var b in g.services)PlentyFramework.prototype.hasOwnProperty(b)||e(g.services[b],2);for(var c in g.directives)PlentyFramework.directives.hasOwnProperty(c)||e(g.directives[c],1);for(var d=document.getElementsByTagName("SCRIPT"),f=d.length-1;f>=0;f--){var h=d[f].src.match(/(.*)\/(.*)\.js(\?\S*)?$/);if(h){PlentyFramework.scriptPath=h[1];break}}}}(jQuery),function(a,b){b.directive("Authentication",function(c){function d(d){b.getRecentEvent().preventDefault(),c.customerLogin(a(d))}return{login:d}},["AuthenticationService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Basket",function(c){function d(d){b.getRecentEvent().preventDefault();var e={},f=a(d),g=f.parents("form");e.BasketItemItemID=g.find('[name="ArticleID"]').val(),e.BasketItemPriceID=g.find('[name="SYS_P_ID"]').val(),e.BasketItemQuantity=g.find('[name="ArticleQuantity"]').val(),e.BasketItemBranchID=g.find('[name="source_category"]').val();var h=g.find('[name^="ArticleAttribute"]'),i=[];a.each(h,function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&i.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=i.length&&(e.BasketItemAttributesList=i),c.addItem([e])}function e(b,c){var d=a(b),e=d.parent().find("input"),f=parseInt(e.attr("maxlength"))||5,g=parseInt(e.val())+c,h=d.parents("[data-basket-item-id]").length>0;if(h){(g+"").length<=f&&g>=0&&e.val(g);var i=d.data("timeout");i&&window.clearTimeout(i),i=window.setTimeout(function(){e.trigger("change")},1e3),d.data("timeout",i)}else(g+"").length<=f&&g>=1&&e.val(g)}function f(b,d){c.setItemQuantity(b,parseInt(a(d).val())).fail(function(){var e=c.getItem(b);a(d).val(e.BasketItemQuantity)})}return{addBasketItem:d,changeItemQuantity:e,setItemQuantity:f}},["BasketService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Checkout",function(a){function b(b){a.setMethodOfPayment(b)}function c(b){a.confirmAtrigaPaymax(b)}return{setMethodOfPayment:b,confirmAtrigaPaymax:c}},["CheckoutService"])}(jQuery,PlentyFramework),function(a,b){b.directive("MobileDropdown",function(c){function d(){a(window).on("orientationchange sizeChange",function(){e(j),e(k)}),a("html").on("click touchstart",function(a){e(k,a)})}function e(b,c){for(var d,e=0;e0?window.location.assign(a(c).attr("href")):window.location.assign(c))}function e(a){c.goToID(a)}return{to:d,toCheckoutTab:e}},["MediaSizeService","NavigatorService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Tab",function(c){function d(b){a(b).tab("show")}function e(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).addLabel(a)}function f(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).setContent(a)}function g(a,d,e){c.isInterval(e)&&(b.getRecentEvent().preventDefault(),j[d]&&j[d].getTab(a)&&j[d].showTab(a))}function h(){function b(a){return g[a]=new i(a),g[a]}function c(b){var c=0;if(f)c=parseInt(f.getContent().parent().css("zIndex")),f.hide(),f.getContent().parent().css("zIndex",c-1);else{for(var d in g)if(g[d].getContent()){var h=parseInt(g[d].getContent().parent().css("zIndex"));(0==c||c>h)&&(c=h),g[d].hide()}for(var d in g)g[d].getContent()&&g[d].getContent().parent().css("zIndex",c-1);a(window).on("sizeChange",e)}f=g[b],f.getContent().parent().css("zIndex",c),f.show()}function d(a){return g[a]}function e(){for(var a in g)g[a].getContent()&&g[a].show();f=null}var f,g={};return{addTab:b,showTab:c,getTab:d,resetTabs:e}}function i(a){function b(){return j}function c(a){return i.push(a),this}function d(a){return h=a,this}function e(){return h}function f(){for(var a=0;a0&&(a(document).scrollTop()>100?u(w,"addClass","visible"):u(w,"removeClass","visible"))})}function f(b){a(b).owlCarousel({navigation:!0,navigationText:!1,slideSpeed:1e3,paginationSpeed:1e3,singleItem:!0,autoPlay:6e3,stopOnHover:!0,afterMove:function(b){a(b).find('[data-plenty-rel="lazyload"]').trigger("appear")}})}function g(b,d,e){var f=a(b),g=0,h={},i=f.find('[data-plenty-rel="equal-target"]').length>0?f.find('[data-plenty-rel="equal-target"]'):f.children();e!==!0&&v.push(b);for(var j=i.length;j>=0;j--)h=a(i[j]),h.css("height",""),h.outerHeight(!0)>g&&(g=h.outerHeight(!0));(!d||c.isInterval(d))&&i.height(g)}function h(b){var c=a(b);c.click(function(){return a("html, body").animate({scrollTop:0},400),!1}),a.inArray(c,w)&&w.push(c)}function i(b,c){var d=a(b);d.lazyload({effect:c}),d.is("img")&&d.on("loaded",function(){d.css("display","inline-block")})}function j(b){console.log(b);var c=a(b),d=c.parent();d.addClass("animating"),c.siblings("ul").slideToggle(200,function(){d.is(".open")?d.removeClass("open"):d.addClass("open"),c.siblings("ul").removeAttr("style"),d.removeClass("animating")})}function k(b,c){var d=a(b),e=a(d.attr("data-plenty-rel"));if(d.is('input[type="radio"]')){var f=a('input[type="radio"][name="'+d.attr("name")+'"]'),g=!c||"checked"==c;f.change(function(){var b=a(this);e.parents('[data-plenty-rel="equal-target"]').css("height","auto"),b.is(":checked")&&b[0]===d[0]&&1==g?e.slideDown(400,function(){t()}):e.slideUp(400,function(){t()})})}else d.click(function(){d.addClass("animating"),e.slideToggle(400,function(){d.removeClass("animating"),d.toggleClass("active"),t()})})}function l(b,c){o(a(b),c,"slideDown")}function m(b,c){o(a(b),c,"slideUp")}function n(b,c){o(a(b),c,"slideToggle")}function o(a,b,c){b=b||400,a.parents('[data-plenty-rel="equal-target"]').css("height","auto"),a[c](b,function(){t()})}function p(b,c){var e=a(b),f=e.find('[data-plenty-rel="social-switch"]');e.append(''),f.is("off, on")||f.addClass("off"),f.on("click",function(){f.hasClass("off")&&("tooltip"==e.attr("data-toggle")&&e.tooltip("destroy"),f.removeClass("off").addClass("on"),e.find('[data-plenty-rel="social-placeholder"]').hide(),e.find(".social-container").append(d.getSocialService(c)))})}function q(d,e,f){var g=a(e);if(g.parents(".navbar-main").length>0){var h=g.children("span");return b.directives.MobileDropdown.slideDropdown(h),!0}if(e&&d&&(!f||c.isInterval(f))){var i=b.getRecentEvent();return i&&i.preventDefault(),g.toggleClass(d),!1}}function r(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).addClass(d),!1}}function s(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).removeClass(d),!1}}function t(){for(var a=v.length-1;a>=0;a--)g(v[a],"",!0)}function u(a,b,c){for(var d=a.length-1;d>=0;d--)a[d][b](c)}var v=[],w=[];return{initUIWindowEvents:e,addContentPageSlider:f,equalHeight:g,initToTop:h,initLazyload:i,initSlideToggle:k,slideDown:l,slideUp:m,slideToggle:n,toggleHideShow:j,toggleSocialShare:p,toggleClass:q,addClass:r,removeClass:s}},["MediaSizeService","SocialShareService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Validator",function(a){function b(b,c){return a.validate(b,c)}return{validate:b}},["ValidationService"])}(jQuery,PlentyFramework),function(a,b){b.factory("APIFactory",function(c,d){function e(){b.getGlobal("LoginSession")&&(l&&clearTimeout(l),l=setTimeout(function(){a(window).trigger("login-expired"),"Checkout"===b.getGlobal("PageDesign")&&d.prepare().setTitle(b.translate("Your session has expired.")).setContent(b.translate("Please log in again to continue shopping.")).setLabelDismiss(null).setLabelConfirm(b.translate("OK")).onConfirm(function(){window.location.assign("/")}).onDismiss(function(){window.location.assign("/")}).show()},b.getGlobal("LoginSessionExpiration")))}function f(b){try{var d=a.parseJSON(b.responseText);c.printErrors(d.error.error_stack)}catch(e){c.throwError(b.status,b.statusText)}}function g(b,d,g,h,i){return h||c.showWaitScreen(),a.ajax(b,{type:"GET",data:d,dataType:"json",async:!i,error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function h(b,d,g,h){var i={type:"POST",dataType:"json",error:function(a){g||f(a)}};return d&&d.isFile?(i.cache=d.cache,i.processData=d.processData,i.data=d.data,i.contentType=!1):(i.data=JSON.stringify(d),i.contentType="application/json"),h||c.showWaitScreen(),a.ajax(b,i).always(function(){h||c.hideWaitScreen(),e()})}function i(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"PUT",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function j(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"DELETE",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function k(){return a.Deferred().resolve()}var l=null;return a(document).ready(function(){e()}),{get:g,post:h,put:i,"delete":j,idle:k}},["UIFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a){a.factory("CMSFactory",function(a){function b(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/container_"+b.toLowerCase()+"/",c)}return{from:d}}function c(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/"+b.toLowerCase()+"/",c)}return{from:d}}function d(b){return a.get("/rest/categoryview/categorycontentbody/?categoryID="+b)}return{getContainer:b,getParams:c,getCategoryContent:d}},["APIFactory"])}(PlentyFramework),function(a){a.factory("CheckoutFactory",function(b,c,d){function e(){return l}function f(a){return m&&l||g(!0),a?$.extend(!0,{},l):m}function g(a){return b.get("/rest/checkout/",null,!1,!1,a).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function h(){return b.put("/rest/checkout",m).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function i(b){return c.getContainer("checkout"+b).from("checkout").done(function(c){$('[data-plenty-checkout-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function j(b){return c.getCategoryContent(b).done(function(c){$('[data-plenty-checkout-catcontent="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function k(b){return c.getContainer("itemview"+b).from("itemview").done(function(c){$('[data-plenty-itemview-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}var l,m;return{getCheckout:f,setCheckout:h,loadCheckout:g,reloadContainer:i,reloadCatContent:j,reloadItemContainer:k}},["APIFactory","CMSFactory","UIFactory"])}(PlentyFramework),function(a,b){b.factory("ModalFactory",function(){function c(a){return PlentyFramework.partials.Modal.isModal(a)}function d(a){return new e(a)}function e(d){function e(a){return t.title=a,this}function f(a){return t.cssClass=a,this}function g(a){return t.content=a,this}function h(a){return t.labelConfirm=a,this}function i(a){return t.labelDismiss=a,this}function j(a){return t.onConfirm=a,this}function k(a){return t.onDismiss=a,this}function l(a){return t.container=a,this}function m(a){return t.timeout=a,this}function n(){if(t.selector)u=a(t.selector);else{u=c(t.content)?PlentyFramework.partials.Modal.getModal(t.content):a(PlentyFramework.compileTemplate("modal/modal.html",t)),a(t.container).append(u);var b=a(t.content).filter("script");b.length>0&&b.each(function(b,c){var d=document.createElement("script");d.type="text/javascript",d.innerHTML=a(c).text(),a(t.container).append(d)})}PlentyFramework.partials.Modal.init(u,t),u.find('[data-plenty-modal="confirm"]').click(function(){var a=t.onConfirm();"undefined"==typeof a&&(a=!0),a&&o(!0)}),PlentyFramework.partials.Modal.show(u),t.timeout>0&&p()}function o(a){PlentyFramework.partials.Modal.hide(u),a||t.onDismiss()}function p(){x=t.timeout,y=(new Date).getTime(),v=window.setTimeout(function(){window.clearInterval(w),o()},t.timeout),u.find('[data-plenty-modal="timer"]').text(x/1e3),w=window.setInterval(function(){if(!z){var a=x-(new Date).getTime()+y;a=Math.round(a/1e3),u.find('[data-plenty-modal="timer"]').text(a)}},1e3)}function q(){z=!0,x-=(new Date).getTime()-y,window.clearTimeout(v)}function r(){z=!1,y=(new Date).getTime(),v=window.setTimeout(function(){o(),window.clearInterval(w)},x)}function s(){window.clearTimeout(v),window.clearInterval(w)}var t=this;t.selector=d,t.title="",t.cssClass="",t.content="",t.labelDismiss=b.translate("Cancel"),t.labelConfirm=b.translate("Confirm"),t.onConfirm=function(){},t.onDismiss=function(){},t.container="body",t.timeout=-1,t.hide=o,t.startTimeout=p,t.stopTimeout=s,t.pauseTimeout=q,t.continueTimeout=r;var u,v,w,x,y,z=!1;return{setTitle:e,setClass:f,setContent:g,setContainer:l,setLabelConfirm:h,setLabelDismiss:i,onConfirm:j,onDismiss:k,setTimeout:m,show:n,hide:o}}return{prepare:d,isModal:c}})}(jQuery,PlentyFramework),function(a,b){b.factory("UIFactory",function(){function c(a,b){d([{code:a,message:b}])}function d(c){(!i||a("body").has(i).length<=0)&&(i=a(b.compileTemplate("error/errorPopup.html")),a("body").append(i),b.partials.Error.init(i)),a.each(c,function(c,d){b.partials.Error.addError(i,a(b.compileTemplate("error/errorMessage.html",d)))}),b.partials.Error.show(i),f(!0)}function e(){return h=h||0,(!g||a("body").has(g).length<=0)&&(g=a(b.compileTemplate("waitscreen/waitscreen.html")),a("body").append(g)),b.partials.WaitScreen.show(g),h++,h}function f(a){return h--,(0>=h||a)&&(h=0,b.partials.WaitScreen.hide(g)),h}var g,h=0,i=null;return{throwError:c,printErrors:d,showWaitScreen:e,hideWaitScreen:f}})}(jQuery,PlentyFramework),Object.equals=function(a,b){if(a===b)return!0;if(!(a instanceof Object&&b instanceof Object))return!1;if(a.constructor!==b.constructor)return!1;for(var c in a)if(a.hasOwnProperty(c)){if(!b.hasOwnProperty(c))return!1;if(a[c]!==b[c]){if("object"!=typeof a[c])return!1;if(!Object.equals(a[c],b[c]))return!1}}for(var c in b)if(b.hasOwnProperty(c)&&!a.hasOwnProperty(c))return!1;return!0},PlentyFramework.cssClasses={active:"active"},function(a,b){b.partials.Error={init:function(c){a(c).find(".close").click(function(){b.partials.Error.hideAll()})},addError:function(b,c){var d=a(c).attr("data-plenty-error-code");a(b).find('[data-plenty-error-code="'+d+'"]').length<=0&&a(b).find(".plentyErrorBoxInner").append(c)},show:function(b){a(b).show()},hideAll:function(){a("#CheckoutErrorPane").hide(),a("#CheckoutErrorPane").find(".plentyErrorBoxInner").html("")}}}(jQuery,PlentyFramework),function(a,b){b.partials.Modal={init:function(a,b){a.on("hidden.bs.modal",function(){b.hide(),b.selector||a.remove()}),b.timeout>0&&(a.on("hide.bs.modal",b.stopTimeout),a.find(".modal-content").hover(function(){b.pauseTimeout()},function(){a.is(".in")&&b.continueTimeout()}))},show:function(a){a.modal("show")},hide:function(a){a.modal("hide")},isModal:function(b){return a(b).filter(".modal").length+a(b).find(".modal").length>0},getModal:function(b){var c=a(b);return c.length>1&&(c=a(b).filter(".modal")||a(b).find(".modal")),c}}}(jQuery,PlentyFramework),function(a){a(document).on("initPartials",function(b,c){a(c).find('[data-toggle="tooltip"]').tooltip({container:"body"})})}(jQuery),function(a,b){b.partials.WaitScreen={show:function(a){a.addClass("in")},hide:function(a){a.removeClass("in")}}}(jQuery,PlentyFramework),function(a,b){b.service("AddressDoctorService",function(c){function d(b){var c=!0;return b=b||"[data-plenty-address-doctor]",a(b).filter("[data-plenty-address-doctor]:visible").each(function(b,d){var f=new e(d),g=a(d).attr("data-plenty-address-doctor").replace(/\s/g,"").split(",");f.isValid(g)||(c=!1)}),c}function e(c){function d(a){return j()?!0:(k=new f(m.getFormValues()),l=a,e(),1==k.getAddresses().length)}function e(){a(".suggestion-list").remove();for(var b=!1,c=0;cc;c++){var d=a.data[c],f=e(d);f?f.HouseNo.push(d.HouseNo):(d.HouseNo=[d.HouseNo],j.push(d))}})}function e(a){for(var b=j.length,c=0;b>c;c++)if(a.Street==j[c].Street&&j.ZIP==j[c].ZIP&&a.City==j[c].City)return j[c];return null}function f(){return j}function g(b){for(var c=[],d=j.length,e=0;d>e;e++){var f=j[e];a.inArray(f[b],c)<0&&c.push(f[b])}return c}function h(a){for(var b=[],c=j.length,d=0;c>d;d++){var e=j[d];(a.Street&&a.Street==e.Street||a.ZIP&&a.ZIP==e.ZIP||a.City&&a.City==e.City)&&b.push(e)}j=b}function i(a){a=parseInt(a);for(var b=j.length,c=0;b>c;c++)for(var d=j[c],e=0;e=f[0]&&a<=f[1])return!0}return!1}var j=[];return d(),{getAddresses:f,getList:g,filter:h,houseNoAllowed:i}}return{validateAddress:d}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("AuthenticationService",function(c,d,e){function f(){var b=a('[data-plenty-checkout="lostPasswordForm"]');if(b.validateForm()){var d=b.getFormValues(),e={Email:d.Email};return c.post("/rest/checkout/lostpassword/",e).done(function(b){1==b.data.IsMailSend&&(a('[data-plenty-checkout="lostPasswordTextContainer"]').hide(),a('[data-plenty-checkout="lostPasswordSuccessMessage"]').show())})}}function g(a){if(a.validateForm()){var b=a.getFormValues(),d={Email:b.loginMail,Password:b.loginPassword};return e.showWaitScreen(),c.post("/rest/checkout/login/",d).done(function(){window.location.assign(a.attr("action"))})}}function h(a){return c.post("/rest/checkout/customerinvoiceaddress/",a).done(function(a){d.getCheckout().CustomerInvoiceAddress=a.data})}function i(){var c=a('[data-plenty-checkout-form="customerRegistration"]');if(c.validateForm()&&b.getInstance().AddressDoctorService.validateAddress()){var d=c.getFormValues();if(d.LoginType=2,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var f in e)e[f]&&d.CustomerPropertiesList.push({PropertyID:f,PropertyValue:e[f]})}return h(d).done(function(){window.location.assign(c.attr("action"))})}}return{resetPassword:f,customerLogin:g,setInvoiceAddress:h,registerCustomer:i}},["APIFactory","CheckoutFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("BasketService",function(c,d,e,f,g){function h(d){d&&c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:d[0].BasketItemItemID,quantity:d[0].BasketItemQuantity},!1,!0).done(function(c){c.data[0].indexOf("form-group")>0?g.prepare().setContent(c.data[0]).setTitle(b.translate("Select order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(j(i(d)),!0):!1}).show():j(d)})}function i(b){var c,d=a('[data-plenty-checkout-form="OrderParamsForm"]'),e={},f="";return d.find('[name^="ParamGroup"]').each(function(){c=this.name.match(/^ParamGroup\[(\d+)]\[(\d+)]$/),b=m(b,c[1],a(this).val(),a(this).val())}),d.find('[name^="ParamValue"]').each(function(){if(e=a(this),f=e.attr("type"),("checkbox"==f&&e.is(":checked")||"radio"==f&&e.is(":checked")||"radio"!=f&&"checkbox"!=f)&&"file"!=f&&"hidden"!=f){var c=e[0].name.match(/^ParamValue\[(\d+)]\[(\d+)]$/);b=m(b,c[1],c[2],e.val())}else if("file"==f)if(e[0].files&&e[0].files.length>0)b=l(e,b);else{var c=e[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/),d=a('input[type="hidden"][name="ParamValue['+c[1]+"]["+c[2]+']"]').val();b=m(b,c[1],c[2],d)}}),b}function j(a){c.post("/rest/checkout/basketitemslist/",a,!0).done(function(){f.loadCheckout().done(function(){s(),e.getContainer("ItemViewItemToBasketConfirmationOverlay",{ArticleID:a[0].BasketItemItemID}).from("ItemView").done(function(a){var c=b.getGlobal("TimeoutItemToBasketOverlay",5e3),d=g.prepare().setContent(a.data[0]);c>0&&d.setTimeout(c),d.show()})})}).fail(function(a){d.printErrors(JSON.parse(a.responseText).error.error_stack)})}function k(a){c.put("/rest/checkout/basketitemslist/",a).done(function(){f.reloadCatContent(b.getGlobal("basketCatID")),f.loadCheckout().done(function(){s()})})}function l(a,b){var d,e,f=a[0].id,g={},h=[],i={type:"POST",data:{},isFile:!0,cache:!1,dataType:"json",processData:!1,contentType:!1};g[f]=a[0].files,-1==h.indexOf(f)&&h.push(f);for(var j=0,k=h.length;k>j;++j)d=new FormData,e=g[h[j]],d.append("0",e[0],e[0].name),i.data=d,c.post("/rest/checkout/orderparamfile/",i);var l=a[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/);return m(b,l[1],l[2],g[f][0].name)}function m(b,c,d,e){return c>0&&void 0==b[c]&&(b[c]=a.extend(!0,{},b[0]),b[c].BasketItemOrderParamsList=[]),void 0!=b[c]&&(b[c].BasketItemQuantity=1,void 0==b[c].BasketItemOrderParamsList&&(b[c].BasketItemOrderParamsList=[]),e&&b[c].BasketItemOrderParamsList.push({BasketItemOrderParamID:d,BasketItemOrderParamValue:e})),b}function n(b){var c=a('[data-plenty-basket-item="'+b+'"]');c.modal("show"),c.find('[data-plenty-modal="confirm"]').on("click",function(){var d=p(b),e=[];c.find('select, .PlentyFormContainer.AttrImage > input[type="hidden"]').each(function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&e.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=e.length&&(d.BasketItemAttributesList=e),k([d])})}function o(d){var e=p(d);e.BasketItemOrderParamsList=[],c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:e.BasketItemItemID,quantity:e.BasketItemQuantity,basketItemID:d}).done(function(c){g.prepare().setContent(c.data[0]).setTitle(b.translate("Edit order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(k(i([e])),!0):!1}).show()})}function p(a){for(var b=f.getCheckout().BasketItemsList,c=0;c=0?c.get("/rest/checkout/container_checkoutbasketitemslist/").done(function(c){var d=a("[data-basket-item-id]").parents("ul"),e=d.parents(".panel-body");d.fadeOut(function(){a(this).siblings(":not('[data-plenty-checkout-template]')").remove(),a(this).remove(),e.prepend(a(c.data[0])).hide().fadeIn(function(){b.getInstance().bindDirectives(e)})})}):f.reloadContainer("BasketItemsList"),f.reloadContainer("Totals")),s(),i.resolve()})})}var i=a.Deferred(),j=p(d).BasketItemNameMap[1];return e?h():g.prepare().setTitle(b.translate("Please confirm")).setContent("

    "+b.translate('Do you really want to remove "{{item}}" from your basket?',{item:j})+"

    ").onDismiss(function(){i.reject()}).onConfirm(function(){h()}).setLabelConfirm(b.translate("Delete")).show(),i}function r(d,e){if(0>=e)return q(d);for(var g,h,i=a.Deferred(),j=f.getCheckout().BasketItemsList,k=0;k0&&f.reloadContainer("Totals")}return{addItem:h,removeItem:q,getItem:p,setItemQuantity:r,editItemAttributes:n,editOrderParams:o,addCoupon:t,removeCoupon:u}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("CheckoutService",function(c,d,e,f,g){function h(){f.loadCheckout(!0)}function i(){var b=a('[data-plenty-checkout-form="details"]'),d=b.getFormValues();return f.getCheckout().CheckoutCustomerSign||(f.getCheckout().CheckoutCustomerSign=""),f.getCheckout().CheckoutOrderInfoText||(f.getCheckout().CheckoutOrderInfoText=""),f.getCheckout().CheckoutCustomerSign!==d.CustomerSign&&a(b).find('[name="CustomerSign"]').length>0||f.getCheckout().CheckoutOrderInfoText!==d.OrderInfoText&&a(b).find('[name="OrderInfoText"]').length>0?(f.getCheckout().CheckoutCustomerSign=d.CustomerSign,f.getCheckout().CheckoutOrderInfoText=d.OrderInfoText,f.setCheckout()):c.idle()}function j(d){var e=a('[data-plenty-checkout-form="shippingAddress"]');if(!d&&!e.validateForm())return!1;if(!d&&!b.getInstance().AddressDoctorService.validateAddress(e))return!1;var g=e.getFormValues(),h=a('[name="shippingAddressID"]:checked').val();if(a("#shippingAdressSelect").modal("hide"),0>h){var i=g;return l(i,f.getCheckout().CustomerShippingAddress)?c.idle():("PACKSTATION"==i.Street?(i.IsPackstation=1,i.PackstationNo=i.HouseNo):"POSTFILIALE"==i.Street&&(i.IsPostfiliale=1,i.PostfilialNo=i.HouseNo),c.post("/rest/checkout/customershippingaddress/",i).done(function(a){f.getCheckout().CheckoutCustomerShippingAddressID=a.data.ID,f.getCheckout().CheckoutShippingCountryID=a.data.CountryID,delete f.getCheckout().CheckoutMethodOfPaymentID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList"),f.reloadContainer("ShippingProfilesList"),2==f.getCheckout().CustomerInvoiceAddress.LoginType&&f.reloadContainer("CustomerShippingAddress")})}))}return h!=f.getCheckout().CheckoutCustomerShippingAddressID?(f.getCheckout().CheckoutCustomerShippingAddressID=h,delete f.getCheckout().CheckoutMethodOfPaymentID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList"),f.reloadContainer("ShippingProfilesList"),2==f.getCheckout().CustomerInvoiceAddress.LoginType&&f.reloadContainer("CustomerShippingAddress")})):c.idle()}function k(){var b=a('[data-plenty-checkout-form="guestRegistration"]'),d=b.getFormValues();if(d.LoginType=1,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var g in e)e[g]&&d.CustomerPropertiesList.push({PropertyID:g,PropertyValue:e[g]})}return l(d,f.getCheckout().CustomerInvoiceAddress)?j():c.post("/rest/checkout/customerinvoiceaddress/",d).done(function(a){j().done(f.loadCheckout)})}function l(a,b){for(var c in a)if(a[c]+""!=b[c]+""&&"EmailRepeat"!==c)return!1;return!0}function m(){var b=a('[data-plenty-checkout-form="shippingProfileSelect"]').getFormValues();return f.getCheckout().CheckoutShippingProfileID=b.ShippingProfileID,delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutMethodOfPaymentID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList")})}function n(){var b=f.getCheckout().CheckoutMethodOfPaymentID,e=a('input[type="radio"][name="MethodOfPaymentID"][value="'+b+'"]').parent().getFormValues();return c.post("/rest/checkout/preparepayment/",e,!0).done(function(b){if(""!=b.data.CheckoutMethodOfPaymentRedirectURL)document.location.assign(b.data.CheckoutMethodOfPaymentRedirectURL);else if(b.data.CheckoutMethodOfPaymentAdditionalContent){var c=a(b.data.CheckoutMethodOfPaymentAdditionalContent).find('[data-plenty-checkout-form="bankDetails"]').length>0;g.prepare().setContent(b.data.CheckoutMethodOfPaymentAdditionalContent).onConfirm(function(){return c?r():t()}).show()}}).fail(function(b){try{for(var c=a.parseJSON(b.responseText),e=[],g=0;g0&&d.printErrors(e)}catch(h){d.throwError(b.status,b.statusText)}})}function o(c){return c||(c=a('input[name="MethodOfPaymentID"]:checked').val()),f.getCheckout().CheckoutMethodOfPaymentID=c,b.getGlobal("Checkout.AtrigaRequireUserConfirmation")||(f.getCheckout().CheckoutAtrigapaymaxChecked=!0),delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("ShippingProfilesList")})}function p(a){return f.getCheckout().CheckoutAtrigapaymaxChecked=!!a,c.put("/rest/checkout",{CheckoutAtrigapaymaxChecked:!!a})}function q(){e.getContainer("CheckoutPaymentInformationBankDetails").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return r()}).show()})}function r(){var b=a('[data-plenty-checkout-form="bankDetails"]');if(b.validateForm()){var d=b.getFormValues().checkout.customerBankDetails,e={CustomerBankName:d.bankName,CustomerBLZ:d.blz,CustomerAccountNumber:d.accountNo,CustomerAccountOwner:d.accountOwner,CustomerIBAN:d.iban,CustomerBIC:d.bic};return c.post("/rest/checkout/paymentinformationbankdetails/",e).done(function(){f.loadCheckout().done(function(){o(3),f.reloadContainer("MethodsOfPaymentList")})}),!0}return!1}function s(){e.getContainer("CheckoutPaymentInformationCreditCard").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return t()}).show()})}function t(){var b=a('[data-plenty-checkout-form="creditCard"]');if(b.validateForm()){var d=b.getFormValues().checkout.paymentInformationCC,e={Owner:d.owner,Cvv2:d.cvv2,Number:d.number,Year:d.year,Month:d.month,Provider:d.provider};return c.post("/rest/checkout/paymentinformationcreditcard/",e).done(function(){f.loadCheckout()}),!0}return!1}function u(b){if(2==f.getCheckout().CustomerInvoiceAddress.LoginType)var c=a('[data-plenty-checkout-form="shippingAddress"]').getFormValues();else var c=a('[data-plenty-checkout-form="guestRegistration"]').getFormValues();var d={street:c.Street,houseNo:c.HouseNo,ZIP:c.ZIP,city:c.City,postnummer:c.Postnummer,suggestionType:"postfinder"};e.getContainer("CheckoutAddressSuggestionResultsList",d).from("Checkout").done(function(a){g.prepare().setContent(a.data[0]).show()})}function v(){var b=a('[data-plenty-checkout-form="placeOrder"]');if(b.validateForm()){var d=b.getFormValues(),e={TermsAndConditionsCheck:d.termsAndConditionsCheck||0,WithdrawalCheck:d.withdrawalCheck||0,PrivacyPolicyCheck:d.privacyPolicyCheck||0,AgeRestrictionCheck:d.ageRestrictionCheck||0,NewsletterCheck:d.newsletterCheck||0,KlarnaTermsAndConditionsCheck:d.klarnaTermsAndConditionsCheck||0,PayoneDirectDebitMandateCheck:d.payoneDirectDebitMandateCheck||0,PayoneInvoiceCheck:d.payoneInvoiceCheck||0};return c.post("/rest/checkout/placeorder/",e).done(function(a){""!=a.data.MethodOfPaymentRedirectURL?window.location.assign(a.data.MethodOfPaymentRedirectURL):""!=a.data.MethodOfPaymentAdditionalContent?g.prepare().setContent(a.data.MethodOfPaymentAdditionalContent).setLabelDismiss("").onDismiss(function(){window.location.assign(b.attr("action"))}).onConfirm(function(){window.location.assign(b.attr("action"))}).show():window.location.assign(b.attr("action"))})}}return{init:h,setCustomerSignAndInfo:i,registerGuest:k,setShippingProfile:m,saveShippingAddress:j,loadAddressSuggestion:u,preparePayment:n,setMethodOfPayment:o,confirmAtrigaPaymax:p,editBankDetails:q,editCreditCard:s,placeOrder:v}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("FeedbackService",function(a){function b(){function b(a,b){return e.dateStart=a,e.dateEnd=b,this}function c(b,c,f){var g={ReferenceId:c,FromDate:e.dateStart,ToDate:e.dateEnd,FeedbackType:f||d().COMMENTS_AND_RATINGS};return a.get("/rest/feedback/"+b+"/",g)}var e={dateStart:null,dateEnd:null};return{between:b,"for":c}}function c(){function b(a){return f.Rating=a,this}function c(a){return f.Text=a,this}function d(a,b,c){return f.Author=a,b&&(f.Email=b),c&&(f.CustomerId=c),this}function e(b,c){return a.post("/rest/feedback/"+b+"/",f)}var f={Rating:1,Text:"",Author:"",Email:"",CustomerId:0};return{withRating:b,withComment:c,withAuthor:d,to:e}}function d(){return{COMMENTS_ONLY:"comments_only",RATINGS_ONLY:"ratings_only",COMMENTS_AND_RATINGS:"comments_with_ratings"}}function e(){return{ITEM:"item",CATEGORY:"category",BLOG:"blog"}}return{getFeedbacks:b,addFeedback:c,ArticleTypes:e(),FeedbackTypes:d()}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("MediaSizeService",function(){function b(){return e&&c(),e}function c(){var b;if(b=window.matchMedia?window.matchMedia("(min-width:1200px)").matches?"lg":window.matchMedia("(min-width:992px)").matches?"md":window.matchMedia("(min-width:768px)").matches?"sm":"xs":a(window).width()>=1200?"lg":a(window).width()>=992?"md":a(window).width()>=768?"sm":"xs",b!=e||"xs"===b){var c=e;e=b,a(window).trigger("sizeChange",[e,c])}}function d(a){for(var b=a.replace(/\s/g,"").split(","),c=0;c li'),r=a('[data-plenty-checkout="container"] > div'),u=a('[data-plenty-checkout="next"]'),t=a('[data-plenty-checkout="prev"]'),q.length==r.length&&r.length>0){d.getCheckout();r.hide(),q.each(function(b,c){a(c).addClass("disabled"),a(c).click(function(){a(this).is(".disabled")||j(b)})}),u.attr("disabled","disabled"),u.click(function(){m()}),t.attr("disabled","disabled"),t.click(function(){n()}),window.addEventListener("hashchange",function(){window.location.hash.length>0?o(window.location.hash):j(0)},!1),a.urlParam=function(a){var b=new RegExp("[?&]"+a+"=([^&#]*)").exec(window.location.href);return null==b?null:b[1]||0};var c=a.urlParam("gototab");0==window.location.hash.length&&c&&a('[data-plenty-checkout-id="'+c+'"]').length>0?window.location.hash=c:j(!o(window.location.hash)&&s>=0?s:0),p(),a(window).on("sizeChange",p),a(window).resize(function(){"xs"==b.getInstance().MediaSizeService.interval()&&p()})}}function f(){return s>=0?{id:a(r[s]).attr("data-plenty-checkout-id"),index:s}:null}function g(a){return v.beforeChange.push(a),b.getInstance().NavigatorService}function h(a){return v.afterChange.push(a),b.getInstance().NavigatorService}function i(b,c){var d=!0;if(s>=0||"afterChange"===b){var e=f(),g={index:c,id:a(r[c]).attr("data-plenty-checkout-id")};a.each(v[b],function(a,b){return b(e,g)===!1?(d=!1,!1):void 0})}return d}function j(e,f){var g=s!==e;(!g||f||i("beforeChange",e))&&(s=e,!Object.equals(w[s],d.getCheckout(!0))&&g&&a(r[s]).attr("data-plenty-checkout-content")?(w[s]=d.getCheckout(!0),c.getCategoryContent(a(r[s]).attr("data-plenty-checkout-content")).done(function(c){a(r[s]).html(c.data[0]),k(g),b.getInstance().bindDirectives(r[s]),a(window).trigger("contentChanged")})):k(g))}function k(b){a(r).hide();var c;a(q).each(function(b,d){c=a(d),c.removeClass("disabled active"),c.find('[role="tab"]').attr("aria-selected","false"),s>b?c.addClass("visited"):b==s?(c.addClass("active visited"),c.find('[role="tab"]').attr("aria-selected","true")):b>s&&!c.is(".visited")&&c.addClass("disabled")}),p(),0>=s?t.attr("disabled","disabled"):t.removeAttr("disabled"),s+1==q.length?u.attr("disabled","disabled"):u.removeAttr("disabled"),a(r[s]).show(),s>0?window.location.hash=a(r[s]).attr("data-plenty-checkout-id"):window.location.hash.length>0&&(window.location.hash=""),b&&i("afterChange",s)}function l(a){j(a.index,!0)}function m(){s0&&j(s-1)}function o(b){return"next"==b?(m(),!0):"prev"==b?(n(),!0):(b=b.replace("#",""),a(r).each(function(c,d){return a(d).attr("data-plenty-checkout-id")==b?(j(c),!0):void 0}),!1)}function p(){var b=q.length;if(!(0>=b)){a(q).removeAttr("style"),a(q).children("span").removeAttr("style"),a(u).removeAttr("style"),a(t).removeAttr("style");var c=a(t).outerWidth()c?a(d).children("span").css({paddingLeft:g+"px",paddingRight:h+"px"}):a(d).children("span").css({paddingLeft:j+"px",paddingRight:k+"px"})})}}var q=[],r=[],s=-1,t={},u={},v={beforeChange:[],afterChange:[]},w=[];return{init:e,getCurrentContainer:f,goTo:j,beforeChange:g,afterChange:h,continueChange:l,next:m,previous:n,goToID:o,fillNavigation:p}},["CMSFactory","CheckoutFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("PostfinderService",function(c,d,e){function f(){var b=a('input[name="Street"]').val();return"PACKSTATION"==b.toUpperCase()||"POSTFILIALE"==b.toUpperCase()}function g(){j={PostfinderItemStreet:a('input[name="Street"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemZIP:a('input[name="ZIP"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemCity:a('input[name="City"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemHouseNo:a('input[name="HouseNo"]','[data-plenty-checkout-form="shippingAddress"]')},j.PostfinderItemStreet.val(""),j.PostfinderItemZIP.val().length>2||j.PostfinderItemCity.val().length>2?c.get("/rest/checkout/shippingaddresspostfinderlist/",{suggestionType:"postfinder",zip:j.PostfinderItemZIP.val(),city:j.PostfinderItemCity.val()}).done(function(c){l=c.data,k=l.length,0==k&&h();for(var e={addresses:[]},f=0;k>f;f++){var g="km",m=l[f].PostfinderItemDistance,n=m/1e3;n=(Math.round(100*n)/100).toFixed(2).replace(".",","),1e3>m&&(n=m,g="m"),e.addresses.push({index:f,dimension:g,type:l[f].PostfinderItemIsPackstation?"Packstation":"Postfiliale",number:l[f].PostfinderItemIsPackstation?l[f].PostfinderItemPackstationNo:l[f].PostfinderItemPostfilialNo,street:l[f].PostfinderItemStreet,houseNo:l[f].PostfinderItemHouseNo,zip:l[f].PostfinderItemZIP,city:l[f].PostfinderItemCity,district:l[f].PostfinderItemDistrict,distance:n,remark:l[f].PostfinderItemRemark})}var o=b.compileTemplate("addressSuggestions/postFinder.html",e);d.prepare().setTitle(b.translate("Packstations and post offices in your area")).setContent(o).setClass("checkout").onConfirm(function(){return j.PostfinderItemCity.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemZIP.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemStreet.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemStreet.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemHouseNo.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemHouseNo.attr("id")+'"]').removeClass("has-error").addClass("has-success"),i=a('input[type="radio"][name="postfinder"]:checked').val(),l[i].PostfinderItemIsPackstation?(a(j.PostfinderItemStreet).val("PACKSTATION"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPackstationNo)):(a(j.PostfinderItemStreet).val("POSTFILIALE"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPostfilialNo)),a(j.PostfinderItemStreet).trigger("change"),a(j.PostfinderItemCity).val(l[i].PostfinderItemCity),a(j.PostfinderItemZIP).val(l[i].PostfinderItemZIP),!0}).show()}):h()}function h(){e.throwError(0,b.translate("Please enter a ZIP code and/or a city.")),j.PostfinderItemCity.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemZIP.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemCity.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")}),j.PostfinderItemZIP.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")})}var i="",j={},k={},l={};return{openPostfinderModal:g,isPackstation:f}},["APIFactory","ModalFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("SocialShareService",function(){function b(a){var b={"facebook-like":'',"facebook-recommend":'',twitter:'',"google-plus":'
    '};return b[a]}function c(){var b=document.location.href,c=a("link[rel=canonical]").attr("href");return c&&c.length>0&&(c.indexOf("http")<0&&(c=document.location.protocol+"//"+document.location.host+c),b=c),b}function d(b){var c=a('meta[name="'+b+'"]').attr("content");return c||""}function e(){var b=d("DC.title"),c=d("DC.creator");return b.length>0&&c.length>0?b+=" - "+c:b=a("title").text(),encodeURIComponent(b)}return"undefined"==typeof socialLangLocale&&(socialLangLocale="en_US"),"undefined"==typeof socialLang&&(socialLang="en"),{getSocialService:b}})}(jQuery,PlentyFramework),function(a,b){b.service("ValidationService",function(){function b(b){return b=a(b),b.is("input")||b.is("select")||b.is("textarea")?b:b.find("input").length>0?b.find("input"):b.find("select").length>0?b.find("select"):b.find("textarea").length>0?b.find("textarea"):null}function c(b){return b.is("input")||b.is("select")||b.is("textarea")?a.trim(b.val()).length>0:(console.error("Validation Error: Cannot validate Text for <"+b.prop("tagName")+">"),!1)}function d(b){var d=/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;return c(b)?d.test(a.trim(b.val())):!1}function e(b){return c(b)?a.isNumeric(a.trim(b.val())):!1}function f(b,c){return a(c).length>0?a.trim(b.val())==a.trim(a(c).val()):a.trim(b.val())==c}function g(a){return a.is(":visible")}function h(a){return a.is(":enabled")}function i(i,j){var k,l,m,n,o,p,q,r,s,t,u,v=a(i);j=j||"has-error";var w=[],x=!1;v.find("[data-plenty-validate], input.Required").each(function(i,y){s=a(y).attr("data-plenty-validate"),l=b(y),t=s?s:"text",t=t.split(",");for(var i=0,z=l.length;z>i;i++){if(k=a(l[i]),u=k.attr("type"),!g(k)||!h(k))return;if(m=t[i].trim()||t[0].trim(),n=!1,k.is("input")&&"radio"!=u&&"checkbox"!=u||k.is("textarea"))switch(m){case"text":n=!c(k);break;case"mail":n=!d(k);break;case"number":n=!e(k);break;case"value":n=!f(k,a(y).attr("data-plenty-validation-value"));break;case"none":break;default:console.error('Form validation error: unknown validate property: "'+s+'"')}else if(!k.is("input")||"radio"!=u&&"checkbox"!=u){if(!k.is("select"))return void console.error("Form validation error: "+a(y).prop("tagName")+" does not contain an form element");n=""==k.val()||"-1"==k.val()}else{if(o=k.attr("name"),p=v.find('input[name="'+o+'"]:checked').length,"radio"==u)q=1,r=1;else{var A=new Function("return "+s)()||{min:1,max:1};q=A.min,r=A.max}n=q>p||p>r}n&&(x=!0,w.push(k),l.length>1?(k.addClass(j),v.find('label[for="'+k.attr("id")+'"]').addClass(j)):a(y).addClass(j))}}),v.on("validationFailed",function(){var b=50,c=v.find("."+j).first(),d=c.offset().top,e=a("html, body");v.parents(".modal").length>0?(e=v.parents(".modal").find(".modal-body"),d=e.scrollTop()-(e.offset().top-c.offset().top)):v.is(".modal")&&(e=v.find(".modal-body"),d=e.scrollTop()-(e.offset().top-c.offset().top)),(d-bwindow.pageYOffset+window.innerHeight)&&e.animate({ -scrollTop:d-b})}),x&&(v.find("."+j).each(function(c,d){k=a(b(d)),k.on("focus click",function(){var b=a(d);b.removeClass(j),v.find('label[for="'+a(this).attr("id")+'"]').removeClass(j)})}),v.trigger("validationFailed",[w]));var y=v.attr("data-plenty-callback");if(!x&&y&&"submit"!=y&&"function"==typeof window[y]){var z={};return v.find("input, textarea, select").each(function(){"checkbox"==a(this).attr("type")?z[a(this).attr("name")]=a(this).is(":checked"):z[a(this).attr("name")]=a(this).val()}),window[y](z),!1}return!x}return{validate:i}}),a.fn.validateForm=function(){return b.getInstance().ValidationService.validate(this)},a.fn.getFormValues=function(){function b(b,c){var e=b.match(/^([^\[]+)(.*)/);if(e[2]){var f,g=/\[([^\]]+)]/g,h=[];for(h[0]=e[1];null!==(f=g.exec(e[2]));)h.push(f[1]);for(var i=h.length-1;i>=0;i--){var j={};j[h[i]]=c,c=j}d=a.extend(!0,d,c)}else d[e[1]]=c}var c=this,d={};return c.find("input, select, textarea").each(function(d,e){if(a(e).attr("name"))if("checkbox"==a(e).attr("type")){var f=[];a(c).find('[name="'+a(e).attr("name")+'"]:checked').each(function(b,c){f.push(a(c).val())}),b(a(e).attr("name"),f)}else"radio"==a(e).attr("type")?a(e).is(":checked")&&b(a(e).attr("name"),a(e).val()):b(a(e).attr("name"),a(e).val())}),d}}(jQuery,PlentyFramework),PlentyFramework.compile();var plenty=PlentyFramework.getInstance();jQuery(document).ready(function(){plenty.bindDirectives()}); +var TemplateCache={};TemplateCache["addressSuggestions/addressDoctor.html"]='',TemplateCache["addressSuggestions/postFinder.html"]='{{#addresses}}\n
    \n
    \n \n
    \n
    \n{{/addresses}}\n',TemplateCache["error/errorMessage.html"]='
    \n Code {{code}}:\n {{{message}}}\n
    \n',TemplateCache["error/errorPopup.html"]='
    \n \n
    \n
    \n
    \n',TemplateCache["modal/modal.html"]='\n',TemplateCache["waitscreen/waitscreen.html"]='
    ',function(a,b){"object"==typeof exports&&exports&&"string"!=typeof exports.nodeName?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):(a.Mustache={},b(Mustache))}(this,function(a){function b(a){return"function"==typeof a}function c(a){return p(a)?"array":typeof a}function d(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function e(a,b){return null!=a&&"object"==typeof a&&b in a}function f(a,b){return q.call(a,b)}function g(a){return!f(r,a)}function h(a){return String(a).replace(/[&<>"'\/]/g,function(a){return s[a]})}function i(b,c){function e(){if(r&&!s)for(;q.length;)delete o[q.pop()];else q=[];r=!1,s=!1}function f(a){if("string"==typeof a&&(a=a.split(u,2)),!p(a)||2!==a.length)throw new Error("Invalid tags: "+a);h=new RegExp(d(a[0])+"\\s*"),i=new RegExp("\\s*"+d(a[1])),m=new RegExp("\\s*"+d("}"+a[1]))}if(!b)return[];var h,i,m,n=[],o=[],q=[],r=!1,s=!1;f(c||a.tags);for(var y,z,A,B,C,D,E=new l(b);!E.eos();){if(y=E.pos,A=E.scanUntil(h))for(var F=0,G=A.length;G>F;++F)B=A.charAt(F),g(B)?q.push(o.length):s=!0,o.push(["text",B,y,y+1]),y+=1,"\n"===B&&e();if(!E.scan(h))break;if(r=!0,z=E.scan(x)||"name",E.scan(t),"="===z?(A=E.scanUntil(v),E.scan(v),E.scanUntil(i)):"{"===z?(A=E.scanUntil(m),E.scan(w),E.scanUntil(i),z="&"):A=E.scanUntil(i),!E.scan(i))throw new Error("Unclosed tag at "+E.pos);if(C=[z,A,y,E.pos],o.push(C),"#"===z||"^"===z)n.push(C);else if("/"===z){if(D=n.pop(),!D)throw new Error('Unopened section "'+A+'" at '+y);if(D[1]!==A)throw new Error('Unclosed section "'+D[1]+'" at '+y)}else"name"===z||"{"===z||"&"===z?s=!0:"="===z&&f(A)}if(D=n.pop())throw new Error('Unclosed section "'+D[1]+'" at '+E.pos);return k(j(o))}function j(a){for(var b,c,d=[],e=0,f=a.length;f>e;++e)b=a[e],b&&("text"===b[0]&&c&&"text"===c[0]?(c[1]+=b[1],c[3]=b[3]):(d.push(b),c=b));return d}function k(a){for(var b,c,d=[],e=d,f=[],g=0,h=a.length;h>g;++g)switch(b=a[g],b[0]){case"#":case"^":e.push(b),f.push(b),e=b[4]=[];break;case"/":c=f.pop(),c[5]=b[2],e=f.length>0?f[f.length-1][4]:d;break;default:e.push(b)}return d}function l(a){this.string=a,this.tail=a,this.pos=0}function m(a,b){this.view=a,this.cache={".":this.view},this.parent=b}function n(){this.cache={}}var o=Object.prototype.toString,p=Array.isArray||function(a){return"[object Array]"===o.call(a)},q=RegExp.prototype.test,r=/\S/,s={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},t=/\s*/,u=/\s+/,v=/\s*=/,w=/\s*\}/,x=/#|\^|\/|>|\{|&|=|!/;l.prototype.eos=function(){return""===this.tail},l.prototype.scan=function(a){var b=this.tail.match(a);if(!b||0!==b.index)return"";var c=b[0];return this.tail=this.tail.substring(c.length),this.pos+=c.length,c},l.prototype.scanUntil=function(a){var b,c=this.tail.search(a);switch(c){case-1:b=this.tail,this.tail="";break;case 0:b="";break;default:b=this.tail.substring(0,c),this.tail=this.tail.substring(c)}return this.pos+=b.length,b},m.prototype.push=function(a){return new m(a,this)},m.prototype.lookup=function(a){var c,d=this.cache;if(d.hasOwnProperty(a))c=d[a];else{for(var f,g,h=this,i=!1;h;){if(a.indexOf(".")>0)for(c=h.view,f=a.split("."),g=0;null!=c&&gi;++i)g=void 0,e=a[i],f=e[0],"#"===f?g=this.renderSection(e,b,c,d):"^"===f?g=this.renderInverted(e,b,c,d):">"===f?g=this.renderPartial(e,b,c,d):"&"===f?g=this.unescapedValue(e,b):"name"===f?g=this.escapedValue(e,b):"text"===f&&(g=this.rawValue(e)),void 0!==g&&(h+=g);return h},n.prototype.renderSection=function(a,c,d,e){function f(a){return g.render(a,c,d)}var g=this,h="",i=c.lookup(a[1]);if(i){if(p(i))for(var j=0,k=i.length;k>j;++j)h+=this.renderTokens(a[4],c.push(i[j]),d,e);else if("object"==typeof i||"string"==typeof i||"number"==typeof i)h+=this.renderTokens(a[4],c.push(i),d,e);else if(b(i)){if("string"!=typeof e)throw new Error("Cannot use higher-order sections without the original template");i=i.call(c.view,e.slice(a[3],a[5]),f),null!=i&&(h+=i)}else h+=this.renderTokens(a[4],c,d,e);return h}},n.prototype.renderInverted=function(a,b,c,d){var e=b.lookup(a[1]);return!e||p(e)&&0===e.length?this.renderTokens(a[4],b,c,d):void 0},n.prototype.renderPartial=function(a,c,d){if(d){var e=b(d)?d(a[1]):d[a[1]];return null!=e?this.renderTokens(this.parse(e),c,d,e):void 0}},n.prototype.unescapedValue=function(a,b){var c=b.lookup(a[1]);return null!=c?c:void 0},n.prototype.escapedValue=function(b,c){var d=c.lookup(b[1]);return null!=d?a.escape(d):void 0},n.prototype.rawValue=function(a){return a[1]},a.name="mustache.js",a.version="2.1.3",a.tags=["{{","}}"];var y=new n;a.clearCache=function(){return y.clearCache()},a.parse=function(a,b){return y.parse(a,b)},a.render=function(a,b,d){if("string"!=typeof a)throw new TypeError('Invalid template! Template should be a "string" but "'+c(a)+'" was given as the first argument for mustache#render(template, view, partials)');return y.render(a,b,d)},a.to_html=function(c,d,e,f){var g=a.render(c,d,e);return b(f)?void f(g):g},a.escape=h,a.Scanner=l,a.Context=m,a.Writer=n}),function(a){function b(a,b,c,d){a.on(b,function(a){return i.push(a),c.apply(null,d)}),"complete"===document.readyState&&"ready"===b&&c.apply(null,d)}function c(b){var c=a(b);c.is('input[type="checkbox"]')&&c.on("change",function(){c.is(":checked")?c.trigger("check"):c.trigger("uncheck")}),c.is('input[type="radio"]')&&c.on("change",function(){var b=c.attr("name");a('input[type="radio"][name="'+b+'"]').each(function(b,c){var d=a(c);d.is(":checked")?d.trigger("check"):d.trigger("uncheck")})})}function d(a,b){for(var c=/^(([\w]+):)?([\w]+)\.([\w]+)(\((.*)\))?$/,d=a.split(";"),e=[],f=0;f0)for(var j=h[6].match(/(['][^']+['])|([\w-]+)|(["][^"]+["])/g),k=0;k=c&&g.services.hasOwnProperty(i)){PlentyFramework.prototype.hasOwnProperty(i)||e(g.services[i],2,d),f.push(PlentyFramework.prototype[i]);continue}if(1>=c&&g.directives.hasOwnProperty(i)){PlentyFramework.directives.hasOwnProperty(i)||e(g.directives[i],1,d),f.push(PlentyFramework.directives[i]);continue}console.error('Cannot inject dependency "'+i+'": Object not found.')}else console.error("Cyclic dependency injection: "+d.join(" -> ")+" -> "+i)}3==c?PlentyFramework.factories[b.name]=b.setup.apply(null,f):2==c?PlentyFramework.prototype[b.name]=b.setup.apply(null,f):1==c&&(PlentyFramework.directives[b.name]=b.setup.apply(null,f))}var f="1.0.8",g={factories:{},services:{},directives:{}};PlentyFramework=function(){};var h=null;PlentyFramework.getInstance=function(){return h=h||new PlentyFramework},PlentyFramework.version=function(){function a(a){for(var b=f.split("."),c=a.split("."),d=0;dparseInt(c[d]))return 1}return 0}return{get:function(){return f},equals:function(b){return 0==a(b)},compare:a}}(),PlentyFramework.partials={},PlentyFramework.globals={},PlentyFramework.setGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?(console.error('Global variable "'+a+'" already exists and cannot be overridden.'),null):(PlentyFramework.globals[a]=b,PlentyFramework.globals[a])},PlentyFramework.getGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?PlentyFramework.globals[a]:b},PlentyFramework.directives={},PlentyFramework.directive=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.directives[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.prototype.bindDirectives=function(e){e=e||"html",a(e).find("[data-plenty]").each(function(e,f){var g=d(a(f).attr("data-plenty"),a(f));if(!(g.length<=0)){c(f);for(var e=0;e=0;c--)if(a==i[c].type)return i[c];return null},PlentyFramework.pushEvent=function(a){i.push(a)},PlentyFramework.service=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.services[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.factories={},PlentyFramework.factory=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.factories[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.compileTemplate=function(a,b){return b=b||{},b.translate=function(){return function(a,b){return b(PlentyFramework.translate(a))}},Mustache.render(TemplateCache[a],b)},PlentyFramework.scriptPath="",PlentyFramework.Strings={},PlentyFramework.loadLanguageFile=function(b){a.ajax({url:PlentyFramework.scriptPath+b,dataType:"json"}).done(function(a){PlentyFramework.Strings=a})},PlentyFramework.translate=function(a,b){var c;return PlentyFramework.Strings.hasOwnProperty(a)?c=PlentyFramework.Strings[a]:(c=a,console.warn('No translation found for "'+c+'".')),b&&(c=Mustache.render(c,b)),c},PlentyFramework.compile=function(){for(var a in g.factories)PlentyFramework.factories.hasOwnProperty(a)||e(g.factories[a],3);for(var b in g.services)PlentyFramework.prototype.hasOwnProperty(b)||e(g.services[b],2);for(var c in g.directives)PlentyFramework.directives.hasOwnProperty(c)||e(g.directives[c],1);for(var d=document.getElementsByTagName("SCRIPT"),f=d.length-1;f>=0;f--){var h=d[f].src.match(/(.*)\/(.*)\.js(\?\S*)?$/);if(h){PlentyFramework.scriptPath=h[1];break}}}}(jQuery),function(a,b){b.directive("Authentication",function(c){function d(d){b.getRecentEvent().preventDefault(),c.customerLogin(a(d))}return{login:d}},["AuthenticationService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Basket",function(c){function d(d){b.getRecentEvent().preventDefault();var e={},f=a(d),g=f.parents("form");e.BasketItemItemID=g.find('[name="ArticleID"]').val(),e.BasketItemPriceID=g.find('[name="SYS_P_ID"]').val(),e.BasketItemQuantity=g.find('[name="ArticleQuantity"]').val(),e.BasketItemBranchID=g.find('[name="source_category"]').val();var h=g.find('[name^="ArticleAttribute"]'),i=[];a.each(h,function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&i.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=i.length&&(e.BasketItemAttributesList=i),c.addItem([e])}function e(b,c){var d=a(b),e=d.parent().find("input"),f=parseInt(e.attr("maxlength"))||5,g=parseInt(e.val())+c,h=d.parents("[data-basket-item-id]").length>0;if(h){(g+"").length<=f&&g>=0&&e.val(g);var i=d.data("timeout");i&&window.clearTimeout(i),i=window.setTimeout(function(){e.trigger("change")},1e3),d.data("timeout",i)}else(g+"").length<=f&&g>=1&&e.val(g)}function f(b,d){c.setItemQuantity(b,parseInt(a(d).val())).fail(function(){var e=c.getItem(b);a(d).val(e.BasketItemQuantity)})}return{addBasketItem:d,changeItemQuantity:e,setItemQuantity:f}},["BasketService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Checkout",function(a){function b(b){a.setMethodOfPayment(b)}function c(b){a.confirmAtrigaPaymax(b)}return{setMethodOfPayment:b,confirmAtrigaPaymax:c}},["CheckoutService"])}(jQuery,PlentyFramework),function(a,b){b.directive("MobileDropdown",function(c){function d(){a(window).on("orientationchange sizeChange",function(){e(j),e(k)}),a("html").on("click touchstart",function(a){e(k,a)})}function e(b,c){for(var d,e=0;e0?window.location.assign(a(c).attr("href")):window.location.assign(c))}function e(a){c.goToID(a)}return{to:d,toCheckoutTab:e}},["MediaSizeService","NavigatorService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Tab",function(c){function d(b){a(b).tab("show")}function e(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).addLabel(a)}function f(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).setContent(a)}function g(a,d,e){c.isInterval(e)&&(b.getRecentEvent().preventDefault(),j[d]&&j[d].getTab(a)&&j[d].showTab(a))}function h(){function b(a){return g[a]=new i(a),g[a]}function c(b){var c=0;if(f)c=parseInt(f.getContent().parent().css("zIndex")),f.hide(),f.getContent().parent().css("zIndex",c-1);else{for(var d in g)if(g[d].getContent()){var h=parseInt(g[d].getContent().parent().css("zIndex"));(0==c||c>h)&&(c=h),g[d].hide()}for(var d in g)g[d].getContent()&&g[d].getContent().parent().css("zIndex",c-1);a(window).on("sizeChange",e)}f=g[b],f.getContent().parent().css("zIndex",c),f.show()}function d(a){return g[a]}function e(){for(var a in g)g[a].getContent()&&g[a].show();f=null}var f,g={};return{addTab:b,showTab:c,getTab:d,resetTabs:e}}function i(a){function b(){return j}function c(a){return i.push(a),this}function d(a){return h=a,this}function e(){return h}function f(){for(var a=0;a0&&(a(document).scrollTop()>100?x(z,"addClass","visible"):x(z,"removeClass","visible"))})}function g(){e.showWaitscreen()}function h(a){e.hideWaitscreen(a)}function i(b){a(b).owlCarousel({navigation:!0,navigationText:!1,slideSpeed:1e3,paginationSpeed:1e3,singleItem:!0,autoPlay:6e3,stopOnHover:!0,afterMove:function(b){a(b).find('[data-plenty-rel="lazyload"]').trigger("appear")}})}function j(b,d,e){var f=a(b),g=0,h={},i=f.find('[data-plenty-rel="equal-target"]').length>0?f.find('[data-plenty-rel="equal-target"]'):f.children();e!==!0&&y.push(b);for(var j=i.length;j>=0;j--)h=a(i[j]),h.css("height",""),h.outerHeight(!0)>g&&(g=h.outerHeight(!0));(!d||c.isInterval(d))&&i.height(g)}function k(b){var c=a(b);c.click(function(){return a("html, body").animate({scrollTop:0},400),!1}),a.inArray(c,z)&&z.push(c)}function l(b,c){var d=a(b);d.lazyload({effect:c}),d.is("img")&&d.on("loaded",function(){d.css("display","inline-block")})}function m(b){console.log(b);var c=a(b),d=c.parent();d.addClass("animating"),c.siblings("ul").slideToggle(200,function(){d.is(".open")?d.removeClass("open"):d.addClass("open"),c.siblings("ul").removeAttr("style"),d.removeClass("animating")})}function n(b,c){var d=a(b),e=a(d.attr("data-plenty-rel"));if(d.is('input[type="radio"]')){var f=a('input[type="radio"][name="'+d.attr("name")+'"]'),g=!c||"checked"==c;f.change(function(){var b=a(this);e.parents('[data-plenty-rel="equal-target"]').css("height","auto"),b.is(":checked")&&b[0]===d[0]&&1==g?e.slideDown(400,function(){w()}):e.slideUp(400,function(){w()})})}else d.click(function(){d.addClass("animating"),e.slideToggle(400,function(){d.removeClass("animating"),d.toggleClass("active"),w()})})}function o(b,c){r(a(b),c,"slideDown")}function p(b,c){r(a(b),c,"slideUp")}function q(b,c){r(a(b),c,"slideToggle")}function r(a,b,c){b=b||400,a.parents('[data-plenty-rel="equal-target"]').css("height","auto"),a[c](b,function(){w()})}function s(b,c){var e=a(b),f=e.find('[data-plenty-rel="social-switch"]');e.append(''),f.is("off, on")||f.addClass("off"),f.on("click",function(){f.hasClass("off")&&("tooltip"==e.attr("data-toggle")&&e.tooltip("destroy"),f.removeClass("off").addClass("on"),e.find('[data-plenty-rel="social-placeholder"]').hide(),e.find(".social-container").append(d.getSocialService(c)))})}function t(d,e,f){var g=a(e);if(g.parents(".navbar-main").length>0){var h=g.children("span");return b.directives.MobileDropdown.slideDropdown(h),!0}if(e&&d&&(!f||c.isInterval(f))){var i=b.getRecentEvent();return i&&i.preventDefault(),g.toggleClass(d),!1}}function u(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).addClass(d),!1}}function v(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).removeClass(d),!1}}function w(){for(var a=y.length-1;a>=0;a--)j(y[a],"",!0)}function x(a,b,c){for(var d=a.length-1;d>=0;d--)a[d][b](c)}var y=[],z=[];return{initUIWindowEvents:f,showWaitscreen:g,hideWaitscreen:h,addContentPageSlider:i,equalHeight:j,initToTop:k,initLazyload:l,initSlideToggle:n,slideDown:o,slideUp:p,slideToggle:q,toggleHideShow:m,toggleSocialShare:s,toggleClass:t,addClass:u,removeClass:v}},["MediaSizeService","SocialShareService","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.directive("Validator",function(a){function b(b,c){return a.validate(b,c)}return{validate:b}},["ValidationService"])}(jQuery,PlentyFramework),function(a,b){b.factory("APIFactory",function(c,d){function e(){b.getGlobal("LoginSession")&&(l&&clearTimeout(l),l=setTimeout(function(){a(window).trigger("login-expired"),"Checkout"===b.getGlobal("PageDesign")&&d.prepare().setTitle(b.translate("Your session has expired.")).setContent(b.translate("Please log in again to continue shopping.")).setLabelDismiss(null).setLabelConfirm(b.translate("OK")).onConfirm(function(){window.location.assign("/")}).onDismiss(function(){window.location.assign("/")}).show()},b.getGlobal("LoginSessionExpiration")))}function f(b){try{var d=a.parseJSON(b.responseText);c.printErrors(d.error.error_stack)}catch(e){c.throwError(b.status,b.statusText)}}function g(b,d,g,h,i){return h||c.showWaitScreen(),a.ajax(b,{type:"GET",data:d,dataType:"json",async:!i,error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function h(b,d,g,h){var i={type:"POST",dataType:"json",error:function(a){g||f(a)}};return d&&d.isFile?(i.cache=d.cache,i.processData=d.processData,i.data=d.data,i.contentType=!1):(i.data=JSON.stringify(d),i.contentType="application/json"),h||c.showWaitScreen(),a.ajax(b,i).always(function(){h||c.hideWaitScreen(),e()})}function i(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"PUT",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function j(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"DELETE",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function k(){return a.Deferred().resolve()}var l=null;return a(document).ready(function(){e()}),{get:g,post:h,put:i,"delete":j,idle:k}},["UIFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a){a.factory("CMSFactory",function(a){function b(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/container_"+b.toLowerCase()+"/",c)}return{from:d}}function c(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/"+b.toLowerCase()+"/",c)}return{from:d}}function d(b){return a.get("/rest/categoryview/categorycontentbody/?categoryID="+b)}return{getContainer:b,getParams:c,getCategoryContent:d}},["APIFactory"])}(PlentyFramework),function(a){a.factory("CheckoutFactory",function(b,c,d){function e(){return l}function f(a){return m&&l||g(!0),a?$.extend(!0,{},l):m}function g(a){return b.get("/rest/checkout/",null,!1,!1,a).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function h(){return b.put("/rest/checkout",m).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function i(b){return c.getContainer("checkout"+b).from("checkout").done(function(c){$('[data-plenty-checkout-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function j(b){return c.getCategoryContent(b).done(function(c){$('[data-plenty-checkout-catcontent="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function k(b){return c.getContainer("itemview"+b).from("itemview").done(function(c){$('[data-plenty-itemview-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}var l,m;return{getCheckout:f,setCheckout:h,loadCheckout:g,reloadContainer:i,reloadCatContent:j,reloadItemContainer:k}},["APIFactory","CMSFactory","UIFactory"])}(PlentyFramework),function(a,b){b.factory("ModalFactory",function(){function c(a){return PlentyFramework.partials.Modal.isModal(a)}function d(a){return new e(a)}function e(d){function e(a){return t.title=a,this}function f(a){return t.cssClass=a,this}function g(a){return t.content=a,this}function h(a){return t.labelConfirm=a,this}function i(a){return t.labelDismiss=a,this}function j(a){return t.onConfirm=a,this}function k(a){return t.onDismiss=a,this}function l(a){return t.container=a,this}function m(a){return t.timeout=a,this}function n(){if(t.selector)u=a(t.selector);else{u=c(t.content)?PlentyFramework.partials.Modal.getModal(t.content):a(PlentyFramework.compileTemplate("modal/modal.html",t)),a(t.container).append(u);var b=a(t.content).filter("script");b.length>0&&b.each(function(b,c){var d=document.createElement("script");d.type="text/javascript",d.innerHTML=a(c).text(),a(t.container).append(d)})}PlentyFramework.partials.Modal.init(u,t),u.find('[data-plenty-modal="confirm"]').click(function(){var a=t.onConfirm();"undefined"==typeof a&&(a=!0),a&&o(!0)}),PlentyFramework.partials.Modal.show(u),t.timeout>0&&p()}function o(a){PlentyFramework.partials.Modal.hide(u),a||t.onDismiss()}function p(){x=t.timeout,y=(new Date).getTime(),v=window.setTimeout(function(){window.clearInterval(w),o()},t.timeout),u.find('[data-plenty-modal="timer"]').text(x/1e3),w=window.setInterval(function(){if(!z){var a=x-(new Date).getTime()+y;a=Math.round(a/1e3),u.find('[data-plenty-modal="timer"]').text(a)}},1e3)}function q(){z=!0,x-=(new Date).getTime()-y,window.clearTimeout(v)}function r(){z=!1,y=(new Date).getTime(),v=window.setTimeout(function(){o(),window.clearInterval(w)},x)}function s(){window.clearTimeout(v),window.clearInterval(w)}var t=this;t.selector=d,t.title="",t.cssClass="",t.content="",t.labelDismiss=b.translate("Cancel"),t.labelConfirm=b.translate("Confirm"),t.onConfirm=function(){},t.onDismiss=function(){},t.container="body",t.timeout=-1,t.hide=o,t.startTimeout=p,t.stopTimeout=s,t.pauseTimeout=q,t.continueTimeout=r;var u,v,w,x,y,z=!1;return{setTitle:e,setClass:f,setContent:g,setContainer:l,setLabelConfirm:h,setLabelDismiss:i,onConfirm:j,onDismiss:k,setTimeout:m,show:n,hide:o}}return{prepare:d,isModal:c}})}(jQuery,PlentyFramework),function(a,b){b.factory("UIFactory",function(){function c(a,b){d([{code:a,message:b}])}function d(c){(!i||a("body").has(i).length<=0)&&(i=a(b.compileTemplate("error/errorPopup.html")),a("body").append(i),b.partials.Error.init(i)),a.each(c,function(c,d){b.partials.Error.addError(i,a(b.compileTemplate("error/errorMessage.html",d)))}),b.partials.Error.show(i),f(!0)}function e(){return h=h||0,(!g||a("body").has(g).length<=0)&&(g=a(b.compileTemplate("waitscreen/waitscreen.html")),a("body").append(g)),b.partials.WaitScreen.show(g),h++,h}function f(a){return h--,(0>=h||a)&&(h=0,b.partials.WaitScreen.hide(g)),h}var g,h=0,i=null;return{throwError:c,printErrors:d,showWaitScreen:e,hideWaitScreen:f}})}(jQuery,PlentyFramework),Object.equals=function(a,b){if(a===b)return!0;if(!(a instanceof Object&&b instanceof Object))return!1;if(a.constructor!==b.constructor)return!1;for(var c in a)if(a.hasOwnProperty(c)){if(!b.hasOwnProperty(c))return!1;if(a[c]!==b[c]){if("object"!=typeof a[c])return!1;if(!Object.equals(a[c],b[c]))return!1}}for(var c in b)if(b.hasOwnProperty(c)&&!a.hasOwnProperty(c))return!1;return!0},PlentyFramework.cssClasses={active:"active"},function(a,b){b.partials.Error={init:function(c){a(c).find(".close").click(function(){b.partials.Error.hideAll()})},addError:function(b,c){var d=a(c).attr("data-plenty-error-code");a(b).find('[data-plenty-error-code="'+d+'"]').length<=0&&a(b).find(".plentyErrorBoxInner").append(c)},show:function(b){a(b).show()},hideAll:function(){a("#CheckoutErrorPane").hide(),a("#CheckoutErrorPane").find(".plentyErrorBoxInner").html("")}}}(jQuery,PlentyFramework),function(a,b){b.partials.Modal={init:function(a,b){a.on("hidden.bs.modal",function(){b.hide(),b.selector||a.remove()}),b.timeout>0&&(a.on("hide.bs.modal",b.stopTimeout),a.find(".modal-content").hover(function(){b.pauseTimeout()},function(){a.is(".in")&&b.continueTimeout()}))},show:function(a){a.modal("show")},hide:function(a){a.modal("hide")},isModal:function(b){return a(b).filter(".modal").length+a(b).find(".modal").length>0},getModal:function(b){var c=a(b);return c.length>1&&(c=a(b).filter(".modal")||a(b).find(".modal")),c}}}(jQuery,PlentyFramework),function(a){a(document).on("initPartials",function(b,c){a(c).find('[data-toggle="tooltip"]').tooltip({container:"body"})})}(jQuery),function(a,b){b.partials.WaitScreen={show:function(a){a.addClass("in")},hide:function(a){a.removeClass("in")}}}(jQuery,PlentyFramework),function(a,b){b.service("AddressDoctorService",function(c){function d(b){var c=!0;return b=b||"[data-plenty-address-doctor]",a(b).filter("[data-plenty-address-doctor]:visible").each(function(b,d){var f=new e(d),g=a(d).attr("data-plenty-address-doctor").replace(/\s/g,"").split(",");f.isValid(g)||(c=!1)}),c}function e(c){function d(a){return j()?!0:(k=new f(m.getFormValues()),l=a,e(),1==k.getAddresses().length)}function e(){a(".suggestion-list").remove();for(var b=!1,c=0;cc;c++){var d=a.data[c],f=e(d);f?f.HouseNo.push(d.HouseNo):(d.HouseNo=[d.HouseNo],j.push(d))}})}function e(a){for(var b=j.length,c=0;b>c;c++)if(a.Street==j[c].Street&&j.ZIP==j[c].ZIP&&a.City==j[c].City)return j[c];return null}function f(){return j}function g(b){for(var c=[],d=j.length,e=0;d>e;e++){var f=j[e];a.inArray(f[b],c)<0&&c.push(f[b])}return c}function h(a){for(var b=[],c=j.length,d=0;c>d;d++){var e=j[d];(a.Street&&a.Street==e.Street||a.ZIP&&a.ZIP==e.ZIP||a.City&&a.City==e.City)&&b.push(e)}j=b}function i(a){a=parseInt(a);for(var b=j.length,c=0;b>c;c++)for(var d=j[c],e=0;e=f[0]&&a<=f[1])return!0}return!1}var j=[];return d(),{getAddresses:f,getList:g,filter:h,houseNoAllowed:i}}return{validateAddress:d}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("AuthenticationService",function(c,d,e){function f(){var b=a('[data-plenty-checkout="lostPasswordForm"]');if(b.validateForm()){var d=b.getFormValues(),e={Email:d.Email};return c.post("/rest/checkout/lostpassword/",e).done(function(b){1==b.data.IsMailSend&&(a('[data-plenty-checkout="lostPasswordTextContainer"]').hide(),a('[data-plenty-checkout="lostPasswordSuccessMessage"]').show())})}}function g(a){if(a.validateForm()){var b=a.getFormValues(),d={Email:b.loginMail,Password:b.loginPassword};return e.showWaitScreen(),c.post("/rest/checkout/login/",d).done(function(){window.location.assign(a.attr("action"))})}}function h(a){return c.post("/rest/checkout/customerinvoiceaddress/",a).done(function(a){d.getCheckout().CustomerInvoiceAddress=a.data})}function i(){var c=a('[data-plenty-checkout-form="customerRegistration"]');if(c.validateForm()&&b.getInstance().AddressDoctorService.validateAddress()){var d=c.getFormValues();if(d.LoginType=2,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var f in e)e[f]&&d.CustomerPropertiesList.push({PropertyID:f,PropertyValue:e[f]})}return h(d).done(function(){window.location.assign(c.attr("action"))})}}return{resetPassword:f,customerLogin:g,setInvoiceAddress:h,registerCustomer:i}},["APIFactory","CheckoutFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("BasketService",function(c,d,e,f,g){function h(d){d&&c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:d[0].BasketItemItemID,quantity:d[0].BasketItemQuantity},!1,!0).done(function(c){c.data[0].indexOf("form-group")>0?g.prepare().setContent(c.data[0]).setTitle(b.translate("Select order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(j(i(d)),!0):!1}).show():j(d)})}function i(b){var c,d=a('[data-plenty-checkout-form="OrderParamsForm"]'),e={},f="";return d.find('[name^="ParamGroup"]').each(function(){c=this.name.match(/^ParamGroup\[(\d+)]\[(\d+)]$/),b=m(b,c[1],a(this).val(),a(this).val())}),d.find('[name^="ParamValue"]').each(function(){if(e=a(this),f=e.attr("type"),("checkbox"==f&&e.is(":checked")||"radio"==f&&e.is(":checked")||"radio"!=f&&"checkbox"!=f)&&"file"!=f&&"hidden"!=f){var c=e[0].name.match(/^ParamValue\[(\d+)]\[(\d+)]$/);b=m(b,c[1],c[2],e.val())}else if("file"==f)if(e[0].files&&e[0].files.length>0)b=l(e,b);else{var c=e[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/),d=a('input[type="hidden"][name="ParamValue['+c[1]+"]["+c[2]+']"]').val();b=m(b,c[1],c[2],d)}}),b}function j(a){c.post("/rest/checkout/basketitemslist/",a,!0).done(function(){f.loadCheckout().done(function(){s(),e.getContainer("ItemViewItemToBasketConfirmationOverlay",{ArticleID:a[0].BasketItemItemID}).from("ItemView").done(function(a){var c=b.getGlobal("TimeoutItemToBasketOverlay",5e3),d=g.prepare().setContent(a.data[0]);c>0&&d.setTimeout(c),d.show()})})}).fail(function(a){d.printErrors(JSON.parse(a.responseText).error.error_stack)})}function k(a){c.put("/rest/checkout/basketitemslist/",a).done(function(){f.reloadCatContent(b.getGlobal("basketCatID")),f.loadCheckout().done(function(){s()})})}function l(a,b){var d,e,f=a[0].id,g={},h=[],i={type:"POST",data:{},isFile:!0,cache:!1,dataType:"json",processData:!1,contentType:!1};g[f]=a[0].files,-1==h.indexOf(f)&&h.push(f);for(var j=0,k=h.length;k>j;++j)d=new FormData,e=g[h[j]],d.append("0",e[0],e[0].name),i.data=d,c.post("/rest/checkout/orderparamfile/",i);var l=a[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/);return m(b,l[1],l[2],g[f][0].name)}function m(b,c,d,e){return c>0&&void 0==b[c]&&(b[c]=a.extend(!0,{},b[0]),b[c].BasketItemOrderParamsList=[]),void 0!=b[c]&&(b[c].BasketItemQuantity=1,void 0==b[c].BasketItemOrderParamsList&&(b[c].BasketItemOrderParamsList=[]),e&&b[c].BasketItemOrderParamsList.push({BasketItemOrderParamID:d,BasketItemOrderParamValue:e})),b}function n(b){var c=a('[data-plenty-basket-item="'+b+'"]');c.modal("show"),c.find('[data-plenty-modal="confirm"]').on("click",function(){var d=p(b),e=[];c.find('select, .PlentyFormContainer.AttrImage > input[type="hidden"]').each(function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&e.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=e.length&&(d.BasketItemAttributesList=e),k([d])})}function o(d){var e=p(d);e.BasketItemOrderParamsList=[],c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:e.BasketItemItemID,quantity:e.BasketItemQuantity,basketItemID:d}).done(function(c){g.prepare().setContent(c.data[0]).setTitle(b.translate("Edit order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(k(i([e])),!0):!1}).show()})}function p(a){for(var b=f.getCheckout().BasketItemsList,c=0;c=0?c.get("/rest/checkout/container_checkoutbasketitemslist/").done(function(c){var d=a("[data-basket-item-id]").parents("ul"),e=d.parents(".panel-body");d.fadeOut(function(){a(this).siblings(":not('[data-plenty-checkout-template]')").remove(),a(this).remove(),e.prepend(a(c.data[0])).hide().fadeIn(function(){b.getInstance().bindDirectives(e)})})}):f.reloadContainer("BasketItemsList"),f.reloadContainer("Totals")),s(),i.resolve()})})}var i=a.Deferred(),j=p(d).BasketItemNameMap[1];return e?h():g.prepare().setTitle(b.translate("Please confirm")).setContent("

    "+b.translate('Do you really want to remove "{{item}}" from your basket?',{item:j})+"

    ").onDismiss(function(){i.reject()}).onConfirm(function(){h()}).setLabelConfirm(b.translate("Delete")).show(),i}function r(d,e){if(0>=e)return q(d);for(var g,h,i=a.Deferred(),j=f.getCheckout().BasketItemsList,k=0;k0&&f.reloadContainer("Totals")}return{addItem:h,removeItem:q,getItem:p,setItemQuantity:r,editItemAttributes:n,editOrderParams:o,addCoupon:t,removeCoupon:u}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("CheckoutService",function(c,d,e,f,g){function h(){f.loadCheckout(!0)}function i(){var b=a('[data-plenty-checkout-form="details"]'),d=b.getFormValues();return f.getCheckout().CheckoutCustomerSign||(f.getCheckout().CheckoutCustomerSign=""),f.getCheckout().CheckoutOrderInfoText||(f.getCheckout().CheckoutOrderInfoText=""),f.getCheckout().CheckoutCustomerSign!==d.CustomerSign&&a(b).find('[name="CustomerSign"]').length>0||f.getCheckout().CheckoutOrderInfoText!==d.OrderInfoText&&a(b).find('[name="OrderInfoText"]').length>0?(f.getCheckout().CheckoutCustomerSign=d.CustomerSign,f.getCheckout().CheckoutOrderInfoText=d.OrderInfoText,f.setCheckout()):c.idle()}function j(d){var e=a('[data-plenty-checkout-form="shippingAddress"]');if(!d&&!e.validateForm())return!1;if(!d&&!b.getInstance().AddressDoctorService.validateAddress(e))return!1;var g=e.getFormValues(),h=a('[name="shippingAddressID"]:checked').val();if(0>h){var i=g;return m(i,f.getCheckout().CustomerShippingAddress)?c.idle():("PACKSTATION"==i.Street?(i.IsPackstation=1,i.PackstationNo=i.HouseNo):"POSTFILIALE"==i.Street&&(i.IsPostfiliale=1,i.PostfilialNo=i.HouseNo),c.post("/rest/checkout/customershippingaddress/",i).done(function(a){f.getCheckout().CheckoutCustomerShippingAddressID=a.data.ID,f.getCheckout().CheckoutShippingCountryID=a.data.CountryID,k()}))}return h==f.getCheckout().CheckoutCustomerShippingAddressID?c.idle():(f.getCheckout().CheckoutCustomerShippingAddressID=h,void k())}function k(){return delete f.getCheckout().CheckoutMethodOfPaymentID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList"),f.reloadContainer("ShippingProfilesList"),2==f.getCheckout().CustomerInvoiceAddress.LoginType&&f.reloadContainer("CustomerShippingAddress"),a("#shippingAdressSelect").modal("hide"),a(".modal-backdrop")&&a(".modal-backdrop").remove()})}function l(){var b=a('[data-plenty-checkout-form="guestRegistration"]'),d=b.getFormValues();if(d.LoginType=1,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var g in e)e[g]&&d.CustomerPropertiesList.push({PropertyID:g,PropertyValue:e[g]})}return m(d,f.getCheckout().CustomerInvoiceAddress)?j():c.post("/rest/checkout/customerinvoiceaddress/",d).done(function(a){j().done(f.loadCheckout)})}function m(a,b){for(var c in a)if(a[c]+""!=b[c]+""&&"EmailRepeat"!==c)return!1;return!0}function n(){var b=a('[data-plenty-checkout-form="shippingProfileSelect"]').getFormValues();return f.getCheckout().CheckoutShippingProfileID=b.ShippingProfileID,delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutMethodOfPaymentID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList")})}function o(){var b=f.getCheckout().CheckoutMethodOfPaymentID,e=a('input[type="radio"][name="MethodOfPaymentID"][value="'+b+'"]').parent().getFormValues();return c.post("/rest/checkout/preparepayment/",e,!0).done(function(b){if(""!=b.data.CheckoutMethodOfPaymentRedirectURL)document.location.assign(b.data.CheckoutMethodOfPaymentRedirectURL);else if(b.data.CheckoutMethodOfPaymentAdditionalContent){var c=a(b.data.CheckoutMethodOfPaymentAdditionalContent).find('[data-plenty-checkout-form="bankDetails"]').length>0;g.prepare().setContent(b.data.CheckoutMethodOfPaymentAdditionalContent).onConfirm(function(){return c?s():u()}).show()}}).fail(function(b){try{for(var c=a.parseJSON(b.responseText),e=[],g=0;g0&&d.printErrors(e)}catch(h){d.throwError(b.status,b.statusText)}})}function p(c){return c||(c=a('input[name="MethodOfPaymentID"]:checked').val()),f.getCheckout().CheckoutMethodOfPaymentID=c,b.getGlobal("Checkout.AtrigaRequireUserConfirmation")||(f.getCheckout().CheckoutAtrigapaymaxChecked=!0),delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("ShippingProfilesList")})}function q(a){return f.getCheckout().CheckoutAtrigapaymaxChecked=!!a,c.put("/rest/checkout",{CheckoutAtrigapaymaxChecked:!!a})}function r(){e.getContainer("CheckoutPaymentInformationBankDetails").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return s()}).show()})}function s(){var b=a('[data-plenty-checkout-form="bankDetails"]');if(b.validateForm()){var d=b.getFormValues().checkout.customerBankDetails,e={CustomerBankName:d.bankName,CustomerBLZ:d.blz,CustomerAccountNumber:d.accountNo,CustomerAccountOwner:d.accountOwner,CustomerIBAN:d.iban,CustomerBIC:d.bic};return c.post("/rest/checkout/paymentinformationbankdetails/",e).done(function(){f.loadCheckout().done(function(){p(3),f.reloadContainer("MethodsOfPaymentList")})}),!0}return!1}function t(){e.getContainer("CheckoutPaymentInformationCreditCard").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return u()}).show()})}function u(){var b=a('[data-plenty-checkout-form="creditCard"]');if(b.validateForm()){var d=b.getFormValues().checkout.paymentInformationCC,e={Owner:d.owner,Cvv2:d.cvv2,Number:d.number,Year:d.year,Month:d.month,Provider:d.provider};return c.post("/rest/checkout/paymentinformationcreditcard/",e).done(function(){f.loadCheckout()}),!0}return!1}function v(b){if(2==f.getCheckout().CustomerInvoiceAddress.LoginType)var c=a('[data-plenty-checkout-form="shippingAddress"]').getFormValues();else var c=a('[data-plenty-checkout-form="guestRegistration"]').getFormValues();var d={street:c.Street,houseNo:c.HouseNo,ZIP:c.ZIP,city:c.City,postnummer:c.Postnummer,suggestionType:"postfinder"};e.getContainer("CheckoutAddressSuggestionResultsList",d).from("Checkout").done(function(a){g.prepare().setContent(a.data[0]).show()})}function w(){var b=a('[data-plenty-checkout-form="placeOrder"]');if(b.validateForm()){var d=b.getFormValues(),e={TermsAndConditionsCheck:d.termsAndConditionsCheck||0,WithdrawalCheck:d.withdrawalCheck||0,PrivacyPolicyCheck:d.privacyPolicyCheck||0,AgeRestrictionCheck:d.ageRestrictionCheck||0,NewsletterCheck:d.newsletterCheck||0,KlarnaTermsAndConditionsCheck:d.klarnaTermsAndConditionsCheck||0,PayoneDirectDebitMandateCheck:d.payoneDirectDebitMandateCheck||0,PayoneInvoiceCheck:d.payoneInvoiceCheck||0};return c.post("/rest/checkout/placeorder/",e).done(function(a){""!=a.data.MethodOfPaymentRedirectURL?window.location.assign(a.data.MethodOfPaymentRedirectURL):""!=a.data.MethodOfPaymentAdditionalContent?g.prepare().setContent(a.data.MethodOfPaymentAdditionalContent).setLabelDismiss("").onDismiss(function(){window.location.assign(b.attr("action"))}).onConfirm(function(){window.location.assign(b.attr("action"))}).show():window.location.assign(b.attr("action"))})}}return{init:h,setCustomerSignAndInfo:i,registerGuest:l,setShippingProfile:n,saveShippingAddress:j,loadAddressSuggestion:v,preparePayment:o,setMethodOfPayment:p,confirmAtrigaPaymax:q,editBankDetails:r,editCreditCard:t,placeOrder:w}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("FeedbackService",function(a){function b(){function b(a,b){return e.dateStart=a,e.dateEnd=b,this}function c(b,c,f){var g={ReferenceId:c,FromDate:e.dateStart,ToDate:e.dateEnd,FeedbackType:f||d().COMMENTS_AND_RATINGS};return a.get("/rest/feedback/"+b+"/",g)}var e={dateStart:null,dateEnd:null};return{between:b,"for":c}}function c(){function b(a){return f.Rating=a,this}function c(a){return f.Text=a,this}function d(a,b,c){return f.Author=a,b&&(f.Email=b),c&&(f.CustomerId=c),this}function e(b,c){return a.post("/rest/feedback/"+b+"/",f)}var f={Rating:1,Text:"",Author:"",Email:"",CustomerId:0};return{withRating:b,withComment:c,withAuthor:d,to:e}}function d(){return{COMMENTS_ONLY:"comments_only",RATINGS_ONLY:"ratings_only",COMMENTS_AND_RATINGS:"comments_with_ratings"}}function e(){return{ITEM:"item",CATEGORY:"category",BLOG:"blog"}}return{getFeedbacks:b,addFeedback:c,ArticleTypes:e(),FeedbackTypes:d()}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("MediaSizeService",function(){function b(){return e&&c(),e}function c(){var b;if(b=window.matchMedia?window.matchMedia("(min-width:1200px)").matches?"lg":window.matchMedia("(min-width:992px)").matches?"md":window.matchMedia("(min-width:768px)").matches?"sm":"xs":a(window).width()>=1200?"lg":a(window).width()>=992?"md":a(window).width()>=768?"sm":"xs",b!=e||"xs"===b){var c=e;e=b,a(window).trigger("sizeChange",[e,c])}}function d(a){for(var b=a.replace(/\s/g,"").split(","),c=0;c li'),r=a('[data-plenty-checkout="container"] > div'),u=a('[data-plenty-checkout="next"]'),t=a('[data-plenty-checkout="prev"]'),q.length==r.length&&r.length>0){d.getCheckout();r.hide(),q.each(function(b,c){a(c).addClass("disabled"),a(c).click(function(){a(this).is(".disabled")||j(b)})}),u.attr("disabled","disabled"),u.click(function(){m()}),t.attr("disabled","disabled"),t.click(function(){n()}),window.addEventListener("hashchange",function(){window.location.hash.length>0?o(window.location.hash):j(0)},!1),a.urlParam=function(a){var b=new RegExp("[?&]"+a+"=([^&#]*)").exec(window.location.href);return null==b?null:b[1]||0};var c=a.urlParam("gototab");0==window.location.hash.length&&c&&a('[data-plenty-checkout-id="'+c+'"]').length>0?window.location.hash=c:j(!o(window.location.hash)&&s>=0?s:0),p(),a(window).on("sizeChange",p),a(window).resize(function(){"xs"==b.getInstance().MediaSizeService.interval()&&p()})}}function f(){return s>=0?{id:a(r[s]).attr("data-plenty-checkout-id"),index:s}:null}function g(a){return v.beforeChange.push(a),b.getInstance().NavigatorService}function h(a){return v.afterChange.push(a),b.getInstance().NavigatorService}function i(b,c){var d=!0;if(s>=0||"afterChange"===b){var e=f(),g={index:c,id:a(r[c]).attr("data-plenty-checkout-id")};a.each(v[b],function(a,b){return b(e,g)===!1?(d=!1,!1):void 0})}return d}function j(e,f){var g=s!==e;(!g||f||i("beforeChange",e))&&(s=e,!Object.equals(w[s],d.getCheckout(!0))&&g&&a(r[s]).attr("data-plenty-checkout-content")?(w[s]=d.getCheckout(!0),c.getCategoryContent(a(r[s]).attr("data-plenty-checkout-content")).done(function(c){a(r[s]).html(c.data[0]),k(g),b.getInstance().bindDirectives(r[s]),a(window).trigger("contentChanged")})):k(g))}function k(b){a(r).hide();var c;a(q).each(function(b,d){c=a(d),c.removeClass("disabled active"),c.find('[role="tab"]').attr("aria-selected","false"),s>b?c.addClass("visited"):b==s?(c.addClass("active visited"),c.find('[role="tab"]').attr("aria-selected","true")):b>s&&!c.is(".visited")&&c.addClass("disabled")}),p(),0>=s?t.attr("disabled","disabled"):t.removeAttr("disabled"),s+1==q.length?u.attr("disabled","disabled"):u.removeAttr("disabled"),a(r[s]).show(),s>0?window.location.hash=a(r[s]).attr("data-plenty-checkout-id"):window.location.hash.length>0&&(window.location.hash=""),b&&i("afterChange",s)}function l(a){j(a.index,!0)}function m(){s0&&j(s-1)}function o(b){return"next"==b?(m(),!0):"prev"==b?(n(),!0):(b=b.replace("#",""),a(r).each(function(c,d){return a(d).attr("data-plenty-checkout-id")==b?(j(c),!0):void 0}),!1)}function p(){var b=q.length;if(!(0>=b)){a(q).removeAttr("style"),a(q).children("span").removeAttr("style"),a(u).removeAttr("style"),a(t).removeAttr("style");var c=a(t).outerWidth()c?a(d).children("span").css({paddingLeft:g+"px",paddingRight:h+"px"}):a(d).children("span").css({paddingLeft:j+"px",paddingRight:k+"px"})})}}var q=[],r=[],s=-1,t={},u={},v={beforeChange:[],afterChange:[]},w=[];return{init:e,getCurrentContainer:f,goTo:j,beforeChange:g,afterChange:h,continueChange:l,next:m,previous:n,goToID:o,fillNavigation:p}},["CMSFactory","CheckoutFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("PostfinderService",function(c,d,e){function f(){var b=a('input[name="Street"]').val();return"PACKSTATION"==b.toUpperCase()||"POSTFILIALE"==b.toUpperCase()}function g(){j={PostfinderItemStreet:a('input[name="Street"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemZIP:a('input[name="ZIP"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemCity:a('input[name="City"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemHouseNo:a('input[name="HouseNo"]','[data-plenty-checkout-form="shippingAddress"]')},j.PostfinderItemStreet.val(""),j.PostfinderItemZIP.val().length>2||j.PostfinderItemCity.val().length>2?c.get("/rest/checkout/shippingaddresspostfinderlist/",{suggestionType:"postfinder",zip:j.PostfinderItemZIP.val(),city:j.PostfinderItemCity.val()}).done(function(c){l=c.data,k=l.length,0==k&&h();for(var e={addresses:[]},f=0;k>f;f++){var g="km",m=l[f].PostfinderItemDistance,n=m/1e3;n=(Math.round(100*n)/100).toFixed(2).replace(".",","),1e3>m&&(n=m,g="m"),e.addresses.push({index:f,dimension:g,type:l[f].PostfinderItemIsPackstation?"Packstation":"Postfiliale",number:l[f].PostfinderItemIsPackstation?l[f].PostfinderItemPackstationNo:l[f].PostfinderItemPostfilialNo,street:l[f].PostfinderItemStreet,houseNo:l[f].PostfinderItemHouseNo,zip:l[f].PostfinderItemZIP,city:l[f].PostfinderItemCity,district:l[f].PostfinderItemDistrict,distance:n,remark:l[f].PostfinderItemRemark})}var o=b.compileTemplate("addressSuggestions/postFinder.html",e);d.prepare().setTitle(b.translate("Packstations and post offices in your area")).setContent(o).setClass("checkout").onConfirm(function(){return j.PostfinderItemCity.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemZIP.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemStreet.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemStreet.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemHouseNo.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemHouseNo.attr("id")+'"]').removeClass("has-error").addClass("has-success"),i=a('input[type="radio"][name="postfinder"]:checked').val(),l[i].PostfinderItemIsPackstation?(a(j.PostfinderItemStreet).val("PACKSTATION"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPackstationNo)):(a(j.PostfinderItemStreet).val("POSTFILIALE"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPostfilialNo)),a(j.PostfinderItemStreet).trigger("change"),a(j.PostfinderItemCity).val(l[i].PostfinderItemCity),a(j.PostfinderItemZIP).val(l[i].PostfinderItemZIP),!0}).show()}):h()}function h(){e.throwError(0,b.translate("Please enter a ZIP code and/or a city.")),j.PostfinderItemCity.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemZIP.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemCity.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")}),j.PostfinderItemZIP.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")})}var i="",j={},k={},l={};return{openPostfinderModal:g,isPackstation:f}},["APIFactory","ModalFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("SocialShareService",function(){function b(a){var b={"facebook-like":'',"facebook-recommend":'',twitter:'',"google-plus":'
    '};return b[a]}function c(){var b=document.location.href,c=a("link[rel=canonical]").attr("href");return c&&c.length>0&&(c.indexOf("http")<0&&(c=document.location.protocol+"//"+document.location.host+c),b=c),b}function d(b){var c=a('meta[name="'+b+'"]').attr("content");return c||""}function e(){var b=d("DC.title"),c=d("DC.creator");return b.length>0&&c.length>0?b+=" - "+c:b=a("title").text(),encodeURIComponent(b)}return"undefined"==typeof socialLangLocale&&(socialLangLocale="en_US"),"undefined"==typeof socialLang&&(socialLang="en"),{getSocialService:b}})}(jQuery,PlentyFramework),function(a,b){b.service("ValidationService",function(){function b(b){return b=a(b),b.is("input")||b.is("select")||b.is("textarea")?b:b.find("input").length>0?b.find("input"):b.find("select").length>0?b.find("select"):b.find("textarea").length>0?b.find("textarea"):null}function c(b){return b.is("input")||b.is("select")||b.is("textarea")?a.trim(b.val()).length>0:(console.error("Validation Error: Cannot validate Text for <"+b.prop("tagName")+">"),!1)}function d(b){var d=/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;return c(b)?d.test(a.trim(b.val())):!1}function e(b){return c(b)?a.isNumeric(a.trim(b.val())):!1}function f(b,c){return a(c).length>0?a.trim(b.val())==a.trim(a(c).val()):a.trim(b.val())==c}function g(a){return a.is(":visible")}function h(a){return a.is(":enabled")}function i(i,j){var k,l,m,n,o,p,q,r,s,t,u,v=a(i);j=j||"has-error";var w=[],x=!1;v.find("[data-plenty-validate], :required").each(function(i,y){s=a(y).attr("data-plenty-validate"),l=b(y),t=s?s:"text",t=t.split(",");for(var i=0,z=l.length;z>i;i++){if(k=a(l[i]),u=k.attr("type"),!g(k)||!h(k))return;if(m=t[i].trim()||t[0].trim(),n=!1,k.is("input")&&"radio"!=u&&"checkbox"!=u||k.is("textarea"))switch(m){case"text":n=!c(k);break;case"mail":n=!d(k);break;case"number":n=!e(k);break;case"value":n=!f(k,a(y).attr("data-plenty-validation-value"));break;case"none":break;default:console.error('Form validation error: unknown validate property: "'+s+'"')}else if(!k.is("input")||"radio"!=u&&"checkbox"!=u){if(!k.is("select"))return void console.error("Form validation error: "+a(y).prop("tagName")+" does not contain an form element");n=""==k.val()||"-1"==k.val()}else{if(o=k.attr("name"),p=v.find('input[name="'+o+'"]:checked').length,"radio"==u)q=1,r=1;else{var A=new Function("return "+s)()||{min:1,max:1};q=A.min,r=A.max}n=q>p||p>r}n&&(x=!0,w.push(k),l.length>1?(k.addClass(j),v.find('label[for="'+k.attr("id")+'"]').addClass(j)):a(y).addClass(j))}}),v.on("validationFailed",function(){var b=50,c=v.find("."+j).first(),d=c.offset().top,e=a("html, body");v.parents(".modal").length>0?(e=v.parents(".modal").find(".modal-body"),d=e.scrollTop()-(e.offset().top-c.offset().top)):v.is(".modal")&&(e=v.find(".modal-body"),d=e.scrollTop()-(e.offset().top-c.offset().top)),(d-bwindow.pageYOffset+window.innerHeight)&&e.animate({scrollTop:d-b})}),x&&(v.find("."+j).each(function(c,d){k=a(b(d)), +k.on("focus click",function(){var b=a(d);b.removeClass(j),v.find('label[for="'+a(this).attr("id")+'"]').removeClass(j)})}),v.trigger("validationFailed",[w]));var y=v.attr("data-plenty-callback");if(!x&&y&&"submit"!=y&&"function"==typeof window[y]){var z={};return v.find("input, textarea, select").each(function(){"checkbox"==a(this).attr("type")?z[a(this).attr("name")]=a(this).is(":checked"):z[a(this).attr("name")]=a(this).val()}),window[y](z),!1}return!x}return{validate:i}}),a.fn.validateForm=function(){return b.getInstance().ValidationService.validate(this)},a.fn.getFormValues=function(){function b(b,c){var e=b.match(/^([^\[]+)(.*)/);if(e[2]){var f,g=/\[([^\]]+)]/g,h=[];for(h[0]=e[1];null!==(f=g.exec(e[2]));)h.push(f[1]);for(var i=h.length-1;i>=0;i--){var j={};j[h[i]]=c,c=j}d=a.extend(!0,d,c)}else d[e[1]]=c}var c=this,d={};return c.find("input, select, textarea").each(function(d,e){if(a(e).attr("name"))if("checkbox"==a(e).attr("type")){var f=[];a(c).find('[name="'+a(e).attr("name")+'"]:checked').each(function(b,c){f.push(a(c).val())}),b(a(e).attr("name"),f)}else"radio"==a(e).attr("type")?a(e).is(":checked")&&b(a(e).attr("name"),a(e).val()):b(a(e).attr("name"),a(e).val())}),d}}(jQuery,PlentyFramework),PlentyFramework.compile();var plenty=PlentyFramework.getInstance();jQuery(document).ready(function(){plenty.bindDirectives()}); //# sourceMappingURL=plentymarketsCMStools-1.0.8.min.js.map \ No newline at end of file diff --git a/dist/plentymarketsCMStools-1.0.8.min.js.map b/dist/plentymarketsCMStools-1.0.8.min.js.map index d155a62..25c93cc 100644 --- a/dist/plentymarketsCMStools-1.0.8.min.js.map +++ b/dist/plentymarketsCMStools-1.0.8.min.js.map @@ -1 +1,930 @@ -{"version":3,"file":"plentymarketsCMStools-1.0.8.js","sources":["../tmp/templates.js","../libs/mustache.min.js","../tmp/plentyFramework.js","../src/directives/Authentication.js","../src/directives/Basket.js","../src/directives/Checkout.js","../src/directives/MobileDropdown.js","../src/directives/Redirect.js","../src/directives/Tab.js","../src/directives/UI.js","../src/directives/Validator.js","../src/factories/APIFactory.js","../src/factories/CMSFactory.js","../src/factories/CheckoutFactory.js","../src/factories/ModalFactory.js","../src/factories/UIFactory.js","../src/factories/yuidoc-module.js","../src/helpers/Object.equals.js","../src/partials/cssClasses.js","../src/partials/error/error.js","../src/partials/modal/modal.js","../src/partials/partialsInitialization.js","../src/partials/waitscreen/waitscreen.js","../src/services/AddressDoctorService.js","../src/services/AuthenticationService.js","../src/services/BasketService.js","../src/services/CheckoutService.js","../src/services/FeedbackService.js","../src/services/MediaSizeService.js","../src/services/NavigatorService.js","../src/services/PostfinderService.js","../src/services/SocialShareService.js","../src/services/ValidationService.js","../src/services/yuidoc-module.js","../src/plentyFrameworkCompiler.js"],"names":["TemplateCache","global","factory","exports","nodeName","define","amd","Mustache","this","mustache","isFunction","object","typeStr","obj","isArray","escapeRegExp","string","replace","hasProperty","propName","testRegExp","re","regExpTest","call","isWhitespace","nonSpaceRe","escapeHtml","String","s","entityMap","parseTemplate","template","tags","stripSpace","hasTag","nonSpace","spaces","length","tokens","pop","compileTags","tagsToCompile","split","spaceRe","Error","openingTagRe","RegExp","closingTagRe","closingCurlyRe","sections","start","type","value","chr","token","openSection","scanner","Scanner","eos","pos","scanUntil","i","valueLength","charAt","push","scan","tagRe","whiteRe","equalsRe","curlyRe","nestTokens","squashTokens","lastToken","squashedTokens","numTokens","section","nestedTokens","collector","tail","Context","view","parentContext","cache",".","parent","Writer","objectToString","Object","prototype","toString","Array","test","&","<",">","\"","'","/","match","index","substring","search","lookup","name","hasOwnProperty","names","context","lookupHit","indexOf","clearCache","parse","render","partials","renderTokens","originalTemplate","symbol","buffer","undefined","renderSection","renderInverted","renderPartial","unescapedValue","escapedValue","rawValue","subRender","self","j","slice","escape","version","defaultWriter","TypeError","to_html","send","result","$","bindEventCallback","$elem","eventType","callback","params","on","event","eventStack","apply","document","readyState","addCustomEvents","element","is","trigger","radioGroup","attr","each","radio","$radio","parseDirectives","input","thisValue","directivePattern","expressions","directives","expression","trim","console","error","directive","class","method","param","isNaN","parseFloat","toLowerCase","compileComponent","component","componentLevel","dependencyStack","compiledDependencies","dependencies","dependency","inArray","components","factories","PlentyFramework","services","join","setup","instance","getInstance","compare","localVersion","compareVersion","parseInt","get","equals","v","globals","setGlobal","identifier","getGlobal","fallbackValue","directiveName","directiveFunctions","bindDirectives","rootElement","find","getRecentEvent","lastEventIdx","pushEvent","service","serviceName","serviceFunctions","factoryName","factoryFunctions","compileTemplate","data","translate","text","scriptPath","Strings","loadLanguageFile","fileName","ajax","url","dataType","done","response","localeString","warn","compile","scripts","getElementsByTagName","path","src","jQuery","pm","AuthenticationService","login","elem","preventDefault","customerLogin","BasketService","addBasketItem","basketItemsList","parentForm","parents","BasketItemItemID","val","BasketItemPriceID","BasketItemQuantity","BasketItemBranchID","attributeInputsList","attributesList","idx","BasketItemAttributeID","BasketItemAttributeValueID","BasketItemAttributesList","addItem","changeItemQuantity","increment","$quantityInput","maxLength","isBasketView","timeout","window","clearTimeout","setTimeout","setItemQuantity","basketItemID","fail","basketItem","getItem","CheckoutService","setMethodOfPayment","paymentID","confirmAtrigaPaymax","atrigaPaymaxConfirmed","MediaSize","initDropdowns","resetDropdowns","dropdownElements","closableDropdownElements","dropdownList","$current","target","removeClass","openDropdown","alwaysClickable","$parent","isInterval","Modernizr","touch","showDropdownHideOthers","avoidRedirectinStopPropagation","not","addClass","off","e","stopPropagation","slideDropdown","$elemParent","siblings","slideToggle","removeAttr","MediaSizeService","NavigatorService","to","href","interval","location","assign","toCheckoutTab","tabID","goToID","showTab","tabSelector","tab","initRemoteLabel","groupID","tabGroups","TabGroup","getTab","addTab","addLabel","initRemoteTab","setContent","showRemoteTab","tabs","Tab","zIndex","activeTab","getContent","css","hide","currentZ","resetTabs","show","id","getID","label","$labels","content","$content","SocialShareService","initUIWindowEvents","fireEqualHeight","toTopButtonList","scrollTop","doToArrayElements","addContentPageSlider","owlCarousel","navigation","navigationText","slideSpeed","paginationSpeed","singleItem","autoPlay","stopOnHover","afterMove","current","equalHeight","mediaSizes","elementExists","maxHeight","$equalTarget","$equalTargetList","children","equalHeightElementList","outerHeight","height","initToTop","click","animate","initLazyload","effect","lazyload","toggleHideShow","log","initSlideToggle","checked","$targetElement","$radioGroupList","visibleOnChecked","change","$self","slideDown","slideUp","toggleClass","duration","slideAction","$target","callbackString","toggleSocialShare","socialShareService","$toggle","append","hasClass","tooltip","getSocialService","cssClass","array","func","ValidationService","validate","form","errorClass","UI","Modal","renewLoginSession","sessionExpirationTimeout","prepare","setTitle","setLabelDismiss","setLabelConfirm","onConfirm","onDismiss","handleError","jqXHR","responseText","parseJSON","printErrors","error_stack","throwError","status","statusText","_get","ignoreErrors","runInBackground","sync","showWaitScreen","async","always","hideWaitScreen","_post","isFile","processData","contentType","JSON","stringify","_put","_delete","_idle","Deferred","resolve","ready","post","put","delete","idle","API","getContainer","containerName","from","layoutGroup","getParams","getCategoryContent","categoryID","CMS","Checkout","checkoutData","getCheckout","copy","checkout","loadCheckout","extend","setCheckout","reloadContainer","container","html","reloadCatContent","catId","reloadItemContainer","isModal","selector","title","modal","setClass","labelConfirm","labelDismiss","setContainer","bsModal","getModal","filter","script","createElement","innerHTML","init","close","startTimeout","confirmed","timeRemaining","timeStart","Date","getTime","clearInterval","setInterval","paused","secondsRemaining","Math","round","pauseTimeout","continueTimeout","stopTimeout","code","msg","message","errorMessages","errorPopup","has","key","addError","waitScreenCount","waitScreen","WaitScreen","forceClose","a","b","constructor","cssClasses","active","popup","hideAll","errorCode","remove","hover","root","validateAddress","addressForms","addressIsValid","addressDoctor","AddressDoctor","requiredFields","isValid","fields","isPackstation","suggestions","AddressList","$form","getFormValues","refreshView","getAddresses","suggestionListVisible","validateInput","houseNoAllowed","$inputs","HouseNo","valueList","getList","$suggestionContainer","buildSuggestionList","focus","positionSuggestionList","suggestionKey","width","outerWidth","left","position","top","values","filterAddress","Street","toUpperCase","ZIP","City","addressInput","suggestionType","street","city","houseNo","country","CountryID","responseLength","currentResponse","address","getAddress","addresses","suggestion","addressCount","results","filteredAddresses","range","resetPassword","validateForm","Email","IsMailSend","loginMail","Password","loginPassword","setInvoiceAddress","invoiceAddress","CustomerInvoiceAddress","registerCustomer","AddressDoctorService","LoginType","customerInvoiceAddress","CustomerProperty","tmpProperties","CustomerPropertiesList","property","PropertyID","PropertyValue","article","itemID","quantity","resp","addArticle","saveOrderParams","articleWithParams","orderParamsForm","attrType","addOrderParamValue","files","orderParamFileUpload","paramValue","refreshBasketPreview","ArticleID","updateArticle","$input","formData","fileData","orderParamUploadFiles","orderParamFileIdStack","FormData","basketList","paramId","BasketItemOrderParamsList","BasketItemOrderParamID","BasketItemOrderParamValue","editItemAttributes","BasketItemID","getBasketItem","attributeSelect","editOrderParams","basketItems","BasketItemsList","removeBasketItem","forceDelete","doDelete","$oldBasketList","$basketListContainer","fadeOut","prepend","fadeIn","deferred","itemName","BasketItemNameMap","item","reject","basketItemIndex","itemQuantityTotal","Totals","TotalsItemSum","addCoupon","CouponActiveCouponCode","updateContainer","removeCoupon","Coupon","removeItem","setCustomerSignAndInfo","CheckoutCustomerSign","CheckoutOrderInfoText","CustomerSign","OrderInfoText","saveShippingAddress","shippingAddressID","shippingAddress","addressesAreEqual","CustomerShippingAddress","IsPackstation","PackstationNo","IsPostfiliale","PostfilialNo","CheckoutCustomerShippingAddressID","ID","CheckoutShippingCountryID","CheckoutMethodOfPaymentID","CheckoutShippingProfileID","registerGuest","address1","address2","setShippingProfile","ShippingProfileID","preparePayment","paymentData","CheckoutMethodOfPaymentRedirectURL","CheckoutMethodOfPaymentAdditionalContent","isBankDetails","saveBankDetails","saveCreditCard","errorStack","CheckoutAtrigapaymaxChecked","atrigaPaymaxChecked","editBankDetails","customerBankDetails","bankDetails","CustomerBankName","bankName","CustomerBLZ","blz","CustomerAccountNumber","accountNo","CustomerAccountOwner","accountOwner","CustomerIBAN","iban","CustomerBIC","bic","editCreditCard","paymentInformationCC","creditCard","Owner","owner","Cvv2","cvv2","Number","number","Year","year","Month","month","Provider","provider","loadAddressSuggestion","postnummer","Postnummer","placeOrder","TermsAndConditionsCheck","termsAndConditionsCheck","WithdrawalCheck","withdrawalCheck","PrivacyPolicyCheck","privacyPolicyCheck","AgeRestrictionCheck","ageRestrictionCheck","NewsletterCheck","newsletterCheck","KlarnaTermsAndConditionsCheck","klarnaTermsAndConditionsCheck","PayoneDirectDebitMandateCheck","payoneDirectDebitMandateCheck","PayoneInvoiceCheck","payoneInvoiceCheck","MethodOfPaymentRedirectURL","MethodOfPaymentAdditionalContent","getFeedbacks","setFeedbackInterval","end","feedbackInterval","dateStart","dateEnd","listFeedbacks","articleType","referenceId","feedbackType","ReferenceId","FromDate","ToDate","FeedbackType","feedbackTypes","COMMENTS_AND_RATINGS","between","for","addFeedback","withRating","rating","Rating","withComment","comment","Text","withAuthor","author","mail","customerID","Author","CustomerId","sendFeedback","COMMENTS_ONLY","RATINGS_ONLY","articleTypes","ITEM","CATEGORY","BLOG","ArticleTypes","FeedbackTypes","getInterval","bsInterval","calculateMediaSize","size","matchMedia","matches","oldValue","intervalList","resize","buttonNext","buttonPrev","goTo","next","previous","addEventListener","hash","urlParam","exec","fillNavigation","getCurrentContainer","beforeChange","interceptor","interceptors","afterChange","resolveInterceptors","continueTabChange","currentContainer","targetContainer","ignoreInterceptors","contentChanged","checkoutStates","proceedTabChange","continueChange","containerID","navigationCount","buttonWidth","padding","tabWidth","paddingLeft","paddingRight","paddingEachItem","paddingLastLeft","paddingLastRight","paddingLastItem","UIFactory","openPostfinderModal","shippingFields","PostfinderItemStreet","PostfinderItemZIP","PostfinderItemCity","PostfinderItemHouseNo","zip","numberOfResults","showErrorMessage","dimension","distInMeters","PostfinderItemDistance","distInKilometers","toFixed","PostfinderItemIsPackstation","PostfinderItemPackstationNo","PostfinderItemPostfilialNo","district","PostfinderItemDistrict","distance","remark","PostfinderItemRemark","packstationID","inputId","closest","getService","facebook-like","socialLangLocale","encodeURIComponent","getURI","facebook-recommend","twitter","getTweetText","google-plus","socialLang","uri","canonical","protocol","host","getMeta","metaContent","creator","getFormControl","validateText","formControl","prop","validateMail","mailRegExp","validateNumber","isNumeric","validateValue","reference","visibility","isEnabled","formControls","validationKey","currentHasError","group","checkedMin","checkedMax","attrValidate","validationKeys","formControlAttrType","missingFields","hasError","minMax","Function","min","max","distanceTop","$error","first","errorOffset","offset","$scrollTarget","pageYOffset","innerHeight","$errorElement","fn","inject","child","exp","groupValues","checkbox","plenty"],"mappings":"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","sourcesContent":["var TemplateCache = {};\n\nTemplateCache[\"addressSuggestions/addressDoctor.html\"] = \"\";\n\nTemplateCache[\"addressSuggestions/postFinder.html\"] = \"{{#addresses}}\\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"{{/addresses}}\\n\" +\n \"\";\n\nTemplateCache[\"error/errorMessage.html\"] = \"
    \\n\" +\n \" Code {{code}}:\\n\" +\n \" {{{message}}}\\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"error/errorPopup.html\"] = \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"modal/modal.html\"] = \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#title}}\\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"

    {{{title}}}

    \\n\" +\n \"
    \\n\" +\n \" {{/title}}\\n\" +\n \"\\n\" +\n \"
    {{{content}}}
    \\n\" +\n \"\\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#labelDismiss}}\\n\" +\n \" \\n\" +\n \" {{/labelDismiss}}\\n\" +\n \"\\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"waitscreen/waitscreen.html\"] = \"
    \";\n","(function defineMustache(global,factory){if(typeof exports===\"object\"&&exports&&typeof exports.nodeName!==\"string\"){factory(exports)}else if(typeof define===\"function\"&&define.amd){define([\"exports\"],factory)}else{global.Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)===\"[object Array]\"};function isFunction(object){return typeof object===\"function\"}function typeStr(obj){return isArray(obj)?\"array\":typeof obj}function escapeRegExp(string){return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")}function hasProperty(obj,propName){return obj!=null&&typeof obj===\"object\"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"/\":\"/\"};function escapeHtml(string){return String(string).replace(/[&<>\"'\\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\\s*/;var spaceRe=/\\s+/;var equalsRe=/\\s*=/;var curlyRe=/\\s*\\}/;var tagRe=/#|\\^|\\/|>|\\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile===\"string\")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error(\"Invalid tags: \"+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+\"\\\\s*\");closingTagRe=new RegExp(\"\\\\s*\"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp(\"\\\\s*\"+escapeRegExp(\"}\"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===\"\"};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return\"\";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail=\"\";break;case 0:match=\"\";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={\".\":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(\".\")>0){value=context.view;names=name.split(\".\");index=0;while(value!=null&&index\")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol===\"&\")value=this.unescapedValue(token,context);else if(symbol===\"name\")value=this.escapedValue(token,context);else if(symbol===\"text\")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer=\"\";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j\n * =====================================================================================\n */\n\n/**\n * @module PlentyFramework\n */\n(function( $ )\n{\n // will be overridden by grunt\n var version = \"1.0.8\";\n\n /**\n * Collection of uncompiled registered factories & services.\n * See {{#crossLink \"PlentyFramework/compile:method\"}}.compile(){{/crossLink}}\n * @attribute components\n * @static\n * @type {{factories: {}, services: {}}}\n */\n var components = {\n factories : {},\n services : {},\n directives: {}\n };\n\n /**\n * Framework providing client functions for plentymarkets Webshops.\n * @class PlentyFramework\n * @constructor\n */\n PlentyFramework = function()\n {\n };\n\n var instance = null;\n PlentyFramework.getInstance = function()\n {\n instance = instance || new PlentyFramework();\n return instance;\n };\n\n PlentyFramework.version = (function() {\n\n return {\n get: function() {\n return version;\n },\n equals: function( v ) {\n return compare(v) == 0;\n },\n compare: compare\n };\n\n function compare( compare )\n {\n var localVersion = version.split(\".\");\n var compareVersion = compare.split(\".\");\n\n for( var i = 0; i < compareVersion.length; i++ )\n {\n if( localVersion[i] === compareVersion[i] || compareVersion[i] === \"*\" )\n {\n continue;\n }\n\n if( parseInt(localVersion[i]) < parseInt(compareVersion[i]) )\n {\n return -1;\n }\n\n if( parseInt(localVersion[i]) > parseInt(compareVersion[i]) )\n {\n return 1;\n }\n }\n return 0;\n }\n\n })();\n\n /**\n * Customizable controls for partials will be injected here.\n * (e.g. Modal)\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.partials = {};\n\n /**\n * Collection of registered global variables\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.globals = {};\n\n /**\n * Set a global variable.\n * @function setGlobal\n * @static\n * @param {string} identifier A unique identifier to reference this variable\n * @param {*} value The value to set\n * @return {*} The value\n */\n PlentyFramework.setGlobal = function( identifier, value )\n {\n if ( PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n console.error( 'Global variable \"' + identifier + '\" already exists and cannot be overridden.' );\n return null;\n }\n\n PlentyFramework.globals[identifier] = value;\n\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Get the value of a global variable or undefined if not exists\n * @function getGlobal\n * @static\n * @param identifier The identifier of the requested variable\n * @return {*} The value of the variable\n */\n PlentyFramework.getGlobal = function( identifier, fallbackValue )\n {\n if( !PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n return fallbackValue;\n }\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Collection of registered directives\n * @type {Array}\n * @static\n */\n PlentyFramework.directives = {};\n\n /**\n * Register directive. Directives can be bound to dynamically added nodes by calling pm.bindPlentyFunctions();\n * @function directive\n * @static\n * @param {string} selector jQuery selector of the DOM-elements to bind the directive to\n * @param {function} callback Function to add directives behaviour\n * @param {Array} dependencies List of required services. Services will be passed to callback function\n * @param {boolean} allowDuplicates Defines if a directive can be bound to the same element multiple times\n * @return {object} The created directive\n */\n PlentyFramework.directive = function( directiveName, directiveFunctions, dependencies )\n {\n // Catch type mismatching for 'directiveName'\n if ( typeof directiveName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof directiveName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof directiveFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof directiveFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.directives[directiveName] = {\n name : directiveName,\n dependencies: dependencies,\n setup : directiveFunctions\n };\n };\n\n /**\n * Bind registered directives.\n * @function bindDirectives\n * @param {string} [directiveSelector] restrict binding to elements matching this selector\n */\n PlentyFramework.prototype.bindDirectives = function( rootElement )\n {\n\n rootElement = rootElement || 'html';\n\n $( rootElement ).find( '[data-plenty]' ).each( function( i, element )\n {\n\n var directives = parseDirectives( $( element ).attr( 'data-plenty' ), $( element ) );\n\n if ( directives.length <= 0 )\n {\n // continue\n return;\n }\n\n addCustomEvents( element );\n\n for ( var i = 0; i < directives.length; i++ )\n {\n var directive = directives[i];\n if ( !!PlentyFramework.directives[directive.class] && PlentyFramework.directives.hasOwnProperty( directive.class ) )\n {\n\n var callback = PlentyFramework.directives[directive.class][directive.method];\n if ( !!callback && typeof callback == \"function\" )\n {\n\n if ( directive.event == \"ready\" )\n {\n callback.apply( null, directive.params );\n }\n else\n {\n bindEventCallback( $( element ), directive.event, callback, directive.params );\n /*\n $( element ).on( directive.event, function( e )\n {\n directive = injectEvent( directive, e );\n return callback.apply( null, directive.params );\n } );\n */\n }\n\n }\n else\n {\n console.error( \"Method not found: \" + directive.method + \" in \" + directive.class );\n }\n\n }\n else\n {\n console.error( \"Directive not found: \" + directive.class );\n }\n }\n } );\n\n $( document ).trigger( 'initPartials', rootElement );\n };\n\n var eventStack = [];\n\n PlentyFramework.getRecentEvent = function( eventType )\n {\n var lastEventIdx = eventStack.length - 1;\n if ( !eventType )\n {\n return eventStack[lastEventIdx];\n }\n else\n {\n for ( var i = lastEventIdx; i >= 0; i-- )\n {\n if ( eventType == eventStack[i].type )\n {\n return eventStack[i];\n }\n }\n }\n\n return null;\n\n };\n\n PlentyFramework.pushEvent = function( event )\n {\n eventStack.push( event );\n };\n\n /**\n * Bind event to element by eventType.\n * If cms says \"click:Foo.bar(this, event)\" eventType is \"click\".\n *\n * @param $elem - jQuery object on which event was triggered\n * @param eventType - type of event\n * @param callback - callback function of directive [example: \"bar(this, event)\"]\n * @param params - list of parameters for callback function.\n */\n function bindEventCallback( $elem, eventType, callback, params )\n {\n $elem.on( eventType, function( event )\n {\n eventStack.push( event );\n return callback.apply( null, params );\n } );\n\n if( document.readyState === \"complete\" && eventType === \"ready\" )\n {\n // execute 'ready' directives directly if document is already loaded\n callback.apply( null, params );\n }\n }\n\n function addCustomEvents( element )\n {\n\n var $elem = $( element );\n\n if ( $elem.is( 'input[type=\"checkbox\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n if ( $elem.is( ':checked' ) )\n {\n $elem.trigger( 'check' );\n }\n else\n {\n $elem.trigger( 'uncheck' );\n }\n } );\n }\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n var radioGroup = $elem.attr( 'name' );\n\n $( 'input[type=\"radio\"][name=\"' + radioGroup + '\"]' ).each( function( i, radio )\n {\n var $radio = $( radio );\n if ( $radio.is( ':checked' ) )\n {\n $radio.trigger( 'check' );\n }\n else\n {\n $radio.trigger( 'uncheck' );\n }\n\n } );\n\n } );\n }\n }\n\n function parseDirectives( input, thisValue )\n {\n var directivePattern = /^(([\\w]+):)?([\\w]+)\\.([\\w]+)(\\((.*)\\))?$/;\n var expressions = input.split( ';' );\n var directives = [];\n\n for ( var i = 0; i < expressions.length; i++ )\n {\n var expression = expressions[i].trim();\n\n if ( !expression )\n {\n continue;\n }\n\n if ( !directivePattern.test( expression ) )\n {\n // console.warn( \"Invalid directive: \" + expression );\n continue;\n }\n\n var match = expression.match( directivePattern );\n\n if ( !match[3] || match[3].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Class name not set.\" );\n continue;\n }\n\n if ( !match[4] || match[4].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Method not set.\" );\n continue;\n }\n\n var directive = {\n event : match[2] || 'ready',\n class : match[3],\n method: match[4],\n params: []\n };\n\n if ( !!match[6] && match[6].length > 0 )\n {\n var params = match[6].match( /(['][^']+['])|([\\w-]+)|([\"][^\"]+[\"])/g );\n for ( var j = 0; j < params.length; j++ )\n {\n var param = params[j].trim();\n if ( !isNaN( parseFloat( param ) ) )\n {\n directive.params.push( parseFloat( param ) );\n }\n else if ( param.toLowerCase() == 'true' )\n {\n directive.params.push( true );\n }\n else if ( param.toLowerCase() == 'false' )\n {\n directive.params.push( false );\n }\n else if ( param.toLowerCase() == 'this' )\n {\n directive.params.push( thisValue );\n }\n else\n {\n directive.params.push( param.replace( /^['\"]|['\"]$/g, '' ) );\n }\n }\n }\n\n directives.push( directive );\n\n }\n return directives;\n }\n\n /**\n * Register a new service\n * @function service\n * @static\n * @param {string} serviceName Unique identifier of the service to get/ create\n * @param {function} serviceFunctions Callback containing all public functions of this service.\n * @param {Array} [dependencies] Identifiers of required services to inject in serviceFunctions\n * @return {object} The object described in serviceFunctions(). Can be received via\n * PlentyFramework.[serviceName]\n */\n PlentyFramework.service = function( serviceName, serviceFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof serviceName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof serviceName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof serviceFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof serviceFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.services[serviceName] = {\n name : serviceName,\n dependencies: dependencies,\n setup : serviceFunctions\n };\n\n };\n\n /**\n * Collection of compiled factories\n * @attribute factories\n * @static\n * @type {object}\n */\n PlentyFramework.factories = {};\n\n /**\n * Register a new factory\n * @function factory\n * @static\n * @param {string} factoryName A unique name of the new factory\n * @param {function} factoryFunctions The function describing the factory\n * @param {Array} dependencies List of required factories to inject\n */\n PlentyFramework.factory = function( factoryName, factoryFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof factoryName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof factoryName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof factoryFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof factoryFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n components.factories[factoryName] = {\n name : factoryName,\n dependencies: dependencies,\n setup : factoryFunctions\n }\n\n };\n\n /**\n * Renders html template. Will provide given data to templates scope.\n * Uses Mustache syntax for data-binding.\n * @function compileTemplate\n * @static\n * @param {String} template relative path to partials template to load. Base path = '/src/partials/'\n * @param {Object} data data to privide to templates scope.\n * @returns {String} The rendered html string\n */\n PlentyFramework.compileTemplate = function( template, data )\n {\n data = data || {};\n data.translate = function()\n {\n return function( text, render )\n {\n return render( PlentyFramework.translate( text ) );\n };\n };\n return Mustache.render( TemplateCache[template], data );\n };\n\n /**\n * The path on the server where the script is located in.\n * @attribute\n * @static\n * @type {String}\n */\n PlentyFramework.scriptPath = '';\n\n /**\n * Collection of locale strings will be injected here after reading language file.\n * @attribute\n * @static\n * @type {Object}\n */\n PlentyFramework.Strings = {};\n\n /**\n * Load language file containing translations of locale strings.\n * @function loadLanguageFile\n * @static\n * @param fileName relative path to language file.\n */\n PlentyFramework.loadLanguageFile = function( fileName )\n {\n $.ajax({\n url: PlentyFramework.scriptPath + fileName,\n dataType: 'json'\n }).done( function( response ) {\n PlentyFramework.Strings = response;\n });\n };\n\n /**\n * Try to get locale translation of given string.\n * Render translated string using Mustache syntax\n * if additional parameters are given.\n * @function translate\n * @static\n * @param {String} string The string to translate\n * @param {Object} [params] additional data for rendering\n * @returns {String} The translation of the given string if found. Otherwise returns the original string.\n */\n PlentyFramework.translate = function( string, params )\n {\n var localeString;\n if ( PlentyFramework.Strings.hasOwnProperty( string ) )\n {\n localeString = PlentyFramework.Strings[string];\n }\n else\n {\n localeString = string;\n console.warn( 'No translation found for \"' + localeString + '\".' );\n }\n\n if ( !!params )\n {\n localeString = Mustache.render( localeString, params );\n }\n\n return localeString;\n\n };\n\n /**\n * Compile registered factories & services\n * @function compile\n * @static\n */\n PlentyFramework.compile = function()\n {\n\n for ( var factory in components.factories )\n {\n if ( !PlentyFramework.factories.hasOwnProperty( factory ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.factories[factory], 3 );\n }\n }\n\n for ( var service in components.services )\n {\n if ( !PlentyFramework.prototype.hasOwnProperty( service ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.services[service], 2 );\n }\n }\n\n for ( var directive in components.directives )\n {\n if ( !PlentyFramework.directives.hasOwnProperty( directive ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.directives[directive], 1 );\n }\n }\n\n var scripts = document.getElementsByTagName( 'SCRIPT' );\n for( var i = scripts.length - 1; i >= 0; i-- ) {\n var path = scripts[i].src.match( /(.*)\\/(.*)\\.js(\\?\\S*)?$/ );\n if( !!path ) {\n PlentyFramework.scriptPath = path[1];\n break;\n }\n }\n\n };\n\n // Level: 1 = directive, 2 = service, 3 = factory\n function compileComponent( component, componentLevel, dependencyStack )\n {\n dependencyStack = dependencyStack || [];\n\n // resolve dependencies\n var compiledDependencies = [];\n for ( var i = 0; i < component.dependencies.length; i++ )\n {\n var dependency = component.dependencies[i];\n if ( $.inArray( dependency, dependencyStack ) < 0 )\n {\n // add dependency to stack to avoid cyclic injection\n dependencyStack.push( dependency );\n\n if ( components.factories.hasOwnProperty( dependency ) )\n {\n // required dependency is a factory\n if ( !PlentyFramework.factories.hasOwnProperty( dependency ) )\n {\n // factory is not compiled yet\n compileComponent( components.factories[dependency], 3, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.factories[dependency] );\n continue;\n }\n\n if ( componentLevel <= 2 && components.services.hasOwnProperty( dependency ) )\n {\n // required dependency is a service\n if ( !PlentyFramework.prototype.hasOwnProperty( dependency ) )\n {\n // service is not compiled yet\n compileComponent( components.services[dependency], 2, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.prototype[dependency] );\n continue;\n }\n\n if ( componentLevel <= 1 && components.directives.hasOwnProperty( dependency ) )\n {\n // required dependency is a directive\n if ( !PlentyFramework.directives.hasOwnProperty( dependency ) )\n {\n // directive is not compiled yet\n compileComponent( components.directives[dependency], 1, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.directives[dependency] );\n continue;\n }\n\n console.error( 'Cannot inject dependency \"' + dependency + '\": Object not found.' );\n }\n else\n {\n console.error( 'Cyclic dependency injection: ' + dependencyStack.join( ' -> ' ) + ' -> ' + dependency );\n }\n }\n\n // compile component\n if ( componentLevel == 3 )\n {\n PlentyFramework.factories[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 2 )\n {\n PlentyFramework.prototype[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 1 )\n {\n PlentyFramework.directives[component.name] = component.setup.apply( null, compiledDependencies );\n }\n }\n\n}( jQuery ));\n\n\n\n","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.directive( 'Authentication', function( AuthenticationService )\n {\n return {\n login: login\n };\n\n function login( elem )\n {\n pm.getRecentEvent().preventDefault();\n AuthenticationService.customerLogin( $( elem ) );\n }\n }, [\"AuthenticationService\"] );\n\n}( jQuery, PlentyFramework ));","(function( $, pm )\n{\n pm.directive( 'Basket', function( BasketService )\n {\n\n return {\n addBasketItem : addBasketItem,\n changeItemQuantity: changeItemQuantity,\n setItemQuantity : setItemQuantity\n };\n\n function addBasketItem( elem )\n {\n pm.getRecentEvent().preventDefault();\n //init\n var basketItemsList = {};\n var $elem = $( elem );\n var parentForm = $elem.parents( 'form' );\n\n basketItemsList.BasketItemItemID = parentForm.find( '[name=\"ArticleID\"]' ).val();\n basketItemsList.BasketItemPriceID = parentForm.find( '[name=\"SYS_P_ID\"]' ).val();\n basketItemsList.BasketItemQuantity = parentForm.find( '[name=\"ArticleQuantity\"]' ).val();\n basketItemsList.BasketItemBranchID = parentForm.find( '[name=\"source_category\"]' ).val();\n\n //attributes\n var attributeInputsList = parentForm.find( '[name^=\"ArticleAttribute\"]' );\n var attributesList = [];\n\n $.each( attributeInputsList, function( idx, elem )\n {\n var match = elem.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( elem ).val()\n } );\n }\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItemsList.BasketItemAttributesList = attributesList;\n }\n\n //add basketItem and refresh previewLists\n BasketService.addItem( [basketItemsList] );\n\n }\n\n function changeItemQuantity( elem, increment )\n {\n var $elem = $( elem );\n var $quantityInput = $elem.parent().find( 'input' );\n var maxLength = parseInt( $quantityInput.attr( 'maxlength' ) ) || 5;\n var value = parseInt( $quantityInput.val() ) + increment;\n\n var isBasketView = $elem.parents( '[data-basket-item-id]' ).length > 0;\n\n if ( isBasketView )\n {\n if ( (value + '').length <= maxLength && value >= 0 )\n {\n $quantityInput.val( value );\n }\n\n var timeout = $elem.data( 'timeout' );\n\n if ( !!timeout )\n {\n window.clearTimeout( timeout );\n }\n\n timeout = window.setTimeout( function()\n {\n $quantityInput.trigger( 'change' );\n }, 1000 );\n\n $elem.data( 'timeout', timeout );\n }\n else\n {\n if ( (value + '').length <= maxLength && value >= 1 )\n {\n $quantityInput.val( value );\n }\n }\n }\n\n function setItemQuantity( basketItemID, input )\n {\n BasketService.setItemQuantity(\n basketItemID,\n parseInt( $( input ).val() )\n ).fail( function()\n {\n // reset input's value on cancel\n var basketItem = BasketService.getItem( basketItemID );\n $( input ).val( basketItem.BasketItemQuantity );\n } );\n }\n\n }, ['BasketService'] );\n}( jQuery, PlentyFramework ));","(function( $, pm )\n{\n pm.directive( 'Checkout', function( CheckoutService )\n {\n\n return {\n setMethodOfPayment: setMethodOfPayment,\n confirmAtrigaPaymax: confirmAtrigaPaymax\n };\n\n function setMethodOfPayment( paymentID )\n {\n CheckoutService.setMethodOfPayment( paymentID );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxConfirmed )\n {\n CheckoutService.confirmAtrigaPaymax( atrigaPaymaxConfirmed );\n }\n }, ['CheckoutService'] );\n})( jQuery, PlentyFramework );","/**\n * Mobile dropdowns\n * Toggles dropdowns using css class 'open' instead of pseudo class :hover\n * Usage:\n *
  • \n * ...\n *
  • \n *\n * possible values for CONDITION\n * \"touch\" : use 'open'-class if device is touch-device AND media size is 'md' or 'lg'\n * \"toggle-xs-sm-or-touch\" : use 'open'-class if device is \"touch\" (as above) OR media size is 'xs' or 'sm'\n *\n */\n(function( $, pm )\n{\n pm.directive( 'MobileDropdown', function( MediaSize )\n {\n // store all dropdown elements\n var dropdownElements = [];\n\n // store dropdown elements which should be closed by clicking outside the element itself\n var closableDropdownElements = [];\n\n return {\n initDropdowns: initDropdowns,\n openDropdown : openDropdown,\n slideDropdown: slideDropdown\n };\n\n function initDropdowns()\n {\n $( window ).on( 'orientationchange sizeChange', function()\n {\n resetDropdowns( dropdownElements );\n resetDropdowns( closableDropdownElements );\n } );\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", function( event )\n {\n resetDropdowns( closableDropdownElements, event );\n } );\n }\n\n function resetDropdowns( dropdownList, event )\n {\n var $current;\n for ( var i = 0; i < dropdownList.length; i++ )\n {\n $current = $( dropdownList[i] );\n if ( !!event )\n {\n if ( $current.find( $( event.target ) ).length === 0 )\n {\n $current.removeClass( 'open' );\n }\n }\n else\n {\n $current.removeClass( 'open' );\n }\n }\n\n }\n\n function openDropdown( elem, alwaysClickable )\n {\n var $elem = $( elem );\n var $parent = $elem.parent();\n\n // case 1: xs || sm || ( touch && ( md || lg ) ) -> open/close via click on small devices, open/close via\n // css-hover on desktop, open/close via click on touch-desktop (e.g. top navigation)\n\n if ( !!alwaysClickable && ( MediaSize.isInterval( 'xs, sm' ) || ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n // if href\n if ( !$elem.attr( 'href' ) )\n {\n avoidRedirectinStopPropagation( $parent.not( $elem ) );\n }\n }\n else\n {\n if ( !$elem.attr( 'href' ) )\n {\n // hide dropdown\n $parent.removeClass( 'open' );\n }\n }\n }\n\n // case 2: touch && ( md || lg ) -> open via 1st click on touch-desktop, return false (e.g. main navigation)\n\n if ( !alwaysClickable && ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n avoidRedirectinStopPropagation( $parent );\n }\n else\n {\n // redirect to href if dropdown is already open\n // do nothing\n }\n }\n }\n\n function showDropdownHideOthers( elem, parent )\n {\n var $parent = $( parent );\n\n // hide other dropdowns\n resetDropdowns( closableDropdownElements );\n\n // remember opened dropdown\n if ( $.inArray( $parent[0], closableDropdownElements ) < 0 )\n {\n closableDropdownElements.push( $parent[0] );\n }\n\n // show dropdown\n $parent.addClass( 'open' );\n }\n\n function avoidRedirectinStopPropagation( elem )\n {\n var $elem = $( elem );\n\n // avoid redirecting\n pm.getRecentEvent().preventDefault();\n\n // avoid closing popup by clicking itself\n $elem.off( 'click' );\n $elem.on( 'click', function( e )\n {\n e.stopPropagation();\n } );\n }\n\n function slideDropdown( elem )\n {\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n // size interval query is required since function is used on document ready to initial open active\n // navigation (on small devices)\n if ( MediaSize.isInterval( 'xs, sm' ) )\n {\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 400, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n if ( $.inArray( $elemParent[0], dropdownElements ) < 0 )\n {\n dropdownElements.push( $elemParent[0] );\n }\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n }\n\n }, ['MediaSizeService'] );\n}( jQuery, PlentyFramework ));","(function( $, pm )\n{\n pm.directive( 'Redirect', function( MediaSizeService, NavigatorService )\n {\n\n return {\n to : to,\n toCheckoutTab: toCheckoutTab\n };\n\n function to( href )\n {\n if ( MediaSizeService.interval() != 'xs' )\n {\n if ( typeof href === 'string' && href.indexOf('/') == -1 && $( href ).length > 0 )\n {\n window.location.assign( $( href ).attr( 'href' ) );\n }\n else\n {\n window.location.assign( href );\n }\n }\n }\n\n function toCheckoutTab( tabID )\n {\n NavigatorService.goToID( tabID );\n }\n\n }, ['MediaSizeService', 'NavigatorService'] );\n}( jQuery, PlentyFramework ));","(function( $, pm )\n{\n pm.directive( 'Tab', function( MediaSize )\n {\n\n var tabGroups = {};\n\n return {\n showTab : showTab,\n initRemoteLabel: initRemoteLabel,\n initRemoteTab : initRemoteTab,\n showRemoteTab : showRemoteTab\n };\n\n function showTab( tabSelector )\n {\n $( tabSelector ).tab( 'show' );\n }\n\n function initRemoteLabel( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).addLabel( $elem );\n }\n\n function initRemoteTab( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).setContent( $elem );\n }\n\n function showRemoteTab( tabID, groupID, interval )\n {\n if ( MediaSize.isInterval( interval ) )\n {\n pm.getRecentEvent().preventDefault();\n\n if ( !!tabGroups[groupID] && !!tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].showTab( tabID );\n }\n\n }\n }\n\n function TabGroup()\n {\n var tabs = {};\n var activeTab;\n\n return {\n addTab : addTab,\n showTab : showTab,\n getTab : getTab,\n resetTabs: resetTabs\n };\n\n function addTab( tabID )\n {\n tabs[tabID] = new Tab( tabID );\n return tabs[tabID];\n }\n\n function showTab( tabID )\n {\n var zIndex = 0;\n if ( !!activeTab )\n {\n // activeTab is set\n zIndex = parseInt( activeTab.getContent().parent().css( 'zIndex' ) );\n activeTab.hide();\n activeTab.getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n else\n {\n // activeTab not set before\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n var currentZ = parseInt( tabs[tab].getContent().parent().css( 'zIndex' ) );\n if ( zIndex == 0 || currentZ < zIndex )\n {\n zIndex = currentZ;\n }\n tabs[tab].hide();\n }\n }\n\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n }\n\n $( window ).on( 'sizeChange', resetTabs );\n }\n\n activeTab = tabs[tabID];\n activeTab.getContent().parent().css( 'zIndex', zIndex );\n activeTab.show();\n }\n\n function getTab( tabID )\n {\n return tabs[tabID];\n }\n\n function resetTabs()\n {\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].show();\n }\n }\n\n activeTab = null;\n }\n }\n\n function Tab( id )\n {\n var $content;\n var $labels = [];\n var tabID = id;\n\n return {\n addLabel : addLabel,\n setContent: setContent,\n getContent: getContent,\n getID : getID,\n show : show,\n hide : hide\n };\n\n function getID()\n {\n return tabID;\n }\n\n function addLabel( label )\n {\n $labels.push( label );\n return this;\n }\n\n function setContent( content )\n {\n $content = content;\n return this;\n }\n\n function getContent()\n {\n return $content;\n }\n\n function show()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].addClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.show().addClass( 'in' );\n }\n\n }\n\n function hide()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].removeClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.hide().removeClass( 'in' );\n }\n }\n }\n\n }, ['MediaSizeService'] );\n})( jQuery, PlentyFramework );","/**\n * Add fancy ui modifications - the visual stuff - here.\n * Respond functionality like 'event':UI.myFunctionality(currentElement)\n *\n * Example:\n * \n *\n */\n(function( $, pm )\n{\n pm.directive( 'UI', function( MediaSizeService, SocialShareService )\n {\n // elements to calculate height.\n var equalHeightElementList = [];\n var toTopButtonList = [];\n\n return {\n initUIWindowEvents : initUIWindowEvents,\n addContentPageSlider: addContentPageSlider,\n equalHeight : equalHeight,\n initToTop : initToTop,\n initLazyload : initLazyload,\n initSlideToggle : initSlideToggle,\n slideDown : slideDown,\n slideUp : slideUp,\n slideToggle : slideToggle,\n toggleHideShow : toggleHideShow,\n toggleSocialShare : toggleSocialShare,\n toggleClass : toggleClass,\n addClass : addClass,\n removeClass : removeClass\n };\n\n function initUIWindowEvents()\n {\n // resize elements on window size change.\n $( window ).on( 'sizeChange contentChanged', function()\n {\n fireEqualHeight();\n } );\n\n $( window ).on( \"scroll resize\", function()\n {\n if ( toTopButtonList.length > 0 )\n {\n if ( $( document ).scrollTop() > 100 )\n {\n doToArrayElements( toTopButtonList, \"addClass\", \"visible\" );\n }\n else\n {\n doToArrayElements( toTopButtonList, \"removeClass\", \"visible\" );\n }\n }\n } );\n }\n\n /**\n * Adds content page slider (owlCarousel)\n *\n * usage:\n *
    \n *
    \n * ...\n *
    \n *
    \n * ...\n *
    \n * ...\n *
    \n *\n * Legacy directive selector: data-plenty=\"contentpageSlider\"\n *\n * @param elem\n */\n function addContentPageSlider( elem )\n {\n $( elem ).owlCarousel( {\n navigation : true,\n navigationText : false,\n slideSpeed : 1000,\n paginationSpeed: 1000,\n singleItem : true,\n autoPlay : 6000,\n stopOnHover : true,\n afterMove : function( current )\n {\n $( current ).find( '[data-plenty-rel=\"lazyload\"]' ).trigger( 'appear' );\n }\n } );\n }\n\n /**\n * Equal Box height\n * Calculates equal box height for chosen elements.\n *\n * Legacy directive selector: data-plenty-equal\n *\n * @param elem\n * @param elementExists - default false\n */\n function equalHeight( elem, mediaSizes, elementExists )\n {\n var $elem = $( elem );\n var maxHeight = 0;\n var $equalTarget = {};\n var $equalTargetList = $elem.find( '[data-plenty-rel=\"equal-target\"]' ).length > 0 ? $elem.find( '[data-plenty-rel=\"equal-target\"]' ) : $elem.children();\n\n // if element wasn't pushed before.\n if ( elementExists !== true )\n {\n equalHeightElementList.push( elem );\n }\n\n for ( var i = $equalTargetList.length; i >= 0; i-- )\n {\n $equalTarget = $( $equalTargetList[i] );\n $equalTarget.css( 'height', '' );\n\n if ( $equalTarget.outerHeight( true ) > maxHeight )\n {\n maxHeight = $equalTarget.outerHeight( true );\n }\n }\n\n if ( !mediaSizes || MediaSizeService.isInterval( mediaSizes ) )\n {\n $equalTargetList.height( maxHeight );\n }\n }\n\n /**\n * Scroll page to top.\n * Just add without events.\n *\n * Legacy directive selector: data-plenty=\"toTop\"\n *\n * @param elem\n */\n function initToTop( elem )\n {\n var $elem = $( elem );\n\n $elem.click( function()\n {\n $( 'html, body' ).animate( {\n scrollTop: 0\n }, 400 );\n return false;\n } );\n\n if ( !!$.inArray( $elem, toTopButtonList ) )\n {\n toTopButtonList.push( $elem );\n }\n }\n\n /**\n * lazy load on ready.\n *\n * Legacy directive selector: img[data-plenty-lazyload]\n *\n * @param elem\n */\n function initLazyload( elem, effect )\n {\n var $elem = $( elem );\n\n $elem.lazyload( {\n effect: effect\n } );\n if ( $elem.is( 'img' ) )\n {\n $elem.on( 'loaded', function()\n {\n $elem.css( 'display', 'inline-block' );\n } );\n }\n }\n\n /**\n * Toggle show and hide animation.\n *\n * Legacy directive selector: data-plenty=\"openCloseToggle\"\n *\n * @param elem\n */\n function toggleHideShow( elem )\n {\n\n console.log( elem );\n\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 200, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n /**\n * Toggle target content on click.\n * Bind to checked-/ unchecked-property of radio buttons\n *\n * Legacy directive selector: data-plenty-slidetoggle\n *\n * @param elem\n */\n function initSlideToggle( elem, checked )\n {\n var $elem = $( elem );\n var $targetElement = $( $elem.attr( 'data-plenty-rel' ) );\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n // is radio button\n var $radioGroupList = $( 'input[type=\"radio\"][name=\"' + ( $elem.attr( 'name' ) ) + '\"]' );\n var visibleOnChecked = !checked || checked == 'checked';\n\n $radioGroupList.change( function()\n {\n var $self = $( this );\n $targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n if ( $self.is( ':checked' ) && $self[0] === $elem[0] && visibleOnChecked == true )\n {\n // checked\n $targetElement.slideDown( 400, function()\n {\n fireEqualHeight();\n } );\n }\n else\n {\n // unchecked (since other radio button has been checked)\n $targetElement.slideUp( 400, function()\n {\n fireEqualHeight();\n } );\n }\n } );\n }\n else\n {\n // is not radio button\n $elem.click( function()\n {\n //$targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n $elem.addClass( 'animating' );\n $targetElement.slideToggle( 400, function()\n {\n $elem.removeClass( 'animating' );\n $elem.toggleClass( 'active' );\n fireEqualHeight();\n } );\n } );\n }\n }\n\n function slideDown( target, duration )\n {\n slideAction( $( target ), duration, 'slideDown' );\n }\n\n function slideUp( target, duration )\n {\n slideAction( $( target ), duration, 'slideUp' );\n }\n\n function slideToggle( target, duration )\n {\n slideAction( $( target ), duration, 'slideToggle' );\n }\n\n function slideAction( $target, duration, callbackString )\n {\n duration = duration || 400;\n $target.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n $target[callbackString]( duration, function()\n {\n fireEqualHeight();\n } );\n }\n\n /**\n * TODO check comment\n * Social Share Activation\n * Activate and load share-buttons manually by clicking a separate button\n * Usage / data-attributes:\n *
    \n * Will be used to activate the service set in\n * data-plenty-social=\"\"\n * Will be replaced with loaded share button\n *
    \n *\n * possible values for data-plenty-social:\n * \"facebook-like\" : Load Facebooks \"Like\"-Button\n * \"facebook-recommend\" : Load Facebooks \"Recommend\"-Button\n * \"twitter\" : Load Twitter Button\n * \"google-plus\" : Load google \"+1\"-Button\n *\n * Additional Tooltips\n * You can extend the parent element with a (bootstrap) tooltip by adding data-toggle=\"tooltip\" and\n * title=\"TOOLTIP CONTENT\" Tooltip will be destroyed after activating a social service\n * (!) Requires bootstrap.js\n *\n * Legacy directive selector: data-plenty-social\n *\n * @param elem\n */\n function toggleSocialShare( elem, socialShareService )\n {\n var $elem = $( elem );\n var $toggle = $elem.find( '[data-plenty-rel=\"social-switch\"]' );\n\n // append container to put / delete service.html\n $elem.append( '
    ' );\n\n // add \"off\" class to switch, if neither \"off\" or \"on\" is set\n // replaced hasClass() with is() benchmark: http://jsperf.com/hasclasstest\n if ( !$toggle.is( 'off, on' ) )\n {\n $toggle.addClass( 'off' );\n }\n\n // toggle switch\n $toggle.on( 'click', function()\n {\n if ( $toggle.hasClass( 'off' ) )\n {\n // TODO remove bootstrap dependency\n if ( $elem.attr( \"data-toggle\" ) == \"tooltip\" )\n {\n $elem.tooltip( 'destroy' )\n }\n $toggle.removeClass( 'off' ).addClass( 'on' );\n // hide dummy button\n $elem.find( '[data-plenty-rel=\"social-placeholder\"]' ).hide();\n // load HTML defined in 'api'\n $elem.find( '.social-container' ).append( SocialShareService.getSocialService( socialShareService ) );\n }\n // do not disable social medias after activation\n } );\n }\n\n /**\n * Toggle Class\n * toggle style-classes on click\n * Usage / data-attribute:\n *
    \n * target : jQuery selector to toggle the class at.\n * class : class(es) to toggle at target element\n * media : only toggle class on given media sizes (optional)\n *\n * (!) using data-plenty-toggle on -elements will prevent redirecting to href=\"\"\n *\n * Legacy directive selector: data-plenty-toggle\n *\n * @param cssClass\n * @param target\n * @param interval\n */\n function toggleClass( cssClass, target, interval )\n {\n var $target = $( target );\n /* FIXME\n * Callisto 3.1 Design adaption:\n * NavigationCategoriesList\n * Line 8\n * BEFORE:\n *
  • \n * AFTER:\n *
  • \n *\n * Line 10\n * BEFORE:\n * \n * AFTER:\n * \n *\n * */\n if ( $target.parents( \".navbar-main\" ).length > 0 )\n {\n var $elem = $target.children( \"span\" );\n pm.directives[\"MobileDropdown\"].slideDropdown( $elem );\n return true;\n }\n\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $target.toggleClass( cssClass );\n return false;\n }\n }\n\n function addClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).addClass( cssClass );\n return false;\n }\n }\n\n function removeClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).removeClass( cssClass );\n return false;\n }\n }\n\n /*\n ##### PRIVATE FUNCTIONS ######\n */\n\n function fireEqualHeight()\n {\n for ( var i = equalHeightElementList.length - 1; i >= 0; i-- )\n {\n equalHeight( equalHeightElementList[i], '', true );\n }\n }\n\n function doToArrayElements( array, func, params )\n {\n for ( var i = array.length - 1; i >= 0; i-- )\n {\n array[i][func]( params );\n }\n }\n\n }, ['MediaSizeService', 'SocialShareService'] );\n}( jQuery, PlentyFramework ));","(function( $, pm )\n{\n pm.directive( 'Validator', function( ValidationService )\n {\n\n return {\n validate: validate\n };\n\n function validate( form, errorClass )\n {\n return ValidationService.validate( form, errorClass );\n }\n\n }, ['ValidationService'] );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Handles requests to ReST API. Provides a {{#crossLink \"APIFactory/handleError:method\"}}default\n * error-handling{{/crossLink}}. Request parameters will be parsed to json internally
    \n * Requires:\n *
      \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class APIFactory\n * @static\n */\n pm.factory( 'APIFactory', function( UI, Modal )\n {\n\n var sessionExpirationTimeout = null;\n $( document ).ready( function()\n {\n renewLoginSession();\n } );\n\n return {\n get : _get,\n post : _post,\n put : _put,\n delete: _delete,\n idle : _idle\n };\n\n function renewLoginSession()\n {\n if ( !pm.getGlobal( 'LoginSession' ) )\n {\n return;\n }\n\n if ( !!sessionExpirationTimeout )\n {\n clearTimeout( sessionExpirationTimeout );\n }\n\n sessionExpirationTimeout = setTimeout( function()\n {\n $( window ).trigger( 'login-expired' );\n\n if ( pm.getGlobal( 'PageDesign' ) === \"Checkout\" )\n {\n Modal.prepare()\n .setTitle( pm.translate( 'Your session has expired.' ) )\n .setContent( pm.translate( 'Please log in again to continue shopping.' ) )\n .setLabelDismiss( null )\n .setLabelConfirm( pm.translate( 'OK' ) )\n .onConfirm( function()\n {\n window.location.assign( '/' );\n } )\n .onDismiss( function()\n {\n window.location.assign( '/' );\n } )\n .show();\n }\n\n }, pm.getGlobal( 'LoginSessionExpiration' ) );\n }\n\n /**\n * Is called by default if a request failed.
    \n * Can be prevented by setting the requests last parameter to false.\n *\n * @function handleError\n * @private\n *\n * @param {object} jqXHR
    jQuery\n * deferred Object\n */\n function handleError( jqXHR )\n {\n try\n {\n var responseText = $.parseJSON( jqXHR.responseText );\n UI.printErrors( responseText.error.error_stack );\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n }\n\n /**\n * Sends a GET request to ReST-API\n *\n * @function get\n *\n * @param {string} url The URL to send the request to\n * @param {object} params The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _get( url, params, ignoreErrors, runInBackground, sync )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'GET',\n data : params,\n dataType: 'json',\n async : !sync,\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a POST request to ReST-API\n *\n * @function post\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _post( url, data, ignoreErrors, runInBackground )\n {\n\n var params = {\n type : 'POST',\n dataType: 'json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n };\n\n if ( !!data && data.isFile )\n {\n params.cache = data.cache;\n params.processData = data.processData;\n params.data = data.data;\n params.contentType = false;\n }\n else\n {\n params.data = JSON.stringify( data );\n params.contentType = 'application/json';\n }\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url, params\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n }\n\n /**\n * Sends a PUT request to ReST-API\n *\n * @function put\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _put( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'PUT',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a DELETE request to ReST-API\n *\n * @function delete\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @returns {object} jQuery\n * deferred Object\n */\n function _delete( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'DELETE',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Get a idle request doing nothing for chaining methods\n * @returns {object} jQuery\n * deferred Object\n */\n function _idle()\n {\n return $.Deferred().resolve();\n }\n\n }, ['UIFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Provide methods for receiving layout containers, layout parameters\n * or category content from API
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    \n * @class CMSFactory\n * @static\n */\n pm.factory( 'CMSFactory', function( API )\n {\n\n return {\n getContainer : getContainer,\n getParams : getParams,\n getCategoryContent: getCategoryContent\n };\n\n /**\n * Prepare the request to receive HTML-Content from CMS\n * @function getContainer\n * @param {string} containerName The Layoutcontainer to receive.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the location in\n * the CMS\n * (e.g. 'Checkout')\n * @example\n * CMSFactory.getContainer( 'CheckoutTotals' ).from( 'Checkout' )\n * .done(function( response ) {\n * // container content\n * var html = response.data[0]\n * });\n */\n function getContainer( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/container_' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n\n }\n\n /**\n * Prepare the request to receive Layout parameters for a template\n * @function getParams\n * @param {string} containerName The Layoutcontainer to receive the parameteres of.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the\n * location in the CMS\n * (e.g. 'ItemView')\n * @example\n * CMSFactory.getParams( 'BasketItemsList' ).from( 'ItemView' )\n * .done(function( response ) {\n * // BasketItems\n * var items = response.data;\n * });\n */\n function getParams( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n }\n\n /**\n * Get the content of a category specified by its ID\n * @function getCategoryContent\n * @param {number} categoryID The ID of the category to get the content from\n * @returns {object} jQuery deferred\n * Object\n */\n function getCategoryContent( categoryID )\n {\n return API.get( '/rest/categoryview/categorycontentbody/?categoryID=' + categoryID );\n }\n\n }, ['APIFactory'] );\n}( PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Holds checkout data for global access and provides methods\n * for reloading content dynamically-
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutFactory\n * @static\n */\n pm.factory( 'CheckoutFactory', function( API, CMS, UI )\n {\n\n // data received from ReST API\n var checkoutData;\n\n // instance wrapped checkout object for global access\n var checkout;\n\n return {\n getCheckout : getCheckout,\n setCheckout : setCheckout,\n loadCheckout : loadCheckout,\n reloadContainer : reloadContainer,\n reloadCatContent : reloadCatContent,\n reloadItemContainer: reloadItemContainer\n };\n\n function Checkout()\n {\n return checkoutData;\n }\n\n /**\n * Returns instance of wrapped checkout object\n * @function getCheckout\n * @returns {Checkout} Instance of checkout object\n */\n function getCheckout( copy )\n {\n if ( !checkout || !checkoutData )\n {\n loadCheckout( true );\n }\n\n if ( !!copy )\n {\n return $.extend( true, {}, checkoutData );\n }\n return checkout;\n }\n\n /**\n * Receive global checkout data from ReST-API\n * @function loadCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function loadCheckout( sync )\n {\n\n return API.get( '/rest/checkout/', null, false, false, sync )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n }\n\n /**\n * Update checkout data on server\n * @function setCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function setCheckout()\n {\n\n return API.put( '/rest/checkout', checkout )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-checkout-template=\"...\"\n * @function reloadContainer\n * @param {string} container Name of the template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadContainer( container )\n {\n\n return CMS.getContainer( \"checkout\" + container ).from( 'checkout' )\n .done( function( response )\n {\n $( '[data-plenty-checkout-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n } );\n } );\n }\n\n /**\n * Get category content from server and replace received HTML\n * in containers marked with data-plenty-checkout-catcontent=\"...\"\n * @function reloadCatContent\n * @param {number} catId ID of the category to load content (description 1) from server\n * @return {object} jQuery deferred\n * Object\n * @deprecated\n */\n function reloadCatContent( catId )\n {\n\n return CMS.getCategoryContent( catId )\n .done( function( response )\n {\n $( '[data-plenty-checkout-catcontent=\"' + catId + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-itemview-template=\"...\"\n * @function reloadItemContainer\n * @param {string} container Name of the (item view) template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadItemContainer( container )\n {\n\n return CMS.getContainer( 'itemview' + container ).from( 'itemview' )\n .done( function( response )\n {\n $( '[data-plenty-itemview-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n }, ['APIFactory', 'CMSFactory', 'UIFactory'] );\n}( PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Provides methods for creating and displaying modal popups.\n * @class ModalFactory\n * @static\n */\n pm.factory( 'ModalFactory', function()\n {\n\n return {\n prepare: prepare,\n isModal: isModal\n };\n\n /**\n * Detect if given html contains a valid modal\n * @function isModal\n * @param {string} html\n * @returns {boolean}\n */\n function isModal( html )\n {\n return PlentyFramework.partials.Modal.isModal( html );\n }\n\n /**\n * Create a new Instance of {{#crossLink \"ModalFactory.Modal\"}}Modal{{/crossLink}}\n * @function prepare\n * @returns {Modal}\n */\n function prepare( selector )\n {\n return new Modal( selector );\n }\n\n /**\n * Holds configuration of a modal and provides methods for displaying and hiding the modal\n * @class Modal\n * @for ModalFactory\n * @returns {Modal}\n * @constructor\n */\n function Modal( selector )\n {\n\n var modal = this;\n modal.selector = selector;\n\n /**\n * The title of the modal\n * @attribute title\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.title = '';\n\n modal.cssClass = '';\n\n /**\n * The content of the modal\n * @attribute content\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.content = '';\n\n /**\n * The content of the dismiss-button\n * @attribute labelDismiss\n * @type {string}\n * @private\n * @default \"Abbrechen\"\n */\n modal.labelDismiss = pm.translate( \"Cancel\" );\n\n /**\n * the label of the confirmation button\n * @attribute labelConfirm\n * @type {string}\n * @private\n * @default \"Bestätigen\"\n */\n modal.labelConfirm = pm.translate( \"Confirm\" );\n\n /**\n * Callback when modal is confirmed by clicking confirmation button.\n * Modal will not be dismissed if callback returns false.\n * @attribute onConfirm\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onConfirm = function()\n {\n };\n\n /**\n * Callback when modal is dismissed by closing the modal\n * @attribute onDismiss\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onDismiss = function()\n {\n };\n\n /**\n * jQuery selector of the container element to display the modal in.\n * @attribute container\n * @type {string}\n * @private\n * @default \"body\"\n */\n modal.container = 'body';\n\n /**\n * Timeout to close the modal automatically. Set <0 to disable.\n * @attribute timeout\n * @type {number}\n * @private\n * @default -1\n */\n modal.timeout = -1;\n\n modal.hide = hide;\n modal.startTimeout = startTimeout;\n modal.stopTimeout = stopTimeout;\n modal.pauseTimeout = pauseTimeout;\n modal.continueTimeout = continueTimeout;\n\n var bsModal;\n var timeout, interval;\n var timeRemaining, timeStart;\n var paused = false;\n\n return {\n setTitle : setTitle,\n setClass : setClass,\n setContent : setContent,\n setContainer : setContainer,\n setLabelConfirm: setLabelConfirm,\n setLabelDismiss: setLabelDismiss,\n onConfirm : onConfirm,\n onDismiss : onDismiss,\n setTimeout : setTimeout,\n show : show,\n hide : hide\n };\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/title:attribute}}title{{/crossLink}} of the modal\n * @function setTitle\n * @param {string} title The title\n * @returns {Modal} Modal object for chaining methods\n */\n function setTitle( title )\n {\n modal.title = title;\n return this;\n }\n\n function setClass( cssClass )\n {\n modal.cssClass = cssClass;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/content:attribute}}content{{/crossLink}} of the modal\n * @function setContent\n * @param {string} content The content\n * @returns {Modal} Modal object for chaining methods\n */\n function setContent( content )\n {\n modal.content = content;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelConfirm:attribute}}label of the confirmation\n * button{{/crossLink}} of the modal\n * @function setLabelConfirm\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelConfirm( label )\n {\n modal.labelConfirm = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelDismiss:attribute}}label if the dismiss\n * button{{/crossLink}} of the modal\n * @function setLabelDismiss\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelDismiss( label )\n {\n modal.labelDismiss = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onConfirm:attribute}}confirmation callback{{/crossLink}} of the\n * modal\n * @function onConfirm\n * @param {function} callback The callback if modal is confirmed\n * @returns {Modal} Modal object for chaining methods\n */\n function onConfirm( callback )\n {\n modal.onConfirm = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onDismiss:attribute}}dismiss callback{{/crossLink}} of the modal\n * @function onDismiss\n * @param {function} callback The callback if modal is dismissed\n * @returns {Modal} Modal object for chaining methods\n */\n function onDismiss( callback )\n {\n modal.onDismiss = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/container:attribute}}container{{/crossLink}} of the modal\n * @function setContainer\n * @param {string} container The jQuery selector of the container to display the modal in\n * @returns {Modal} Modal object for chaining methods\n */\n function setContainer( container )\n {\n modal.container = container;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/timeout:attribute}}timeout{{/crossLink}} of the modal\n * @function setTimeout\n * @param {number} timeout The timeout to close the modal automatically. Set <0 to disable\n * @returns {Modal} Modal object for chaining methods\n */\n function setTimeout( timeout )\n {\n modal.timeout = timeout;\n return this;\n }\n\n /**\n * Inject modal data in default template if not template is given\n * and display the modal inside the configured container.
    \n * Start timer to hide the modal automatically if timeout is set.\n * @function show\n */\n function show()\n {\n if( !!modal.selector )\n {\n bsModal = $( modal.selector );\n }\n else\n {\n if ( isModal( modal.content ) )\n {\n bsModal = PlentyFramework.partials.Modal.getModal( modal.content );\n }\n else\n {\n bsModal = $( PlentyFramework.compileTemplate( 'modal/modal.html', modal ) );\n }\n\n $( modal.container ).append( bsModal );\n\n // append additional scripts executable\n var scripts = $( modal.content ).filter( 'script' );\n if ( scripts.length > 0 )\n {\n scripts.each( function( i, script )\n {\n var element = document.createElement( 'script' );\n element.type = 'text/javascript';\n element.innerHTML = $( script ).text();\n $( modal.container ).append( element );\n } );\n }\n }\n\n // bind callback functions\n PlentyFramework.partials.Modal.init( bsModal, modal );\n bsModal.find( '[data-plenty-modal=\"confirm\"]' ).click( function()\n {\n var close = modal.onConfirm();\n\n if ( typeof close == \"undefined\" )\n {\n close = true;\n }\n\n if ( close )\n {\n hide( true );\n }\n } );\n\n PlentyFramework.partials.Modal.show( bsModal );\n\n if ( modal.timeout > 0 )\n {\n startTimeout();\n }\n\n }\n\n /**\n * Hide the modal.\n * @function hide\n * @param {boolean} confirmed Flag indicating of modal is closed by confirmation button or dismissed\n */\n function hide( confirmed )\n {\n PlentyFramework.partials.Modal.hide( bsModal );\n\n if ( !confirmed )\n {\n modal.onDismiss();\n }\n }\n\n /**\n * Start the configured timeout initially\n * @function startTimeout\n * @private\n */\n function startTimeout()\n {\n timeRemaining = modal.timeout;\n timeStart = (new Date()).getTime();\n\n timeout = window.setTimeout( function()\n {\n window.clearInterval( interval );\n hide();\n }, modal.timeout );\n\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( timeRemaining / 1000 );\n interval = window.setInterval( function()\n {\n if ( !paused )\n {\n var secondsRemaining = timeRemaining - (new Date()).getTime() + timeStart;\n secondsRemaining = Math.round( secondsRemaining / 1000 );\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( secondsRemaining );\n }\n }, 1000 )\n }\n\n /**\n * Pause the timeout (e.g. on hover)\n * @function pauseTimeout\n * @private\n */\n function pauseTimeout()\n {\n paused = true;\n timeRemaining -= (new Date()).getTime() - timeStart;\n window.clearTimeout( timeout );\n }\n\n /**\n * Continue paused timeout\n * @function continueTimeout\n * @private\n */\n function continueTimeout()\n {\n paused = false;\n timeStart = (new Date()).getTime();\n timeout = window.setTimeout( function()\n {\n hide();\n window.clearInterval( interval );\n }, timeRemaining );\n }\n\n /**\n * Stop timeout. Stopped timeouts cannot be continued.\n * @function stopTimeout\n * @private\n */\n function stopTimeout()\n {\n window.clearTimeout( timeout );\n window.clearInterval( interval );\n }\n\n }\n\n } );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Displaying error messages and handling wait screen\n * @class UIFactory\n * @static\n */\n pm.factory( 'UIFactory', function()\n {\n /**\n * Increased/ decreased when showing/ hiding wait screen to avoid stacking\n * multiple instances of overlays.\n * @attribute waitScreenCount\n * @private\n * @type {number}\n * @default 0\n */\n var waitScreenCount = 0;\n var waitScreen;\n var errorPopup = null;\n\n return {\n throwError : throwError,\n printErrors : printErrors,\n showWaitScreen: showWaitScreen,\n hideWaitScreen: hideWaitScreen\n };\n\n /**\n * Display a single error message.\n * @function throwError\n * @param {number} code A code identifying this error\n * @param {string} msg The error message to display\n */\n function throwError( code, msg )\n {\n printErrors( [{code: code, message: msg}] );\n }\n\n /**\n * Wrap error messages in error popup, if popup doesn't already contain this error\n * If popup is already visible, append new errors to popup's inner HTML\n * otherwise create new popup\n * @function printErrors\n * @param {Array} errorMessages A list of errors to display\n */\n function printErrors( errorMessages )\n {\n\n // create error-popup if not exist\n if ( !errorPopup || $( 'body' ).has( errorPopup ).length <= 0 )\n {\n errorPopup = $( pm.compileTemplate( 'error/errorPopup.html' ) );\n $( 'body' ).append( errorPopup );\n pm.partials.Error.init( errorPopup );\n }\n\n $.each( errorMessages, function( key, error )\n {\n // add additional error, if not exist.\n pm.partials.Error.addError( errorPopup, $( pm.compileTemplate( 'error/errorMessage.html', error ) ) );\n } );\n\n pm.partials.Error.show( errorPopup );\n\n hideWaitScreen( true );\n }\n\n /**\n * Show wait screen if not visible and increase\n * {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * @function showWaitScreen\n */\n function showWaitScreen()\n {\n waitScreenCount = waitScreenCount || 0;\n\n // create wait-overlay if not exist\n if ( !waitScreen || $( 'body' ).has( waitScreen ).length <= 0 )\n {\n waitScreen = $( pm.compileTemplate( 'waitscreen/waitscreen.html' ) );\n $( 'body' ).append( waitScreen );\n }\n\n pm.partials.WaitScreen.show( waitScreen );\n\n // increase instance counter to avoid showing multiple overlays\n waitScreenCount++;\n return waitScreenCount;\n }\n\n /**\n * Decrease {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * and hide wait screen if waitScreenCount is 0\n * @function hideWaitScreen\n * @param {boolean} forceClose set true to hide wait screen independent from the value of waitScreenCount.\n */\n function hideWaitScreen( forceClose )\n {\n\n // decrease overlay count\n waitScreenCount--;\n\n // hide if all instances of overlays has been closed\n // or if closing is forced by user\n if ( waitScreenCount <= 0 || !!forceClose )\n {\n waitScreenCount = 0;\n pm.partials.WaitScreen.hide( waitScreen );\n }\n return waitScreenCount;\n }\n\n } );\n}( jQuery, PlentyFramework ));","/**\n * Factories provide static functions and can be injected into\n * {{#crossLinkModule \"Services\"}}services{{/crossLinkModule}}.
    \n * Factories also can inject other factories. Compared to services,\n * factories are not visible in instances of {{#crossLinkModule \"PlentyFramework\"}}PlentyFramework{{/crossLinkModule}}.\n *\n * @module Factories\n * @main Factories\n */","Object.equals = function( a, b )\n{\n if ( a === b )\n {\n return true;\n }\n if ( !(a instanceof Object) || !(b instanceof Object) )\n {\n return false;\n }\n if ( a.constructor !== b.constructor )\n {\n return false;\n }\n\n for ( var key in a )\n {\n if ( !a.hasOwnProperty( key ) )\n {\n continue;\n }\n if ( !b.hasOwnProperty( key ) )\n {\n return false;\n }\n if ( a[key] === b[key] )\n {\n continue;\n }\n if ( typeof( a[key] ) !== \"object\" )\n {\n return false;\n }\n if ( !Object.equals( a[key], b[key] ) )\n {\n return false;\n }\n }\n\n for ( var key in b )\n {\n if ( b.hasOwnProperty( key ) && !a.hasOwnProperty( key ) )\n {\n return false;\n }\n }\n\n return true;\n\n};","PlentyFramework.cssClasses = {\n\n active: \"active\"\n\n};","(function( $, pm )\n{\n\n pm.partials.Error = {\n\n /**\n * Will be called, after the error popup was created and injected in DOM.\n * @param {HTMLElement} popup The injected element of the popup\n */\n init: function( popup )\n {\n $( popup ).find( '.close' ).click( function()\n {\n pm.partials.Error.hideAll();\n } );\n },\n\n /**\n * Will be called for each thrown error. Has to be injected in DOM manually.\n * @param {HTMLElement} popup The error popup element\n * @param {HTMLElement} error The error message element\n */\n addError: function( popup, error )\n {\n var errorCode = $( error ).attr( 'data-plenty-error-code' );\n\n if ( $( popup ).find( '[data-plenty-error-code=\"' + errorCode + '\"]' ).length <= 0 )\n {\n $( popup ).find( '.plentyErrorBoxInner' ).append( error );\n }\n },\n\n /**\n * Will be called, after initialization and injection of all errors\n * @param {HTMLElement} popup The error popup element\n */\n show: function( popup )\n {\n $( popup ).show();\n },\n\n hideAll: function() {\n $( '#CheckoutErrorPane' ).hide();\n $( '#CheckoutErrorPane' ).find( '.plentyErrorBoxInner' ).html( '' );\n }\n\n }\n\n})( jQuery, PlentyFramework );","(function( $, pm )\n{\n\n pm.partials.Modal = {\n\n /**\n * Will be called after a new modal was created and injected into DOM\n * @param {HTMLElement} element The injected modal element\n * @param {Modal} modal The instance of the current modal\n */\n init: function( element, modal )\n {\n element.on( 'hidden.bs.modal', function()\n {\n modal.hide();\n if( !modal.selector )\n {\n //Do not remove static modals\n element.remove();\n }\n } );\n\n if ( modal.timeout > 0 )\n {\n element.on( 'hide.bs.modal', modal.stopTimeout );\n element.find( '.modal-content' ).hover( function()\n {\n modal.pauseTimeout();\n }, function()\n {\n if ( element.is( '.in' ) )\n {\n modal.continueTimeout();\n }\n } );\n }\n },\n\n /**\n * Will be called if a Modal requests to show.\n * @param {HTMLElement} element The injected modal element\n */\n show: function( element )\n {\n element.modal( 'show' );\n },\n\n /**\n * Will be called if a Modal requests to hide.\n * @param {HTMLElement} element The injected modal element\n */\n hide: function( element )\n {\n element.modal( 'hide' );\n },\n\n /**\n * Detect if a given HTML string contains a modal\n * @param {HTMLElement} html the element to search a modal in.\n * @returns {boolean} true if a modal was found\n */\n isModal: function( html )\n {\n return $( html ).filter( '.modal' ).length + $( html ).find( '.modal' ).length > 0;\n },\n\n /**\n * Filter a modal from a given HTML string\n * @param {HTMLElement} html the element to get a modal from.\n * @returns {HTMLElement} the filtered modal element\n */\n getModal: function( html )\n {\n var modal = $( html );\n if ( modal.length > 1 )\n {\n modal = $( html ).filter( '.modal' ) || $( html ).find( '.modal' );\n }\n\n return modal;\n }\n\n };\n\n}( jQuery, PlentyFramework ));","(function( $ )\n{\n\n $( document ).on( 'initPartials', function( e, root )\n {\n\n $( root ).find( '[data-toggle=\"tooltip\"]' ).tooltip( {\n container: 'body'\n } );\n\n } );\n\n})( jQuery );","(function( $, pm )\n{\n\n pm.partials.WaitScreen = {\n\n /**\n * Will be called if the wait screen should be shown\n * @param {HTMLElement} element The wait screen element\n */\n show: function( element )\n {\n element.addClass( 'in' );\n },\n\n /**\n * Will be called if the wait screen should be hidden\n * @param {HTMLElement} element The wait screen element\n */\n hide: function( element )\n {\n element.removeClass( 'in' );\n }\n\n };\n\n})( jQuery, PlentyFramework );","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.service( 'AddressDoctorService', function( API )\n {\n return {\n validateAddress: validateAddress\n };\n\n function validateAddress( addressForms )\n {\n var addressIsValid = true;\n addressForms = addressForms || '[data-plenty-address-doctor]';\n $( addressForms ).filter( '[data-plenty-address-doctor]:visible' ).each( function( i, form )\n {\n var addressDoctor = new AddressDoctor( form );\n var requiredFields = $( form ).attr( 'data-plenty-address-doctor' ).replace( /\\s/g, '' ).split( ',' );\n if ( !addressDoctor.isValid( requiredFields ) )\n {\n addressIsValid = false;\n }\n\n } );\n\n return addressIsValid;\n }\n\n function AddressDoctor( form )\n {\n var $form = $( form );\n var $inputs = {\n Street : $form.find( 'input[name=\"Street\"]' ),\n ZIP : $form.find( 'input[name=\"ZIP\"]' ),\n City : $form.find( 'input[name=\"City\"]' ),\n HouseNo: $form.find( 'input[name=\"HouseNo\"]' )\n };\n var $suggestionContainer = {};\n\n var suggestions;\n var requiredFields;\n\n return {\n isValid: isValid\n };\n\n function isValid( fields )\n {\n\n if ( isPackstation() )\n {\n return true;\n }\n\n suggestions = new AddressList( $form.getFormValues() );\n requiredFields = fields;\n\n refreshView();\n\n return suggestions.getAddresses().length == 1;\n }\n\n function refreshView()\n {\n $( '.suggestion-list' ).remove();\n\n var suggestionListVisible = false;\n for ( var i = 0; i < requiredFields.length; i++ )\n {\n if ( !validateInput( requiredFields[i], suggestionListVisible ) )\n {\n $form.trigger( 'validationFailed' );\n suggestionListVisible = true;\n }\n }\n\n if ( suggestions.houseNoAllowed( $inputs.HouseNo.val() ) || suggestions.getAddresses().length == 1 )\n {\n $inputs.HouseNo.removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs.HouseNo.addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n }\n else\n {\n $inputs.HouseNo.removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs.HouseNo.addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n }\n }\n\n function validateInput( key, suggestionListVisible )\n {\n var valueList = suggestions.getList( key );\n\n if ( !!$suggestionContainer[key] )\n {\n $suggestionContainer[key].remove();\n }\n\n if ( !$inputs[key] )\n {\n return true;\n }\n\n if ( valueList.length == 1 )\n {\n $inputs[key].val( valueList[0] );\n\n $inputs[key].removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs[key].addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n return true;\n }\n else\n {\n $inputs[key].removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs[key].addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n\n if ( !suggestionListVisible )\n {\n buildSuggestionList( $inputs[key], valueList );\n }\n $inputs[key].off( 'focus' );\n $inputs[key].focus();\n return false;\n\n }\n }\n\n function positionSuggestionList( $parent, suggestionKey )\n {\n $suggestionContainer[suggestionKey].css( {\n 'width': $parent.outerWidth( true ),\n 'left' : $parent.position().left,\n 'top' : $parent.position().top + $parent.outerHeight( true )\n } );\n }\n\n function buildSuggestionList( $parent, values )\n {\n var suggestionKey = $parent.attr( 'name' );\n\n // render html content\n $suggestionContainer[suggestionKey] = $( pm.compileTemplate( 'addressSuggestions/addressDoctor.html', {values: values} ) );\n\n positionSuggestionList( $parent, suggestionKey );\n\n $( window ).on( 'sizeChange', function()\n {\n positionSuggestionList( $parent, suggestionKey );\n } );\n\n // bind click event to list elements\n $suggestionContainer[suggestionKey].find( '[data-address-value]' ).each( function( i, elem )\n {\n\n var $elem = $( elem );\n var value = $elem.attr( 'data-address-value' );\n\n $elem.click( function()\n {\n // insert clicked value in input\n $parent.val( value );\n\n // filter addresses and show remaining suggestions\n var filterAddress = {};\n filterAddress[$parent.attr( 'name' )] = value;\n suggestions.filter( filterAddress );\n\n // refresh suggestion lists\n refreshView();\n\n } );\n\n } );\n\n // inject html\n $parent.parent().append( $suggestionContainer[suggestionKey] );\n }\n\n function isPackstation()\n {\n return ( $inputs.Street.val().toUpperCase() == \"PACKSTATION\" || $inputs.Street.val().toUpperCase() == \"POSTFILIALE\" );\n }\n\n }\n\n function AddressList( addressInput )\n {\n var addresses = [];\n\n init();\n\n return {\n getAddresses : getAddresses,\n getList : getList,\n filter : filter,\n houseNoAllowed: houseNoAllowed\n };\n\n function init()\n {\n API.get( '/rest/checkout/addresssuggestionresultslist/', {\n suggestionType: \"addressdoctor\",\n street : addressInput.Street,\n ZIP : addressInput.ZIP,\n city : addressInput.City,\n houseNo : addressInput.HouseNo,\n country : addressInput.CountryID\n }, false, false, true ).done( function( response )\n {\n\n var responseLength = response.data.length;\n\n for ( var i = 0; i < responseLength; i++ )\n {\n var currentResponse = response.data[i];\n\n var address = getAddress( currentResponse )\n if ( !address )\n {\n currentResponse.HouseNo = [currentResponse.HouseNo];\n addresses.push( currentResponse );\n }\n else\n {\n address.HouseNo.push( currentResponse.HouseNo );\n }\n\n }\n\n } );\n }\n\n function getAddress( suggestion )\n {\n var addressCount = addresses.length;\n\n for ( var j = 0; j < addressCount; j++ )\n {\n if ( suggestion.Street == addresses[j].Street && addresses.ZIP == addresses[j].ZIP && suggestion.City == addresses[j].City )\n {\n return addresses[j];\n }\n }\n\n return null;\n\n }\n\n function getAddresses()\n {\n return addresses;\n }\n\n function getList( key )\n {\n var results = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( $.inArray( address[key], results ) < 0 )\n {\n results.push( address[key] );\n }\n }\n\n return results;\n }\n\n function filter( filterAddress )\n {\n var filteredAddresses = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( (!!filterAddress.Street && filterAddress.Street == address.Street)\n || (!!filterAddress.ZIP && filterAddress.ZIP == address.ZIP)\n || (!!filterAddress.City && filterAddress.City == address.City) )\n {\n filteredAddresses.push( address );\n }\n }\n\n addresses = filteredAddresses;\n }\n\n function houseNoAllowed( houseNo )\n {\n houseNo = parseInt( houseNo );\n\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n\n for ( var j = 0; j < address.HouseNo.length; j++ )\n {\n var range = address.HouseNo[j].split( '-' );\n if ( ( range.length == 1 && houseNo == range[0] )\n || range.length == 2 && houseNo >= range[0] && houseNo <= range[1] )\n {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for logging in and out and registering new customers.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    \n * @class AuthenticationService\n * @static\n */\n pm.service( 'AuthenticationService', function( API, Checkout, UI )\n {\n\n return {\n resetPassword : resetPassword,\n customerLogin : customerLogin,\n setInvoiceAddress: setInvoiceAddress,\n registerCustomer : registerCustomer\n };\n\n /**\n * Reading E-Mail from form marked with data-plenty-checkout=\"lostPasswordForm\"\n * and sends request to provide a new password to the entered E-Mail-Address.\n *\n * @function resetPasswort\n * @return {object} jQuery deferred\n * Object\n */\n function resetPassword()\n {\n\n var form = $( '[data-plenty-checkout=\"lostPasswordForm\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n var params = {\n Email: values.Email\n };\n\n return API.post( \"/rest/checkout/lostpassword/\", params )\n .done( function( response )\n {\n if ( response.data.IsMailSend == true )\n {\n $( '[data-plenty-checkout=\"lostPasswordTextContainer\"]' ).hide();\n $( '[data-plenty-checkout=\"lostPasswordSuccessMessage\"]' ).show();\n }\n } );\n\n }\n }\n\n /**\n * Try to login in with credentials read from given <form> - element.\n * On success redirect to forms 'action' attribute.\n *\n * @function customerLogin\n * @param {object} form The jQuery-wrapped form-element to read the credentials from\n * @return {object} jQuery deferred\n * Object\n */\n function customerLogin( form )\n {\n if ( form.validateForm() )\n {\n var values = form.getFormValues();\n\n var params = {\n Email : values.loginMail,\n Password: values.loginPassword\n };\n\n UI.showWaitScreen();\n return API.post( \"/rest/checkout/login/\", params )\n .done( function()\n {\n // successful login -> go to form's target referenced by action-attribute\n window.location.assign( form.attr( 'action' ) );\n\n } );\n }\n }\n\n /**\n * Setting the invoice address of a newly registered customer or a guest.\n *\n * @function setInvoiceAddress\n * @param {object} invoiceAddress containing address-data sent to server\n * @return {object} jQuery deferred\n * Object\n */\n function setInvoiceAddress( invoiceAddress )\n {\n\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n Checkout.getCheckout().CustomerInvoiceAddress = response.data;\n } );\n }\n\n /**\n * Prepare address-data to register new customer. Read the address-data from a <form> marked with\n * data-plenty-checkout-form=\"customerRegistration\"
    \n * On success, redirect to forms target referenced by action-attribute\n *\n * @function registerCustomer\n * @return {object} jQuery deferred\n * Object\n */\n function registerCustomer()\n {\n var form = $( '[data-plenty-checkout-form=\"customerRegistration\"]' );\n\n if ( form.validateForm() && pm.getInstance().AddressDoctorService.validateAddress() )\n {\n var values = form.getFormValues();\n values.LoginType = 2;\n\n if ( values.checkout\n && values.checkout.customerInvoiceAddress\n && values.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = values.checkout.customerInvoiceAddress.CustomerProperty;\n values.CustomerPropertiesList = values.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n values.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n return setInvoiceAddress( values )\n .done( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } );\n }\n }\n }, ['APIFactory', 'CheckoutFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for adding, editing or removing basket items and coupon codes
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class BasketService\n * @static\n */\n pm.service( 'BasketService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n addItem : addBasketItem,\n removeItem : removeBasketItem,\n getItem : getBasketItem,\n setItemQuantity : setItemQuantity,\n editItemAttributes: editItemAttributes,\n editOrderParams : editOrderParams,\n addCoupon : addCoupon,\n removeCoupon : removeCoupon\n };\n\n /**\n * Add item to basket. Will fail and show a popup if item has order params\n * @function addBasketItem\n * @param {Array} article Array containing the item to add\n * @param {boolean} [isUpdate=false] Indicating if item's OrderParams are updated\n * @return {object} jQuery deferred\n * Object\n */\n function addBasketItem( article )\n {\n\n if ( !!article )\n {\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/',\n {\n itemID : article[0].BasketItemItemID,\n quantity: article[0].BasketItemQuantity\n }, false, true ).done( function( resp )\n {\n // checking for order params!\n if ( resp.data[0].indexOf( \"form-group\" ) > 0 )\n {\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Select order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n addArticle( saveOrderParams( article ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n }\n else\n {\n addArticle( article );\n }\n } );\n }\n }\n\n /**\n * Read OrderParams from <form> marked with data-plenty-checkout-form=\"OrderParamsForm\" and inject\n * read values in 'addBasketList'. Update item by calling addBasketItem() again\n * @function saveOrderParams\n * @private\n * @param {Array} articleWithParams Containing the current item to add. Read OrderParams will be injected\n */\n function saveOrderParams( articleWithParams )\n {\n //TODO use $(\"[data-plenty-checkout-form='OrderParamsForm']\").serializeArray() to get order params\n var orderParamsForm = $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' );\n var $self = {};\n var attrType = \"\";\n var match;\n\n //Groups\n orderParamsForm.find( '[name^=\"ParamGroup\"]' ).each( function()\n {\n match = this.name.match( /^ParamGroup\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], $( this ).val(), $( this ).val() );\n } );\n\n //Values\n orderParamsForm.find( '[name^=\"ParamValue\"]' ).each( function()\n {\n $self = $( this );\n attrType = $self.attr( 'type' );\n\n if ( ((attrType == 'checkbox' && $self.is( ':checked' )) ||\n (attrType == 'radio' && $self.is( ':checked' )) ||\n (attrType != 'radio' && attrType != 'checkbox')) && attrType != 'file' && attrType != 'hidden' )\n {\n\n var match = $self[0].name.match( /^ParamValue\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], $self.val() );\n\n }\n else if ( attrType == 'file' )\n {\n if ( $self[0].files && $self[0].files.length > 0 )\n {\n articleWithParams = orderParamFileUpload( $self, articleWithParams );\n }\n else\n {\n var match = $self[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n var paramValue = $( 'input[type=\"hidden\"][name=\"ParamValue[' + match[1] + '][' + match[2] + ']\"]' ).val();\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], paramValue );\n }\n }\n } );\n\n return articleWithParams;\n }\n\n function addArticle( article )\n {\n API.post( '/rest/checkout/basketitemslist/', article, true )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n // Show confirmation popup\n CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', {ArticleID: article[0].BasketItemItemID} ).from( 'ItemView' )\n .done( function( response )\n {\n var timeout = pm.getGlobal( 'TimeoutItemToBasketOverlay', 5000 );\n var modal = Modal.prepare().setContent( response.data[0] );\n\n if ( timeout > 0 )\n {\n modal.setTimeout( timeout );\n }\n\n modal.show();\n } );\n } );\n } ).fail( function( jqXHR )\n {\n // some other error occured\n UI.printErrors( JSON.parse( jqXHR.responseText ).error.error_stack );\n } );\n }\n\n function updateArticle( article )\n {\n API.put( '/rest/checkout/basketitemslist/', article )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n } );\n } )\n }\n\n function orderParamFileUpload( $input, articleWithParams )\n {\n var key = $input[0].id;\n var orderParamUploadFiles = {};\n var orderParamFileIdStack = [];\n var formData;\n var fileData;\n var params = {\n type : 'POST',\n data : {},\n isFile : true,\n cache : false,\n dataType : 'json',\n processData: false,\n contentType: false\n };\n\n orderParamUploadFiles[key] = $input[0].files;\n\n // if input not pushed before.\n if ( orderParamFileIdStack.indexOf( key ) == -1 )\n {\n orderParamFileIdStack.push( key );\n }\n\n for ( var i = 0, length = orderParamFileIdStack.length; i < length; ++i )\n {\n formData = new FormData();\n fileData = orderParamUploadFiles[orderParamFileIdStack[i]];\n formData.append( \"0\", fileData[0], fileData[0].name );\n\n params.data = formData;\n\n API.post( \"/rest/checkout/orderparamfile/\", params );\n }\n\n var match = $input[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n\n return addOrderParamValue( articleWithParams, match[1], match[2], orderParamUploadFiles[key][0]['name'] );\n }\n\n /**\n * Inject an OrderParam.\n * @function addOrderParamValue\n * @private\n * @param {Array} basketList The target to inject the value in.\n * @param {number} position Position where to inject the value\n * @param {number} paramId The ID of the OrderParam to inject\n * @param {string|number} paramValue the value of the OrderParam to inject\n * @returns {Array} Containing the item and the injected OrderParam\n */\n function addOrderParamValue( basketList, position, paramId, paramValue )\n {\n if ( position > 0 && basketList[position] == undefined )\n {\n basketList[position] = $.extend( true, {}, basketList[0] );\n basketList[position].BasketItemOrderParamsList = [];\n }\n\n if ( basketList[position] != undefined )\n {\n basketList[position].BasketItemQuantity = 1;\n if ( basketList[position].BasketItemOrderParamsList == undefined )\n {\n basketList[position].BasketItemOrderParamsList = [];\n }\n if ( paramValue )\n {\n basketList[position].BasketItemOrderParamsList.push( {\n BasketItemOrderParamID : paramId,\n BasketItemOrderParamValue: paramValue\n } );\n }\n }\n\n return basketList;\n }\n\n function editItemAttributes( BasketItemID )\n {\n var modal = $( '[data-plenty-basket-item=\"' + BasketItemID + '\"]' );\n modal.modal( 'show' );\n modal.find( '[data-plenty-modal=\"confirm\"]' ).on( 'click', function()\n {\n var basketItem = getBasketItem( BasketItemID );\n var attributesList = [];\n\n // check for select or list of images\n modal.find( 'select, .PlentyFormContainer.AttrImage > input[type=\"hidden\"]' ).each( function( i, attributeSelect )\n {\n var match = attributeSelect.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( attributeSelect ).val()\n } );\n }\n\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItem.BasketItemAttributesList = attributesList;\n }\n //update basketItem and refresh previewLists\n updateArticle( [basketItem] );\n\n } );\n }\n\n function editOrderParams( BasketItemID )\n {\n\n var basketItem = getBasketItem( BasketItemID );\n // FIX: unset old order params\n\n basketItem.BasketItemOrderParamsList = [];\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/', {\n itemID : basketItem.BasketItemItemID,\n quantity : basketItem.BasketItemQuantity,\n basketItemID: BasketItemID\n } ).done( function( resp )\n {\n // checking for order params!\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Edit order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n updateArticle( saveOrderParams( [basketItem] ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n } );\n }\n\n function getBasketItem( BasketItemID )\n {\n var basketItems = Checkout.getCheckout().BasketItemsList;\n for ( var i = 0; i < basketItems.length; i++ )\n {\n if ( basketItems[i].BasketItemID == BasketItemID )\n {\n return basketItems[i];\n }\n }\n\n return null;\n }\n\n /**\n * Remove item from basket. Will show a confirmation popup at first.\n * @function removeBasketItem\n * @param {number} BasketItemID The ID of the basket item to remove\n * @param {boolean} [forceDelete=false] Set true to remove the basket item without showing a confirmation popup\n * @return Promise\n */\n function removeBasketItem( BasketItemID, forceDelete )\n {\n\n var deferred = $.Deferred();\n\n // get item name\n var itemName = getBasketItem( BasketItemID ).BasketItemNameMap[1];\n\n // calling the delete request\n function doDelete()\n {\n API.delete( '/rest/checkout/basketitemslist/?basketItemIdsList[0]=' + BasketItemID )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n //$( '[data-basket-item-id=\"' + BasketItemID + '\"]' ).remove();\n\n if ( !Checkout.getCheckout().BasketItemsList || Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n }\n else\n {\n // FALLBACK if design not support selector\n // [data-plenty-checkout-template=\"BasketItemsList\"]\n if ( $( '[data-plenty-checkout-template=\"BasketItemsList\"]' ).length >= 0 )\n {\n API.get( \"/rest/checkout/container_checkoutbasketitemslist/\" ).done( function( response )\n {\n var $oldBasketList = $( '[data-basket-item-id]' ).parents( \"ul\" );\n var $basketListContainer = $oldBasketList.parents( \".panel-body\" );\n $oldBasketList.fadeOut( function()\n {\n $( this ).siblings( \":not('[data-plenty-checkout-template]')\" ).remove();\n $( this ).remove();\n $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn(function() {\n pm.getInstance().bindDirectives( $basketListContainer );\n });\n } );\n } );\n }\n else\n {\n Checkout.reloadContainer( 'BasketItemsList' );\n }\n Checkout.reloadContainer( 'Totals' );\n }\n\n refreshBasketPreview();\n\n deferred.resolve();\n } );\n } );\n }\n\n if ( !forceDelete )\n {\n // show confirmation popup\n Modal.prepare()\n .setTitle( pm.translate( 'Please confirm' ) )\n .setContent( '

    ' + pm.translate( \"Do you really want to remove \\\"{{item}}\\\" from your basket?\", {item: itemName} ) + '

    ' )\n .onDismiss( function()\n {\n //$('[data-basket-item-id=\"' + BasketItemID +\n // '\"]').find('[data-plenty=\"quantityInput\"]').val(originalItemQuantity);\n deferred.reject();\n } )\n .onConfirm( function()\n {\n doDelete();\n } )\n .setLabelConfirm( pm.translate( \"Delete\" ) )\n .show();\n }\n else\n {\n doDelete();\n }\n\n return deferred;\n }\n\n /**\n * Set a new quantity for the given BasketItem. If quantity is set to 0,\n * remove the item.\n * @function setItemQuantity\n * @param {number} BasketItemID The ID of the basket item to change the quantity of\n * @param {number} BasketItemQuantity The new quantity to set or 0 to remove the item\n */\n function setItemQuantity( BasketItemID, BasketItemQuantity )\n {\n // delete item if quantity is 0\n if ( BasketItemQuantity <= 0 )\n {\n return removeBasketItem( BasketItemID );\n }\n\n var deferred = $.Deferred();\n var params = Checkout.getCheckout().BasketItemsList;\n var basketItem;\n var basketItemIndex;\n\n for ( var i = 0; i < params.length; i++ )\n {\n if ( params[i].BasketItemID == BasketItemID )\n {\n basketItemIndex = i;\n basketItem = params[i];\n break;\n\n }\n }\n\n if ( !!basketItem && basketItem.BasketItemQuantity != BasketItemQuantity )\n {\n params[basketItemIndex].BasketItemQuantity = parseInt( BasketItemQuantity );\n\n API.post( \"/rest/checkout/basketitemslist/\", params )\n .done( function()\n {\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n refreshBasketPreview();\n deferred.resolve();\n } );\n } );\n }\n\n return deferred;\n }\n\n /**\n * Reload BasketPreview-Template and update basket totals\n * @function refreshBasketPreview\n * @private\n */\n function refreshBasketPreview()\n {\n\n Checkout.reloadItemContainer( 'BasketPreviewList' )\n .done( function()\n {\n\n $( '[data-plenty-basket-empty]' ).each( function( i, elem )\n {\n var toggleClass = $( elem ).attr( 'data-plenty-basket-empty' );\n if ( Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n $( elem ).addClass( toggleClass );\n }\n else\n {\n $( elem ).removeClass( toggleClass );\n }\n } );\n\n } );\n\n //update quantity\n var itemQuantityTotal = 0;\n $.each( Checkout.getCheckout().BasketItemsList, function( i, basketItem )\n {\n itemQuantityTotal += basketItem.BasketItemQuantity;\n } );\n\n $( '[data-plenty-basket-preview=\"itemQuantityTotal\"]' ).text( itemQuantityTotal );\n $( '[data-plenty-basket-preview=\"totalsItemSum\"]' ).text( Checkout.getCheckout().Totals.TotalsItemSum );\n }\n\n /**\n * Read the coupon code from an <input> element marked with data-plenty-checkout-form=\"couponCode\"\n * and try to add this coupon.\n * @function addCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function addCoupon()\n {\n var params = {\n CouponActiveCouponCode: $( '[data-plenty-checkout-form=\"couponCode\"]' ).val()\n };\n\n return API.post( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n\n updateContainer();\n } );\n } );\n }\n\n /**\n * Remove the currently added coupon\n * @function removeCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function removeCoupon()\n {\n var params = {\n CouponActiveCouponCode: Checkout.getCheckout().Coupon.CouponActiveCouponCode\n };\n\n return API.delete( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n delete Checkout.getCheckout().Coupon;\n\n updateContainer();\n } );\n } );\n }\n\n // update container\n function updateContainer()\n {\n Checkout.reloadContainer( 'Coupon' );\n // reload totals, if we are at basket\n if ( $( '[data-plenty-checkout-template=\"Totals\"]' ).length > 0 )\n {\n Checkout.reloadContainer( 'Totals' );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for checkout process like setting shipping & payment information and placing the order.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutService\n * @static\n */\n pm.service( 'CheckoutService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n init : init,\n setCustomerSignAndInfo: setCustomerSignAndInfo,\n registerGuest : registerGuest,\n setShippingProfile : setShippingProfile,\n saveShippingAddress : saveShippingAddress,\n loadAddressSuggestion : loadAddressSuggestion,\n preparePayment : preparePayment,\n setMethodOfPayment : setMethodOfPayment,\n confirmAtrigaPaymax : confirmAtrigaPaymax,\n editBankDetails : editBankDetails,\n editCreditCard : editCreditCard,\n placeOrder : placeOrder\n };\n\n /**\n * Load checkout data initially on page load\n * @function init\n */\n function init()\n {\n Checkout.loadCheckout( true );\n }\n\n /**\n * Read customer sign and order information text from <form> marked with\n * data-plenty-checkout-form=\"details\" and update checkout.\n * @function setCustomerSignAndInfo\n * @return {object} jQuery deferred\n * Object\n */\n function setCustomerSignAndInfo()\n {\n var form = $( '[data-plenty-checkout-form=\"details\"]' );\n var values = form.getFormValues();\n\n // initialize CustomerSign & InfoText to avoid updating empty values\n if ( !Checkout.getCheckout().CheckoutCustomerSign )\n {\n Checkout.getCheckout().CheckoutCustomerSign = \"\";\n }\n if ( !Checkout.getCheckout().CheckoutOrderInfoText )\n {\n Checkout.getCheckout().CheckoutOrderInfoText = \"\";\n }\n\n if ( ( Checkout.getCheckout().CheckoutCustomerSign !== values.CustomerSign && $( form ).find( '[name=\"CustomerSign\"]' ).length > 0 )\n || ( Checkout.getCheckout().CheckoutOrderInfoText !== values.OrderInfoText && $( form ).find( '[name=\"OrderInfoText\"]' ).length > 0 ) )\n {\n\n Checkout.getCheckout().CheckoutCustomerSign = values.CustomerSign;\n Checkout.getCheckout().CheckoutOrderInfoText = values.OrderInfoText;\n\n return Checkout.setCheckout();\n\n }\n else\n {\n // No changes detected -> Do nothing\n return API.idle();\n }\n }\n\n /**\n * Read address data from <form> marked with data-plenty-checkout-form=\"shippingAddress\".\n * Create new shipping address or update the shipping address ID.\n * @function saveShippingAddress\n * @param {boolean} [validateForm = false] validate form before processing requests\n * @return {object} jQuery deferred\n * Object\n */\n function saveShippingAddress( validateForm )\n {\n var form = $( '[data-plenty-checkout-form=\"shippingAddress\"]' );\n\n if ( !validateForm && !form.validateForm() )\n {\n return false;\n }\n\n if ( !validateForm && !pm.getInstance().AddressDoctorService.validateAddress( form ) )\n {\n return false;\n }\n\n var values = form.getFormValues();\n var shippingAddressID = $( '[name=\"shippingAddressID\"]:checked' ).val();\n\n // TODO: move bootstrap specific function\n $( '#shippingAdressSelect' ).modal( 'hide' );\n //Modal.prepare( '#shippingAdressSelect' ).hide();\n\n if ( shippingAddressID < 0 )\n {\n // save separate\n var shippingAddress = values;\n\n if ( !addressesAreEqual( shippingAddress, Checkout.getCheckout().CustomerShippingAddress ) )\n {\n if ( shippingAddress.Street == \"PACKSTATION\" )\n {\n shippingAddress.IsPackstation = 1;\n shippingAddress.PackstationNo = shippingAddress.HouseNo;\n }\n else if ( shippingAddress.Street == \"POSTFILIALE\" )\n {\n shippingAddress.IsPostfiliale = 1;\n shippingAddress.PostfilialNo = shippingAddress.HouseNo;\n }\n\n // new shipping address\n return API.post( \"/rest/checkout/customershippingaddress/\", shippingAddress )\n .done( function( response )\n {\n\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = response.data.ID;\n Checkout.getCheckout().CheckoutShippingCountryID = response.data.CountryID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n } );\n } );\n }\n else\n {\n // no changes detected\n return API.idle();\n }\n\n }\n else\n {\n if ( shippingAddressID != Checkout.getCheckout().CheckoutCustomerShippingAddressID )\n {\n // change shipping address id\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = shippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n } );\n }\n else\n {\n return API.idle();\n }\n }\n }\n\n /**\n * Prepare address-data to register a guest. Reads the address-data from a <form> marked with\n * data-plenty-checkout-form=\"guestRegistration\"\n * @function registerGuest\n * @return {object} jQuery deferred\n * Object\n */\n function registerGuest()\n {\n var form = $( '[data-plenty-checkout-form=\"guestRegistration\"]' );\n\n var invoiceAddress = form.getFormValues();\n invoiceAddress.LoginType = 1;\n\n if ( invoiceAddress.checkout\n && invoiceAddress.checkout.customerInvoiceAddress\n && invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty;\n invoiceAddress.CustomerPropertiesList = invoiceAddress.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n invoiceAddress.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n if ( !addressesAreEqual( invoiceAddress, Checkout.getCheckout().CustomerInvoiceAddress ) )\n {\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n saveShippingAddress().done( Checkout.loadCheckout );\n } );\n }\n else\n {\n return saveShippingAddress();\n }\n }\n\n /**\n * Check if values of addresses are equal\n * @function addressesAreEqual\n * @private\n * @param {object} address1\n * @param {object} address2\n * @returns {boolean}\n */\n function addressesAreEqual( address1, address2 )\n {\n for ( var key in address1 )\n {\n if ( address1[key] + '' !== address2[key] + '' && key !== 'EmailRepeat' )\n {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Set the shipping profile used for this order and update checkout. Selected shipping profile will be\n * read from <form> marked with data-plenty-checkout-form=\"shippingProfileSelect\"\n * @function setShippingProfile\n * @return {object} jQuery deferred\n * Object\n */\n function setShippingProfile()\n {\n\n var values = $( '[data-plenty-checkout-form=\"shippingProfileSelect\"]' ).getFormValues();\n\n Checkout.getCheckout().CheckoutShippingProfileID = values.ShippingProfileID;\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n\n }\n\n /**\n * Prepare method of payment to check if external checkout is used or addition content should be displayed\n * @function preparePayment\n * @return {object} jQuery deferred\n * Object\n */\n function preparePayment()\n {\n var paymentID = Checkout.getCheckout().CheckoutMethodOfPaymentID;\n var paymentData = $( 'input[type=\"radio\"][name=\"MethodOfPaymentID\"][value=\"' + paymentID + '\"]' ).parent().getFormValues();\n return API.post( \"/rest/checkout/preparepayment/\", paymentData, true )\n .done( function( response )\n {\n if ( response.data.CheckoutMethodOfPaymentRedirectURL != '' )\n {\n\n document.location.assign( response.data.CheckoutMethodOfPaymentRedirectURL );\n\n }\n else if ( !!response.data.CheckoutMethodOfPaymentAdditionalContent )\n {\n\n var isBankDetails = $( response.data.CheckoutMethodOfPaymentAdditionalContent ).find( '[data-plenty-checkout-form=\"bankDetails\"]' ).length > 0;\n Modal.prepare()\n .setContent( response.data.CheckoutMethodOfPaymentAdditionalContent )\n .onConfirm( function()\n {\n if ( isBankDetails )\n {\n return saveBankDetails();\n }\n else\n {\n return saveCreditCard();\n }\n } )\n .show();\n }\n } )\n .fail( function( jqXHR )\n {\n try\n {\n var response = $.parseJSON( jqXHR.responseText );\n\n var errorStack = [];\n for ( var i = 0; i < response.error.error_stack.length; i++ )\n {\n if ( response.error.error_stack[i].code == 651 )\n {\n // notify atriga validation errors\n Checkout.reloadContainer( 'MethodsOfPaymentList' ).done(function() {\n $(document).trigger('plenty.AtrigaValidationFailed');\n });\n }\n else\n {\n errorStack.push( response.error.error_stack[i] );\n }\n }\n\n // display remaining errors\n if( errorStack.length > 0 )\n {\n UI.printErrors(errorStack);\n }\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n } );\n\n }\n\n /**\n * Set the method of payment used for this order.\n * @function setMethodOfPayment\n * @param {number|undefined} paymentID ID of the method of payment to use. Read from <form> marked with\n * data-plenty-checkout-form=\"methodOfPayment\" if unset.\n * @return {object} jQuery deferred\n * Object\n */\n function setMethodOfPayment( paymentID )\n {\n /*\n var methodsOfPaymentList = Checkout.getCheckout().MethodsOfPaymentList;\n var methodOfPayment;\n for( var i = 0; i < methodsOfPaymentList.length; i++ )\n {\n if( methodsOfPaymentList[i].MethodOfPaymentID == paymentID )\n {\n methodOfPayment = methodsOfPaymentList[i];\n break;\n }\n }\n */\n\n if( !paymentID )\n {\n // FIX for older callisto layouts (< 3.3): get payment id from input field\n paymentID = $('input[name=\"MethodOfPaymentID\"]:checked').val();\n }\n\n Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID;\n\n if ( !pm.getGlobal( 'Checkout.AtrigaRequireUserConfirmation' ) )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = true;\n }\n\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'ShippingProfilesList' );\n } );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxChecked )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = !!atrigaPaymaxChecked;\n return API.put( '/rest/checkout', {\n CheckoutAtrigapaymaxChecked: !!atrigaPaymaxChecked\n } );\n //return Checkout.setCheckout();\n }\n\n /**\n * Display the popup to enter or edit customers bank details\n * @function editBankDetails\n */\n function editBankDetails()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationBankDetails' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveBankDetails();\n } )\n .show();\n } );\n\n }\n\n /**\n * Read entered bank details from data-plenty-checkout-form=\"bankDetails\" and update checkout.\n * @function saveBankDetails\n * @private\n * @return {boolean} the result of form validation\n */\n function saveBankDetails()\n {\n var form = $( '[data-plenty-checkout-form=\"bankDetails\"]' );\n\n if ( form.validateForm() )\n {\n var values = form.getFormValues().checkout.customerBankDetails;\n\n var bankDetails = {\n CustomerBankName : values.bankName,\n CustomerBLZ : values.blz,\n CustomerAccountNumber: values.accountNo,\n CustomerAccountOwner : values.accountOwner,\n CustomerIBAN : values.iban,\n CustomerBIC : values.bic\n };\n\n API.post( \"/rest/checkout/paymentinformationbankdetails/\", bankDetails )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n setMethodOfPayment( 3 );\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing credit card form\n * @function editCreditCard\n */\n function editCreditCard()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationCreditCard' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveCreditCard();\n } )\n .show();\n } );\n }\n\n /**\n * Read values from <form> marked with data-plenty-checkout-form=\"creditCard\" and update checkout.\n * @function saveCreditCard\n * @private\n * @return {boolean} the result of form validation\n */\n function saveCreditCard()\n {\n var form = $( '[data-plenty-checkout-form=\"creditCard\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues().checkout.paymentInformationCC;\n\n var creditCard = {\n Owner : values.owner,\n Cvv2 : values.cvv2,\n Number : values.number,\n Year : values.year,\n Month : values.month,\n Provider: values.provider\n };\n\n API.post( '/rest/checkout/paymentinformationcreditcard/', creditCard )\n .done( function()\n {\n Checkout.loadCheckout();\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing address suggestions\n * @param {string} type\n */\n function loadAddressSuggestion( type )\n {\n\n //check login type\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n var values = $( '[data-plenty-checkout-form=\"shippingAddress\"]' ).getFormValues();\n }\n else\n {\n var values = $( '[data-plenty-checkout-form=\"guestRegistration\"]' ).getFormValues();\n }\n\n var params = {\n street : values.Street,\n houseNo : values.HouseNo,\n ZIP : values.ZIP,\n city : values.City,\n postnummer : values.Postnummer,\n suggestionType: 'postfinder'\n };\n\n CMS.getContainer( 'CheckoutAddressSuggestionResultsList', params ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .show();\n } );\n }\n\n /**\n * Place the order prepared before and finish the checkout process.
    \n * Validate required checkboxes in data-plenty-checkout-form=\"placeOrder\"\n * @function placeOrder\n * @return {object} jQuery deferred\n * Object\n */\n function placeOrder()\n {\n var form = $( '[data-plenty-checkout-form=\"placeOrder\"]' );\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n // if not shown in layout set default 1 for mandatory fields\n var params = {\n TermsAndConditionsCheck : values.termsAndConditionsCheck || 0,\n WithdrawalCheck : values.withdrawalCheck || 0,\n PrivacyPolicyCheck : values.privacyPolicyCheck || 0,\n AgeRestrictionCheck : values.ageRestrictionCheck || 0,\n NewsletterCheck : values.newsletterCheck || 0,\n KlarnaTermsAndConditionsCheck: values.klarnaTermsAndConditionsCheck || 0,\n PayoneDirectDebitMandateCheck: values.payoneDirectDebitMandateCheck || 0,\n PayoneInvoiceCheck : values.payoneInvoiceCheck || 0\n };\n\n return API.post( \"/rest/checkout/placeorder/\", params )\n .done( function( response )\n {\n if ( response.data.MethodOfPaymentRedirectURL != '' )\n {\n\n window.location.assign( response.data.MethodOfPaymentRedirectURL );\n\n }\n else if ( response.data.MethodOfPaymentAdditionalContent != '' )\n {\n\n Modal.prepare()\n .setContent( response.data.MethodOfPaymentAdditionalContent )\n .setLabelDismiss( '' )\n .onDismiss( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).onConfirm( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).show();\n\n }\n else\n {\n\n window.location.assign( form.attr( 'action' ) );\n\n }\n } );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n pm.service( 'FeedbackService', function( API )\n {\n\n return {\n getFeedbacks : getFeedbacks,\n addFeedback : addFeedback,\n ArticleTypes : articleTypes(),\n FeedbackTypes: feedbackTypes()\n };\n\n /*\n FeedbackService\n .getFeedbacks().between('2014-12-03', '2015-07-01')\n .for( FeedbackService.ArticleTypes.ITEM, 2732, FeedbackService.FeedbackTypes.COMMENTS_ONLY );\n */\n function getFeedbacks()\n {\n var feedbackInterval = {\n dateStart: null,\n dateEnd : null\n };\n\n return {\n between: setFeedbackInterval,\n for : listFeedbacks\n };\n\n function setFeedbackInterval( start, end )\n {\n feedbackInterval.dateStart = start;\n feedbackInterval.dateEnd = end;\n return this;\n }\n\n function listFeedbacks( articleType, referenceId, feedbackType )\n {\n\n var params = {\n ReferenceId : referenceId,\n FromDate : feedbackInterval.dateStart,\n ToDate : feedbackInterval.dateEnd,\n FeedbackType: feedbackType || feedbackTypes().COMMENTS_AND_RATINGS\n };\n return API.get( '/rest/feedback/' + articleType + '/', params );\n\n }\n }\n\n /*\n FeedbackService\n .addFeedback()\n .withRating( 5 )\n .withComment( 'Hallo' )\n .withAuthor( 'Felix', 'felix.dausch@plentymarkets.com', 123456 )\n .to( FeedbackService.ArticleTypes.ITEM, 2732 );\n */\n function addFeedback()\n {\n\n var params = {\n Rating : 1.0,\n Text : '',\n Author : '',\n Email : '',\n CustomerId: 0\n };\n\n return {\n withRating : withRating,\n withComment: withComment,\n withAuthor : withAuthor,\n to : sendFeedback\n };\n\n function withRating( rating )\n {\n params.Rating = rating;\n return this;\n }\n\n function withComment( comment )\n {\n params.Text = comment;\n return this;\n }\n\n function withAuthor( author, mail, customerID )\n {\n params.Author = author;\n if ( !!mail )\n {\n params.Email = mail;\n }\n if ( !!customerID )\n {\n params.CustomerId = customerID;\n }\n return this;\n }\n\n function sendFeedback( articleType, referenceId )\n {\n return API.post( '/rest/feedback/' + articleType + '/', params );\n\n }\n\n }\n\n function feedbackTypes()\n {\n return {\n COMMENTS_ONLY : 'comments_only',\n RATINGS_ONLY : 'ratings_only',\n COMMENTS_AND_RATINGS: 'comments_with_ratings'\n }\n }\n\n function articleTypes()\n {\n return {\n ITEM : 'item',\n CATEGORY: 'category',\n BLOG : 'blog'\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Listens to window's size and trigger 'sizeChange' event if the Bootstrap interval changes.\n * @class MediaSizeService\n * @static\n * @example\n * $(window).on('sizeChange', function(newValue, oldValue) {\n * console.log('The interval changed from ' + oldValue + ' to ' + newValue.');\n * });\n */\n pm.service( 'MediaSizeService', function()\n {\n\n var bsInterval;\n\n // recalculation of the current interval on window resize\n $( window ).resize( calculateMediaSize );\n\n // initially calculation of the interval\n $( document ).ready( calculateMediaSize );\n\n return {\n interval : getInterval,\n isInterval: isInterval\n };\n\n /**\n * Get the currently used Bootstrap interval\n * @function getInterval\n * @return {\"xs\"|\"sm\"|\"md\"|\"lg\"}\n */\n function getInterval()\n {\n if ( !!bsInterval )\n {\n calculateMediaSize();\n }\n\n return bsInterval;\n }\n\n /**\n * Calculate the currently used Bootstrap interval\n * @function calculateMediaSize\n * @private\n */\n function calculateMediaSize()\n {\n var size;\n if ( !!window.matchMedia )\n { // FIX IE support\n if ( window.matchMedia( '(min-width:1200px)' ).matches )\n {\n size = 'lg';\n }\n else if ( window.matchMedia( '(min-width:992px)' ).matches )\n {\n size = 'md';\n }\n else if ( window.matchMedia( '(min-width:768px)' ).matches )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n else\n {\n if ( $( window ).width() >= 1200 )\n {\n size = 'lg';\n }\n else if ( $( window ).width() >= 992 )\n {\n size = 'md';\n }\n else if ( $( window ).width() >= 768 )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n if ( size != bsInterval || size === 'xs' )\n {\n var oldValue = bsInterval;\n bsInterval = size;\n $( window ).trigger( 'sizeChange', [bsInterval, oldValue] );\n }\n }\n\n function isInterval( interval )\n {\n var intervalList = interval.replace( /\\s/g, '' ).split( ',' );\n for ( var i = 0; i < intervalList.length; i++ )\n {\n if ( intervalList[i] == bsInterval )\n {\n return true;\n }\n }\n return false;\n }\n\n } );\n\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Handling navigation while checkout processes\n * @class NavigatorService\n * @static\n *\n */\n pm.service( 'NavigatorService', function( CMS, Checkout )\n {\n var navigation = [];\t\t// contains navigation list elements\n var container = [];\t\t// content containers\n var current = -1;\t\t// index of currently shown content container\n var buttonPrev = {};\t\t// navigation buttons\n var buttonNext = {};\n var interceptors = {\n beforeChange: [],\n afterChange : []\n };\n var checkoutStates = [];\n\n return {\n init : init,\n getCurrentContainer: getCurrentContainer,\n goTo : goTo,\n beforeChange : beforeChange,\n afterChange : afterChange,\n continueChange : continueChange,\n next : next,\n previous : previous,\n goToID : goToID,\n fillNavigation : fillNavigation\n };\n\n /**\n * Initialize checkout navigation. Shows first container.\n * @function init\n * @example\n * ```html\n * \n *
      \n *
    • Checkout Step 1
    • \n *
    • Checkout Step 2
    • \n *
    • ...
    • \n *
    \n * \n *\n *
    \n *
    \n * Checkout Step 1 Content\n *
    \n *
    \n * Checkout Step 2 Content\n *
    \n *
    ...
    \n *
    \n * ```\n */\n function init()\n {\n\n // get elements from DOM\n navigation = $( '[data-plenty-checkout=\"navigation\"] > li' );\n container = $( '[data-plenty-checkout=\"container\"] > div' );\n buttonNext = $( '[data-plenty-checkout=\"next\"]' );\n buttonPrev = $( '[data-plenty-checkout=\"prev\"]' );\n\n if ( navigation.length == container.length && container.length > 0 )\n {\n var checkout = Checkout.getCheckout();\n\n container.hide();\n\n // initialize navigation\n navigation.each( function( i, elem )\n {\n $( elem ).addClass( 'disabled' );\n // handle navigation click events\n $( elem ).click( function()\n {\n if ( !$( this ).is( '.disabled' ) )\n {\n goTo( i );\n }\n } );\n } );\n\n buttonNext.attr( \"disabled\", \"disabled\" );\n buttonNext.click( function()\n {\n next();\n } );\n\n buttonPrev.attr( \"disabled\", \"disabled\" );\n buttonPrev.click( function()\n {\n previous();\n } );\n\n window.addEventListener( 'hashchange', function()\n {\n if ( window.location.hash.length > 0 )\n {\n goToID( window.location.hash );\n }\n else\n {\n goTo( 0 );\n }\n }, false );\n\n // initialize GUI\n // check url param for jumping to tab\n $.urlParam = function( name )\n {\n var results = new RegExp( '[\\?&]' + name + '=([^&#]*)' ).exec( window.location.href );\n if ( results == null )\n {\n return null;\n }\n else\n {\n return results[1] || 0;\n }\n };\n\n var param = $.urlParam( 'gototab' );\n // jump to hash from url param 'gototab'\n if ( window.location.hash.length == 0 && !!param && $( '[data-plenty-checkout-id=\"' + param + '\"]' ).length > 0 )\n {\n window.location.hash = param;\n }\n // jump to hash\n else if ( !goToID( window.location.hash ) && current >= 0 )\n {\n goTo( current );\n }\n else\n {\n goTo( 0 );\n }\n\n fillNavigation();\n $( window ).on( 'sizeChange', fillNavigation );\n $( window ).resize( function()\n {\n if ( pm.getInstance().MediaSizeService.interval() == 'xs' )\n {\n fillNavigation();\n }\n } );\n\n }\n }\n\n /**\n * Get the currently active checkout container.\n * @function getCurrentContainer\n * @return {{id: string, index: number}}\n */\n function getCurrentContainer()\n {\n if ( current >= 0 )\n {\n return {\n id : $( container[current] ).attr( 'data-plenty-checkout-id' ),\n index: current\n };\n }\n else\n {\n return null;\n }\n }\n\n /**\n * Register an interceptor called before each tab change.\n * Tabchange will break if any interceptor returns false.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n * @example\n * plenty.NavigatorService.beforeChange( function(targetContainer) {\n * if( targetContainer.id === 'details' ) {\n * // stop tabchange if user tries to access checkout container with id \"details\"\n * return false;\n * }\n * return true;\n * });\n */\n function beforeChange( interceptor )\n {\n interceptors.beforeChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Register an interceptor called after each tab change.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n */\n function afterChange( interceptor )\n {\n interceptors.afterChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Call registered interceptors. Break if any interceptor returns false.\n * Do not call beforeChange-interceptors on initially tabchange\n * @function resolveInterceptors\n * @private\n * @param {\"beforeChange\"|\"afterChange\"} identifier Describe which interceptors should be called\n * @param {number} index the index of the target container\n * @returns {boolean} Conjunction of all interceptor return values\n */\n function resolveInterceptors( identifier, index )\n {\n var continueTabChange = true;\n\n if ( current >= 0 || identifier === 'afterChange' )\n {\n\n var currentContainer = getCurrentContainer();\n var targetContainer = {\n index: index,\n id : $( container[index] ).attr( 'data-plenty-checkout-id' )\n };\n\n $.each( interceptors[identifier], function( i, interceptor )\n {\n if ( interceptor( currentContainer, targetContainer ) === false )\n {\n continueTabChange = false;\n return false;\n }\n } );\n }\n\n return continueTabChange;\n }\n\n /**\n * Show checkout tab given by index\n * @function goTo\n * @param {number} index Index of target tab, starting at 0\n * @param {boolean} [ignoreInterceptors=false] Set true to not call registered interceptors and force changing\n * tab\n */\n function goTo( index, ignoreInterceptors )\n {\n\n var contentChanged = current !== index;\n\n if ( contentChanged && !ignoreInterceptors )\n {\n if ( !resolveInterceptors( \"beforeChange\", index ) )\n {\n return;\n }\n }\n\n current = index;\n\n if ( !Object.equals( checkoutStates[current], Checkout.getCheckout( true ) ) && contentChanged && !!$( container[current] ).attr( 'data-plenty-checkout-content' ) )\n {\n checkoutStates[current] = Checkout.getCheckout( true );\n // reload tab content\n CMS.getCategoryContent( $( container[current] ).attr( 'data-plenty-checkout-content' ) )\n .done( function( response )\n {\n $( container[current] ).html( response.data[0] );\n // continue tab change\n proceedTabChange( contentChanged );\n pm.getInstance().bindDirectives( container[current] );\n $( window ).trigger( 'contentChanged' );\n } );\n }\n else\n {\n // continue tab change without reloading tab content\n proceedTabChange( contentChanged );\n //pm.getInstance().bindDirectives();\n }\n\n }\n\n function proceedTabChange( contentChanged )\n {\n\n // hide content containers\n $( container ).hide();\n\n // refresh navigation elements\n var $elem;\n $( navigation ).each( function( i, elem )\n {\n $elem = $( elem );\n $elem.removeClass( 'disabled active' );\n\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'false' );\n\n if ( i < current )\n {\n // set current element as active\n $elem.addClass( 'visited' );\n }\n else\n {\n if ( i == current )\n {\n $elem.addClass( 'active visited' );\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'true' );\n }\n else\n {\n if ( i > current && !$elem.is( '.visited' ) )\n {\n // disable elements behind active\n $elem.addClass( 'disabled' );\n }\n }\n }\n } );\n fillNavigation();\n\n // hide \"previous\"-button if first content container is shown\n if ( current <= 0 )\n {\n buttonPrev.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonPrev.removeAttr( \"disabled\" );\n }\n\n // hide \"next\"-button if last content container is shown\n if ( current + 1 == navigation.length )\n {\n buttonNext.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonNext.removeAttr( \"disabled\" );\n }\n\n // show current content container\n $( container[current] ).show();\n\n // set location hash\n if ( current > 0 )\n {\n window.location.hash = $( container[current] ).attr( 'data-plenty-checkout-id' );\n }\n else\n {\n if ( window.location.hash.length > 0 )\n {\n window.location.hash = '';\n }\n }\n\n if ( contentChanged )\n {\n resolveInterceptors( \"afterChange\", current );\n }\n }\n\n /**\n * Continue interrupted tabchange. Shorthand for: goTo(targetContainer.index, true)\n * @function continueChange\n * @param targetContainer The tab-object received from an interceptor\n */\n function continueChange( targetContainer )\n {\n goTo( targetContainer.index, true );\n }\n\n /**\n * Show next checkout tab if available. Shorthand for\n * \n * if (current < navigation.length - 1) {\n * goTo(current + 1);\n * }\n * \n * @function next\n */\n function next()\n {\n if ( current < navigation.length - 1 )\n {\n goTo( current + 1 );\n }\n }\n\n /**\n * Show previous checkout tab if available\n * @function next\n */\n function previous()\n {\n if ( current > 0 )\n {\n goTo( current - 1 );\n }\n }\n\n /**\n * Show checkout tab given by ID\n * @function goToID\n * @param {string} containerID ID of tab to show. Target tab must be marked with\n * data-plenty-checkout-id=\"#...\"\n */\n function goToID( containerID )\n {\n if ( containerID == 'next' )\n {\n next();\n return true;\n }\n else if ( containerID == 'prev' )\n {\n previous();\n return true;\n }\n else\n {\n containerID = containerID.replace( '#', '' );\n $( container ).each( function( i, elem )\n {\n if ( $( elem ).attr( 'data-plenty-checkout-id' ) == containerID )\n {\n goTo( i );\n return true;\n }\n } );\n }\n\n return false;\n }\n\n /**\n * Calculate navigation's width to match its parent element\n * by increasing its items padding.\n * @function fillNavigation\n */\n function fillNavigation()\n {\n // break if manager has not been initialized\n var navigationCount = navigation.length;\n if ( navigationCount <= 0 )\n {\n return;\n }\n\n // reset inline styles\n $( navigation ).removeAttr( 'style' );\n $( navigation ).children( 'span' ).removeAttr( 'style' );\n $( buttonNext ).removeAttr( 'style' );\n $( buttonPrev ).removeAttr( 'style' );\n\n var buttonWidth = ($( buttonPrev ).outerWidth() < $( buttonNext ).outerWidth()) ? $( buttonNext ).outerWidth( true ) + 1 : $( buttonPrev ).outerWidth( true ) + 1;\n $( buttonNext ).css( {width: buttonWidth + 'px'} );\n $( buttonPrev ).css( {width: buttonWidth + 'px'} );\n\n // calculate width to fill\n var width = $( navigation ).parent().parent().outerWidth( true ) - ( 2 * buttonWidth);\n width -= parseInt( $( navigation ).parent().css( 'marginLeft' ) ) + parseInt( $( navigation ).parent().css( 'marginRight' ) );\n\n var padding = width;\n var tabWidth = [];\n\n $( navigation ).each( function( i, elem )\n {\n padding -= parseInt( $( elem ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).css( 'marginRight' ) );\n\n tabWidth[i] = $( elem ).children( 'span' ).width();\n padding -= tabWidth[i];\n\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginRight' ) );\n } );\n\n var paddingEachItem = parseInt( padding / navigationCount );\n\n var paddingLeft, paddingRight;\n if ( paddingEachItem % 2 == 1 )\n {\n paddingLeft = ( paddingEachItem / 2 ) + 0.5;\n paddingRight = ( paddingEachItem / 2 ) - 0.5;\n }\n else\n {\n paddingLeft = paddingEachItem / 2;\n paddingRight = paddingEachItem / 2;\n }\n\n var paddingLastItem = parseInt( padding - ( ( navigationCount - 1 ) * ( paddingLeft + paddingRight ) ) );\n var paddingLastLeft, paddingLastRight;\n if ( paddingLastItem % 2 == 1 )\n {\n paddingLastLeft = ( paddingLastItem / 2 ) + 0.5;\n paddingLastRight = ( paddingLastItem / 2) - 0.5;\n }\n else\n {\n paddingLastLeft = paddingLastItem / 2;\n paddingLastRight = paddingLastItem / 2;\n }\n\n var diff = width;\n $( navigation ).each( function( i, elem )\n {\n if ( i < navigationCount - 1 )\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLeft + 'px', 'paddingRight': paddingRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLeft + paddingRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n else\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLastLeft + 'px', 'paddingRight': paddingLastRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLastLeft + paddingLastRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n } );\n\n //$(navigation).parent().css('marginRight', 0);\n }\n\n }, ['CMSFactory', 'CheckoutFactory'] );\n\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Magnus Martin \n * =====================================================================================\n */\n\n\n(function( $, pm )\n{\n pm.service( 'PostfinderService', function( API, Modal, UIFactory )\n {\n var packstationID = '';\n var shippingFields = {};\n var numberOfResults = {};\n var result = {};\n\n return {\n openPostfinderModal: openPostfinderModal,\n isPackstation : isPackstation\n };\n\n function isPackstation()\n {\n var street = $( 'input[name=\"Street\"]' ).val();\n return ( street.toUpperCase() == \"PACKSTATION\" || street.toUpperCase() == \"POSTFILIALE\" );\n }\n\n function openPostfinderModal()\n {\n shippingFields = {\n PostfinderItemStreet : $( 'input[name=\"Street\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemZIP : $( 'input[name=\"ZIP\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemCity : $( 'input[name=\"City\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemHouseNo: $( 'input[name=\"HouseNo\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' )\n\n };\n\n shippingFields.PostfinderItemStreet.val( '' );\n\n if ( (shippingFields.PostfinderItemZIP.val().length > 2 || shippingFields.PostfinderItemCity.val().length > 2) )\n {\n\n API.get( '/rest/checkout/shippingaddresspostfinderlist/',\n {\n suggestionType: \"postfinder\",\n zip : shippingFields.PostfinderItemZIP.val(),\n city : shippingFields.PostfinderItemCity.val()\n } )\n\n .done( function( response )\n {\n result = response.data;\n numberOfResults = result.length;\n\n if ( numberOfResults == 0 )\n {\n showErrorMessage();\n }\n\n var params = {\n addresses: []\n };\n\n for ( var i = 0; i < numberOfResults; i++ )\n {\n var dimension = 'km';\n var distInMeters = result[i].PostfinderItemDistance;\n var distInKilometers = distInMeters / 1000;\n distInKilometers = ((Math.round( distInKilometers * 100 ) / 100).toFixed( 2 )).replace( '.', ',' );\n\n if ( distInMeters < 1000 )\n {\n distInKilometers = distInMeters;\n dimension = 'm';\n }\n\n params.addresses.push( {\n index : i,\n dimension: dimension,\n type : result[i].PostfinderItemIsPackstation ? 'Packstation' : 'Postfiliale',\n number : result[i].PostfinderItemIsPackstation ? result[i].PostfinderItemPackstationNo : result[i].PostfinderItemPostfilialNo,\n street : result[i].PostfinderItemStreet,\n houseNo : result[i].PostfinderItemHouseNo,\n zip : result[i].PostfinderItemZIP,\n city : result[i].PostfinderItemCity,\n district : result[i].PostfinderItemDistrict,\n distance : distInKilometers,\n remark : result[i].PostfinderItemRemark\n } );\n }\n\n var html = pm.compileTemplate( 'addressSuggestions/postFinder.html', params );\n\n Modal.prepare()\n .setTitle( pm.translate( 'Packstations and post offices in your area' ) )\n .setContent( html )\n .setClass( 'checkout' )\n .onConfirm( function()\n {\n shippingFields.PostfinderItemCity.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemStreet.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemStreet.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemHouseNo.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemHouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n packstationID = $( 'input[type=\"radio\"][name=\"postfinder\"]:checked' ).val();\n\n if ( result[packstationID].PostfinderItemIsPackstation )\n {\n $( shippingFields.PostfinderItemStreet ).val( 'PACKSTATION' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPackstationNo );\n }\n else\n {\n $( shippingFields.PostfinderItemStreet ).val( 'POSTFILIALE' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPostfilialNo );\n }\n $( shippingFields.PostfinderItemStreet ).trigger( 'change' );\n\n $( shippingFields.PostfinderItemCity ).val( result[packstationID].PostfinderItemCity );\n $( shippingFields.PostfinderItemZIP ).val( result[packstationID].PostfinderItemZIP );\n return true;\n } )\n .show()\n } );\n }\n else\n {\n showErrorMessage();\n }\n\n }\n\n function showErrorMessage()\n {\n UIFactory.throwError( 0, pm.translate( 'Please enter a ZIP code and/or a city.' ) );\n\n shippingFields.PostfinderItemCity.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemCity.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n\n shippingFields.PostfinderItemZIP.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n }\n }, ['APIFactory', 'ModalFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide templates for social share providers to inject them dynamically.\n * @class SocialShareService\n * @static\n */\n pm.service( 'SocialShareService', function()\n {\n\n //TODO: move to global variables\n if ( typeof(socialLangLocale) == 'undefined' )\n {\n socialLangLocale = 'en_US';\n }\n if ( typeof(socialLang) == 'undefined' )\n {\n socialLang = 'en';\n }\n\n return {\n getSocialService: getService\n };\n\n /**\n * Get the template for social media provider\n * @function getService\n * @param {string} identifier name of the social media provider to get the template for\n * @returns {string} the template to inject in DOM\n */\n function getService( identifier )\n {\n var services = {\n 'facebook-like': '',\n\n 'facebook-recommend': '',\n\n 'twitter': '',\n\n 'google-plus': '
    '\n + '',\n };\n\n return services[identifier];\n }\n\n /**\n * get the canonical URL if defined\n * @function getURL\n * @private\n * @return {string} The Canonical URL if defined or the current URI\n */\n function getURI()\n {\n var uri = document.location.href;\n var canonical = $( \"link[rel=canonical]\" ).attr( \"href\" );\n\n if ( canonical && canonical.length > 0 )\n {\n if ( canonical.indexOf( \"http\" ) < 0 )\n {\n canonical = document.location.protocol + \"//\" + document.location.host + canonical;\n }\n uri = canonical;\n }\n\n return uri;\n }\n\n /**\n * returns content of <meta name=\"\" content=\"\"> tags or '' if empty/non existant\n * @function getMeta\n * @private\n * @param {string} name The meta name to get the value of;\n */\n function getMeta( name )\n {\n var metaContent = $( 'meta[name=\"' + name + '\"]' ).attr( 'content' );\n return metaContent || '';\n }\n\n /**\n * create tweet text from content of <meta name=\"DC.title\"> and <meta name=\"DC.creator\">\n * fallback to content of <title> tag\n * @function getTweetText\n * @private\n */\n function getTweetText()\n {\n var title = getMeta( 'DC.title' );\n var creator = getMeta( 'DC.creator' );\n\n if ( title.length > 0 && creator.length > 0 )\n {\n title += ' - ' + creator;\n }\n else\n {\n title = $( 'title' ).text();\n }\n\n return encodeURIComponent( title );\n }\n\n } );\n\n}( jQuery, PlentyFramework ));","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide methods for client-side form validation.\n * @class ValidationService\n * @static\n */\n pm.service( 'ValidationService', function()\n {\n\n return {\n validate: validate\n };\n\n /**\n * Check if element is a form element (input, select, textarea) or search for child form elements\n * @function getFormControl\n * @private\n * @param {object} element the element to get the form element from\n * @return {object} a valid form element (input, select, textarea)\n */\n function getFormControl( element )\n {\n element = $( element );\n if ( element.is( 'input' ) || element.is( 'select' ) || element.is( 'textarea' ) )\n {\n return element;\n }\n else\n {\n if ( element.find( 'input' ).length > 0 )\n {\n return element.find( 'input' );\n }\n\n else if ( element.find( 'select' ).length > 0 )\n {\n return element.find( 'select' );\n }\n\n else if ( element.find( 'textarea' ).length > 0 )\n {\n return element.find( 'textarea' );\n }\n\n else\n {\n return null;\n }\n }\n\n }\n\n /**\n * Check given element has any value\n * @function validateText\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateText( formControl )\n {\n // check if formControl is no checkbox or radio\n if ( formControl.is( 'input' ) || formControl.is( 'select' ) || formControl.is( 'textarea' ) )\n {\n // check if length of trimmed value is greater then zero\n return $.trim( formControl.val() ).length > 0;\n\n }\n else\n {\n console.error( 'Validation Error: Cannot validate Text for <' + formControl.prop( \"tagName\" ) + '>' );\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid email-address\n * @function validateMail\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateMail( formControl )\n {\n var mailRegExp = /[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n if ( validateText( formControl ) )\n {\n return mailRegExp.test( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid number\n * @function validateNumber\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateNumber( formControl )\n {\n if ( validateText( formControl ) )\n {\n return $.isNumeric( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is equal to a references value\n * @function validateValue\n * @private\n * @param {object} formControl the form element to validate\n * @param {string} reference the required value\n * @return {boolean}\n */\n function validateValue( formControl, reference )\n {\n if ( $( reference ).length > 0 )\n {\n return $.trim( formControl.val() ) == $.trim( $( reference ).val() );\n }\n else\n {\n return $.trim( formControl.val() ) == reference;\n }\n }\n\n function visibility( formControl )\n {\n return formControl.is( ':visible' );\n }\n\n function isEnabled( formControl )\n {\n return formControl.is( ':enabled' );\n }\n\n /**\n * Validate a form. Triggers event 'validationFailed' if any element has an invalid value\n * @function validate\n * @param {object} form The form element to validate\n * @returns {boolean}\n * @example\n * ```html\n * \n *
    \n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n *
    \n * \n * \n *
    \n *\n *
    \n * ```\n *\n * @example\n * $(form).on('validationFailed', function(missingFields) {\n * // handle missing fields\n * });\n */\n function validate( form, errorClass )\n {\n var formControl, formControls, validationKey, currentHasError, group, checked, checkedMin, checkedMax, attrValidate, validationKeys, formControlAttrType;\n var $form = $( form );\n errorClass = errorClass || 'has-error';\n var missingFields = [];\n var hasError = false;\n\n // check every required input inside form\n $form.find( '[data-plenty-validate], input.Required' ).each( function( i, elem )\n {\n attrValidate = $( elem ).attr( 'data-plenty-validate' );\n formControls = getFormControl( elem )\n // validate text inputs\n validationKeys = !!attrValidate ? attrValidate : 'text';\n validationKeys = validationKeys.split( ',' );\n\n for ( var i = 0, length = formControls.length; i < length; i++ )\n {\n formControl = $( formControls[i] );\n formControlAttrType = formControl.attr( 'type' );\n\n if ( !visibility( formControl ) || !isEnabled( formControl ) )\n {\n return;\n }\n\n validationKey = validationKeys[i].trim() || validationKeys[0].trim();\n currentHasError = false;\n\n // formControl is textfield (text, mail, password) or textarea\n if ( (formControl.is( 'input' )\n && formControlAttrType != 'radio'\n && formControlAttrType != 'checkbox')\n || formControl.is( 'textarea' ) )\n {\n switch ( validationKey )\n {\n\n case 'text':\n currentHasError = !validateText( formControl );\n break;\n\n case 'mail':\n currentHasError = !validateMail( formControl );\n break;\n\n case 'number':\n currentHasError = !validateNumber( formControl );\n break;\n\n case 'value':\n currentHasError = !validateValue( formControl, $( elem ).attr( 'data-plenty-validation-value' ) );\n break;\n\n case 'none':\n // do not validate\n break;\n\n default:\n console.error( 'Form validation error: unknown validate property: \"' + attrValidate + '\"' );\n break;\n }\n }\n else if ( formControl.is( 'input' )\n && (formControlAttrType == 'radio'\n || formControlAttrType == 'checkbox') )\n {\n // validate radio buttons\n group = formControl.attr( 'name' );\n checked = $form.find( 'input[name=\"' + group + '\"]:checked' ).length;\n\n if ( formControlAttrType == 'radio' )\n {\n checkedMin = 1;\n checkedMax = 1;\n }\n else\n {\n var minMax = (new Function(\"return \" + attrValidate))() || {min: 1, max: 1};\n checkedMin = minMax.min;\n checkedMax = minMax.max;\n }\n\n currentHasError = ( checked < checkedMin || checked > checkedMax );\n\n }\n else if ( formControl.is( 'select' ) )\n {\n // validate selects\n currentHasError = ( formControl.val() == '' || formControl.val() == '-1' );\n }\n else\n {\n console.error( 'Form validation error: ' + $( elem ).prop( \"tagName\" ) + ' does not contain an form element' );\n return;\n }\n\n if ( currentHasError )\n {\n hasError = true;\n missingFields.push( formControl );\n\n if ( formControls.length > 1 )\n {\n formControl.addClass( errorClass );\n $form.find( 'label[for=\"' + formControl.attr( 'id' ) + '\"]' ).addClass( errorClass );\n }\n else\n {\n $( elem ).addClass( errorClass );\n }\n }\n }\n\n } );\n\n // scroll to element on 'validationFailed'\n $form.on( 'validationFailed', function()\n {\n var distanceTop = 50;\n var $error = $form.find( '.' + errorClass ).first();\n var errorOffset = $error.offset().top;\n var $scrollTarget = $( 'html, body' );\n\n // if form is inside of modal, scroll modal instead of body\n if ( $form.parents( '.modal' ).length > 0 )\n {\n $scrollTarget = $form.parents( '.modal' ).find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n\n }\n else if ( $form.is( '.modal' ) )\n {\n $scrollTarget = $form.find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n }\n\n // only scroll if error is outside of viewport\n if ( errorOffset - distanceTop < window.pageYOffset || errorOffset > (window.pageYOffset + window.innerHeight) )\n {\n $scrollTarget.animate( {\n scrollTop: errorOffset - distanceTop\n } );\n }\n } );\n\n if ( hasError )\n {\n // remove error class on focus\n $form.find( '.' + errorClass ).each( function( i, elem )\n {\n formControl = $( getFormControl( elem ) );\n formControl.on( 'focus click', function()\n {\n var $errorElement = $( elem );\n $errorElement.removeClass( errorClass );\n $form.find( 'label[for=\"' + $( this ).attr( 'id' ) + '\"]' ).removeClass( errorClass );\n } );\n } );\n\n $form.trigger( 'validationFailed', [missingFields] );\n }\n\n var callback = $form.attr( 'data-plenty-callback' );\n\n if ( !hasError && !!callback && callback != \"submit\" && typeof window[callback] == \"function\" )\n {\n\n var fields = {};\n $form.find( 'input, textarea, select' ).each( function()\n {\n if ( $( this ).attr( 'type' ) == 'checkbox' )\n {\n fields[$( this ).attr( 'name' )] = $( this ).is( ':checked' );\n }\n else\n {\n fields[$( this ).attr( 'name' )] = $( this ).val();\n }\n } );\n\n window[callback]( fields );\n return false;\n }\n else\n {\n return !hasError;\n }\n }\n } );\n\n /**\n * jQuery-Plugin to calling {{#crossLink \"ValidationService/validate\"}}ValidationService.validate{{/crossLink}}\n * on jQuery wrapped elements.\n * @return {boolean}\n */\n $.fn.validateForm = function()\n {\n return pm.getInstance().ValidationService.validate( this );\n };\n\n /**\n * jQuery-Plugin to get the values of contained form elements.\n * @return {object}\n */\n $.fn.getFormValues = function()\n {\n\n var form = this;\n var values = {};\n\n function inject( position, value )\n {\n var match = position.match( /^([^\\[]+)(.*)/ );\n\n if ( !!match[2] )\n {\n var exp = /\\[([^\\]]+)]/g;\n var child;\n var children = [];\n children[0] = match[1];\n while ( (child = exp.exec( match[2] )) !== null )\n {\n children.push( child[1] );\n }\n\n for ( var i = children.length - 1; i >= 0; i-- )\n {\n var val = {};\n val[children[i]] = value;\n value = val;\n }\n values = $.extend( true, values, value );\n }\n else\n {\n values[match[1]] = value;\n }\n }\n\n form.find( 'input, select, textarea' ).each( function( i, elem )\n {\n if ( !!$( elem ).attr( 'name' ) )\n {\n if ( $( elem ).attr( 'type' ) == \"checkbox\" )\n {\n // get checkbox group\n var groupValues = [];\n $( form ).find( '[name=\"' + $( elem ).attr( 'name' ) + '\"]:checked' ).each( function( j, checkbox )\n {\n groupValues.push( $( checkbox ).val() );\n } );\n inject( $( elem ).attr( 'name' ), groupValues );\n }\n else if ( $( elem ).attr( 'type' ) == 'radio' )\n {\n if ( $( elem ).is( ':checked' ) )\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n else\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n\n } );\n return values;\n }\n}( jQuery, PlentyFramework ));","/**\n * Services provide functions to be called from the instanced PlentyFramework.
    \n * Services can inject Factories and can be injected into Directives. The are also\n * available from the global instance of PlentyFramework\n * @module Services\n * @main Services\n * @example\n * PlentyFramework.service('ServiceName', serviceFunctions() {\n * return {\n * functionInService: function() {}\n * }\n * });\n * //...\n * plenty.ServiceName.functionInService/();\n */","/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\nPlentyFramework.compile();\n\n// Create global instance of PlentyFramework for usage in Webshop-Layouts\nvar plenty = PlentyFramework.getInstance();\n\n/*\n * initially bind all registered directives\n *\n * will not be tested. reasons:\n * http://stackoverflow.com/questions/29153733/how-to-unit-test-a-document-ready-function-using-jasmine\n */\njQuery( document ).ready( function()\n{\n plenty.bindDirectives();\n} );"]} \ No newline at end of file +{ + "version": 3, + "file": "plentymarketsCMStools-1.0.8.min.js", + "sources": [ + "plentymarketsCMStools-1.0.8.js" + ], + "names": [ + "TemplateCache", + "global", + "factory", + "exports", + "nodeName", + "define", + "amd", + "Mustache", + "this", + "mustache", + "isFunction", + "object", + "typeStr", + "obj", + "isArray", + "escapeRegExp", + "string", + "replace", + "hasProperty", + "propName", + "testRegExp", + "re", + "regExpTest", + "call", + "isWhitespace", + "nonSpaceRe", + "escapeHtml", + "String", + "s", + "entityMap", + "parseTemplate", + "template", + "tags", + "stripSpace", + "hasTag", + "nonSpace", + "spaces", + "length", + "tokens", + "pop", + "compileTags", + "tagsToCompile", + "split", + "spaceRe", + "Error", + "openingTagRe", + "RegExp", + "closingTagRe", + "closingCurlyRe", + "sections", + "start", + "type", + "value", + "chr", + "token", + "openSection", + "scanner", + "Scanner", + "eos", + "pos", + "scanUntil", + "i", + "valueLength", + "charAt", + "push", + "scan", + "tagRe", + "whiteRe", + "equalsRe", + "curlyRe", + "nestTokens", + "squashTokens", + "lastToken", + "squashedTokens", + "numTokens", + "section", + "nestedTokens", + "collector", + "tail", + "Context", + "view", + "parentContext", + "cache", + ".", + "parent", + "Writer", + "objectToString", + "Object", + "prototype", + "toString", + "Array", + "test", + "&", + "<", + ">", + "\"", + "'", + "/", + "match", + "index", + "substring", + "search", + "lookup", + "name", + "hasOwnProperty", + "names", + "context", + "lookupHit", + "indexOf", + "clearCache", + "parse", + "render", + "partials", + "renderTokens", + "originalTemplate", + "symbol", + "buffer", + "undefined", + "renderSection", + "renderInverted", + "renderPartial", + "unescapedValue", + "escapedValue", + "rawValue", + "subRender", + "self", + "j", + "slice", + "escape", + "version", + "defaultWriter", + "TypeError", + "to_html", + "send", + "result", + "$", + "bindEventCallback", + "$elem", + "eventType", + "callback", + "params", + "on", + "event", + "eventStack", + "apply", + "document", + "readyState", + "addCustomEvents", + "element", + "is", + "trigger", + "radioGroup", + "attr", + "each", + "radio", + "$radio", + "parseDirectives", + "input", + "thisValue", + "directivePattern", + "expressions", + "directives", + "expression", + "trim", + "console", + "error", + "directive", + "class", + "method", + "param", + "isNaN", + "parseFloat", + "toLowerCase", + "compileComponent", + "component", + "componentLevel", + "dependencyStack", + "compiledDependencies", + "dependencies", + "dependency", + "inArray", + "components", + "factories", + "PlentyFramework", + "services", + "join", + "setup", + "instance", + "getInstance", + "compare", + "localVersion", + "compareVersion", + "parseInt", + "get", + "equals", + "v", + "globals", + "setGlobal", + "identifier", + "getGlobal", + "fallbackValue", + "directiveName", + "directiveFunctions", + "bindDirectives", + "rootElement", + "find", + "getRecentEvent", + "lastEventIdx", + "pushEvent", + "service", + "serviceName", + "serviceFunctions", + "factoryName", + "factoryFunctions", + "compileTemplate", + "data", + "translate", + "text", + "scriptPath", + "Strings", + "loadLanguageFile", + "fileName", + "ajax", + "url", + "dataType", + "done", + "response", + "localeString", + "warn", + "compile", + "scripts", + "getElementsByTagName", + "path", + "src", + "jQuery", + "pm", + "AuthenticationService", + "login", + "elem", + "preventDefault", + "customerLogin", + "BasketService", + "addBasketItem", + "basketItemsList", + "parentForm", + "parents", + "BasketItemItemID", + "val", + "BasketItemPriceID", + "BasketItemQuantity", + "BasketItemBranchID", + "attributeInputsList", + "attributesList", + "idx", + "BasketItemAttributeID", + "BasketItemAttributeValueID", + "BasketItemAttributesList", + "addItem", + "changeItemQuantity", + "increment", + "$quantityInput", + "maxLength", + "isBasketView", + "timeout", + "window", + "clearTimeout", + "setTimeout", + "setItemQuantity", + "basketItemID", + "fail", + "basketItem", + "getItem", + "CheckoutService", + "setMethodOfPayment", + "paymentID", + "confirmAtrigaPaymax", + "atrigaPaymaxConfirmed", + "MediaSize", + "initDropdowns", + "resetDropdowns", + "dropdownElements", + "closableDropdownElements", + "dropdownList", + "$current", + "target", + "removeClass", + "openDropdown", + "alwaysClickable", + "$parent", + "isInterval", + "Modernizr", + "touch", + "showDropdownHideOthers", + "avoidRedirectinStopPropagation", + "not", + "addClass", + "off", + "e", + "stopPropagation", + "slideDropdown", + "$elemParent", + "siblings", + "slideToggle", + "removeAttr", + "MediaSizeService", + "NavigatorService", + "to", + "href", + "interval", + "location", + "assign", + "toCheckoutTab", + "tabID", + "goToID", + "showTab", + "tabSelector", + "tab", + "initRemoteLabel", + "groupID", + "tabGroups", + "TabGroup", + "getTab", + "addTab", + "addLabel", + "initRemoteTab", + "setContent", + "showRemoteTab", + "tabs", + "Tab", + "zIndex", + "activeTab", + "getContent", + "css", + "hide", + "currentZ", + "resetTabs", + "show", + "id", + "getID", + "label", + "$labels", + "content", + "$content", + "SocialShareService", + "UIFactory", + "initUIWindowEvents", + "fireEqualHeight", + "toTopButtonList", + "scrollTop", + "doToArrayElements", + "showWaitscreen", + "hideWaitscreen", + "forceClose", + "addContentPageSlider", + "owlCarousel", + "navigation", + "navigationText", + "slideSpeed", + "paginationSpeed", + "singleItem", + "autoPlay", + "stopOnHover", + "afterMove", + "current", + "equalHeight", + "mediaSizes", + "elementExists", + "maxHeight", + "$equalTarget", + "$equalTargetList", + "children", + "equalHeightElementList", + "outerHeight", + "height", + "initToTop", + "click", + "animate", + "initLazyload", + "effect", + "lazyload", + "toggleHideShow", + "log", + "initSlideToggle", + "checked", + "$targetElement", + "$radioGroupList", + "visibleOnChecked", + "change", + "$self", + "slideDown", + "slideUp", + "toggleClass", + "duration", + "slideAction", + "$target", + "callbackString", + "toggleSocialShare", + "socialShareService", + "$toggle", + "append", + "hasClass", + "tooltip", + "getSocialService", + "cssClass", + "array", + "func", + "ValidationService", + "validate", + "form", + "errorClass", + "UI", + "Modal", + "renewLoginSession", + "sessionExpirationTimeout", + "prepare", + "setTitle", + "setLabelDismiss", + "setLabelConfirm", + "onConfirm", + "onDismiss", + "handleError", + "jqXHR", + "responseText", + "parseJSON", + "printErrors", + "error_stack", + "throwError", + "status", + "statusText", + "_get", + "ignoreErrors", + "runInBackground", + "sync", + "showWaitScreen", + "async", + "always", + "hideWaitScreen", + "_post", + "isFile", + "processData", + "contentType", + "JSON", + "stringify", + "_put", + "_delete", + "_idle", + "Deferred", + "resolve", + "ready", + "post", + "put", + "delete", + "idle", + "API", + "getContainer", + "containerName", + "from", + "layoutGroup", + "getParams", + "getCategoryContent", + "categoryID", + "CMS", + "Checkout", + "checkoutData", + "getCheckout", + "copy", + "checkout", + "loadCheckout", + "extend", + "setCheckout", + "reloadContainer", + "container", + "html", + "reloadCatContent", + "catId", + "reloadItemContainer", + "isModal", + "selector", + "title", + "modal", + "setClass", + "labelConfirm", + "labelDismiss", + "setContainer", + "bsModal", + "getModal", + "filter", + "script", + "createElement", + "innerHTML", + "init", + "close", + "startTimeout", + "confirmed", + "timeRemaining", + "timeStart", + "Date", + "getTime", + "clearInterval", + "setInterval", + "paused", + "secondsRemaining", + "Math", + "round", + "pauseTimeout", + "continueTimeout", + "stopTimeout", + "code", + "msg", + "message", + "errorMessages", + "errorPopup", + "has", + "key", + "addError", + "waitScreenCount", + "waitScreen", + "WaitScreen", + "a", + "b", + "constructor", + "cssClasses", + "active", + "popup", + "hideAll", + "errorCode", + "remove", + "hover", + "root", + "validateAddress", + "addressForms", + "addressIsValid", + "addressDoctor", + "AddressDoctor", + "requiredFields", + "isValid", + "fields", + "isPackstation", + "suggestions", + "AddressList", + "$form", + "getFormValues", + "refreshView", + "getAddresses", + "suggestionListVisible", + "validateInput", + "houseNoAllowed", + "$inputs", + "HouseNo", + "valueList", + "getList", + "$suggestionContainer", + "buildSuggestionList", + "focus", + "positionSuggestionList", + "suggestionKey", + "width", + "outerWidth", + "left", + "position", + "top", + "values", + "filterAddress", + "Street", + "toUpperCase", + "ZIP", + "City", + "addressInput", + "suggestionType", + "street", + "city", + "houseNo", + "country", + "CountryID", + "responseLength", + "currentResponse", + "address", + "getAddress", + "addresses", + "suggestion", + "addressCount", + "results", + "filteredAddresses", + "range", + "resetPassword", + "validateForm", + "Email", + "IsMailSend", + "loginMail", + "Password", + "loginPassword", + "setInvoiceAddress", + "invoiceAddress", + "CustomerInvoiceAddress", + "registerCustomer", + "AddressDoctorService", + "LoginType", + "customerInvoiceAddress", + "CustomerProperty", + "tmpProperties", + "CustomerPropertiesList", + "property", + "PropertyID", + "PropertyValue", + "article", + "itemID", + "quantity", + "resp", + "addArticle", + "saveOrderParams", + "articleWithParams", + "orderParamsForm", + "attrType", + "addOrderParamValue", + "files", + "orderParamFileUpload", + "paramValue", + "refreshBasketPreview", + "ArticleID", + "updateArticle", + "$input", + "formData", + "fileData", + "orderParamUploadFiles", + "orderParamFileIdStack", + "FormData", + "basketList", + "paramId", + "BasketItemOrderParamsList", + "BasketItemOrderParamID", + "BasketItemOrderParamValue", + "editItemAttributes", + "BasketItemID", + "getBasketItem", + "attributeSelect", + "editOrderParams", + "basketItems", + "BasketItemsList", + "removeBasketItem", + "forceDelete", + "doDelete", + "$oldBasketList", + "$basketListContainer", + "fadeOut", + "prepend", + "fadeIn", + "deferred", + "itemName", + "BasketItemNameMap", + "item", + "reject", + "basketItemIndex", + "itemQuantityTotal", + "Totals", + "TotalsItemSum", + "addCoupon", + "CouponActiveCouponCode", + "updateContainer", + "removeCoupon", + "Coupon", + "removeItem", + "setCustomerSignAndInfo", + "CheckoutCustomerSign", + "CheckoutOrderInfoText", + "CustomerSign", + "OrderInfoText", + "saveShippingAddress", + "shippingAddressID", + "shippingAddress", + "addressesAreEqual", + "CustomerShippingAddress", + "IsPackstation", + "PackstationNo", + "IsPostfiliale", + "PostfilialNo", + "CheckoutCustomerShippingAddressID", + "ID", + "CheckoutShippingCountryID", + "updatePaymentAndShippingDependencies", + "CheckoutMethodOfPaymentID", + "CheckoutShippingProfileID", + "registerGuest", + "address1", + "address2", + "setShippingProfile", + "ShippingProfileID", + "preparePayment", + "paymentData", + "CheckoutMethodOfPaymentRedirectURL", + "CheckoutMethodOfPaymentAdditionalContent", + "isBankDetails", + "saveBankDetails", + "saveCreditCard", + "errorStack", + "CheckoutAtrigapaymaxChecked", + "atrigaPaymaxChecked", + "editBankDetails", + "customerBankDetails", + "bankDetails", + "CustomerBankName", + "bankName", + "CustomerBLZ", + "blz", + "CustomerAccountNumber", + "accountNo", + "CustomerAccountOwner", + "accountOwner", + "CustomerIBAN", + "iban", + "CustomerBIC", + "bic", + "editCreditCard", + "paymentInformationCC", + "creditCard", + "Owner", + "owner", + "Cvv2", + "cvv2", + "Number", + "number", + "Year", + "year", + "Month", + "month", + "Provider", + "provider", + "loadAddressSuggestion", + "postnummer", + "Postnummer", + "placeOrder", + "TermsAndConditionsCheck", + "termsAndConditionsCheck", + "WithdrawalCheck", + "withdrawalCheck", + "PrivacyPolicyCheck", + "privacyPolicyCheck", + "AgeRestrictionCheck", + "ageRestrictionCheck", + "NewsletterCheck", + "newsletterCheck", + "KlarnaTermsAndConditionsCheck", + "klarnaTermsAndConditionsCheck", + "PayoneDirectDebitMandateCheck", + "payoneDirectDebitMandateCheck", + "PayoneInvoiceCheck", + "payoneInvoiceCheck", + "MethodOfPaymentRedirectURL", + "MethodOfPaymentAdditionalContent", + "getFeedbacks", + "setFeedbackInterval", + "end", + "feedbackInterval", + "dateStart", + "dateEnd", + "listFeedbacks", + "articleType", + "referenceId", + "feedbackType", + "ReferenceId", + "FromDate", + "ToDate", + "FeedbackType", + "feedbackTypes", + "COMMENTS_AND_RATINGS", + "between", + "for", + "addFeedback", + "withRating", + "rating", + "Rating", + "withComment", + "comment", + "Text", + "withAuthor", + "author", + "mail", + "customerID", + "Author", + "CustomerId", + "sendFeedback", + "COMMENTS_ONLY", + "RATINGS_ONLY", + "articleTypes", + "ITEM", + "CATEGORY", + "BLOG", + "ArticleTypes", + "FeedbackTypes", + "getInterval", + "bsInterval", + "calculateMediaSize", + "size", + "matchMedia", + "matches", + "oldValue", + "intervalList", + "resize", + "buttonNext", + "buttonPrev", + "goTo", + "next", + "previous", + "addEventListener", + "hash", + "urlParam", + "exec", + "fillNavigation", + "getCurrentContainer", + "beforeChange", + "interceptor", + "interceptors", + "afterChange", + "resolveInterceptors", + "continueTabChange", + "currentContainer", + "targetContainer", + "ignoreInterceptors", + "contentChanged", + "checkoutStates", + "proceedTabChange", + "continueChange", + "containerID", + "navigationCount", + "buttonWidth", + "padding", + "tabWidth", + "paddingLeft", + "paddingRight", + "paddingEachItem", + "paddingLastLeft", + "paddingLastRight", + "paddingLastItem", + "openPostfinderModal", + "shippingFields", + "PostfinderItemStreet", + "PostfinderItemZIP", + "PostfinderItemCity", + "PostfinderItemHouseNo", + "zip", + "numberOfResults", + "showErrorMessage", + "dimension", + "distInMeters", + "PostfinderItemDistance", + "distInKilometers", + "toFixed", + "PostfinderItemIsPackstation", + "PostfinderItemPackstationNo", + "PostfinderItemPostfilialNo", + "district", + "PostfinderItemDistrict", + "distance", + "remark", + "PostfinderItemRemark", + "packstationID", + "inputId", + "closest", + "getService", + "facebook-like", + "socialLangLocale", + "encodeURIComponent", + "getURI", + "facebook-recommend", + "twitter", + "getTweetText", + "google-plus", + "socialLang", + "uri", + "canonical", + "protocol", + "host", + "getMeta", + "metaContent", + "creator", + "getFormControl", + "validateText", + "formControl", + "prop", + "validateMail", + "mailRegExp", + "validateNumber", + "isNumeric", + "validateValue", + "reference", + "visibility", + "isEnabled", + "formControls", + "validationKey", + "currentHasError", + "group", + "checkedMin", + "checkedMax", + "attrValidate", + "validationKeys", + "formControlAttrType", + "missingFields", + "hasError", + "minMax", + "Function", + "min", + "max", + "distanceTop", + "$error", + "first", + "errorOffset", + "offset", + "$scrollTarget", + "pageYOffset", + "innerHeight", + "$errorElement", + "fn", + "inject", + "child", + "exp", + "groupValues", + "checkbox", + "plenty" + ], + "mappings": ";;;;;;;;AAAA,GAAIA,iBAEJA,eAAc,yCAA2C,gMAUzDA,cAAc,sCAAwC,gsBA4BtDA,cAAc,2BAA6B,kMAM3CA,cAAc,yBAA2B,qRASzCA,cAAc,oBAAsB,qoCAgCpCA,cAAc,8BAAgC,iEAE9C,SAAyBC,EAAOC,GAA6B,gBAAVC,UAAoBA,SAAmC,gBAAnBA,SAAQC,SAAqBF,EAAQC,SAAiC,kBAATE,SAAqBA,OAAOC,IAAKD,QAAQ,WAAWH,IAAcD,EAAOM,YAAYL,EAAQK,YAAaC,KAAK,SAAyBC,GAA0K,QAASC,GAAWC,GAAQ,MAAuB,kBAATA,GAAoB,QAASC,GAAQC,GAAK,MAAOC,GAAQD,GAAK,cAAeA,GAAI,QAASE,GAAaC,GAAQ,MAAOA,GAAOC,QAAQ,8BAA8B,QAAQ,QAASC,GAAYL,EAAIM,GAAU,MAAY,OAALN,GAAwB,gBAANA,IAAgBM,IAAYN,GAAyC,QAASO,GAAWC,EAAGL,GAAQ,MAAOM,GAAWC,KAAKF,EAAGL,GAA4B,QAASQ,GAAaR,GAAQ,OAAOI,EAAWK,EAAWT,GAAgG,QAASU,GAAWV,GAAQ,MAAOW,QAAOX,GAAQC,QAAQ,aAAa,SAAuBW,GAAG,MAAOC,GAAUD,KAAgH,QAASE,GAAcC,EAASC,GAA4G,QAASC,KAAa,GAAGC,IAASC,EAAU,KAAMC,EAAOC,cAAcC,GAAOF,EAAOG,WAAYH,KAAUF,IAAO,EAAMC,GAAS,EAAmD,QAASK,GAAYC,GAA+F,GAAtD,gBAAhBA,KAAyBA,EAAcA,EAAcC,MAAMC,EAAQ,KAAO7B,EAAQ2B,IAAuC,IAAvBA,EAAcJ,OAAW,KAAM,IAAIO,OAAM,iBAAiBH,EAAeI,GAAa,GAAIC,QAAO/B,EAAa0B,EAAc,IAAI,QAAQM,EAAa,GAAID,QAAO,OAAO/B,EAAa0B,EAAc,KAAKO,EAAe,GAAIF,QAAO,OAAO/B,EAAa,IAAI0B,EAAc,KAAjrB,IAAIV,EAAS,QAAS,IAA2Nc,GAAaE,EAAaC,EAAjPC,KAAgBX,KAAcF,KAAcF,GAAO,EAAUC,GAAS,CAAslBK,GAAYR,GAAMvB,EAASuB,KAAmF,KAA7E,GAAsCkB,GAAMC,EAAKC,EAAMC,EAAIC,EAAMC,EAA7DC,EAAQ,GAAIC,GAAQ1B,IAA4DyB,EAAQE,OAAM,CAAyD,GAAxDR,EAAMM,EAAQG,IAAIP,EAAMI,EAAQI,UAAUf,GAAwB,IAAI,GAAIgB,GAAE,EAAEC,EAAYV,EAAMf,OAASyB,EAAFD,IAAgBA,EAAGR,EAAID,EAAMW,OAAOF,GAAMrC,EAAa6B,GAAMjB,EAAO4B,KAAK1B,EAAOD,QAAaF,GAAS,EAAKG,EAAO0B,MAAM,OAAOX,EAAIH,EAAMA,EAAM,IAAIA,GAAO,EAAW,OAANG,GAAWpB,GAAc,KAAIuB,EAAQS,KAAKpB,GAAc,KAAuV,IAAjVX,GAAO,EAAKiB,EAAKK,EAAQS,KAAKC,IAAQ,OAAOV,EAAQS,KAAKE,GAAmB,MAAPhB,GAAYC,EAAMI,EAAQI,UAAUQ,GAAUZ,EAAQS,KAAKG,GAAUZ,EAAQI,UAAUb,IAA6B,MAAPI,GAAYC,EAAMI,EAAQI,UAAUZ,GAAgBQ,EAAQS,KAAKI,GAASb,EAAQI,UAAUb,GAAcI,EAAK,KAASC,EAAMI,EAAQI,UAAUb,IAAkBS,EAAQS,KAAKlB,GAAc,KAAM,IAAIH,OAAM,mBAAmBY,EAAQG,IAA6D,IAAxDL,GAAOH,EAAKC,EAAMF,EAAMM,EAAQG,KAAKrB,EAAO0B,KAAKV,GAAiB,MAAPH,GAAmB,MAAPA,EAAYF,EAASe,KAAKV,OAAY,IAAU,MAAPH,EAAW,CAA4B,GAA3BI,EAAYN,EAASV,OAAUgB,EAAY,KAAM,IAAIX,OAAM,qBAAqBQ,EAAM,QAAQF,EAAO,IAAGK,EAAY,KAAKH,EAAM,KAAM,IAAIR,OAAM,qBAAqBW,EAAY,GAAG,QAAQL,OAAsB,SAAPC,GAAsB,MAAPA,GAAmB,MAAPA,EAAYhB,GAAS,EAAoB,MAAPgB,GAAYX,EAAYY,GAAmC,GAA3BG,EAAYN,EAASV,MAAqB,KAAM,IAAIK,OAAM,qBAAqBW,EAAY,GAAG,QAAQC,EAAQG,IAAK,OAAOW,GAAWC,EAAajC,IAAS,QAASiC,GAAajC,GAAkD,IAAI,GAApBgB,GAAMkB,EAA5BC,KAA8CZ,EAAE,EAAEa,EAAUpC,EAAOD,OAASqC,EAAFb,IAAcA,EAAGP,EAAMhB,EAAOuB,GAAMP,IAAqB,SAAXA,EAAM,IAAakB,GAA0B,SAAfA,EAAU,IAAaA,EAAU,IAAIlB,EAAM,GAAGkB,EAAU,GAAGlB,EAAM,KAAQmB,EAAeT,KAAKV,GAAOkB,EAAUlB,GAAQ,OAAOmB,GAAe,QAASH,GAAWhC,GAAyF,IAAI,GAAlBgB,GAAMqB,EAArEC,KAAoBC,EAAUD,EAAiB3B,KAAsCY,EAAE,EAAEa,EAAUpC,EAAOD,OAASqC,EAAFb,IAAcA,EAAmB,OAAhBP,EAAMhB,EAAOuB,GAAUP,EAAM,IAAI,IAAI,IAAI,IAAI,IAAIuB,EAAUb,KAAKV,GAAOL,EAASe,KAAKV,GAAOuB,EAAUvB,EAAM,KAAM,MAAM,KAAI,IAAIqB,EAAQ1B,EAASV,MAAMoC,EAAQ,GAAGrB,EAAM,GAAGuB,EAAU5B,EAASZ,OAAO,EAAEY,EAASA,EAASZ,OAAO,GAAG,GAAGuC,CAAa,MAAM,SAAQC,EAAUb,KAAKV,GAAQ,MAAOsB,GAAa,QAASnB,GAAQzC,GAAQR,KAAKQ,OAAOA,EAAOR,KAAKsE,KAAK9D,EAAOR,KAAKmD,IAAI,EAA4iB,QAASoB,GAAQC,EAAKC,GAAezE,KAAKwE,KAAKA,EAAKxE,KAAK0E,OAAOC,IAAI3E,KAAKwE,MAAMxE,KAAK4E,OAAOH,EAA2qB,QAASI,KAAS7E,KAAK0E,SAA3uK,GAAII,GAAeC,OAAOC,UAAUC,SAAa3E,EAAQ4E,MAAM5E,SAAS,SAAyBH,GAAQ,MAAqC,mBAA9B2E,EAAe/D,KAAKZ,IAAiVW,EAAWwB,OAAO0C,UAAUG,KAA0ElE,EAAW,KAA4EI,GAAW+D,IAAI,QAAQC,IAAI,OAAOC,IAAI,OAAOC,IAAI,SAASC,IAAI,QAAQC,IAAI,UAAqI9B,EAAQ,MAAUxB,EAAQ,MAAUyB,EAAS,OAAWC,EAAQ,QAAYH,EAAM,oBAAi/FT,GAAQ+B,UAAU9B,IAAI,WAAe,MAAmB,KAAZlD,KAAKsE,MAAWrB,EAAQ+B,UAAUvB,KAAK,SAAc5C,GAAI,GAAI6E,GAAM1F,KAAKsE,KAAKoB,MAAM7E,EAAI,KAAI6E,GAAqB,IAAdA,EAAMC,MAAU,MAAM,EAAG,IAAInF,GAAOkF,EAAM,EAAwE,OAArE1F,MAAKsE,KAAKtE,KAAKsE,KAAKsB,UAAUpF,EAAOqB,QAAQ7B,KAAKmD,KAAK3C,EAAOqB,OAAcrB,GAAQyC,EAAQ+B,UAAU5B,UAAU,SAAmBvC,GAAI,GAA+B6E,GAA3BC,EAAM3F,KAAKsE,KAAKuB,OAAOhF,EAAU,QAAO8E,GAAO,IAAI,GAAGD,EAAM1F,KAAKsE,KAAKtE,KAAKsE,KAAK,EAAG,MAAM,KAAK,GAAEoB,EAAM,EAAG,MAAM,SAAQA,EAAM1F,KAAKsE,KAAKsB,UAAU,EAAED,GAAO3F,KAAKsE,KAAKtE,KAAKsE,KAAKsB,UAAUD,GAA8B,MAAvB3F,MAAKmD,KAAKuC,EAAM7D,OAAc6D,GAAgHnB,EAAQS,UAAUxB,KAAK,SAAcgB,GAAM,MAAO,IAAID,GAAQC,EAAKxE,OAAOuE,EAAQS,UAAUc,OAAO,SAAgBC,GAAM,GAAyBnD,GAArB8B,EAAM1E,KAAK0E,KAAgB,IAAGA,EAAMsB,eAAeD,GAAOnD,EAAM8B,EAAMqB,OAAU,CAA8C,IAA7C,GAAiBE,GAAMN,EAAnBO,EAAQlG,KAAiBmG,GAAU,EAAYD,GAAQ,CAAC,GAAGH,EAAKK,QAAQ,KAAK,EAAoD,IAAjDxD,EAAMsD,EAAQ1B,KAAKyB,EAAMF,EAAK7D,MAAM,KAAKyD,EAAM,EAAe,MAAP/C,GAAa+C,EAAMM,EAAMpE,QAAW8D,IAAQM,EAAMpE,OAAO,IAAEsE,EAAUzF,EAAYkC,EAAMqD,EAAMN,KAAQ/C,EAAMA,EAAMqD,EAAMN,UAAgB/C,GAAMsD,EAAQ1B,KAAKuB,GAAMI,EAAUzF,EAAYwF,EAAQ1B,KAAKuB,EAAM,IAAGI,EAAU,KAAMD,GAAQA,EAAQtB,OAAOF,EAAMqB,GAAMnD,EAAuD,MAA9C1C,GAAW0C,KAAOA,EAAMA,EAAM7B,KAAKf,KAAKwE,OAAa5B,GAAuCiC,EAAOG,UAAUqB,WAAW,WAAsBrG,KAAK0E,UAAUG,EAAOG,UAAUsB,MAAM,SAAe/E,EAASC,GAAM,GAAIkD,GAAM1E,KAAK0E,MAAU5C,EAAO4C,EAAMnD,EAA8E,OAAzD,OAARO,IAAaA,EAAO4C,EAAMnD,GAAUD,EAAcC,EAASC,IAAaM,GAAQ+C,EAAOG,UAAUuB,OAAO,SAAgBhF,EAASiD,EAAKgC,GAAU,GAAI1E,GAAO9B,KAAKsG,MAAM/E,GAAc2E,EAAQ1B,YAAgBD,GAAQC,EAAK,GAAID,GAAQC,EAAM,OAAOxE,MAAKyG,aAAa3E,EAAOoE,EAAQM,EAASjF,IAAWsD,EAAOG,UAAUyB,aAAa,SAAsB3E,EAAOoE,EAAQM,EAASE,GAAuD,IAAI,GAAvB5D,GAAM6D,EAAO/D,EAA3BgE,EAAO,GAAkCvD,EAAE,EAAEa,EAAUpC,EAAOD,OAASqC,EAAFb,IAAcA,EAAGT,EAAMiE,OAAU/D,EAAMhB,EAAOuB,GAAGsD,EAAO7D,EAAM,GAAe,MAAT6D,EAAa/D,EAAM5C,KAAK8G,cAAchE,EAAMoD,EAAQM,EAASE,GAAmC,MAATC,EAAa/D,EAAM5C,KAAK+G,eAAejE,EAAMoD,EAAQM,EAASE,GAAmC,MAATC,EAAa/D,EAAM5C,KAAKgH,cAAclE,EAAMoD,EAAQM,EAASE,GAAmC,MAATC,EAAa/D,EAAM5C,KAAKiH,eAAenE,EAAMoD,GAA0B,SAATS,EAAgB/D,EAAM5C,KAAKkH,aAAapE,EAAMoD,GAA0B,SAATS,IAAgB/D,EAAM5C,KAAKmH,SAASrE,IAAkB+D,SAARjE,IAAkBgE,GAAQhE,EAAM,OAAOgE,IAAQ/B,EAAOG,UAAU8B,cAAc,SAAuBhE,EAAMoD,EAAQM,EAASE,GAAiF,QAASU,GAAU7F,GAAU,MAAO8F,GAAKd,OAAOhF,EAAS2E,EAAQM,GAAhI,GAAIa,GAAKrH,KAAS4G,EAAO,GAAOhE,EAAMsD,EAAQJ,OAAOhD,EAAM,GAA+E,IAAIF,EAAJ,CAAiB,GAAGtC,EAAQsC,GAAQ,IAAI,GAAI0E,GAAE,EAAEhE,EAAYV,EAAMf,OAASyB,EAAFgE,IAAgBA,EAAGV,GAAQ5G,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQ1C,KAAKZ,EAAM0E,IAAId,EAASE,OAAwB,IAAkB,gBAAR9D,IAAiC,gBAARA,IAAiC,gBAARA,GAAkBgE,GAAQ5G,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQ1C,KAAKZ,GAAO4D,EAASE,OAAuB,IAAGxG,EAAW0C,GAAO,CAAC,GAA6B,gBAAnB8D,GAA4B,KAAM,IAAItE,OAAM,iEAAkEQ,GAAMA,EAAM7B,KAAKmF,EAAQ1B,KAAKkC,EAAiBa,MAAMzE,EAAM,GAAGA,EAAM,IAAIsE,GAAqB,MAAPxE,IAAYgE,GAAQhE,OAAWgE,IAAQ5G,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQM,EAASE,EAAkB,OAAOE,KAAQ/B,EAAOG,UAAU+B,eAAe,SAAwBjE,EAAMoD,EAAQM,EAASE,GAAkB,GAAI9D,GAAMsD,EAAQJ,OAAOhD,EAAM,GAAI,QAAIF,GAAOtC,EAAQsC,IAAuB,IAAfA,EAAMf,OAAkB7B,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQM,EAASE,GAA/F,QAAkH7B,EAAOG,UAAUgC,cAAc,SAAuBlE,EAAMoD,EAAQM,GAAU,GAAIA,EAAJ,CAAoB,GAAI5D,GAAM1C,EAAWsG,GAAUA,EAAS1D,EAAM,IAAI0D,EAAS1D,EAAM,GAAI,OAAU,OAAPF,EAAmB5C,KAAKyG,aAAazG,KAAKsG,MAAM1D,GAAOsD,EAAQM,EAAS5D,GAA3E,SAAmFiC,EAAOG,UAAUiC,eAAe,SAAwBnE,EAAMoD,GAAS,GAAItD,GAAMsD,EAAQJ,OAAOhD,EAAM,GAAI,OAAU,OAAPF,EAAmBA,EAAtB,QAA6BiC,EAAOG,UAAUkC,aAAa,SAAsBpE,EAAMoD,GAAS,GAAItD,GAAMsD,EAAQJ,OAAOhD,EAAM,GAAI,OAAU,OAAPF,EAAmB3C,EAASuH,OAAO5E,GAAtC,QAA8CiC,EAAOG,UAAUmC,SAAS,SAAkBrE,GAAO,MAAOA,GAAM,IAAI7C,EAAS8F,KAAK,cAAc9F,EAASwH,QAAQ,QAAQxH,EAASuB,MAAM,KAAK,KAAM,IAAIkG,GAAc,GAAI7C,EAAO5E,GAASoG,WAAW,WAAsB,MAAOqB,GAAcrB,cAAcpG,EAASqG,MAAM,SAAe/E,EAASC,GAAM,MAAOkG,GAAcpB,MAAM/E,EAASC,IAAOvB,EAASsG,OAAO,SAAgBhF,EAASiD,EAAKgC,GAAU,GAAqB,gBAAXjF,GAAqB,KAAM,IAAIoG,WAAU,wDAA2DvH,EAAQmB,GAAU,kFAAsF,OAAOmG,GAAcnB,OAAOhF,EAASiD,EAAKgC,IAAWvG,EAAS2H,QAAQ,SAAiBrG,EAASiD,EAAKgC,EAASqB,GAAM,GAAIC,GAAO7H,EAASsG,OAAOhF,EAASiD,EAAKgC,EAAU,OAAGtG,GAAW2H,OAAOA,GAAKC,GAAoBA,GAAS7H,EAASuH,OAAOtG,EAAWjB,EAASgD,QAAQA,EAAQhD,EAASsE,QAAQA,EAAQtE,EAAS4E,OAAOA,IAc1vS,SAAUkD,GAiRP,QAASC,GAAmBC,EAAOC,EAAWC,EAAUC,GAEpDH,EAAMI,GAAIH,EAAW,SAAUI,GAG3B,MADAC,GAAW/E,KAAM8E,GACVH,EAASK,MAAO,KAAMJ,KAGL,aAAxBK,SAASC,YAA2C,UAAdR,GAGtCC,EAASK,MAAO,KAAMJ,GAI9B,QAASO,GAAiBC,GAGtB,GAAIX,GAAQF,EAAGa,EAEVX,GAAMY,GAAI,2BAEXZ,EAAMI,GAAI,SAAU,WAGXJ,EAAMY,GAAI,YAEXZ,EAAMa,QAAS,SAIfb,EAAMa,QAAS,aAKtBb,EAAMY,GAAI,wBAEXZ,EAAMI,GAAI,SAAU,WAGhB,GAAIU,GAAad,EAAMe,KAAM,OAE7BjB,GAAG,6BAA+BgB,EAAa,MAAOE,KAAM,SAAU5F,EAAG6F,GAErE,GAAIC,GAASpB,EAAGmB,EACXC,GAAON,GAAI,YAEZM,EAAOL,QAAS,SAIhBK,EAAOL,QAAS,eASpC,QAASM,GAAiBC,EAAOC,GAM7B,IAAM,GAJFC,GAAmB,2CACnBC,EAAmBH,EAAMnH,MAAO,KAChCuH,KAEMpG,EAAI,EAAGA,EAAImG,EAAY3H,OAAQwB,IACzC,CACI,GAAIqG,GAAaF,EAAYnG,GAAGsG,MAEhC,IAAMD,GAKAH,EAAiBpE,KAAMuE,GAA7B,CAMA,GAAIhE,GAAQgE,EAAWhE,MAAO6D,EAE9B,KAAM7D,EAAM,IAAMA,EAAM,GAAG7D,QAAU,EAEjC+H,QAAQC,MAAO,iBAAmBH,EAAa,8BAInD,KAAMhE,EAAM,IAAMA,EAAM,GAAG7D,QAAU,EAEjC+H,QAAQC,MAAO,iBAAmBH,EAAa,0BAFnD,CAMA,GAAII,IACAxB,MAAQ5C,EAAM,IAAM,QACpBqE,QAAQrE,EAAM,GACdsE,OAAQtE,EAAM,GACd0C,UAGJ,IAAO1C,EAAM,IAAMA,EAAM,GAAG7D,OAAS,EAGjC,IAAM,GADFuG,GAAS1C,EAAM,GAAGA,MAAO,yCACnB4B,EAAI,EAAGA,EAAIc,EAAOvG,OAAQyF,IACpC,CACI,GAAI2C,GAAQ7B,EAAOd,GAAGqC,MAChBO,OAAOC,WAAYF,IAIQ,QAAvBA,EAAMG,cAEZN,EAAU1B,OAAO5E,MAAM,GAEM,SAAvByG,EAAMG,cAEZN,EAAU1B,OAAO5E,MAAM,GAEM,QAAvByG,EAAMG,cAEZN,EAAU1B,OAAO5E,KAAM8F,GAIvBQ,EAAU1B,OAAO5E,KAAMyG,EAAMxJ,QAAS,eAAgB,KAhBtDqJ,EAAU1B,OAAO5E,KAAM2G,WAAYF,IAqB/CR,EAAWjG,KAAMsG,KAGrB,MAAOL,GAuNX,QAASY,GAAkBC,EAAWC,EAAgBC,GAElDA,EAAkBA,KAIlB,KAAM,GADFC,MACMpH,EAAI,EAAGA,EAAIiH,EAAUI,aAAa7I,OAAQwB,IACpD,CACI,GAAIsH,GAAaL,EAAUI,aAAarH,EACxC,IAAK0E,EAAE6C,QAASD,EAAYH,GAAoB,EAChD,CAII,GAFAA,EAAgBhH,KAAMmH,GAEjBE,EAAWC,UAAU9E,eAAgB2E,GAC1C,CAEUI,gBAAgBD,UAAU9E,eAAgB2E,IAG5CN,EAAkBQ,EAAWC,UAAUH,GAAa,EAAGH,GAE3DC,EAAqBjH,KAAMuH,gBAAgBD,UAAUH,GACrD,UAGJ,GAAuB,GAAlBJ,GAAuBM,EAAWG,SAAShF,eAAgB2E,GAChE,CAEUI,gBAAgB/F,UAAUgB,eAAgB2E,IAG5CN,EAAkBQ,EAAWG,SAASL,GAAa,EAAGH,GAE1DC,EAAqBjH,KAAMuH,gBAAgB/F,UAAU2F,GACrD,UAGJ,GAAuB,GAAlBJ,GAAuBM,EAAWpB,WAAWzD,eAAgB2E,GAClE,CAEUI,gBAAgBtB,WAAWzD,eAAgB2E,IAG7CN,EAAkBQ,EAAWpB,WAAWkB,GAAa,EAAGH,GAE5DC,EAAqBjH,KAAMuH,gBAAgBtB,WAAWkB,GACtD,UAGJf,QAAQC,MAAO,6BAA+Bc,EAAa,4BAI3Df,SAAQC,MAAO,gCAAkCW,EAAgBS,KAAM,QAAW,OAASN,GAK5E,GAAlBJ,EAEDQ,gBAAgBD,UAAUR,EAAUvE,MAAQuE,EAAUY,MAAM1C,MAAO,KAAMiC,GAEjD,GAAlBF,EAENQ,gBAAgB/F,UAAUsF,EAAUvE,MAAQuE,EAAUY,MAAM1C,MAAO,KAAMiC,GAEjD,GAAlBF,IAENQ,gBAAgBtB,WAAWa,EAAUvE,MAAQuE,EAAUY,MAAM1C,MAAO,KAAMiC,IAjrBlF,GAAIhD,GAAU,QASVoD,GACAC,aACAE,YACAvB,cAQJsB,iBAAkB,YAIlB,IAAII,GAA0B,IAC9BJ,iBAAgBK,YAAc,WAG1B,MADAD,GAAWA,GAAY,GAAIJ,kBAI/BA,gBAAgBtD,QAAU,WAYtB,QAAS4D,GAASA,GAKd,IAAK,GAHDC,GAAe7D,EAAQvF,MAAM,KAC7BqJ,EAAiBF,EAAQnJ,MAAM,KAE1BmB,EAAI,EAAGA,EAAIkI,EAAe1J,OAAQwB,IAEvC,GAAIiI,EAAajI,KAAOkI,EAAelI,IAA4B,MAAtBkI,EAAelI,GAA5D,CAKA,GAAImI,SAASF,EAAajI,IAAMmI,SAASD,EAAelI,IAEpD,MAAO,EAGX,IAAImI,SAASF,EAAajI,IAAMmI,SAASD,EAAelI,IAEpD,MAAO,GAGf,MAAO,GAhCX,OACIoI,IAAK,WACD,MAAOhE,IAEXiE,OAAQ,SAAUC,GACd,MAAqB,IAAdN,EAAQM,IAEnBN,QAASA,MAqCjBN,gBAAgBvE,YAQhBuE,gBAAgBa,WAUhBb,gBAAgBc,UAAY,SAAUC,EAAYlJ,GAE9C,MAAKmI,iBAAgBa,QAAQ5F,eAAgB8F,IAEzClC,QAAQC,MAAO,oBAAsBiC,EAAa,8CAC3C,OAGXf,gBAAgBa,QAAQE,GAAclJ,EAE/BmI,gBAAgBa,QAAQE,KAUnCf,gBAAgBgB,UAAY,SAAUD,EAAYE,GAE9C,MAAKjB,iBAAgBa,QAAQ5F,eAAgB8F,GAItCf,gBAAgBa,QAAQE,GAFpBE,GAUfjB,gBAAgBtB,cAYhBsB,gBAAgBjB,UAAY,SAAUmC,EAAeC,EAAoBxB,GAGrE,MAA8B,gBAAlBuB,OAERrC,SAAQC,MAAO,kEAAqEoC,GAAgB,YAKrE,kBAAvBC,OAERtC,SAAQC,MAAO,qEAAwEqC,GAAqB,aAIhHxB,EAAeA,WAEfG,EAAWpB,WAAWwC,IAClBlG,KAAckG,EACdvB,aAAcA,EACdQ,MAAcgB,MAStBnB,gBAAgB/F,UAAUmH,eAAiB,SAAUC,GAGjDA,EAAcA,GAAe,OAE7BrE,EAAGqE,GAAcC,KAAM,iBAAkBpD,KAAM,SAAU5F,EAAGuF,GAGxD,GAAIa,GAAaL,EAAiBrB,EAAGa,GAAUI,KAAM,eAAiBjB,EAAGa,GAEzE,MAAKa,EAAW5H,QAAU,GAA1B,CAMA8G,EAAiBC,EAEjB,KAAM,GAAIvF,GAAI,EAAGA,EAAIoG,EAAW5H,OAAQwB,IACxC,CACI,GAAIyG,GAAYL,EAAWpG,EAC3B,IAAO0H,gBAAgBtB,WAAWK,EAAAA,WAAoBiB,gBAAgBtB,WAAWzD,eAAgB8D,EAAAA,UACjG,CAEI,GAAI3B,GAAW4C,gBAAgBtB,WAAWK,EAAAA,UAAiBA,EAAUE,OAC9D7B,IAA+B,kBAAZA,GAGE,SAAnB2B,EAAUxB,MAEXH,EAASK,MAAO,KAAMsB,EAAU1B,QAIhCJ,EAAmBD,EAAGa,GAAWkB,EAAUxB,MAAOH,EAAU2B,EAAU1B,QAa1EwB,QAAQC,MAAO,qBAAuBC,EAAUE,OAAS,OAASF,EAAAA,cAMtEF,SAAQC,MAAO,wBAA0BC,EAAAA,cAKrD/B,EAAGU,UAAWK,QAAS,eAAgBsD,GAG3C,IAAI7D,KAEJwC,iBAAgBuB,eAAiB,SAAUpE,GAEvC,GAAIqE,GAAehE,EAAW1G,OAAS,CACvC,KAAMqG,EAEF,MAAOK,GAAWgE,EAIlB,KAAM,GAAIlJ,GAAIkJ,EAAclJ,GAAK,EAAGA,IAEhC,GAAK6E,GAAaK,EAAWlF,GAAGV,KAE5B,MAAO4F,GAAWlF,EAK9B,OAAO,OAIX0H,gBAAgByB,UAAY,SAAUlE,GAElCC,EAAW/E,KAAM8E,IAgKrByC,gBAAgB0B,QAAU,SAAUC,EAAaC,EAAkBjC,GAI/D,MAA4B,gBAAhBgC,OAER9C,SAAQC,MAAO,kEAAqE6C,GAAc,YAKrE,kBAArBC,OAER/C,SAAQC,MAAO,qEAAwE8C,GAAmB,aAI9GjC,EAAeA,WAEfG,EAAWG,SAAS0B,IAChB3G,KAAc2G,EACdhC,aAAcA,EACdQ,MAAcyB,MAWtB5B,gBAAgBD,aAUhBC,gBAAgBrL,QAAU,SAAUkN,EAAaC,EAAkBnC,GAI/D,MAA4B,gBAAhBkC,OAERhD,SAAQC,MAAO,kEAAqE+C,GAAc,YAKrE,kBAArBC,OAERjD,SAAQC,MAAO,qEAAwEgD,GAAmB,aAI9GnC,EAAoCA,WACpCG,EAAWC,UAAU8B,IACjB7G,KAAc6G,EACdlC,aAAcA,EACdQ,MAAc2B,MActB9B,gBAAgB+B,gBAAkB,SAAUvL,EAAUwL,GAUlD,MARAA,GAAiBA,MACjBA,EAAKC,UAAY,WAEb,MAAO,UAAUC,EAAM1G,GAEnB,MAAOA,GAAQwE,gBAAgBiC,UAAWC,MAG3ClN,SAASwG,OAAQ/G,cAAc+B,GAAWwL,IASrDhC,gBAAgBmC,WAAa,GAQ7BnC,gBAAgBoC,WAQhBpC,gBAAgBqC,iBAAmB,SAAUC,GAEzCtF,EAAEuF,MACEC,IAAMxC,gBAAgBmC,WAAaG,EACnCG,SAAU,SACXC,KAAM,SAAUC,GACf3C,gBAAgBoC,QAAUO,KAclC3C,gBAAgBiC,UAAY,SAAUxM,EAAQ4H,GAE1C,GAAIuF,EAgBJ,OAfK5C,iBAAgBoC,QAAQnH,eAAgBxF,GAEzCmN,EAAe5C,gBAAgBoC,QAAQ3M,IAIvCmN,EAAenN,EACfoJ,QAAQgE,KAAM,6BAA+BD,EAAe,OAGzDvF,IAEHuF,EAAe5N,SAASwG,OAAQoH,EAAcvF,IAG3CuF,GASX5C,gBAAgB8C,QAAU,WAGtB,IAAM,GAAInO,KAAWmL,GAAWC,UAEtBC,gBAAgBD,UAAU9E,eAAgBtG,IAG5C2K,EAAkBQ,EAAWC,UAAUpL,GAAU,EAIzD,KAAM,GAAI+M,KAAW5B,GAAWG,SAEtBD,gBAAgB/F,UAAUgB,eAAgByG,IAG5CpC,EAAkBQ,EAAWG,SAASyB,GAAU,EAIxD,KAAM,GAAI3C,KAAae,GAAWpB,WAExBsB,gBAAgBtB,WAAWzD,eAAgB8D,IAG7CO,EAAkBQ,EAAWpB,WAAWK,GAAY,EAK5D,KAAK,GADDgE,GAAUrF,SAASsF,qBAAsB,UACpC1K,EAAIyK,EAAQjM,OAAS,EAAGwB,GAAK,EAAGA,IAAM,CAC3C,GAAI2K,GAAOF,EAAQzK,GAAG4K,IAAIvI,MAAO,0BACjC,IAAMsI,EAAO,CACTjD,gBAAgBmC,WAAac,EAAK,EAClC,WAgFbE,QAcF,SAAUnG,EAAGoG,GAEVA,EAAGrE,UAAW,iBAAkB,SAAUsE,GAMtC,QAASC,GAAOC,GAEZH,EAAG7B,iBAAiBiC,iBACpBH,EAAsBI,cAAezG,EAAGuG,IAP5C,OACID,MAAOA,KAQX,2BAELH,OAAQnD,iBACV,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,SAAU,SAAU2E,GAS9B,QAASC,GAAeJ,GAEpBH,EAAG7B,iBAAiBiC,gBAEpB,IAAII,MACA1G,EAAkBF,EAAGuG,GACrBM,EAAkB3G,EAAM4G,QAAS,OAErCF,GAAgBG,iBAAqBF,EAAWvC,KAAM,sBAAuB0C,MAC7EJ,EAAgBK,kBAAqBJ,EAAWvC,KAAM,qBAAsB0C,MAC5EJ,EAAgBM,mBAAqBL,EAAWvC,KAAM,4BAA6B0C,MACnFJ,EAAgBO,mBAAqBN,EAAWvC,KAAM,4BAA6B0C,KAGnF,IAAII,GAAsBP,EAAWvC,KAAM,8BACvC+C,IAEJrH,GAAEkB,KAAMkG,EAAqB,SAAUE,EAAKf,GAExC,GAAI5I,GAAQ4I,EAAKvI,KAAKL,MAAO,yCACxBA,IAASA,EAAM,IAEhB0J,EAAe5L,MACX8L,sBAA4B5J,EAAM,GAClC6J,2BAA4BxH,EAAGuG,GAAOS,UAKpB,GAAzBK,EAAevN,SAEhB8M,EAAgBa,yBAA2BJ,GAI/CX,EAAcgB,SAAUd,IAI5B,QAASe,GAAoBpB,EAAMqB,GAE/B,GAAI1H,GAAiBF,EAAGuG,GACpBsB,EAAiB3H,EAAMrD,SAASyH,KAAM,SACtCwD,EAAiBrE,SAAUoE,EAAe5G,KAAM,eAAmB,EACnEpG,EAAiB4I,SAAUoE,EAAeb,OAAUY,EAEpDG,EAAe7H,EAAM4G,QAAS,yBAA0BhN,OAAS,CAErE,IAAKiO,EACL,EACUlN,EAAQ,IAAIf,QAAUgO,GAAajN,GAAS,GAE9CgN,EAAeb,IAAKnM,EAGxB,IAAImN,GAAU9H,EAAM8E,KAAM,UAEnBgD,IAEHC,OAAOC,aAAcF,GAGzBA,EAAUC,OAAOE,WAAY,WAEzBN,EAAe9G,QAAS,WACzB,KAEHb,EAAM8E,KAAM,UAAWgD,QAIjBnN,EAAQ,IAAIf,QAAUgO,GAAajN,GAAS,GAE9CgN,EAAeb,IAAKnM,GAKhC,QAASuN,GAAiBC,EAAc/G,GAEpCoF,EAAc0B,gBACVC,EACA5E,SAAUzD,EAAGsB,GAAQ0F,QACvBsB,KAAM,WAGJ,GAAIC,GAAa7B,EAAc8B,QAASH,EACxCrI,GAAGsB,GAAQ0F,IAAKuB,EAAWrB,sBA7FnC,OACIP,cAAoBA,EACpBgB,mBAAoBA,EACpBS,gBAAoBA,KA8FxB,mBACLjC,OAAQnD,iBACX,SAAWhD,EAAGoG,GAEVA,EAAGrE,UAAW,WAAY,SAAU0G,GAQhC,QAASC,GAAoBC,GAEzBF,EAAgBC,mBAAoBC,GAGxC,QAASC,GAAqBC,GAE1BJ,EAAgBG,oBAAqBC,GAZzC,OACIH,mBAAoBA,EACpBE,oBAAqBA,KAYzB,qBACJzC,OAAQnD,iBAcX,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,iBAAkB,SAAU+G,GActC,QAASC,KAEL/I,EAAGiI,QAAS3H,GAAI,+BAAgC,WAE5C0I,EAAgBC,GAChBD,EAAgBE,KAIpBlJ,EAAG,QAASM,GAAI,mBAAoB,SAAUC,GAE1CyI,EAAgBE,EAA0B3I,KAIlD,QAASyI,GAAgBG,EAAc5I,GAGnC,IAAM,GADF6I,GACM9N,EAAI,EAAGA,EAAI6N,EAAarP,OAAQwB,IAEtC8N,EAAWpJ,EAAGmJ,EAAa7N,IACpBiF,EAEgD,IAA9C6I,EAAS9E,KAAMtE,EAAGO,EAAM8I,SAAWvP,QAEpCsP,EAASE,YAAa,QAK1BF,EAASE,YAAa,QAMlC,QAASC,GAAchD,EAAMiD,GAEzB,GAAItJ,GAAUF,EAAGuG,GACbkD,EAAUvJ,EAAMrD,QAKb2M,KAAqBV,EAAUY,WAAY,WAAgBC,UAAUC,OAASd,EAAUY,WAAY,aAEjGD,EAAQ3I,GAAI,SAYRZ,EAAMe,KAAM,SAGdwI,EAAQH,YAAa,SAbzBO,EAAwB3J,EAAOuJ,GAGzBvJ,EAAMe,KAAM,SAEd6I,EAAgCL,EAAQM,IAAK7J,OAenDsJ,GAAqBG,UAAUC,OAASd,EAAUY,WAAY,YAE1DD,EAAQ3I,GAAI,WAEd+I,EAAwB3J,EAAOuJ,GAE/BK,EAAgCL,KAU5C,QAASI,GAAwBtD,EAAM1J,GAEnC,GAAI4M,GAAUzJ,EAAGnD,EAGjBmM,GAAgBE,GAGXlJ,EAAE6C,QAAS4G,EAAQ,GAAIP,GAA6B,GAErDA,EAAyBzN,KAAMgO,EAAQ,IAI3CA,EAAQO,SAAU,QAGtB,QAASF,GAAgCvD,GAErC,GAAIrG,GAAQF,EAAGuG,EAGfH,GAAG7B,iBAAiBiC,iBAGpBtG,EAAM+J,IAAK,SACX/J,EAAMI,GAAI,QAAS,SAAU4J,GAEzBA,EAAEC,oBAIV,QAASC,GAAe7D,GAEpB,GAAIrG,GAAcF,EAAGuG,GACjB8D,EAAcnK,EAAMrD,QAInBiM,GAAUY,WAAY,YAEvBW,EAAYL,SAAU,aACtB9J,EAAMoK,SAAU,MAAOC,YAAa,IAAK,WAEhCF,EAAYvJ,GAAI,SAEjBuJ,EAAYf,YAAa,SAIzBe,EAAYL,SAAU,QACjBhK,EAAE6C,QAASwH,EAAY,GAAIpB,GAAqB,GAEjDA,EAAiBxN,KAAM4O,EAAY,KAG3CnK,EAAMoK,SAAU,MAAOE,WAAY,SACnCH,EAAYf,YAAa,gBAxJrC,GAAIL,MAGAC,IAEJ,QACIH,cAAeA,EACfQ,aAAeA,EACfa,cAAeA,KAqJnB,sBACLjE,OAAQnD,iBACV,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,WAAY,SAAU0I,EAAkBC,GAQlD,QAASC,GAAIC,GAE2B,MAA/BH,EAAiBI,aAEG,gBAATD,IAA0C,IAArBA,EAAKvM,QAAQ,MAAc2B,EAAG4K,GAAO9Q,OAAS,EAE3EmO,OAAO6C,SAASC,OAAQ/K,EAAG4K,GAAO3J,KAAM,SAIxCgH,OAAO6C,SAASC,OAAQH,IAKpC,QAASI,GAAeC,GAEpBP,EAAiBQ,OAAQD,GAtB7B,OACIN,GAAeA,EACfK,cAAeA,KAuBnB,mBAAoB,sBACzB7E,OAAQnD,iBACX,SAAWhD,EAAGoG,GAEVA,EAAGrE,UAAW,MAAO,SAAU+G,GAY3B,QAASqC,GAASC,GAEdpL,EAAGoL,GAAcC,IAAK,QAG1B,QAASC,GAAiBpL,EAAO+K,EAAOM,GAE9BC,EAAUD,KAEZC,EAAUD,GAAW,GAAIE,IAGvBD,EAAUD,GAASG,OAAQT,IAE7BO,EAAUD,GAASI,OAAQV,GAG/BO,EAAUD,GAASG,OAAQT,GAAQW,SAAU1L,GAGjD,QAAS2L,GAAe3L,EAAO+K,EAAOM,GAE5BC,EAAUD,KAEZC,EAAUD,GAAW,GAAIE,IAGvBD,EAAUD,GAASG,OAAQT,IAE7BO,EAAUD,GAASI,OAAQV,GAG/BO,EAAUD,GAASG,OAAQT,GAAQa,WAAY5L,GAGnD,QAAS6L,GAAed,EAAOM,EAASV,GAE/B/B,EAAUY,WAAYmB,KAEvBzE,EAAG7B,iBAAiBiC,iBAEbgF,EAAUD,IAAcC,EAAUD,GAASG,OAAQT,IAEtDO,EAAUD,GAASJ,QAASF,IAMxC,QAASQ,KAYL,QAASE,GAAQV,GAGb,MADAe,GAAKf,GAAS,GAAIgB,GAAKhB,GAChBe,EAAKf,GAGhB,QAASE,GAASF,GAEd,GAAIiB,GAAS,CACb,IAAOC,EAGHD,EAASzI,SAAU0I,EAAUC,aAAavP,SAASwP,IAAK,WACxDF,EAAUG,OACVH,EAAUC,aAAavP,SAASwP,IAAK,SAAUH,EAAS,OAG5D,CAEI,IAAM,GAAIb,KAAOW,GAEb,GAAOA,EAAKX,GAAKe,aACjB,CACI,GAAIG,GAAW9I,SAAUuI,EAAKX,GAAKe,aAAavP,SAASwP,IAAK,YAC/C,GAAVH,GAA0BA,EAAXK,KAEhBL,EAASK,GAEbP,EAAKX,GAAKiB,OAIlB,IAAM,GAAIjB,KAAOW,GAENA,EAAKX,GAAKe,cAEbJ,EAAKX,GAAKe,aAAavP,SAASwP,IAAK,SAAUH,EAAS,EAIhElM,GAAGiI,QAAS3H,GAAI,aAAckM,GAGlCL,EAAYH,EAAKf,GACjBkB,EAAUC,aAAavP,SAASwP,IAAK,SAAUH,GAC/CC,EAAUM,OAGd,QAASf,GAAQT,GAEb,MAAOe,GAAKf,GAGhB,QAASuB,KAEL,IAAM,GAAInB,KAAOW,GAENA,EAAKX,GAAKe,cAEbJ,EAAKX,GAAKoB,MAIlBN,GAAY,KAzEhB,GACIA,GADAH,IAGJ,QACIL,OAAWA,EACXR,QAAWA,EACXO,OAAWA,EACXc,UAAWA,GAsEnB,QAASP,GAAKS,GAeV,QAASC,KAEL,MAAO1B,GAGX,QAASW,GAAUgB,GAGf,MADAC,GAAQpR,KAAMmR,GACP3U,KAGX,QAAS6T,GAAYgB,GAGjB,MADAC,GAAWD,EACJ7U,KAGX,QAASmU,KAEL,MAAOW,GAGX,QAASN,KAEL,IAAM,GAAInR,GAAI,EAAGA,EAAIuR,EAAQ/S,OAAQwB,IAEjCuR,EAAQvR,GAAG0O,SAAU,SAGlB+C,IAEHA,EAASN,OAAOzC,SAAU,MAKlC,QAASsC,KAEL,IAAM,GAAIhR,GAAI,EAAGA,EAAIuR,EAAQ/S,OAAQwB,IAEjCuR,EAAQvR,GAAGgO,YAAa,SAGrByD,IAEHA,EAAST,OAAOhD,YAAa,MA1DrC,GAAIyD,GACAF,KACA5B,EAAUyB,CAEd,QACId,SAAYA,EACZE,WAAYA,EACZM,WAAYA,EACZO,MAAYA,EACZF,KAAYA,EACZH,KAAYA,GArJpB,GAAId,KAEJ,QACIL,QAAiBA,EACjBG,gBAAiBA,EACjBO,cAAiBA,EACjBE,cAAiBA,KAoMrB,sBACJ5F,OAAQnD,iBASX,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,KAAM,SAAU0I,EAAkBuC,EAAoBC,GAyBhE,QAASC,KAGLlN,EAAGiI,QAAS3H,GAAI,4BAA6B,WAEzC6M,MAGJnN,EAAGiI,QAAS3H,GAAI,gBAAiB,WAExB8M,EAAgBtT,OAAS,IAErBkG,EAAGU,UAAW2M,YAAc,IAE7BC,EAAmBF,EAAiB,WAAY,WAIhDE,EAAmBF,EAAiB,cAAe,cAUnE,QAASG,KAELN,EAAUM,iBAOd,QAASC,GAAgBC,GAErBR,EAAUO,eAAgBC,GAqB9B,QAASC,GAAsBnH,GAE3BvG,EAAGuG,GAAOoH,aACNC,YAAiB,EACjBC,gBAAiB,EACjBC,WAAiB,IACjBC,gBAAiB,IACjBC,YAAiB,EACjBC,SAAiB,IACjBC,aAAiB,EACjBC,UAAiB,SAAUC,GAEvBpO,EAAGoO,GAAU9J,KAAM,gCAAiCvD,QAAS,aAczE,QAASsN,GAAa9H,EAAM+H,EAAYC,GAEpC,GAAIrO,GAAmBF,EAAGuG,GACtBiI,EAAmB,EACnBC,KACAC,EAAmBxO,EAAMoE,KAAM,oCAAqCxK,OAAS,EAAIoG,EAAMoE,KAAM,oCAAuCpE,EAAMyO,UAGzIJ,MAAkB,GAEnBK,EAAuBnT,KAAM8K,EAGjC,KAAM,GAAIjL,GAAIoT,EAAiB5U,OAAQwB,GAAK,EAAGA,IAE3CmT,EAAezO,EAAG0O,EAAiBpT,IACnCmT,EAAapC,IAAK,SAAU,IAEvBoC,EAAaI,aAAa,GAASL,IAEpCA,EAAYC,EAAaI,aAAa,MAIxCP,GAAc7D,EAAiBf,WAAY4E,KAE7CI,EAAiBI,OAAQN,GAYjC,QAASO,GAAWxI,GAEhB,GAAIrG,GAAQF,EAAGuG,EAEfrG,GAAM8O,MAAO,WAKT,MAHAhP,GAAG,cAAeiP,SACd5B,UAAW,GACZ,MACI,IAGJrN,EAAE6C,QAAS3C,EAAOkN,IAErBA,EAAgB3R,KAAMyE,GAW9B,QAASgP,GAAc3I,EAAM4I,GAEzB,GAAIjP,GAAQF,EAAGuG,EAEfrG,GAAMkP,UACFD,OAAQA,IAEPjP,EAAMY,GAAI,QAEXZ,EAAMI,GAAI,SAAU,WAEhBJ,EAAMmM,IAAK,UAAW,kBAYlC,QAASgD,GAAgB9I,GAGrB1E,QAAQyN,IAAK/I,EAEb,IAAIrG,GAAcF,EAAGuG,GACjB8D,EAAcnK,EAAMrD,QAExBwN,GAAYL,SAAU,aACtB9J,EAAMoK,SAAU,MAAOC,YAAa,IAAK,WAEhCF,EAAYvJ,GAAI,SAEjBuJ,EAAYf,YAAa,QAIzBe,EAAYL,SAAU,QAE1B9J,EAAMoK,SAAU,MAAOE,WAAY,SACnCH,EAAYf,YAAa,eAYjC,QAASiG,GAAiBhJ,EAAMiJ,GAE5B,GAAItP,GAAiBF,EAAGuG,GACpBkJ,EAAiBzP,EAAGE,EAAMe,KAAM,mBAEpC,IAAKf,EAAMY,GAAI,uBACf,CAEI,GAAI4O,GAAmB1P,EAAG,6BAAiCE,EAAMe,KAAM,QAAa,MAChF0O,GAAoBH,GAAsB,WAAXA,CAEnCE,GAAgBE,OAAQ,WAEpB,GAAIC,GAAQ7P,EAAG/H,KACfwX,GAAe3I,QAAS,oCAAqCuF,IAAK,SAAU,QAEvEwD,EAAM/O,GAAI,aAAgB+O,EAAM,KAAO3P,EAAM,IAA0B,GAApByP,EAGpDF,EAAeK,UAAW,IAAK,WAE3B3C,MAMJsC,EAAeM,QAAS,IAAK,WAEzB5C,YAQZjN,GAAM8O,MAAO,WAIT9O,EAAM8J,SAAU,aAChByF,EAAelF,YAAa,IAAK,WAE7BrK,EAAMoJ,YAAa,aACnBpJ,EAAM8P,YAAa,UACnB7C,QAMhB,QAAS2C,GAAWzG,EAAQ4G,GAExBC,EAAalQ,EAAGqJ,GAAU4G,EAAU,aAGxC,QAASF,GAAS1G,EAAQ4G,GAEtBC,EAAalQ,EAAGqJ,GAAU4G,EAAU,WAGxC,QAAS1F,GAAalB,EAAQ4G,GAE1BC,EAAalQ,EAAGqJ,GAAU4G,EAAU,eAGxC,QAASC,GAAaC,EAASF,EAAUG,GAErCH,EAAWA,GAAY,IACvBE,EAAQrJ,QAAS,oCAAqCuF,IAAK,SAAU,QACrE8D,EAAQC,GAAiBH,EAAU,WAE/B9C,MA8BR,QAASkD,GAAmB9J,EAAM+J,GAE9B,GAAIpQ,GAAUF,EAAGuG,GACbgK,EAAUrQ,EAAMoE,KAAM,oCAG1BpE,GAAMsQ,OAAQ,wCAIRD,EAAQzP,GAAI,YAEdyP,EAAQvG,SAAU,OAItBuG,EAAQjQ,GAAI,QAAS,WAEZiQ,EAAQE,SAAU,SAGiB,WAA/BvQ,EAAMe,KAAM,gBAEbf,EAAMwQ,QAAS,WAEnBH,EAAQjH,YAAa,OAAQU,SAAU,MAEvC9J,EAAMoE,KAAM,0CAA2CgI,OAEvDpM,EAAMoE,KAAM,qBAAsBkM,OAAQxD,EAAmB2D,iBAAkBL,OAuB3F,QAASN,GAAaY,EAAUvH,EAAQwB,GAEpC,GAAIsF,GAAUnQ,EAAGqJ,EAiBjB,IAAK8G,EAAQrJ,QAAS,gBAAiBhN,OAAS,EAChD,CACI,GAAIoG,GAAQiQ,EAAQxB,SAAU,OAE9B,OADAvI,GAAG1E,WAA2B,eAAE0I,cAAelK,IACxC,EAGX,GAAOmJ,GAAYuH,KAAe/F,GAAYJ,EAAiBf,WAAYmB,IAC3E,CACI,GAAIX,GAAI9D,EAAG7B,gBAOX,OANO2F,IAEHA,EAAE1D,iBAGN2J,EAAQH,YAAaY,IACd,GAIf,QAAS5G,GAAU4G,EAAUvH,EAAQwB,GAEjC,GAAOxB,GAAYuH,KAAe/F,GAAYJ,EAAiBf,WAAYmB,IAC3E,CACI,GAAIX,GAAI9D,EAAG7B,gBAOX,OANO2F,IAEHA,EAAE1D,iBAGNxG,EAAGqJ,GAASW,SAAU4G,IACf,GAIf,QAAStH,GAAasH,EAAUvH,EAAQwB,GAEpC,GAAOxB,GAAYuH,KAAe/F,GAAYJ,EAAiBf,WAAYmB,IAC3E,CACI,GAAIX,GAAI9D,EAAG7B,gBAOX,OANO2F,IAEHA,EAAE1D,iBAGNxG,EAAGqJ,GAASC,YAAasH,IAClB,GAQf,QAASzD,KAEL,IAAM,GAAI7R,GAAIsT,EAAuB9U,OAAS,EAAGwB,GAAK,EAAGA,IAErD+S,EAAaO,EAAuBtT,GAAI,IAAI,GAIpD,QAASgS,GAAmBuD,EAAOC,EAAMzQ,GAErC,IAAM,GAAI/E,GAAIuV,EAAM/W,OAAS,EAAGwB,GAAK,EAAGA,IAEpCuV,EAAMvV,GAAGwV,GAAOzQ,GAldxB,GAAIuO,MACAxB,IAEJ,QACIF,mBAAsBA,EACtBK,eAAsBA,EACtBC,eAAsBA,EACtBE,qBAAsBA,EACtBW,YAAsBA,EACtBU,UAAsBA,EACtBG,aAAsBA,EACtBK,gBAAsBA,EACtBO,UAAsBA,EACtBC,QAAsBA,EACtBxF,YAAsBA,EACtB8E,eAAsBA,EACtBgB,kBAAsBA,EACtBL,YAAsBA,EACtBhG,SAAsBA,EACtBV,YAAsBA,KAmc1B,mBAAoB,qBAAsB,eAC/CnD,OAAQnD,iBACV,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,YAAa,SAAUgP,GAOjC,QAASC,GAAUC,EAAMC,GAErB,MAAOH,GAAkBC,SAAUC,EAAMC,GAN7C,OACIF,SAAUA,KAQd,uBACL7K,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAaVA,EAAGzO,QAAS,aAAc,SAAUwZ,EAAIC,GAiBpC,QAASC,KAECjL,EAAGpC,UAAW,kBAKbsN,GAEHpJ,aAAcoJ,GAGlBA,EAA2BnJ,WAAY,WAEnCnI,EAAGiI,QAASlH,QAAS,iBAEiB,aAAjCqF,EAAGpC,UAAW,eAEfoN,EAAMG,UACDC,SAAUpL,EAAGnB,UAAW,8BACxB6G,WAAY1F,EAAGnB,UAAW,8CAC1BwM,gBAAiB,MACjBC,gBAAiBtL,EAAGnB,UAAW,OAC/B0M,UAAW,WAER1J,OAAO6C,SAASC,OAAQ,OAE3B6G,UAAW,WAER3J,OAAO6C,SAASC,OAAQ,OAE3B0B,QAGVrG,EAAGpC,UAAW,4BAarB,QAAS6N,GAAaC,GAElB,IAEI,GAAIC,GAAe/R,EAAEgS,UAAWF,EAAMC,aACtCZ,GAAGc,YAAaF,EAAajQ,MAAMoQ,aAEvC,MAAQhI,GAEJiH,EAAGgB,WAAYL,EAAMM,OAAQN,EAAMO,aAiB3C,QAASC,GAAM9M,EAAKnF,EAAQkS,EAAcC,EAAiBC,GAQvD,MALMD,IAEFrB,EAAGuB,iBAGA1S,EAAEuF,KACLC,GAEI5K,KAAU,MACVoK,KAAU3E,EACVoF,SAAU,OACVkN,OAAWF,EACX3Q,MAAU,SAAUgQ,GAEVS,GAEFV,EAAaC,MAI3Bc,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAkBR,QAASyB,GAAOtN,EAAKR,EAAMuN,EAAcC,GAGrC,GAAInS,IACAzF,KAAU,OACV6K,SAAU,OACV3D,MAAU,SAAUgQ,GAEVS,GAEFV,EAAaC,IAuBzB,OAlBO9M,IAAQA,EAAK+N,QAEhB1S,EAAO1D,MAAcqI,EAAKrI,MAC1B0D,EAAO2S,YAAchO,EAAKgO,YAC1B3S,EAAO2E,KAAcA,EAAKA,KAC1B3E,EAAO4S,aAAc,IAIrB5S,EAAO2E,KAAckO,KAAKC,UAAWnO,GACrC3E,EAAO4S,YAAc,oBAGnBT,GAEFrB,EAAGuB,iBAGA1S,EAAEuF,KACLC,EAAKnF,GACPuS,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAiBR,QAAS+B,GAAM5N,EAAKR,EAAMuN,EAAcC,GAQpC,MALMA,IAEFrB,EAAGuB,iBAGA1S,EAAEuF,KACLC,GAEI5K,KAAa,MACboK,KAAakO,KAAKC,UAAWnO,GAC7BS,SAAa,OACbwN,YAAa,mBACbnR,MAAa,SAAUgQ,GAEbS,GAEFV,EAAaC,MAI3Bc,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAkBR,QAASgC,GAAS7N,EAAKR,EAAMuN,EAAcC,GAQvC,MALMA,IAEFrB,EAAGuB,iBAGA1S,EAAEuF,KACLC,GAEI5K,KAAa,SACboK,KAAakO,KAAKC,UAAWnO,GAC7BS,SAAa,OACbwN,YAAa,mBACbnR,MAAa,SAAUgQ,GAEbS,GAEFV,EAAaC,MAI3Bc,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAUR,QAASiC,KAEL,MAAOtT,GAAEuT,WAAWC,UAxRxB,GAAIlC,GAA2B,IAM/B,OALAtR,GAAGU,UAAW+S,MAAO,WAEjBpC,OAIA3N,IAAQ4O,EACRoB,KAAQZ,EACRa,IAAQP,EACRQ,SAAQP,EACRQ,KAAQP,KAgRZ,YAAa,kBAClBnN,OAAQnD,iBAaV,SAAUoD,GAaPA,EAAGzO,QAAS,aAAc,SAAUmc,GAwBhC,QAASC,GAAcC,EAAe3T,GAGlC,QAAS4T,GAAMC,GAEX,MAAOJ,GAAIpQ,IAAK,SAAWwQ,EAAY7R,cAAgB,cAAgB2R,EAAc3R,cAAgB,IAAKhC,GAG9G,OACI4T,KAAMA,GAoBd,QAASE,GAAWH,EAAe3T,GAG/B,QAAS4T,GAAMC,GAEX,MAAOJ,GAAIpQ,IAAK,SAAWwQ,EAAY7R,cAAgB,IAAM2R,EAAc3R,cAAgB,IAAKhC,GAGpG,OACI4T,KAAMA,GAWd,QAASG,GAAoBC,GAEzB,MAAOP,GAAIpQ,IAAK,sDAAwD2Q,GAxE5E,OACIN,aAAoBA,EACpBI,UAAoBA,EACpBC,mBAAoBA,KAwExB,gBACLpR,iBAaF,SAAUoD,GAePA,EAAGzO,QAAS,kBAAmB,SAAUmc,EAAKQ,EAAKnD,GAkB/C,QAASoD,KAEL,MAAOC,GAQX,QAASC,GAAaC,GAOlB,MALMC,IAAaH,GAEfI,GAAc,GAGXF,EAEI1U,EAAE6U,QAAQ,KAAUL,GAExBG,EASX,QAASC,GAAcnC,GAGnB,MAAOqB,GAAIpQ,IAAK,kBAAmB,MAAM,GAAO,EAAO+O,GAClD/M,KAAM,SAAUC,GAENA,GAEH6O,EAAe7O,EAASX,KACxB2P,EAAe,GAAIJ,IAInBpD,EAAGgB,WAAY,EAAG,iFAWlC,QAAS2C,KAGL,MAAOhB,GAAIH,IAAK,iBAAkBgB,GAC7BjP,KAAM,SAAUC,GAENA,GAEH6O,EAAe7O,EAASX,KACxB2P,EAAe,GAAIJ,IAInBpD,EAAGgB,WAAY,EAAG,iFAclC,QAAS4C,GAAiBC,GAGtB,MAAOV,GAAIP,aAAc,WAAaiB,GAAYf,KAAM,YACnDvO,KAAM,SAAUC,GAEb3F,EAAG,mCAAqCgV,EAAY,MAC/C9T,KAAM,SAAU5F,EAAGiL,GAEhBvG,EAAGuG,GAAO0O,KAAMtP,EAASX,KAAK,IAC9BoB,EAAG/C,cAAce,eAAgBmC,GACjCvG,EAAGiI,QAASlH,QAAS,sBAczC,QAASmU,GAAkBC,GAGvB,MAAOb,GAAIF,mBAAoBe,GAC1BzP,KAAM,SAAUC,GAEb3F,EAAG,qCAAuCmV,EAAQ,MAC7CjU,KAAM,SAAU5F,EAAGiL,GAEhBvG,EAAGuG,GAAO0O,KAAMtP,EAASX,KAAK,IAC9BoB,EAAG/C,cAAce,eAAgBmC,GACjCvG,EAAGiI,QAASlH,QAAS,sBAezC,QAASqU,GAAqBJ,GAG1B,MAAOV,GAAIP,aAAc,WAAaiB,GAAYf,KAAM,YACnDvO,KAAM,SAAUC,GAEb3F,EAAG,mCAAqCgV,EAAY,MAC/C9T,KAAM,SAAU5F,EAAGiL,GAEhBvG,EAAGuG,GAAO0O,KAAMtP,EAASX,KAAK,IAC9BoB,EAAG/C,cAAce,eAAgBmC,GACjCvG,EAAGiI,QAASlH,QAAS,sBA7JzC,GAAIyT,GAGAG,CAEJ,QACIF,YAAqBA,EACrBK,YAAqBA,EACrBF,aAAqBA,EACrBG,gBAAqBA,EACrBG,iBAAqBA,EACrBE,oBAAqBA,KAyJzB,aAAc,aAAc,eACjCpS,iBAaF,SAAUhD,EAAGoG,GAQVA,EAAGzO,QAAS,eAAgB,WAcxB,QAAS0d,GAASJ,GAEd,MAAOjS,iBAAgBvE,SAAS2S,MAAMiE,QAASJ,GAQnD,QAAS1D,GAAS+D,GAEd,MAAO,IAAIlE,GAAOkE,GAUtB,QAASlE,GAAOkE,GAoHZ,QAAS9D,GAAU+D,GAGf,MADAC,GAAMD,MAAQA,EACPtd,KAGX,QAASwd,GAAU7E,GAGf,MADA4E,GAAM5E,SAAWA,EACV3Y,KASX,QAAS6T,GAAYgB,GAGjB,MADA0I,GAAM1I,QAAUA,EACT7U,KAUX,QAASyZ,GAAiB9E,GAGtB,MADA4I,GAAME,aAAe9I,EACd3U,KAUX,QAASwZ,GAAiB7E,GAGtB,MADA4I,GAAMG,aAAe/I,EACd3U,KAUX,QAAS0Z,GAAWvR,GAGhB,MADAoV,GAAM7D,UAAYvR,EACXnI,KASX,QAAS2Z,GAAWxR,GAGhB,MADAoV,GAAM5D,UAAYxR,EACXnI,KASX,QAAS2d,GAAcZ,GAGnB,MADAQ,GAAMR,UAAYA,EACX/c,KASX,QAASkQ,GAAYH,GAGjB,MADAwN,GAAMxN,QAAUA,EACT/P,KASX,QAASwU,KAEL,GAAM+I,EAAMF,SAERO,EAAU7V,EAAGwV,EAAMF,cAGvB,CAGQO,EAFCR,EAASG,EAAM1I,SAEN9J,gBAAgBvE,SAAS2S,MAAM0E,SAAUN,EAAM1I,SAI/C9M,EAAGgD,gBAAgB+B,gBAAiB,mBAAoByQ,IAGtExV,EAAGwV,EAAMR,WAAYxE,OAAQqF,EAG7B,IAAI9P,GAAU/F,EAAGwV,EAAM1I,SAAUiJ,OAAQ,SACpChQ,GAAQjM,OAAS,GAElBiM,EAAQ7E,KAAM,SAAU5F,EAAG0a,GAEvB,GAAInV,GAAgBH,SAASuV,cAAe,SAC5CpV,GAAQjG,KAAY,kBACpBiG,EAAQqV,UAAYlW,EAAGgW,GAAS9Q,OAChClF,EAAGwV,EAAMR,WAAYxE,OAAQ3P,KAMzCmC,gBAAgBvE,SAAS2S,MAAM+E,KAAMN,EAASL,GAC9CK,EAAQvR,KAAM,iCAAkC0K,MAAO,WAEnD,GAAIoH,GAAQZ,EAAM7D,WAEG,oBAATyE,KAERA,GAAQ,GAGPA,GAED9J,GAAM,KAIdtJ,gBAAgBvE,SAAS2S,MAAM3E,KAAMoJ,GAEhCL,EAAMxN,QAAU,GAEjBqO,IAUR,QAAS/J,GAAMgK,GAEXtT,gBAAgBvE,SAAS2S,MAAM9E,KAAMuJ,GAE/BS,GAEFd,EAAM5D,YASd,QAASyE,KAELE,EAAgBf,EAAMxN,QACtBwO,GAAgB,GAAKC,OAAQC,UAE7B1O,EAAUC,OAAOE,WAAY,WAEzBF,OAAO0O,cAAe9L,GACtByB,KACDkJ,EAAMxN,SAET6N,EAAQvR,KAAM,+BAAgCY,KAAMqR,EAAgB,KACpE1L,EAAW5C,OAAO2O,YAAa,WAE3B,IAAMC,EACN,CACI,GAAIC,GAAmBP,GAAgB,GAAKE,OAAQC,UAAYF,CAChEM,GAAuBC,KAAKC,MAAOF,EAAmB,KACtDjB,EAAQvR,KAAM,+BAAgCY,KAAM4R,KAEzD,KAQP,QAASG,KAELJ,GAAS,EACTN,IAAiB,GAAKE,OAAQC,UAAYF,EAC1CvO,OAAOC,aAAcF,GAQzB,QAASkP,KAELL,GAAY,EACZL,GAAY,GAAKC,OAAQC,UACzB1O,EAAYC,OAAOE,WAAY,WAE3BmE,IACArE,OAAO0O,cAAe9L,IACvB0L,GAQP,QAASY,KAELlP,OAAOC,aAAcF,GACrBC,OAAO0O,cAAe9L,GApW1B,GAAI2K,GAAQvd,IACZud,GAAMF,SAAWA,EASjBE,EAAMD,MAAQ,GAEdC,EAAM5E,SAAW,GASjB4E,EAAM1I,QAAU,GAShB0I,EAAMG,aAAevP,EAAGnB,UAAW,UASnCuQ,EAAME,aAAetP,EAAGnB,UAAW,WAUnCuQ,EAAM7D,UAAY,aAWlB6D,EAAM5D,UAAY,aAWlB4D,EAAMR,UAAY,OASlBQ,EAAMxN,QAAU,GAEhBwN,EAAMlJ,KAAkBA,EACxBkJ,EAAMa,aAAkBA,EACxBb,EAAM2B,YAAkBA,EACxB3B,EAAMyB,aAAkBA,EACxBzB,EAAM0B,gBAAkBA,CAExB,IAAIrB,GACA7N,EAAS6C,EACT0L,EAAeC,EACfK,GAAS,CAEb,QACIrF,SAAiBA,EACjBiE,SAAiBA,EACjB3J,WAAiBA,EACjB8J,aAAiBA,EACjBlE,gBAAiBA,EACjBD,gBAAiBA,EACjBE,UAAiBA,EACjBC,UAAiBA,EACjBzJ,WAAiBA,EACjBsE,KAAiBA,EACjBH,KAAiBA,GA5IzB,OACIiF,QAASA,EACT8D,QAASA,MA4YlBlP,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAQVA,EAAGzO,QAAS,YAAa,WA2BrB,QAASwa,GAAYiF,EAAMC,GAEvBpF,IAAemF,KAAMA,EAAME,QAASD,KAUxC,QAASpF,GAAasF,KAIZC,GAAcxX,EAAG,QAASyX,IAAKD,GAAa1d,QAAU,KAExD0d,EAAaxX,EAAGoG,EAAGrB,gBAAiB,0BACpC/E,EAAG,QAASwQ,OAAQgH,GACpBpR,EAAG3H,SAASpE,MAAM8b,KAAMqB,IAG5BxX,EAAEkB,KAAMqW,EAAe,SAAUG,EAAK5V,GAGlCsE,EAAG3H,SAASpE,MAAMsd,SAAUH,EAAYxX,EAAGoG,EAAGrB,gBAAiB,0BAA2BjD,OAG9FsE,EAAG3H,SAASpE,MAAMoS,KAAM+K,GAExB3E,GAAgB,GAQpB,QAASH,KAeL,MAbAkF,GAAkBA,GAAmB,IAG/BC,GAAc7X,EAAG,QAASyX,IAAKI,GAAa/d,QAAU,KAExD+d,EAAa7X,EAAGoG,EAAGrB,gBAAiB,+BACpC/E,EAAG,QAASwQ,OAAQqH,IAGxBzR,EAAG3H,SAASqZ,WAAWrL,KAAMoL,GAG7BD,IACOA,EASX,QAAS/E,GAAgBpF,GAarB,MATAmK,MAIwB,GAAnBA,GAA0BnK,KAE3BmK,EAAkB,EAClBxR,EAAG3H,SAASqZ,WAAWxL,KAAMuL,IAE1BD,EA7FX,GACIC,GADAD,EAAkB,EAElBJ,EAAkB,IAEtB,QACIrF,WAAgBA,EAChBF,YAAgBA,EAChBS,eAAgBA,EAChBG,eAAgBA,MAyFzB1M,OAAQnD,iBAUXhG,OAAO2G,OAAS,SAAUoU,EAAGC,GAEzB,GAAKD,IAAMC,EAEP,OAAO,CAEX,MAAOD,YAAa/a,SAAagb,YAAahb,SAE1C,OAAO,CAEX,IAAK+a,EAAEE,cAAgBD,EAAEC,YAErB,OAAO,CAGX,KAAM,GAAIP,KAAOK,GAEb,GAAMA,EAAE9Z,eAAgByZ,GAAxB,CAIA,IAAMM,EAAE/Z,eAAgByZ,GAEpB,OAAO,CAEX,IAAKK,EAAEL,KAASM,EAAEN,GAAlB,CAIA,GAA0B,gBAAbK,GAAEL,GAEX,OAAO,CAEX,KAAM1a,OAAO2G,OAAQoU,EAAEL,GAAMM,EAAEN,IAE3B,OAAO,GAIf,IAAM,GAAIA,KAAOM,GAEb,GAAKA,EAAE/Z,eAAgByZ,KAAUK,EAAE9Z,eAAgByZ,GAE/C,OAAO,CAIf,QAAO,GAGX1U,gBAAgBkV,YAEZC,OAAQ,UAGZ,SAAWnY,EAAGoG,GAGVA,EAAG3H,SAASpE,OAMR8b,KAAM,SAAUiC,GAEZpY,EAAGoY,GAAQ9T,KAAM,UAAW0K,MAAO,WAE/B5I,EAAG3H,SAASpE,MAAMge,aAS1BV,SAAU,SAAUS,EAAOtW,GAEvB,GAAIwW,GAAYtY,EAAG8B,GAAQb,KAAM,yBAE5BjB,GAAGoY,GAAQ9T,KAAM,4BAA8BgU,EAAY,MAAOxe,QAAU,GAE7EkG,EAAGoY,GAAQ9T,KAAM,wBAAyBkM,OAAQ1O,IAQ1D2K,KAAM,SAAU2L,GAEZpY,EAAGoY,GAAQ3L,QAGf4L,QAAS,WACLrY,EAAG,sBAAuBsM,OAC1BtM,EAAG,sBAAuBsE,KAAM,wBAAyB2Q,KAAM,OAKvE9O,OAAQnD,iBACX,SAAUhD,EAAGoG,GAGVA,EAAG3H,SAAS2S,OAOR+E,KAAM,SAAUtV,EAAS2U,GAErB3U,EAAQP,GAAI,kBAAmB,WAE3BkV,EAAMlJ,OACDkJ,EAAMF,UAGPzU,EAAQ0X,WAIX/C,EAAMxN,QAAU,IAEjBnH,EAAQP,GAAI,gBAAiBkV,EAAM2B,aACnCtW,EAAQyD,KAAM,kBAAmBkU,MAAO,WAEpChD,EAAMyB,gBACP,WAEMpW,EAAQC,GAAI,QAEb0U,EAAM0B,sBAUtBzK,KAAM,SAAU5L,GAEZA,EAAQ2U,MAAO,SAOnBlJ,KAAM,SAAUzL,GAEZA,EAAQ2U,MAAO,SAQnBH,QAAS,SAAUJ,GAEf,MAAOjV,GAAGiV,GAAOc,OAAQ,UAAWjc,OAASkG,EAAGiV,GAAO3Q,KAAM,UAAWxK,OAAS,GAQrFgc,SAAU,SAAUb,GAEhB,GAAIO,GAAQxV,EAAGiV,EAMf,OALKO,GAAM1b,OAAS,IAEhB0b,EAAQxV,EAAGiV,GAAOc,OAAQ,WAAc/V,EAAGiV,GAAO3Q,KAAM,WAGrDkR,KAKhBrP,OAAQnD,iBACX,SAAWhD,GAGPA,EAAGU,UAAWJ,GAAI,eAAgB,SAAU4J,EAAGuO,GAG3CzY,EAAGyY,GAAOnU,KAAM,2BAA4BoM,SACxCsE,UAAW,YAKnB7O,QACJ,SAAWnG,EAAGoG,GAGVA,EAAG3H,SAASqZ,YAMRrL,KAAM,SAAU5L,GAEZA,EAAQmJ,SAAU,OAOtBsC,KAAM,SAAUzL,GAEZA,EAAQyI,YAAa,SAK7BnD,OAAQnD,iBAUX,SAAUhD,EAAGoG,GAEVA,EAAG1B,QAAS,uBAAwB,SAAUoP,GAM1C,QAAS4E,GAAiBC,GAEtB,GAAIC,IAAiB,CAarB,OAZAD,GAAqBA,GAAgB,+BACrC3Y,EAAG2Y,GAAe5C,OAAQ,wCAAyC7U,KAAM,SAAU5F,EAAG2V,GAElF,GAAI4H,GAAiB,GAAIC,GAAe7H,GACpC8H,EAAiB/Y,EAAGiR,GAAOhQ,KAAM,8BAA+BvI,QAAS,MAAO,IAAKyB,MAAO,IAC1F0e,GAAcG,QAASD,KAEzBH,GAAiB,KAKlBA,EAGX,QAASE,GAAe7H,GAkBpB,QAAS+H,GAASC,GAGd,MAAKC,MAEM,GAGXC,EAAiB,GAAIC,GAAaC,EAAMC,iBACxCP,EAAiBE,EAEjBM,IAE4C,GAArCJ,EAAYK,eAAe1f,QAGtC,QAASyf,KAELvZ,EAAG,oBAAqBuY,QAGxB,KAAM,GADFkB,IAAwB,EAClBne,EAAI,EAAGA,EAAIyd,EAAejf,OAAQwB,IAElCoe,EAAeX,EAAezd,GAAIme,KAEpCJ,EAAMtY,QAAS,oBACf0Y,GAAwB,EAI3BN,GAAYQ,eAAgBC,EAAQC,QAAQ7S,QAAgD,GAArCmS,EAAYK,eAAe1f,QAEnF8f,EAAQC,QAAQvQ,YAAa,aAC7B+P,EAAM/U,KAAM,cAAgBsV,EAAQC,QAAQ5Y,KAAM,MAAS,MAAOqI,YAAa,aAE/EsQ,EAAQC,QAAQ7P,SAAU,eAC1BqP,EAAM/U,KAAM,cAAgBsV,EAAQC,QAAQ5Y,KAAM,MAAS,MAAO+I,SAAU,iBAI5E4P,EAAQC,QAAQvQ,YAAa,eAC7B+P,EAAM/U,KAAM,cAAgBsV,EAAQC,QAAQ5Y,KAAM,MAAS,MAAOqI,YAAa,eAE/EsQ,EAAQC,QAAQ7P,SAAU;AAC1BqP,EAAM/U,KAAM,cAAgBsV,EAAQC,QAAQ5Y,KAAM,MAAS,MAAO+I,SAAU,cAIpF,QAAS0P,GAAehC,EAAK+B,GAEzB,GAAIK,GAAYX,EAAYY,QAASrC,EAOrC,OALOsC,GAAqBtC,IAExBsC,EAAqBtC,GAAKa,SAGxBqB,EAAQlC,GAKW,GAApBoC,EAAUhgB,QAEX8f,EAAQlC,GAAK1Q,IAAK8S,EAAU,IAE5BF,EAAQlC,GAAKpO,YAAa,aAC1B+P,EAAM/U,KAAM,cAAgBsV,EAAQlC,GAAKzW,KAAM,MAAS,MAAOqI,YAAa,aAE5EsQ,EAAQlC,GAAK1N,SAAU,eACvBqP,EAAM/U,KAAM,cAAgBsV,EAAQlC,GAAKzW,KAAM,MAAS,MAAO+I,SAAU,gBAClE,IAIP4P,EAAQlC,GAAKpO,YAAa,eAC1B+P,EAAM/U,KAAM,cAAgBsV,EAAQlC,GAAKzW,KAAM,MAAS,MAAOqI,YAAa,eAE5EsQ,EAAQlC,GAAK1N,SAAU,aACvBqP,EAAM/U,KAAM,cAAgBsV,EAAQlC,GAAKzW,KAAM,MAAS,MAAO+I,SAAU,aAEnEyP,GAEFQ,EAAqBL,EAAQlC,GAAMoC,GAEvCF,EAAQlC,GAAKzN,IAAK,SAClB2P,EAAQlC,GAAKwC,SACN,IA5BA,EAiCf,QAASC,GAAwB1Q,EAAS2Q,GAEtCJ,EAAqBI,GAAe/N,KAChCgO,MAAS5Q,EAAQ6Q,YAAY,GAC7BC,KAAS9Q,EAAQ+Q,WAAWD,KAC5BE,IAAShR,EAAQ+Q,WAAWC,IAAMhR,EAAQoF,aAAa,KAI/D,QAASoL,GAAqBxQ,EAASiR,GAEnC,GAAIN,GAAgB3Q,EAAQxI,KAAM,OAGlC+Y,GAAqBI,GAAiBpa,EAAGoG,EAAGrB,gBAAiB,yCAA0C2V,OAAQA,KAE/GP,EAAwB1Q,EAAS2Q,GAEjCpa,EAAGiI,QAAS3H,GAAI,aAAc,WAE1B6Z,EAAwB1Q,EAAS2Q,KAIrCJ,EAAqBI,GAAe9V,KAAM,wBAAyBpD,KAAM,SAAU5F,EAAGiL,GAGlF,GAAIrG,GAAQF,EAAGuG,GACX1L,EAAQqF,EAAMe,KAAM,qBAExBf,GAAM8O,MAAO,WAGTvF,EAAQzC,IAAKnM,EAGb,IAAI8f,KACJA,GAAclR,EAAQxI,KAAM,SAAYpG,EACxCse,EAAYpD,OAAQ4E,GAGpBpB,QAOR9P,EAAQ5M,SAAS2T,OAAQwJ,EAAqBI,IAGlD,QAASlB,KAEL,MAA+C,eAAtCU,EAAQgB,OAAO5T,MAAM6T,eAAwE,eAAtCjB,EAAQgB,OAAO5T,MAAM6T,cAjKzF,GASI1B,GACAJ,EAVAM,EAAuBrZ,EAAGiR,GAC1B2I,GACAgB,OAASvB,EAAM/U,KAAM,wBACrBwW,IAASzB,EAAM/U,KAAM,qBACrByW,KAAS1B,EAAM/U,KAAM,sBACrBuV,QAASR,EAAM/U,KAAM,0BAErB0V,IAKJ,QACIhB,QAASA,GAyJjB,QAASI,GAAa4B,GAalB,QAAS7E,KAELrC,EAAIpQ,IAAK,gDACLuX,eAAgB,gBAChBC,OAAgBF,EAAaJ,OAC7BE,IAAgBE,EAAaF,IAC7BK,KAAgBH,EAAaD,KAC7BK,QAAgBJ,EAAanB,QAC7BwB,QAAgBL,EAAaM,YAC9B,GAAO,GAAO,GAAO5V,KAAM,SAAUC,GAKpC,IAAM,GAFF4V,GAAiB5V,EAASX,KAAKlL,OAEzBwB,EAAI,EAAOigB,EAAJjgB,EAAoBA,IACrC,CACI,GAAIkgB,GAAkB7V,EAASX,KAAK1J,GAEhCmgB,EAAUC,EAAYF,EACpBC,GAOFA,EAAQ5B,QAAQpe,KAAM+f,EAAgB3B,UALtC2B,EAAgB3B,SAAW2B,EAAgB3B,SAC3C8B,EAAUlgB,KAAM+f,OAYhC,QAASE,GAAYE,GAIjB,IAAM,GAFFC,GAAeF,EAAU7hB,OAEnByF,EAAI,EAAOsc,EAAJtc,EAAkBA,IAE/B,GAAKqc,EAAWhB,QAAUe,EAAUpc,GAAGqb,QAAUe,EAAUb,KAAOa,EAAUpc,GAAGub,KAAOc,EAAWb,MAAQY,EAAUpc,GAAGwb,KAElH,MAAOY,GAAUpc,EAIzB,OAAO,MAIX,QAASia,KAEL,MAAOmC,GAGX,QAAS5B,GAASrC,GAKd,IAAM,GAHFoE,MACAD,EAAeF,EAAU7hB,OAEnBwB,EAAI,EAAOugB,EAAJvgB,EAAkBA,IACnC,CACI,GAAImgB,GAAUE,EAAUrgB,EACnB0E,GAAE6C,QAAS4Y,EAAQ/D,GAAMoE,GAAY,GAEtCA,EAAQrgB,KAAMggB,EAAQ/D,IAI9B,MAAOoE,GAGX,QAAS/F,GAAQ4E,GAKb,IAAM,GAHFoB,MACAF,EAAoBF,EAAU7hB,OAExBwB,EAAI,EAAOugB,EAAJvgB,EAAkBA,IACnC,CACI,GAAImgB,GAAUE,EAAUrgB,IAChBqf,EAAcC,QAAUD,EAAcC,QAAUa,EAAQb,QACtDD,EAAcG,KAAOH,EAAcG,KAAOW,EAAQX,KAClDH,EAAcI,MAAQJ,EAAcI,MAAQU,EAAQV,OAE1DgB,EAAkBtgB,KAAMggB,GAIhCE,EAAYI,EAGhB,QAASpC,GAAgByB,GAErBA,EAAU3X,SAAU2X,EAIpB,KAAM,GAFFS,GAAeF,EAAU7hB,OAEnBwB,EAAI,EAAOugB,EAAJvgB,EAAkBA,IAI/B,IAAM,GAFFmgB,GAAUE,EAAUrgB,GAEdiE,EAAI,EAAGA,EAAIkc,EAAQ5B,QAAQ/f,OAAQyF,IAC7C,CACI,GAAIyc,GAAQP,EAAQ5B,QAAQta,GAAGpF,MAAO,IACtC,IAAuB,GAAhB6hB,EAAMliB,QAAeshB,GAAWY,EAAM,IACtB,GAAhBA,EAAMliB,QAAeshB,GAAWY,EAAM,IAAMZ,GAAWY,EAAM,GAEhE,OAAO,EAKnB,OAAO,EA3HX,GAAIL,KAIJ,OAFAxF,MAGIqD,aAAgBA,EAChBO,QAAgBA,EAChBhE,OAAgBA,EAChB4D,eAAgBA,GAxMxB,OACIjB,gBAAiBA,KA8TrB,gBACLvS,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAaVA,EAAG1B,QAAS,wBAAyB,SAAUoP,EAAKS,EAAUpD,GAkB1D,QAAS8K,KAGL,GAAIhL,GAAOjR,EAAG,4CAEd,IAAKiR,EAAKiL,eACV,CAEI,GAAIxB,GAASzJ,EAAKqI,gBAEdjZ,GACA8b,MAAOzB,EAAOyB,MAGlB,OAAOrI,GAAIJ,KAAM,+BAAgCrT,GAC5CqF,KAAM,SAAUC,GAEoB,GAA5BA,EAASX,KAAKoX,aAEfpc,EAAG,sDAAuDsM,OAC1DtM,EAAG,uDAAwDyM,WAgB/E,QAAShG,GAAewK,GAEpB,GAAKA,EAAKiL,eACV,CACI,GAAIxB,GAASzJ,EAAKqI,gBAEdjZ,GACA8b,MAAUzB,EAAO2B,UACjBC,SAAU5B,EAAO6B,cAIrB,OADApL,GAAGuB,iBACIoB,EAAIJ,KAAM,wBAAyBrT,GACrCqF,KAAM,WAGHuC,OAAO6C,SAASC,OAAQkG,EAAKhQ,KAAM,cAcnD,QAASub,GAAmBC,GAGxB,MAAO3I,GAAIJ,KAAM,yCAA0C+I,GACtD/W,KAAM,SAAUC,GAEb4O,EAASE,cAAciI,uBAAyB/W,EAASX,OAarE,QAAS2X,KAEL,GAAI1L,GAAOjR,EAAG,qDAEd,IAAKiR,EAAKiL,gBAAkB9V,EAAG/C,cAAcuZ,qBAAqBlE,kBAClE,CACI,GAAIgC,GAAezJ,EAAKqI,eAGxB,IAFAoB,EAAOmC,UAAY,EAEdnC,EAAO/F,UACL+F,EAAO/F,SAASmI,wBAChBpC,EAAO/F,SAASmI,uBAAuBC,iBAC9C,CACI,GAAIC,GAA4BtC,EAAO/F,SAASmI,uBAAuBC,gBACvErC,GAAOuC,uBAAyBvC,EAAOuC,0BAEvC,KAAM,GAAIC,KAAYF,GAEbA,EAAcE,IAEfxC,EAAOuC,uBAAuBxhB,MAC1B0hB,WAAeD,EACfE,cAAeJ,EAAcE,KAM7C,MAAOV,GAAmB9B,GACrBhV,KAAM,WAEHuC,OAAO6C,SAASC,OAAQkG,EAAKhQ,KAAM,cAnInD,OACIgb,cAAmBA,EACnBxV,cAAmBA,EACnB+V,kBAAmBA,EACnBG,iBAAmBA,KAmIvB,aAAc,kBAAmB,eAEtCxW,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAgBVA,EAAG1B,QAAS,gBAAiB,SAAUoP,EAAK3C,EAAImD,EAAKC,EAAUnD,GAsB3D,QAASzK,GAAe0W,GAGbA,GAGHvJ,EAAIpQ,IAAK,4BAA8B,0BAA0BrB,cAAgB,KAEzEib,OAAUD,EAAQ,GAAGtW,iBACrBwW,SAAUF,EAAQ,GAAGnW,qBACtB,GAAO,GAAOxB,KAAM,SAAU8X,GAG5BA,EAAKxY,KAAK,GAAG3G,QAAS,cAAiB,EAExC+S,EAAMG,UACDzF,WAAY0R,EAAKxY,KAAK,IACtBwM,SAAUpL,EAAGnB,UAAW,4BACxByM,gBAAiBtL,EAAGnB,UAAW,SAC/B0M,UAAW,WAGR,MAAK3R,GAAG,iDAAkDkc,gBAGtDuB,EAAYC,EAAiBL,KAGtB,IAIA,IAGd5Q,OAILgR,EAAYJ,KAa5B,QAASK,GAAiBC,GAGtB,GAGIhgB,GAHAigB,EAAkB5d,EAAG,iDACrB6P,KACAgO,EAAkB,EAwCtB,OApCAD,GAAgBtZ,KAAM,wBAAyBpD,KAAM,WAEjDvD,EAAoB1F,KAAK+F,KAAKL,MAAO,gCACrCggB,EAAoBG,EAAoBH,EAAmBhgB,EAAM,GAAIqC,EAAG/H,MAAO+O,MAAOhH,EAAG/H,MAAO+O,SAIpG4W,EAAgBtZ,KAAM,wBAAyBpD,KAAM,WAKjD,GAHA2O,EAAW7P,EAAG/H,MACd4lB,EAAWhO,EAAM5O,KAAM,SAEJ,YAAZ4c,GAA0BhO,EAAM/O,GAAI,aAC1B,SAAZ+c,GAAuBhO,EAAM/O,GAAI,aACrB,SAAZ+c,GAAmC,YAAZA,IAAwC,QAAZA,GAAkC,UAAZA,EAC9E,CAEI,GAAIlgB,GAAgBkS,EAAM,GAAG7R,KAAKL,MAAO,+BACzCggB,GAAoBG,EAAoBH,EAAmBhgB,EAAM,GAAIA,EAAM,GAAIkS,EAAM7I,WAGpF,IAAiB,QAAZ6W,EAEN,GAAKhO,EAAM,GAAGkO,OAASlO,EAAM,GAAGkO,MAAMjkB,OAAS,EAE3C6jB,EAAoBK,EAAsBnO,EAAO8N,OAGrD,CACI,GAAIhgB,GAAgBkS,EAAM,GAAG7R,KAAKL,MAAO,oCACrCsgB,EAAgBje,EAAG,yCAA2CrC,EAAM,GAAK,KAAOA,EAAM,GAAK,OAAQqJ,KACvG2W,GAAoBG,EAAoBH,EAAmBhgB,EAAM,GAAIA,EAAM,GAAIsgB,MAKpFN,EAGX,QAASF,GAAYJ,GAEjBvJ,EAAIJ,KAAM,kCAAmC2J,GAAS,GACjD3X,KAAM,WAGH6O,EAASK,eACJlP,KAAM,WAEHwY,IAEA5J,EAAIP,aAAc,2CAA4CoK,UAAWd,EAAQ,GAAGtW,mBAAoBkN,KAAM,YACzGvO,KAAM,SAAUC,GAEb,GAAIqC,GAAU5B,EAAGpC,UAAW,6BAA8B,KACtDwR,EAAUpE,EAAMG,UAAUzF,WAAYnG,EAASX,KAAK,GAEnDgD,GAAU,GAEXwN,EAAMrN,WAAYH,GAGtBwN,EAAM/I,aAGtBnE,KAAM,SAAUwJ,GAGpBX,EAAGc,YAAaiB,KAAK3U,MAAOuT,EAAMC,cAAejQ,MAAMoQ,eAI/D,QAASkM,GAAef,GAEpBvJ,EAAIH,IAAK,kCAAmC0J,GACvC3X,KAAM,WAGH6O,EAASW,iBAAkB9O,EAAGpC,UAAW,gBACzCuQ,EAASK,eACJlP,KAAM,WAEHwY,QAKpB,QAASF,GAAsBK,EAAQV,GAEnC,GAGIW,GACAC,EAJA7G,EAAwB2G,EAAO,GAAG3R,GAClC8R,KACAC,KAGApe,GACAzF,KAAa,OACboK,QACA+N,QAAa,EACbpW,OAAa,EACb8I,SAAa,OACbuN,aAAa,EACbC,aAAa,EAGjBuL,GAAsB9G,GAAO2G,EAAO,GAAGN,MAGM,IAAxCU,EAAsBpgB,QAASqZ,IAEhC+G,EAAsBhjB,KAAMic,EAGhC,KAAM,GAAIpc,GAAI,EAAGxB,EAAS2kB,EAAsB3kB,OAAYA,EAAJwB,IAAcA,EAElEgjB,EAAW,GAAII,UACfH,EAAWC,EAAsBC,EAAsBnjB,IACvDgjB,EAAS9N,OAAQ,IAAK+N,EAAS,GAAIA,EAAS,GAAGvgB,MAE/CqC,EAAO2E,KAAOsZ,EAEdxK,EAAIJ,KAAM,iCAAkCrT,EAGhD,IAAI1C,GAAQ0gB,EAAO,GAAGrgB,KAAKL,MAAO,mCAElC,OAAOmgB,GAAoBH,EAAmBhgB,EAAM,GAAIA,EAAM,GAAI6gB,EAAsB9G,GAAK,GAAS,MAa1G,QAASoG,GAAoBa,EAAYnE,EAAUoE,EAASX,GAwBxD,MAtBKzD,GAAW,GAA6B1b,QAAxB6f,EAAWnE,KAE5BmE,EAAWnE,GAAsCxa,EAAE6U,QAAQ,KAAU8J,EAAW,IAChFA,EAAWnE,GAAUqE,8BAGI/f,QAAxB6f,EAAWnE,KAEZmE,EAAWnE,GAAUtT,mBAAqB,EACapI,QAAlD6f,EAAWnE,GAAUqE,4BAEtBF,EAAWnE,GAAUqE,8BAEpBZ,GAEDU,EAAWnE,GAAUqE,0BAA0BpjB,MAC3CqjB,uBAA2BF,EAC3BG,0BAA2Bd,KAKhCU,EAGX,QAASK,GAAoBC,GAEzB,GAAIzJ,GAAQxV,EAAG,6BAA+Bif,EAAe,KAC7DzJ,GAAMA,MAAO,QACbA,EAAMlR,KAAM,iCAAkChE,GAAI,QAAS,WAEvD,GAAIiI,GAAiB2W,EAAeD,GAChC5X,IAGJmO,GAAMlR,KAAM,iEAAkEpD,KAAM,SAAU5F,EAAG6jB,GAE7F,GAAIxhB,GAAQwhB,EAAgBnhB,KAAKL,MAAO,yCACnCA,IAASA,EAAM,IAEhB0J,EAAe5L,MACX8L,sBAA4B5J,EAAM,GAClC6J,2BAA4BxH,EAAGmf,GAAkBnY,UAM/B,GAAzBK,EAAevN,SAEhByO,EAAWd,yBAA2BJ,GAG1C+W,GAAgB7V,MAKxB,QAAS6W,GAAiBH,GAGtB,GAAI1W,GAAa2W,EAAeD,EAGhC1W,GAAWsW,6BAEX/K,EAAIpQ,IAAK,4BAA8B,0BAA0BrB,cAAgB,KAC7Eib,OAAc/U,EAAWxB,iBACzBwW,SAAchV,EAAWrB,mBACzBmB,aAAc4W,IACdvZ,KAAM,SAAU8X,GAGhBpM,EAAMG,UACDzF,WAAY0R,EAAKxY,KAAK,IACtBwM,SAAUpL,EAAGnB,UAAW,0BACxByM,gBAAiBtL,EAAGnB,UAAW,SAC/B0M,UAAW,WAGR,MAAK3R,GAAG,iDAAkDkc,gBAGtDkC,EAAeV,GAAkBnV,MAG1B,IAIA,IAGdkE,SAIb,QAASyS,GAAeD,GAGpB,IAAM,GADFI,GAAc9K,EAASE,cAAc6K,gBAC/BhkB,EAAI,EAAGA,EAAI+jB,EAAYvlB,OAAQwB,IAErC,GAAK+jB,EAAY/jB,GAAG2jB,cAAgBA,EAEhC,MAAOI,GAAY/jB,EAI3B,OAAO,MAUX,QAASikB,GAAkBN,EAAcO,GASrC,QAASC,KAEL3L,EAAAA,UAAY,wDAA0DmL,GACjEvZ,KAAM,WAEH6O,EAASK,eAAelP,KAAM,YAIpB6O,EAASE,cAAc6K,iBAAmB/K,EAASE,cAAc6K,gBAAgBxlB,QAAU,EAE7Fya,EAASW,iBAAkB9O,EAAGpC,UAAW,iBAMpChE,EAAG,qDAAsDlG,QAAU,EAEpEga,EAAIpQ,IAAK,qDAAsDgC,KAAM,SAAUC,GAE3E,GAAI+Z,GAAuB1f,EAAG,yBAA0B8G,QAAS,MAC7D6Y,EAAuBD,EAAe5Y,QAAS,cACnD4Y,GAAeE,QAAS,WAEpB5f,EAAG/H,MAAOqS,SAAU,2CAA4CiO,SAChEvY,EAAG/H,MAAOsgB,SACVoH,EAAqBE,QAAS7f,EAAG2F,EAASX,KAAK,KAAOsH,OAAOwT,OAAO,WAChE1Z,EAAG/C,cAAce,eAAgBub,SAO7CpL,EAASQ,gBAAiB,mBAE9BR,EAASQ,gBAAiB,WAG9BmJ,IAEA6B,EAASvM,cAhDzB,GAAIuM,GAAW/f,EAAEuT,WAGbyM,EAAWd,EAAeD,GAAegB,kBAAkB,EA0E/D,OAxBMT,GAqBFC,IAlBArO,EAAMG,UACDC,SAAUpL,EAAGnB,UAAW,mBACxB6G,WAAY,MAAQ1F,EAAGnB,UAAW,6DAAgEib,KAAMF,IAAc,QACtHpO,UAAW,WAIRmO,EAASI,WAEZxO,UAAW,WAER8N,MAEH/N,gBAAiBtL,EAAGnB,UAAW,WAC/BwH,OAOFsT,EAUX,QAAS3X,GAAiB6W,EAAc/X,GAGpC,GAA2B,GAAtBA,EAED,MAAOqY,GAAkBN,EAQ7B,KAAM,GAHF1W,GACA6X,EAHAL,EAAW/f,EAAEuT,WACblT,EAAWkU,EAASE,cAAc6K,gBAI5BhkB,EAAI,EAAGA,EAAI+E,EAAOvG,OAAQwB,IAEhC,GAAK+E,EAAO/E,GAAG2jB,cAAgBA,EAC/B,CACImB,EAAkB9kB,EAClBiN,EAAkBlI,EAAO/E,EACzB,OAqBR,MAhBOiN,IAAcA,EAAWrB,oBAAsBA,IAElD7G,EAAO+f,GAAiBlZ,mBAAqBzD,SAAUyD,GAEvD4M,EAAIJ,KAAM,kCAAmCrT,GACxCqF,KAAM,WAEH6O,EAASO,cAAcpP,KAAM,WAEzB6O,EAASW,iBAAkB9O,EAAGpC,UAAW,gBACzCka,IACA6B,EAASvM,eAKlBuM,EAQX,QAAS7B,KAGL3J,EAASa,oBAAqB,qBACzB1P,KAAM,WAGH1F,EAAG,8BAA+BkB,KAAM,SAAU5F,EAAGiL,GAEjD,GAAIyJ,GAAchQ,EAAGuG,GAAOtF,KAAM,2BAC7BsT,GAASE,cAAc6K,gBAAgBxlB,QAAU,EAElDkG,EAAGuG,GAAOyD,SAAUgG,GAIpBhQ,EAAGuG,GAAO+C,YAAa0G,MAOvC,IAAIqQ,GAAoB,CACxBrgB,GAAEkB,KAAMqT,EAASE,cAAc6K,gBAAiB,SAAUhkB,EAAGiN,GAEzD8X,GAAqB9X,EAAWrB,qBAGpClH,EAAG,oDAAqDkF,KAAMmb,GAC9DrgB,EAAG,gDAAiDkF,KAAMqP,EAASE,cAAc6L,OAAOC,eAU5F,QAASC,KAEL,GAAIngB,IACAogB,uBAAwBzgB,EAAG,4CAA6CgH,MAG5E,OAAO8M,GAAIJ,KAAM,yBAA0BrT,GACtCqF,KAAM,WAEH6O,EAASO,cACJpP,KAAM,WAGHgb,QAWpB,QAASC,KAEL,GAAItgB,IACAogB,uBAAwBlM,EAASE,cAAcmM,OAAOH,uBAG1D,OAAO3M,GAAAA,UAAY,yBAA0BzT,GACxCqF,KAAM,WAEH6O,EAASO,cACJpP,KAAM,iBAEI6O,GAASE,cAAcmM,OAE9BF,QAMpB,QAASA,KAELnM,EAASQ,gBAAiB,UAErB/U,EAAG,4CAA6ClG,OAAS,GAE1Dya,EAASQ,gBAAiB,UArjBlC,OACIrN,QAAoBf,EACpBka,WAAoBtB,EACpB/W,QAAoB0W,EACpB9W,gBAAoBA,EACpB4W,mBAAoBA,EACpBI,gBAAoBA,EACpBoB,UAAoBA,EACpBG,aAAoBA,KAijBxB,aAAc,YAAa,aAAc,kBAAmB,kBACjExa,OAAQnD,iBAcV,SAAUhD,EAAGoG,GAeVA,EAAG1B,QAAS,kBAAmB,SAAUoP,EAAK3C,EAAImD,EAAKC,EAAUnD,GAsB7D,QAAS+E,KAEL5B,EAASK,cAAc,GAU3B,QAASkM,KAEL,GAAI7P,GAASjR,EAAG,yCACZ0a,EAASzJ,EAAKqI,eAYlB,OATM/E,GAASE,cAAcsM,uBAEzBxM,EAASE,cAAcsM,qBAAuB,IAE5CxM,EAASE,cAAcuM,wBAEzBzM,EAASE,cAAcuM,sBAAwB,IAG5CzM,EAASE,cAAcsM,uBAAyBrG,EAAOuG,cAAgBjhB,EAAGiR,GAAO3M,KAAM,yBAA0BxK,OAAS,GACxHya,EAASE,cAAcuM,wBAA0BtG,EAAOwG,eAAiBlhB,EAAGiR,GAAO3M,KAAM,0BAA2BxK,OAAS,GAGlIya,EAASE,cAAcsM,qBAAwBrG,EAAOuG,aACtD1M,EAASE,cAAcuM,sBAAwBtG,EAAOwG,cAE/C3M,EAASO,eAMThB,EAAID,OAYnB,QAASsN,GAAqBjF,GAE1B,GAAIjL,GAAOjR,EAAG,gDAEd,KAAMkc,IAAiBjL,EAAKiL,eAExB,OAAO,CAGX,KAAMA,IAAiB9V,EAAG/C,cAAcuZ,qBAAqBlE,gBAAiBzH,GAE1E,OAAO,CAGX,IAAIyJ,GAAoBzJ,EAAKqI,gBACzB8H,EAAoBphB,EAAG,sCAAuCgH,KAElE,IAAyB,EAApBoa,EACL,CAEI,GAAIC,GAAkB3G,CAEtB,OAAM4G,GAAmBD,EAAiB9M,EAASE,cAAc8M,yBA2BtDzN,EAAID,QAzBoB,eAA1BwN,EAAgBzG,QAEjByG,EAAgBG,cAAgB,EAChCH,EAAgBI,cAAgBJ,EAAgBxH,SAEhB,eAA1BwH,EAAgBzG,SAEtByG,EAAgBK,cAAgB,EAChCL,EAAgBM,aAAgBN,EAAgBxH,SAI7C/F,EAAIJ,KAAM,0CAA2C2N,GACvD3b,KAAM,SAAUC,GAGb4O,EAASE,cAAcmN,kCAAoCjc,EAASX,KAAK6c,GACzEtN,EAASE,cAAcqN,0BAAoCnc,EAASX,KAAKsW,UAEzEyG,OAYZ,MAAKX,IAAqB7M,EAASE,cAAcmN,kCAStC9N,EAAID,QANXU,EAASE,cAAcmN,kCAAoCR,MAE3DW,MASZ,QAASA,KAKL,aAHOxN,GAASE,cAAcuN,gCACvBzN,GAASE,cAAcwN,0BAEvB1N,EAASO,cAAcpP,KAAM,WAEhC6O,EAASQ,gBAAiB,wBAC1BR,EAASQ,gBAAiB,wBAEsC,GAA3DR,EAASE,cAAciI,uBAAuBG,WAE/CtI,EAASQ,gBAAiB,2BAE9B/U,EAAG,yBAA0BwV,MAAO,QAGjCxV,EAAE,oBACDA,EAAE,mBAAmBuY,WAYjC,QAAS2J,KAEL,GAAIjR,GAAOjR,EAAG,mDAEVyc,EAAuBxL,EAAKqI,eAGhC,IAFAmD,EAAeI,UAAY,EAEtBJ,EAAe9H,UACb8H,EAAe9H,SAASmI,wBACxBL,EAAe9H,SAASmI,uBAAuBC,iBACtD,CACI,GAAIC,GAAoCP,EAAe9H,SAASmI,uBAAuBC,gBACvFN,GAAeQ,uBAAyBR,EAAeQ,0BAEvD,KAAM,GAAIC,KAAYF,GAEbA,EAAcE,IAEfT,EAAeQ,uBAAuBxhB,MAClC0hB,WAAeD,EACfE,cAAeJ,EAAcE,KAM7C,MAAMoE,GAAmB7E,EAAgBlI,EAASE,cAAciI,wBAUrDyE,IARArN,EAAIJ,KAAM,yCAA0C+I,GACtD/W,KAAM,SAAUC,GAEbwb,IAAsBzb,KAAM6O,EAASK,gBAiBrD,QAAS0M,GAAmBa,EAAUC,GAElC,IAAM,GAAI1K,KAAOyK,GAEb,GAAKA,EAASzK,GAAO,IAAO0K,EAAS1K,GAAO,IAAc,gBAARA,EAE9C,OAAO,CAGf,QAAO,EAUX,QAAS2K,KAGL,GAAI3H,GAAS1a,EAAG,uDAAwDsZ,eAMxE,OAJA/E,GAASE,cAAcwN,0BAA4BvH,EAAO4H,wBACnD/N,GAASE,cAAcmN,wCACvBrN,GAASE,cAAcuN,0BAEvBzN,EAASO,cACXpP,KAAM,WAEH6O,EAASQ,gBAAiB,0BAWtC,QAASwN,KAEL,GAAI5Z,GAAc4L,EAASE,cAAcuN,0BACrCQ,EAAcxiB,EAAG,wDAA0D2I,EAAY,MAAO9L,SAASyc,eAC3G,OAAOxF,GAAIJ,KAAM,iCAAkC8O,GAAa,GAC3D9c,KAAM,SAAUC,GAEb,GAAyD,IAApDA,EAASX,KAAKyd,mCAGf/hB,SAASoK,SAASC,OAAQpF,EAASX,KAAKyd,wCAGvC,IAAO9c,EAASX,KAAK0d,yCAC1B,CAEI,GAAIC,GAAgB3iB,EAAG2F,EAASX,KAAK0d,0CAA2Cpe,KAAM,6CAA8CxK,OAAS,CAC7IsX,GAAMG,UACDzF,WAAYnG,EAASX,KAAK0d,0CAC1B/Q,UAAW,WAER,MAAKgR,GAEMC,IAIAC,MAGdpW,UAGZnE,KAAM,SAAUwJ,GAEb,IAKI,IAAM,GAHFnM,GAAW3F,EAAEgS,UAAWF,EAAMC,cAE9B+Q,KACMxnB,EAAI,EAAGA,EAAIqK,EAAS7D,MAAMoQ,YAAYpY,OAAQwB,IAET,KAAtCqK,EAAS7D,MAAMoQ,YAAY5W,GAAG8b,KAG/B7C,EAASQ,gBAAiB,wBAAyBrP,KAAM,WAErD1F,EAAGU,UAAWK,QAAS,mCAK3B+hB,EAAWrnB,KAAMkK,EAAS7D,MAAMoQ,YAAY5W,GAK/CwnB,GAAWhpB,OAAS,GAErBqX,EAAGc,YAAa6Q,GAGxB,MAAQ5Y,GAEJiH,EAAGgB,WAAYL,EAAMM,OAAQN,EAAMO,eAcnD,QAAS3J,GAAoBC,GA+BzB,MAhBMA,KAGFA,EAAY3I,EAAG,2CAA4CgH,OAG/DuN,EAASE,cAAcuN,0BAA4BrZ,EAE7CvC,EAAGpC,UAAW,4CAEhBuQ,EAASE,cAAcsO,6BAA8B,SAGlDxO,GAASE,cAAcmN,wCACvBrN,GAASE,cAAcwN,0BAEvB1N,EAASO,cACXpP,KAAM,WAEH6O,EAASQ,gBAAiB,0BAItC,QAASnM,GAAqBoa,GAG1B,MADAzO,GAASE,cAAcsO,8BAAgCC,EAChDlP,EAAIH,IAAK,kBACZoP,8BAA+BC,IASvC,QAASC,KAGL3O,EAAIP,aAAc,yCAA0CE,KAAM,YAC7DvO,KAAM,SAAUC,GAEbyL,EAAMG,UACDzF,WAAYnG,EAASX,KAAK,IAC1B4M,UAAW,WAER5R,EAAG,mCAAoCkB,KAAM,SAAU5F,EAAG6F,GAEjDnB,EAAGmB,GAAQ6F,OAASuN,EAASE,cAAcuN,0BAE5ChiB,EAAGmB,GAAQF,KAAM,UAAW,WAI5BjB,EAAGmB,GAAQqJ,WAAY,eAG/BmH,UAAW,WAEX,MAAOiR,OAEVnW,SAWjB,QAASmW,KAEL,GAAI3R,GAAOjR,EAAG,4CAEd,IAAKiR,EAAKiL,eACV,CACI,GAAIxB,GAASzJ,EAAKqI,gBAAgB3E,SAASuO,oBAEvCC,GACAC,iBAAuB1I,EAAO2I,SAC9BC,YAAuB5I,EAAO6I,IAC9BC,sBAAuB9I,EAAO+I,UAC9BC,qBAAuBhJ,EAAOiJ,aAC9BC,aAAuBlJ,EAAOmJ,KAC9BC,YAAuBpJ,EAAOqJ,IAYlC,OATAjQ,GAAIJ,KAAM,gDAAiDyP,GACtDzd,KAAM,WAEH6O,EAASK,eAAelP,KAAM,WAE1BgD,EAAoB,GACpB6L,EAASQ,gBAAiB,6BAG/B,EAIP,OAAO,EAQf,QAASiP,KAGL1P,EAAIP,aAAc,wCAAyCE,KAAM,YAC5DvO,KAAM,SAAUC,GAEbyL,EAAMG,UACDzF,WAAYnG,EAASX,KAAK,IAC1B4M,UAAW,WAER5R,EAAG,mCAAoCkB,KAAM,SAAU5F,EAAG6F,GAEjDnB,EAAGmB,GAAQ6F,OAASuN,EAASE,cAAcuN,0BAE5ChiB,EAAGmB,GAAQF,KAAM,UAAW,WAI5BjB,EAAGmB,GAAQqJ,WAAY,eAG/BmH,UAAW,WAEX,MAAOkR,OAEVpW,SAUjB,QAASoW,KAEL,GAAI5R,GAAOjR,EAAG,2CAEd,IAAKiR,EAAKiL,eACV,CAEI,GAAIxB,GAASzJ,EAAKqI,gBAAgB3E,SAASsP,qBAEvCC,GACAC,MAAUzJ,EAAO0J,MACjBC,KAAU3J,EAAO4J,KACjBC,OAAU7J,EAAO8J,OACjBC,KAAU/J,EAAOgK,KACjBC,MAAUjK,EAAOkK,MACjBC,SAAUnK,EAAOoK,SAQrB,OALAhR,GAAIJ,KAAM,+CAAgDwQ,GACrDxe,KAAM,WAEH6O,EAASK,kBAEV,EAIP,OAAO,EAQf,QAASmQ,GAAuBnqB,GAI5B,GAAgE,GAA3D2Z,EAASE,cAAciI,uBAAuBG,UAE/C,GAAInC,GAAS1a,EAAG,iDAAkDsZ,oBAIlE,IAAIoB,GAAS1a,EAAG,mDAAoDsZ,eAGxE,IAAIjZ,IACA6a,OAAgBR,EAAOE,OACvBQ,QAAgBV,EAAOb,QACvBiB,IAAgBJ,EAAOI,IACvBK,KAAgBT,EAAOK,KACvBiK,WAAgBtK,EAAOuK,WACvBhK,eAAgB,aAGpB3G,GAAIP,aAAc,uCAAwC1T,GAAS4T,KAAM,YACpEvO,KAAM,SAAUC,GAEbyL,EAAMG,UACDzF,WAAYnG,EAASX,KAAK,IAC1ByH,SAWjB,QAASyY,KAEL,GAAIjU,GAAOjR,EAAG,2CACd,IAAKiR,EAAKiL,eACV,CAEI,GAAIxB,GAASzJ,EAAKqI,gBAGdjZ,GACA8kB,wBAA+BzK,EAAO0K,yBAA2B,EACjEC,gBAA+B3K,EAAO4K,iBAAmB,EACzDC,mBAA+B7K,EAAO8K,oBAAsB,EAC5DC,oBAA+B/K,EAAOgL,qBAAuB,EAC7DC,gBAA+BjL,EAAOkL,iBAAmB,EACzDC,8BAA+BnL,EAAOoL,+BAAiC,EACvEC,8BAA+BrL,EAAOsL,+BAAiC,EACvEC,mBAA+BvL,EAAOwL,oBAAsB,EAGhE,OAAOpS,GAAIJ,KAAM,6BAA8BrT,GAC1CqF,KAAM,SAAUC,GAEoC,IAA5CA,EAASX,KAAKmhB,2BAGfle,OAAO6C,SAASC,OAAQpF,EAASX,KAAKmhB,4BAGkB,IAAlDxgB,EAASX,KAAKohB,iCAGpBhV,EAAMG,UACDzF,WAAYnG,EAASX,KAAKohB,kCAC1B3U,gBAAiB,IACjBG,UAAW,WAER3J,OAAO6C,SAASC,OAAQkG,EAAKhQ,KAAM,aACnC0Q,UAAW,WAEf1J,OAAO6C,SAASC,OAAQkG,EAAKhQ,KAAM,aACnCwL,OAMJxE,OAAO6C,SAASC,OAAQkG,EAAKhQ,KAAM,cA1mBvD,OACIkV,KAAwBA,EACxB2K,uBAAwBA,EACxBoB,cAAwBA,EACxBG,mBAAwBA,EACxBlB,oBAAwBA,EACxB4D,sBAAwBA,EACxBxC,eAAwBA,EACxB7Z,mBAAwBA,EACxBE,oBAAwBA,EACxBqa,gBAAwBA,EACxBe,eAAwBA,EACxBkB,WAAwBA,KAqmB5B,aAAc,YAAa,aAAc,kBAAmB,kBACjE/e,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAGVA,EAAG1B,QAAS,kBAAmB,SAAUoP,GAerC,QAASuS,KAYL,QAASC,GAAqB3rB,EAAO4rB,GAIjC,MAFAC,GAAiBC,UAAY9rB,EAC7B6rB,EAAiBE,QAAYH,EACtBtuB,KAGX,QAAS0uB,GAAeC,EAAaC,EAAaC,GAG9C,GAAIzmB,IACA0mB,YAAcF,EACdG,SAAcR,EAAiBC,UAC/BQ,OAAcT,EAAiBE,QAC/BQ,aAAcJ,GAAgBK,IAAgBC,qBAElD,OAAOtT,GAAIpQ,IAAK,kBAAoBkjB,EAAc,IAAKvmB,GA1B3D,GAAImmB,IACAC,UAAW,KACXC,QAAW,KAGf,QACIW,QAASf,EACTgB,MAASX,GAgCjB,QAASY,KAkBL,QAASC,GAAYC,GAGjB,MADApnB,GAAOqnB,OAASD,EACTxvB,KAGX,QAAS0vB,GAAaC,GAGlB,MADAvnB,GAAOwnB,KAAOD,EACP3vB,KAGX,QAAS6vB,GAAYC,EAAQC,EAAMC,GAW/B,MATA5nB,GAAO6nB,OAASH,EACTC,IAEH3nB,EAAO8b,MAAQ6L,GAEZC,IAEH5nB,EAAO8nB,WAAaF,GAEjBhwB,KAGX,QAASmwB,GAAcxB,EAAaC,GAEhC,MAAO/S,GAAIJ,KAAM,kBAAoBkT,EAAc,IAAKvmB,GA3C5D,GAAIA,IACAqnB,OAAY,EACZG,KAAY,GACZK,OAAY,GACZ/L,MAAY,GACZgM,WAAY,EAGhB,QACIX,WAAaA,EACbG,YAAaA,EACbG,WAAaA,EACbnd,GAAayd,GAqCrB,QAASjB,KAEL,OACIkB,cAAsB,gBACtBC,aAAsB,eACtBlB,qBAAsB,yBAI9B,QAASmB,KAEL,OACIC,KAAU,OACVC,SAAU,WACVC,KAAU,QAvHlB,OACIrC,aAAeA,EACfkB,YAAeA,EACfoB,aAAeJ,IACfK,cAAezB,OAuHnB,gBACLhhB,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAYVA,EAAG1B,QAAS,mBAAoB,WAqB5B,QAASmkB,KAOL,MALOC,IAEHC,IAGGD,EAQX,QAASC,KAEL,GAAIC,EAuCJ,IAlCQA,EAJD/gB,OAAOghB,WAELhhB,OAAOghB,WAAY,sBAAuBC,QAEpC,KAEDjhB,OAAOghB,WAAY,qBAAsBC,QAExC,KAEDjhB,OAAOghB,WAAY,qBAAsBC,QAExC,KAIA,KAKNlpB,EAAGiI,QAASoS,SAAW,KAEjB,KAEDra,EAAGiI,QAASoS,SAAW,IAEtB,KAEDra,EAAGiI,QAASoS,SAAW,IAEtB,KAIA,KAGV2O,GAAQF,GAAuB,OAATE,EAC3B,CACI,GAAIG,GAAWL,CACfA,GAAeE,EACfhpB,EAAGiI,QAASlH,QAAS,cAAe+nB,EAAYK,KAIxD,QAASzf,GAAYmB,GAGjB,IAAM,GADFue,GAAeve,EAASnS,QAAS,MAAO,IAAKyB,MAAO,KAC9CmB,EAAI,EAAGA,EAAI8tB,EAAatvB,OAAQwB,IAEtC,GAAK8tB,EAAa9tB,IAAMwtB,EAEpB,OAAO,CAGf,QAAO,EA5FX,GAAIA,EAQJ,OALA9oB,GAAGiI,QAASohB,OAAQN,GAGpB/oB,EAAGU,UAAW+S,MAAOsV,IAGjBle,SAAYge,EACZnf,WAAYA,MAuFrBvD,OAAQnD,iBAaV,SAAUhD,EAAGoG,GASVA,EAAG1B,QAAS,mBAAoB,SAAU4P,EAAKC,GAkD3C,QAAS4B,KASL,GALAvI,EAAa5N,EAAG,4CAChBgV,EAAahV,EAAG,4CAChBspB,EAAatpB,EAAG,iCAChBupB,EAAavpB,EAAG,iCAEX4N,EAAW9T,QAAUkb,EAAUlb,QAAUkb,EAAUlb,OAAS,EACjE,CACmBya,EAASE,aAExBO,GAAU1I,OAGVsB,EAAW1M,KAAM,SAAU5F,EAAGiL,GAE1BvG,EAAGuG,GAAOyD,SAAU,YAEpBhK,EAAGuG,GAAOyI,MAAO,WAEPhP,EAAG/H,MAAO6I,GAAI,cAEhB0oB,EAAMluB,OAKlBguB,EAAWroB,KAAM,WAAY,YAC7BqoB,EAAWta,MAAO,WAEdya,MAGJF,EAAWtoB,KAAM,WAAY,YAC7BsoB,EAAWva,MAAO,WAEd0a,MAGJzhB,OAAO0hB,iBAAkB,aAAc,WAE9B1hB,OAAO6C,SAAS8e,KAAK9vB,OAAS,EAE/BoR,EAAQjD,OAAO6C,SAAS8e,MAIxBJ,EAAM,KAEX,GAIHxpB,EAAE6pB,SAAW,SAAU7rB,GAEnB,GAAI8d,GAAU,GAAIvhB,QAAQ,OAAUyD,EAAO,aAAc8rB,KAAM7hB,OAAO6C,SAASF,KAC/E,OAAgB,OAAXkR,EAEM,KAIAA,EAAQ,IAAM,EAI7B,IAAI5Z,GAAQlC,EAAE6pB,SAAU,UAEY,IAA/B5hB,OAAO6C,SAAS8e,KAAK9vB,QAAiBoI,GAASlC,EAAG,6BAA+BkC,EAAQ,MAAOpI,OAAS,EAE1GmO,OAAO6C,SAAS8e,KAAO1nB,EAKvBsnB,GAFOte,EAAQjD,OAAO6C,SAAS8e,OAAUxb,GAAW,EAE9CA,EAIA,GAGV2b,IACA/pB,EAAGiI,QAAS3H,GAAI,aAAcypB,GAC9B/pB,EAAGiI,QAASohB,OAAQ,WAEqC,MAAhDjjB,EAAG/C,cAAcoH,iBAAiBI,YAEnCkf,OAYhB,QAASC,KAEL,MAAK5b,IAAW,GAGR1B,GAAO1M,EAAGgV,EAAU5G,IAAWnN,KAAM,2BACrCrD,MAAOwQ,GAKJ,KAmBf,QAAS6b,GAAcC,GAGnB,MADAC,GAAaF,aAAaxuB,KAAMyuB,GACzB9jB,EAAG/C,cAAcqH,iBAS5B,QAAS0f,GAAaF,GAGlB,MADAC,GAAaC,YAAY3uB,KAAMyuB,GACxB9jB,EAAG/C,cAAcqH,iBAY5B,QAAS2f,GAAqBtmB,EAAYnG,GAEtC,GAAI0sB,IAAoB,CAExB,IAAKlc,GAAW,GAAoB,gBAAfrK,EACrB,CAEI,GAAIwmB,GAAmBP,IACnBQ,GACA5sB,MAAOA,EACP8O,GAAO1M,EAAGgV,EAAUpX,IAASqD,KAAM,2BAGvCjB,GAAEkB,KAAMipB,EAAapmB,GAAa,SAAUzI,EAAG4uB,GAE3C,MAAKA,GAAaK,EAAkBC,MAAsB,GAEtDF,GAAoB,GACb,GAHX,SAQR,MAAOA,GAUX,QAASd,GAAM5rB,EAAO6sB,GAGlB,GAAIC,GAAiBtc,IAAYxQ,IAE5B8sB,GAAmBD,GAEdJ,EAAqB,eAAgBzsB,MAM/CwQ,EAAUxQ,GAEJZ,OAAO2G,OAAQgnB,EAAevc,GAAUmG,EAASE,aAAa,KAAYiW,GAAoB1qB,EAAGgV,EAAU5G,IAAWnN,KAAM,iCAE9H0pB,EAAevc,GAAWmG,EAASE,aAAa,GAEhDH,EAAIF,mBAAoBpU,EAAGgV,EAAU5G,IAAWnN,KAAM,iCACjDyE,KAAM,SAAUC,GAEb3F,EAAGgV,EAAU5G,IAAW6G,KAAMtP,EAASX,KAAK,IAE5C4lB,EAAkBF,GAClBtkB,EAAG/C,cAAce,eAAgB4Q,EAAU5G,IAC3CpO,EAAGiI,QAASlH,QAAS,qBAM7B6pB,EAAkBF,IAM1B,QAASE,GAAkBF,GAIvB1qB,EAAGgV,GAAY1I,MAGf,IAAIpM,EACJF,GAAG4N,GAAa1M,KAAM,SAAU5F,EAAGiL,GAE/BrG,EAAQF,EAAGuG,GACXrG,EAAMoJ,YAAa,mBAEnBpJ,EAAMoE,KAAM,gBAAiBrD,KAAM,gBAAiB,SAE3CmN,EAAJ9S,EAGD4E,EAAM8J,SAAU,WAIX1O,GAAK8S,GAENlO,EAAM8J,SAAU,kBAChB9J,EAAMoE,KAAM,gBAAiBrD,KAAM,gBAAiB,SAI/C3F,EAAI8S,IAAYlO,EAAMY,GAAI,aAG3BZ,EAAM8J,SAAU,cAKhC+f,IAGgB,GAAX3b,EAEDmb,EAAWtoB,KAAM,WAAY,YAI7BsoB,EAAW/e,WAAY,YAItB4D,EAAU,GAAKR,EAAW9T,OAE3BwvB,EAAWroB,KAAM,WAAY,YAI7BqoB,EAAW9e,WAAY,YAI3BxK,EAAGgV,EAAU5G,IAAW3B,OAGnB2B,EAAU,EAEXnG,OAAO6C,SAAS8e,KAAO5pB,EAAGgV,EAAU5G,IAAWnN,KAAM,2BAIhDgH,OAAO6C,SAAS8e,KAAK9vB,OAAS,IAE/BmO,OAAO6C,SAAS8e,KAAO,IAI1Bc,GAEDL,EAAqB,cAAejc,GAS5C,QAASyc,GAAgBL,GAErBhB,EAAMgB,EAAgB5sB,OAAO,GAYjC,QAAS6rB,KAEArb,EAAUR,EAAW9T,OAAS,GAE/B0vB,EAAMpb,EAAU,GAQxB,QAASsb,KAEAtb,EAAU,GAEXob,EAAMpb,EAAU,GAUxB,QAASlD,GAAQ4f,GAEb,MAAoB,QAAfA,GAEDrB,KACO,GAEc,QAAfqB,GAENpB,KACO,IAIPoB,EAAcA,EAAYpyB,QAAS,IAAK,IACxCsH,EAAGgV,GAAY9T,KAAM,SAAU5F,EAAGiL,GAE9B,MAAKvG,GAAGuG,GAAOtF,KAAM,4BAA+B6pB,GAEhDtB,EAAMluB,IACC,GAHX,UAQD,GAQX,QAASyuB,KAGL,GAAIgB,GAAkBnd,EAAW9T,MACjC,MAAwB,GAAnBixB,GAAL,CAMA/qB,EAAG4N,GAAapD,WAAY,SAC5BxK,EAAG4N,GAAae,SAAU,QAASnE,WAAY,SAC/CxK,EAAGspB,GAAa9e,WAAY,SAC5BxK,EAAGupB,GAAa/e,WAAY,QAE5B,IAAIwgB,GAAehrB,EAAGupB,GAAajP,aAAeta,EAAGspB,GAAahP,aAAgBta,EAAGspB,GAAahP,YAAY,GAAS,EAAIta,EAAGupB,GAAajP,YAAY,GAAS,CAChKta,GAAGspB,GAAajd,KAAMgO,MAAO2Q,EAAc,OAC3ChrB,EAAGupB,GAAald,KAAMgO,MAAO2Q,EAAc,MAG3C,IAAI3Q,GAAQra,EAAG4N,GAAa/Q,SAASA,SAASyd,YAAY,GAAW,EAAI0Q,CACzE3Q,IAAS5W,SAAUzD,EAAG4N,GAAa/Q,SAASwP,IAAK,eAAmB5I,SAAUzD,EAAG4N,GAAa/Q,SAASwP,IAAK,eAE5G,IAAI4e,GAAW5Q,EACX6Q,IAEJlrB,GAAG4N,GAAa1M,KAAM,SAAU5F,EAAGiL,GAE/B0kB,GAAWxnB,SAAUzD,EAAGuG,GAAO8F,IAAK,eACpC4e,GAAWxnB,SAAUzD,EAAGuG,GAAO8F,IAAK,gBAEpC6e,EAAS5vB,GAAK0E,EAAGuG,GAAOoI,SAAU,QAAS0L,QAC3C4Q,GAAWC,EAAS5vB,GAEpB2vB,GAAWxnB,SAAUzD,EAAGuG,GAAOoI,SAAU,QAAStC,IAAK,eACvD4e,GAAWxnB,SAAUzD,EAAGuG,GAAOoI,SAAU,QAAStC,IAAK,iBAG3D,IAEI8e,GAAaC,EAFbC,EAAkB5nB,SAAUwnB,EAAUF,EAGrCM,GAAkB,GAAK,GAExBF,EAAiBE,EAAkB,EAAM,GACzCD,EAAiBC,EAAkB,EAAM,KAIzCF,EAAeE,EAAkB,EACjCD,EAAeC,EAAkB,EAGrC,IACIC,GAAiBC,EADjBC,EAAkB/nB,SAAUwnB,GAAcF,EAAkB,IAAQI,EAAcC,GAEjFI,GAAkB,GAAK,GAExBF,EAAqBE,EAAkB,EAAM,GAC7CD,EAAqBC,EAAkB,EAAK,KAI5CF,EAAmBE,EAAkB,EACrCD,EAAmBC,EAAkB,EAIzCxrB,GAAG4N,GAAa1M,KAAM,SAAU5F,EAAGiL,GAEtBwkB,EAAkB,EAAtBzvB,EAED0E,EAAGuG,GAAOoI,SAAU,QAAStC,KAAM8e,YAAeA,EAAc,KAAMC,aAAgBA,EAAe,OAIrGprB,EAAGuG,GAAOoI,SAAU,QAAStC,KAAM8e,YAAeG,EAAkB,KAAMF,aAAgBG,EAAmB,UA/fzH,GAAI3d,MACAoH,KACA5G,EAAU,GACVmb,KACAD,KACAa,GACAF,gBACAG,gBAEAO,IAEJ,QACIxU,KAAqBA,EACrB6T,oBAAqBA,EACrBR,KAAqBA,EACrBS,aAAqBA,EACrBG,YAAqBA,EACrBS,eAAqBA,EACrBpB,KAAqBA,EACrBC,SAAqBA,EACrBxe,OAAqBA,EACrB6e,eAAqBA,KAifzB,aAAc,qBAEnB5jB,OAAQnD,iBAWV,SAAUhD,EAAGoG,GAEVA,EAAG1B,QAAS,oBAAqB,SAAUoP,EAAK1C,EAAOnE,GAYnD,QAASiM,KAEL,GAAIgC,GAASlb,EAAG,wBAAyBgH,KACzC,OAAiC,eAAxBkU,EAAOL,eAA0D,eAAxBK,EAAOL,cAG7D,QAAS4Q,KAELC,GACIC,qBAAuB3rB,EAAG,uBAAwB,iDAClD4rB,kBAAuB5rB,EAAG,oBAAqB,iDAC/C6rB,mBAAuB7rB,EAAG,qBAAsB,iDAChD8rB,sBAAuB9rB,EAAG,wBAAyB,kDAIvD0rB,EAAeC,qBAAqB3kB,IAAK,IAEnC0kB,EAAeE,kBAAkB5kB,MAAMlN,OAAS,GAAK4xB,EAAeG,mBAAmB7kB,MAAMlN,OAAS,EAGxGga,EAAIpQ,IAAK,iDAEDuX,eAAgB,aAChB8Q,IAAgBL,EAAeE,kBAAkB5kB,MACjDmU,KAAgBuQ,EAAeG,mBAAmB7kB,QAGrDtB,KAAM,SAAUC,GAEb5F,EAAkB4F,EAASX,KAC3BgnB,EAAkBjsB,EAAOjG,OAED,GAAnBkyB,GAEDC,GAOJ,KAAM,GAJF5rB,IACAsb,cAGMrgB,EAAI,EAAO0wB,EAAJ1wB,EAAqBA,IACtC,CACI,GAAI4wB,GAAmB,KACnBC,EAAmBpsB,EAAOzE,GAAG8wB,uBAC7BC,EAAmBF,EAAe,GACtCE,IAAyBtV,KAAKC,MAA0B,IAAnBqV,GAA2B,KAAKC,QAAS,GAAK5zB,QAAS,IAAK,KAE7E,IAAfyzB,IAEDE,EAAmBF,EACnBD,EAAmB,KAGvB7rB,EAAOsb,UAAUlgB,MACbmC,MAAWtC,EACX4wB,UAAWA,EACXtxB,KAAWmF,EAAOzE,GAAGixB,4BAA8B,cAAgB,cACnE/H,OAAWzkB,EAAOzE,GAAGixB,4BAA8BxsB,EAAOzE,GAAGkxB,4BAA8BzsB,EAAOzE,GAAGmxB,2BACrGvR,OAAWnb,EAAOzE,GAAGqwB,qBACrBvQ,QAAWrb,EAAOzE,GAAGwwB,sBACrBC,IAAWhsB,EAAOzE,GAAGswB,kBACrBzQ,KAAWpb,EAAOzE,GAAGuwB,mBACrBa,SAAW3sB,EAAOzE,GAAGqxB,uBACrBC,SAAWP,EACXQ,OAAW9sB,EAAOzE,GAAGwxB,uBAI7B,GAAI7X,GAAO7O,EAAGrB,gBAAiB,qCAAsC1E,EAErE+Q,GAAMG,UACDC,SAAUpL,EAAGnB,UAAW,+CACxB6G,WAAYmJ,GACZQ,SAAU,YACV9D,UAAW,WA8BR,MA5BA+Z,GAAeG,mBAAmBviB,YAAa,aAAcU,SAAU,eACvEhK,EAAG,cAAgB0rB,EAAeG,mBAAmB5qB,KAAM,MAAS,MAAOqI,YAAa,aAAcU,SAAU,eAEhH0hB,EAAeE,kBAAkBtiB,YAAa,aAAcU,SAAU,eACtEhK,EAAG,cAAgB0rB,EAAeE,kBAAkB3qB,KAAM,MAAS,MAAOqI,YAAa,aAAcU,SAAU,eAE/G0hB,EAAeC,qBAAqBriB,YAAa,aAAcU,SAAU,eACzEhK,EAAG,cAAgB0rB,EAAeC,qBAAqB1qB,KAAM,MAAS,MAAOqI,YAAa,aAAcU,SAAU,eAElH0hB,EAAeI,sBAAsBxiB,YAAa,aAAcU,SAAU,eAC1EhK,EAAG,cAAgB0rB,EAAeI,sBAAsB7qB,KAAM,MAAS,MAAOqI,YAAa,aAAcU,SAAU,eAEnH+iB,EAAgB/sB,EAAG,kDAAmDgH,MAEjEjH,EAAOgtB,GAAeR,6BAEvBvsB,EAAG0rB,EAAeC,sBAAuB3kB,IAAK,eAC9ChH,EAAG0rB,EAAeI,uBAAwB9kB,IAAKjH,EAAOgtB,GAAeP,+BAIrExsB,EAAG0rB,EAAeC,sBAAuB3kB,IAAK,eAC9ChH,EAAG0rB,EAAeI,uBAAwB9kB,IAAKjH,EAAOgtB,GAAeN,6BAEzEzsB,EAAG0rB,EAAeC,sBAAuB5qB,QAAS,UAElDf,EAAG0rB,EAAeG,oBAAqB7kB,IAAKjH,EAAOgtB,GAAelB,oBAClE7rB,EAAG0rB,EAAeE,mBAAoB5kB,IAAKjH,EAAOgtB,GAAenB,oBAC1D,IAEVnf,SAKbwf,IAKR,QAASA,KAELhf,EAAUkF,WAAY,EAAG/L,EAAGnB,UAAW,2CAEvCymB,EAAeG,mBAAmBviB,YAAa,eAAgBU,SAAU,aACzEhK,EAAG,cAAgB0rB,EAAeG,mBAAmB5qB,KAAM,MAAS,MAAOqI,YAAa,eAAgBU,SAAU,aAElH0hB,EAAeE,kBAAkBtiB,YAAa,eAAgBU,SAAU,aACxEhK,EAAG,cAAgB0rB,EAAeE,kBAAkB3qB,KAAM,MAAS,MAAOqI,YAAa,eAAgBU,SAAU,aAEjH0hB,EAAeG,mBAAmB3R,MAAO,WAErCla,EAAG/H,MAAOqR,YAAa,YACvB,IAAI0jB,GAAUhtB,EAAG/H,MAAOgJ,KAAM,KAC9BjB,GAAG/H,MAAOg1B,QAAS,eAAgB3oB,KAAM,SAAW0oB,EAAU,MAAO1jB,YAAa,eAGtFoiB,EAAeE,kBAAkB1R,MAAO,WAEpCla,EAAG/H,MAAOqR,YAAa,YACvB,IAAI0jB,GAAUhtB,EAAG/H,MAAOgJ,KAAM,KAC9BjB,GAAG/H,MAAOg1B,QAAS,eAAgB3oB,KAAM,SAAW0oB,EAAU,MAAO1jB,YAAa,eArJ1F,GAAIyjB,GAAkB,GAClBrB,KACAM,KACAjsB,IAEJ,QACI0rB,oBAAqBA,EACrBvS,cAAqBA,KAiJzB,aAAc,eAAgB,eAEnC/S,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAQVA,EAAG1B,QAAS,qBAAsB,WAuB9B,QAASwoB,GAAYnpB,GAEjB,GAAId,IACAkqB,gBAAiB,2DACFC,iBACb,aAAeC,mBAAoBC,KACnC,qQAQFC,qBAAsB,2DACPH,iBACb,aAAeC,mBAAoBC,KACnC,0QAQFE,QAAW,qEACCH,mBAAoBC,KAC9B,aAAeG,IACf,2IAGFC,cAAe,wDAGGJ,IAAW,mEACkCK,WAAa,sQAGhF,OAAO1qB,GAASc,GASpB,QAASupB,KAEL,GAAIM,GAAYltB,SAASoK,SAASF,KAC9BijB,EAAY7tB,EAAG,uBAAwBiB,KAAM,OAWjD,OATK4sB,IAAaA,EAAU/zB,OAAS,IAE5B+zB,EAAUxvB,QAAS,QAAW,IAE/BwvB,EAAYntB,SAASoK,SAASgjB,SAAW,KAAOptB,SAASoK,SAASijB,KAAOF,GAE7ED,EAAMC,GAGHD,EASX,QAASI,GAAShwB,GAEd,GAAIiwB,GAAcjuB,EAAG,cAAgBhC,EAAO,MAAOiD,KAAM,UACzD,OAAOgtB,IAAe,GAS1B,QAASR,KAEL,GAAIlY,GAAUyY,EAAS,YACnBE,EAAUF,EAAS,aAWvB,OATKzY,GAAMzb,OAAS,GAAKo0B,EAAQp0B,OAAS,EAEtCyb,GAAS,MAAQ2Y,EAIjB3Y,EAAQvV,EAAG,SAAUkF,OAGlBmoB,mBAAoB9X,GA1G/B,MATiC,mBAAtB,oBAEP6X,iBAAmB,SAEI,mBAAhB,cAEPO,WAAa,OAIbhd,iBAAkBuc,MA8G3B/mB,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAQVA,EAAG1B,QAAS,oBAAqB,WAc7B,QAASypB,GAAgBttB,GAGrB,MADAA,GAAUb,EAAGa,GACRA,EAAQC,GAAI,UAAaD,EAAQC,GAAI,WAAcD,EAAQC,GAAI,YAEzDD,EAIFA,EAAQyD,KAAM,SAAUxK,OAAS,EAE3B+G,EAAQyD,KAAM,SAGfzD,EAAQyD,KAAM,UAAWxK,OAAS,EAEjC+G,EAAQyD,KAAM,UAGfzD,EAAQyD,KAAM,YAAaxK,OAAS,EAEnC+G,EAAQyD,KAAM,YAKd,KAanB,QAAS8pB,GAAcC,GAGnB,MAAKA,GAAYvtB,GAAI,UAAautB,EAAYvtB,GAAI,WAAcutB,EAAYvtB,GAAI,YAGrEd,EAAE4B,KAAMysB,EAAYrnB,OAAQlN,OAAS,GAK5C+H,QAAQC,MAAO,+CAAiDusB,EAAYC,KAAM,WAAc,MACzF,GAWf,QAASC,GAAcF,GAEnB,GAAIG,GAAa,yIACjB,OAAKJ,GAAcC,GAERG,EAAWpxB,KAAM4C,EAAE4B,KAAMysB,EAAYrnB,SAIrC,EAWf,QAASynB,GAAgBJ,GAErB,MAAKD,GAAcC,GAERruB,EAAE0uB,UAAW1uB,EAAE4B,KAAMysB,EAAYrnB,SAIjC,EAYf,QAAS2nB,GAAeN,EAAaO,GAEjC,MAAK5uB,GAAG4uB,GAAY90B,OAAS,EAElBkG,EAAE4B,KAAMysB,EAAYrnB,QAAWhH,EAAE4B,KAAM5B,EAAG4uB,GAAY5nB,OAItDhH,EAAE4B,KAAMysB,EAAYrnB,QAAW4nB,EAI9C,QAASC,GAAYR,GAEjB,MAAOA,GAAYvtB,GAAI,YAG3B,QAASguB,GAAWT,GAEhB,MAAOA,GAAYvtB,GAAI,YAoD3B,QAASkQ,GAAUC,EAAMC,GAErB,GAAImd,GAAaU,EAAcC,EAAeC,EAAiBC,EAAO1f,EAAS2f,EAAYC,EAAYC,EAAcC,EAAgBC,EACjIlW,EAAgBrZ,EAAGiR,EACvBC,GAAoBA,GAAc,WAClC,IAAIse,MACAC,GAAgB,CAGpBpW,GAAM/U,KAAM,qCAAsCpD,KAAM,SAAU5F,EAAGiL,GAEjE8oB,EAAervB,EAAGuG,GAAOtF,KAAM,wBAC/B8tB,EAAeZ,EAAgB5nB,GAE/B+oB,EAAmBD,EAAeA,EAAe,OACjDC,EAAiBA,EAAen1B,MAAO,IAEvC,KAAM,GAAImB,GAAI,EAAGxB,EAASi1B,EAAaj1B,OAAYA,EAAJwB,EAAYA,IAC3D,CAII,GAHA+yB,EAAsBruB,EAAG+uB,EAAazzB,IACtCi0B,EAAsBlB,EAAYptB,KAAM,SAElC4tB,EAAYR,KAAkBS,EAAWT,GAE3C,MAOJ,IAJAW,EAAkBM,EAAeh0B,GAAGsG,QAAU0tB,EAAe,GAAG1tB,OAChEqtB,GAAkB,EAGZZ,EAAYvtB,GAAI,UACQ,SAAvByuB,GACuB,YAAvBA,GACAlB,EAAYvtB,GAAI,YAEnB,OAASkuB,GAGL,IAAK,OACDC,GAAmBb,EAAcC,EACjC,MAEJ,KAAK,OACDY,GAAmBV,EAAcF,EACjC,MAEJ,KAAK,SACDY,GAAmBR,EAAgBJ,EACnC,MAEJ,KAAK,QACDY,GAAmBN,EAAeN,EAAaruB,EAAGuG,GAAOtF,KAAM,gCAC/D,MAEJ,KAAK,OAED,KAEJ,SACIY,QAAQC,MAAO,sDAAwDutB,EAAe,SAI7F,KAAKhB,EAAYvtB,GAAI,UACK,SAAvByuB,GACsB,YAAvBA,EAqBF,CAAA,IAAKlB,EAAYvtB,GAAI,UAQtB,WADAe,SAAQC,MAAO,0BAA4B9B,EAAGuG,GAAO+nB,KAAM,WAAc,oCAJzEW,GAAyC,IAArBZ,EAAYrnB,OAAoC,MAArBqnB,EAAYrnB,UAvB/D,CAKI,GAHAkoB,EAAUb,EAAYptB,KAAM,QAC5BuO,EAAU6J,EAAM/U,KAAM,eAAiB4qB,EAAQ,cAAep1B,OAElC,SAAvBy1B,EAEDJ,EAAa,EACbC,EAAa,MAGjB,CACI,GAAIM,GAAS,GAAKC,UAAS,UAAYN,OAAqBO,IAAK,EAAGC,IAAK,EACzEV,GAAaO,EAAOE,IACpBR,EAAaM,EAAOG,IAGxBZ,EAA8BE,EAAV3f,GAAwBA,EAAU4f,EAcrDH,IAEDQ,GAAW,EACXD,EAAc/zB,KAAM4yB,GAEfU,EAAaj1B,OAAS,GAEvBu0B,EAAYrkB,SAAUkH,GACtBmI,EAAM/U,KAAM,cAAgB+pB,EAAYptB,KAAM,MAAS,MAAO+I,SAAUkH,IAIxElR,EAAGuG,GAAOyD,SAAUkH,OAQpCmI,EAAM/Y,GAAI,mBAAoB,WAE1B,GAAIwvB,GAAgB,GAChBC,EAAgB1W,EAAM/U,KAAM,IAAM4M,GAAa8e,QAC/CC,EAAgBF,EAAOG,SAASzV,IAChC0V,EAAgBnwB,EAAG,aAGlBqZ,GAAMvS,QAAS,UAAWhN,OAAS,GAEpCq2B,EAAgB9W,EAAMvS,QAAS,UAAWxC,KAAM,eAChD2rB,EAAgBE,EAAc9iB,aAAgB8iB,EAAcD,SAASzV,IAAMsV,EAAOG,SAASzV,MAGrFpB,EAAMvY,GAAI,YAEhBqvB,EAAgB9W,EAAM/U,KAAM,eAC5B2rB,EAAgBE,EAAc9iB,aAAgB8iB,EAAcD,SAASzV,IAAMsV,EAAOG,SAASzV,OAI1FwV,EAAcH,EAAc7nB,OAAOmoB,aAAeH,EAAehoB,OAAOmoB,YAAcnoB,OAAOooB,cAE9FF,EAAclhB,SACV5B,UAAW4iB,EAAcH,MAKhCL,IAGDpW,EAAM/U,KAAM,IAAM4M,GAAahQ,KAAM,SAAU5F,EAAGiL,GAE9C8nB,EAAcruB,EAAGmuB,EAAgB5nB;AACjC8nB,EAAY/tB,GAAI,cAAe,WAE3B,GAAIgwB,GAAgBtwB,EAAGuG,EACvB+pB,GAAchnB,YAAa4H,GAC3BmI,EAAM/U,KAAM,cAAgBtE,EAAG/H,MAAOgJ,KAAM,MAAS,MAAOqI,YAAa4H,OAIjFmI,EAAMtY,QAAS,oBAAqByuB,IAGxC,IAAIpvB,GAAWiZ,EAAMpY,KAAM,uBAE3B,KAAMwuB,GAAcrvB,GAAwB,UAAZA,GAAmD,kBAApB6H,QAAO7H,GACtE,CAEI,GAAI6Y,KAcJ,OAbAI,GAAM/U,KAAM,2BAA4BpD,KAAM,WAET,YAA5BlB,EAAG/H,MAAOgJ,KAAM,QAEjBgY,EAAOjZ,EAAG/H,MAAOgJ,KAAM,SAAYjB,EAAG/H,MAAO6I,GAAI,YAIjDmY,EAAOjZ,EAAG/H,MAAOgJ,KAAM,SAAYjB,EAAG/H,MAAO+O,QAIrDiB,OAAO7H,GAAW6Y,IACX,EAIP,OAAQwW,EAnXhB,OACIze,SAAUA,KA4XlBhR,EAAEuwB,GAAGrU,aAAe,WAEhB,MAAO9V,GAAG/C,cAAc0N,kBAAkBC,SAAU/Y,OAOxD+H,EAAEuwB,GAAGjX,cAAgB,WAMjB,QAASkX,GAAQhW,EAAU3f,GAEvB,GAAI8C,GAAQ6c,EAAS7c,MAAO,gBAE5B,IAAOA,EAAM,GACb,CACI,GACI8yB,GADAC,EAAW,eAEX/hB,IAEJ,KADAA,EAAS,GAAMhR,EAAM,GACsB,QAAlC8yB,EAAQC,EAAI5G,KAAMnsB,EAAM,MAE7BgR,EAASlT,KAAMg1B,EAAM,GAGzB,KAAM,GAAIn1B,GAAIqT,EAAS7U,OAAS,EAAGwB,GAAK,EAAGA,IAC3C,CACI,GAAI0L,KACJA,GAAI2H,EAASrT,IAAMT,EACnBA,EAAmBmM,EAEvB0T,EAAS1a,EAAE6U,QAAQ,EAAM6F,EAAQ7f,OAIjC6f,GAAO/c,EAAM,IAAM9C,EA5B3B,GAAIoW,GAAShZ,KACTyiB,IA2DJ,OA5BAzJ,GAAK3M,KAAM,2BAA4BpD,KAAM,SAAU5F,EAAGiL,GAEtD,GAAOvG,EAAGuG,GAAOtF,KAAM,QAEnB,GAAiC,YAA5BjB,EAAGuG,GAAOtF,KAAM,QACrB,CAEI,GAAI0vB,KACJ3wB,GAAGiR,GAAO3M,KAAM,UAAYtE,EAAGuG,GAAOtF,KAAM,QAAW,cAAeC,KAAM,SAAU3B,EAAGqxB,GAErFD,EAAYl1B,KAAMuE,EAAG4wB,GAAW5pB,SAEpCwpB,EAAQxwB,EAAGuG,GAAOtF,KAAM,QAAU0vB,OAEA,SAA5B3wB,EAAGuG,GAAOtF,KAAM,QAEjBjB,EAAGuG,GAAOzF,GAAI,aAEf0vB,EAAQxwB,EAAGuG,GAAOtF,KAAM,QAAUjB,EAAGuG,GAAOS,OAKhDwpB,EAAQxwB,EAAGuG,GAAOtF,KAAM,QAAUjB,EAAGuG,GAAOS,SAKjD0T,IAEZvU,OAAQnD,iBAyBXA,gBAAgB8C,SAGhB,IAAI+qB,QAAS7tB,gBAAgBK,aAQ7B8C,QAAQzF,UAAW+S,MAAO,WAEtBod,OAAOzsB", + "sourcesContent": [ + "var TemplateCache = {};\n\nTemplateCache[\"addressSuggestions/addressDoctor.html\"] = \"\";\n\nTemplateCache[\"addressSuggestions/postFinder.html\"] = \"{{#addresses}}\\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"{{/addresses}}\\n\" +\n \"\";\n\nTemplateCache[\"error/errorMessage.html\"] = \"
    \\n\" +\n \" Code {{code}}:\\n\" +\n \" {{{message}}}\\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"error/errorPopup.html\"] = \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"modal/modal.html\"] = \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#title}}\\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"

    {{{title}}}

    \\n\" +\n \"
    \\n\" +\n \" {{/title}}\\n\" +\n \"\\n\" +\n \"
    {{{content}}}
    \\n\" +\n \"\\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#labelDismiss}}\\n\" +\n \" \\n\" +\n \" {{/labelDismiss}}\\n\" +\n \"\\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"waitscreen/waitscreen.html\"] = \"
    \";\n\n(function defineMustache(global,factory){if(typeof exports===\"object\"&&exports&&typeof exports.nodeName!==\"string\"){factory(exports)}else if(typeof define===\"function\"&&define.amd){define([\"exports\"],factory)}else{global.Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)===\"[object Array]\"};function isFunction(object){return typeof object===\"function\"}function typeStr(obj){return isArray(obj)?\"array\":typeof obj}function escapeRegExp(string){return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")}function hasProperty(obj,propName){return obj!=null&&typeof obj===\"object\"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"/\":\"/\"};function escapeHtml(string){return String(string).replace(/[&<>\"'\\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\\s*/;var spaceRe=/\\s+/;var equalsRe=/\\s*=/;var curlyRe=/\\s*\\}/;var tagRe=/#|\\^|\\/|>|\\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile===\"string\")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error(\"Invalid tags: \"+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+\"\\\\s*\");closingTagRe=new RegExp(\"\\\\s*\"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp(\"\\\\s*\"+escapeRegExp(\"}\"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===\"\"};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return\"\";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail=\"\";break;case 0:match=\"\";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={\".\":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(\".\")>0){value=context.view;names=name.split(\".\");index=0;while(value!=null&&index\")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol===\"&\")value=this.unescapedValue(token,context);else if(symbol===\"name\")value=this.escapedValue(token,context);else if(symbol===\"text\")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer=\"\";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j\n * =====================================================================================\n */\n\n/**\n * @module PlentyFramework\n */\n(function( $ )\n{\n // will be overridden by grunt\n var version = \"1.0.8\";\n\n /**\n * Collection of uncompiled registered factories & services.\n * See {{#crossLink \"PlentyFramework/compile:method\"}}.compile(){{/crossLink}}\n * @attribute components\n * @static\n * @type {{factories: {}, services: {}}}\n */\n var components = {\n factories : {},\n services : {},\n directives: {}\n };\n\n /**\n * Framework providing client functions for plentymarkets Webshops.\n * @class PlentyFramework\n * @constructor\n */\n PlentyFramework = function()\n {\n };\n\n var instance = null;\n PlentyFramework.getInstance = function()\n {\n instance = instance || new PlentyFramework();\n return instance;\n };\n\n PlentyFramework.version = (function() {\n\n return {\n get: function() {\n return version;\n },\n equals: function( v ) {\n return compare(v) == 0;\n },\n compare: compare\n };\n\n function compare( compare )\n {\n var localVersion = version.split(\".\");\n var compareVersion = compare.split(\".\");\n\n for( var i = 0; i < compareVersion.length; i++ )\n {\n if( localVersion[i] === compareVersion[i] || compareVersion[i] === \"*\" )\n {\n continue;\n }\n\n if( parseInt(localVersion[i]) < parseInt(compareVersion[i]) )\n {\n return -1;\n }\n\n if( parseInt(localVersion[i]) > parseInt(compareVersion[i]) )\n {\n return 1;\n }\n }\n return 0;\n }\n\n })();\n\n /**\n * Customizable controls for partials will be injected here.\n * (e.g. Modal)\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.partials = {};\n\n /**\n * Collection of registered global variables\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.globals = {};\n\n /**\n * Set a global variable.\n * @function setGlobal\n * @static\n * @param {string} identifier A unique identifier to reference this variable\n * @param {*} value The value to set\n * @return {*} The value\n */\n PlentyFramework.setGlobal = function( identifier, value )\n {\n if ( PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n console.error( 'Global variable \"' + identifier + '\" already exists and cannot be overridden.' );\n return null;\n }\n\n PlentyFramework.globals[identifier] = value;\n\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Get the value of a global variable or undefined if not exists\n * @function getGlobal\n * @static\n * @param identifier The identifier of the requested variable\n * @return {*} The value of the variable\n */\n PlentyFramework.getGlobal = function( identifier, fallbackValue )\n {\n if( !PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n return fallbackValue;\n }\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Collection of registered directives\n * @type {Array}\n * @static\n */\n PlentyFramework.directives = {};\n\n /**\n * Register directive. Directives can be bound to dynamically added nodes by calling pm.bindPlentyFunctions();\n * @function directive\n * @static\n * @param {string} selector jQuery selector of the DOM-elements to bind the directive to\n * @param {function} callback Function to add directives behaviour\n * @param {Array} dependencies List of required services. Services will be passed to callback function\n * @param {boolean} allowDuplicates Defines if a directive can be bound to the same element multiple times\n * @return {object} The created directive\n */\n PlentyFramework.directive = function( directiveName, directiveFunctions, dependencies )\n {\n // Catch type mismatching for 'directiveName'\n if ( typeof directiveName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof directiveName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof directiveFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof directiveFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.directives[directiveName] = {\n name : directiveName,\n dependencies: dependencies,\n setup : directiveFunctions\n };\n };\n\n /**\n * Bind registered directives.\n * @function bindDirectives\n * @param {string} [directiveSelector] restrict binding to elements matching this selector\n */\n PlentyFramework.prototype.bindDirectives = function( rootElement )\n {\n\n rootElement = rootElement || 'html';\n\n $( rootElement ).find( '[data-plenty]' ).each( function( i, element )\n {\n\n var directives = parseDirectives( $( element ).attr( 'data-plenty' ), $( element ) );\n\n if ( directives.length <= 0 )\n {\n // continue\n return;\n }\n\n addCustomEvents( element );\n\n for ( var i = 0; i < directives.length; i++ )\n {\n var directive = directives[i];\n if ( !!PlentyFramework.directives[directive.class] && PlentyFramework.directives.hasOwnProperty( directive.class ) )\n {\n\n var callback = PlentyFramework.directives[directive.class][directive.method];\n if ( !!callback && typeof callback == \"function\" )\n {\n\n if ( directive.event == \"ready\" )\n {\n callback.apply( null, directive.params );\n }\n else\n {\n bindEventCallback( $( element ), directive.event, callback, directive.params );\n /*\n $( element ).on( directive.event, function( e )\n {\n directive = injectEvent( directive, e );\n return callback.apply( null, directive.params );\n } );\n */\n }\n\n }\n else\n {\n console.error( \"Method not found: \" + directive.method + \" in \" + directive.class );\n }\n\n }\n else\n {\n console.error( \"Directive not found: \" + directive.class );\n }\n }\n } );\n\n $( document ).trigger( 'initPartials', rootElement );\n };\n\n var eventStack = [];\n\n PlentyFramework.getRecentEvent = function( eventType )\n {\n var lastEventIdx = eventStack.length - 1;\n if ( !eventType )\n {\n return eventStack[lastEventIdx];\n }\n else\n {\n for ( var i = lastEventIdx; i >= 0; i-- )\n {\n if ( eventType == eventStack[i].type )\n {\n return eventStack[i];\n }\n }\n }\n\n return null;\n\n };\n\n PlentyFramework.pushEvent = function( event )\n {\n eventStack.push( event );\n };\n\n /**\n * Bind event to element by eventType.\n * If cms says \"click:Foo.bar(this, event)\" eventType is \"click\".\n *\n * @param $elem - jQuery object on which event was triggered\n * @param eventType - type of event\n * @param callback - callback function of directive [example: \"bar(this, event)\"]\n * @param params - list of parameters for callback function.\n */\n function bindEventCallback( $elem, eventType, callback, params )\n {\n $elem.on( eventType, function( event )\n {\n eventStack.push( event );\n return callback.apply( null, params );\n } );\n\n if( document.readyState === \"complete\" && eventType === \"ready\" )\n {\n // execute 'ready' directives directly if document is already loaded\n callback.apply( null, params );\n }\n }\n\n function addCustomEvents( element )\n {\n\n var $elem = $( element );\n\n if ( $elem.is( 'input[type=\"checkbox\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n if ( $elem.is( ':checked' ) )\n {\n $elem.trigger( 'check' );\n }\n else\n {\n $elem.trigger( 'uncheck' );\n }\n } );\n }\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n var radioGroup = $elem.attr( 'name' );\n\n $( 'input[type=\"radio\"][name=\"' + radioGroup + '\"]' ).each( function( i, radio )\n {\n var $radio = $( radio );\n if ( $radio.is( ':checked' ) )\n {\n $radio.trigger( 'check' );\n }\n else\n {\n $radio.trigger( 'uncheck' );\n }\n\n } );\n\n } );\n }\n }\n\n function parseDirectives( input, thisValue )\n {\n var directivePattern = /^(([\\w]+):)?([\\w]+)\\.([\\w]+)(\\((.*)\\))?$/;\n var expressions = input.split( ';' );\n var directives = [];\n\n for ( var i = 0; i < expressions.length; i++ )\n {\n var expression = expressions[i].trim();\n\n if ( !expression )\n {\n continue;\n }\n\n if ( !directivePattern.test( expression ) )\n {\n // console.warn( \"Invalid directive: \" + expression );\n continue;\n }\n\n var match = expression.match( directivePattern );\n\n if ( !match[3] || match[3].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Class name not set.\" );\n continue;\n }\n\n if ( !match[4] || match[4].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Method not set.\" );\n continue;\n }\n\n var directive = {\n event : match[2] || 'ready',\n class : match[3],\n method: match[4],\n params: []\n };\n\n if ( !!match[6] && match[6].length > 0 )\n {\n var params = match[6].match( /(['][^']+['])|([\\w-]+)|([\"][^\"]+[\"])/g );\n for ( var j = 0; j < params.length; j++ )\n {\n var param = params[j].trim();\n if ( !isNaN( parseFloat( param ) ) )\n {\n directive.params.push( parseFloat( param ) );\n }\n else if ( param.toLowerCase() == 'true' )\n {\n directive.params.push( true );\n }\n else if ( param.toLowerCase() == 'false' )\n {\n directive.params.push( false );\n }\n else if ( param.toLowerCase() == 'this' )\n {\n directive.params.push( thisValue );\n }\n else\n {\n directive.params.push( param.replace( /^['\"]|['\"]$/g, '' ) );\n }\n }\n }\n\n directives.push( directive );\n\n }\n return directives;\n }\n\n /**\n * Register a new service\n * @function service\n * @static\n * @param {string} serviceName Unique identifier of the service to get/ create\n * @param {function} serviceFunctions Callback containing all public functions of this service.\n * @param {Array} [dependencies] Identifiers of required services to inject in serviceFunctions\n * @return {object} The object described in serviceFunctions(). Can be received via\n * PlentyFramework.[serviceName]\n */\n PlentyFramework.service = function( serviceName, serviceFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof serviceName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof serviceName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof serviceFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof serviceFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.services[serviceName] = {\n name : serviceName,\n dependencies: dependencies,\n setup : serviceFunctions\n };\n\n };\n\n /**\n * Collection of compiled factories\n * @attribute factories\n * @static\n * @type {object}\n */\n PlentyFramework.factories = {};\n\n /**\n * Register a new factory\n * @function factory\n * @static\n * @param {string} factoryName A unique name of the new factory\n * @param {function} factoryFunctions The function describing the factory\n * @param {Array} dependencies List of required factories to inject\n */\n PlentyFramework.factory = function( factoryName, factoryFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof factoryName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof factoryName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof factoryFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof factoryFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n components.factories[factoryName] = {\n name : factoryName,\n dependencies: dependencies,\n setup : factoryFunctions\n }\n\n };\n\n /**\n * Renders html template. Will provide given data to templates scope.\n * Uses Mustache syntax for data-binding.\n * @function compileTemplate\n * @static\n * @param {String} template relative path to partials template to load. Base path = '/src/partials/'\n * @param {Object} data data to privide to templates scope.\n * @returns {String} The rendered html string\n */\n PlentyFramework.compileTemplate = function( template, data )\n {\n data = data || {};\n data.translate = function()\n {\n return function( text, render )\n {\n return render( PlentyFramework.translate( text ) );\n };\n };\n return Mustache.render( TemplateCache[template], data );\n };\n\n /**\n * The path on the server where the script is located in.\n * @attribute\n * @static\n * @type {String}\n */\n PlentyFramework.scriptPath = '';\n\n /**\n * Collection of locale strings will be injected here after reading language file.\n * @attribute\n * @static\n * @type {Object}\n */\n PlentyFramework.Strings = {};\n\n /**\n * Load language file containing translations of locale strings.\n * @function loadLanguageFile\n * @static\n * @param fileName relative path to language file.\n */\n PlentyFramework.loadLanguageFile = function( fileName )\n {\n $.ajax({\n url: PlentyFramework.scriptPath + fileName,\n dataType: 'json'\n }).done( function( response ) {\n PlentyFramework.Strings = response;\n });\n };\n\n /**\n * Try to get locale translation of given string.\n * Render translated string using Mustache syntax\n * if additional parameters are given.\n * @function translate\n * @static\n * @param {String} string The string to translate\n * @param {Object} [params] additional data for rendering\n * @returns {String} The translation of the given string if found. Otherwise returns the original string.\n */\n PlentyFramework.translate = function( string, params )\n {\n var localeString;\n if ( PlentyFramework.Strings.hasOwnProperty( string ) )\n {\n localeString = PlentyFramework.Strings[string];\n }\n else\n {\n localeString = string;\n console.warn( 'No translation found for \"' + localeString + '\".' );\n }\n\n if ( !!params )\n {\n localeString = Mustache.render( localeString, params );\n }\n\n return localeString;\n\n };\n\n /**\n * Compile registered factories & services\n * @function compile\n * @static\n */\n PlentyFramework.compile = function()\n {\n\n for ( var factory in components.factories )\n {\n if ( !PlentyFramework.factories.hasOwnProperty( factory ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.factories[factory], 3 );\n }\n }\n\n for ( var service in components.services )\n {\n if ( !PlentyFramework.prototype.hasOwnProperty( service ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.services[service], 2 );\n }\n }\n\n for ( var directive in components.directives )\n {\n if ( !PlentyFramework.directives.hasOwnProperty( directive ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.directives[directive], 1 );\n }\n }\n\n var scripts = document.getElementsByTagName( 'SCRIPT' );\n for( var i = scripts.length - 1; i >= 0; i-- ) {\n var path = scripts[i].src.match( /(.*)\\/(.*)\\.js(\\?\\S*)?$/ );\n if( !!path ) {\n PlentyFramework.scriptPath = path[1];\n break;\n }\n }\n\n };\n\n // Level: 1 = directive, 2 = service, 3 = factory\n function compileComponent( component, componentLevel, dependencyStack )\n {\n dependencyStack = dependencyStack || [];\n\n // resolve dependencies\n var compiledDependencies = [];\n for ( var i = 0; i < component.dependencies.length; i++ )\n {\n var dependency = component.dependencies[i];\n if ( $.inArray( dependency, dependencyStack ) < 0 )\n {\n // add dependency to stack to avoid cyclic injection\n dependencyStack.push( dependency );\n\n if ( components.factories.hasOwnProperty( dependency ) )\n {\n // required dependency is a factory\n if ( !PlentyFramework.factories.hasOwnProperty( dependency ) )\n {\n // factory is not compiled yet\n compileComponent( components.factories[dependency], 3, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.factories[dependency] );\n continue;\n }\n\n if ( componentLevel <= 2 && components.services.hasOwnProperty( dependency ) )\n {\n // required dependency is a service\n if ( !PlentyFramework.prototype.hasOwnProperty( dependency ) )\n {\n // service is not compiled yet\n compileComponent( components.services[dependency], 2, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.prototype[dependency] );\n continue;\n }\n\n if ( componentLevel <= 1 && components.directives.hasOwnProperty( dependency ) )\n {\n // required dependency is a directive\n if ( !PlentyFramework.directives.hasOwnProperty( dependency ) )\n {\n // directive is not compiled yet\n compileComponent( components.directives[dependency], 1, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.directives[dependency] );\n continue;\n }\n\n console.error( 'Cannot inject dependency \"' + dependency + '\": Object not found.' );\n }\n else\n {\n console.error( 'Cyclic dependency injection: ' + dependencyStack.join( ' -> ' ) + ' -> ' + dependency );\n }\n }\n\n // compile component\n if ( componentLevel == 3 )\n {\n PlentyFramework.factories[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 2 )\n {\n PlentyFramework.prototype[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 1 )\n {\n PlentyFramework.directives[component.name] = component.setup.apply( null, compiledDependencies );\n }\n }\n\n}( jQuery ));\n\n\n\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.directive( 'Authentication', function( AuthenticationService )\n {\n return {\n login: login\n };\n\n function login( elem )\n {\n pm.getRecentEvent().preventDefault();\n AuthenticationService.customerLogin( $( elem ) );\n }\n }, [\"AuthenticationService\"] );\n\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Basket', function( BasketService )\n {\n\n return {\n addBasketItem : addBasketItem,\n changeItemQuantity: changeItemQuantity,\n setItemQuantity : setItemQuantity\n };\n\n function addBasketItem( elem )\n {\n pm.getRecentEvent().preventDefault();\n //init\n var basketItemsList = {};\n var $elem = $( elem );\n var parentForm = $elem.parents( 'form' );\n\n basketItemsList.BasketItemItemID = parentForm.find( '[name=\"ArticleID\"]' ).val();\n basketItemsList.BasketItemPriceID = parentForm.find( '[name=\"SYS_P_ID\"]' ).val();\n basketItemsList.BasketItemQuantity = parentForm.find( '[name=\"ArticleQuantity\"]' ).val();\n basketItemsList.BasketItemBranchID = parentForm.find( '[name=\"source_category\"]' ).val();\n\n //attributes\n var attributeInputsList = parentForm.find( '[name^=\"ArticleAttribute\"]' );\n var attributesList = [];\n\n $.each( attributeInputsList, function( idx, elem )\n {\n var match = elem.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( elem ).val()\n } );\n }\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItemsList.BasketItemAttributesList = attributesList;\n }\n\n //add basketItem and refresh previewLists\n BasketService.addItem( [basketItemsList] );\n\n }\n\n function changeItemQuantity( elem, increment )\n {\n var $elem = $( elem );\n var $quantityInput = $elem.parent().find( 'input' );\n var maxLength = parseInt( $quantityInput.attr( 'maxlength' ) ) || 5;\n var value = parseInt( $quantityInput.val() ) + increment;\n\n var isBasketView = $elem.parents( '[data-basket-item-id]' ).length > 0;\n\n if ( isBasketView )\n {\n if ( (value + '').length <= maxLength && value >= 0 )\n {\n $quantityInput.val( value );\n }\n\n var timeout = $elem.data( 'timeout' );\n\n if ( !!timeout )\n {\n window.clearTimeout( timeout );\n }\n\n timeout = window.setTimeout( function()\n {\n $quantityInput.trigger( 'change' );\n }, 1000 );\n\n $elem.data( 'timeout', timeout );\n }\n else\n {\n if ( (value + '').length <= maxLength && value >= 1 )\n {\n $quantityInput.val( value );\n }\n }\n }\n\n function setItemQuantity( basketItemID, input )\n {\n BasketService.setItemQuantity(\n basketItemID,\n parseInt( $( input ).val() )\n ).fail( function()\n {\n // reset input's value on cancel\n var basketItem = BasketService.getItem( basketItemID );\n $( input ).val( basketItem.BasketItemQuantity );\n } );\n }\n\n }, ['BasketService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Checkout', function( CheckoutService )\n {\n\n return {\n setMethodOfPayment: setMethodOfPayment,\n confirmAtrigaPaymax: confirmAtrigaPaymax\n };\n\n function setMethodOfPayment( paymentID )\n {\n CheckoutService.setMethodOfPayment( paymentID );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxConfirmed )\n {\n CheckoutService.confirmAtrigaPaymax( atrigaPaymaxConfirmed );\n }\n }, ['CheckoutService'] );\n})( jQuery, PlentyFramework );\n/**\n * Mobile dropdowns\n * Toggles dropdowns using css class 'open' instead of pseudo class :hover\n * Usage:\n *
  • \n * ...\n *
  • \n *\n * possible values for CONDITION\n * \"touch\" : use 'open'-class if device is touch-device AND media size is 'md' or 'lg'\n * \"toggle-xs-sm-or-touch\" : use 'open'-class if device is \"touch\" (as above) OR media size is 'xs' or 'sm'\n *\n */\n(function( $, pm )\n{\n pm.directive( 'MobileDropdown', function( MediaSize )\n {\n // store all dropdown elements\n var dropdownElements = [];\n\n // store dropdown elements which should be closed by clicking outside the element itself\n var closableDropdownElements = [];\n\n return {\n initDropdowns: initDropdowns,\n openDropdown : openDropdown,\n slideDropdown: slideDropdown\n };\n\n function initDropdowns()\n {\n $( window ).on( 'orientationchange sizeChange', function()\n {\n resetDropdowns( dropdownElements );\n resetDropdowns( closableDropdownElements );\n } );\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", function( event )\n {\n resetDropdowns( closableDropdownElements, event );\n } );\n }\n\n function resetDropdowns( dropdownList, event )\n {\n var $current;\n for ( var i = 0; i < dropdownList.length; i++ )\n {\n $current = $( dropdownList[i] );\n if ( !!event )\n {\n if ( $current.find( $( event.target ) ).length === 0 )\n {\n $current.removeClass( 'open' );\n }\n }\n else\n {\n $current.removeClass( 'open' );\n }\n }\n\n }\n\n function openDropdown( elem, alwaysClickable )\n {\n var $elem = $( elem );\n var $parent = $elem.parent();\n\n // case 1: xs || sm || ( touch && ( md || lg ) ) -> open/close via click on small devices, open/close via\n // css-hover on desktop, open/close via click on touch-desktop (e.g. top navigation)\n\n if ( !!alwaysClickable && ( MediaSize.isInterval( 'xs, sm' ) || ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n // if href\n if ( !$elem.attr( 'href' ) )\n {\n avoidRedirectinStopPropagation( $parent.not( $elem ) );\n }\n }\n else\n {\n if ( !$elem.attr( 'href' ) )\n {\n // hide dropdown\n $parent.removeClass( 'open' );\n }\n }\n }\n\n // case 2: touch && ( md || lg ) -> open via 1st click on touch-desktop, return false (e.g. main navigation)\n\n if ( !alwaysClickable && ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n avoidRedirectinStopPropagation( $parent );\n }\n else\n {\n // redirect to href if dropdown is already open\n // do nothing\n }\n }\n }\n\n function showDropdownHideOthers( elem, parent )\n {\n var $parent = $( parent );\n\n // hide other dropdowns\n resetDropdowns( closableDropdownElements );\n\n // remember opened dropdown\n if ( $.inArray( $parent[0], closableDropdownElements ) < 0 )\n {\n closableDropdownElements.push( $parent[0] );\n }\n\n // show dropdown\n $parent.addClass( 'open' );\n }\n\n function avoidRedirectinStopPropagation( elem )\n {\n var $elem = $( elem );\n\n // avoid redirecting\n pm.getRecentEvent().preventDefault();\n\n // avoid closing popup by clicking itself\n $elem.off( 'click' );\n $elem.on( 'click', function( e )\n {\n e.stopPropagation();\n } );\n }\n\n function slideDropdown( elem )\n {\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n // size interval query is required since function is used on document ready to initial open active\n // navigation (on small devices)\n if ( MediaSize.isInterval( 'xs, sm' ) )\n {\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 400, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n if ( $.inArray( $elemParent[0], dropdownElements ) < 0 )\n {\n dropdownElements.push( $elemParent[0] );\n }\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n }\n\n }, ['MediaSizeService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Redirect', function( MediaSizeService, NavigatorService )\n {\n\n return {\n to : to,\n toCheckoutTab: toCheckoutTab\n };\n\n function to( href )\n {\n if ( MediaSizeService.interval() != 'xs' )\n {\n if ( typeof href === 'string' && href.indexOf('/') == -1 && $( href ).length > 0 )\n {\n window.location.assign( $( href ).attr( 'href' ) );\n }\n else\n {\n window.location.assign( href );\n }\n }\n }\n\n function toCheckoutTab( tabID )\n {\n NavigatorService.goToID( tabID );\n }\n\n }, ['MediaSizeService', 'NavigatorService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Tab', function( MediaSize )\n {\n\n var tabGroups = {};\n\n return {\n showTab : showTab,\n initRemoteLabel: initRemoteLabel,\n initRemoteTab : initRemoteTab,\n showRemoteTab : showRemoteTab\n };\n\n function showTab( tabSelector )\n {\n $( tabSelector ).tab( 'show' );\n }\n\n function initRemoteLabel( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).addLabel( $elem );\n }\n\n function initRemoteTab( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).setContent( $elem );\n }\n\n function showRemoteTab( tabID, groupID, interval )\n {\n if ( MediaSize.isInterval( interval ) )\n {\n pm.getRecentEvent().preventDefault();\n\n if ( !!tabGroups[groupID] && !!tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].showTab( tabID );\n }\n\n }\n }\n\n function TabGroup()\n {\n var tabs = {};\n var activeTab;\n\n return {\n addTab : addTab,\n showTab : showTab,\n getTab : getTab,\n resetTabs: resetTabs\n };\n\n function addTab( tabID )\n {\n tabs[tabID] = new Tab( tabID );\n return tabs[tabID];\n }\n\n function showTab( tabID )\n {\n var zIndex = 0;\n if ( !!activeTab )\n {\n // activeTab is set\n zIndex = parseInt( activeTab.getContent().parent().css( 'zIndex' ) );\n activeTab.hide();\n activeTab.getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n else\n {\n // activeTab not set before\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n var currentZ = parseInt( tabs[tab].getContent().parent().css( 'zIndex' ) );\n if ( zIndex == 0 || currentZ < zIndex )\n {\n zIndex = currentZ;\n }\n tabs[tab].hide();\n }\n }\n\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n }\n\n $( window ).on( 'sizeChange', resetTabs );\n }\n\n activeTab = tabs[tabID];\n activeTab.getContent().parent().css( 'zIndex', zIndex );\n activeTab.show();\n }\n\n function getTab( tabID )\n {\n return tabs[tabID];\n }\n\n function resetTabs()\n {\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].show();\n }\n }\n\n activeTab = null;\n }\n }\n\n function Tab( id )\n {\n var $content;\n var $labels = [];\n var tabID = id;\n\n return {\n addLabel : addLabel,\n setContent: setContent,\n getContent: getContent,\n getID : getID,\n show : show,\n hide : hide\n };\n\n function getID()\n {\n return tabID;\n }\n\n function addLabel( label )\n {\n $labels.push( label );\n return this;\n }\n\n function setContent( content )\n {\n $content = content;\n return this;\n }\n\n function getContent()\n {\n return $content;\n }\n\n function show()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].addClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.show().addClass( 'in' );\n }\n\n }\n\n function hide()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].removeClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.hide().removeClass( 'in' );\n }\n }\n }\n\n }, ['MediaSizeService'] );\n})( jQuery, PlentyFramework );\n/**\n * Add fancy ui modifications - the visual stuff - here.\n * Respond functionality like 'event':UI.myFunctionality(currentElement)\n *\n * Example:\n * \n *\n */\n(function( $, pm )\n{\n pm.directive( 'UI', function( MediaSizeService, SocialShareService, UIFactory )\n {\n // elements to calculate height.\n var equalHeightElementList = [];\n var toTopButtonList = [];\n\n return {\n initUIWindowEvents : initUIWindowEvents,\n showWaitscreen : showWaitscreen,\n hideWaitscreen : hideWaitscreen,\n addContentPageSlider: addContentPageSlider,\n equalHeight : equalHeight,\n initToTop : initToTop,\n initLazyload : initLazyload,\n initSlideToggle : initSlideToggle,\n slideDown : slideDown,\n slideUp : slideUp,\n slideToggle : slideToggle,\n toggleHideShow : toggleHideShow,\n toggleSocialShare : toggleSocialShare,\n toggleClass : toggleClass,\n addClass : addClass,\n removeClass : removeClass\n };\n\n function initUIWindowEvents()\n {\n // resize elements on window size change.\n $( window ).on( 'sizeChange contentChanged', function()\n {\n fireEqualHeight();\n } );\n\n $( window ).on( \"scroll resize\", function()\n {\n if ( toTopButtonList.length > 0 )\n {\n if ( $( document ).scrollTop() > 100 )\n {\n doToArrayElements( toTopButtonList, \"addClass\", \"visible\" );\n }\n else\n {\n doToArrayElements( toTopButtonList, \"removeClass\", \"visible\" );\n }\n }\n } );\n }\n\n /**\n * Display waitscreen on page e.g. for requests.\n * Use with care and don't forget to hide waitscreen, if your calls are done or broke!!\n */\n function showWaitscreen()\n {\n UIFactory.showWaitscreen();\n }\n\n /**\n * Just hide the waitscreen.\n * @param forceClose\n */\n function hideWaitscreen( forceClose )\n {\n UIFactory.hideWaitscreen( forceClose );\n }\n\n /**\n * Adds content page slider (owlCarousel)\n *\n * usage:\n *
    \n *
    \n * ...\n *
    \n *
    \n * ...\n *
    \n * ...\n *
    \n *\n * Legacy directive selector: data-plenty=\"contentpageSlider\"\n *\n * @param elem\n */\n function addContentPageSlider( elem )\n {\n $( elem ).owlCarousel( {\n navigation : true,\n navigationText : false,\n slideSpeed : 1000,\n paginationSpeed: 1000,\n singleItem : true,\n autoPlay : 6000,\n stopOnHover : true,\n afterMove : function( current )\n {\n $( current ).find( '[data-plenty-rel=\"lazyload\"]' ).trigger( 'appear' );\n }\n } );\n }\n\n /**\n * Equal Box height\n * Calculates equal box height for chosen elements.\n *\n * Legacy directive selector: data-plenty-equal\n *\n * @param elem\n * @param elementExists - default false\n */\n function equalHeight( elem, mediaSizes, elementExists )\n {\n var $elem = $( elem );\n var maxHeight = 0;\n var $equalTarget = {};\n var $equalTargetList = $elem.find( '[data-plenty-rel=\"equal-target\"]' ).length > 0 ? $elem.find( '[data-plenty-rel=\"equal-target\"]' ) : $elem.children();\n\n // if element wasn't pushed before.\n if ( elementExists !== true )\n {\n equalHeightElementList.push( elem );\n }\n\n for ( var i = $equalTargetList.length; i >= 0; i-- )\n {\n $equalTarget = $( $equalTargetList[i] );\n $equalTarget.css( 'height', '' );\n\n if ( $equalTarget.outerHeight( true ) > maxHeight )\n {\n maxHeight = $equalTarget.outerHeight( true );\n }\n }\n\n if ( !mediaSizes || MediaSizeService.isInterval( mediaSizes ) )\n {\n $equalTargetList.height( maxHeight );\n }\n }\n\n /**\n * Scroll page to top.\n * Just add without events.\n *\n * Legacy directive selector: data-plenty=\"toTop\"\n *\n * @param elem\n */\n function initToTop( elem )\n {\n var $elem = $( elem );\n\n $elem.click( function()\n {\n $( 'html, body' ).animate( {\n scrollTop: 0\n }, 400 );\n return false;\n } );\n\n if ( !!$.inArray( $elem, toTopButtonList ) )\n {\n toTopButtonList.push( $elem );\n }\n }\n\n /**\n * lazy load on ready.\n *\n * Legacy directive selector: img[data-plenty-lazyload]\n *\n * @param elem\n */\n function initLazyload( elem, effect )\n {\n var $elem = $( elem );\n\n $elem.lazyload( {\n effect: effect\n } );\n if ( $elem.is( 'img' ) )\n {\n $elem.on( 'loaded', function()\n {\n $elem.css( 'display', 'inline-block' );\n } );\n }\n }\n\n /**\n * Toggle show and hide animation.\n *\n * Legacy directive selector: data-plenty=\"openCloseToggle\"\n *\n * @param elem\n */\n function toggleHideShow( elem )\n {\n\n console.log( elem );\n\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 200, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n /**\n * Toggle target content on click.\n * Bind to checked-/ unchecked-property of radio buttons\n *\n * Legacy directive selector: data-plenty-slidetoggle\n *\n * @param elem\n */\n function initSlideToggle( elem, checked )\n {\n var $elem = $( elem );\n var $targetElement = $( $elem.attr( 'data-plenty-rel' ) );\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n // is radio button\n var $radioGroupList = $( 'input[type=\"radio\"][name=\"' + ( $elem.attr( 'name' ) ) + '\"]' );\n var visibleOnChecked = !checked || checked == 'checked';\n\n $radioGroupList.change( function()\n {\n var $self = $( this );\n $targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n if ( $self.is( ':checked' ) && $self[0] === $elem[0] && visibleOnChecked == true )\n {\n // checked\n $targetElement.slideDown( 400, function()\n {\n fireEqualHeight();\n } );\n }\n else\n {\n // unchecked (since other radio button has been checked)\n $targetElement.slideUp( 400, function()\n {\n fireEqualHeight();\n } );\n }\n } );\n }\n else\n {\n // is not radio button\n $elem.click( function()\n {\n //$targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n $elem.addClass( 'animating' );\n $targetElement.slideToggle( 400, function()\n {\n $elem.removeClass( 'animating' );\n $elem.toggleClass( 'active' );\n fireEqualHeight();\n } );\n } );\n }\n }\n\n function slideDown( target, duration )\n {\n slideAction( $( target ), duration, 'slideDown' );\n }\n\n function slideUp( target, duration )\n {\n slideAction( $( target ), duration, 'slideUp' );\n }\n\n function slideToggle( target, duration )\n {\n slideAction( $( target ), duration, 'slideToggle' );\n }\n\n function slideAction( $target, duration, callbackString )\n {\n duration = duration || 400;\n $target.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n $target[callbackString]( duration, function()\n {\n fireEqualHeight();\n } );\n }\n\n /**\n * TODO check comment\n * Social Share Activation\n * Activate and load share-buttons manually by clicking a separate button\n * Usage / data-attributes:\n *
    \n * Will be used to activate the service set in\n * data-plenty-social=\"\"\n * Will be replaced with loaded share button\n *
    \n *\n * possible values for data-plenty-social:\n * \"facebook-like\" : Load Facebooks \"Like\"-Button\n * \"facebook-recommend\" : Load Facebooks \"Recommend\"-Button\n * \"twitter\" : Load Twitter Button\n * \"google-plus\" : Load google \"+1\"-Button\n *\n * Additional Tooltips\n * You can extend the parent element with a (bootstrap) tooltip by adding data-toggle=\"tooltip\" and\n * title=\"TOOLTIP CONTENT\" Tooltip will be destroyed after activating a social service\n * (!) Requires bootstrap.js\n *\n * Legacy directive selector: data-plenty-social\n *\n * @param elem\n */\n function toggleSocialShare( elem, socialShareService )\n {\n var $elem = $( elem );\n var $toggle = $elem.find( '[data-plenty-rel=\"social-switch\"]' );\n\n // append container to put / delete service.html\n $elem.append( '
    ' );\n\n // add \"off\" class to switch, if neither \"off\" or \"on\" is set\n // replaced hasClass() with is() benchmark: http://jsperf.com/hasclasstest\n if ( !$toggle.is( 'off, on' ) )\n {\n $toggle.addClass( 'off' );\n }\n\n // toggle switch\n $toggle.on( 'click', function()\n {\n if ( $toggle.hasClass( 'off' ) )\n {\n // TODO remove bootstrap dependency\n if ( $elem.attr( \"data-toggle\" ) == \"tooltip\" )\n {\n $elem.tooltip( 'destroy' )\n }\n $toggle.removeClass( 'off' ).addClass( 'on' );\n // hide dummy button\n $elem.find( '[data-plenty-rel=\"social-placeholder\"]' ).hide();\n // load HTML defined in 'api'\n $elem.find( '.social-container' ).append( SocialShareService.getSocialService( socialShareService ) );\n }\n // do not disable social medias after activation\n } );\n }\n\n /**\n * Toggle Class\n * toggle style-classes on click\n * Usage / data-attribute:\n *
    \n * target : jQuery selector to toggle the class at.\n * class : class(es) to toggle at target element\n * media : only toggle class on given media sizes (optional)\n *\n * (!) using data-plenty-toggle on -elements will prevent redirecting to href=\"\"\n *\n * Legacy directive selector: data-plenty-toggle\n *\n * @param cssClass\n * @param target\n * @param interval\n */\n function toggleClass( cssClass, target, interval )\n {\n var $target = $( target );\n /* FIXME\n * Callisto 3.1 Design adaption:\n * NavigationCategoriesList\n * Line 8\n * BEFORE:\n *
  • \n * AFTER:\n *
  • \n *\n * Line 10\n * BEFORE:\n * \n * AFTER:\n * \n *\n * */\n if ( $target.parents( \".navbar-main\" ).length > 0 )\n {\n var $elem = $target.children( \"span\" );\n pm.directives[\"MobileDropdown\"].slideDropdown( $elem );\n return true;\n }\n\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $target.toggleClass( cssClass );\n return false;\n }\n }\n\n function addClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).addClass( cssClass );\n return false;\n }\n }\n\n function removeClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).removeClass( cssClass );\n return false;\n }\n }\n\n /*\n ##### PRIVATE FUNCTIONS ######\n */\n\n function fireEqualHeight()\n {\n for ( var i = equalHeightElementList.length - 1; i >= 0; i-- )\n {\n equalHeight( equalHeightElementList[i], '', true );\n }\n }\n\n function doToArrayElements( array, func, params )\n {\n for ( var i = array.length - 1; i >= 0; i-- )\n {\n array[i][func]( params );\n }\n }\n\n }, ['MediaSizeService', 'SocialShareService', 'UIFactory'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Validator', function( ValidationService )\n {\n\n return {\n validate: validate\n };\n\n function validate( form, errorClass )\n {\n return ValidationService.validate( form, errorClass );\n }\n\n }, ['ValidationService'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Handles requests to ReST API. Provides a {{#crossLink \"APIFactory/handleError:method\"}}default\n * error-handling{{/crossLink}}. Request parameters will be parsed to json internally
    \n * Requires:\n *
      \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class APIFactory\n * @static\n */\n pm.factory( 'APIFactory', function( UI, Modal )\n {\n\n var sessionExpirationTimeout = null;\n $( document ).ready( function()\n {\n renewLoginSession();\n } );\n\n return {\n get : _get,\n post : _post,\n put : _put,\n delete: _delete,\n idle : _idle\n };\n\n function renewLoginSession()\n {\n if ( !pm.getGlobal( 'LoginSession' ) )\n {\n return;\n }\n\n if ( !!sessionExpirationTimeout )\n {\n clearTimeout( sessionExpirationTimeout );\n }\n\n sessionExpirationTimeout = setTimeout( function()\n {\n $( window ).trigger( 'login-expired' );\n\n if ( pm.getGlobal( 'PageDesign' ) === \"Checkout\" )\n {\n Modal.prepare()\n .setTitle( pm.translate( 'Your session has expired.' ) )\n .setContent( pm.translate( 'Please log in again to continue shopping.' ) )\n .setLabelDismiss( null )\n .setLabelConfirm( pm.translate( 'OK' ) )\n .onConfirm( function()\n {\n window.location.assign( '/' );\n } )\n .onDismiss( function()\n {\n window.location.assign( '/' );\n } )\n .show();\n }\n\n }, pm.getGlobal( 'LoginSessionExpiration' ) );\n }\n\n /**\n * Is called by default if a request failed.
    \n * Can be prevented by setting the requests last parameter to false.\n *\n * @function handleError\n * @private\n *\n * @param {object} jqXHR
    jQuery\n * deferred Object\n */\n function handleError( jqXHR )\n {\n try\n {\n var responseText = $.parseJSON( jqXHR.responseText );\n UI.printErrors( responseText.error.error_stack );\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n }\n\n /**\n * Sends a GET request to ReST-API\n *\n * @function get\n *\n * @param {string} url The URL to send the request to\n * @param {object} params The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _get( url, params, ignoreErrors, runInBackground, sync )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'GET',\n data : params,\n dataType: 'json',\n async : !sync,\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a POST request to ReST-API\n *\n * @function post\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _post( url, data, ignoreErrors, runInBackground )\n {\n\n var params = {\n type : 'POST',\n dataType: 'json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n };\n\n if ( !!data && data.isFile )\n {\n params.cache = data.cache;\n params.processData = data.processData;\n params.data = data.data;\n params.contentType = false;\n }\n else\n {\n params.data = JSON.stringify( data );\n params.contentType = 'application/json';\n }\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url, params\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n }\n\n /**\n * Sends a PUT request to ReST-API\n *\n * @function put\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _put( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'PUT',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a DELETE request to ReST-API\n *\n * @function delete\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @returns {object} jQuery\n * deferred Object\n */\n function _delete( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'DELETE',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Get a idle request doing nothing for chaining methods\n * @returns {object} jQuery\n * deferred Object\n */\n function _idle()\n {\n return $.Deferred().resolve();\n }\n\n }, ['UIFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Provide methods for receiving layout containers, layout parameters\n * or category content from API
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    \n * @class CMSFactory\n * @static\n */\n pm.factory( 'CMSFactory', function( API )\n {\n\n return {\n getContainer : getContainer,\n getParams : getParams,\n getCategoryContent: getCategoryContent\n };\n\n /**\n * Prepare the request to receive HTML-Content from CMS\n * @function getContainer\n * @param {string} containerName The Layoutcontainer to receive.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the location in\n * the CMS\n * (e.g. 'Checkout')\n * @example\n * CMSFactory.getContainer( 'CheckoutTotals' ).from( 'Checkout' )\n * .done(function( response ) {\n * // container content\n * var html = response.data[0]\n * });\n */\n function getContainer( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/container_' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n\n }\n\n /**\n * Prepare the request to receive Layout parameters for a template\n * @function getParams\n * @param {string} containerName The Layoutcontainer to receive the parameteres of.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the\n * location in the CMS\n * (e.g. 'ItemView')\n * @example\n * CMSFactory.getParams( 'BasketItemsList' ).from( 'ItemView' )\n * .done(function( response ) {\n * // BasketItems\n * var items = response.data;\n * });\n */\n function getParams( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n }\n\n /**\n * Get the content of a category specified by its ID\n * @function getCategoryContent\n * @param {number} categoryID The ID of the category to get the content from\n * @returns {object} jQuery deferred\n * Object\n */\n function getCategoryContent( categoryID )\n {\n return API.get( '/rest/categoryview/categorycontentbody/?categoryID=' + categoryID );\n }\n\n }, ['APIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Holds checkout data for global access and provides methods\n * for reloading content dynamically-
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutFactory\n * @static\n */\n pm.factory( 'CheckoutFactory', function( API, CMS, UI )\n {\n\n // data received from ReST API\n var checkoutData;\n\n // instance wrapped checkout object for global access\n var checkout;\n\n return {\n getCheckout : getCheckout,\n setCheckout : setCheckout,\n loadCheckout : loadCheckout,\n reloadContainer : reloadContainer,\n reloadCatContent : reloadCatContent,\n reloadItemContainer: reloadItemContainer\n };\n\n function Checkout()\n {\n return checkoutData;\n }\n\n /**\n * Returns instance of wrapped checkout object\n * @function getCheckout\n * @returns {Checkout} Instance of checkout object\n */\n function getCheckout( copy )\n {\n if ( !checkout || !checkoutData )\n {\n loadCheckout( true );\n }\n\n if ( !!copy )\n {\n return $.extend( true, {}, checkoutData );\n }\n return checkout;\n }\n\n /**\n * Receive global checkout data from ReST-API\n * @function loadCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function loadCheckout( sync )\n {\n\n return API.get( '/rest/checkout/', null, false, false, sync )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n }\n\n /**\n * Update checkout data on server\n * @function setCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function setCheckout()\n {\n\n return API.put( '/rest/checkout', checkout )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-checkout-template=\"...\"\n * @function reloadContainer\n * @param {string} container Name of the template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadContainer( container )\n {\n\n return CMS.getContainer( \"checkout\" + container ).from( 'checkout' )\n .done( function( response )\n {\n $( '[data-plenty-checkout-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n } );\n } );\n }\n\n /**\n * Get category content from server and replace received HTML\n * in containers marked with data-plenty-checkout-catcontent=\"...\"\n * @function reloadCatContent\n * @param {number} catId ID of the category to load content (description 1) from server\n * @return {object} jQuery deferred\n * Object\n * @deprecated\n */\n function reloadCatContent( catId )\n {\n\n return CMS.getCategoryContent( catId )\n .done( function( response )\n {\n $( '[data-plenty-checkout-catcontent=\"' + catId + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-itemview-template=\"...\"\n * @function reloadItemContainer\n * @param {string} container Name of the (item view) template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadItemContainer( container )\n {\n\n return CMS.getContainer( 'itemview' + container ).from( 'itemview' )\n .done( function( response )\n {\n $( '[data-plenty-itemview-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n }, ['APIFactory', 'CMSFactory', 'UIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Provides methods for creating and displaying modal popups.\n * @class ModalFactory\n * @static\n */\n pm.factory( 'ModalFactory', function()\n {\n\n return {\n prepare: prepare,\n isModal: isModal\n };\n\n /**\n * Detect if given html contains a valid modal\n * @function isModal\n * @param {string} html\n * @returns {boolean}\n */\n function isModal( html )\n {\n return PlentyFramework.partials.Modal.isModal( html );\n }\n\n /**\n * Create a new Instance of {{#crossLink \"ModalFactory.Modal\"}}Modal{{/crossLink}}\n * @function prepare\n * @returns {Modal}\n */\n function prepare( selector )\n {\n return new Modal( selector );\n }\n\n /**\n * Holds configuration of a modal and provides methods for displaying and hiding the modal\n * @class Modal\n * @for ModalFactory\n * @returns {Modal}\n * @constructor\n */\n function Modal( selector )\n {\n\n var modal = this;\n modal.selector = selector;\n\n /**\n * The title of the modal\n * @attribute title\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.title = '';\n\n modal.cssClass = '';\n\n /**\n * The content of the modal\n * @attribute content\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.content = '';\n\n /**\n * The content of the dismiss-button\n * @attribute labelDismiss\n * @type {string}\n * @private\n * @default \"Abbrechen\"\n */\n modal.labelDismiss = pm.translate( \"Cancel\" );\n\n /**\n * the label of the confirmation button\n * @attribute labelConfirm\n * @type {string}\n * @private\n * @default \"Bestätigen\"\n */\n modal.labelConfirm = pm.translate( \"Confirm\" );\n\n /**\n * Callback when modal is confirmed by clicking confirmation button.\n * Modal will not be dismissed if callback returns false.\n * @attribute onConfirm\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onConfirm = function()\n {\n };\n\n /**\n * Callback when modal is dismissed by closing the modal\n * @attribute onDismiss\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onDismiss = function()\n {\n };\n\n /**\n * jQuery selector of the container element to display the modal in.\n * @attribute container\n * @type {string}\n * @private\n * @default \"body\"\n */\n modal.container = 'body';\n\n /**\n * Timeout to close the modal automatically. Set <0 to disable.\n * @attribute timeout\n * @type {number}\n * @private\n * @default -1\n */\n modal.timeout = -1;\n\n modal.hide = hide;\n modal.startTimeout = startTimeout;\n modal.stopTimeout = stopTimeout;\n modal.pauseTimeout = pauseTimeout;\n modal.continueTimeout = continueTimeout;\n\n var bsModal;\n var timeout, interval;\n var timeRemaining, timeStart;\n var paused = false;\n\n return {\n setTitle : setTitle,\n setClass : setClass,\n setContent : setContent,\n setContainer : setContainer,\n setLabelConfirm: setLabelConfirm,\n setLabelDismiss: setLabelDismiss,\n onConfirm : onConfirm,\n onDismiss : onDismiss,\n setTimeout : setTimeout,\n show : show,\n hide : hide\n };\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/title:attribute}}title{{/crossLink}} of the modal\n * @function setTitle\n * @param {string} title The title\n * @returns {Modal} Modal object for chaining methods\n */\n function setTitle( title )\n {\n modal.title = title;\n return this;\n }\n\n function setClass( cssClass )\n {\n modal.cssClass = cssClass;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/content:attribute}}content{{/crossLink}} of the modal\n * @function setContent\n * @param {string} content The content\n * @returns {Modal} Modal object for chaining methods\n */\n function setContent( content )\n {\n modal.content = content;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelConfirm:attribute}}label of the confirmation\n * button{{/crossLink}} of the modal\n * @function setLabelConfirm\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelConfirm( label )\n {\n modal.labelConfirm = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelDismiss:attribute}}label if the dismiss\n * button{{/crossLink}} of the modal\n * @function setLabelDismiss\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelDismiss( label )\n {\n modal.labelDismiss = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onConfirm:attribute}}confirmation callback{{/crossLink}} of the\n * modal\n * @function onConfirm\n * @param {function} callback The callback if modal is confirmed\n * @returns {Modal} Modal object for chaining methods\n */\n function onConfirm( callback )\n {\n modal.onConfirm = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onDismiss:attribute}}dismiss callback{{/crossLink}} of the modal\n * @function onDismiss\n * @param {function} callback The callback if modal is dismissed\n * @returns {Modal} Modal object for chaining methods\n */\n function onDismiss( callback )\n {\n modal.onDismiss = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/container:attribute}}container{{/crossLink}} of the modal\n * @function setContainer\n * @param {string} container The jQuery selector of the container to display the modal in\n * @returns {Modal} Modal object for chaining methods\n */\n function setContainer( container )\n {\n modal.container = container;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/timeout:attribute}}timeout{{/crossLink}} of the modal\n * @function setTimeout\n * @param {number} timeout The timeout to close the modal automatically. Set <0 to disable\n * @returns {Modal} Modal object for chaining methods\n */\n function setTimeout( timeout )\n {\n modal.timeout = timeout;\n return this;\n }\n\n /**\n * Inject modal data in default template if not template is given\n * and display the modal inside the configured container.
    \n * Start timer to hide the modal automatically if timeout is set.\n * @function show\n */\n function show()\n {\n if( !!modal.selector )\n {\n bsModal = $( modal.selector );\n }\n else\n {\n if ( isModal( modal.content ) )\n {\n bsModal = PlentyFramework.partials.Modal.getModal( modal.content );\n }\n else\n {\n bsModal = $( PlentyFramework.compileTemplate( 'modal/modal.html', modal ) );\n }\n\n $( modal.container ).append( bsModal );\n\n // append additional scripts executable\n var scripts = $( modal.content ).filter( 'script' );\n if ( scripts.length > 0 )\n {\n scripts.each( function( i, script )\n {\n var element = document.createElement( 'script' );\n element.type = 'text/javascript';\n element.innerHTML = $( script ).text();\n $( modal.container ).append( element );\n } );\n }\n }\n\n // bind callback functions\n PlentyFramework.partials.Modal.init( bsModal, modal );\n bsModal.find( '[data-plenty-modal=\"confirm\"]' ).click( function()\n {\n var close = modal.onConfirm();\n\n if ( typeof close == \"undefined\" )\n {\n close = true;\n }\n\n if ( close )\n {\n hide( true );\n }\n } );\n\n PlentyFramework.partials.Modal.show( bsModal );\n\n if ( modal.timeout > 0 )\n {\n startTimeout();\n }\n\n }\n\n /**\n * Hide the modal.\n * @function hide\n * @param {boolean} confirmed Flag indicating of modal is closed by confirmation button or dismissed\n */\n function hide( confirmed )\n {\n PlentyFramework.partials.Modal.hide( bsModal );\n\n if ( !confirmed )\n {\n modal.onDismiss();\n }\n }\n\n /**\n * Start the configured timeout initially\n * @function startTimeout\n * @private\n */\n function startTimeout()\n {\n timeRemaining = modal.timeout;\n timeStart = (new Date()).getTime();\n\n timeout = window.setTimeout( function()\n {\n window.clearInterval( interval );\n hide();\n }, modal.timeout );\n\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( timeRemaining / 1000 );\n interval = window.setInterval( function()\n {\n if ( !paused )\n {\n var secondsRemaining = timeRemaining - (new Date()).getTime() + timeStart;\n secondsRemaining = Math.round( secondsRemaining / 1000 );\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( secondsRemaining );\n }\n }, 1000 )\n }\n\n /**\n * Pause the timeout (e.g. on hover)\n * @function pauseTimeout\n * @private\n */\n function pauseTimeout()\n {\n paused = true;\n timeRemaining -= (new Date()).getTime() - timeStart;\n window.clearTimeout( timeout );\n }\n\n /**\n * Continue paused timeout\n * @function continueTimeout\n * @private\n */\n function continueTimeout()\n {\n paused = false;\n timeStart = (new Date()).getTime();\n timeout = window.setTimeout( function()\n {\n hide();\n window.clearInterval( interval );\n }, timeRemaining );\n }\n\n /**\n * Stop timeout. Stopped timeouts cannot be continued.\n * @function stopTimeout\n * @private\n */\n function stopTimeout()\n {\n window.clearTimeout( timeout );\n window.clearInterval( interval );\n }\n\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Displaying error messages and handling wait screen\n * @class UIFactory\n * @static\n */\n pm.factory( 'UIFactory', function()\n {\n /**\n * Increased/ decreased when showing/ hiding wait screen to avoid stacking\n * multiple instances of overlays.\n * @attribute waitScreenCount\n * @private\n * @type {number}\n * @default 0\n */\n var waitScreenCount = 0;\n var waitScreen;\n var errorPopup = null;\n\n return {\n throwError : throwError,\n printErrors : printErrors,\n showWaitScreen: showWaitScreen,\n hideWaitScreen: hideWaitScreen\n };\n\n /**\n * Display a single error message.\n * @function throwError\n * @param {number} code A code identifying this error\n * @param {string} msg The error message to display\n */\n function throwError( code, msg )\n {\n printErrors( [{code: code, message: msg}] );\n }\n\n /**\n * Wrap error messages in error popup, if popup doesn't already contain this error\n * If popup is already visible, append new errors to popup's inner HTML\n * otherwise create new popup\n * @function printErrors\n * @param {Array} errorMessages A list of errors to display\n */\n function printErrors( errorMessages )\n {\n\n // create error-popup if not exist\n if ( !errorPopup || $( 'body' ).has( errorPopup ).length <= 0 )\n {\n errorPopup = $( pm.compileTemplate( 'error/errorPopup.html' ) );\n $( 'body' ).append( errorPopup );\n pm.partials.Error.init( errorPopup );\n }\n\n $.each( errorMessages, function( key, error )\n {\n // add additional error, if not exist.\n pm.partials.Error.addError( errorPopup, $( pm.compileTemplate( 'error/errorMessage.html', error ) ) );\n } );\n\n pm.partials.Error.show( errorPopup );\n\n hideWaitScreen( true );\n }\n\n /**\n * Show wait screen if not visible and increase\n * {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * @function showWaitScreen\n */\n function showWaitScreen()\n {\n waitScreenCount = waitScreenCount || 0;\n\n // create wait-overlay if not exist\n if ( !waitScreen || $( 'body' ).has( waitScreen ).length <= 0 )\n {\n waitScreen = $( pm.compileTemplate( 'waitscreen/waitscreen.html' ) );\n $( 'body' ).append( waitScreen );\n }\n\n pm.partials.WaitScreen.show( waitScreen );\n\n // increase instance counter to avoid showing multiple overlays\n waitScreenCount++;\n return waitScreenCount;\n }\n\n /**\n * Decrease {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * and hide wait screen if waitScreenCount is 0\n * @function hideWaitScreen\n * @param {boolean} forceClose set true to hide wait screen independent from the value of waitScreenCount.\n */\n function hideWaitScreen( forceClose )\n {\n\n // decrease overlay count\n waitScreenCount--;\n\n // hide if all instances of overlays has been closed\n // or if closing is forced by user\n if ( waitScreenCount <= 0 || !!forceClose )\n {\n waitScreenCount = 0;\n pm.partials.WaitScreen.hide( waitScreen );\n }\n return waitScreenCount;\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Factories provide static functions and can be injected into\n * {{#crossLinkModule \"Services\"}}services{{/crossLinkModule}}.
    \n * Factories also can inject other factories. Compared to services,\n * factories are not visible in instances of {{#crossLinkModule \"PlentyFramework\"}}PlentyFramework{{/crossLinkModule}}.\n *\n * @module Factories\n * @main Factories\n */\nObject.equals = function( a, b )\n{\n if ( a === b )\n {\n return true;\n }\n if ( !(a instanceof Object) || !(b instanceof Object) )\n {\n return false;\n }\n if ( a.constructor !== b.constructor )\n {\n return false;\n }\n\n for ( var key in a )\n {\n if ( !a.hasOwnProperty( key ) )\n {\n continue;\n }\n if ( !b.hasOwnProperty( key ) )\n {\n return false;\n }\n if ( a[key] === b[key] )\n {\n continue;\n }\n if ( typeof( a[key] ) !== \"object\" )\n {\n return false;\n }\n if ( !Object.equals( a[key], b[key] ) )\n {\n return false;\n }\n }\n\n for ( var key in b )\n {\n if ( b.hasOwnProperty( key ) && !a.hasOwnProperty( key ) )\n {\n return false;\n }\n }\n\n return true;\n\n};\nPlentyFramework.cssClasses = {\n\n active: \"active\"\n\n};\n(function( $, pm )\n{\n\n pm.partials.Error = {\n\n /**\n * Will be called, after the error popup was created and injected in DOM.\n * @param {HTMLElement} popup The injected element of the popup\n */\n init: function( popup )\n {\n $( popup ).find( '.close' ).click( function()\n {\n pm.partials.Error.hideAll();\n } );\n },\n\n /**\n * Will be called for each thrown error. Has to be injected in DOM manually.\n * @param {HTMLElement} popup The error popup element\n * @param {HTMLElement} error The error message element\n */\n addError: function( popup, error )\n {\n var errorCode = $( error ).attr( 'data-plenty-error-code' );\n\n if ( $( popup ).find( '[data-plenty-error-code=\"' + errorCode + '\"]' ).length <= 0 )\n {\n $( popup ).find( '.plentyErrorBoxInner' ).append( error );\n }\n },\n\n /**\n * Will be called, after initialization and injection of all errors\n * @param {HTMLElement} popup The error popup element\n */\n show: function( popup )\n {\n $( popup ).show();\n },\n\n hideAll: function() {\n $( '#CheckoutErrorPane' ).hide();\n $( '#CheckoutErrorPane' ).find( '.plentyErrorBoxInner' ).html( '' );\n }\n\n }\n\n})( jQuery, PlentyFramework );\n(function( $, pm )\n{\n\n pm.partials.Modal = {\n\n /**\n * Will be called after a new modal was created and injected into DOM\n * @param {HTMLElement} element The injected modal element\n * @param {Modal} modal The instance of the current modal\n */\n init: function( element, modal )\n {\n element.on( 'hidden.bs.modal', function()\n {\n modal.hide();\n if( !modal.selector )\n {\n //Do not remove static modals\n element.remove();\n }\n } );\n\n if ( modal.timeout > 0 )\n {\n element.on( 'hide.bs.modal', modal.stopTimeout );\n element.find( '.modal-content' ).hover( function()\n {\n modal.pauseTimeout();\n }, function()\n {\n if ( element.is( '.in' ) )\n {\n modal.continueTimeout();\n }\n } );\n }\n },\n\n /**\n * Will be called if a Modal requests to show.\n * @param {HTMLElement} element The injected modal element\n */\n show: function( element )\n {\n element.modal( 'show' );\n },\n\n /**\n * Will be called if a Modal requests to hide.\n * @param {HTMLElement} element The injected modal element\n */\n hide: function( element )\n {\n element.modal( 'hide' );\n },\n\n /**\n * Detect if a given HTML string contains a modal\n * @param {HTMLElement} html the element to search a modal in.\n * @returns {boolean} true if a modal was found\n */\n isModal: function( html )\n {\n return $( html ).filter( '.modal' ).length + $( html ).find( '.modal' ).length > 0;\n },\n\n /**\n * Filter a modal from a given HTML string\n * @param {HTMLElement} html the element to get a modal from.\n * @returns {HTMLElement} the filtered modal element\n */\n getModal: function( html )\n {\n var modal = $( html );\n if ( modal.length > 1 )\n {\n modal = $( html ).filter( '.modal' ) || $( html ).find( '.modal' );\n }\n\n return modal;\n }\n\n };\n\n}( jQuery, PlentyFramework ));\n(function( $ )\n{\n\n $( document ).on( 'initPartials', function( e, root )\n {\n\n $( root ).find( '[data-toggle=\"tooltip\"]' ).tooltip( {\n container: 'body'\n } );\n\n } );\n\n})( jQuery );\n(function( $, pm )\n{\n\n pm.partials.WaitScreen = {\n\n /**\n * Will be called if the wait screen should be shown\n * @param {HTMLElement} element The wait screen element\n */\n show: function( element )\n {\n element.addClass( 'in' );\n },\n\n /**\n * Will be called if the wait screen should be hidden\n * @param {HTMLElement} element The wait screen element\n */\n hide: function( element )\n {\n element.removeClass( 'in' );\n }\n\n };\n\n})( jQuery, PlentyFramework );\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.service( 'AddressDoctorService', function( API )\n {\n return {\n validateAddress: validateAddress\n };\n\n function validateAddress( addressForms )\n {\n var addressIsValid = true;\n addressForms = addressForms || '[data-plenty-address-doctor]';\n $( addressForms ).filter( '[data-plenty-address-doctor]:visible' ).each( function( i, form )\n {\n var addressDoctor = new AddressDoctor( form );\n var requiredFields = $( form ).attr( 'data-plenty-address-doctor' ).replace( /\\s/g, '' ).split( ',' );\n if ( !addressDoctor.isValid( requiredFields ) )\n {\n addressIsValid = false;\n }\n\n } );\n\n return addressIsValid;\n }\n\n function AddressDoctor( form )\n {\n var $form = $( form );\n var $inputs = {\n Street : $form.find( 'input[name=\"Street\"]' ),\n ZIP : $form.find( 'input[name=\"ZIP\"]' ),\n City : $form.find( 'input[name=\"City\"]' ),\n HouseNo: $form.find( 'input[name=\"HouseNo\"]' )\n };\n var $suggestionContainer = {};\n\n var suggestions;\n var requiredFields;\n\n return {\n isValid: isValid\n };\n\n function isValid( fields )\n {\n\n if ( isPackstation() )\n {\n return true;\n }\n\n suggestions = new AddressList( $form.getFormValues() );\n requiredFields = fields;\n\n refreshView();\n\n return suggestions.getAddresses().length == 1;\n }\n\n function refreshView()\n {\n $( '.suggestion-list' ).remove();\n\n var suggestionListVisible = false;\n for ( var i = 0; i < requiredFields.length; i++ )\n {\n if ( !validateInput( requiredFields[i], suggestionListVisible ) )\n {\n $form.trigger( 'validationFailed' );\n suggestionListVisible = true;\n }\n }\n\n if ( suggestions.houseNoAllowed( $inputs.HouseNo.val() ) || suggestions.getAddresses().length == 1 )\n {\n $inputs.HouseNo.removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs.HouseNo.addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n }\n else\n {\n $inputs.HouseNo.removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs.HouseNo.addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n }\n }\n\n function validateInput( key, suggestionListVisible )\n {\n var valueList = suggestions.getList( key );\n\n if ( !!$suggestionContainer[key] )\n {\n $suggestionContainer[key].remove();\n }\n\n if ( !$inputs[key] )\n {\n return true;\n }\n\n if ( valueList.length == 1 )\n {\n $inputs[key].val( valueList[0] );\n\n $inputs[key].removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs[key].addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n return true;\n }\n else\n {\n $inputs[key].removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs[key].addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n\n if ( !suggestionListVisible )\n {\n buildSuggestionList( $inputs[key], valueList );\n }\n $inputs[key].off( 'focus' );\n $inputs[key].focus();\n return false;\n\n }\n }\n\n function positionSuggestionList( $parent, suggestionKey )\n {\n $suggestionContainer[suggestionKey].css( {\n 'width': $parent.outerWidth( true ),\n 'left' : $parent.position().left,\n 'top' : $parent.position().top + $parent.outerHeight( true )\n } );\n }\n\n function buildSuggestionList( $parent, values )\n {\n var suggestionKey = $parent.attr( 'name' );\n\n // render html content\n $suggestionContainer[suggestionKey] = $( pm.compileTemplate( 'addressSuggestions/addressDoctor.html', {values: values} ) );\n\n positionSuggestionList( $parent, suggestionKey );\n\n $( window ).on( 'sizeChange', function()\n {\n positionSuggestionList( $parent, suggestionKey );\n } );\n\n // bind click event to list elements\n $suggestionContainer[suggestionKey].find( '[data-address-value]' ).each( function( i, elem )\n {\n\n var $elem = $( elem );\n var value = $elem.attr( 'data-address-value' );\n\n $elem.click( function()\n {\n // insert clicked value in input\n $parent.val( value );\n\n // filter addresses and show remaining suggestions\n var filterAddress = {};\n filterAddress[$parent.attr( 'name' )] = value;\n suggestions.filter( filterAddress );\n\n // refresh suggestion lists\n refreshView();\n\n } );\n\n } );\n\n // inject html\n $parent.parent().append( $suggestionContainer[suggestionKey] );\n }\n\n function isPackstation()\n {\n return ( $inputs.Street.val().toUpperCase() == \"PACKSTATION\" || $inputs.Street.val().toUpperCase() == \"POSTFILIALE\" );\n }\n\n }\n\n function AddressList( addressInput )\n {\n var addresses = [];\n\n init();\n\n return {\n getAddresses : getAddresses,\n getList : getList,\n filter : filter,\n houseNoAllowed: houseNoAllowed\n };\n\n function init()\n {\n API.get( '/rest/checkout/addresssuggestionresultslist/', {\n suggestionType: \"addressdoctor\",\n street : addressInput.Street,\n ZIP : addressInput.ZIP,\n city : addressInput.City,\n houseNo : addressInput.HouseNo,\n country : addressInput.CountryID\n }, false, false, true ).done( function( response )\n {\n\n var responseLength = response.data.length;\n\n for ( var i = 0; i < responseLength; i++ )\n {\n var currentResponse = response.data[i];\n\n var address = getAddress( currentResponse )\n if ( !address )\n {\n currentResponse.HouseNo = [currentResponse.HouseNo];\n addresses.push( currentResponse );\n }\n else\n {\n address.HouseNo.push( currentResponse.HouseNo );\n }\n\n }\n\n } );\n }\n\n function getAddress( suggestion )\n {\n var addressCount = addresses.length;\n\n for ( var j = 0; j < addressCount; j++ )\n {\n if ( suggestion.Street == addresses[j].Street && addresses.ZIP == addresses[j].ZIP && suggestion.City == addresses[j].City )\n {\n return addresses[j];\n }\n }\n\n return null;\n\n }\n\n function getAddresses()\n {\n return addresses;\n }\n\n function getList( key )\n {\n var results = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( $.inArray( address[key], results ) < 0 )\n {\n results.push( address[key] );\n }\n }\n\n return results;\n }\n\n function filter( filterAddress )\n {\n var filteredAddresses = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( (!!filterAddress.Street && filterAddress.Street == address.Street)\n || (!!filterAddress.ZIP && filterAddress.ZIP == address.ZIP)\n || (!!filterAddress.City && filterAddress.City == address.City) )\n {\n filteredAddresses.push( address );\n }\n }\n\n addresses = filteredAddresses;\n }\n\n function houseNoAllowed( houseNo )\n {\n houseNo = parseInt( houseNo );\n\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n\n for ( var j = 0; j < address.HouseNo.length; j++ )\n {\n var range = address.HouseNo[j].split( '-' );\n if ( ( range.length == 1 && houseNo == range[0] )\n || range.length == 2 && houseNo >= range[0] && houseNo <= range[1] )\n {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for logging in and out and registering new customers.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    \n * @class AuthenticationService\n * @static\n */\n pm.service( 'AuthenticationService', function( API, Checkout, UI )\n {\n\n return {\n resetPassword : resetPassword,\n customerLogin : customerLogin,\n setInvoiceAddress: setInvoiceAddress,\n registerCustomer : registerCustomer\n };\n\n /**\n * Reading E-Mail from form marked with data-plenty-checkout=\"lostPasswordForm\"\n * and sends request to provide a new password to the entered E-Mail-Address.\n *\n * @function resetPasswort\n * @return {object} jQuery deferred\n * Object\n */\n function resetPassword()\n {\n\n var form = $( '[data-plenty-checkout=\"lostPasswordForm\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n var params = {\n Email: values.Email\n };\n\n return API.post( \"/rest/checkout/lostpassword/\", params )\n .done( function( response )\n {\n if ( response.data.IsMailSend == true )\n {\n $( '[data-plenty-checkout=\"lostPasswordTextContainer\"]' ).hide();\n $( '[data-plenty-checkout=\"lostPasswordSuccessMessage\"]' ).show();\n }\n } );\n\n }\n }\n\n /**\n * Try to login in with credentials read from given <form> - element.\n * On success redirect to forms 'action' attribute.\n *\n * @function customerLogin\n * @param {object} form The jQuery-wrapped form-element to read the credentials from\n * @return {object} jQuery deferred\n * Object\n */\n function customerLogin( form )\n {\n if ( form.validateForm() )\n {\n var values = form.getFormValues();\n\n var params = {\n Email : values.loginMail,\n Password: values.loginPassword\n };\n\n UI.showWaitScreen();\n return API.post( \"/rest/checkout/login/\", params )\n .done( function()\n {\n // successful login -> go to form's target referenced by action-attribute\n window.location.assign( form.attr( 'action' ) );\n\n } );\n }\n }\n\n /**\n * Setting the invoice address of a newly registered customer or a guest.\n *\n * @function setInvoiceAddress\n * @param {object} invoiceAddress containing address-data sent to server\n * @return {object} jQuery deferred\n * Object\n */\n function setInvoiceAddress( invoiceAddress )\n {\n\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n Checkout.getCheckout().CustomerInvoiceAddress = response.data;\n } );\n }\n\n /**\n * Prepare address-data to register new customer. Read the address-data from a <form> marked with\n * data-plenty-checkout-form=\"customerRegistration\"
    \n * On success, redirect to forms target referenced by action-attribute\n *\n * @function registerCustomer\n * @return {object} jQuery deferred\n * Object\n */\n function registerCustomer()\n {\n var form = $( '[data-plenty-checkout-form=\"customerRegistration\"]' );\n\n if ( form.validateForm() && pm.getInstance().AddressDoctorService.validateAddress() )\n {\n var values = form.getFormValues();\n values.LoginType = 2;\n\n if ( values.checkout\n && values.checkout.customerInvoiceAddress\n && values.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = values.checkout.customerInvoiceAddress.CustomerProperty;\n values.CustomerPropertiesList = values.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n values.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n return setInvoiceAddress( values )\n .done( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } );\n }\n }\n }, ['APIFactory', 'CheckoutFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for adding, editing or removing basket items and coupon codes
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class BasketService\n * @static\n */\n pm.service( 'BasketService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n addItem : addBasketItem,\n removeItem : removeBasketItem,\n getItem : getBasketItem,\n setItemQuantity : setItemQuantity,\n editItemAttributes: editItemAttributes,\n editOrderParams : editOrderParams,\n addCoupon : addCoupon,\n removeCoupon : removeCoupon\n };\n\n /**\n * Add item to basket. Will fail and show a popup if item has order params\n * @function addBasketItem\n * @param {Array} article Array containing the item to add\n * @param {boolean} [isUpdate=false] Indicating if item's OrderParams are updated\n * @return {object} jQuery deferred\n * Object\n */\n function addBasketItem( article )\n {\n\n if ( !!article )\n {\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/',\n {\n itemID : article[0].BasketItemItemID,\n quantity: article[0].BasketItemQuantity\n }, false, true ).done( function( resp )\n {\n // checking for order params!\n if ( resp.data[0].indexOf( \"form-group\" ) > 0 )\n {\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Select order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n addArticle( saveOrderParams( article ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n }\n else\n {\n addArticle( article );\n }\n } );\n }\n }\n\n /**\n * Read OrderParams from <form> marked with data-plenty-checkout-form=\"OrderParamsForm\" and inject\n * read values in 'addBasketList'. Update item by calling addBasketItem() again\n * @function saveOrderParams\n * @private\n * @param {Array} articleWithParams Containing the current item to add. Read OrderParams will be injected\n */\n function saveOrderParams( articleWithParams )\n {\n //TODO use $(\"[data-plenty-checkout-form='OrderParamsForm']\").serializeArray() to get order params\n var orderParamsForm = $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' );\n var $self = {};\n var attrType = \"\";\n var match;\n\n //Groups\n orderParamsForm.find( '[name^=\"ParamGroup\"]' ).each( function()\n {\n match = this.name.match( /^ParamGroup\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], $( this ).val(), $( this ).val() );\n } );\n\n //Values\n orderParamsForm.find( '[name^=\"ParamValue\"]' ).each( function()\n {\n $self = $( this );\n attrType = $self.attr( 'type' );\n\n if ( ((attrType == 'checkbox' && $self.is( ':checked' )) ||\n (attrType == 'radio' && $self.is( ':checked' )) ||\n (attrType != 'radio' && attrType != 'checkbox')) && attrType != 'file' && attrType != 'hidden' )\n {\n\n var match = $self[0].name.match( /^ParamValue\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], $self.val() );\n\n }\n else if ( attrType == 'file' )\n {\n if ( $self[0].files && $self[0].files.length > 0 )\n {\n articleWithParams = orderParamFileUpload( $self, articleWithParams );\n }\n else\n {\n var match = $self[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n var paramValue = $( 'input[type=\"hidden\"][name=\"ParamValue[' + match[1] + '][' + match[2] + ']\"]' ).val();\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], paramValue );\n }\n }\n } );\n\n return articleWithParams;\n }\n\n function addArticle( article )\n {\n API.post( '/rest/checkout/basketitemslist/', article, true )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n // Show confirmation popup\n CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', {ArticleID: article[0].BasketItemItemID} ).from( 'ItemView' )\n .done( function( response )\n {\n var timeout = pm.getGlobal( 'TimeoutItemToBasketOverlay', 5000 );\n var modal = Modal.prepare().setContent( response.data[0] );\n\n if ( timeout > 0 )\n {\n modal.setTimeout( timeout );\n }\n\n modal.show();\n } );\n } );\n } ).fail( function( jqXHR )\n {\n // some other error occured\n UI.printErrors( JSON.parse( jqXHR.responseText ).error.error_stack );\n } );\n }\n\n function updateArticle( article )\n {\n API.put( '/rest/checkout/basketitemslist/', article )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n } );\n } )\n }\n\n function orderParamFileUpload( $input, articleWithParams )\n {\n var key = $input[0].id;\n var orderParamUploadFiles = {};\n var orderParamFileIdStack = [];\n var formData;\n var fileData;\n var params = {\n type : 'POST',\n data : {},\n isFile : true,\n cache : false,\n dataType : 'json',\n processData: false,\n contentType: false\n };\n\n orderParamUploadFiles[key] = $input[0].files;\n\n // if input not pushed before.\n if ( orderParamFileIdStack.indexOf( key ) == -1 )\n {\n orderParamFileIdStack.push( key );\n }\n\n for ( var i = 0, length = orderParamFileIdStack.length; i < length; ++i )\n {\n formData = new FormData();\n fileData = orderParamUploadFiles[orderParamFileIdStack[i]];\n formData.append( \"0\", fileData[0], fileData[0].name );\n\n params.data = formData;\n\n API.post( \"/rest/checkout/orderparamfile/\", params );\n }\n\n var match = $input[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n\n return addOrderParamValue( articleWithParams, match[1], match[2], orderParamUploadFiles[key][0]['name'] );\n }\n\n /**\n * Inject an OrderParam.\n * @function addOrderParamValue\n * @private\n * @param {Array} basketList The target to inject the value in.\n * @param {number} position Position where to inject the value\n * @param {number} paramId The ID of the OrderParam to inject\n * @param {string|number} paramValue the value of the OrderParam to inject\n * @returns {Array} Containing the item and the injected OrderParam\n */\n function addOrderParamValue( basketList, position, paramId, paramValue )\n {\n if ( position > 0 && basketList[position] == undefined )\n {\n basketList[position] = $.extend( true, {}, basketList[0] );\n basketList[position].BasketItemOrderParamsList = [];\n }\n\n if ( basketList[position] != undefined )\n {\n basketList[position].BasketItemQuantity = 1;\n if ( basketList[position].BasketItemOrderParamsList == undefined )\n {\n basketList[position].BasketItemOrderParamsList = [];\n }\n if ( paramValue )\n {\n basketList[position].BasketItemOrderParamsList.push( {\n BasketItemOrderParamID : paramId,\n BasketItemOrderParamValue: paramValue\n } );\n }\n }\n\n return basketList;\n }\n\n function editItemAttributes( BasketItemID )\n {\n var modal = $( '[data-plenty-basket-item=\"' + BasketItemID + '\"]' );\n modal.modal( 'show' );\n modal.find( '[data-plenty-modal=\"confirm\"]' ).on( 'click', function()\n {\n var basketItem = getBasketItem( BasketItemID );\n var attributesList = [];\n\n // check for select or list of images\n modal.find( 'select, .PlentyFormContainer.AttrImage > input[type=\"hidden\"]' ).each( function( i, attributeSelect )\n {\n var match = attributeSelect.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( attributeSelect ).val()\n } );\n }\n\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItem.BasketItemAttributesList = attributesList;\n }\n //update basketItem and refresh previewLists\n updateArticle( [basketItem] );\n\n } );\n }\n\n function editOrderParams( BasketItemID )\n {\n\n var basketItem = getBasketItem( BasketItemID );\n // FIX: unset old order params\n\n basketItem.BasketItemOrderParamsList = [];\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/', {\n itemID : basketItem.BasketItemItemID,\n quantity : basketItem.BasketItemQuantity,\n basketItemID: BasketItemID\n } ).done( function( resp )\n {\n // checking for order params!\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Edit order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n updateArticle( saveOrderParams( [basketItem] ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n } );\n }\n\n function getBasketItem( BasketItemID )\n {\n var basketItems = Checkout.getCheckout().BasketItemsList;\n for ( var i = 0; i < basketItems.length; i++ )\n {\n if ( basketItems[i].BasketItemID == BasketItemID )\n {\n return basketItems[i];\n }\n }\n\n return null;\n }\n\n /**\n * Remove item from basket. Will show a confirmation popup at first.\n * @function removeBasketItem\n * @param {number} BasketItemID The ID of the basket item to remove\n * @param {boolean} [forceDelete=false] Set true to remove the basket item without showing a confirmation popup\n * @return Promise\n */\n function removeBasketItem( BasketItemID, forceDelete )\n {\n\n var deferred = $.Deferred();\n\n // get item name\n var itemName = getBasketItem( BasketItemID ).BasketItemNameMap[1];\n\n // calling the delete request\n function doDelete()\n {\n API.delete( '/rest/checkout/basketitemslist/?basketItemIdsList[0]=' + BasketItemID )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n //$( '[data-basket-item-id=\"' + BasketItemID + '\"]' ).remove();\n\n if ( !Checkout.getCheckout().BasketItemsList || Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n }\n else\n {\n // FALLBACK if design not support selector\n // [data-plenty-checkout-template=\"BasketItemsList\"]\n if ( $( '[data-plenty-checkout-template=\"BasketItemsList\"]' ).length >= 0 )\n {\n API.get( \"/rest/checkout/container_checkoutbasketitemslist/\" ).done( function( response )\n {\n var $oldBasketList = $( '[data-basket-item-id]' ).parents( \"ul\" );\n var $basketListContainer = $oldBasketList.parents( \".panel-body\" );\n $oldBasketList.fadeOut( function()\n {\n $( this ).siblings( \":not('[data-plenty-checkout-template]')\" ).remove();\n $( this ).remove();\n $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn(function() {\n pm.getInstance().bindDirectives( $basketListContainer );\n });\n } );\n } );\n }\n else\n {\n Checkout.reloadContainer( 'BasketItemsList' );\n }\n Checkout.reloadContainer( 'Totals' );\n }\n\n refreshBasketPreview();\n\n deferred.resolve();\n } );\n } );\n }\n\n if ( !forceDelete )\n {\n // show confirmation popup\n Modal.prepare()\n .setTitle( pm.translate( 'Please confirm' ) )\n .setContent( '

    ' + pm.translate( \"Do you really want to remove \\\"{{item}}\\\" from your basket?\", {item: itemName} ) + '

    ' )\n .onDismiss( function()\n {\n //$('[data-basket-item-id=\"' + BasketItemID +\n // '\"]').find('[data-plenty=\"quantityInput\"]').val(originalItemQuantity);\n deferred.reject();\n } )\n .onConfirm( function()\n {\n doDelete();\n } )\n .setLabelConfirm( pm.translate( \"Delete\" ) )\n .show();\n }\n else\n {\n doDelete();\n }\n\n return deferred;\n }\n\n /**\n * Set a new quantity for the given BasketItem. If quantity is set to 0,\n * remove the item.\n * @function setItemQuantity\n * @param {number} BasketItemID The ID of the basket item to change the quantity of\n * @param {number} BasketItemQuantity The new quantity to set or 0 to remove the item\n */\n function setItemQuantity( BasketItemID, BasketItemQuantity )\n {\n // delete item if quantity is 0\n if ( BasketItemQuantity <= 0 )\n {\n return removeBasketItem( BasketItemID );\n }\n\n var deferred = $.Deferred();\n var params = Checkout.getCheckout().BasketItemsList;\n var basketItem;\n var basketItemIndex;\n\n for ( var i = 0; i < params.length; i++ )\n {\n if ( params[i].BasketItemID == BasketItemID )\n {\n basketItemIndex = i;\n basketItem = params[i];\n break;\n\n }\n }\n\n if ( !!basketItem && basketItem.BasketItemQuantity != BasketItemQuantity )\n {\n params[basketItemIndex].BasketItemQuantity = parseInt( BasketItemQuantity );\n\n API.post( \"/rest/checkout/basketitemslist/\", params )\n .done( function()\n {\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n refreshBasketPreview();\n deferred.resolve();\n } );\n } );\n }\n\n return deferred;\n }\n\n /**\n * Reload BasketPreview-Template and update basket totals\n * @function refreshBasketPreview\n * @private\n */\n function refreshBasketPreview()\n {\n\n Checkout.reloadItemContainer( 'BasketPreviewList' )\n .done( function()\n {\n\n $( '[data-plenty-basket-empty]' ).each( function( i, elem )\n {\n var toggleClass = $( elem ).attr( 'data-plenty-basket-empty' );\n if ( Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n $( elem ).addClass( toggleClass );\n }\n else\n {\n $( elem ).removeClass( toggleClass );\n }\n } );\n\n } );\n\n //update quantity\n var itemQuantityTotal = 0;\n $.each( Checkout.getCheckout().BasketItemsList, function( i, basketItem )\n {\n itemQuantityTotal += basketItem.BasketItemQuantity;\n } );\n\n $( '[data-plenty-basket-preview=\"itemQuantityTotal\"]' ).text( itemQuantityTotal );\n $( '[data-plenty-basket-preview=\"totalsItemSum\"]' ).text( Checkout.getCheckout().Totals.TotalsItemSum );\n }\n\n /**\n * Read the coupon code from an <input> element marked with data-plenty-checkout-form=\"couponCode\"\n * and try to add this coupon.\n * @function addCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function addCoupon()\n {\n var params = {\n CouponActiveCouponCode: $( '[data-plenty-checkout-form=\"couponCode\"]' ).val()\n };\n\n return API.post( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n\n updateContainer();\n } );\n } );\n }\n\n /**\n * Remove the currently added coupon\n * @function removeCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function removeCoupon()\n {\n var params = {\n CouponActiveCouponCode: Checkout.getCheckout().Coupon.CouponActiveCouponCode\n };\n\n return API.delete( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n delete Checkout.getCheckout().Coupon;\n\n updateContainer();\n } );\n } );\n }\n\n // update container\n function updateContainer()\n {\n Checkout.reloadContainer( 'Coupon' );\n // reload totals, if we are at basket\n if ( $( '[data-plenty-checkout-template=\"Totals\"]' ).length > 0 )\n {\n Checkout.reloadContainer( 'Totals' );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for checkout process like setting shipping & payment information and placing the order.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutService\n * @static\n */\n pm.service( 'CheckoutService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n init : init,\n setCustomerSignAndInfo: setCustomerSignAndInfo,\n registerGuest : registerGuest,\n setShippingProfile : setShippingProfile,\n saveShippingAddress : saveShippingAddress,\n loadAddressSuggestion : loadAddressSuggestion,\n preparePayment : preparePayment,\n setMethodOfPayment : setMethodOfPayment,\n confirmAtrigaPaymax : confirmAtrigaPaymax,\n editBankDetails : editBankDetails,\n editCreditCard : editCreditCard,\n placeOrder : placeOrder\n };\n\n /**\n * Load checkout data initially on page load\n * @function init\n */\n function init()\n {\n Checkout.loadCheckout( true );\n }\n\n /**\n * Read customer sign and order information text from <form> marked with\n * data-plenty-checkout-form=\"details\" and update checkout.\n * @function setCustomerSignAndInfo\n * @return {object} jQuery deferred\n * Object\n */\n function setCustomerSignAndInfo()\n {\n var form = $( '[data-plenty-checkout-form=\"details\"]' );\n var values = form.getFormValues();\n\n // initialize CustomerSign & InfoText to avoid updating empty values\n if ( !Checkout.getCheckout().CheckoutCustomerSign )\n {\n Checkout.getCheckout().CheckoutCustomerSign = \"\";\n }\n if ( !Checkout.getCheckout().CheckoutOrderInfoText )\n {\n Checkout.getCheckout().CheckoutOrderInfoText = \"\";\n }\n\n if ( ( Checkout.getCheckout().CheckoutCustomerSign !== values.CustomerSign && $( form ).find( '[name=\"CustomerSign\"]' ).length > 0 )\n || ( Checkout.getCheckout().CheckoutOrderInfoText !== values.OrderInfoText && $( form ).find( '[name=\"OrderInfoText\"]' ).length > 0 ) )\n {\n\n Checkout.getCheckout().CheckoutCustomerSign = values.CustomerSign;\n Checkout.getCheckout().CheckoutOrderInfoText = values.OrderInfoText;\n\n return Checkout.setCheckout();\n\n }\n else\n {\n // No changes detected -> Do nothing\n return API.idle();\n }\n }\n\n /**\n * Read address data from <form> marked with data-plenty-checkout-form=\"shippingAddress\".\n * Create new shipping address or update the shipping address ID.\n * @function saveShippingAddress\n * @param {boolean} [validateForm = false] validate form before processing requests\n * @return {object} jQuery deferred\n * Object\n */\n function saveShippingAddress( validateForm )\n {\n var form = $( '[data-plenty-checkout-form=\"shippingAddress\"]' );\n\n if ( !validateForm && !form.validateForm() )\n {\n return false;\n }\n\n if ( !validateForm && !pm.getInstance().AddressDoctorService.validateAddress( form ) )\n {\n return false;\n }\n\n var values = form.getFormValues();\n var shippingAddressID = $( '[name=\"shippingAddressID\"]:checked' ).val();\n\n if ( shippingAddressID < 0 )\n {\n // save separate\n var shippingAddress = values;\n\n if ( !addressesAreEqual( shippingAddress, Checkout.getCheckout().CustomerShippingAddress ) )\n {\n if ( shippingAddress.Street == \"PACKSTATION\" )\n {\n shippingAddress.IsPackstation = 1;\n shippingAddress.PackstationNo = shippingAddress.HouseNo;\n }\n else if ( shippingAddress.Street == \"POSTFILIALE\" )\n {\n shippingAddress.IsPostfiliale = 1;\n shippingAddress.PostfilialNo = shippingAddress.HouseNo;\n }\n\n // new shipping address\n return API.post( \"/rest/checkout/customershippingaddress/\", shippingAddress )\n .done( function( response )\n {\n\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = response.data.ID;\n Checkout.getCheckout().CheckoutShippingCountryID = response.data.CountryID;\n\n updatePaymentAndShippingDependencies();\n } );\n }\n else\n {\n // no changes detected\n return API.idle();\n }\n\n }\n else\n {\n if ( shippingAddressID != Checkout.getCheckout().CheckoutCustomerShippingAddressID )\n {\n // change shipping address id\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = shippingAddressID;\n\n updatePaymentAndShippingDependencies();\n }\n else\n {\n return API.idle();\n }\n }\n }\n\n function updatePaymentAndShippingDependencies()\n {\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n $( '#shippingAdressSelect' ).modal( 'hide' );\n\n // don't hit me. Ugly hack: this is to force quit/remove everything from modal.\n if($(\".modal-backdrop\")) {\n $(\".modal-backdrop\").remove();\n }\n } );\n }\n\n /**\n * Prepare address-data to register a guest. Reads the address-data from a <form> marked with\n * data-plenty-checkout-form=\"guestRegistration\"\n * @function registerGuest\n * @return {object} jQuery deferred\n * Object\n */\n function registerGuest()\n {\n var form = $( '[data-plenty-checkout-form=\"guestRegistration\"]' );\n\n var invoiceAddress = form.getFormValues();\n invoiceAddress.LoginType = 1;\n\n if ( invoiceAddress.checkout\n && invoiceAddress.checkout.customerInvoiceAddress\n && invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty;\n invoiceAddress.CustomerPropertiesList = invoiceAddress.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n invoiceAddress.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n if ( !addressesAreEqual( invoiceAddress, Checkout.getCheckout().CustomerInvoiceAddress ) )\n {\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n saveShippingAddress().done( Checkout.loadCheckout );\n } );\n }\n else\n {\n return saveShippingAddress();\n }\n }\n\n /**\n * Check if values of addresses are equal\n * @function addressesAreEqual\n * @private\n * @param {object} address1\n * @param {object} address2\n * @returns {boolean}\n */\n function addressesAreEqual( address1, address2 )\n {\n for ( var key in address1 )\n {\n if ( address1[key] + '' !== address2[key] + '' && key !== 'EmailRepeat' )\n {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Set the shipping profile used for this order and update checkout. Selected shipping profile will be\n * read from <form> marked with data-plenty-checkout-form=\"shippingProfileSelect\"\n * @function setShippingProfile\n * @return {object} jQuery deferred\n * Object\n */\n function setShippingProfile()\n {\n\n var values = $( '[data-plenty-checkout-form=\"shippingProfileSelect\"]' ).getFormValues();\n\n Checkout.getCheckout().CheckoutShippingProfileID = values.ShippingProfileID;\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n\n }\n\n /**\n * Prepare method of payment to check if external checkout is used or addition content should be displayed\n * @function preparePayment\n * @return {object} jQuery deferred\n * Object\n */\n function preparePayment()\n {\n var paymentID = Checkout.getCheckout().CheckoutMethodOfPaymentID;\n var paymentData = $( 'input[type=\"radio\"][name=\"MethodOfPaymentID\"][value=\"' + paymentID + '\"]' ).parent().getFormValues();\n return API.post( \"/rest/checkout/preparepayment/\", paymentData, true )\n .done( function( response )\n {\n if ( response.data.CheckoutMethodOfPaymentRedirectURL != '' )\n {\n\n document.location.assign( response.data.CheckoutMethodOfPaymentRedirectURL );\n\n }\n else if ( !!response.data.CheckoutMethodOfPaymentAdditionalContent )\n {\n\n var isBankDetails = $( response.data.CheckoutMethodOfPaymentAdditionalContent ).find( '[data-plenty-checkout-form=\"bankDetails\"]' ).length > 0;\n Modal.prepare()\n .setContent( response.data.CheckoutMethodOfPaymentAdditionalContent )\n .onConfirm( function()\n {\n if ( isBankDetails )\n {\n return saveBankDetails();\n }\n else\n {\n return saveCreditCard();\n }\n } )\n .show();\n }\n } )\n .fail( function( jqXHR )\n {\n try\n {\n var response = $.parseJSON( jqXHR.responseText );\n\n var errorStack = [];\n for ( var i = 0; i < response.error.error_stack.length; i++ )\n {\n if ( response.error.error_stack[i].code == 651 )\n {\n // notify atriga validation errors\n Checkout.reloadContainer( 'MethodsOfPaymentList' ).done( function()\n {\n $( document ).trigger( 'plenty.AtrigaValidationFailed' );\n } );\n }\n else\n {\n errorStack.push( response.error.error_stack[i] );\n }\n }\n\n // display remaining errors\n if ( errorStack.length > 0 )\n {\n UI.printErrors( errorStack );\n }\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n } );\n\n }\n\n /**\n * Set the method of payment used for this order.\n * @function setMethodOfPayment\n * @param {number|undefined} paymentID ID of the method of payment to use. Read from <form> marked with\n * data-plenty-checkout-form=\"methodOfPayment\" if unset.\n * @return {object} jQuery deferred\n * Object\n */\n function setMethodOfPayment( paymentID )\n {\n /*\n var methodsOfPaymentList = Checkout.getCheckout().MethodsOfPaymentList;\n var methodOfPayment;\n for( var i = 0; i < methodsOfPaymentList.length; i++ )\n {\n if( methodsOfPaymentList[i].MethodOfPaymentID == paymentID )\n {\n methodOfPayment = methodsOfPaymentList[i];\n break;\n }\n }\n */\n\n if ( !paymentID )\n {\n // FIX for older callisto layouts (< 3.3): get payment id from input field\n paymentID = $( 'input[name=\"MethodOfPaymentID\"]:checked' ).val();\n }\n\n Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID;\n\n if ( !pm.getGlobal( 'Checkout.AtrigaRequireUserConfirmation' ) )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = true;\n }\n\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'ShippingProfilesList' );\n } );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxChecked )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = !!atrigaPaymaxChecked;\n return API.put( '/rest/checkout', {\n CheckoutAtrigapaymaxChecked: !!atrigaPaymaxChecked\n } );\n //return Checkout.setCheckout();\n }\n\n /**\n * Display the popup to enter or edit customers bank details\n * @function editBankDetails\n */\n function editBankDetails()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationBankDetails' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveBankDetails();\n } )\n .show();\n } );\n\n }\n\n /**\n * Read entered bank details from data-plenty-checkout-form=\"bankDetails\" and update checkout.\n * @function saveBankDetails\n * @private\n * @return {boolean} the result of form validation\n */\n function saveBankDetails()\n {\n var form = $( '[data-plenty-checkout-form=\"bankDetails\"]' );\n\n if ( form.validateForm() )\n {\n var values = form.getFormValues().checkout.customerBankDetails;\n\n var bankDetails = {\n CustomerBankName : values.bankName,\n CustomerBLZ : values.blz,\n CustomerAccountNumber: values.accountNo,\n CustomerAccountOwner : values.accountOwner,\n CustomerIBAN : values.iban,\n CustomerBIC : values.bic\n };\n\n API.post( \"/rest/checkout/paymentinformationbankdetails/\", bankDetails )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n setMethodOfPayment( 3 );\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing credit card form\n * @function editCreditCard\n */\n function editCreditCard()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationCreditCard' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveCreditCard();\n } )\n .show();\n } );\n }\n\n /**\n * Read values from <form> marked with data-plenty-checkout-form=\"creditCard\" and update checkout.\n * @function saveCreditCard\n * @private\n * @return {boolean} the result of form validation\n */\n function saveCreditCard()\n {\n var form = $( '[data-plenty-checkout-form=\"creditCard\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues().checkout.paymentInformationCC;\n\n var creditCard = {\n Owner : values.owner,\n Cvv2 : values.cvv2,\n Number : values.number,\n Year : values.year,\n Month : values.month,\n Provider: values.provider\n };\n\n API.post( '/rest/checkout/paymentinformationcreditcard/', creditCard )\n .done( function()\n {\n Checkout.loadCheckout();\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing address suggestions\n * @param {string} type\n */\n function loadAddressSuggestion( type )\n {\n\n //check login type\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n var values = $( '[data-plenty-checkout-form=\"shippingAddress\"]' ).getFormValues();\n }\n else\n {\n var values = $( '[data-plenty-checkout-form=\"guestRegistration\"]' ).getFormValues();\n }\n\n var params = {\n street : values.Street,\n houseNo : values.HouseNo,\n ZIP : values.ZIP,\n city : values.City,\n postnummer : values.Postnummer,\n suggestionType: 'postfinder'\n };\n\n CMS.getContainer( 'CheckoutAddressSuggestionResultsList', params ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .show();\n } );\n }\n\n /**\n * Place the order prepared before and finish the checkout process.
    \n * Validate required checkboxes in data-plenty-checkout-form=\"placeOrder\"\n * @function placeOrder\n * @return {object} jQuery deferred\n * Object\n */\n function placeOrder()\n {\n var form = $( '[data-plenty-checkout-form=\"placeOrder\"]' );\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n // if not shown in layout set default 1 for mandatory fields\n var params = {\n TermsAndConditionsCheck : values.termsAndConditionsCheck || 0,\n WithdrawalCheck : values.withdrawalCheck || 0,\n PrivacyPolicyCheck : values.privacyPolicyCheck || 0,\n AgeRestrictionCheck : values.ageRestrictionCheck || 0,\n NewsletterCheck : values.newsletterCheck || 0,\n KlarnaTermsAndConditionsCheck: values.klarnaTermsAndConditionsCheck || 0,\n PayoneDirectDebitMandateCheck: values.payoneDirectDebitMandateCheck || 0,\n PayoneInvoiceCheck : values.payoneInvoiceCheck || 0\n };\n\n return API.post( \"/rest/checkout/placeorder/\", params )\n .done( function( response )\n {\n if ( response.data.MethodOfPaymentRedirectURL != '' )\n {\n\n window.location.assign( response.data.MethodOfPaymentRedirectURL );\n\n }\n else if ( response.data.MethodOfPaymentAdditionalContent != '' )\n {\n\n Modal.prepare()\n .setContent( response.data.MethodOfPaymentAdditionalContent )\n .setLabelDismiss( '' )\n .onDismiss( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).onConfirm( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).show();\n\n }\n else\n {\n\n window.location.assign( form.attr( 'action' ) );\n\n }\n } );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n pm.service( 'FeedbackService', function( API )\n {\n\n return {\n getFeedbacks : getFeedbacks,\n addFeedback : addFeedback,\n ArticleTypes : articleTypes(),\n FeedbackTypes: feedbackTypes()\n };\n\n /*\n FeedbackService\n .getFeedbacks().between('2014-12-03', '2015-07-01')\n .for( FeedbackService.ArticleTypes.ITEM, 2732, FeedbackService.FeedbackTypes.COMMENTS_ONLY );\n */\n function getFeedbacks()\n {\n var feedbackInterval = {\n dateStart: null,\n dateEnd : null\n };\n\n return {\n between: setFeedbackInterval,\n for : listFeedbacks\n };\n\n function setFeedbackInterval( start, end )\n {\n feedbackInterval.dateStart = start;\n feedbackInterval.dateEnd = end;\n return this;\n }\n\n function listFeedbacks( articleType, referenceId, feedbackType )\n {\n\n var params = {\n ReferenceId : referenceId,\n FromDate : feedbackInterval.dateStart,\n ToDate : feedbackInterval.dateEnd,\n FeedbackType: feedbackType || feedbackTypes().COMMENTS_AND_RATINGS\n };\n return API.get( '/rest/feedback/' + articleType + '/', params );\n\n }\n }\n\n /*\n FeedbackService\n .addFeedback()\n .withRating( 5 )\n .withComment( 'Hallo' )\n .withAuthor( 'Felix', 'felix.dausch@plentymarkets.com', 123456 )\n .to( FeedbackService.ArticleTypes.ITEM, 2732 );\n */\n function addFeedback()\n {\n\n var params = {\n Rating : 1.0,\n Text : '',\n Author : '',\n Email : '',\n CustomerId: 0\n };\n\n return {\n withRating : withRating,\n withComment: withComment,\n withAuthor : withAuthor,\n to : sendFeedback\n };\n\n function withRating( rating )\n {\n params.Rating = rating;\n return this;\n }\n\n function withComment( comment )\n {\n params.Text = comment;\n return this;\n }\n\n function withAuthor( author, mail, customerID )\n {\n params.Author = author;\n if ( !!mail )\n {\n params.Email = mail;\n }\n if ( !!customerID )\n {\n params.CustomerId = customerID;\n }\n return this;\n }\n\n function sendFeedback( articleType, referenceId )\n {\n return API.post( '/rest/feedback/' + articleType + '/', params );\n\n }\n\n }\n\n function feedbackTypes()\n {\n return {\n COMMENTS_ONLY : 'comments_only',\n RATINGS_ONLY : 'ratings_only',\n COMMENTS_AND_RATINGS: 'comments_with_ratings'\n }\n }\n\n function articleTypes()\n {\n return {\n ITEM : 'item',\n CATEGORY: 'category',\n BLOG : 'blog'\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Listens to window's size and trigger 'sizeChange' event if the Bootstrap interval changes.\n * @class MediaSizeService\n * @static\n * @example\n * $(window).on('sizeChange', function(newValue, oldValue) {\n * console.log('The interval changed from ' + oldValue + ' to ' + newValue.');\n * });\n */\n pm.service( 'MediaSizeService', function()\n {\n\n var bsInterval;\n\n // recalculation of the current interval on window resize\n $( window ).resize( calculateMediaSize );\n\n // initially calculation of the interval\n $( document ).ready( calculateMediaSize );\n\n return {\n interval : getInterval,\n isInterval: isInterval\n };\n\n /**\n * Get the currently used Bootstrap interval\n * @function getInterval\n * @return {\"xs\"|\"sm\"|\"md\"|\"lg\"}\n */\n function getInterval()\n {\n if ( !!bsInterval )\n {\n calculateMediaSize();\n }\n\n return bsInterval;\n }\n\n /**\n * Calculate the currently used Bootstrap interval\n * @function calculateMediaSize\n * @private\n */\n function calculateMediaSize()\n {\n var size;\n if ( !!window.matchMedia )\n { // FIX IE support\n if ( window.matchMedia( '(min-width:1200px)' ).matches )\n {\n size = 'lg';\n }\n else if ( window.matchMedia( '(min-width:992px)' ).matches )\n {\n size = 'md';\n }\n else if ( window.matchMedia( '(min-width:768px)' ).matches )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n else\n {\n if ( $( window ).width() >= 1200 )\n {\n size = 'lg';\n }\n else if ( $( window ).width() >= 992 )\n {\n size = 'md';\n }\n else if ( $( window ).width() >= 768 )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n if ( size != bsInterval || size === 'xs' )\n {\n var oldValue = bsInterval;\n bsInterval = size;\n $( window ).trigger( 'sizeChange', [bsInterval, oldValue] );\n }\n }\n\n function isInterval( interval )\n {\n var intervalList = interval.replace( /\\s/g, '' ).split( ',' );\n for ( var i = 0; i < intervalList.length; i++ )\n {\n if ( intervalList[i] == bsInterval )\n {\n return true;\n }\n }\n return false;\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Handling navigation while checkout processes\n * @class NavigatorService\n * @static\n *\n */\n pm.service( 'NavigatorService', function( CMS, Checkout )\n {\n var navigation = [];\t\t// contains navigation list elements\n var container = [];\t\t// content containers\n var current = -1;\t\t// index of currently shown content container\n var buttonPrev = {};\t\t// navigation buttons\n var buttonNext = {};\n var interceptors = {\n beforeChange: [],\n afterChange : []\n };\n var checkoutStates = [];\n\n return {\n init : init,\n getCurrentContainer: getCurrentContainer,\n goTo : goTo,\n beforeChange : beforeChange,\n afterChange : afterChange,\n continueChange : continueChange,\n next : next,\n previous : previous,\n goToID : goToID,\n fillNavigation : fillNavigation\n };\n\n /**\n * Initialize checkout navigation. Shows first container.\n * @function init\n * @example\n * ```html\n * \n *
      \n *
    • Checkout Step 1
    • \n *
    • Checkout Step 2
    • \n *
    • ...
    • \n *
    \n * \n *\n *
    \n *
    \n * Checkout Step 1 Content\n *
    \n *
    \n * Checkout Step 2 Content\n *
    \n *
    ...
    \n *
    \n * ```\n */\n function init()\n {\n\n // get elements from DOM\n navigation = $( '[data-plenty-checkout=\"navigation\"] > li' );\n container = $( '[data-plenty-checkout=\"container\"] > div' );\n buttonNext = $( '[data-plenty-checkout=\"next\"]' );\n buttonPrev = $( '[data-plenty-checkout=\"prev\"]' );\n\n if ( navigation.length == container.length && container.length > 0 )\n {\n var checkout = Checkout.getCheckout();\n\n container.hide();\n\n // initialize navigation\n navigation.each( function( i, elem )\n {\n $( elem ).addClass( 'disabled' );\n // handle navigation click events\n $( elem ).click( function()\n {\n if ( !$( this ).is( '.disabled' ) )\n {\n goTo( i );\n }\n } );\n } );\n\n buttonNext.attr( \"disabled\", \"disabled\" );\n buttonNext.click( function()\n {\n next();\n } );\n\n buttonPrev.attr( \"disabled\", \"disabled\" );\n buttonPrev.click( function()\n {\n previous();\n } );\n\n window.addEventListener( 'hashchange', function()\n {\n if ( window.location.hash.length > 0 )\n {\n goToID( window.location.hash );\n }\n else\n {\n goTo( 0 );\n }\n }, false );\n\n // initialize GUI\n // check url param for jumping to tab\n $.urlParam = function( name )\n {\n var results = new RegExp( '[\\?&]' + name + '=([^&#]*)' ).exec( window.location.href );\n if ( results == null )\n {\n return null;\n }\n else\n {\n return results[1] || 0;\n }\n };\n\n var param = $.urlParam( 'gototab' );\n // jump to hash from url param 'gototab'\n if ( window.location.hash.length == 0 && !!param && $( '[data-plenty-checkout-id=\"' + param + '\"]' ).length > 0 )\n {\n window.location.hash = param;\n }\n // jump to hash\n else if ( !goToID( window.location.hash ) && current >= 0 )\n {\n goTo( current );\n }\n else\n {\n goTo( 0 );\n }\n\n fillNavigation();\n $( window ).on( 'sizeChange', fillNavigation );\n $( window ).resize( function()\n {\n if ( pm.getInstance().MediaSizeService.interval() == 'xs' )\n {\n fillNavigation();\n }\n } );\n\n }\n }\n\n /**\n * Get the currently active checkout container.\n * @function getCurrentContainer\n * @return {{id: string, index: number}}\n */\n function getCurrentContainer()\n {\n if ( current >= 0 )\n {\n return {\n id : $( container[current] ).attr( 'data-plenty-checkout-id' ),\n index: current\n };\n }\n else\n {\n return null;\n }\n }\n\n /**\n * Register an interceptor called before each tab change.\n * Tabchange will break if any interceptor returns false.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n * @example\n * plenty.NavigatorService.beforeChange( function(targetContainer) {\n * if( targetContainer.id === 'details' ) {\n * // stop tabchange if user tries to access checkout container with id \"details\"\n * return false;\n * }\n * return true;\n * });\n */\n function beforeChange( interceptor )\n {\n interceptors.beforeChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Register an interceptor called after each tab change.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n */\n function afterChange( interceptor )\n {\n interceptors.afterChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Call registered interceptors. Break if any interceptor returns false.\n * Do not call beforeChange-interceptors on initially tabchange\n * @function resolveInterceptors\n * @private\n * @param {\"beforeChange\"|\"afterChange\"} identifier Describe which interceptors should be called\n * @param {number} index the index of the target container\n * @returns {boolean} Conjunction of all interceptor return values\n */\n function resolveInterceptors( identifier, index )\n {\n var continueTabChange = true;\n\n if ( current >= 0 || identifier === 'afterChange' )\n {\n\n var currentContainer = getCurrentContainer();\n var targetContainer = {\n index: index,\n id : $( container[index] ).attr( 'data-plenty-checkout-id' )\n };\n\n $.each( interceptors[identifier], function( i, interceptor )\n {\n if ( interceptor( currentContainer, targetContainer ) === false )\n {\n continueTabChange = false;\n return false;\n }\n } );\n }\n\n return continueTabChange;\n }\n\n /**\n * Show checkout tab given by index\n * @function goTo\n * @param {number} index Index of target tab, starting at 0\n * @param {boolean} [ignoreInterceptors=false] Set true to not call registered interceptors and force changing\n * tab\n */\n function goTo( index, ignoreInterceptors )\n {\n\n var contentChanged = current !== index;\n\n if ( contentChanged && !ignoreInterceptors )\n {\n if ( !resolveInterceptors( \"beforeChange\", index ) )\n {\n return;\n }\n }\n\n current = index;\n\n if ( !Object.equals( checkoutStates[current], Checkout.getCheckout( true ) ) && contentChanged && !!$( container[current] ).attr( 'data-plenty-checkout-content' ) )\n {\n checkoutStates[current] = Checkout.getCheckout( true );\n // reload tab content\n CMS.getCategoryContent( $( container[current] ).attr( 'data-plenty-checkout-content' ) )\n .done( function( response )\n {\n $( container[current] ).html( response.data[0] );\n // continue tab change\n proceedTabChange( contentChanged );\n pm.getInstance().bindDirectives( container[current] );\n $( window ).trigger( 'contentChanged' );\n } );\n }\n else\n {\n // continue tab change without reloading tab content\n proceedTabChange( contentChanged );\n //pm.getInstance().bindDirectives();\n }\n\n }\n\n function proceedTabChange( contentChanged )\n {\n\n // hide content containers\n $( container ).hide();\n\n // refresh navigation elements\n var $elem;\n $( navigation ).each( function( i, elem )\n {\n $elem = $( elem );\n $elem.removeClass( 'disabled active' );\n\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'false' );\n\n if ( i < current )\n {\n // set current element as active\n $elem.addClass( 'visited' );\n }\n else\n {\n if ( i == current )\n {\n $elem.addClass( 'active visited' );\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'true' );\n }\n else\n {\n if ( i > current && !$elem.is( '.visited' ) )\n {\n // disable elements behind active\n $elem.addClass( 'disabled' );\n }\n }\n }\n } );\n fillNavigation();\n\n // hide \"previous\"-button if first content container is shown\n if ( current <= 0 )\n {\n buttonPrev.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonPrev.removeAttr( \"disabled\" );\n }\n\n // hide \"next\"-button if last content container is shown\n if ( current + 1 == navigation.length )\n {\n buttonNext.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonNext.removeAttr( \"disabled\" );\n }\n\n // show current content container\n $( container[current] ).show();\n\n // set location hash\n if ( current > 0 )\n {\n window.location.hash = $( container[current] ).attr( 'data-plenty-checkout-id' );\n }\n else\n {\n if ( window.location.hash.length > 0 )\n {\n window.location.hash = '';\n }\n }\n\n if ( contentChanged )\n {\n resolveInterceptors( \"afterChange\", current );\n }\n }\n\n /**\n * Continue interrupted tabchange. Shorthand for: goTo(targetContainer.index, true)\n * @function continueChange\n * @param targetContainer The tab-object received from an interceptor\n */\n function continueChange( targetContainer )\n {\n goTo( targetContainer.index, true );\n }\n\n /**\n * Show next checkout tab if available. Shorthand for\n * \n * if (current < navigation.length - 1) {\n * goTo(current + 1);\n * }\n * \n * @function next\n */\n function next()\n {\n if ( current < navigation.length - 1 )\n {\n goTo( current + 1 );\n }\n }\n\n /**\n * Show previous checkout tab if available\n * @function next\n */\n function previous()\n {\n if ( current > 0 )\n {\n goTo( current - 1 );\n }\n }\n\n /**\n * Show checkout tab given by ID\n * @function goToID\n * @param {string} containerID ID of tab to show. Target tab must be marked with\n * data-plenty-checkout-id=\"#...\"\n */\n function goToID( containerID )\n {\n if ( containerID == 'next' )\n {\n next();\n return true;\n }\n else if ( containerID == 'prev' )\n {\n previous();\n return true;\n }\n else\n {\n containerID = containerID.replace( '#', '' );\n $( container ).each( function( i, elem )\n {\n if ( $( elem ).attr( 'data-plenty-checkout-id' ) == containerID )\n {\n goTo( i );\n return true;\n }\n } );\n }\n\n return false;\n }\n\n /**\n * Calculate navigation's width to match its parent element\n * by increasing its items padding.\n * @function fillNavigation\n */\n function fillNavigation()\n {\n // break if manager has not been initialized\n var navigationCount = navigation.length;\n if ( navigationCount <= 0 )\n {\n return;\n }\n\n // reset inline styles\n $( navigation ).removeAttr( 'style' );\n $( navigation ).children( 'span' ).removeAttr( 'style' );\n $( buttonNext ).removeAttr( 'style' );\n $( buttonPrev ).removeAttr( 'style' );\n\n var buttonWidth = ($( buttonPrev ).outerWidth() < $( buttonNext ).outerWidth()) ? $( buttonNext ).outerWidth( true ) + 1 : $( buttonPrev ).outerWidth( true ) + 1;\n $( buttonNext ).css( {width: buttonWidth + 'px'} );\n $( buttonPrev ).css( {width: buttonWidth + 'px'} );\n\n // calculate width to fill\n var width = $( navigation ).parent().parent().outerWidth( true ) - ( 2 * buttonWidth);\n width -= parseInt( $( navigation ).parent().css( 'marginLeft' ) ) + parseInt( $( navigation ).parent().css( 'marginRight' ) );\n\n var padding = width;\n var tabWidth = [];\n\n $( navigation ).each( function( i, elem )\n {\n padding -= parseInt( $( elem ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).css( 'marginRight' ) );\n\n tabWidth[i] = $( elem ).children( 'span' ).width();\n padding -= tabWidth[i];\n\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginRight' ) );\n } );\n\n var paddingEachItem = parseInt( padding / navigationCount );\n\n var paddingLeft, paddingRight;\n if ( paddingEachItem % 2 == 1 )\n {\n paddingLeft = ( paddingEachItem / 2 ) + 0.5;\n paddingRight = ( paddingEachItem / 2 ) - 0.5;\n }\n else\n {\n paddingLeft = paddingEachItem / 2;\n paddingRight = paddingEachItem / 2;\n }\n\n var paddingLastItem = parseInt( padding - ( ( navigationCount - 1 ) * ( paddingLeft + paddingRight ) ) );\n var paddingLastLeft, paddingLastRight;\n if ( paddingLastItem % 2 == 1 )\n {\n paddingLastLeft = ( paddingLastItem / 2 ) + 0.5;\n paddingLastRight = ( paddingLastItem / 2) - 0.5;\n }\n else\n {\n paddingLastLeft = paddingLastItem / 2;\n paddingLastRight = paddingLastItem / 2;\n }\n\n var diff = width;\n $( navigation ).each( function( i, elem )\n {\n if ( i < navigationCount - 1 )\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLeft + 'px', 'paddingRight': paddingRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLeft + paddingRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n else\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLastLeft + 'px', 'paddingRight': paddingLastRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLastLeft + paddingLastRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n } );\n\n //$(navigation).parent().css('marginRight', 0);\n }\n\n }, ['CMSFactory', 'CheckoutFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Magnus Martin \n * =====================================================================================\n */\n\n\n(function( $, pm )\n{\n pm.service( 'PostfinderService', function( API, Modal, UIFactory )\n {\n var packstationID = '';\n var shippingFields = {};\n var numberOfResults = {};\n var result = {};\n\n return {\n openPostfinderModal: openPostfinderModal,\n isPackstation : isPackstation\n };\n\n function isPackstation()\n {\n var street = $( 'input[name=\"Street\"]' ).val();\n return ( street.toUpperCase() == \"PACKSTATION\" || street.toUpperCase() == \"POSTFILIALE\" );\n }\n\n function openPostfinderModal()\n {\n shippingFields = {\n PostfinderItemStreet : $( 'input[name=\"Street\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemZIP : $( 'input[name=\"ZIP\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemCity : $( 'input[name=\"City\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemHouseNo: $( 'input[name=\"HouseNo\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' )\n\n };\n\n shippingFields.PostfinderItemStreet.val( '' );\n\n if ( (shippingFields.PostfinderItemZIP.val().length > 2 || shippingFields.PostfinderItemCity.val().length > 2) )\n {\n\n API.get( '/rest/checkout/shippingaddresspostfinderlist/',\n {\n suggestionType: \"postfinder\",\n zip : shippingFields.PostfinderItemZIP.val(),\n city : shippingFields.PostfinderItemCity.val()\n } )\n\n .done( function( response )\n {\n result = response.data;\n numberOfResults = result.length;\n\n if ( numberOfResults == 0 )\n {\n showErrorMessage();\n }\n\n var params = {\n addresses: []\n };\n\n for ( var i = 0; i < numberOfResults; i++ )\n {\n var dimension = 'km';\n var distInMeters = result[i].PostfinderItemDistance;\n var distInKilometers = distInMeters / 1000;\n distInKilometers = ((Math.round( distInKilometers * 100 ) / 100).toFixed( 2 )).replace( '.', ',' );\n\n if ( distInMeters < 1000 )\n {\n distInKilometers = distInMeters;\n dimension = 'm';\n }\n\n params.addresses.push( {\n index : i,\n dimension: dimension,\n type : result[i].PostfinderItemIsPackstation ? 'Packstation' : 'Postfiliale',\n number : result[i].PostfinderItemIsPackstation ? result[i].PostfinderItemPackstationNo : result[i].PostfinderItemPostfilialNo,\n street : result[i].PostfinderItemStreet,\n houseNo : result[i].PostfinderItemHouseNo,\n zip : result[i].PostfinderItemZIP,\n city : result[i].PostfinderItemCity,\n district : result[i].PostfinderItemDistrict,\n distance : distInKilometers,\n remark : result[i].PostfinderItemRemark\n } );\n }\n\n var html = pm.compileTemplate( 'addressSuggestions/postFinder.html', params );\n\n Modal.prepare()\n .setTitle( pm.translate( 'Packstations and post offices in your area' ) )\n .setContent( html )\n .setClass( 'checkout' )\n .onConfirm( function()\n {\n shippingFields.PostfinderItemCity.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemStreet.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemStreet.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemHouseNo.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemHouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n packstationID = $( 'input[type=\"radio\"][name=\"postfinder\"]:checked' ).val();\n\n if ( result[packstationID].PostfinderItemIsPackstation )\n {\n $( shippingFields.PostfinderItemStreet ).val( 'PACKSTATION' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPackstationNo );\n }\n else\n {\n $( shippingFields.PostfinderItemStreet ).val( 'POSTFILIALE' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPostfilialNo );\n }\n $( shippingFields.PostfinderItemStreet ).trigger( 'change' );\n\n $( shippingFields.PostfinderItemCity ).val( result[packstationID].PostfinderItemCity );\n $( shippingFields.PostfinderItemZIP ).val( result[packstationID].PostfinderItemZIP );\n return true;\n } )\n .show()\n } );\n }\n else\n {\n showErrorMessage();\n }\n\n }\n\n function showErrorMessage()\n {\n UIFactory.throwError( 0, pm.translate( 'Please enter a ZIP code and/or a city.' ) );\n\n shippingFields.PostfinderItemCity.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemCity.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n\n shippingFields.PostfinderItemZIP.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n }\n }, ['APIFactory', 'ModalFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide templates for social share providers to inject them dynamically.\n * @class SocialShareService\n * @static\n */\n pm.service( 'SocialShareService', function()\n {\n\n //TODO: move to global variables\n if ( typeof(socialLangLocale) == 'undefined' )\n {\n socialLangLocale = 'en_US';\n }\n if ( typeof(socialLang) == 'undefined' )\n {\n socialLang = 'en';\n }\n\n return {\n getSocialService: getService\n };\n\n /**\n * Get the template for social media provider\n * @function getService\n * @param {string} identifier name of the social media provider to get the template for\n * @returns {string} the template to inject in DOM\n */\n function getService( identifier )\n {\n var services = {\n 'facebook-like': '',\n\n 'facebook-recommend': '',\n\n 'twitter': '',\n\n 'google-plus': '
    '\n + '',\n };\n\n return services[identifier];\n }\n\n /**\n * get the canonical URL if defined\n * @function getURL\n * @private\n * @return {string} The Canonical URL if defined or the current URI\n */\n function getURI()\n {\n var uri = document.location.href;\n var canonical = $( \"link[rel=canonical]\" ).attr( \"href\" );\n\n if ( canonical && canonical.length > 0 )\n {\n if ( canonical.indexOf( \"http\" ) < 0 )\n {\n canonical = document.location.protocol + \"//\" + document.location.host + canonical;\n }\n uri = canonical;\n }\n\n return uri;\n }\n\n /**\n * returns content of <meta name=\"\" content=\"\"> tags or '' if empty/non existant\n * @function getMeta\n * @private\n * @param {string} name The meta name to get the value of;\n */\n function getMeta( name )\n {\n var metaContent = $( 'meta[name=\"' + name + '\"]' ).attr( 'content' );\n return metaContent || '';\n }\n\n /**\n * create tweet text from content of <meta name=\"DC.title\"> and <meta name=\"DC.creator\">\n * fallback to content of <title> tag\n * @function getTweetText\n * @private\n */\n function getTweetText()\n {\n var title = getMeta( 'DC.title' );\n var creator = getMeta( 'DC.creator' );\n\n if ( title.length > 0 && creator.length > 0 )\n {\n title += ' - ' + creator;\n }\n else\n {\n title = $( 'title' ).text();\n }\n\n return encodeURIComponent( title );\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide methods for client-side form validation.\n * @class ValidationService\n * @static\n */\n pm.service( 'ValidationService', function()\n {\n\n return {\n validate: validate\n };\n\n /**\n * Check if element is a form element (input, select, textarea) or search for child form elements\n * @function getFormControl\n * @private\n * @param {object} element the element to get the form element from\n * @return {object} a valid form element (input, select, textarea)\n */\n function getFormControl( element )\n {\n element = $( element );\n if ( element.is( 'input' ) || element.is( 'select' ) || element.is( 'textarea' ) )\n {\n return element;\n }\n else\n {\n if ( element.find( 'input' ).length > 0 )\n {\n return element.find( 'input' );\n }\n\n else if ( element.find( 'select' ).length > 0 )\n {\n return element.find( 'select' );\n }\n\n else if ( element.find( 'textarea' ).length > 0 )\n {\n return element.find( 'textarea' );\n }\n\n else\n {\n return null;\n }\n }\n\n }\n\n /**\n * Check given element has any value\n * @function validateText\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateText( formControl )\n {\n // check if formControl is no checkbox or radio\n if ( formControl.is( 'input' ) || formControl.is( 'select' ) || formControl.is( 'textarea' ) )\n {\n // check if length of trimmed value is greater then zero\n return $.trim( formControl.val() ).length > 0;\n\n }\n else\n {\n console.error( 'Validation Error: Cannot validate Text for <' + formControl.prop( \"tagName\" ) + '>' );\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid email-address\n * @function validateMail\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateMail( formControl )\n {\n var mailRegExp = /[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n if ( validateText( formControl ) )\n {\n return mailRegExp.test( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid number\n * @function validateNumber\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateNumber( formControl )\n {\n if ( validateText( formControl ) )\n {\n return $.isNumeric( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is equal to a references value\n * @function validateValue\n * @private\n * @param {object} formControl the form element to validate\n * @param {string} reference the required value\n * @return {boolean}\n */\n function validateValue( formControl, reference )\n {\n if ( $( reference ).length > 0 )\n {\n return $.trim( formControl.val() ) == $.trim( $( reference ).val() );\n }\n else\n {\n return $.trim( formControl.val() ) == reference;\n }\n }\n\n function visibility( formControl )\n {\n return formControl.is( ':visible' );\n }\n\n function isEnabled( formControl )\n {\n return formControl.is( ':enabled' );\n }\n\n /**\n * Validate a form. Triggers event 'validationFailed' if any element has an invalid value\n * @function validate\n * @param {object} form The form element to validate\n * @returns {boolean}\n * @example\n * ```html\n * \n *
    \n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n *
    \n * \n * \n *
    \n *\n *
    \n * ```\n *\n * @example\n * $(form).on('validationFailed', function(missingFields) {\n * // handle missing fields\n * });\n */\n function validate( form, errorClass )\n {\n var formControl, formControls, validationKey, currentHasError, group, checked, checkedMin, checkedMax, attrValidate, validationKeys, formControlAttrType;\n var $form = $( form );\n errorClass = errorClass || 'has-error';\n var missingFields = [];\n var hasError = false;\n\n // check every required input inside form\n $form.find( '[data-plenty-validate], :required' ).each( function( i, elem )\n {\n attrValidate = $( elem ).attr( 'data-plenty-validate' );\n formControls = getFormControl( elem )\n // validate text inputs\n validationKeys = !!attrValidate ? attrValidate : 'text';\n validationKeys = validationKeys.split( ',' );\n\n for ( var i = 0, length = formControls.length; i < length; i++ )\n {\n formControl = $( formControls[i] );\n formControlAttrType = formControl.attr( 'type' );\n\n if ( !visibility( formControl ) || !isEnabled( formControl ) )\n {\n return;\n }\n\n validationKey = validationKeys[i].trim() || validationKeys[0].trim();\n currentHasError = false;\n\n // formControl is textfield (text, mail, password) or textarea\n if ( (formControl.is( 'input' )\n && formControlAttrType != 'radio'\n && formControlAttrType != 'checkbox')\n || formControl.is( 'textarea' ) )\n {\n switch ( validationKey )\n {\n\n case 'text':\n currentHasError = !validateText( formControl );\n break;\n\n case 'mail':\n currentHasError = !validateMail( formControl );\n break;\n\n case 'number':\n currentHasError = !validateNumber( formControl );\n break;\n\n case 'value':\n currentHasError = !validateValue( formControl, $( elem ).attr( 'data-plenty-validation-value' ) );\n break;\n\n case 'none':\n // do not validate\n break;\n\n default:\n console.error( 'Form validation error: unknown validate property: \"' + attrValidate + '\"' );\n break;\n }\n }\n else if ( formControl.is( 'input' )\n && (formControlAttrType == 'radio'\n || formControlAttrType == 'checkbox') )\n {\n // validate radio buttons\n group = formControl.attr( 'name' );\n checked = $form.find( 'input[name=\"' + group + '\"]:checked' ).length;\n\n if ( formControlAttrType == 'radio' )\n {\n checkedMin = 1;\n checkedMax = 1;\n }\n else\n {\n var minMax = (new Function(\"return \" + attrValidate))() || {min: 1, max: 1};\n checkedMin = minMax.min;\n checkedMax = minMax.max;\n }\n\n currentHasError = ( checked < checkedMin || checked > checkedMax );\n\n }\n else if ( formControl.is( 'select' ) )\n {\n // validate selects\n currentHasError = ( formControl.val() == '' || formControl.val() == '-1' );\n }\n else\n {\n console.error( 'Form validation error: ' + $( elem ).prop( \"tagName\" ) + ' does not contain an form element' );\n return;\n }\n\n if ( currentHasError )\n {\n hasError = true;\n missingFields.push( formControl );\n\n if ( formControls.length > 1 )\n {\n formControl.addClass( errorClass );\n $form.find( 'label[for=\"' + formControl.attr( 'id' ) + '\"]' ).addClass( errorClass );\n }\n else\n {\n $( elem ).addClass( errorClass );\n }\n }\n }\n\n } );\n\n // scroll to element on 'validationFailed'\n $form.on( 'validationFailed', function()\n {\n var distanceTop = 50;\n var $error = $form.find( '.' + errorClass ).first();\n var errorOffset = $error.offset().top;\n var $scrollTarget = $( 'html, body' );\n\n // if form is inside of modal, scroll modal instead of body\n if ( $form.parents( '.modal' ).length > 0 )\n {\n $scrollTarget = $form.parents( '.modal' ).find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n\n }\n else if ( $form.is( '.modal' ) )\n {\n $scrollTarget = $form.find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n }\n\n // only scroll if error is outside of viewport\n if ( errorOffset - distanceTop < window.pageYOffset || errorOffset > (window.pageYOffset + window.innerHeight) )\n {\n $scrollTarget.animate( {\n scrollTop: errorOffset - distanceTop\n } );\n }\n } );\n\n if ( hasError )\n {\n // remove error class on focus\n $form.find( '.' + errorClass ).each( function( i, elem )\n {\n formControl = $( getFormControl( elem ) );\n formControl.on( 'focus click', function()\n {\n var $errorElement = $( elem );\n $errorElement.removeClass( errorClass );\n $form.find( 'label[for=\"' + $( this ).attr( 'id' ) + '\"]' ).removeClass( errorClass );\n } );\n } );\n\n $form.trigger( 'validationFailed', [missingFields] );\n }\n\n var callback = $form.attr( 'data-plenty-callback' );\n\n if ( !hasError && !!callback && callback != \"submit\" && typeof window[callback] == \"function\" )\n {\n\n var fields = {};\n $form.find( 'input, textarea, select' ).each( function()\n {\n if ( $( this ).attr( 'type' ) == 'checkbox' )\n {\n fields[$( this ).attr( 'name' )] = $( this ).is( ':checked' );\n }\n else\n {\n fields[$( this ).attr( 'name' )] = $( this ).val();\n }\n } );\n\n window[callback]( fields );\n return false;\n }\n else\n {\n return !hasError;\n }\n }\n } );\n\n /**\n * jQuery-Plugin to calling {{#crossLink \"ValidationService/validate\"}}ValidationService.validate{{/crossLink}}\n * on jQuery wrapped elements.\n * @return {boolean}\n */\n $.fn.validateForm = function()\n {\n return pm.getInstance().ValidationService.validate( this );\n };\n\n /**\n * jQuery-Plugin to get the values of contained form elements.\n * @return {object}\n */\n $.fn.getFormValues = function()\n {\n\n var form = this;\n var values = {};\n\n function inject( position, value )\n {\n var match = position.match( /^([^\\[]+)(.*)/ );\n\n if ( !!match[2] )\n {\n var exp = /\\[([^\\]]+)]/g;\n var child;\n var children = [];\n children[0] = match[1];\n while ( (child = exp.exec( match[2] )) !== null )\n {\n children.push( child[1] );\n }\n\n for ( var i = children.length - 1; i >= 0; i-- )\n {\n var val = {};\n val[children[i]] = value;\n value = val;\n }\n values = $.extend( true, values, value );\n }\n else\n {\n values[match[1]] = value;\n }\n }\n\n form.find( 'input, select, textarea' ).each( function( i, elem )\n {\n if ( !!$( elem ).attr( 'name' ) )\n {\n if ( $( elem ).attr( 'type' ) == \"checkbox\" )\n {\n // get checkbox group\n var groupValues = [];\n $( form ).find( '[name=\"' + $( elem ).attr( 'name' ) + '\"]:checked' ).each( function( j, checkbox )\n {\n groupValues.push( $( checkbox ).val() );\n } );\n inject( $( elem ).attr( 'name' ), groupValues );\n }\n else if ( $( elem ).attr( 'type' ) == 'radio' )\n {\n if ( $( elem ).is( ':checked' ) )\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n else\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n\n } );\n return values;\n }\n}( jQuery, PlentyFramework ));\n/**\n * Services provide functions to be called from the instanced PlentyFramework.
    \n * Services can inject Factories and can be injected into Directives. The are also\n * available from the global instance of PlentyFramework\n * @module Services\n * @main Services\n * @example\n * PlentyFramework.service('ServiceName', serviceFunctions() {\n * return {\n * functionInService: function() {}\n * }\n * });\n * //...\n * plenty.ServiceName.functionInService/();\n */\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\nPlentyFramework.compile();\n\n// Create global instance of PlentyFramework for usage in Webshop-Layouts\nvar plenty = PlentyFramework.getInstance();\n\n/*\n * initially bind all registered directives\n *\n * will not be tested. reasons:\n * http://stackoverflow.com/questions/29153733/how-to-unit-test-a-document-ready-function-using-jasmine\n */\njQuery( document ).ready( function()\n{\n plenty.bindDirectives();\n} );" + ] +} \ No newline at end of file diff --git a/src/directives/UI.js b/src/directives/UI.js index 28953d2..0ae424a 100644 --- a/src/directives/UI.js +++ b/src/directives/UI.js @@ -8,7 +8,7 @@ */ (function( $, pm ) { - pm.directive( 'UI', function( MediaSizeService, SocialShareService ) + pm.directive( 'UI', function( MediaSizeService, SocialShareService, UIFactory ) { // elements to calculate height. var equalHeightElementList = []; @@ -16,6 +16,8 @@ return { initUIWindowEvents : initUIWindowEvents, + showWaitscreen : showWaitscreen, + hideWaitscreen : hideWaitscreen, addContentPageSlider: addContentPageSlider, equalHeight : equalHeight, initToTop : initToTop, @@ -55,6 +57,24 @@ } ); } + /** + * Display waitscreen on page e.g. for requests. + * Use with care and don't forget to hide waitscreen, if your calls are done or broke!! + */ + function showWaitscreen() + { + UIFactory.showWaitscreen(); + } + + /** + * Just hide the waitscreen. + * @param forceClose + */ + function hideWaitscreen( forceClose ) + { + UIFactory.hideWaitscreen( forceClose ); + } + /** * Adds content page slider (owlCarousel) * @@ -461,5 +481,5 @@ } } - }, ['MediaSizeService', 'SocialShareService'] ); + }, ['MediaSizeService', 'SocialShareService', 'UIFactory'] ); }( jQuery, PlentyFramework )); \ No newline at end of file diff --git a/src/services/CheckoutService.js b/src/services/CheckoutService.js index e18a4e9..994f1b4 100644 --- a/src/services/CheckoutService.js +++ b/src/services/CheckoutService.js @@ -116,10 +116,6 @@ var values = form.getFormValues(); var shippingAddressID = $( '[name="shippingAddressID"]:checked' ).val(); - // TODO: move bootstrap specific function - $( '#shippingAdressSelect' ).modal( 'hide' ); - //Modal.prepare( '#shippingAdressSelect' ).hide(); - if ( shippingAddressID < 0 ) { // save separate @@ -145,18 +141,8 @@ Checkout.getCheckout().CheckoutCustomerShippingAddressID = response.data.ID; Checkout.getCheckout().CheckoutShippingCountryID = response.data.CountryID; - delete Checkout.getCheckout().CheckoutMethodOfPaymentID; - delete Checkout.getCheckout().CheckoutShippingProfileID; - Checkout.setCheckout().done( function() - { - Checkout.reloadContainer( "MethodsOfPaymentList" ); - Checkout.reloadContainer( "ShippingProfilesList" ); - if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 ) - { - Checkout.reloadContainer( 'CustomerShippingAddress' ); - } - } ); + updatePaymentAndShippingDependencies(); } ); } else @@ -172,18 +158,8 @@ { // change shipping address id Checkout.getCheckout().CheckoutCustomerShippingAddressID = shippingAddressID; - delete Checkout.getCheckout().CheckoutMethodOfPaymentID; - delete Checkout.getCheckout().CheckoutShippingProfileID; - return Checkout.setCheckout().done( function() - { - Checkout.reloadContainer( "MethodsOfPaymentList" ); - Checkout.reloadContainer( "ShippingProfilesList" ); - if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 ) - { - Checkout.reloadContainer( 'CustomerShippingAddress' ); - } - } ); + updatePaymentAndShippingDependencies(); } else { @@ -192,6 +168,30 @@ } } + function updatePaymentAndShippingDependencies() + { + delete Checkout.getCheckout().CheckoutMethodOfPaymentID; + delete Checkout.getCheckout().CheckoutShippingProfileID; + + return Checkout.setCheckout().done( function() + { + Checkout.reloadContainer( "MethodsOfPaymentList" ); + Checkout.reloadContainer( "ShippingProfilesList" ); + + if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 ) + { + Checkout.reloadContainer( 'CustomerShippingAddress' ); + } + $( '#shippingAdressSelect' ).modal( 'hide' ); + + // don't hit me. Ugly hack: this is to force quit/remove everything from modal. + if ( $( ".modal-backdrop" ) ) + { + $( ".modal-backdrop" ).remove(); + } + } ); + } + /** * Prepare address-data to register a guest. Reads the address-data from a <form> marked with * data-plenty-checkout-form="guestRegistration" @@ -334,9 +334,10 @@ if ( response.error.error_stack[i].code == 651 ) { // notify atriga validation errors - Checkout.reloadContainer( 'MethodsOfPaymentList' ).done(function() { - $(document).trigger('plenty.AtrigaValidationFailed'); - }); + Checkout.reloadContainer( 'MethodsOfPaymentList' ).done( function() + { + $( document ).trigger( 'plenty.AtrigaValidationFailed' ); + } ); } else { @@ -345,9 +346,9 @@ } // display remaining errors - if( errorStack.length > 0 ) + if ( errorStack.length > 0 ) { - UI.printErrors(errorStack); + UI.printErrors( errorStack ); } } catch ( e ) @@ -381,10 +382,10 @@ } */ - if( !paymentID ) + if ( !paymentID ) { // FIX for older callisto layouts (< 3.3): get payment id from input field - paymentID = $('input[name="MethodOfPaymentID"]:checked').val(); + paymentID = $( 'input[name="MethodOfPaymentID"]:checked' ).val(); } Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID; diff --git a/src/services/ValidationService.js b/src/services/ValidationService.js index 10bf163..302c379 100644 --- a/src/services/ValidationService.js +++ b/src/services/ValidationService.js @@ -214,10 +214,10 @@ var hasError = false; // check every required input inside form - $form.find( '[data-plenty-validate], input.Required' ).each( function( i, elem ) + $form.find( '[data-plenty-validate], :required' ).each( function( i, elem ) { - attrValidate = $( elem ).attr( 'data-plenty-validate' ); - formControls = getFormControl( elem ) + attrValidate = $( elem ).attr( 'data-plenty-validate' ); + formControls = getFormControl( elem ); // validate text inputs validationKeys = !!attrValidate ? attrValidate : 'text'; validationKeys = validationKeys.split( ',' ); diff --git a/tools/scripts.json b/tools/scripts.json deleted file mode 100644 index 472f84a..0000000 --- a/tools/scripts.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "PageDesignGlobal": { - "head": [], - "body": [ - "plenty/plentymarketsCMStools-libs-1.0.8.min.js", - "plenty/plenty-2.js", - "plenty/plentymarketsCMStools-1.0.8.min.js" - ] - }, - "PageDesignContent": { - "head": [], - "body": [] - }, - "PageDesignCheckout": { - "head": [], - "body": [] - }, - "PageDesignMyAccount": { - "head": [], - "body": [] - } -} \ No newline at end of file From 0714b56f33323f94b6947824bdba9cf4aa199691 Mon Sep 17 00:00:00 2001 From: Maximilian Lauterbach Date: Tue, 10 May 2016 12:32:40 +0200 Subject: [PATCH 2/6] adaption for focused input fields in responsive menus. still not working. reformat code --- dist/plentymarketsCMStools-1.0.8.js | 37 +++++++++++++++------ dist/plentymarketsCMStools-1.0.8.min.js | 6 ++-- dist/plentymarketsCMStools-1.0.8.min.js.map | 6 ++-- src/directives/MobileDropdown.js | 32 +++++++++++++----- src/services/CheckoutService.js | 1 + tools/ScriptLoader.js | 4 +-- 6 files changed, 60 insertions(+), 26 deletions(-) diff --git a/dist/plentymarketsCMStools-1.0.8.js b/dist/plentymarketsCMStools-1.0.8.js index c758838..f537a82 100644 --- a/dist/plentymarketsCMStools-1.0.8.js +++ b/dist/plentymarketsCMStools-1.0.8.js @@ -988,12 +988,6 @@ TemplateCache["waitscreen/waitscreen.html"] = "
    * ===================================================================================== */ -var TemplateCache={};TemplateCache["addressSuggestions/addressDoctor.html"]='',TemplateCache["addressSuggestions/postFinder.html"]='{{#addresses}}\n
    \n
    \n \n
    \n
    \n{{/addresses}}\n',TemplateCache["error/errorMessage.html"]='
    \n Code {{code}}:\n {{{message}}}\n
    \n',TemplateCache["error/errorPopup.html"]='
    \n \n
    \n
    \n
    \n',TemplateCache["modal/modal.html"]='\n',TemplateCache["waitscreen/waitscreen.html"]='
    ',function(a,b){"object"==typeof exports&&exports&&"string"!=typeof exports.nodeName?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):(a.Mustache={},b(Mustache))}(this,function(a){function b(a){return"function"==typeof a}function c(a){return p(a)?"array":typeof a}function d(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function e(a,b){return null!=a&&"object"==typeof a&&b in a}function f(a,b){return q.call(a,b)}function g(a){return!f(r,a)}function h(a){return String(a).replace(/[&<>"'\/]/g,function(a){return s[a]})}function i(b,c){function e(){if(r&&!s)for(;q.length;)delete o[q.pop()];else q=[];r=!1,s=!1}function f(a){if("string"==typeof a&&(a=a.split(u,2)),!p(a)||2!==a.length)throw new Error("Invalid tags: "+a);h=new RegExp(d(a[0])+"\\s*"),i=new RegExp("\\s*"+d(a[1])),m=new RegExp("\\s*"+d("}"+a[1]))}if(!b)return[];var h,i,m,n=[],o=[],q=[],r=!1,s=!1;f(c||a.tags);for(var y,z,A,B,C,D,E=new l(b);!E.eos();){if(y=E.pos,A=E.scanUntil(h))for(var F=0,G=A.length;G>F;++F)B=A.charAt(F),g(B)?q.push(o.length):s=!0,o.push(["text",B,y,y+1]),y+=1,"\n"===B&&e();if(!E.scan(h))break;if(r=!0,z=E.scan(x)||"name",E.scan(t),"="===z?(A=E.scanUntil(v),E.scan(v),E.scanUntil(i)):"{"===z?(A=E.scanUntil(m),E.scan(w),E.scanUntil(i),z="&"):A=E.scanUntil(i),!E.scan(i))throw new Error("Unclosed tag at "+E.pos);if(C=[z,A,y,E.pos],o.push(C),"#"===z||"^"===z)n.push(C);else if("/"===z){if(D=n.pop(),!D)throw new Error('Unopened section "'+A+'" at '+y);if(D[1]!==A)throw new Error('Unclosed section "'+D[1]+'" at '+y)}else"name"===z||"{"===z||"&"===z?s=!0:"="===z&&f(A)}if(D=n.pop())throw new Error('Unclosed section "'+D[1]+'" at '+E.pos);return k(j(o))}function j(a){for(var b,c,d=[],e=0,f=a.length;f>e;++e)b=a[e],b&&("text"===b[0]&&c&&"text"===c[0]?(c[1]+=b[1],c[3]=b[3]):(d.push(b),c=b));return d}function k(a){for(var b,c,d=[],e=d,f=[],g=0,h=a.length;h>g;++g)switch(b=a[g],b[0]){case"#":case"^":e.push(b),f.push(b),e=b[4]=[];break;case"/":c=f.pop(),c[5]=b[2],e=f.length>0?f[f.length-1][4]:d;break;default:e.push(b)}return d}function l(a){this.string=a,this.tail=a,this.pos=0}function m(a,b){this.view=a,this.cache={".":this.view},this.parent=b}function n(){this.cache={}}var o=Object.prototype.toString,p=Array.isArray||function(a){return"[object Array]"===o.call(a)},q=RegExp.prototype.test,r=/\S/,s={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},t=/\s*/,u=/\s+/,v=/\s*=/,w=/\s*\}/,x=/#|\^|\/|>|\{|&|=|!/;l.prototype.eos=function(){return""===this.tail},l.prototype.scan=function(a){var b=this.tail.match(a);if(!b||0!==b.index)return"";var c=b[0];return this.tail=this.tail.substring(c.length),this.pos+=c.length,c},l.prototype.scanUntil=function(a){var b,c=this.tail.search(a);switch(c){case-1:b=this.tail,this.tail="";break;case 0:b="";break;default:b=this.tail.substring(0,c),this.tail=this.tail.substring(c)}return this.pos+=b.length,b},m.prototype.push=function(a){return new m(a,this)},m.prototype.lookup=function(a){var c,d=this.cache;if(d.hasOwnProperty(a))c=d[a];else{for(var f,g,h=this,i=!1;h;){if(a.indexOf(".")>0)for(c=h.view,f=a.split("."),g=0;null!=c&&gi;++i)g=void 0,e=a[i],f=e[0],"#"===f?g=this.renderSection(e,b,c,d):"^"===f?g=this.renderInverted(e,b,c,d):">"===f?g=this.renderPartial(e,b,c,d):"&"===f?g=this.unescapedValue(e,b):"name"===f?g=this.escapedValue(e,b):"text"===f&&(g=this.rawValue(e)),void 0!==g&&(h+=g);return h},n.prototype.renderSection=function(a,c,d,e){function f(a){return g.render(a,c,d)}var g=this,h="",i=c.lookup(a[1]);if(i){if(p(i))for(var j=0,k=i.length;k>j;++j)h+=this.renderTokens(a[4],c.push(i[j]),d,e);else if("object"==typeof i||"string"==typeof i||"number"==typeof i)h+=this.renderTokens(a[4],c.push(i),d,e);else if(b(i)){if("string"!=typeof e)throw new Error("Cannot use higher-order sections without the original template");i=i.call(c.view,e.slice(a[3],a[5]),f),null!=i&&(h+=i)}else h+=this.renderTokens(a[4],c,d,e);return h}},n.prototype.renderInverted=function(a,b,c,d){var e=b.lookup(a[1]);return!e||p(e)&&0===e.length?this.renderTokens(a[4],b,c,d):void 0},n.prototype.renderPartial=function(a,c,d){if(d){var e=b(d)?d(a[1]):d[a[1]];return null!=e?this.renderTokens(this.parse(e),c,d,e):void 0}},n.prototype.unescapedValue=function(a,b){var c=b.lookup(a[1]);return null!=c?c:void 0},n.prototype.escapedValue=function(b,c){var d=c.lookup(b[1]);return null!=d?a.escape(d):void 0},n.prototype.rawValue=function(a){return a[1]},a.name="mustache.js",a.version="2.1.3",a.tags=["{{","}}"];var y=new n;a.clearCache=function(){return y.clearCache()},a.parse=function(a,b){return y.parse(a,b)},a.render=function(a,b,d){if("string"!=typeof a)throw new TypeError('Invalid template! Template should be a "string" but "'+c(a)+'" was given as the first argument for mustache#render(template, view, partials)');return y.render(a,b,d)},a.to_html=function(c,d,e,f){var g=a.render(c,d,e);return b(f)?void f(g):g},a.escape=h,a.Scanner=l,a.Context=m,a.Writer=n}),function(a){function b(a,b,c,d){a.on(b,function(a){return i.push(a),c.apply(null,d)}),"complete"===document.readyState&&"ready"===b&&c.apply(null,d)}function c(b){var c=a(b);c.is('input[type="checkbox"]')&&c.on("change",function(){c.is(":checked")?c.trigger("check"):c.trigger("uncheck")}),c.is('input[type="radio"]')&&c.on("change",function(){var b=c.attr("name");a('input[type="radio"][name="'+b+'"]').each(function(b,c){var d=a(c);d.is(":checked")?d.trigger("check"):d.trigger("uncheck")})})}function d(a,b){for(var c=/^(([\w]+):)?([\w]+)\.([\w]+)(\((.*)\))?$/,d=a.split(";"),e=[],f=0;f0)for(var j=h[6].match(/(['][^']+['])|([\w-]+)|(["][^"]+["])/g),k=0;k=c&&g.services.hasOwnProperty(i)){PlentyFramework.prototype.hasOwnProperty(i)||e(g.services[i],2,d),f.push(PlentyFramework.prototype[i]);continue}if(1>=c&&g.directives.hasOwnProperty(i)){PlentyFramework.directives.hasOwnProperty(i)||e(g.directives[i],1,d),f.push(PlentyFramework.directives[i]);continue}console.error('Cannot inject dependency "'+i+'": Object not found.')}else console.error("Cyclic dependency injection: "+d.join(" -> ")+" -> "+i)}3==c?PlentyFramework.factories[b.name]=b.setup.apply(null,f):2==c?PlentyFramework.prototype[b.name]=b.setup.apply(null,f):1==c&&(PlentyFramework.directives[b.name]=b.setup.apply(null,f))}var f="1.0.8",g={factories:{},services:{},directives:{}};PlentyFramework=function(){};var h=null;PlentyFramework.getInstance=function(){return h=h||new PlentyFramework},PlentyFramework.version=function(){function a(a){for(var b=f.split("."),c=a.split("."),d=0;dparseInt(c[d]))return 1}return 0}return{get:function(){return f},equals:function(b){return 0==a(b)},compare:a}}(),PlentyFramework.partials={},PlentyFramework.globals={},PlentyFramework.setGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?(console.error('Global variable "'+a+'" already exists and cannot be overridden.'),null):(PlentyFramework.globals[a]=b,PlentyFramework.globals[a])},PlentyFramework.getGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?PlentyFramework.globals[a]:b},PlentyFramework.directives={},PlentyFramework.directive=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.directives[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.prototype.bindDirectives=function(e){e=e||"html",a(e).find("[data-plenty]").each(function(e,f){var g=d(a(f).attr("data-plenty"),a(f));if(!(g.length<=0)){c(f);for(var e=0;e=0;c--)if(a==i[c].type)return i[c];return null},PlentyFramework.pushEvent=function(a){i.push(a)},PlentyFramework.service=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.services[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.factories={},PlentyFramework.factory=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.factories[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.compileTemplate=function(a,b){return b=b||{},b.translate=function(){return function(a,b){return b(PlentyFramework.translate(a))}},Mustache.render(TemplateCache[a],b)},PlentyFramework.scriptPath="",PlentyFramework.Strings={},PlentyFramework.loadLanguageFile=function(b){a.ajax({url:PlentyFramework.scriptPath+b,dataType:"json"}).done(function(a){PlentyFramework.Strings=a})},PlentyFramework.translate=function(a,b){var c;return PlentyFramework.Strings.hasOwnProperty(a)?c=PlentyFramework.Strings[a]:(c=a,console.warn('No translation found for "'+c+'".')),b&&(c=Mustache.render(c,b)),c},PlentyFramework.compile=function(){for(var a in g.factories)PlentyFramework.factories.hasOwnProperty(a)||e(g.factories[a],3);for(var b in g.services)PlentyFramework.prototype.hasOwnProperty(b)||e(g.services[b],2);for(var c in g.directives)PlentyFramework.directives.hasOwnProperty(c)||e(g.directives[c],1);for(var d=document.getElementsByTagName("SCRIPT"),f=d.length-1;f>=0;f--){var h=d[f].src.match(/(.*)\/(.*)\.js(\?\S*)?$/);if(h){PlentyFramework.scriptPath=h[1];break}}}}(jQuery),function(a,b){b.directive("Authentication",function(c){function d(d){b.getRecentEvent().preventDefault(),c.customerLogin(a(d))}return{login:d}},["AuthenticationService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Basket",function(c){function d(d){b.getRecentEvent().preventDefault();var e={},f=a(d),g=f.parents("form");e.BasketItemItemID=g.find('[name="ArticleID"]').val(),e.BasketItemPriceID=g.find('[name="SYS_P_ID"]').val(),e.BasketItemQuantity=g.find('[name="ArticleQuantity"]').val(),e.BasketItemBranchID=g.find('[name="source_category"]').val();var h=g.find('[name^="ArticleAttribute"]'),i=[];a.each(h,function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&i.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=i.length&&(e.BasketItemAttributesList=i),c.addItem([e])}function e(b,c){var d=a(b),e=d.parent().find("input"),f=parseInt(e.attr("maxlength"))||5,g=parseInt(e.val())+c,h=d.parents("[data-basket-item-id]").length>0;if(h){(g+"").length<=f&&g>=0&&e.val(g);var i=d.data("timeout");i&&window.clearTimeout(i),i=window.setTimeout(function(){e.trigger("change")},1e3),d.data("timeout",i)}else(g+"").length<=f&&g>=1&&e.val(g)}function f(b,d){c.setItemQuantity(b,parseInt(a(d).val())).fail(function(){var e=c.getItem(b);a(d).val(e.BasketItemQuantity)})}return{addBasketItem:d,changeItemQuantity:e,setItemQuantity:f}},["BasketService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Checkout",function(a){function b(b){a.setMethodOfPayment(b)}function c(b){a.confirmAtrigaPaymax(b)}return{setMethodOfPayment:b,confirmAtrigaPaymax:c}},["CheckoutService"])}(jQuery,PlentyFramework),function(a,b){b.directive("MobileDropdown",function(c){function d(){a(window).on("orientationchange sizeChange",function(){e(j),e(k)}),a("html").on("click touchstart",function(a){e(k,a)})}function e(b,c){for(var d,e=0;e0?window.location.assign(a(c).attr("href")):window.location.assign(c))}function e(a){c.goToID(a)}return{to:d,toCheckoutTab:e}},["MediaSizeService","NavigatorService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Tab",function(c){function d(b){a(b).tab("show")}function e(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).addLabel(a)}function f(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).setContent(a)}function g(a,d,e){c.isInterval(e)&&(b.getRecentEvent().preventDefault(),j[d]&&j[d].getTab(a)&&j[d].showTab(a))}function h(){function b(a){return g[a]=new i(a),g[a]}function c(b){var c=0;if(f)c=parseInt(f.getContent().parent().css("zIndex")),f.hide(),f.getContent().parent().css("zIndex",c-1);else{for(var d in g)if(g[d].getContent()){var h=parseInt(g[d].getContent().parent().css("zIndex"));(0==c||c>h)&&(c=h),g[d].hide()}for(var d in g)g[d].getContent()&&g[d].getContent().parent().css("zIndex",c-1);a(window).on("sizeChange",e)}f=g[b],f.getContent().parent().css("zIndex",c),f.show()}function d(a){return g[a]}function e(){for(var a in g)g[a].getContent()&&g[a].show();f=null}var f,g={};return{addTab:b,showTab:c,getTab:d,resetTabs:e}}function i(a){function b(){return j}function c(a){return i.push(a),this}function d(a){return h=a,this}function e(){return h}function f(){for(var a=0;a0&&(a(document).scrollTop()>100?x(z,"addClass","visible"):x(z,"removeClass","visible"))})}function g(){e.showWaitscreen()}function h(a){e.hideWaitscreen(a)}function i(b){a(b).owlCarousel({navigation:!0,navigationText:!1,slideSpeed:1e3,paginationSpeed:1e3,singleItem:!0,autoPlay:6e3,stopOnHover:!0,afterMove:function(b){a(b).find('[data-plenty-rel="lazyload"]').trigger("appear")}})}function j(b,d,e){var f=a(b),g=0,h={},i=f.find('[data-plenty-rel="equal-target"]').length>0?f.find('[data-plenty-rel="equal-target"]'):f.children();e!==!0&&y.push(b);for(var j=i.length;j>=0;j--)h=a(i[j]),h.css("height",""),h.outerHeight(!0)>g&&(g=h.outerHeight(!0));(!d||c.isInterval(d))&&i.height(g)}function k(b){var c=a(b);c.click(function(){return a("html, body").animate({scrollTop:0},400),!1}),a.inArray(c,z)&&z.push(c)}function l(b,c){var d=a(b);d.lazyload({effect:c}),d.is("img")&&d.on("loaded",function(){d.css("display","inline-block")})}function m(b){console.log(b);var c=a(b),d=c.parent();d.addClass("animating"),c.siblings("ul").slideToggle(200,function(){d.is(".open")?d.removeClass("open"):d.addClass("open"),c.siblings("ul").removeAttr("style"),d.removeClass("animating")})}function n(b,c){var d=a(b),e=a(d.attr("data-plenty-rel"));if(d.is('input[type="radio"]')){var f=a('input[type="radio"][name="'+d.attr("name")+'"]'),g=!c||"checked"==c;f.change(function(){var b=a(this);e.parents('[data-plenty-rel="equal-target"]').css("height","auto"),b.is(":checked")&&b[0]===d[0]&&1==g?e.slideDown(400,function(){w()}):e.slideUp(400,function(){w()})})}else d.click(function(){d.addClass("animating"),e.slideToggle(400,function(){d.removeClass("animating"),d.toggleClass("active"),w()})})}function o(b,c){r(a(b),c,"slideDown")}function p(b,c){r(a(b),c,"slideUp")}function q(b,c){r(a(b),c,"slideToggle")}function r(a,b,c){b=b||400,a.parents('[data-plenty-rel="equal-target"]').css("height","auto"),a[c](b,function(){w()})}function s(b,c){var e=a(b),f=e.find('[data-plenty-rel="social-switch"]');e.append(''),f.is("off, on")||f.addClass("off"),f.on("click",function(){f.hasClass("off")&&("tooltip"==e.attr("data-toggle")&&e.tooltip("destroy"),f.removeClass("off").addClass("on"),e.find('[data-plenty-rel="social-placeholder"]').hide(),e.find(".social-container").append(d.getSocialService(c)))})}function t(d,e,f){var g=a(e);if(g.parents(".navbar-main").length>0){var h=g.children("span");return b.directives.MobileDropdown.slideDropdown(h),!0}if(e&&d&&(!f||c.isInterval(f))){var i=b.getRecentEvent();return i&&i.preventDefault(),g.toggleClass(d),!1}}function u(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).addClass(d),!1}}function v(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).removeClass(d),!1}}function w(){for(var a=y.length-1;a>=0;a--)j(y[a],"",!0)}function x(a,b,c){for(var d=a.length-1;d>=0;d--)a[d][b](c)}var y=[],z=[];return{initUIWindowEvents:f,showWaitscreen:g,hideWaitscreen:h,addContentPageSlider:i,equalHeight:j,initToTop:k,initLazyload:l,initSlideToggle:n,slideDown:o,slideUp:p,slideToggle:q,toggleHideShow:m,toggleSocialShare:s,toggleClass:t,addClass:u,removeClass:v}},["MediaSizeService","SocialShareService","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.directive("Validator",function(a){function b(b,c){return a.validate(b,c)}return{validate:b}},["ValidationService"])}(jQuery,PlentyFramework),function(a,b){b.factory("APIFactory",function(c,d){function e(){b.getGlobal("LoginSession")&&(l&&clearTimeout(l),l=setTimeout(function(){a(window).trigger("login-expired"),"Checkout"===b.getGlobal("PageDesign")&&d.prepare().setTitle(b.translate("Your session has expired.")).setContent(b.translate("Please log in again to continue shopping.")).setLabelDismiss(null).setLabelConfirm(b.translate("OK")).onConfirm(function(){window.location.assign("/")}).onDismiss(function(){window.location.assign("/")}).show()},b.getGlobal("LoginSessionExpiration")))}function f(b){try{var d=a.parseJSON(b.responseText);c.printErrors(d.error.error_stack)}catch(e){c.throwError(b.status,b.statusText)}}function g(b,d,g,h,i){return h||c.showWaitScreen(),a.ajax(b,{type:"GET",data:d,dataType:"json",async:!i,error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function h(b,d,g,h){var i={type:"POST",dataType:"json",error:function(a){g||f(a)}};return d&&d.isFile?(i.cache=d.cache,i.processData=d.processData,i.data=d.data,i.contentType=!1):(i.data=JSON.stringify(d),i.contentType="application/json"),h||c.showWaitScreen(),a.ajax(b,i).always(function(){h||c.hideWaitScreen(),e()})}function i(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"PUT",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function j(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"DELETE",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function k(){return a.Deferred().resolve()}var l=null;return a(document).ready(function(){e()}),{get:g,post:h,put:i,"delete":j,idle:k}},["UIFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a){a.factory("CMSFactory",function(a){function b(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/container_"+b.toLowerCase()+"/",c)}return{from:d}}function c(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/"+b.toLowerCase()+"/",c)}return{from:d}}function d(b){return a.get("/rest/categoryview/categorycontentbody/?categoryID="+b)}return{getContainer:b,getParams:c,getCategoryContent:d}},["APIFactory"])}(PlentyFramework),function(a){a.factory("CheckoutFactory",function(b,c,d){function e(){return l}function f(a){return m&&l||g(!0),a?$.extend(!0,{},l):m}function g(a){return b.get("/rest/checkout/",null,!1,!1,a).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function h(){return b.put("/rest/checkout",m).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function i(b){return c.getContainer("checkout"+b).from("checkout").done(function(c){$('[data-plenty-checkout-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function j(b){return c.getCategoryContent(b).done(function(c){$('[data-plenty-checkout-catcontent="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function k(b){return c.getContainer("itemview"+b).from("itemview").done(function(c){$('[data-plenty-itemview-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}var l,m;return{getCheckout:f,setCheckout:h,loadCheckout:g,reloadContainer:i,reloadCatContent:j,reloadItemContainer:k}},["APIFactory","CMSFactory","UIFactory"])}(PlentyFramework),function(a,b){b.factory("ModalFactory",function(){function c(a){return PlentyFramework.partials.Modal.isModal(a)}function d(a){return new e(a)}function e(d){function e(a){return t.title=a,this}function f(a){return t.cssClass=a,this}function g(a){return t.content=a,this}function h(a){return t.labelConfirm=a,this}function i(a){return t.labelDismiss=a,this}function j(a){return t.onConfirm=a,this}function k(a){return t.onDismiss=a,this}function l(a){return t.container=a,this}function m(a){return t.timeout=a,this}function n(){if(t.selector)u=a(t.selector);else{u=c(t.content)?PlentyFramework.partials.Modal.getModal(t.content):a(PlentyFramework.compileTemplate("modal/modal.html",t)),a(t.container).append(u);var b=a(t.content).filter("script");b.length>0&&b.each(function(b,c){var d=document.createElement("script");d.type="text/javascript",d.innerHTML=a(c).text(),a(t.container).append(d)})}PlentyFramework.partials.Modal.init(u,t),u.find('[data-plenty-modal="confirm"]').click(function(){var a=t.onConfirm();"undefined"==typeof a&&(a=!0),a&&o(!0)}),PlentyFramework.partials.Modal.show(u),t.timeout>0&&p()}function o(a){PlentyFramework.partials.Modal.hide(u),a||t.onDismiss()}function p(){x=t.timeout,y=(new Date).getTime(),v=window.setTimeout(function(){window.clearInterval(w),o()},t.timeout),u.find('[data-plenty-modal="timer"]').text(x/1e3),w=window.setInterval(function(){if(!z){var a=x-(new Date).getTime()+y;a=Math.round(a/1e3),u.find('[data-plenty-modal="timer"]').text(a)}},1e3)}function q(){z=!0,x-=(new Date).getTime()-y,window.clearTimeout(v)}function r(){z=!1,y=(new Date).getTime(),v=window.setTimeout(function(){o(),window.clearInterval(w)},x)}function s(){window.clearTimeout(v),window.clearInterval(w)}var t=this;t.selector=d,t.title="",t.cssClass="",t.content="",t.labelDismiss=b.translate("Cancel"),t.labelConfirm=b.translate("Confirm"),t.onConfirm=function(){},t.onDismiss=function(){},t.container="body",t.timeout=-1,t.hide=o,t.startTimeout=p,t.stopTimeout=s,t.pauseTimeout=q,t.continueTimeout=r;var u,v,w,x,y,z=!1;return{setTitle:e,setClass:f,setContent:g,setContainer:l,setLabelConfirm:h,setLabelDismiss:i,onConfirm:j,onDismiss:k,setTimeout:m,show:n,hide:o}}return{prepare:d,isModal:c}})}(jQuery,PlentyFramework),function(a,b){b.factory("UIFactory",function(){function c(a,b){d([{code:a,message:b}])}function d(c){(!i||a("body").has(i).length<=0)&&(i=a(b.compileTemplate("error/errorPopup.html")),a("body").append(i),b.partials.Error.init(i)),a.each(c,function(c,d){b.partials.Error.addError(i,a(b.compileTemplate("error/errorMessage.html",d)))}),b.partials.Error.show(i),f(!0)}function e(){return h=h||0,(!g||a("body").has(g).length<=0)&&(g=a(b.compileTemplate("waitscreen/waitscreen.html")),a("body").append(g)),b.partials.WaitScreen.show(g),h++,h}function f(a){return h--,(0>=h||a)&&(h=0,b.partials.WaitScreen.hide(g)),h}var g,h=0,i=null;return{throwError:c,printErrors:d,showWaitScreen:e,hideWaitScreen:f}})}(jQuery,PlentyFramework),Object.equals=function(a,b){if(a===b)return!0;if(!(a instanceof Object&&b instanceof Object))return!1;if(a.constructor!==b.constructor)return!1;for(var c in a)if(a.hasOwnProperty(c)){if(!b.hasOwnProperty(c))return!1;if(a[c]!==b[c]){if("object"!=typeof a[c])return!1;if(!Object.equals(a[c],b[c]))return!1}}for(var c in b)if(b.hasOwnProperty(c)&&!a.hasOwnProperty(c))return!1;return!0},PlentyFramework.cssClasses={active:"active"},function(a,b){b.partials.Error={init:function(c){a(c).find(".close").click(function(){b.partials.Error.hideAll()})},addError:function(b,c){var d=a(c).attr("data-plenty-error-code");a(b).find('[data-plenty-error-code="'+d+'"]').length<=0&&a(b).find(".plentyErrorBoxInner").append(c)},show:function(b){a(b).show()},hideAll:function(){a("#CheckoutErrorPane").hide(),a("#CheckoutErrorPane").find(".plentyErrorBoxInner").html("")}}}(jQuery,PlentyFramework),function(a,b){b.partials.Modal={init:function(a,b){a.on("hidden.bs.modal",function(){b.hide(),b.selector||a.remove()}),b.timeout>0&&(a.on("hide.bs.modal",b.stopTimeout),a.find(".modal-content").hover(function(){b.pauseTimeout()},function(){a.is(".in")&&b.continueTimeout()}))},show:function(a){a.modal("show")},hide:function(a){a.modal("hide")},isModal:function(b){return a(b).filter(".modal").length+a(b).find(".modal").length>0},getModal:function(b){var c=a(b);return c.length>1&&(c=a(b).filter(".modal")||a(b).find(".modal")),c}}}(jQuery,PlentyFramework),function(a){a(document).on("initPartials",function(b,c){a(c).find('[data-toggle="tooltip"]').tooltip({container:"body"})})}(jQuery),function(a,b){b.partials.WaitScreen={show:function(a){a.addClass("in")},hide:function(a){a.removeClass("in")}}}(jQuery,PlentyFramework),function(a,b){b.service("AddressDoctorService",function(c){function d(b){var c=!0;return b=b||"[data-plenty-address-doctor]",a(b).filter("[data-plenty-address-doctor]:visible").each(function(b,d){var f=new e(d),g=a(d).attr("data-plenty-address-doctor").replace(/\s/g,"").split(",");f.isValid(g)||(c=!1)}),c}function e(c){function d(a){return j()?!0:(k=new f(m.getFormValues()),l=a,e(),1==k.getAddresses().length)}function e(){a(".suggestion-list").remove();for(var b=!1,c=0;cc;c++){var d=a.data[c],f=e(d);f?f.HouseNo.push(d.HouseNo):(d.HouseNo=[d.HouseNo],j.push(d))}})}function e(a){for(var b=j.length,c=0;b>c;c++)if(a.Street==j[c].Street&&j.ZIP==j[c].ZIP&&a.City==j[c].City)return j[c];return null}function f(){return j}function g(b){for(var c=[],d=j.length,e=0;d>e;e++){var f=j[e];a.inArray(f[b],c)<0&&c.push(f[b])}return c}function h(a){for(var b=[],c=j.length,d=0;c>d;d++){var e=j[d];(a.Street&&a.Street==e.Street||a.ZIP&&a.ZIP==e.ZIP||a.City&&a.City==e.City)&&b.push(e)}j=b}function i(a){a=parseInt(a);for(var b=j.length,c=0;b>c;c++)for(var d=j[c],e=0;e=f[0]&&a<=f[1])return!0}return!1}var j=[];return d(),{getAddresses:f,getList:g,filter:h,houseNoAllowed:i}}return{validateAddress:d}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("AuthenticationService",function(c,d,e){function f(){var b=a('[data-plenty-checkout="lostPasswordForm"]');if(b.validateForm()){var d=b.getFormValues(),e={Email:d.Email};return c.post("/rest/checkout/lostpassword/",e).done(function(b){1==b.data.IsMailSend&&(a('[data-plenty-checkout="lostPasswordTextContainer"]').hide(),a('[data-plenty-checkout="lostPasswordSuccessMessage"]').show())})}}function g(a){if(a.validateForm()){var b=a.getFormValues(),d={Email:b.loginMail,Password:b.loginPassword};return e.showWaitScreen(),c.post("/rest/checkout/login/",d).done(function(){window.location.assign(a.attr("action"))})}}function h(a){return c.post("/rest/checkout/customerinvoiceaddress/",a).done(function(a){d.getCheckout().CustomerInvoiceAddress=a.data})}function i(){var c=a('[data-plenty-checkout-form="customerRegistration"]');if(c.validateForm()&&b.getInstance().AddressDoctorService.validateAddress()){var d=c.getFormValues();if(d.LoginType=2,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var f in e)e[f]&&d.CustomerPropertiesList.push({PropertyID:f,PropertyValue:e[f]})}return h(d).done(function(){window.location.assign(c.attr("action"))})}}return{resetPassword:f,customerLogin:g,setInvoiceAddress:h,registerCustomer:i}},["APIFactory","CheckoutFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("BasketService",function(c,d,e,f,g){function h(d){d&&c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:d[0].BasketItemItemID,quantity:d[0].BasketItemQuantity},!1,!0).done(function(c){c.data[0].indexOf("form-group")>0?g.prepare().setContent(c.data[0]).setTitle(b.translate("Select order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(j(i(d)),!0):!1}).show():j(d)})}function i(b){var c,d=a('[data-plenty-checkout-form="OrderParamsForm"]'),e={},f="";return d.find('[name^="ParamGroup"]').each(function(){c=this.name.match(/^ParamGroup\[(\d+)]\[(\d+)]$/),b=m(b,c[1],a(this).val(),a(this).val())}),d.find('[name^="ParamValue"]').each(function(){if(e=a(this),f=e.attr("type"),("checkbox"==f&&e.is(":checked")||"radio"==f&&e.is(":checked")||"radio"!=f&&"checkbox"!=f)&&"file"!=f&&"hidden"!=f){var c=e[0].name.match(/^ParamValue\[(\d+)]\[(\d+)]$/);b=m(b,c[1],c[2],e.val())}else if("file"==f)if(e[0].files&&e[0].files.length>0)b=l(e,b);else{var c=e[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/),d=a('input[type="hidden"][name="ParamValue['+c[1]+"]["+c[2]+']"]').val();b=m(b,c[1],c[2],d)}}),b}function j(a){c.post("/rest/checkout/basketitemslist/",a,!0).done(function(){f.loadCheckout().done(function(){s(),e.getContainer("ItemViewItemToBasketConfirmationOverlay",{ArticleID:a[0].BasketItemItemID}).from("ItemView").done(function(a){var c=b.getGlobal("TimeoutItemToBasketOverlay",5e3),d=g.prepare().setContent(a.data[0]);c>0&&d.setTimeout(c),d.show()})})}).fail(function(a){d.printErrors(JSON.parse(a.responseText).error.error_stack)})}function k(a){c.put("/rest/checkout/basketitemslist/",a).done(function(){f.reloadCatContent(b.getGlobal("basketCatID")),f.loadCheckout().done(function(){s()})})}function l(a,b){var d,e,f=a[0].id,g={},h=[],i={type:"POST",data:{},isFile:!0,cache:!1,dataType:"json",processData:!1,contentType:!1};g[f]=a[0].files,-1==h.indexOf(f)&&h.push(f);for(var j=0,k=h.length;k>j;++j)d=new FormData,e=g[h[j]],d.append("0",e[0],e[0].name),i.data=d,c.post("/rest/checkout/orderparamfile/",i);var l=a[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/);return m(b,l[1],l[2],g[f][0].name)}function m(b,c,d,e){return c>0&&void 0==b[c]&&(b[c]=a.extend(!0,{},b[0]),b[c].BasketItemOrderParamsList=[]),void 0!=b[c]&&(b[c].BasketItemQuantity=1,void 0==b[c].BasketItemOrderParamsList&&(b[c].BasketItemOrderParamsList=[]),e&&b[c].BasketItemOrderParamsList.push({BasketItemOrderParamID:d,BasketItemOrderParamValue:e})),b}function n(b){var c=a('[data-plenty-basket-item="'+b+'"]');c.modal("show"),c.find('[data-plenty-modal="confirm"]').on("click",function(){var d=p(b),e=[];c.find('select, .PlentyFormContainer.AttrImage > input[type="hidden"]').each(function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&e.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=e.length&&(d.BasketItemAttributesList=e),k([d])})}function o(d){var e=p(d);e.BasketItemOrderParamsList=[],c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:e.BasketItemItemID,quantity:e.BasketItemQuantity,basketItemID:d}).done(function(c){g.prepare().setContent(c.data[0]).setTitle(b.translate("Edit order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(k(i([e])),!0):!1}).show()})}function p(a){for(var b=f.getCheckout().BasketItemsList,c=0;c=0?c.get("/rest/checkout/container_checkoutbasketitemslist/").done(function(c){var d=a("[data-basket-item-id]").parents("ul"),e=d.parents(".panel-body");d.fadeOut(function(){a(this).siblings(":not('[data-plenty-checkout-template]')").remove(),a(this).remove(),e.prepend(a(c.data[0])).hide().fadeIn(function(){b.getInstance().bindDirectives(e)})})}):f.reloadContainer("BasketItemsList"),f.reloadContainer("Totals")),s(),i.resolve()})})}var i=a.Deferred(),j=p(d).BasketItemNameMap[1];return e?h():g.prepare().setTitle(b.translate("Please confirm")).setContent("

    "+b.translate('Do you really want to remove "{{item}}" from your basket?',{item:j})+"

    ").onDismiss(function(){i.reject()}).onConfirm(function(){h()}).setLabelConfirm(b.translate("Delete")).show(),i}function r(d,e){if(0>=e)return q(d);for(var g,h,i=a.Deferred(),j=f.getCheckout().BasketItemsList,k=0;k0&&f.reloadContainer("Totals")}return{addItem:h,removeItem:q,getItem:p,setItemQuantity:r,editItemAttributes:n,editOrderParams:o,addCoupon:t,removeCoupon:u}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("CheckoutService",function(c,d,e,f,g){function h(){f.loadCheckout(!0)}function i(){var b=a('[data-plenty-checkout-form="details"]'),d=b.getFormValues();return f.getCheckout().CheckoutCustomerSign||(f.getCheckout().CheckoutCustomerSign=""),f.getCheckout().CheckoutOrderInfoText||(f.getCheckout().CheckoutOrderInfoText=""),f.getCheckout().CheckoutCustomerSign!==d.CustomerSign&&a(b).find('[name="CustomerSign"]').length>0||f.getCheckout().CheckoutOrderInfoText!==d.OrderInfoText&&a(b).find('[name="OrderInfoText"]').length>0?(f.getCheckout().CheckoutCustomerSign=d.CustomerSign,f.getCheckout().CheckoutOrderInfoText=d.OrderInfoText,f.setCheckout()):c.idle()}function j(d){var e=a('[data-plenty-checkout-form="shippingAddress"]');if(!d&&!e.validateForm())return!1;if(!d&&!b.getInstance().AddressDoctorService.validateAddress(e))return!1;var g=e.getFormValues(),h=a('[name="shippingAddressID"]:checked').val();if(0>h){var i=g;return m(i,f.getCheckout().CustomerShippingAddress)?c.idle():("PACKSTATION"==i.Street?(i.IsPackstation=1,i.PackstationNo=i.HouseNo):"POSTFILIALE"==i.Street&&(i.IsPostfiliale=1,i.PostfilialNo=i.HouseNo),c.post("/rest/checkout/customershippingaddress/",i).done(function(a){f.getCheckout().CheckoutCustomerShippingAddressID=a.data.ID,f.getCheckout().CheckoutShippingCountryID=a.data.CountryID,k()}))}return h==f.getCheckout().CheckoutCustomerShippingAddressID?c.idle():(f.getCheckout().CheckoutCustomerShippingAddressID=h,void k())}function k(){return delete f.getCheckout().CheckoutMethodOfPaymentID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList"),f.reloadContainer("ShippingProfilesList"),2==f.getCheckout().CustomerInvoiceAddress.LoginType&&f.reloadContainer("CustomerShippingAddress"),a("#shippingAdressSelect").modal("hide"),a(".modal-backdrop")&&a(".modal-backdrop").remove()})}function l(){var b=a('[data-plenty-checkout-form="guestRegistration"]'),d=b.getFormValues();if(d.LoginType=1,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var g in e)e[g]&&d.CustomerPropertiesList.push({PropertyID:g,PropertyValue:e[g]})}return m(d,f.getCheckout().CustomerInvoiceAddress)?j():c.post("/rest/checkout/customerinvoiceaddress/",d).done(function(a){j().done(f.loadCheckout)})}function m(a,b){for(var c in a)if(a[c]+""!=b[c]+""&&"EmailRepeat"!==c)return!1;return!0}function n(){var b=a('[data-plenty-checkout-form="shippingProfileSelect"]').getFormValues();return f.getCheckout().CheckoutShippingProfileID=b.ShippingProfileID,delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutMethodOfPaymentID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList")})}function o(){var b=f.getCheckout().CheckoutMethodOfPaymentID,e=a('input[type="radio"][name="MethodOfPaymentID"][value="'+b+'"]').parent().getFormValues();return c.post("/rest/checkout/preparepayment/",e,!0).done(function(b){if(""!=b.data.CheckoutMethodOfPaymentRedirectURL)document.location.assign(b.data.CheckoutMethodOfPaymentRedirectURL);else if(b.data.CheckoutMethodOfPaymentAdditionalContent){var c=a(b.data.CheckoutMethodOfPaymentAdditionalContent).find('[data-plenty-checkout-form="bankDetails"]').length>0;g.prepare().setContent(b.data.CheckoutMethodOfPaymentAdditionalContent).onConfirm(function(){return c?s():u()}).show()}}).fail(function(b){try{for(var c=a.parseJSON(b.responseText),e=[],g=0;g0&&d.printErrors(e)}catch(h){d.throwError(b.status,b.statusText)}})}function p(c){return c||(c=a('input[name="MethodOfPaymentID"]:checked').val()),f.getCheckout().CheckoutMethodOfPaymentID=c,b.getGlobal("Checkout.AtrigaRequireUserConfirmation")||(f.getCheckout().CheckoutAtrigapaymaxChecked=!0),delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("ShippingProfilesList")})}function q(a){return f.getCheckout().CheckoutAtrigapaymaxChecked=!!a,c.put("/rest/checkout",{CheckoutAtrigapaymaxChecked:!!a})}function r(){e.getContainer("CheckoutPaymentInformationBankDetails").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return s()}).show()})}function s(){var b=a('[data-plenty-checkout-form="bankDetails"]');if(b.validateForm()){var d=b.getFormValues().checkout.customerBankDetails,e={CustomerBankName:d.bankName,CustomerBLZ:d.blz,CustomerAccountNumber:d.accountNo,CustomerAccountOwner:d.accountOwner,CustomerIBAN:d.iban,CustomerBIC:d.bic};return c.post("/rest/checkout/paymentinformationbankdetails/",e).done(function(){f.loadCheckout().done(function(){p(3),f.reloadContainer("MethodsOfPaymentList")})}),!0}return!1}function t(){e.getContainer("CheckoutPaymentInformationCreditCard").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return u()}).show()})}function u(){var b=a('[data-plenty-checkout-form="creditCard"]');if(b.validateForm()){var d=b.getFormValues().checkout.paymentInformationCC,e={Owner:d.owner,Cvv2:d.cvv2,Number:d.number,Year:d.year,Month:d.month,Provider:d.provider};return c.post("/rest/checkout/paymentinformationcreditcard/",e).done(function(){f.loadCheckout()}),!0}return!1}function v(b){if(2==f.getCheckout().CustomerInvoiceAddress.LoginType)var c=a('[data-plenty-checkout-form="shippingAddress"]').getFormValues();else var c=a('[data-plenty-checkout-form="guestRegistration"]').getFormValues();var d={street:c.Street,houseNo:c.HouseNo,ZIP:c.ZIP,city:c.City,postnummer:c.Postnummer,suggestionType:"postfinder"};e.getContainer("CheckoutAddressSuggestionResultsList",d).from("Checkout").done(function(a){g.prepare().setContent(a.data[0]).show()})}function w(){var b=a('[data-plenty-checkout-form="placeOrder"]');if(b.validateForm()){var d=b.getFormValues(),e={TermsAndConditionsCheck:d.termsAndConditionsCheck||0,WithdrawalCheck:d.withdrawalCheck||0,PrivacyPolicyCheck:d.privacyPolicyCheck||0,AgeRestrictionCheck:d.ageRestrictionCheck||0,NewsletterCheck:d.newsletterCheck||0,KlarnaTermsAndConditionsCheck:d.klarnaTermsAndConditionsCheck||0,PayoneDirectDebitMandateCheck:d.payoneDirectDebitMandateCheck||0,PayoneInvoiceCheck:d.payoneInvoiceCheck||0};return c.post("/rest/checkout/placeorder/",e).done(function(a){""!=a.data.MethodOfPaymentRedirectURL?window.location.assign(a.data.MethodOfPaymentRedirectURL):""!=a.data.MethodOfPaymentAdditionalContent?g.prepare().setContent(a.data.MethodOfPaymentAdditionalContent).setLabelDismiss("").onDismiss(function(){window.location.assign(b.attr("action"))}).onConfirm(function(){window.location.assign(b.attr("action"))}).show():window.location.assign(b.attr("action"))})}}return{init:h,setCustomerSignAndInfo:i,registerGuest:l,setShippingProfile:n,saveShippingAddress:j,loadAddressSuggestion:v,preparePayment:o,setMethodOfPayment:p,confirmAtrigaPaymax:q,editBankDetails:r,editCreditCard:t,placeOrder:w}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("FeedbackService",function(a){function b(){function b(a,b){return e.dateStart=a,e.dateEnd=b,this}function c(b,c,f){var g={ReferenceId:c,FromDate:e.dateStart,ToDate:e.dateEnd,FeedbackType:f||d().COMMENTS_AND_RATINGS};return a.get("/rest/feedback/"+b+"/",g)}var e={dateStart:null,dateEnd:null};return{between:b,"for":c}}function c(){function b(a){return f.Rating=a,this}function c(a){return f.Text=a,this}function d(a,b,c){return f.Author=a,b&&(f.Email=b),c&&(f.CustomerId=c),this}function e(b,c){return a.post("/rest/feedback/"+b+"/",f)}var f={Rating:1,Text:"",Author:"",Email:"",CustomerId:0};return{withRating:b,withComment:c,withAuthor:d,to:e}}function d(){return{COMMENTS_ONLY:"comments_only",RATINGS_ONLY:"ratings_only",COMMENTS_AND_RATINGS:"comments_with_ratings"}}function e(){return{ITEM:"item",CATEGORY:"category",BLOG:"blog"}}return{getFeedbacks:b,addFeedback:c,ArticleTypes:e(),FeedbackTypes:d()}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("MediaSizeService",function(){function b(){return e&&c(),e}function c(){var b;if(b=window.matchMedia?window.matchMedia("(min-width:1200px)").matches?"lg":window.matchMedia("(min-width:992px)").matches?"md":window.matchMedia("(min-width:768px)").matches?"sm":"xs":a(window).width()>=1200?"lg":a(window).width()>=992?"md":a(window).width()>=768?"sm":"xs",b!=e||"xs"===b){var c=e;e=b,a(window).trigger("sizeChange",[e,c])}}function d(a){for(var b=a.replace(/\s/g,"").split(","),c=0;c li'),r=a('[data-plenty-checkout="container"] > div'),u=a('[data-plenty-checkout="next"]'),t=a('[data-plenty-checkout="prev"]'),q.length==r.length&&r.length>0){d.getCheckout();r.hide(),q.each(function(b,c){a(c).addClass("disabled"),a(c).click(function(){a(this).is(".disabled")||j(b)})}),u.attr("disabled","disabled"),u.click(function(){m()}),t.attr("disabled","disabled"),t.click(function(){n()}),window.addEventListener("hashchange",function(){window.location.hash.length>0?o(window.location.hash):j(0)},!1),a.urlParam=function(a){var b=new RegExp("[?&]"+a+"=([^&#]*)").exec(window.location.href);return null==b?null:b[1]||0};var c=a.urlParam("gototab");0==window.location.hash.length&&c&&a('[data-plenty-checkout-id="'+c+'"]').length>0?window.location.hash=c:j(!o(window.location.hash)&&s>=0?s:0),p(),a(window).on("sizeChange",p),a(window).resize(function(){"xs"==b.getInstance().MediaSizeService.interval()&&p()})}}function f(){return s>=0?{id:a(r[s]).attr("data-plenty-checkout-id"),index:s}:null}function g(a){return v.beforeChange.push(a),b.getInstance().NavigatorService}function h(a){return v.afterChange.push(a),b.getInstance().NavigatorService}function i(b,c){var d=!0;if(s>=0||"afterChange"===b){var e=f(),g={index:c,id:a(r[c]).attr("data-plenty-checkout-id")};a.each(v[b],function(a,b){return b(e,g)===!1?(d=!1,!1):void 0})}return d}function j(e,f){var g=s!==e;(!g||f||i("beforeChange",e))&&(s=e,!Object.equals(w[s],d.getCheckout(!0))&&g&&a(r[s]).attr("data-plenty-checkout-content")?(w[s]=d.getCheckout(!0),c.getCategoryContent(a(r[s]).attr("data-plenty-checkout-content")).done(function(c){a(r[s]).html(c.data[0]),k(g),b.getInstance().bindDirectives(r[s]),a(window).trigger("contentChanged")})):k(g))}function k(b){a(r).hide();var c;a(q).each(function(b,d){c=a(d),c.removeClass("disabled active"),c.find('[role="tab"]').attr("aria-selected","false"),s>b?c.addClass("visited"):b==s?(c.addClass("active visited"),c.find('[role="tab"]').attr("aria-selected","true")):b>s&&!c.is(".visited")&&c.addClass("disabled")}),p(),0>=s?t.attr("disabled","disabled"):t.removeAttr("disabled"),s+1==q.length?u.attr("disabled","disabled"):u.removeAttr("disabled"),a(r[s]).show(),s>0?window.location.hash=a(r[s]).attr("data-plenty-checkout-id"):window.location.hash.length>0&&(window.location.hash=""),b&&i("afterChange",s)}function l(a){j(a.index,!0)}function m(){s0&&j(s-1)}function o(b){return"next"==b?(m(),!0):"prev"==b?(n(),!0):(b=b.replace("#",""),a(r).each(function(c,d){return a(d).attr("data-plenty-checkout-id")==b?(j(c),!0):void 0}),!1)}function p(){var b=q.length;if(!(0>=b)){a(q).removeAttr("style"),a(q).children("span").removeAttr("style"),a(u).removeAttr("style"),a(t).removeAttr("style");var c=a(t).outerWidth()c?a(d).children("span").css({paddingLeft:g+"px",paddingRight:h+"px"}):a(d).children("span").css({paddingLeft:j+"px",paddingRight:k+"px"})})}}var q=[],r=[],s=-1,t={},u={},v={beforeChange:[],afterChange:[]},w=[];return{init:e,getCurrentContainer:f,goTo:j,beforeChange:g,afterChange:h,continueChange:l,next:m,previous:n,goToID:o,fillNavigation:p}},["CMSFactory","CheckoutFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("PostfinderService",function(c,d,e){function f(){var b=a('input[name="Street"]').val();return"PACKSTATION"==b.toUpperCase()||"POSTFILIALE"==b.toUpperCase()}function g(){j={PostfinderItemStreet:a('input[name="Street"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemZIP:a('input[name="ZIP"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemCity:a('input[name="City"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemHouseNo:a('input[name="HouseNo"]','[data-plenty-checkout-form="shippingAddress"]')},j.PostfinderItemStreet.val(""),j.PostfinderItemZIP.val().length>2||j.PostfinderItemCity.val().length>2?c.get("/rest/checkout/shippingaddresspostfinderlist/",{suggestionType:"postfinder",zip:j.PostfinderItemZIP.val(),city:j.PostfinderItemCity.val()}).done(function(c){l=c.data,k=l.length,0==k&&h();for(var e={addresses:[]},f=0;k>f;f++){var g="km",m=l[f].PostfinderItemDistance,n=m/1e3;n=(Math.round(100*n)/100).toFixed(2).replace(".",","),1e3>m&&(n=m,g="m"),e.addresses.push({index:f,dimension:g,type:l[f].PostfinderItemIsPackstation?"Packstation":"Postfiliale",number:l[f].PostfinderItemIsPackstation?l[f].PostfinderItemPackstationNo:l[f].PostfinderItemPostfilialNo,street:l[f].PostfinderItemStreet,houseNo:l[f].PostfinderItemHouseNo,zip:l[f].PostfinderItemZIP,city:l[f].PostfinderItemCity,district:l[f].PostfinderItemDistrict,distance:n,remark:l[f].PostfinderItemRemark})}var o=b.compileTemplate("addressSuggestions/postFinder.html",e);d.prepare().setTitle(b.translate("Packstations and post offices in your area")).setContent(o).setClass("checkout").onConfirm(function(){return j.PostfinderItemCity.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemZIP.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemStreet.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemStreet.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemHouseNo.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemHouseNo.attr("id")+'"]').removeClass("has-error").addClass("has-success"),i=a('input[type="radio"][name="postfinder"]:checked').val(),l[i].PostfinderItemIsPackstation?(a(j.PostfinderItemStreet).val("PACKSTATION"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPackstationNo)):(a(j.PostfinderItemStreet).val("POSTFILIALE"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPostfilialNo)),a(j.PostfinderItemStreet).trigger("change"),a(j.PostfinderItemCity).val(l[i].PostfinderItemCity),a(j.PostfinderItemZIP).val(l[i].PostfinderItemZIP),!0}).show()}):h()}function h(){e.throwError(0,b.translate("Please enter a ZIP code and/or a city.")),j.PostfinderItemCity.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemZIP.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemCity.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")}),j.PostfinderItemZIP.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")})}var i="",j={},k={},l={};return{openPostfinderModal:g,isPackstation:f}},["APIFactory","ModalFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("SocialShareService",function(){function b(a){var b={"facebook-like":'',"facebook-recommend":'',twitter:'',"google-plus":'
    '};return b[a]}function c(){var b=document.location.href,c=a("link[rel=canonical]").attr("href");return c&&c.length>0&&(c.indexOf("http")<0&&(c=document.location.protocol+"//"+document.location.host+c),b=c),b}function d(b){var c=a('meta[name="'+b+'"]').attr("content");return c||""}function e(){var b=d("DC.title"),c=d("DC.creator");return b.length>0&&c.length>0?b+=" - "+c:b=a("title").text(),encodeURIComponent(b)}return"undefined"==typeof socialLangLocale&&(socialLangLocale="en_US"),"undefined"==typeof socialLang&&(socialLang="en"),{getSocialService:b}})}(jQuery,PlentyFramework),function(a,b){b.service("ValidationService",function(){function b(b){return b=a(b),b.is("input")||b.is("select")||b.is("textarea")?b:b.find("input").length>0?b.find("input"):b.find("select").length>0?b.find("select"):b.find("textarea").length>0?b.find("textarea"):null}function c(b){return b.is("input")||b.is("select")||b.is("textarea")?a.trim(b.val()).length>0:(console.error("Validation Error: Cannot validate Text for <"+b.prop("tagName")+">"),!1)}function d(b){var d=/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;return c(b)?d.test(a.trim(b.val())):!1}function e(b){return c(b)?a.isNumeric(a.trim(b.val())):!1}function f(b,c){return a(c).length>0?a.trim(b.val())==a.trim(a(c).val()):a.trim(b.val())==c}function g(a){return a.is(":visible")}function h(a){return a.is(":enabled")}function i(i,j){var k,l,m,n,o,p,q,r,s,t,u,v=a(i);j=j||"has-error";var w=[],x=!1;v.find("[data-plenty-validate], :required").each(function(i,y){s=a(y).attr("data-plenty-validate"),l=b(y),t=s?s:"text",t=t.split(",");for(var i=0,z=l.length;z>i;i++){if(k=a(l[i]),u=k.attr("type"),!g(k)||!h(k))return;if(m=t[i].trim()||t[0].trim(),n=!1,k.is("input")&&"radio"!=u&&"checkbox"!=u||k.is("textarea"))switch(m){case"text":n=!c(k);break;case"mail":n=!d(k);break;case"number":n=!e(k);break;case"value":n=!f(k,a(y).attr("data-plenty-validation-value"));break;case"none":break;default:console.error('Form validation error: unknown validate property: "'+s+'"')}else if(!k.is("input")||"radio"!=u&&"checkbox"!=u){if(!k.is("select"))return void console.error("Form validation error: "+a(y).prop("tagName")+" does not contain an form element");n=""==k.val()||"-1"==k.val()}else{if(o=k.attr("name"),p=v.find('input[name="'+o+'"]:checked').length,"radio"==u)q=1,r=1;else{var A=new Function("return "+s)()||{min:1,max:1};q=A.min,r=A.max}n=q>p||p>r}n&&(x=!0,w.push(k),l.length>1?(k.addClass(j),v.find('label[for="'+k.attr("id")+'"]').addClass(j)):a(y).addClass(j))}}),v.on("validationFailed",function(){var b=50,c=v.find("."+j).first(),d=c.offset().top,e=a("html, body");v.parents(".modal").length>0?(e=v.parents(".modal").find(".modal-body"),d=e.scrollTop()-(e.offset().top-c.offset().top)):v.is(".modal")&&(e=v.find(".modal-body"),d=e.scrollTop()-(e.offset().top-c.offset().top)),(d-bwindow.pageYOffset+window.innerHeight)&&e.animate({scrollTop:d-b})}),x&&(v.find("."+j).each(function(c,d){k=a(b(d)), -k.on("focus click",function(){var b=a(d);b.removeClass(j),v.find('label[for="'+a(this).attr("id")+'"]').removeClass(j)})}),v.trigger("validationFailed",[w]));var y=v.attr("data-plenty-callback");if(!x&&y&&"submit"!=y&&"function"==typeof window[y]){var z={};return v.find("input, textarea, select").each(function(){"checkbox"==a(this).attr("type")?z[a(this).attr("name")]=a(this).is(":checked"):z[a(this).attr("name")]=a(this).val()}),window[y](z),!1}return!x}return{validate:i}}),a.fn.validateForm=function(){return b.getInstance().ValidationService.validate(this)},a.fn.getFormValues=function(){function b(b,c){var e=b.match(/^([^\[]+)(.*)/);if(e[2]){var f,g=/\[([^\]]+)]/g,h=[];for(h[0]=e[1];null!==(f=g.exec(e[2]));)h.push(f[1]);for(var i=h.length-1;i>=0;i--){var j={};j[h[i]]=c,c=j}d=a.extend(!0,d,c)}else d[e[1]]=c}var c=this,d={};return c.find("input, select, textarea").each(function(d,e){if(a(e).attr("name"))if("checkbox"==a(e).attr("type")){var f=[];a(c).find('[name="'+a(e).attr("name")+'"]:checked').each(function(b,c){f.push(a(c).val())}),b(a(e).attr("name"),f)}else"radio"==a(e).attr("type")?a(e).is(":checked")&&b(a(e).attr("name"),a(e).val()):b(a(e).attr("name"),a(e).val())}),d}}(jQuery,PlentyFramework),PlentyFramework.compile();var plenty=PlentyFramework.getInstance();jQuery(document).ready(function(){plenty.bindDirectives()}); +var TemplateCache={};TemplateCache["addressSuggestions/addressDoctor.html"]='',TemplateCache["addressSuggestions/postFinder.html"]='{{#addresses}}\n
    \n
    \n \n
    \n
    \n{{/addresses}}\n',TemplateCache["error/errorMessage.html"]='
    \n Code {{code}}:\n {{{message}}}\n
    \n',TemplateCache["error/errorPopup.html"]='
    \n \n
    \n
    \n
    \n',TemplateCache["modal/modal.html"]='\n',TemplateCache["waitscreen/waitscreen.html"]='
    ',function(a,b){"object"==typeof exports&&exports&&"string"!=typeof exports.nodeName?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):(a.Mustache={},b(Mustache))}(this,function(a){function b(a){return"function"==typeof a}function c(a){return p(a)?"array":typeof a}function d(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function e(a,b){return null!=a&&"object"==typeof a&&b in a}function f(a,b){return q.call(a,b)}function g(a){return!f(r,a)}function h(a){return String(a).replace(/[&<>"'\/]/g,function(a){return s[a]})}function i(b,c){function e(){if(r&&!s)for(;q.length;)delete o[q.pop()];else q=[];r=!1,s=!1}function f(a){if("string"==typeof a&&(a=a.split(u,2)),!p(a)||2!==a.length)throw new Error("Invalid tags: "+a);h=new RegExp(d(a[0])+"\\s*"),i=new RegExp("\\s*"+d(a[1])),m=new RegExp("\\s*"+d("}"+a[1]))}if(!b)return[];var h,i,m,n=[],o=[],q=[],r=!1,s=!1;f(c||a.tags);for(var y,z,A,B,C,D,E=new l(b);!E.eos();){if(y=E.pos,A=E.scanUntil(h))for(var F=0,G=A.length;G>F;++F)B=A.charAt(F),g(B)?q.push(o.length):s=!0,o.push(["text",B,y,y+1]),y+=1,"\n"===B&&e();if(!E.scan(h))break;if(r=!0,z=E.scan(x)||"name",E.scan(t),"="===z?(A=E.scanUntil(v),E.scan(v),E.scanUntil(i)):"{"===z?(A=E.scanUntil(m),E.scan(w),E.scanUntil(i),z="&"):A=E.scanUntil(i),!E.scan(i))throw new Error("Unclosed tag at "+E.pos);if(C=[z,A,y,E.pos],o.push(C),"#"===z||"^"===z)n.push(C);else if("/"===z){if(D=n.pop(),!D)throw new Error('Unopened section "'+A+'" at '+y);if(D[1]!==A)throw new Error('Unclosed section "'+D[1]+'" at '+y)}else"name"===z||"{"===z||"&"===z?s=!0:"="===z&&f(A)}if(D=n.pop())throw new Error('Unclosed section "'+D[1]+'" at '+E.pos);return k(j(o))}function j(a){for(var b,c,d=[],e=0,f=a.length;f>e;++e)b=a[e],b&&("text"===b[0]&&c&&"text"===c[0]?(c[1]+=b[1],c[3]=b[3]):(d.push(b),c=b));return d}function k(a){for(var b,c,d=[],e=d,f=[],g=0,h=a.length;h>g;++g)switch(b=a[g],b[0]){case"#":case"^":e.push(b),f.push(b),e=b[4]=[];break;case"/":c=f.pop(),c[5]=b[2],e=f.length>0?f[f.length-1][4]:d;break;default:e.push(b)}return d}function l(a){this.string=a,this.tail=a,this.pos=0}function m(a,b){this.view=a,this.cache={".":this.view},this.parent=b}function n(){this.cache={}}var o=Object.prototype.toString,p=Array.isArray||function(a){return"[object Array]"===o.call(a)},q=RegExp.prototype.test,r=/\S/,s={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},t=/\s*/,u=/\s+/,v=/\s*=/,w=/\s*\}/,x=/#|\^|\/|>|\{|&|=|!/;l.prototype.eos=function(){return""===this.tail},l.prototype.scan=function(a){var b=this.tail.match(a);if(!b||0!==b.index)return"";var c=b[0];return this.tail=this.tail.substring(c.length),this.pos+=c.length,c},l.prototype.scanUntil=function(a){var b,c=this.tail.search(a);switch(c){case-1:b=this.tail,this.tail="";break;case 0:b="";break;default:b=this.tail.substring(0,c),this.tail=this.tail.substring(c)}return this.pos+=b.length,b},m.prototype.push=function(a){return new m(a,this)},m.prototype.lookup=function(a){var c,d=this.cache;if(d.hasOwnProperty(a))c=d[a];else{for(var f,g,h=this,i=!1;h;){if(a.indexOf(".")>0)for(c=h.view,f=a.split("."),g=0;null!=c&&gi;++i)g=void 0,e=a[i],f=e[0],"#"===f?g=this.renderSection(e,b,c,d):"^"===f?g=this.renderInverted(e,b,c,d):">"===f?g=this.renderPartial(e,b,c,d):"&"===f?g=this.unescapedValue(e,b):"name"===f?g=this.escapedValue(e,b):"text"===f&&(g=this.rawValue(e)),void 0!==g&&(h+=g);return h},n.prototype.renderSection=function(a,c,d,e){function f(a){return g.render(a,c,d)}var g=this,h="",i=c.lookup(a[1]);if(i){if(p(i))for(var j=0,k=i.length;k>j;++j)h+=this.renderTokens(a[4],c.push(i[j]),d,e);else if("object"==typeof i||"string"==typeof i||"number"==typeof i)h+=this.renderTokens(a[4],c.push(i),d,e);else if(b(i)){if("string"!=typeof e)throw new Error("Cannot use higher-order sections without the original template");i=i.call(c.view,e.slice(a[3],a[5]),f),null!=i&&(h+=i)}else h+=this.renderTokens(a[4],c,d,e);return h}},n.prototype.renderInverted=function(a,b,c,d){var e=b.lookup(a[1]);return!e||p(e)&&0===e.length?this.renderTokens(a[4],b,c,d):void 0},n.prototype.renderPartial=function(a,c,d){if(d){var e=b(d)?d(a[1]):d[a[1]];return null!=e?this.renderTokens(this.parse(e),c,d,e):void 0}},n.prototype.unescapedValue=function(a,b){var c=b.lookup(a[1]);return null!=c?c:void 0},n.prototype.escapedValue=function(b,c){var d=c.lookup(b[1]);return null!=d?a.escape(d):void 0},n.prototype.rawValue=function(a){return a[1]},a.name="mustache.js",a.version="2.1.3",a.tags=["{{","}}"];var y=new n;a.clearCache=function(){return y.clearCache()},a.parse=function(a,b){return y.parse(a,b)},a.render=function(a,b,d){if("string"!=typeof a)throw new TypeError('Invalid template! Template should be a "string" but "'+c(a)+'" was given as the first argument for mustache#render(template, view, partials)');return y.render(a,b,d)},a.to_html=function(c,d,e,f){var g=a.render(c,d,e);return b(f)?void f(g):g},a.escape=h,a.Scanner=l,a.Context=m,a.Writer=n}),function(a){function b(a,b,c,d){a.on(b,function(a){return i.push(a),c.apply(null,d)}),"complete"===document.readyState&&"ready"===b&&c.apply(null,d)}function c(b){var c=a(b);c.is('input[type="checkbox"]')&&c.on("change",function(){c.is(":checked")?c.trigger("check"):c.trigger("uncheck")}),c.is('input[type="radio"]')&&c.on("change",function(){var b=c.attr("name");a('input[type="radio"][name="'+b+'"]').each(function(b,c){var d=a(c);d.is(":checked")?d.trigger("check"):d.trigger("uncheck")})})}function d(a,b){for(var c=/^(([\w]+):)?([\w]+)\.([\w]+)(\((.*)\))?$/,d=a.split(";"),e=[],f=0;f0)for(var j=h[6].match(/(['][^']+['])|([\w-]+)|(["][^"]+["])/g),k=0;k=c&&g.services.hasOwnProperty(i)){PlentyFramework.prototype.hasOwnProperty(i)||e(g.services[i],2,d),f.push(PlentyFramework.prototype[i]);continue}if(1>=c&&g.directives.hasOwnProperty(i)){PlentyFramework.directives.hasOwnProperty(i)||e(g.directives[i],1,d),f.push(PlentyFramework.directives[i]);continue}console.error('Cannot inject dependency "'+i+'": Object not found.')}else console.error("Cyclic dependency injection: "+d.join(" -> ")+" -> "+i)}3==c?PlentyFramework.factories[b.name]=b.setup.apply(null,f):2==c?PlentyFramework.prototype[b.name]=b.setup.apply(null,f):1==c&&(PlentyFramework.directives[b.name]=b.setup.apply(null,f))}var f="1.0.8",g={factories:{},services:{},directives:{}};PlentyFramework=function(){};var h=null;PlentyFramework.getInstance=function(){return h=h||new PlentyFramework},PlentyFramework.version=function(){function a(a){for(var b=f.split("."),c=a.split("."),d=0;dparseInt(c[d]))return 1}return 0}return{get:function(){return f},equals:function(b){return 0==a(b)},compare:a}}(),PlentyFramework.partials={},PlentyFramework.globals={},PlentyFramework.setGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?(console.error('Global variable "'+a+'" already exists and cannot be overridden.'),null):(PlentyFramework.globals[a]=b,PlentyFramework.globals[a])},PlentyFramework.getGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?PlentyFramework.globals[a]:b},PlentyFramework.directives={},PlentyFramework.directive=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.directives[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.prototype.bindDirectives=function(e){e=e||"html",a(e).find("[data-plenty]").each(function(e,f){var g=d(a(f).attr("data-plenty"),a(f));if(!(g.length<=0)){c(f);for(var e=0;e=0;c--)if(a==i[c].type)return i[c];return null},PlentyFramework.pushEvent=function(a){i.push(a)},PlentyFramework.service=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.services[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.factories={},PlentyFramework.factory=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.factories[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.compileTemplate=function(a,b){return b=b||{},b.translate=function(){return function(a,b){return b(PlentyFramework.translate(a))}},Mustache.render(TemplateCache[a],b)},PlentyFramework.scriptPath="",PlentyFramework.Strings={},PlentyFramework.loadLanguageFile=function(b){a.ajax({url:PlentyFramework.scriptPath+b,dataType:"json"}).done(function(a){PlentyFramework.Strings=a})},PlentyFramework.translate=function(a,b){var c;return PlentyFramework.Strings.hasOwnProperty(a)?c=PlentyFramework.Strings[a]:(c=a,console.warn('No translation found for "'+c+'".')),b&&(c=Mustache.render(c,b)),c},PlentyFramework.compile=function(){for(var a in g.factories)PlentyFramework.factories.hasOwnProperty(a)||e(g.factories[a],3);for(var b in g.services)PlentyFramework.prototype.hasOwnProperty(b)||e(g.services[b],2);for(var c in g.directives)PlentyFramework.directives.hasOwnProperty(c)||e(g.directives[c],1);for(var d=document.getElementsByTagName("SCRIPT"),f=d.length-1;f>=0;f--){var h=d[f].src.match(/(.*)\/(.*)\.js(\?\S*)?$/);if(h){PlentyFramework.scriptPath=h[1];break}}}}(jQuery),function(a,b){b.directive("Authentication",function(c){function d(d){b.getRecentEvent().preventDefault(),c.customerLogin(a(d))}return{login:d}},["AuthenticationService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Basket",function(c){function d(d){b.getRecentEvent().preventDefault();var e={},f=a(d),g=f.parents("form");e.BasketItemItemID=g.find('[name="ArticleID"]').val(),e.BasketItemPriceID=g.find('[name="SYS_P_ID"]').val(),e.BasketItemQuantity=g.find('[name="ArticleQuantity"]').val(),e.BasketItemBranchID=g.find('[name="source_category"]').val();var h=g.find('[name^="ArticleAttribute"]'),i=[];a.each(h,function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&i.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=i.length&&(e.BasketItemAttributesList=i),c.addItem([e])}function e(b,c){var d=a(b),e=d.parent().find("input"),f=parseInt(e.attr("maxlength"))||5,g=parseInt(e.val())+c,h=d.parents("[data-basket-item-id]").length>0;if(h){(g+"").length<=f&&g>=0&&e.val(g);var i=d.data("timeout");i&&window.clearTimeout(i),i=window.setTimeout(function(){e.trigger("change")},1e3),d.data("timeout",i)}else(g+"").length<=f&&g>=1&&e.val(g)}function f(b,d){c.setItemQuantity(b,parseInt(a(d).val())).fail(function(){var e=c.getItem(b);a(d).val(e.BasketItemQuantity)})}return{addBasketItem:d,changeItemQuantity:e,setItemQuantity:f}},["BasketService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Checkout",function(a){function b(b){a.setMethodOfPayment(b)}function c(b){a.confirmAtrigaPaymax(b)}return{setMethodOfPayment:b,confirmAtrigaPaymax:c}},["CheckoutService"])}(jQuery,PlentyFramework),function(a,b){b.directive("MobileDropdown",function(c){function d(){a(window).on("orientationchange sizeChange",function(){e(k),e(l)})}function e(b,c){for(var d,e=0;e0?window.location.assign(a(c).attr("href")):window.location.assign(c))}function e(a){c.goToID(a)}return{to:d,toCheckoutTab:e}},["MediaSizeService","NavigatorService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Tab",function(c){function d(b){a(b).tab("show")}function e(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).addLabel(a)}function f(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).setContent(a)}function g(a,d,e){c.isInterval(e)&&(b.getRecentEvent().preventDefault(),j[d]&&j[d].getTab(a)&&j[d].showTab(a))}function h(){function b(a){return g[a]=new i(a),g[a]}function c(b){var c=0;if(f)c=parseInt(f.getContent().parent().css("zIndex")),f.hide(),f.getContent().parent().css("zIndex",c-1);else{for(var d in g)if(g[d].getContent()){var h=parseInt(g[d].getContent().parent().css("zIndex"));(0==c||c>h)&&(c=h),g[d].hide()}for(var d in g)g[d].getContent()&&g[d].getContent().parent().css("zIndex",c-1);a(window).on("sizeChange",e)}f=g[b],f.getContent().parent().css("zIndex",c),f.show()}function d(a){return g[a]}function e(){for(var a in g)g[a].getContent()&&g[a].show();f=null}var f,g={};return{addTab:b,showTab:c,getTab:d,resetTabs:e}}function i(a){function b(){return j}function c(a){return i.push(a),this}function d(a){return h=a,this}function e(){return h}function f(){for(var a=0;a0&&(a(document).scrollTop()>100?x(z,"addClass","visible"):x(z,"removeClass","visible"))})}function g(){e.showWaitscreen()}function h(a){e.hideWaitscreen(a)}function i(b){a(b).owlCarousel({navigation:!0,navigationText:!1,slideSpeed:1e3,paginationSpeed:1e3,singleItem:!0,autoPlay:6e3,stopOnHover:!0,afterMove:function(b){a(b).find('[data-plenty-rel="lazyload"]').trigger("appear")}})}function j(b,d,e){var f=a(b),g=0,h={},i=f.find('[data-plenty-rel="equal-target"]').length>0?f.find('[data-plenty-rel="equal-target"]'):f.children();e!==!0&&y.push(b);for(var j=i.length;j>=0;j--)h=a(i[j]),h.css("height",""),h.outerHeight(!0)>g&&(g=h.outerHeight(!0));(!d||c.isInterval(d))&&i.height(g)}function k(b){var c=a(b);c.click(function(){return a("html, body").animate({scrollTop:0},400),!1}),a.inArray(c,z)&&z.push(c)}function l(b,c){var d=a(b);d.lazyload({effect:c}),d.is("img")&&d.on("loaded",function(){d.css("display","inline-block")})}function m(b){console.log(b);var c=a(b),d=c.parent();d.addClass("animating"),c.siblings("ul").slideToggle(200,function(){d.is(".open")?d.removeClass("open"):d.addClass("open"),c.siblings("ul").removeAttr("style"),d.removeClass("animating")})}function n(b,c){var d=a(b),e=a(d.attr("data-plenty-rel"));if(d.is('input[type="radio"]')){var f=a('input[type="radio"][name="'+d.attr("name")+'"]'),g=!c||"checked"==c;f.change(function(){var b=a(this);e.parents('[data-plenty-rel="equal-target"]').css("height","auto"),b.is(":checked")&&b[0]===d[0]&&1==g?e.slideDown(400,function(){w()}):e.slideUp(400,function(){w()})})}else d.click(function(){d.addClass("animating"),e.slideToggle(400,function(){d.removeClass("animating"),d.toggleClass("active"),w()})})}function o(b,c){r(a(b),c,"slideDown")}function p(b,c){r(a(b),c,"slideUp")}function q(b,c){r(a(b),c,"slideToggle")}function r(a,b,c){b=b||400,a.parents('[data-plenty-rel="equal-target"]').css("height","auto"),a[c](b,function(){w()})}function s(b,c){var e=a(b),f=e.find('[data-plenty-rel="social-switch"]');e.append(''),f.is("off, on")||f.addClass("off"),f.on("click",function(){f.hasClass("off")&&("tooltip"==e.attr("data-toggle")&&e.tooltip("destroy"),f.removeClass("off").addClass("on"),e.find('[data-plenty-rel="social-placeholder"]').hide(),e.find(".social-container").append(d.getSocialService(c)))})}function t(d,e,f){var g=a(e);if(g.parents(".navbar-main").length>0){var h=g.children("span");return b.directives.MobileDropdown.slideDropdown(h),!0}if(e&&d&&(!f||c.isInterval(f))){var i=b.getRecentEvent();return i&&i.preventDefault(),g.toggleClass(d),!1}}function u(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).addClass(d),!1}}function v(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).removeClass(d),!1}}function w(){for(var a=y.length-1;a>=0;a--)j(y[a],"",!0)}function x(a,b,c){for(var d=a.length-1;d>=0;d--)a[d][b](c)}var y=[],z=[];return{initUIWindowEvents:f,showWaitscreen:g,hideWaitscreen:h,addContentPageSlider:i,equalHeight:j,initToTop:k,initLazyload:l,initSlideToggle:n,slideDown:o,slideUp:p,slideToggle:q,toggleHideShow:m,toggleSocialShare:s,toggleClass:t,addClass:u,removeClass:v}},["MediaSizeService","SocialShareService","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.directive("Validator",function(a){function b(b,c){return a.validate(b,c)}return{validate:b}},["ValidationService"])}(jQuery,PlentyFramework),function(a,b){b.factory("APIFactory",function(c,d){function e(){b.getGlobal("LoginSession")&&(l&&clearTimeout(l),l=setTimeout(function(){a(window).trigger("login-expired"),"Checkout"===b.getGlobal("PageDesign")&&d.prepare().setTitle(b.translate("Your session has expired.")).setContent(b.translate("Please log in again to continue shopping.")).setLabelDismiss(null).setLabelConfirm(b.translate("OK")).onConfirm(function(){window.location.assign("/")}).onDismiss(function(){window.location.assign("/")}).show()},b.getGlobal("LoginSessionExpiration")))}function f(b){try{var d=a.parseJSON(b.responseText);c.printErrors(d.error.error_stack)}catch(e){c.throwError(b.status,b.statusText)}}function g(b,d,g,h,i){return h||c.showWaitScreen(),a.ajax(b,{type:"GET",data:d,dataType:"json",async:!i,error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function h(b,d,g,h){var i={type:"POST",dataType:"json",error:function(a){g||f(a)}};return d&&d.isFile?(i.cache=d.cache,i.processData=d.processData,i.data=d.data,i.contentType=!1):(i.data=JSON.stringify(d),i.contentType="application/json"),h||c.showWaitScreen(),a.ajax(b,i).always(function(){h||c.hideWaitScreen(),e()})}function i(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"PUT",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function j(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"DELETE",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function k(){return a.Deferred().resolve()}var l=null;return a(document).ready(function(){e()}),{get:g,post:h,put:i,"delete":j,idle:k}},["UIFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a){a.factory("CMSFactory",function(a){function b(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/container_"+b.toLowerCase()+"/",c)}return{from:d}}function c(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/"+b.toLowerCase()+"/",c)}return{from:d}}function d(b){return a.get("/rest/categoryview/categorycontentbody/?categoryID="+b)}return{getContainer:b,getParams:c,getCategoryContent:d}},["APIFactory"])}(PlentyFramework),function(a){a.factory("CheckoutFactory",function(b,c,d){function e(){return l}function f(a){return m&&l||g(!0),a?$.extend(!0,{},l):m}function g(a){return b.get("/rest/checkout/",null,!1,!1,a).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function h(){return b.put("/rest/checkout",m).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function i(b){return c.getContainer("checkout"+b).from("checkout").done(function(c){$('[data-plenty-checkout-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function j(b){return c.getCategoryContent(b).done(function(c){$('[data-plenty-checkout-catcontent="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function k(b){return c.getContainer("itemview"+b).from("itemview").done(function(c){$('[data-plenty-itemview-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}var l,m;return{getCheckout:f,setCheckout:h,loadCheckout:g,reloadContainer:i,reloadCatContent:j,reloadItemContainer:k}},["APIFactory","CMSFactory","UIFactory"])}(PlentyFramework),function(a,b){b.factory("ModalFactory",function(){function c(a){return PlentyFramework.partials.Modal.isModal(a)}function d(a){return new e(a)}function e(d){function e(a){return t.title=a,this}function f(a){return t.cssClass=a,this}function g(a){return t.content=a,this}function h(a){return t.labelConfirm=a,this}function i(a){return t.labelDismiss=a,this}function j(a){return t.onConfirm=a,this}function k(a){return t.onDismiss=a,this}function l(a){return t.container=a,this}function m(a){return t.timeout=a,this}function n(){if(t.selector)u=a(t.selector);else{u=c(t.content)?PlentyFramework.partials.Modal.getModal(t.content):a(PlentyFramework.compileTemplate("modal/modal.html",t)),a(t.container).append(u);var b=a(t.content).filter("script");b.length>0&&b.each(function(b,c){var d=document.createElement("script");d.type="text/javascript",d.innerHTML=a(c).text(),a(t.container).append(d)})}PlentyFramework.partials.Modal.init(u,t),u.find('[data-plenty-modal="confirm"]').click(function(){var a=t.onConfirm();"undefined"==typeof a&&(a=!0),a&&o(!0)}),PlentyFramework.partials.Modal.show(u),t.timeout>0&&p()}function o(a){PlentyFramework.partials.Modal.hide(u),a||t.onDismiss()}function p(){x=t.timeout,y=(new Date).getTime(),v=window.setTimeout(function(){window.clearInterval(w),o()},t.timeout),u.find('[data-plenty-modal="timer"]').text(x/1e3),w=window.setInterval(function(){if(!z){var a=x-(new Date).getTime()+y;a=Math.round(a/1e3),u.find('[data-plenty-modal="timer"]').text(a)}},1e3)}function q(){z=!0,x-=(new Date).getTime()-y,window.clearTimeout(v)}function r(){z=!1,y=(new Date).getTime(),v=window.setTimeout(function(){o(),window.clearInterval(w)},x)}function s(){window.clearTimeout(v),window.clearInterval(w)}var t=this;t.selector=d,t.title="",t.cssClass="",t.content="",t.labelDismiss=b.translate("Cancel"),t.labelConfirm=b.translate("Confirm"),t.onConfirm=function(){},t.onDismiss=function(){},t.container="body",t.timeout=-1,t.hide=o,t.startTimeout=p,t.stopTimeout=s,t.pauseTimeout=q,t.continueTimeout=r;var u,v,w,x,y,z=!1;return{setTitle:e,setClass:f,setContent:g,setContainer:l,setLabelConfirm:h,setLabelDismiss:i,onConfirm:j,onDismiss:k,setTimeout:m,show:n,hide:o}}return{prepare:d,isModal:c}})}(jQuery,PlentyFramework),function(a,b){b.factory("UIFactory",function(){function c(a,b){d([{code:a,message:b}])}function d(c){(!i||a("body").has(i).length<=0)&&(i=a(b.compileTemplate("error/errorPopup.html")),a("body").append(i),b.partials.Error.init(i)),a.each(c,function(c,d){b.partials.Error.addError(i,a(b.compileTemplate("error/errorMessage.html",d)))}),b.partials.Error.show(i),f(!0)}function e(){return h=h||0,(!g||a("body").has(g).length<=0)&&(g=a(b.compileTemplate("waitscreen/waitscreen.html")),a("body").append(g)),b.partials.WaitScreen.show(g),h++,h}function f(a){return h--,(0>=h||a)&&(h=0,b.partials.WaitScreen.hide(g)),h}var g,h=0,i=null;return{throwError:c,printErrors:d,showWaitScreen:e,hideWaitScreen:f}})}(jQuery,PlentyFramework),Object.equals=function(a,b){if(a===b)return!0;if(!(a instanceof Object&&b instanceof Object))return!1;if(a.constructor!==b.constructor)return!1;for(var c in a)if(a.hasOwnProperty(c)){if(!b.hasOwnProperty(c))return!1;if(a[c]!==b[c]){if("object"!=typeof a[c])return!1;if(!Object.equals(a[c],b[c]))return!1}}for(var c in b)if(b.hasOwnProperty(c)&&!a.hasOwnProperty(c))return!1;return!0},PlentyFramework.cssClasses={active:"active"},function(a,b){b.partials.Error={init:function(c){a(c).find(".close").click(function(){b.partials.Error.hideAll()})},addError:function(b,c){var d=a(c).attr("data-plenty-error-code");a(b).find('[data-plenty-error-code="'+d+'"]').length<=0&&a(b).find(".plentyErrorBoxInner").append(c)},show:function(b){a(b).show()},hideAll:function(){a("#CheckoutErrorPane").hide(),a("#CheckoutErrorPane").find(".plentyErrorBoxInner").html("")}}}(jQuery,PlentyFramework),function(a,b){b.partials.Modal={init:function(a,b){a.on("hidden.bs.modal",function(){b.hide(),b.selector||a.remove()}),b.timeout>0&&(a.on("hide.bs.modal",b.stopTimeout),a.find(".modal-content").hover(function(){b.pauseTimeout()},function(){a.is(".in")&&b.continueTimeout()}))},show:function(a){a.modal("show")},hide:function(a){a.modal("hide")},isModal:function(b){return a(b).filter(".modal").length+a(b).find(".modal").length>0},getModal:function(b){var c=a(b);return c.length>1&&(c=a(b).filter(".modal")||a(b).find(".modal")),c}}}(jQuery,PlentyFramework),function(a){a(document).on("initPartials",function(b,c){a(c).find('[data-toggle="tooltip"]').tooltip({container:"body"})})}(jQuery),function(a,b){b.partials.WaitScreen={show:function(a){a.addClass("in")},hide:function(a){a.removeClass("in")}}}(jQuery,PlentyFramework),function(a,b){b.service("AddressDoctorService",function(c){function d(b){var c=!0;return b=b||"[data-plenty-address-doctor]",a(b).filter("[data-plenty-address-doctor]:visible").each(function(b,d){var f=new e(d),g=a(d).attr("data-plenty-address-doctor").replace(/\s/g,"").split(",");f.isValid(g)||(c=!1)}),c}function e(c){function d(a){return j()?!0:(k=new f(m.getFormValues()),l=a,e(),1==k.getAddresses().length)}function e(){a(".suggestion-list").remove();for(var b=!1,c=0;cc;c++){var d=a.data[c],f=e(d);f?f.HouseNo.push(d.HouseNo):(d.HouseNo=[d.HouseNo],j.push(d))}})}function e(a){for(var b=j.length,c=0;b>c;c++)if(a.Street==j[c].Street&&j.ZIP==j[c].ZIP&&a.City==j[c].City)return j[c];return null}function f(){return j}function g(b){for(var c=[],d=j.length,e=0;d>e;e++){var f=j[e];a.inArray(f[b],c)<0&&c.push(f[b])}return c}function h(a){for(var b=[],c=j.length,d=0;c>d;d++){var e=j[d];(a.Street&&a.Street==e.Street||a.ZIP&&a.ZIP==e.ZIP||a.City&&a.City==e.City)&&b.push(e)}j=b}function i(a){a=parseInt(a);for(var b=j.length,c=0;b>c;c++)for(var d=j[c],e=0;e=f[0]&&a<=f[1])return!0}return!1}var j=[];return d(),{getAddresses:f,getList:g,filter:h,houseNoAllowed:i}}return{validateAddress:d}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("AuthenticationService",function(c,d,e){function f(){var b=a('[data-plenty-checkout="lostPasswordForm"]');if(b.validateForm()){var d=b.getFormValues(),e={Email:d.Email};return c.post("/rest/checkout/lostpassword/",e).done(function(b){1==b.data.IsMailSend&&(a('[data-plenty-checkout="lostPasswordTextContainer"]').hide(),a('[data-plenty-checkout="lostPasswordSuccessMessage"]').show())})}}function g(a){if(a.validateForm()){var b=a.getFormValues(),d={Email:b.loginMail,Password:b.loginPassword};return e.showWaitScreen(),c.post("/rest/checkout/login/",d).done(function(){window.location.assign(a.attr("action"))})}}function h(a){return c.post("/rest/checkout/customerinvoiceaddress/",a).done(function(a){d.getCheckout().CustomerInvoiceAddress=a.data})}function i(){var c=a('[data-plenty-checkout-form="customerRegistration"]');if(c.validateForm()&&b.getInstance().AddressDoctorService.validateAddress()){var d=c.getFormValues();if(d.LoginType=2,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var f in e)e[f]&&d.CustomerPropertiesList.push({PropertyID:f,PropertyValue:e[f]})}return h(d).done(function(){window.location.assign(c.attr("action"))})}}return{resetPassword:f,customerLogin:g,setInvoiceAddress:h,registerCustomer:i}},["APIFactory","CheckoutFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("BasketService",function(c,d,e,f,g){function h(d){d&&c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:d[0].BasketItemItemID,quantity:d[0].BasketItemQuantity},!1,!0).done(function(c){c.data[0].indexOf("form-group")>0?g.prepare().setContent(c.data[0]).setTitle(b.translate("Select order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(j(i(d)),!0):!1}).show():j(d)})}function i(b){var c,d=a('[data-plenty-checkout-form="OrderParamsForm"]'),e={},f="";return d.find('[name^="ParamGroup"]').each(function(){c=this.name.match(/^ParamGroup\[(\d+)]\[(\d+)]$/),b=m(b,c[1],a(this).val(),a(this).val())}),d.find('[name^="ParamValue"]').each(function(){if(e=a(this),f=e.attr("type"),("checkbox"==f&&e.is(":checked")||"radio"==f&&e.is(":checked")||"radio"!=f&&"checkbox"!=f)&&"file"!=f&&"hidden"!=f){var c=e[0].name.match(/^ParamValue\[(\d+)]\[(\d+)]$/);b=m(b,c[1],c[2],e.val())}else if("file"==f)if(e[0].files&&e[0].files.length>0)b=l(e,b);else{var c=e[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/),d=a('input[type="hidden"][name="ParamValue['+c[1]+"]["+c[2]+']"]').val();b=m(b,c[1],c[2],d)}}),b}function j(a){c.post("/rest/checkout/basketitemslist/",a,!0).done(function(){f.loadCheckout().done(function(){s(),e.getContainer("ItemViewItemToBasketConfirmationOverlay",{ArticleID:a[0].BasketItemItemID}).from("ItemView").done(function(a){var c=b.getGlobal("TimeoutItemToBasketOverlay",5e3),d=g.prepare().setContent(a.data[0]);c>0&&d.setTimeout(c),d.show()})})}).fail(function(a){d.printErrors(JSON.parse(a.responseText).error.error_stack)})}function k(a){c.put("/rest/checkout/basketitemslist/",a).done(function(){f.reloadCatContent(b.getGlobal("basketCatID")),f.loadCheckout().done(function(){s()})})}function l(a,b){var d,e,f=a[0].id,g={},h=[],i={type:"POST",data:{},isFile:!0,cache:!1,dataType:"json",processData:!1,contentType:!1};g[f]=a[0].files,-1==h.indexOf(f)&&h.push(f);for(var j=0,k=h.length;k>j;++j)d=new FormData,e=g[h[j]],d.append("0",e[0],e[0].name),i.data=d,c.post("/rest/checkout/orderparamfile/",i);var l=a[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/);return m(b,l[1],l[2],g[f][0].name)}function m(b,c,d,e){return c>0&&void 0==b[c]&&(b[c]=a.extend(!0,{},b[0]),b[c].BasketItemOrderParamsList=[]),void 0!=b[c]&&(b[c].BasketItemQuantity=1,void 0==b[c].BasketItemOrderParamsList&&(b[c].BasketItemOrderParamsList=[]),e&&b[c].BasketItemOrderParamsList.push({BasketItemOrderParamID:d,BasketItemOrderParamValue:e})),b}function n(b){var c=a('[data-plenty-basket-item="'+b+'"]');c.modal("show"),c.find('[data-plenty-modal="confirm"]').on("click",function(){var d=p(b),e=[];c.find('select, .PlentyFormContainer.AttrImage > input[type="hidden"]').each(function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&e.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=e.length&&(d.BasketItemAttributesList=e),k([d])})}function o(d){var e=p(d);e.BasketItemOrderParamsList=[],c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:e.BasketItemItemID,quantity:e.BasketItemQuantity,basketItemID:d}).done(function(c){g.prepare().setContent(c.data[0]).setTitle(b.translate("Edit order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(k(i([e])),!0):!1}).show()})}function p(a){for(var b=f.getCheckout().BasketItemsList,c=0;c=0?c.get("/rest/checkout/container_checkoutbasketitemslist/").done(function(c){var d=a("[data-basket-item-id]").parents("ul"),e=d.parents(".panel-body");d.fadeOut(function(){a(this).siblings(":not('[data-plenty-checkout-template]')").remove(),a(this).remove(),e.prepend(a(c.data[0])).hide().fadeIn(function(){b.getInstance().bindDirectives(e)})})}):f.reloadContainer("BasketItemsList"),f.reloadContainer("Totals")),s(),i.resolve()})})}var i=a.Deferred(),j=p(d).BasketItemNameMap[1];return e?h():g.prepare().setTitle(b.translate("Please confirm")).setContent("

    "+b.translate('Do you really want to remove "{{item}}" from your basket?',{item:j})+"

    ").onDismiss(function(){i.reject()}).onConfirm(function(){h()}).setLabelConfirm(b.translate("Delete")).show(),i}function r(d,e){if(0>=e)return q(d);for(var g,h,i=a.Deferred(),j=f.getCheckout().BasketItemsList,k=0;k0&&f.reloadContainer("Totals")}return{addItem:h,removeItem:q,getItem:p,setItemQuantity:r,editItemAttributes:n,editOrderParams:o,addCoupon:t,removeCoupon:u}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("CheckoutService",function(c,d,e,f,g){function h(){f.loadCheckout(!0)}function i(){var b=a('[data-plenty-checkout-form="details"]'),d=b.getFormValues();return f.getCheckout().CheckoutCustomerSign||(f.getCheckout().CheckoutCustomerSign=""),f.getCheckout().CheckoutOrderInfoText||(f.getCheckout().CheckoutOrderInfoText=""),f.getCheckout().CheckoutCustomerSign!==d.CustomerSign&&a(b).find('[name="CustomerSign"]').length>0||f.getCheckout().CheckoutOrderInfoText!==d.OrderInfoText&&a(b).find('[name="OrderInfoText"]').length>0?(f.getCheckout().CheckoutCustomerSign=d.CustomerSign,f.getCheckout().CheckoutOrderInfoText=d.OrderInfoText,f.setCheckout()):c.idle()}function j(d){var e=a('[data-plenty-checkout-form="shippingAddress"]');if(!d&&!e.validateForm())return!1;if(!d&&!b.getInstance().AddressDoctorService.validateAddress(e))return!1;var g=e.getFormValues(),h=a('[name="shippingAddressID"]:checked').val();if(0>h){var i=g;return m(i,f.getCheckout().CustomerShippingAddress)?c.idle():("PACKSTATION"==i.Street?(i.IsPackstation=1,i.PackstationNo=i.HouseNo):"POSTFILIALE"==i.Street&&(i.IsPostfiliale=1,i.PostfilialNo=i.HouseNo),c.post("/rest/checkout/customershippingaddress/",i).done(function(a){f.getCheckout().CheckoutCustomerShippingAddressID=a.data.ID,f.getCheckout().CheckoutShippingCountryID=a.data.CountryID,k()}))}return h==f.getCheckout().CheckoutCustomerShippingAddressID?c.idle():(f.getCheckout().CheckoutCustomerShippingAddressID=h,void k())}function k(){return delete f.getCheckout().CheckoutMethodOfPaymentID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList"),f.reloadContainer("ShippingProfilesList"),2==f.getCheckout().CustomerInvoiceAddress.LoginType&&f.reloadContainer("CustomerShippingAddress"),a("#shippingAdressSelect").modal("hide"),a(".modal-backdrop")&&a(".modal-backdrop").remove()})}function l(){var b=a('[data-plenty-checkout-form="guestRegistration"]'),d=b.getFormValues();if(d.LoginType=1,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var g in e)e[g]&&d.CustomerPropertiesList.push({PropertyID:g,PropertyValue:e[g]})}return m(d,f.getCheckout().CustomerInvoiceAddress)?j():c.post("/rest/checkout/customerinvoiceaddress/",d).done(function(a){j().done(f.loadCheckout)})}function m(a,b){for(var c in a)if(a[c]+""!=b[c]+""&&"EmailRepeat"!==c)return!1;return!0}function n(){var b=a('[data-plenty-checkout-form="shippingProfileSelect"]').getFormValues();return f.getCheckout().CheckoutShippingProfileID=b.ShippingProfileID,delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutMethodOfPaymentID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList")})}function o(){var b=f.getCheckout().CheckoutMethodOfPaymentID,e=a('input[type="radio"][name="MethodOfPaymentID"][value="'+b+'"]').parent().getFormValues();return c.post("/rest/checkout/preparepayment/",e,!0).done(function(b){if(""!=b.data.CheckoutMethodOfPaymentRedirectURL)document.location.assign(b.data.CheckoutMethodOfPaymentRedirectURL);else if(b.data.CheckoutMethodOfPaymentAdditionalContent){var c=a(b.data.CheckoutMethodOfPaymentAdditionalContent).find('[data-plenty-checkout-form="bankDetails"]').length>0;g.prepare().setContent(b.data.CheckoutMethodOfPaymentAdditionalContent).onConfirm(function(){return c?s():u()}).show()}}).fail(function(b){try{for(var c=a.parseJSON(b.responseText),e=[],g=0;g0&&d.printErrors(e)}catch(h){d.throwError(b.status,b.statusText)}})}function p(c){return c||(c=a('input[name="MethodOfPaymentID"]:checked').val()),f.getCheckout().CheckoutMethodOfPaymentID=c,b.getGlobal("Checkout.AtrigaRequireUserConfirmation")||(f.getCheckout().CheckoutAtrigapaymaxChecked=!0),delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("ShippingProfilesList")})}function q(a){return f.getCheckout().CheckoutAtrigapaymaxChecked=!!a,c.put("/rest/checkout",{CheckoutAtrigapaymaxChecked:!!a})}function r(){e.getContainer("CheckoutPaymentInformationBankDetails").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return s()}).show()})}function s(){var b=a('[data-plenty-checkout-form="bankDetails"]');if(b.validateForm()){var d=b.getFormValues().checkout.customerBankDetails,e={CustomerBankName:d.bankName,CustomerBLZ:d.blz,CustomerAccountNumber:d.accountNo,CustomerAccountOwner:d.accountOwner,CustomerIBAN:d.iban,CustomerBIC:d.bic};return c.post("/rest/checkout/paymentinformationbankdetails/",e).done(function(){f.loadCheckout().done(function(){p(3),f.reloadContainer("MethodsOfPaymentList")})}),!0}return!1}function t(){e.getContainer("CheckoutPaymentInformationCreditCard").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return u()}).show()})}function u(){var b=a('[data-plenty-checkout-form="creditCard"]');if(b.validateForm()){var d=b.getFormValues().checkout.paymentInformationCC,e={Owner:d.owner,Cvv2:d.cvv2,Number:d.number,Year:d.year,Month:d.month,Provider:d.provider};return c.post("/rest/checkout/paymentinformationcreditcard/",e).done(function(){f.loadCheckout()}),!0}return!1}function v(b){if(2==f.getCheckout().CustomerInvoiceAddress.LoginType)var c=a('[data-plenty-checkout-form="shippingAddress"]').getFormValues();else var c=a('[data-plenty-checkout-form="guestRegistration"]').getFormValues();var d={street:c.Street,houseNo:c.HouseNo,ZIP:c.ZIP,city:c.City,postnummer:c.Postnummer,suggestionType:"postfinder"};e.getContainer("CheckoutAddressSuggestionResultsList",d).from("Checkout").done(function(a){g.prepare().setContent(a.data[0]).show()})}function w(){var b=a('[data-plenty-checkout-form="placeOrder"]');if(b.validateForm()){var d=b.getFormValues(),e={TermsAndConditionsCheck:d.termsAndConditionsCheck||0,WithdrawalCheck:d.withdrawalCheck||0,PrivacyPolicyCheck:d.privacyPolicyCheck||0,AgeRestrictionCheck:d.ageRestrictionCheck||0,NewsletterCheck:d.newsletterCheck||0,KlarnaTermsAndConditionsCheck:d.klarnaTermsAndConditionsCheck||0,PayoneDirectDebitMandateCheck:d.payoneDirectDebitMandateCheck||0,PayoneInvoiceCheck:d.payoneInvoiceCheck||0};return c.post("/rest/checkout/placeorder/",e).done(function(a){""!=a.data.MethodOfPaymentRedirectURL?window.location.assign(a.data.MethodOfPaymentRedirectURL):""!=a.data.MethodOfPaymentAdditionalContent?g.prepare().setContent(a.data.MethodOfPaymentAdditionalContent).setLabelDismiss("").onDismiss(function(){window.location.assign(b.attr("action"))}).onConfirm(function(){window.location.assign(b.attr("action"))}).show():window.location.assign(b.attr("action"))})}}return{init:h,setCustomerSignAndInfo:i,registerGuest:l,setShippingProfile:n,saveShippingAddress:j,loadAddressSuggestion:v,preparePayment:o,setMethodOfPayment:p,confirmAtrigaPaymax:q,editBankDetails:r,editCreditCard:t,placeOrder:w}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("FeedbackService",function(a){function b(){function b(a,b){return e.dateStart=a,e.dateEnd=b,this}function c(b,c,f){var g={ReferenceId:c,FromDate:e.dateStart,ToDate:e.dateEnd,FeedbackType:f||d().COMMENTS_AND_RATINGS};return a.get("/rest/feedback/"+b+"/",g)}var e={dateStart:null,dateEnd:null};return{between:b,"for":c}}function c(){function b(a){return f.Rating=a,this}function c(a){return f.Text=a,this}function d(a,b,c){return f.Author=a,b&&(f.Email=b),c&&(f.CustomerId=c),this}function e(b,c){return a.post("/rest/feedback/"+b+"/",f)}var f={Rating:1,Text:"",Author:"",Email:"",CustomerId:0};return{withRating:b,withComment:c,withAuthor:d,to:e}}function d(){return{COMMENTS_ONLY:"comments_only",RATINGS_ONLY:"ratings_only",COMMENTS_AND_RATINGS:"comments_with_ratings"}}function e(){return{ITEM:"item",CATEGORY:"category",BLOG:"blog"}}return{getFeedbacks:b,addFeedback:c,ArticleTypes:e(),FeedbackTypes:d()}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("MediaSizeService",function(){function b(){return e&&c(),e}function c(){var b;if(b=window.matchMedia?window.matchMedia("(min-width:1200px)").matches?"lg":window.matchMedia("(min-width:992px)").matches?"md":window.matchMedia("(min-width:768px)").matches?"sm":"xs":a(window).width()>=1200?"lg":a(window).width()>=992?"md":a(window).width()>=768?"sm":"xs",b!=e||"xs"===b){var c=e;e=b,a(window).trigger("sizeChange",[e,c])}}function d(a){for(var b=a.replace(/\s/g,"").split(","),c=0;c li'),r=a('[data-plenty-checkout="container"] > div'),u=a('[data-plenty-checkout="next"]'),t=a('[data-plenty-checkout="prev"]'),q.length==r.length&&r.length>0){d.getCheckout();r.hide(),q.each(function(b,c){a(c).addClass("disabled"),a(c).click(function(){a(this).is(".disabled")||j(b)})}),u.attr("disabled","disabled"),u.click(function(){m()}),t.attr("disabled","disabled"),t.click(function(){n()}),window.addEventListener("hashchange",function(){window.location.hash.length>0?o(window.location.hash):j(0)},!1),a.urlParam=function(a){var b=new RegExp("[?&]"+a+"=([^&#]*)").exec(window.location.href);return null==b?null:b[1]||0};var c=a.urlParam("gototab");0==window.location.hash.length&&c&&a('[data-plenty-checkout-id="'+c+'"]').length>0?window.location.hash=c:j(!o(window.location.hash)&&s>=0?s:0),p(),a(window).on("sizeChange",p),a(window).resize(function(){"xs"==b.getInstance().MediaSizeService.interval()&&p()})}}function f(){return s>=0?{id:a(r[s]).attr("data-plenty-checkout-id"),index:s}:null}function g(a){return v.beforeChange.push(a),b.getInstance().NavigatorService}function h(a){return v.afterChange.push(a),b.getInstance().NavigatorService}function i(b,c){var d=!0;if(s>=0||"afterChange"===b){var e=f(),g={index:c,id:a(r[c]).attr("data-plenty-checkout-id")};a.each(v[b],function(a,b){return b(e,g)===!1?(d=!1,!1):void 0})}return d}function j(e,f){var g=s!==e;(!g||f||i("beforeChange",e))&&(s=e,!Object.equals(w[s],d.getCheckout(!0))&&g&&a(r[s]).attr("data-plenty-checkout-content")?(w[s]=d.getCheckout(!0),c.getCategoryContent(a(r[s]).attr("data-plenty-checkout-content")).done(function(c){a(r[s]).html(c.data[0]),k(g),b.getInstance().bindDirectives(r[s]),a(window).trigger("contentChanged")})):k(g))}function k(b){a(r).hide();var c;a(q).each(function(b,d){c=a(d),c.removeClass("disabled active"),c.find('[role="tab"]').attr("aria-selected","false"),s>b?c.addClass("visited"):b==s?(c.addClass("active visited"),c.find('[role="tab"]').attr("aria-selected","true")):b>s&&!c.is(".visited")&&c.addClass("disabled")}),p(),0>=s?t.attr("disabled","disabled"):t.removeAttr("disabled"),s+1==q.length?u.attr("disabled","disabled"):u.removeAttr("disabled"),a(r[s]).show(),s>0?window.location.hash=a(r[s]).attr("data-plenty-checkout-id"):window.location.hash.length>0&&(window.location.hash=""),b&&i("afterChange",s)}function l(a){j(a.index,!0)}function m(){s0&&j(s-1)}function o(b){return"next"==b?(m(),!0):"prev"==b?(n(),!0):(b=b.replace("#",""),a(r).each(function(c,d){return a(d).attr("data-plenty-checkout-id")==b?(j(c),!0):void 0}),!1)}function p(){var b=q.length;if(!(0>=b)){a(q).removeAttr("style"),a(q).children("span").removeAttr("style"),a(u).removeAttr("style"),a(t).removeAttr("style");var c=a(t).outerWidth()c?a(d).children("span").css({paddingLeft:g+"px",paddingRight:h+"px"}):a(d).children("span").css({paddingLeft:j+"px",paddingRight:k+"px"})})}}var q=[],r=[],s=-1,t={},u={},v={beforeChange:[],afterChange:[]},w=[];return{init:e,getCurrentContainer:f,goTo:j,beforeChange:g,afterChange:h,continueChange:l,next:m,previous:n,goToID:o,fillNavigation:p}},["CMSFactory","CheckoutFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("PostfinderService",function(c,d,e){function f(){var b=a('input[name="Street"]').val();return"PACKSTATION"==b.toUpperCase()||"POSTFILIALE"==b.toUpperCase()}function g(){j={PostfinderItemStreet:a('input[name="Street"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemZIP:a('input[name="ZIP"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemCity:a('input[name="City"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemHouseNo:a('input[name="HouseNo"]','[data-plenty-checkout-form="shippingAddress"]')},j.PostfinderItemStreet.val(""),j.PostfinderItemZIP.val().length>2||j.PostfinderItemCity.val().length>2?c.get("/rest/checkout/shippingaddresspostfinderlist/",{suggestionType:"postfinder",zip:j.PostfinderItemZIP.val(),city:j.PostfinderItemCity.val()}).done(function(c){l=c.data,k=l.length,0==k&&h();for(var e={addresses:[]},f=0;k>f;f++){var g="km",m=l[f].PostfinderItemDistance,n=m/1e3;n=(Math.round(100*n)/100).toFixed(2).replace(".",","),1e3>m&&(n=m,g="m"),e.addresses.push({index:f,dimension:g,type:l[f].PostfinderItemIsPackstation?"Packstation":"Postfiliale",number:l[f].PostfinderItemIsPackstation?l[f].PostfinderItemPackstationNo:l[f].PostfinderItemPostfilialNo,street:l[f].PostfinderItemStreet,houseNo:l[f].PostfinderItemHouseNo,zip:l[f].PostfinderItemZIP,city:l[f].PostfinderItemCity,district:l[f].PostfinderItemDistrict,distance:n,remark:l[f].PostfinderItemRemark})}var o=b.compileTemplate("addressSuggestions/postFinder.html",e);d.prepare().setTitle(b.translate("Packstations and post offices in your area")).setContent(o).setClass("checkout").onConfirm(function(){return j.PostfinderItemCity.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemZIP.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemStreet.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemStreet.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemHouseNo.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemHouseNo.attr("id")+'"]').removeClass("has-error").addClass("has-success"),i=a('input[type="radio"][name="postfinder"]:checked').val(),l[i].PostfinderItemIsPackstation?(a(j.PostfinderItemStreet).val("PACKSTATION"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPackstationNo)):(a(j.PostfinderItemStreet).val("POSTFILIALE"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPostfilialNo)),a(j.PostfinderItemStreet).trigger("change"),a(j.PostfinderItemCity).val(l[i].PostfinderItemCity),a(j.PostfinderItemZIP).val(l[i].PostfinderItemZIP),!0}).show()}):h()}function h(){e.throwError(0,b.translate("Please enter a ZIP code and/or a city.")),j.PostfinderItemCity.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemZIP.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemCity.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")}),j.PostfinderItemZIP.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")})}var i="",j={},k={},l={};return{openPostfinderModal:g,isPackstation:f}},["APIFactory","ModalFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("SocialShareService",function(){function b(a){var b={"facebook-like":'',"facebook-recommend":'',twitter:'',"google-plus":'
    '};return b[a]}function c(){var b=document.location.href,c=a("link[rel=canonical]").attr("href");return c&&c.length>0&&(c.indexOf("http")<0&&(c=document.location.protocol+"//"+document.location.host+c),b=c),b}function d(b){var c=a('meta[name="'+b+'"]').attr("content");return c||""}function e(){var b=d("DC.title"),c=d("DC.creator");return b.length>0&&c.length>0?b+=" - "+c:b=a("title").text(),encodeURIComponent(b)}return"undefined"==typeof socialLangLocale&&(socialLangLocale="en_US"),"undefined"==typeof socialLang&&(socialLang="en"),{getSocialService:b}})}(jQuery,PlentyFramework),function(a,b){b.service("ValidationService",function(){function b(b){return b=a(b),b.is("input")||b.is("select")||b.is("textarea")?b:b.find("input").length>0?b.find("input"):b.find("select").length>0?b.find("select"):b.find("textarea").length>0?b.find("textarea"):null}function c(b){return b.is("input")||b.is("select")||b.is("textarea")?a.trim(b.val()).length>0:(console.error("Validation Error: Cannot validate Text for <"+b.prop("tagName")+">"),!1)}function d(b){var d=/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;return c(b)?d.test(a.trim(b.val())):!1}function e(b){return c(b)?a.isNumeric(a.trim(b.val())):!1}function f(b,c){return a(c).length>0?a.trim(b.val())==a.trim(a(c).val()):a.trim(b.val())==c}function g(a){return a.is(":visible")}function h(a){return a.is(":enabled")}function i(i,j){var k,l,m,n,o,p,q,r,s,t,u,v=a(i);j=j||"has-error";var w=[],x=!1;v.find("[data-plenty-validate], :required").each(function(i,y){s=a(y).attr("data-plenty-validate"),l=b(y),t=s?s:"text",t=t.split(",");for(var i=0,z=l.length;z>i;i++){if(k=a(l[i]),u=k.attr("type"),!g(k)||!h(k))return;if(m=t[i].trim()||t[0].trim(),n=!1,k.is("input")&&"radio"!=u&&"checkbox"!=u||k.is("textarea"))switch(m){case"text":n=!c(k);break;case"mail":n=!d(k);break;case"number":n=!e(k);break;case"value":n=!f(k,a(y).attr("data-plenty-validation-value"));break;case"none":break;default:console.error('Form validation error: unknown validate property: "'+s+'"')}else if(!k.is("input")||"radio"!=u&&"checkbox"!=u){if(!k.is("select"))return void console.error("Form validation error: "+a(y).prop("tagName")+" does not contain an form element");n=""==k.val()||"-1"==k.val()}else{if(o=k.attr("name"),p=v.find('input[name="'+o+'"]:checked').length,"radio"==u)q=1,r=1;else{var A=new Function("return "+s)()||{min:1,max:1};q=A.min,r=A.max}n=q>p||p>r}n&&(x=!0,w.push(k),l.length>1?(k.addClass(j),v.find('label[for="'+k.attr("id")+'"]').addClass(j)):a(y).addClass(j))}}),v.on("validationFailed",function(){var b=50,c=v.find("."+j).first(),d=c.offset().top,e=a("html, body");v.parents(".modal").length>0?(e=v.parents(".modal").find(".modal-body"), +d=e.scrollTop()-(e.offset().top-c.offset().top)):v.is(".modal")&&(e=v.find(".modal-body"),d=e.scrollTop()-(e.offset().top-c.offset().top)),(d-bwindow.pageYOffset+window.innerHeight)&&e.animate({scrollTop:d-b})}),x&&(v.find("."+j).each(function(c,d){k=a(b(d)),k.on("focus click",function(){var b=a(d);b.removeClass(j),v.find('label[for="'+a(this).attr("id")+'"]').removeClass(j)})}),v.trigger("validationFailed",[w]));var y=v.attr("data-plenty-callback");if(!x&&y&&"submit"!=y&&"function"==typeof window[y]){var z={};return v.find("input, textarea, select").each(function(){"checkbox"==a(this).attr("type")?z[a(this).attr("name")]=a(this).is(":checked"):z[a(this).attr("name")]=a(this).val()}),window[y](z),!1}return!x}return{validate:i}}),a.fn.validateForm=function(){return b.getInstance().ValidationService.validate(this)},a.fn.getFormValues=function(){function b(b,c){var e=b.match(/^([^\[]+)(.*)/);if(e[2]){var f,g=/\[([^\]]+)]/g,h=[];for(h[0]=e[1];null!==(f=g.exec(e[2]));)h.push(f[1]);for(var i=h.length-1;i>=0;i--){var j={};j[h[i]]=c,c=j}d=a.extend(!0,d,c)}else d[e[1]]=c}var c=this,d={};return c.find("input, select, textarea").each(function(d,e){if(a(e).attr("name"))if("checkbox"==a(e).attr("type")){var f=[];a(c).find('[name="'+a(e).attr("name")+'"]:checked').each(function(b,c){f.push(a(c).val())}),b(a(e).attr("name"),f)}else"radio"==a(e).attr("type")?a(e).is(":checked")&&b(a(e).attr("name"),a(e).val()):b(a(e).attr("name"),a(e).val())}),d}}(jQuery,PlentyFramework),PlentyFramework.compile();var plenty=PlentyFramework.getInstance();jQuery(document).ready(function(){plenty.bindDirectives()}); //# sourceMappingURL=plentymarketsCMStools-1.0.8.min.js.map \ No newline at end of file diff --git a/dist/plentymarketsCMStools-1.0.8.min.js.map b/dist/plentymarketsCMStools-1.0.8.min.js.map index 25c93cc..ac92fe3 100644 --- a/dist/plentymarketsCMStools-1.0.8.min.js.map +++ b/dist/plentymarketsCMStools-1.0.8.min.js.map @@ -291,6 +291,8 @@ "$current", "target", "removeClass", + "unbind", + "resetEvent", "openDropdown", "alwaysClickable", "$parent", @@ -923,8 +925,8 @@ "checkbox", "plenty" ], - "mappings": ";;;;;;;;AAAA,GAAIA,iBAEJA,eAAc,yCAA2C,gMAUzDA,cAAc,sCAAwC,gsBA4BtDA,cAAc,2BAA6B,kMAM3CA,cAAc,yBAA2B,qRASzCA,cAAc,oBAAsB,qoCAgCpCA,cAAc,8BAAgC,iEAE9C,SAAyBC,EAAOC,GAA6B,gBAAVC,UAAoBA,SAAmC,gBAAnBA,SAAQC,SAAqBF,EAAQC,SAAiC,kBAATE,SAAqBA,OAAOC,IAAKD,QAAQ,WAAWH,IAAcD,EAAOM,YAAYL,EAAQK,YAAaC,KAAK,SAAyBC,GAA0K,QAASC,GAAWC,GAAQ,MAAuB,kBAATA,GAAoB,QAASC,GAAQC,GAAK,MAAOC,GAAQD,GAAK,cAAeA,GAAI,QAASE,GAAaC,GAAQ,MAAOA,GAAOC,QAAQ,8BAA8B,QAAQ,QAASC,GAAYL,EAAIM,GAAU,MAAY,OAALN,GAAwB,gBAANA,IAAgBM,IAAYN,GAAyC,QAASO,GAAWC,EAAGL,GAAQ,MAAOM,GAAWC,KAAKF,EAAGL,GAA4B,QAASQ,GAAaR,GAAQ,OAAOI,EAAWK,EAAWT,GAAgG,QAASU,GAAWV,GAAQ,MAAOW,QAAOX,GAAQC,QAAQ,aAAa,SAAuBW,GAAG,MAAOC,GAAUD,KAAgH,QAASE,GAAcC,EAASC,GAA4G,QAASC,KAAa,GAAGC,IAASC,EAAU,KAAMC,EAAOC,cAAcC,GAAOF,EAAOG,WAAYH,KAAUF,IAAO,EAAMC,GAAS,EAAmD,QAASK,GAAYC,GAA+F,GAAtD,gBAAhBA,KAAyBA,EAAcA,EAAcC,MAAMC,EAAQ,KAAO7B,EAAQ2B,IAAuC,IAAvBA,EAAcJ,OAAW,KAAM,IAAIO,OAAM,iBAAiBH,EAAeI,GAAa,GAAIC,QAAO/B,EAAa0B,EAAc,IAAI,QAAQM,EAAa,GAAID,QAAO,OAAO/B,EAAa0B,EAAc,KAAKO,EAAe,GAAIF,QAAO,OAAO/B,EAAa,IAAI0B,EAAc,KAAjrB,IAAIV,EAAS,QAAS,IAA2Nc,GAAaE,EAAaC,EAAjPC,KAAgBX,KAAcF,KAAcF,GAAO,EAAUC,GAAS,CAAslBK,GAAYR,GAAMvB,EAASuB,KAAmF,KAA7E,GAAsCkB,GAAMC,EAAKC,EAAMC,EAAIC,EAAMC,EAA7DC,EAAQ,GAAIC,GAAQ1B,IAA4DyB,EAAQE,OAAM,CAAyD,GAAxDR,EAAMM,EAAQG,IAAIP,EAAMI,EAAQI,UAAUf,GAAwB,IAAI,GAAIgB,GAAE,EAAEC,EAAYV,EAAMf,OAASyB,EAAFD,IAAgBA,EAAGR,EAAID,EAAMW,OAAOF,GAAMrC,EAAa6B,GAAMjB,EAAO4B,KAAK1B,EAAOD,QAAaF,GAAS,EAAKG,EAAO0B,MAAM,OAAOX,EAAIH,EAAMA,EAAM,IAAIA,GAAO,EAAW,OAANG,GAAWpB,GAAc,KAAIuB,EAAQS,KAAKpB,GAAc,KAAuV,IAAjVX,GAAO,EAAKiB,EAAKK,EAAQS,KAAKC,IAAQ,OAAOV,EAAQS,KAAKE,GAAmB,MAAPhB,GAAYC,EAAMI,EAAQI,UAAUQ,GAAUZ,EAAQS,KAAKG,GAAUZ,EAAQI,UAAUb,IAA6B,MAAPI,GAAYC,EAAMI,EAAQI,UAAUZ,GAAgBQ,EAAQS,KAAKI,GAASb,EAAQI,UAAUb,GAAcI,EAAK,KAASC,EAAMI,EAAQI,UAAUb,IAAkBS,EAAQS,KAAKlB,GAAc,KAAM,IAAIH,OAAM,mBAAmBY,EAAQG,IAA6D,IAAxDL,GAAOH,EAAKC,EAAMF,EAAMM,EAAQG,KAAKrB,EAAO0B,KAAKV,GAAiB,MAAPH,GAAmB,MAAPA,EAAYF,EAASe,KAAKV,OAAY,IAAU,MAAPH,EAAW,CAA4B,GAA3BI,EAAYN,EAASV,OAAUgB,EAAY,KAAM,IAAIX,OAAM,qBAAqBQ,EAAM,QAAQF,EAAO,IAAGK,EAAY,KAAKH,EAAM,KAAM,IAAIR,OAAM,qBAAqBW,EAAY,GAAG,QAAQL,OAAsB,SAAPC,GAAsB,MAAPA,GAAmB,MAAPA,EAAYhB,GAAS,EAAoB,MAAPgB,GAAYX,EAAYY,GAAmC,GAA3BG,EAAYN,EAASV,MAAqB,KAAM,IAAIK,OAAM,qBAAqBW,EAAY,GAAG,QAAQC,EAAQG,IAAK,OAAOW,GAAWC,EAAajC,IAAS,QAASiC,GAAajC,GAAkD,IAAI,GAApBgB,GAAMkB,EAA5BC,KAA8CZ,EAAE,EAAEa,EAAUpC,EAAOD,OAASqC,EAAFb,IAAcA,EAAGP,EAAMhB,EAAOuB,GAAMP,IAAqB,SAAXA,EAAM,IAAakB,GAA0B,SAAfA,EAAU,IAAaA,EAAU,IAAIlB,EAAM,GAAGkB,EAAU,GAAGlB,EAAM,KAAQmB,EAAeT,KAAKV,GAAOkB,EAAUlB,GAAQ,OAAOmB,GAAe,QAASH,GAAWhC,GAAyF,IAAI,GAAlBgB,GAAMqB,EAArEC,KAAoBC,EAAUD,EAAiB3B,KAAsCY,EAAE,EAAEa,EAAUpC,EAAOD,OAASqC,EAAFb,IAAcA,EAAmB,OAAhBP,EAAMhB,EAAOuB,GAAUP,EAAM,IAAI,IAAI,IAAI,IAAI,IAAIuB,EAAUb,KAAKV,GAAOL,EAASe,KAAKV,GAAOuB,EAAUvB,EAAM,KAAM,MAAM,KAAI,IAAIqB,EAAQ1B,EAASV,MAAMoC,EAAQ,GAAGrB,EAAM,GAAGuB,EAAU5B,EAASZ,OAAO,EAAEY,EAASA,EAASZ,OAAO,GAAG,GAAGuC,CAAa,MAAM,SAAQC,EAAUb,KAAKV,GAAQ,MAAOsB,GAAa,QAASnB,GAAQzC,GAAQR,KAAKQ,OAAOA,EAAOR,KAAKsE,KAAK9D,EAAOR,KAAKmD,IAAI,EAA4iB,QAASoB,GAAQC,EAAKC,GAAezE,KAAKwE,KAAKA,EAAKxE,KAAK0E,OAAOC,IAAI3E,KAAKwE,MAAMxE,KAAK4E,OAAOH,EAA2qB,QAASI,KAAS7E,KAAK0E,SAA3uK,GAAII,GAAeC,OAAOC,UAAUC,SAAa3E,EAAQ4E,MAAM5E,SAAS,SAAyBH,GAAQ,MAAqC,mBAA9B2E,EAAe/D,KAAKZ,IAAiVW,EAAWwB,OAAO0C,UAAUG,KAA0ElE,EAAW,KAA4EI,GAAW+D,IAAI,QAAQC,IAAI,OAAOC,IAAI,OAAOC,IAAI,SAASC,IAAI,QAAQC,IAAI,UAAqI9B,EAAQ,MAAUxB,EAAQ,MAAUyB,EAAS,OAAWC,EAAQ,QAAYH,EAAM,oBAAi/FT,GAAQ+B,UAAU9B,IAAI,WAAe,MAAmB,KAAZlD,KAAKsE,MAAWrB,EAAQ+B,UAAUvB,KAAK,SAAc5C,GAAI,GAAI6E,GAAM1F,KAAKsE,KAAKoB,MAAM7E,EAAI,KAAI6E,GAAqB,IAAdA,EAAMC,MAAU,MAAM,EAAG,IAAInF,GAAOkF,EAAM,EAAwE,OAArE1F,MAAKsE,KAAKtE,KAAKsE,KAAKsB,UAAUpF,EAAOqB,QAAQ7B,KAAKmD,KAAK3C,EAAOqB,OAAcrB,GAAQyC,EAAQ+B,UAAU5B,UAAU,SAAmBvC,GAAI,GAA+B6E,GAA3BC,EAAM3F,KAAKsE,KAAKuB,OAAOhF,EAAU,QAAO8E,GAAO,IAAI,GAAGD,EAAM1F,KAAKsE,KAAKtE,KAAKsE,KAAK,EAAG,MAAM,KAAK,GAAEoB,EAAM,EAAG,MAAM,SAAQA,EAAM1F,KAAKsE,KAAKsB,UAAU,EAAED,GAAO3F,KAAKsE,KAAKtE,KAAKsE,KAAKsB,UAAUD,GAA8B,MAAvB3F,MAAKmD,KAAKuC,EAAM7D,OAAc6D,GAAgHnB,EAAQS,UAAUxB,KAAK,SAAcgB,GAAM,MAAO,IAAID,GAAQC,EAAKxE,OAAOuE,EAAQS,UAAUc,OAAO,SAAgBC,GAAM,GAAyBnD,GAArB8B,EAAM1E,KAAK0E,KAAgB,IAAGA,EAAMsB,eAAeD,GAAOnD,EAAM8B,EAAMqB,OAAU,CAA8C,IAA7C,GAAiBE,GAAMN,EAAnBO,EAAQlG,KAAiBmG,GAAU,EAAYD,GAAQ,CAAC,GAAGH,EAAKK,QAAQ,KAAK,EAAoD,IAAjDxD,EAAMsD,EAAQ1B,KAAKyB,EAAMF,EAAK7D,MAAM,KAAKyD,EAAM,EAAe,MAAP/C,GAAa+C,EAAMM,EAAMpE,QAAW8D,IAAQM,EAAMpE,OAAO,IAAEsE,EAAUzF,EAAYkC,EAAMqD,EAAMN,KAAQ/C,EAAMA,EAAMqD,EAAMN,UAAgB/C,GAAMsD,EAAQ1B,KAAKuB,GAAMI,EAAUzF,EAAYwF,EAAQ1B,KAAKuB,EAAM,IAAGI,EAAU,KAAMD,GAAQA,EAAQtB,OAAOF,EAAMqB,GAAMnD,EAAuD,MAA9C1C,GAAW0C,KAAOA,EAAMA,EAAM7B,KAAKf,KAAKwE,OAAa5B,GAAuCiC,EAAOG,UAAUqB,WAAW,WAAsBrG,KAAK0E,UAAUG,EAAOG,UAAUsB,MAAM,SAAe/E,EAASC,GAAM,GAAIkD,GAAM1E,KAAK0E,MAAU5C,EAAO4C,EAAMnD,EAA8E,OAAzD,OAARO,IAAaA,EAAO4C,EAAMnD,GAAUD,EAAcC,EAASC,IAAaM,GAAQ+C,EAAOG,UAAUuB,OAAO,SAAgBhF,EAASiD,EAAKgC,GAAU,GAAI1E,GAAO9B,KAAKsG,MAAM/E,GAAc2E,EAAQ1B,YAAgBD,GAAQC,EAAK,GAAID,GAAQC,EAAM,OAAOxE,MAAKyG,aAAa3E,EAAOoE,EAAQM,EAASjF,IAAWsD,EAAOG,UAAUyB,aAAa,SAAsB3E,EAAOoE,EAAQM,EAASE,GAAuD,IAAI,GAAvB5D,GAAM6D,EAAO/D,EAA3BgE,EAAO,GAAkCvD,EAAE,EAAEa,EAAUpC,EAAOD,OAASqC,EAAFb,IAAcA,EAAGT,EAAMiE,OAAU/D,EAAMhB,EAAOuB,GAAGsD,EAAO7D,EAAM,GAAe,MAAT6D,EAAa/D,EAAM5C,KAAK8G,cAAchE,EAAMoD,EAAQM,EAASE,GAAmC,MAATC,EAAa/D,EAAM5C,KAAK+G,eAAejE,EAAMoD,EAAQM,EAASE,GAAmC,MAATC,EAAa/D,EAAM5C,KAAKgH,cAAclE,EAAMoD,EAAQM,EAASE,GAAmC,MAATC,EAAa/D,EAAM5C,KAAKiH,eAAenE,EAAMoD,GAA0B,SAATS,EAAgB/D,EAAM5C,KAAKkH,aAAapE,EAAMoD,GAA0B,SAATS,IAAgB/D,EAAM5C,KAAKmH,SAASrE,IAAkB+D,SAARjE,IAAkBgE,GAAQhE,EAAM,OAAOgE,IAAQ/B,EAAOG,UAAU8B,cAAc,SAAuBhE,EAAMoD,EAAQM,EAASE,GAAiF,QAASU,GAAU7F,GAAU,MAAO8F,GAAKd,OAAOhF,EAAS2E,EAAQM,GAAhI,GAAIa,GAAKrH,KAAS4G,EAAO,GAAOhE,EAAMsD,EAAQJ,OAAOhD,EAAM,GAA+E,IAAIF,EAAJ,CAAiB,GAAGtC,EAAQsC,GAAQ,IAAI,GAAI0E,GAAE,EAAEhE,EAAYV,EAAMf,OAASyB,EAAFgE,IAAgBA,EAAGV,GAAQ5G,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQ1C,KAAKZ,EAAM0E,IAAId,EAASE,OAAwB,IAAkB,gBAAR9D,IAAiC,gBAARA,IAAiC,gBAARA,GAAkBgE,GAAQ5G,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQ1C,KAAKZ,GAAO4D,EAASE,OAAuB,IAAGxG,EAAW0C,GAAO,CAAC,GAA6B,gBAAnB8D,GAA4B,KAAM,IAAItE,OAAM,iEAAkEQ,GAAMA,EAAM7B,KAAKmF,EAAQ1B,KAAKkC,EAAiBa,MAAMzE,EAAM,GAAGA,EAAM,IAAIsE,GAAqB,MAAPxE,IAAYgE,GAAQhE,OAAWgE,IAAQ5G,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQM,EAASE,EAAkB,OAAOE,KAAQ/B,EAAOG,UAAU+B,eAAe,SAAwBjE,EAAMoD,EAAQM,EAASE,GAAkB,GAAI9D,GAAMsD,EAAQJ,OAAOhD,EAAM,GAAI,QAAIF,GAAOtC,EAAQsC,IAAuB,IAAfA,EAAMf,OAAkB7B,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQM,EAASE,GAA/F,QAAkH7B,EAAOG,UAAUgC,cAAc,SAAuBlE,EAAMoD,EAAQM,GAAU,GAAIA,EAAJ,CAAoB,GAAI5D,GAAM1C,EAAWsG,GAAUA,EAAS1D,EAAM,IAAI0D,EAAS1D,EAAM,GAAI,OAAU,OAAPF,EAAmB5C,KAAKyG,aAAazG,KAAKsG,MAAM1D,GAAOsD,EAAQM,EAAS5D,GAA3E,SAAmFiC,EAAOG,UAAUiC,eAAe,SAAwBnE,EAAMoD,GAAS,GAAItD,GAAMsD,EAAQJ,OAAOhD,EAAM,GAAI,OAAU,OAAPF,EAAmBA,EAAtB,QAA6BiC,EAAOG,UAAUkC,aAAa,SAAsBpE,EAAMoD,GAAS,GAAItD,GAAMsD,EAAQJ,OAAOhD,EAAM,GAAI,OAAU,OAAPF,EAAmB3C,EAASuH,OAAO5E,GAAtC,QAA8CiC,EAAOG,UAAUmC,SAAS,SAAkBrE,GAAO,MAAOA,GAAM,IAAI7C,EAAS8F,KAAK,cAAc9F,EAASwH,QAAQ,QAAQxH,EAASuB,MAAM,KAAK,KAAM,IAAIkG,GAAc,GAAI7C,EAAO5E,GAASoG,WAAW,WAAsB,MAAOqB,GAAcrB,cAAcpG,EAASqG,MAAM,SAAe/E,EAASC,GAAM,MAAOkG,GAAcpB,MAAM/E,EAASC,IAAOvB,EAASsG,OAAO,SAAgBhF,EAASiD,EAAKgC,GAAU,GAAqB,gBAAXjF,GAAqB,KAAM,IAAIoG,WAAU,wDAA2DvH,EAAQmB,GAAU,kFAAsF,OAAOmG,GAAcnB,OAAOhF,EAASiD,EAAKgC,IAAWvG,EAAS2H,QAAQ,SAAiBrG,EAASiD,EAAKgC,EAASqB,GAAM,GAAIC,GAAO7H,EAASsG,OAAOhF,EAASiD,EAAKgC,EAAU,OAAGtG,GAAW2H,OAAOA,GAAKC,GAAoBA,GAAS7H,EAASuH,OAAOtG,EAAWjB,EAASgD,QAAQA,EAAQhD,EAASsE,QAAQA,EAAQtE,EAAS4E,OAAOA,IAc1vS,SAAUkD,GAiRP,QAASC,GAAmBC,EAAOC,EAAWC,EAAUC,GAEpDH,EAAMI,GAAIH,EAAW,SAAUI,GAG3B,MADAC,GAAW/E,KAAM8E,GACVH,EAASK,MAAO,KAAMJ,KAGL,aAAxBK,SAASC,YAA2C,UAAdR,GAGtCC,EAASK,MAAO,KAAMJ,GAI9B,QAASO,GAAiBC,GAGtB,GAAIX,GAAQF,EAAGa,EAEVX,GAAMY,GAAI,2BAEXZ,EAAMI,GAAI,SAAU,WAGXJ,EAAMY,GAAI,YAEXZ,EAAMa,QAAS,SAIfb,EAAMa,QAAS,aAKtBb,EAAMY,GAAI,wBAEXZ,EAAMI,GAAI,SAAU,WAGhB,GAAIU,GAAad,EAAMe,KAAM,OAE7BjB,GAAG,6BAA+BgB,EAAa,MAAOE,KAAM,SAAU5F,EAAG6F,GAErE,GAAIC,GAASpB,EAAGmB,EACXC,GAAON,GAAI,YAEZM,EAAOL,QAAS,SAIhBK,EAAOL,QAAS,eASpC,QAASM,GAAiBC,EAAOC,GAM7B,IAAM,GAJFC,GAAmB,2CACnBC,EAAmBH,EAAMnH,MAAO,KAChCuH,KAEMpG,EAAI,EAAGA,EAAImG,EAAY3H,OAAQwB,IACzC,CACI,GAAIqG,GAAaF,EAAYnG,GAAGsG,MAEhC,IAAMD,GAKAH,EAAiBpE,KAAMuE,GAA7B,CAMA,GAAIhE,GAAQgE,EAAWhE,MAAO6D,EAE9B,KAAM7D,EAAM,IAAMA,EAAM,GAAG7D,QAAU,EAEjC+H,QAAQC,MAAO,iBAAmBH,EAAa,8BAInD,KAAMhE,EAAM,IAAMA,EAAM,GAAG7D,QAAU,EAEjC+H,QAAQC,MAAO,iBAAmBH,EAAa,0BAFnD,CAMA,GAAII,IACAxB,MAAQ5C,EAAM,IAAM,QACpBqE,QAAQrE,EAAM,GACdsE,OAAQtE,EAAM,GACd0C,UAGJ,IAAO1C,EAAM,IAAMA,EAAM,GAAG7D,OAAS,EAGjC,IAAM,GADFuG,GAAS1C,EAAM,GAAGA,MAAO,yCACnB4B,EAAI,EAAGA,EAAIc,EAAOvG,OAAQyF,IACpC,CACI,GAAI2C,GAAQ7B,EAAOd,GAAGqC,MAChBO,OAAOC,WAAYF,IAIQ,QAAvBA,EAAMG,cAEZN,EAAU1B,OAAO5E,MAAM,GAEM,SAAvByG,EAAMG,cAEZN,EAAU1B,OAAO5E,MAAM,GAEM,QAAvByG,EAAMG,cAEZN,EAAU1B,OAAO5E,KAAM8F,GAIvBQ,EAAU1B,OAAO5E,KAAMyG,EAAMxJ,QAAS,eAAgB,KAhBtDqJ,EAAU1B,OAAO5E,KAAM2G,WAAYF,IAqB/CR,EAAWjG,KAAMsG,KAGrB,MAAOL,GAuNX,QAASY,GAAkBC,EAAWC,EAAgBC,GAElDA,EAAkBA,KAIlB,KAAM,GADFC,MACMpH,EAAI,EAAGA,EAAIiH,EAAUI,aAAa7I,OAAQwB,IACpD,CACI,GAAIsH,GAAaL,EAAUI,aAAarH,EACxC,IAAK0E,EAAE6C,QAASD,EAAYH,GAAoB,EAChD,CAII,GAFAA,EAAgBhH,KAAMmH,GAEjBE,EAAWC,UAAU9E,eAAgB2E,GAC1C,CAEUI,gBAAgBD,UAAU9E,eAAgB2E,IAG5CN,EAAkBQ,EAAWC,UAAUH,GAAa,EAAGH,GAE3DC,EAAqBjH,KAAMuH,gBAAgBD,UAAUH,GACrD,UAGJ,GAAuB,GAAlBJ,GAAuBM,EAAWG,SAAShF,eAAgB2E,GAChE,CAEUI,gBAAgB/F,UAAUgB,eAAgB2E,IAG5CN,EAAkBQ,EAAWG,SAASL,GAAa,EAAGH,GAE1DC,EAAqBjH,KAAMuH,gBAAgB/F,UAAU2F,GACrD,UAGJ,GAAuB,GAAlBJ,GAAuBM,EAAWpB,WAAWzD,eAAgB2E,GAClE,CAEUI,gBAAgBtB,WAAWzD,eAAgB2E,IAG7CN,EAAkBQ,EAAWpB,WAAWkB,GAAa,EAAGH,GAE5DC,EAAqBjH,KAAMuH,gBAAgBtB,WAAWkB,GACtD,UAGJf,QAAQC,MAAO,6BAA+Bc,EAAa,4BAI3Df,SAAQC,MAAO,gCAAkCW,EAAgBS,KAAM,QAAW,OAASN,GAK5E,GAAlBJ,EAEDQ,gBAAgBD,UAAUR,EAAUvE,MAAQuE,EAAUY,MAAM1C,MAAO,KAAMiC,GAEjD,GAAlBF,EAENQ,gBAAgB/F,UAAUsF,EAAUvE,MAAQuE,EAAUY,MAAM1C,MAAO,KAAMiC,GAEjD,GAAlBF,IAENQ,gBAAgBtB,WAAWa,EAAUvE,MAAQuE,EAAUY,MAAM1C,MAAO,KAAMiC,IAjrBlF,GAAIhD,GAAU,QASVoD,GACAC,aACAE,YACAvB,cAQJsB,iBAAkB,YAIlB,IAAII,GAA0B,IAC9BJ,iBAAgBK,YAAc,WAG1B,MADAD,GAAWA,GAAY,GAAIJ,kBAI/BA,gBAAgBtD,QAAU,WAYtB,QAAS4D,GAASA,GAKd,IAAK,GAHDC,GAAe7D,EAAQvF,MAAM,KAC7BqJ,EAAiBF,EAAQnJ,MAAM,KAE1BmB,EAAI,EAAGA,EAAIkI,EAAe1J,OAAQwB,IAEvC,GAAIiI,EAAajI,KAAOkI,EAAelI,IAA4B,MAAtBkI,EAAelI,GAA5D,CAKA,GAAImI,SAASF,EAAajI,IAAMmI,SAASD,EAAelI,IAEpD,MAAO,EAGX,IAAImI,SAASF,EAAajI,IAAMmI,SAASD,EAAelI,IAEpD,MAAO,GAGf,MAAO,GAhCX,OACIoI,IAAK,WACD,MAAOhE,IAEXiE,OAAQ,SAAUC,GACd,MAAqB,IAAdN,EAAQM,IAEnBN,QAASA,MAqCjBN,gBAAgBvE,YAQhBuE,gBAAgBa,WAUhBb,gBAAgBc,UAAY,SAAUC,EAAYlJ,GAE9C,MAAKmI,iBAAgBa,QAAQ5F,eAAgB8F,IAEzClC,QAAQC,MAAO,oBAAsBiC,EAAa,8CAC3C,OAGXf,gBAAgBa,QAAQE,GAAclJ,EAE/BmI,gBAAgBa,QAAQE,KAUnCf,gBAAgBgB,UAAY,SAAUD,EAAYE,GAE9C,MAAKjB,iBAAgBa,QAAQ5F,eAAgB8F,GAItCf,gBAAgBa,QAAQE,GAFpBE,GAUfjB,gBAAgBtB,cAYhBsB,gBAAgBjB,UAAY,SAAUmC,EAAeC,EAAoBxB,GAGrE,MAA8B,gBAAlBuB,OAERrC,SAAQC,MAAO,kEAAqEoC,GAAgB,YAKrE,kBAAvBC,OAERtC,SAAQC,MAAO,qEAAwEqC,GAAqB,aAIhHxB,EAAeA,WAEfG,EAAWpB,WAAWwC,IAClBlG,KAAckG,EACdvB,aAAcA,EACdQ,MAAcgB,MAStBnB,gBAAgB/F,UAAUmH,eAAiB,SAAUC,GAGjDA,EAAcA,GAAe,OAE7BrE,EAAGqE,GAAcC,KAAM,iBAAkBpD,KAAM,SAAU5F,EAAGuF,GAGxD,GAAIa,GAAaL,EAAiBrB,EAAGa,GAAUI,KAAM,eAAiBjB,EAAGa,GAEzE,MAAKa,EAAW5H,QAAU,GAA1B,CAMA8G,EAAiBC,EAEjB,KAAM,GAAIvF,GAAI,EAAGA,EAAIoG,EAAW5H,OAAQwB,IACxC,CACI,GAAIyG,GAAYL,EAAWpG,EAC3B,IAAO0H,gBAAgBtB,WAAWK,EAAAA,WAAoBiB,gBAAgBtB,WAAWzD,eAAgB8D,EAAAA,UACjG,CAEI,GAAI3B,GAAW4C,gBAAgBtB,WAAWK,EAAAA,UAAiBA,EAAUE,OAC9D7B,IAA+B,kBAAZA,GAGE,SAAnB2B,EAAUxB,MAEXH,EAASK,MAAO,KAAMsB,EAAU1B,QAIhCJ,EAAmBD,EAAGa,GAAWkB,EAAUxB,MAAOH,EAAU2B,EAAU1B,QAa1EwB,QAAQC,MAAO,qBAAuBC,EAAUE,OAAS,OAASF,EAAAA,cAMtEF,SAAQC,MAAO,wBAA0BC,EAAAA,cAKrD/B,EAAGU,UAAWK,QAAS,eAAgBsD,GAG3C,IAAI7D,KAEJwC,iBAAgBuB,eAAiB,SAAUpE,GAEvC,GAAIqE,GAAehE,EAAW1G,OAAS,CACvC,KAAMqG,EAEF,MAAOK,GAAWgE,EAIlB,KAAM,GAAIlJ,GAAIkJ,EAAclJ,GAAK,EAAGA,IAEhC,GAAK6E,GAAaK,EAAWlF,GAAGV,KAE5B,MAAO4F,GAAWlF,EAK9B,OAAO,OAIX0H,gBAAgByB,UAAY,SAAUlE,GAElCC,EAAW/E,KAAM8E,IAgKrByC,gBAAgB0B,QAAU,SAAUC,EAAaC,EAAkBjC,GAI/D,MAA4B,gBAAhBgC,OAER9C,SAAQC,MAAO,kEAAqE6C,GAAc,YAKrE,kBAArBC,OAER/C,SAAQC,MAAO,qEAAwE8C,GAAmB,aAI9GjC,EAAeA,WAEfG,EAAWG,SAAS0B,IAChB3G,KAAc2G,EACdhC,aAAcA,EACdQ,MAAcyB,MAWtB5B,gBAAgBD,aAUhBC,gBAAgBrL,QAAU,SAAUkN,EAAaC,EAAkBnC,GAI/D,MAA4B,gBAAhBkC,OAERhD,SAAQC,MAAO,kEAAqE+C,GAAc,YAKrE,kBAArBC,OAERjD,SAAQC,MAAO,qEAAwEgD,GAAmB,aAI9GnC,EAAoCA,WACpCG,EAAWC,UAAU8B,IACjB7G,KAAc6G,EACdlC,aAAcA,EACdQ,MAAc2B,MActB9B,gBAAgB+B,gBAAkB,SAAUvL,EAAUwL,GAUlD,MARAA,GAAiBA,MACjBA,EAAKC,UAAY,WAEb,MAAO,UAAUC,EAAM1G,GAEnB,MAAOA,GAAQwE,gBAAgBiC,UAAWC,MAG3ClN,SAASwG,OAAQ/G,cAAc+B,GAAWwL,IASrDhC,gBAAgBmC,WAAa,GAQ7BnC,gBAAgBoC,WAQhBpC,gBAAgBqC,iBAAmB,SAAUC,GAEzCtF,EAAEuF,MACEC,IAAMxC,gBAAgBmC,WAAaG,EACnCG,SAAU,SACXC,KAAM,SAAUC,GACf3C,gBAAgBoC,QAAUO,KAclC3C,gBAAgBiC,UAAY,SAAUxM,EAAQ4H,GAE1C,GAAIuF,EAgBJ,OAfK5C,iBAAgBoC,QAAQnH,eAAgBxF,GAEzCmN,EAAe5C,gBAAgBoC,QAAQ3M,IAIvCmN,EAAenN,EACfoJ,QAAQgE,KAAM,6BAA+BD,EAAe,OAGzDvF,IAEHuF,EAAe5N,SAASwG,OAAQoH,EAAcvF,IAG3CuF,GASX5C,gBAAgB8C,QAAU,WAGtB,IAAM,GAAInO,KAAWmL,GAAWC,UAEtBC,gBAAgBD,UAAU9E,eAAgBtG,IAG5C2K,EAAkBQ,EAAWC,UAAUpL,GAAU,EAIzD,KAAM,GAAI+M,KAAW5B,GAAWG,SAEtBD,gBAAgB/F,UAAUgB,eAAgByG,IAG5CpC,EAAkBQ,EAAWG,SAASyB,GAAU,EAIxD,KAAM,GAAI3C,KAAae,GAAWpB,WAExBsB,gBAAgBtB,WAAWzD,eAAgB8D,IAG7CO,EAAkBQ,EAAWpB,WAAWK,GAAY,EAK5D,KAAK,GADDgE,GAAUrF,SAASsF,qBAAsB,UACpC1K,EAAIyK,EAAQjM,OAAS,EAAGwB,GAAK,EAAGA,IAAM,CAC3C,GAAI2K,GAAOF,EAAQzK,GAAG4K,IAAIvI,MAAO,0BACjC,IAAMsI,EAAO,CACTjD,gBAAgBmC,WAAac,EAAK,EAClC,WAgFbE,QAcF,SAAUnG,EAAGoG,GAEVA,EAAGrE,UAAW,iBAAkB,SAAUsE,GAMtC,QAASC,GAAOC,GAEZH,EAAG7B,iBAAiBiC,iBACpBH,EAAsBI,cAAezG,EAAGuG,IAP5C,OACID,MAAOA,KAQX,2BAELH,OAAQnD,iBACV,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,SAAU,SAAU2E,GAS9B,QAASC,GAAeJ,GAEpBH,EAAG7B,iBAAiBiC,gBAEpB,IAAII,MACA1G,EAAkBF,EAAGuG,GACrBM,EAAkB3G,EAAM4G,QAAS,OAErCF,GAAgBG,iBAAqBF,EAAWvC,KAAM,sBAAuB0C,MAC7EJ,EAAgBK,kBAAqBJ,EAAWvC,KAAM,qBAAsB0C,MAC5EJ,EAAgBM,mBAAqBL,EAAWvC,KAAM,4BAA6B0C,MACnFJ,EAAgBO,mBAAqBN,EAAWvC,KAAM,4BAA6B0C,KAGnF,IAAII,GAAsBP,EAAWvC,KAAM,8BACvC+C,IAEJrH,GAAEkB,KAAMkG,EAAqB,SAAUE,EAAKf,GAExC,GAAI5I,GAAQ4I,EAAKvI,KAAKL,MAAO,yCACxBA,IAASA,EAAM,IAEhB0J,EAAe5L,MACX8L,sBAA4B5J,EAAM,GAClC6J,2BAA4BxH,EAAGuG,GAAOS,UAKpB,GAAzBK,EAAevN,SAEhB8M,EAAgBa,yBAA2BJ,GAI/CX,EAAcgB,SAAUd,IAI5B,QAASe,GAAoBpB,EAAMqB,GAE/B,GAAI1H,GAAiBF,EAAGuG,GACpBsB,EAAiB3H,EAAMrD,SAASyH,KAAM,SACtCwD,EAAiBrE,SAAUoE,EAAe5G,KAAM,eAAmB,EACnEpG,EAAiB4I,SAAUoE,EAAeb,OAAUY,EAEpDG,EAAe7H,EAAM4G,QAAS,yBAA0BhN,OAAS,CAErE,IAAKiO,EACL,EACUlN,EAAQ,IAAIf,QAAUgO,GAAajN,GAAS,GAE9CgN,EAAeb,IAAKnM,EAGxB,IAAImN,GAAU9H,EAAM8E,KAAM,UAEnBgD,IAEHC,OAAOC,aAAcF,GAGzBA,EAAUC,OAAOE,WAAY,WAEzBN,EAAe9G,QAAS,WACzB,KAEHb,EAAM8E,KAAM,UAAWgD,QAIjBnN,EAAQ,IAAIf,QAAUgO,GAAajN,GAAS,GAE9CgN,EAAeb,IAAKnM,GAKhC,QAASuN,GAAiBC,EAAc/G,GAEpCoF,EAAc0B,gBACVC,EACA5E,SAAUzD,EAAGsB,GAAQ0F,QACvBsB,KAAM,WAGJ,GAAIC,GAAa7B,EAAc8B,QAASH,EACxCrI,GAAGsB,GAAQ0F,IAAKuB,EAAWrB,sBA7FnC,OACIP,cAAoBA,EACpBgB,mBAAoBA,EACpBS,gBAAoBA,KA8FxB,mBACLjC,OAAQnD,iBACX,SAAWhD,EAAGoG,GAEVA,EAAGrE,UAAW,WAAY,SAAU0G,GAQhC,QAASC,GAAoBC,GAEzBF,EAAgBC,mBAAoBC,GAGxC,QAASC,GAAqBC,GAE1BJ,EAAgBG,oBAAqBC,GAZzC,OACIH,mBAAoBA,EACpBE,oBAAqBA,KAYzB,qBACJzC,OAAQnD,iBAcX,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,iBAAkB,SAAU+G,GActC,QAASC,KAEL/I,EAAGiI,QAAS3H,GAAI,+BAAgC,WAE5C0I,EAAgBC,GAChBD,EAAgBE,KAIpBlJ,EAAG,QAASM,GAAI,mBAAoB,SAAUC,GAE1CyI,EAAgBE,EAA0B3I,KAIlD,QAASyI,GAAgBG,EAAc5I,GAGnC,IAAM,GADF6I,GACM9N,EAAI,EAAGA,EAAI6N,EAAarP,OAAQwB,IAEtC8N,EAAWpJ,EAAGmJ,EAAa7N,IACpBiF,EAEgD,IAA9C6I,EAAS9E,KAAMtE,EAAGO,EAAM8I,SAAWvP,QAEpCsP,EAASE,YAAa,QAK1BF,EAASE,YAAa,QAMlC,QAASC,GAAchD,EAAMiD,GAEzB,GAAItJ,GAAUF,EAAGuG,GACbkD,EAAUvJ,EAAMrD,QAKb2M,KAAqBV,EAAUY,WAAY,WAAgBC,UAAUC,OAASd,EAAUY,WAAY,aAEjGD,EAAQ3I,GAAI,SAYRZ,EAAMe,KAAM,SAGdwI,EAAQH,YAAa,SAbzBO,EAAwB3J,EAAOuJ,GAGzBvJ,EAAMe,KAAM,SAEd6I,EAAgCL,EAAQM,IAAK7J,OAenDsJ,GAAqBG,UAAUC,OAASd,EAAUY,WAAY,YAE1DD,EAAQ3I,GAAI,WAEd+I,EAAwB3J,EAAOuJ,GAE/BK,EAAgCL,KAU5C,QAASI,GAAwBtD,EAAM1J,GAEnC,GAAI4M,GAAUzJ,EAAGnD,EAGjBmM,GAAgBE,GAGXlJ,EAAE6C,QAAS4G,EAAQ,GAAIP,GAA6B,GAErDA,EAAyBzN,KAAMgO,EAAQ,IAI3CA,EAAQO,SAAU,QAGtB,QAASF,GAAgCvD,GAErC,GAAIrG,GAAQF,EAAGuG,EAGfH,GAAG7B,iBAAiBiC,iBAGpBtG,EAAM+J,IAAK,SACX/J,EAAMI,GAAI,QAAS,SAAU4J,GAEzBA,EAAEC,oBAIV,QAASC,GAAe7D,GAEpB,GAAIrG,GAAcF,EAAGuG,GACjB8D,EAAcnK,EAAMrD,QAInBiM,GAAUY,WAAY,YAEvBW,EAAYL,SAAU,aACtB9J,EAAMoK,SAAU,MAAOC,YAAa,IAAK,WAEhCF,EAAYvJ,GAAI,SAEjBuJ,EAAYf,YAAa,SAIzBe,EAAYL,SAAU,QACjBhK,EAAE6C,QAASwH,EAAY,GAAIpB,GAAqB,GAEjDA,EAAiBxN,KAAM4O,EAAY,KAG3CnK,EAAMoK,SAAU,MAAOE,WAAY,SACnCH,EAAYf,YAAa,gBAxJrC,GAAIL,MAGAC,IAEJ,QACIH,cAAeA,EACfQ,aAAeA,EACfa,cAAeA,KAqJnB,sBACLjE,OAAQnD,iBACV,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,WAAY,SAAU0I,EAAkBC,GAQlD,QAASC,GAAIC,GAE2B,MAA/BH,EAAiBI,aAEG,gBAATD,IAA0C,IAArBA,EAAKvM,QAAQ,MAAc2B,EAAG4K,GAAO9Q,OAAS,EAE3EmO,OAAO6C,SAASC,OAAQ/K,EAAG4K,GAAO3J,KAAM,SAIxCgH,OAAO6C,SAASC,OAAQH,IAKpC,QAASI,GAAeC,GAEpBP,EAAiBQ,OAAQD,GAtB7B,OACIN,GAAeA,EACfK,cAAeA,KAuBnB,mBAAoB,sBACzB7E,OAAQnD,iBACX,SAAWhD,EAAGoG,GAEVA,EAAGrE,UAAW,MAAO,SAAU+G,GAY3B,QAASqC,GAASC,GAEdpL,EAAGoL,GAAcC,IAAK,QAG1B,QAASC,GAAiBpL,EAAO+K,EAAOM,GAE9BC,EAAUD,KAEZC,EAAUD,GAAW,GAAIE,IAGvBD,EAAUD,GAASG,OAAQT,IAE7BO,EAAUD,GAASI,OAAQV,GAG/BO,EAAUD,GAASG,OAAQT,GAAQW,SAAU1L,GAGjD,QAAS2L,GAAe3L,EAAO+K,EAAOM,GAE5BC,EAAUD,KAEZC,EAAUD,GAAW,GAAIE,IAGvBD,EAAUD,GAASG,OAAQT,IAE7BO,EAAUD,GAASI,OAAQV,GAG/BO,EAAUD,GAASG,OAAQT,GAAQa,WAAY5L,GAGnD,QAAS6L,GAAed,EAAOM,EAASV,GAE/B/B,EAAUY,WAAYmB,KAEvBzE,EAAG7B,iBAAiBiC,iBAEbgF,EAAUD,IAAcC,EAAUD,GAASG,OAAQT,IAEtDO,EAAUD,GAASJ,QAASF,IAMxC,QAASQ,KAYL,QAASE,GAAQV,GAGb,MADAe,GAAKf,GAAS,GAAIgB,GAAKhB,GAChBe,EAAKf,GAGhB,QAASE,GAASF,GAEd,GAAIiB,GAAS,CACb,IAAOC,EAGHD,EAASzI,SAAU0I,EAAUC,aAAavP,SAASwP,IAAK,WACxDF,EAAUG,OACVH,EAAUC,aAAavP,SAASwP,IAAK,SAAUH,EAAS,OAG5D,CAEI,IAAM,GAAIb,KAAOW,GAEb,GAAOA,EAAKX,GAAKe,aACjB,CACI,GAAIG,GAAW9I,SAAUuI,EAAKX,GAAKe,aAAavP,SAASwP,IAAK,YAC/C,GAAVH,GAA0BA,EAAXK,KAEhBL,EAASK,GAEbP,EAAKX,GAAKiB,OAIlB,IAAM,GAAIjB,KAAOW,GAENA,EAAKX,GAAKe,cAEbJ,EAAKX,GAAKe,aAAavP,SAASwP,IAAK,SAAUH,EAAS,EAIhElM,GAAGiI,QAAS3H,GAAI,aAAckM,GAGlCL,EAAYH,EAAKf,GACjBkB,EAAUC,aAAavP,SAASwP,IAAK,SAAUH,GAC/CC,EAAUM,OAGd,QAASf,GAAQT,GAEb,MAAOe,GAAKf,GAGhB,QAASuB,KAEL,IAAM,GAAInB,KAAOW,GAENA,EAAKX,GAAKe,cAEbJ,EAAKX,GAAKoB,MAIlBN,GAAY,KAzEhB,GACIA,GADAH,IAGJ,QACIL,OAAWA,EACXR,QAAWA,EACXO,OAAWA,EACXc,UAAWA,GAsEnB,QAASP,GAAKS,GAeV,QAASC,KAEL,MAAO1B,GAGX,QAASW,GAAUgB,GAGf,MADAC,GAAQpR,KAAMmR,GACP3U,KAGX,QAAS6T,GAAYgB,GAGjB,MADAC,GAAWD,EACJ7U,KAGX,QAASmU,KAEL,MAAOW,GAGX,QAASN,KAEL,IAAM,GAAInR,GAAI,EAAGA,EAAIuR,EAAQ/S,OAAQwB,IAEjCuR,EAAQvR,GAAG0O,SAAU,SAGlB+C,IAEHA,EAASN,OAAOzC,SAAU,MAKlC,QAASsC,KAEL,IAAM,GAAIhR,GAAI,EAAGA,EAAIuR,EAAQ/S,OAAQwB,IAEjCuR,EAAQvR,GAAGgO,YAAa,SAGrByD,IAEHA,EAAST,OAAOhD,YAAa,MA1DrC,GAAIyD,GACAF,KACA5B,EAAUyB,CAEd,QACId,SAAYA,EACZE,WAAYA,EACZM,WAAYA,EACZO,MAAYA,EACZF,KAAYA,EACZH,KAAYA,GArJpB,GAAId,KAEJ,QACIL,QAAiBA,EACjBG,gBAAiBA,EACjBO,cAAiBA,EACjBE,cAAiBA,KAoMrB,sBACJ5F,OAAQnD,iBASX,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,KAAM,SAAU0I,EAAkBuC,EAAoBC,GAyBhE,QAASC,KAGLlN,EAAGiI,QAAS3H,GAAI,4BAA6B,WAEzC6M,MAGJnN,EAAGiI,QAAS3H,GAAI,gBAAiB,WAExB8M,EAAgBtT,OAAS,IAErBkG,EAAGU,UAAW2M,YAAc,IAE7BC,EAAmBF,EAAiB,WAAY,WAIhDE,EAAmBF,EAAiB,cAAe,cAUnE,QAASG,KAELN,EAAUM,iBAOd,QAASC,GAAgBC,GAErBR,EAAUO,eAAgBC,GAqB9B,QAASC,GAAsBnH,GAE3BvG,EAAGuG,GAAOoH,aACNC,YAAiB,EACjBC,gBAAiB,EACjBC,WAAiB,IACjBC,gBAAiB,IACjBC,YAAiB,EACjBC,SAAiB,IACjBC,aAAiB,EACjBC,UAAiB,SAAUC,GAEvBpO,EAAGoO,GAAU9J,KAAM,gCAAiCvD,QAAS,aAczE,QAASsN,GAAa9H,EAAM+H,EAAYC,GAEpC,GAAIrO,GAAmBF,EAAGuG,GACtBiI,EAAmB,EACnBC,KACAC,EAAmBxO,EAAMoE,KAAM,oCAAqCxK,OAAS,EAAIoG,EAAMoE,KAAM,oCAAuCpE,EAAMyO,UAGzIJ,MAAkB,GAEnBK,EAAuBnT,KAAM8K,EAGjC,KAAM,GAAIjL,GAAIoT,EAAiB5U,OAAQwB,GAAK,EAAGA,IAE3CmT,EAAezO,EAAG0O,EAAiBpT,IACnCmT,EAAapC,IAAK,SAAU,IAEvBoC,EAAaI,aAAa,GAASL,IAEpCA,EAAYC,EAAaI,aAAa,MAIxCP,GAAc7D,EAAiBf,WAAY4E,KAE7CI,EAAiBI,OAAQN,GAYjC,QAASO,GAAWxI,GAEhB,GAAIrG,GAAQF,EAAGuG,EAEfrG,GAAM8O,MAAO,WAKT,MAHAhP,GAAG,cAAeiP,SACd5B,UAAW,GACZ,MACI,IAGJrN,EAAE6C,QAAS3C,EAAOkN,IAErBA,EAAgB3R,KAAMyE,GAW9B,QAASgP,GAAc3I,EAAM4I,GAEzB,GAAIjP,GAAQF,EAAGuG,EAEfrG,GAAMkP,UACFD,OAAQA,IAEPjP,EAAMY,GAAI,QAEXZ,EAAMI,GAAI,SAAU,WAEhBJ,EAAMmM,IAAK,UAAW,kBAYlC,QAASgD,GAAgB9I,GAGrB1E,QAAQyN,IAAK/I,EAEb,IAAIrG,GAAcF,EAAGuG,GACjB8D,EAAcnK,EAAMrD,QAExBwN,GAAYL,SAAU,aACtB9J,EAAMoK,SAAU,MAAOC,YAAa,IAAK,WAEhCF,EAAYvJ,GAAI,SAEjBuJ,EAAYf,YAAa,QAIzBe,EAAYL,SAAU,QAE1B9J,EAAMoK,SAAU,MAAOE,WAAY,SACnCH,EAAYf,YAAa,eAYjC,QAASiG,GAAiBhJ,EAAMiJ,GAE5B,GAAItP,GAAiBF,EAAGuG,GACpBkJ,EAAiBzP,EAAGE,EAAMe,KAAM,mBAEpC,IAAKf,EAAMY,GAAI,uBACf,CAEI,GAAI4O,GAAmB1P,EAAG,6BAAiCE,EAAMe,KAAM,QAAa,MAChF0O,GAAoBH,GAAsB,WAAXA,CAEnCE,GAAgBE,OAAQ,WAEpB,GAAIC,GAAQ7P,EAAG/H,KACfwX,GAAe3I,QAAS,oCAAqCuF,IAAK,SAAU,QAEvEwD,EAAM/O,GAAI,aAAgB+O,EAAM,KAAO3P,EAAM,IAA0B,GAApByP,EAGpDF,EAAeK,UAAW,IAAK,WAE3B3C,MAMJsC,EAAeM,QAAS,IAAK,WAEzB5C,YAQZjN,GAAM8O,MAAO,WAIT9O,EAAM8J,SAAU,aAChByF,EAAelF,YAAa,IAAK,WAE7BrK,EAAMoJ,YAAa,aACnBpJ,EAAM8P,YAAa,UACnB7C,QAMhB,QAAS2C,GAAWzG,EAAQ4G,GAExBC,EAAalQ,EAAGqJ,GAAU4G,EAAU,aAGxC,QAASF,GAAS1G,EAAQ4G,GAEtBC,EAAalQ,EAAGqJ,GAAU4G,EAAU,WAGxC,QAAS1F,GAAalB,EAAQ4G,GAE1BC,EAAalQ,EAAGqJ,GAAU4G,EAAU,eAGxC,QAASC,GAAaC,EAASF,EAAUG,GAErCH,EAAWA,GAAY,IACvBE,EAAQrJ,QAAS,oCAAqCuF,IAAK,SAAU,QACrE8D,EAAQC,GAAiBH,EAAU,WAE/B9C,MA8BR,QAASkD,GAAmB9J,EAAM+J,GAE9B,GAAIpQ,GAAUF,EAAGuG,GACbgK,EAAUrQ,EAAMoE,KAAM,oCAG1BpE,GAAMsQ,OAAQ,wCAIRD,EAAQzP,GAAI,YAEdyP,EAAQvG,SAAU,OAItBuG,EAAQjQ,GAAI,QAAS,WAEZiQ,EAAQE,SAAU,SAGiB,WAA/BvQ,EAAMe,KAAM,gBAEbf,EAAMwQ,QAAS,WAEnBH,EAAQjH,YAAa,OAAQU,SAAU,MAEvC9J,EAAMoE,KAAM,0CAA2CgI,OAEvDpM,EAAMoE,KAAM,qBAAsBkM,OAAQxD,EAAmB2D,iBAAkBL,OAuB3F,QAASN,GAAaY,EAAUvH,EAAQwB,GAEpC,GAAIsF,GAAUnQ,EAAGqJ,EAiBjB,IAAK8G,EAAQrJ,QAAS,gBAAiBhN,OAAS,EAChD,CACI,GAAIoG,GAAQiQ,EAAQxB,SAAU,OAE9B,OADAvI,GAAG1E,WAA2B,eAAE0I,cAAelK,IACxC,EAGX,GAAOmJ,GAAYuH,KAAe/F,GAAYJ,EAAiBf,WAAYmB,IAC3E,CACI,GAAIX,GAAI9D,EAAG7B,gBAOX,OANO2F,IAEHA,EAAE1D,iBAGN2J,EAAQH,YAAaY,IACd,GAIf,QAAS5G,GAAU4G,EAAUvH,EAAQwB,GAEjC,GAAOxB,GAAYuH,KAAe/F,GAAYJ,EAAiBf,WAAYmB,IAC3E,CACI,GAAIX,GAAI9D,EAAG7B,gBAOX,OANO2F,IAEHA,EAAE1D,iBAGNxG,EAAGqJ,GAASW,SAAU4G,IACf,GAIf,QAAStH,GAAasH,EAAUvH,EAAQwB,GAEpC,GAAOxB,GAAYuH,KAAe/F,GAAYJ,EAAiBf,WAAYmB,IAC3E,CACI,GAAIX,GAAI9D,EAAG7B,gBAOX,OANO2F,IAEHA,EAAE1D,iBAGNxG,EAAGqJ,GAASC,YAAasH,IAClB,GAQf,QAASzD,KAEL,IAAM,GAAI7R,GAAIsT,EAAuB9U,OAAS,EAAGwB,GAAK,EAAGA,IAErD+S,EAAaO,EAAuBtT,GAAI,IAAI,GAIpD,QAASgS,GAAmBuD,EAAOC,EAAMzQ,GAErC,IAAM,GAAI/E,GAAIuV,EAAM/W,OAAS,EAAGwB,GAAK,EAAGA,IAEpCuV,EAAMvV,GAAGwV,GAAOzQ,GAldxB,GAAIuO,MACAxB,IAEJ,QACIF,mBAAsBA,EACtBK,eAAsBA,EACtBC,eAAsBA,EACtBE,qBAAsBA,EACtBW,YAAsBA,EACtBU,UAAsBA,EACtBG,aAAsBA,EACtBK,gBAAsBA,EACtBO,UAAsBA,EACtBC,QAAsBA,EACtBxF,YAAsBA,EACtB8E,eAAsBA,EACtBgB,kBAAsBA,EACtBL,YAAsBA,EACtBhG,SAAsBA,EACtBV,YAAsBA,KAmc1B,mBAAoB,qBAAsB,eAC/CnD,OAAQnD,iBACV,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,YAAa,SAAUgP,GAOjC,QAASC,GAAUC,EAAMC,GAErB,MAAOH,GAAkBC,SAAUC,EAAMC,GAN7C,OACIF,SAAUA,KAQd,uBACL7K,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAaVA,EAAGzO,QAAS,aAAc,SAAUwZ,EAAIC,GAiBpC,QAASC,KAECjL,EAAGpC,UAAW,kBAKbsN,GAEHpJ,aAAcoJ,GAGlBA,EAA2BnJ,WAAY,WAEnCnI,EAAGiI,QAASlH,QAAS,iBAEiB,aAAjCqF,EAAGpC,UAAW,eAEfoN,EAAMG,UACDC,SAAUpL,EAAGnB,UAAW,8BACxB6G,WAAY1F,EAAGnB,UAAW,8CAC1BwM,gBAAiB,MACjBC,gBAAiBtL,EAAGnB,UAAW,OAC/B0M,UAAW,WAER1J,OAAO6C,SAASC,OAAQ,OAE3B6G,UAAW,WAER3J,OAAO6C,SAASC,OAAQ,OAE3B0B,QAGVrG,EAAGpC,UAAW,4BAarB,QAAS6N,GAAaC,GAElB,IAEI,GAAIC,GAAe/R,EAAEgS,UAAWF,EAAMC,aACtCZ,GAAGc,YAAaF,EAAajQ,MAAMoQ,aAEvC,MAAQhI,GAEJiH,EAAGgB,WAAYL,EAAMM,OAAQN,EAAMO,aAiB3C,QAASC,GAAM9M,EAAKnF,EAAQkS,EAAcC,EAAiBC,GAQvD,MALMD,IAEFrB,EAAGuB,iBAGA1S,EAAEuF,KACLC,GAEI5K,KAAU,MACVoK,KAAU3E,EACVoF,SAAU,OACVkN,OAAWF,EACX3Q,MAAU,SAAUgQ,GAEVS,GAEFV,EAAaC,MAI3Bc,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAkBR,QAASyB,GAAOtN,EAAKR,EAAMuN,EAAcC,GAGrC,GAAInS,IACAzF,KAAU,OACV6K,SAAU,OACV3D,MAAU,SAAUgQ,GAEVS,GAEFV,EAAaC,IAuBzB,OAlBO9M,IAAQA,EAAK+N,QAEhB1S,EAAO1D,MAAcqI,EAAKrI,MAC1B0D,EAAO2S,YAAchO,EAAKgO,YAC1B3S,EAAO2E,KAAcA,EAAKA,KAC1B3E,EAAO4S,aAAc,IAIrB5S,EAAO2E,KAAckO,KAAKC,UAAWnO,GACrC3E,EAAO4S,YAAc,oBAGnBT,GAEFrB,EAAGuB,iBAGA1S,EAAEuF,KACLC,EAAKnF,GACPuS,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAiBR,QAAS+B,GAAM5N,EAAKR,EAAMuN,EAAcC,GAQpC,MALMA,IAEFrB,EAAGuB,iBAGA1S,EAAEuF,KACLC,GAEI5K,KAAa,MACboK,KAAakO,KAAKC,UAAWnO,GAC7BS,SAAa,OACbwN,YAAa,mBACbnR,MAAa,SAAUgQ,GAEbS,GAEFV,EAAaC,MAI3Bc,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAkBR,QAASgC,GAAS7N,EAAKR,EAAMuN,EAAcC,GAQvC,MALMA,IAEFrB,EAAGuB,iBAGA1S,EAAEuF,KACLC,GAEI5K,KAAa,SACboK,KAAakO,KAAKC,UAAWnO,GAC7BS,SAAa,OACbwN,YAAa,mBACbnR,MAAa,SAAUgQ,GAEbS,GAEFV,EAAaC,MAI3Bc,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAUR,QAASiC,KAEL,MAAOtT,GAAEuT,WAAWC,UAxRxB,GAAIlC,GAA2B,IAM/B,OALAtR,GAAGU,UAAW+S,MAAO,WAEjBpC,OAIA3N,IAAQ4O,EACRoB,KAAQZ,EACRa,IAAQP,EACRQ,SAAQP,EACRQ,KAAQP,KAgRZ,YAAa,kBAClBnN,OAAQnD,iBAaV,SAAUoD,GAaPA,EAAGzO,QAAS,aAAc,SAAUmc,GAwBhC,QAASC,GAAcC,EAAe3T,GAGlC,QAAS4T,GAAMC,GAEX,MAAOJ,GAAIpQ,IAAK,SAAWwQ,EAAY7R,cAAgB,cAAgB2R,EAAc3R,cAAgB,IAAKhC,GAG9G,OACI4T,KAAMA,GAoBd,QAASE,GAAWH,EAAe3T,GAG/B,QAAS4T,GAAMC,GAEX,MAAOJ,GAAIpQ,IAAK,SAAWwQ,EAAY7R,cAAgB,IAAM2R,EAAc3R,cAAgB,IAAKhC,GAGpG,OACI4T,KAAMA,GAWd,QAASG,GAAoBC,GAEzB,MAAOP,GAAIpQ,IAAK,sDAAwD2Q,GAxE5E,OACIN,aAAoBA,EACpBI,UAAoBA,EACpBC,mBAAoBA,KAwExB,gBACLpR,iBAaF,SAAUoD,GAePA,EAAGzO,QAAS,kBAAmB,SAAUmc,EAAKQ,EAAKnD,GAkB/C,QAASoD,KAEL,MAAOC,GAQX,QAASC,GAAaC,GAOlB,MALMC,IAAaH,GAEfI,GAAc,GAGXF,EAEI1U,EAAE6U,QAAQ,KAAUL,GAExBG,EASX,QAASC,GAAcnC,GAGnB,MAAOqB,GAAIpQ,IAAK,kBAAmB,MAAM,GAAO,EAAO+O,GAClD/M,KAAM,SAAUC,GAENA,GAEH6O,EAAe7O,EAASX,KACxB2P,EAAe,GAAIJ,IAInBpD,EAAGgB,WAAY,EAAG,iFAWlC,QAAS2C,KAGL,MAAOhB,GAAIH,IAAK,iBAAkBgB,GAC7BjP,KAAM,SAAUC,GAENA,GAEH6O,EAAe7O,EAASX,KACxB2P,EAAe,GAAIJ,IAInBpD,EAAGgB,WAAY,EAAG,iFAclC,QAAS4C,GAAiBC,GAGtB,MAAOV,GAAIP,aAAc,WAAaiB,GAAYf,KAAM,YACnDvO,KAAM,SAAUC,GAEb3F,EAAG,mCAAqCgV,EAAY,MAC/C9T,KAAM,SAAU5F,EAAGiL,GAEhBvG,EAAGuG,GAAO0O,KAAMtP,EAASX,KAAK,IAC9BoB,EAAG/C,cAAce,eAAgBmC,GACjCvG,EAAGiI,QAASlH,QAAS,sBAczC,QAASmU,GAAkBC,GAGvB,MAAOb,GAAIF,mBAAoBe,GAC1BzP,KAAM,SAAUC,GAEb3F,EAAG,qCAAuCmV,EAAQ,MAC7CjU,KAAM,SAAU5F,EAAGiL,GAEhBvG,EAAGuG,GAAO0O,KAAMtP,EAASX,KAAK,IAC9BoB,EAAG/C,cAAce,eAAgBmC,GACjCvG,EAAGiI,QAASlH,QAAS,sBAezC,QAASqU,GAAqBJ,GAG1B,MAAOV,GAAIP,aAAc,WAAaiB,GAAYf,KAAM,YACnDvO,KAAM,SAAUC,GAEb3F,EAAG,mCAAqCgV,EAAY,MAC/C9T,KAAM,SAAU5F,EAAGiL,GAEhBvG,EAAGuG,GAAO0O,KAAMtP,EAASX,KAAK,IAC9BoB,EAAG/C,cAAce,eAAgBmC,GACjCvG,EAAGiI,QAASlH,QAAS,sBA7JzC,GAAIyT,GAGAG,CAEJ,QACIF,YAAqBA,EACrBK,YAAqBA,EACrBF,aAAqBA,EACrBG,gBAAqBA,EACrBG,iBAAqBA,EACrBE,oBAAqBA,KAyJzB,aAAc,aAAc,eACjCpS,iBAaF,SAAUhD,EAAGoG,GAQVA,EAAGzO,QAAS,eAAgB,WAcxB,QAAS0d,GAASJ,GAEd,MAAOjS,iBAAgBvE,SAAS2S,MAAMiE,QAASJ,GAQnD,QAAS1D,GAAS+D,GAEd,MAAO,IAAIlE,GAAOkE,GAUtB,QAASlE,GAAOkE,GAoHZ,QAAS9D,GAAU+D,GAGf,MADAC,GAAMD,MAAQA,EACPtd,KAGX,QAASwd,GAAU7E,GAGf,MADA4E,GAAM5E,SAAWA,EACV3Y,KASX,QAAS6T,GAAYgB,GAGjB,MADA0I,GAAM1I,QAAUA,EACT7U,KAUX,QAASyZ,GAAiB9E,GAGtB,MADA4I,GAAME,aAAe9I,EACd3U,KAUX,QAASwZ,GAAiB7E,GAGtB,MADA4I,GAAMG,aAAe/I,EACd3U,KAUX,QAAS0Z,GAAWvR,GAGhB,MADAoV,GAAM7D,UAAYvR,EACXnI,KASX,QAAS2Z,GAAWxR,GAGhB,MADAoV,GAAM5D,UAAYxR,EACXnI,KASX,QAAS2d,GAAcZ,GAGnB,MADAQ,GAAMR,UAAYA,EACX/c,KASX,QAASkQ,GAAYH,GAGjB,MADAwN,GAAMxN,QAAUA,EACT/P,KASX,QAASwU,KAEL,GAAM+I,EAAMF,SAERO,EAAU7V,EAAGwV,EAAMF,cAGvB,CAGQO,EAFCR,EAASG,EAAM1I,SAEN9J,gBAAgBvE,SAAS2S,MAAM0E,SAAUN,EAAM1I,SAI/C9M,EAAGgD,gBAAgB+B,gBAAiB,mBAAoByQ,IAGtExV,EAAGwV,EAAMR,WAAYxE,OAAQqF,EAG7B,IAAI9P,GAAU/F,EAAGwV,EAAM1I,SAAUiJ,OAAQ,SACpChQ,GAAQjM,OAAS,GAElBiM,EAAQ7E,KAAM,SAAU5F,EAAG0a,GAEvB,GAAInV,GAAgBH,SAASuV,cAAe,SAC5CpV,GAAQjG,KAAY,kBACpBiG,EAAQqV,UAAYlW,EAAGgW,GAAS9Q,OAChClF,EAAGwV,EAAMR,WAAYxE,OAAQ3P,KAMzCmC,gBAAgBvE,SAAS2S,MAAM+E,KAAMN,EAASL,GAC9CK,EAAQvR,KAAM,iCAAkC0K,MAAO,WAEnD,GAAIoH,GAAQZ,EAAM7D,WAEG,oBAATyE,KAERA,GAAQ,GAGPA,GAED9J,GAAM,KAIdtJ,gBAAgBvE,SAAS2S,MAAM3E,KAAMoJ,GAEhCL,EAAMxN,QAAU,GAEjBqO,IAUR,QAAS/J,GAAMgK,GAEXtT,gBAAgBvE,SAAS2S,MAAM9E,KAAMuJ,GAE/BS,GAEFd,EAAM5D,YASd,QAASyE,KAELE,EAAgBf,EAAMxN,QACtBwO,GAAgB,GAAKC,OAAQC,UAE7B1O,EAAUC,OAAOE,WAAY,WAEzBF,OAAO0O,cAAe9L,GACtByB,KACDkJ,EAAMxN,SAET6N,EAAQvR,KAAM,+BAAgCY,KAAMqR,EAAgB,KACpE1L,EAAW5C,OAAO2O,YAAa,WAE3B,IAAMC,EACN,CACI,GAAIC,GAAmBP,GAAgB,GAAKE,OAAQC,UAAYF,CAChEM,GAAuBC,KAAKC,MAAOF,EAAmB,KACtDjB,EAAQvR,KAAM,+BAAgCY,KAAM4R,KAEzD,KAQP,QAASG,KAELJ,GAAS,EACTN,IAAiB,GAAKE,OAAQC,UAAYF,EAC1CvO,OAAOC,aAAcF,GAQzB,QAASkP,KAELL,GAAY,EACZL,GAAY,GAAKC,OAAQC,UACzB1O,EAAYC,OAAOE,WAAY,WAE3BmE,IACArE,OAAO0O,cAAe9L,IACvB0L,GAQP,QAASY,KAELlP,OAAOC,aAAcF,GACrBC,OAAO0O,cAAe9L,GApW1B,GAAI2K,GAAQvd,IACZud,GAAMF,SAAWA,EASjBE,EAAMD,MAAQ,GAEdC,EAAM5E,SAAW,GASjB4E,EAAM1I,QAAU,GAShB0I,EAAMG,aAAevP,EAAGnB,UAAW,UASnCuQ,EAAME,aAAetP,EAAGnB,UAAW,WAUnCuQ,EAAM7D,UAAY,aAWlB6D,EAAM5D,UAAY,aAWlB4D,EAAMR,UAAY,OASlBQ,EAAMxN,QAAU,GAEhBwN,EAAMlJ,KAAkBA,EACxBkJ,EAAMa,aAAkBA,EACxBb,EAAM2B,YAAkBA,EACxB3B,EAAMyB,aAAkBA,EACxBzB,EAAM0B,gBAAkBA,CAExB,IAAIrB,GACA7N,EAAS6C,EACT0L,EAAeC,EACfK,GAAS,CAEb,QACIrF,SAAiBA,EACjBiE,SAAiBA,EACjB3J,WAAiBA,EACjB8J,aAAiBA,EACjBlE,gBAAiBA,EACjBD,gBAAiBA,EACjBE,UAAiBA,EACjBC,UAAiBA,EACjBzJ,WAAiBA,EACjBsE,KAAiBA,EACjBH,KAAiBA,GA5IzB,OACIiF,QAASA,EACT8D,QAASA,MA4YlBlP,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAQVA,EAAGzO,QAAS,YAAa,WA2BrB,QAASwa,GAAYiF,EAAMC,GAEvBpF,IAAemF,KAAMA,EAAME,QAASD,KAUxC,QAASpF,GAAasF,KAIZC,GAAcxX,EAAG,QAASyX,IAAKD,GAAa1d,QAAU,KAExD0d,EAAaxX,EAAGoG,EAAGrB,gBAAiB,0BACpC/E,EAAG,QAASwQ,OAAQgH,GACpBpR,EAAG3H,SAASpE,MAAM8b,KAAMqB,IAG5BxX,EAAEkB,KAAMqW,EAAe,SAAUG,EAAK5V,GAGlCsE,EAAG3H,SAASpE,MAAMsd,SAAUH,EAAYxX,EAAGoG,EAAGrB,gBAAiB,0BAA2BjD,OAG9FsE,EAAG3H,SAASpE,MAAMoS,KAAM+K,GAExB3E,GAAgB,GAQpB,QAASH,KAeL,MAbAkF,GAAkBA,GAAmB,IAG/BC,GAAc7X,EAAG,QAASyX,IAAKI,GAAa/d,QAAU,KAExD+d,EAAa7X,EAAGoG,EAAGrB,gBAAiB,+BACpC/E,EAAG,QAASwQ,OAAQqH,IAGxBzR,EAAG3H,SAASqZ,WAAWrL,KAAMoL,GAG7BD,IACOA,EASX,QAAS/E,GAAgBpF,GAarB,MATAmK,MAIwB,GAAnBA,GAA0BnK,KAE3BmK,EAAkB,EAClBxR,EAAG3H,SAASqZ,WAAWxL,KAAMuL,IAE1BD,EA7FX,GACIC,GADAD,EAAkB,EAElBJ,EAAkB,IAEtB,QACIrF,WAAgBA,EAChBF,YAAgBA,EAChBS,eAAgBA,EAChBG,eAAgBA,MAyFzB1M,OAAQnD,iBAUXhG,OAAO2G,OAAS,SAAUoU,EAAGC,GAEzB,GAAKD,IAAMC,EAEP,OAAO,CAEX,MAAOD,YAAa/a,SAAagb,YAAahb,SAE1C,OAAO,CAEX,IAAK+a,EAAEE,cAAgBD,EAAEC,YAErB,OAAO,CAGX,KAAM,GAAIP,KAAOK,GAEb,GAAMA,EAAE9Z,eAAgByZ,GAAxB,CAIA,IAAMM,EAAE/Z,eAAgByZ,GAEpB,OAAO,CAEX,IAAKK,EAAEL,KAASM,EAAEN,GAAlB,CAIA,GAA0B,gBAAbK,GAAEL,GAEX,OAAO,CAEX,KAAM1a,OAAO2G,OAAQoU,EAAEL,GAAMM,EAAEN,IAE3B,OAAO,GAIf,IAAM,GAAIA,KAAOM,GAEb,GAAKA,EAAE/Z,eAAgByZ,KAAUK,EAAE9Z,eAAgByZ,GAE/C,OAAO,CAIf,QAAO,GAGX1U,gBAAgBkV,YAEZC,OAAQ,UAGZ,SAAWnY,EAAGoG,GAGVA,EAAG3H,SAASpE,OAMR8b,KAAM,SAAUiC,GAEZpY,EAAGoY,GAAQ9T,KAAM,UAAW0K,MAAO,WAE/B5I,EAAG3H,SAASpE,MAAMge,aAS1BV,SAAU,SAAUS,EAAOtW,GAEvB,GAAIwW,GAAYtY,EAAG8B,GAAQb,KAAM,yBAE5BjB,GAAGoY,GAAQ9T,KAAM,4BAA8BgU,EAAY,MAAOxe,QAAU,GAE7EkG,EAAGoY,GAAQ9T,KAAM,wBAAyBkM,OAAQ1O,IAQ1D2K,KAAM,SAAU2L,GAEZpY,EAAGoY,GAAQ3L,QAGf4L,QAAS,WACLrY,EAAG,sBAAuBsM,OAC1BtM,EAAG,sBAAuBsE,KAAM,wBAAyB2Q,KAAM,OAKvE9O,OAAQnD,iBACX,SAAUhD,EAAGoG,GAGVA,EAAG3H,SAAS2S,OAOR+E,KAAM,SAAUtV,EAAS2U,GAErB3U,EAAQP,GAAI,kBAAmB,WAE3BkV,EAAMlJ,OACDkJ,EAAMF,UAGPzU,EAAQ0X,WAIX/C,EAAMxN,QAAU,IAEjBnH,EAAQP,GAAI,gBAAiBkV,EAAM2B,aACnCtW,EAAQyD,KAAM,kBAAmBkU,MAAO,WAEpChD,EAAMyB,gBACP,WAEMpW,EAAQC,GAAI,QAEb0U,EAAM0B,sBAUtBzK,KAAM,SAAU5L,GAEZA,EAAQ2U,MAAO,SAOnBlJ,KAAM,SAAUzL,GAEZA,EAAQ2U,MAAO,SAQnBH,QAAS,SAAUJ,GAEf,MAAOjV,GAAGiV,GAAOc,OAAQ,UAAWjc,OAASkG,EAAGiV,GAAO3Q,KAAM,UAAWxK,OAAS,GAQrFgc,SAAU,SAAUb,GAEhB,GAAIO,GAAQxV,EAAGiV,EAMf,OALKO,GAAM1b,OAAS,IAEhB0b,EAAQxV,EAAGiV,GAAOc,OAAQ,WAAc/V,EAAGiV,GAAO3Q,KAAM,WAGrDkR,KAKhBrP,OAAQnD,iBACX,SAAWhD,GAGPA,EAAGU,UAAWJ,GAAI,eAAgB,SAAU4J,EAAGuO,GAG3CzY,EAAGyY,GAAOnU,KAAM,2BAA4BoM,SACxCsE,UAAW,YAKnB7O,QACJ,SAAWnG,EAAGoG,GAGVA,EAAG3H,SAASqZ,YAMRrL,KAAM,SAAU5L,GAEZA,EAAQmJ,SAAU,OAOtBsC,KAAM,SAAUzL,GAEZA,EAAQyI,YAAa,SAK7BnD,OAAQnD,iBAUX,SAAUhD,EAAGoG,GAEVA,EAAG1B,QAAS,uBAAwB,SAAUoP,GAM1C,QAAS4E,GAAiBC,GAEtB,GAAIC,IAAiB,CAarB,OAZAD,GAAqBA,GAAgB,+BACrC3Y,EAAG2Y,GAAe5C,OAAQ,wCAAyC7U,KAAM,SAAU5F,EAAG2V,GAElF,GAAI4H,GAAiB,GAAIC,GAAe7H,GACpC8H,EAAiB/Y,EAAGiR,GAAOhQ,KAAM,8BAA+BvI,QAAS,MAAO,IAAKyB,MAAO,IAC1F0e,GAAcG,QAASD,KAEzBH,GAAiB,KAKlBA,EAGX,QAASE,GAAe7H,GAkBpB,QAAS+H,GAASC,GAGd,MAAKC,MAEM,GAGXC,EAAiB,GAAIC,GAAaC,EAAMC,iBACxCP,EAAiBE,EAEjBM,IAE4C,GAArCJ,EAAYK,eAAe1f,QAGtC,QAASyf,KAELvZ,EAAG,oBAAqBuY,QAGxB,KAAM,GADFkB,IAAwB,EAClBne,EAAI,EAAGA,EAAIyd,EAAejf,OAAQwB,IAElCoe,EAAeX,EAAezd,GAAIme,KAEpCJ,EAAMtY,QAAS,oBACf0Y,GAAwB,EAI3BN,GAAYQ,eAAgBC,EAAQC,QAAQ7S,QAAgD,GAArCmS,EAAYK,eAAe1f,QAEnF8f,EAAQC,QAAQvQ,YAAa,aAC7B+P,EAAM/U,KAAM,cAAgBsV,EAAQC,QAAQ5Y,KAAM,MAAS,MAAOqI,YAAa,aAE/EsQ,EAAQC,QAAQ7P,SAAU,eAC1BqP,EAAM/U,KAAM,cAAgBsV,EAAQC,QAAQ5Y,KAAM,MAAS,MAAO+I,SAAU,iBAI5E4P,EAAQC,QAAQvQ,YAAa,eAC7B+P,EAAM/U,KAAM,cAAgBsV,EAAQC,QAAQ5Y,KAAM,MAAS,MAAOqI,YAAa,eAE/EsQ,EAAQC,QAAQ7P,SAAU;AAC1BqP,EAAM/U,KAAM,cAAgBsV,EAAQC,QAAQ5Y,KAAM,MAAS,MAAO+I,SAAU,cAIpF,QAAS0P,GAAehC,EAAK+B,GAEzB,GAAIK,GAAYX,EAAYY,QAASrC,EAOrC,OALOsC,GAAqBtC,IAExBsC,EAAqBtC,GAAKa,SAGxBqB,EAAQlC,GAKW,GAApBoC,EAAUhgB,QAEX8f,EAAQlC,GAAK1Q,IAAK8S,EAAU,IAE5BF,EAAQlC,GAAKpO,YAAa,aAC1B+P,EAAM/U,KAAM,cAAgBsV,EAAQlC,GAAKzW,KAAM,MAAS,MAAOqI,YAAa,aAE5EsQ,EAAQlC,GAAK1N,SAAU,eACvBqP,EAAM/U,KAAM,cAAgBsV,EAAQlC,GAAKzW,KAAM,MAAS,MAAO+I,SAAU,gBAClE,IAIP4P,EAAQlC,GAAKpO,YAAa,eAC1B+P,EAAM/U,KAAM,cAAgBsV,EAAQlC,GAAKzW,KAAM,MAAS,MAAOqI,YAAa,eAE5EsQ,EAAQlC,GAAK1N,SAAU,aACvBqP,EAAM/U,KAAM,cAAgBsV,EAAQlC,GAAKzW,KAAM,MAAS,MAAO+I,SAAU,aAEnEyP,GAEFQ,EAAqBL,EAAQlC,GAAMoC,GAEvCF,EAAQlC,GAAKzN,IAAK,SAClB2P,EAAQlC,GAAKwC,SACN,IA5BA,EAiCf,QAASC,GAAwB1Q,EAAS2Q,GAEtCJ,EAAqBI,GAAe/N,KAChCgO,MAAS5Q,EAAQ6Q,YAAY,GAC7BC,KAAS9Q,EAAQ+Q,WAAWD,KAC5BE,IAAShR,EAAQ+Q,WAAWC,IAAMhR,EAAQoF,aAAa,KAI/D,QAASoL,GAAqBxQ,EAASiR,GAEnC,GAAIN,GAAgB3Q,EAAQxI,KAAM,OAGlC+Y,GAAqBI,GAAiBpa,EAAGoG,EAAGrB,gBAAiB,yCAA0C2V,OAAQA,KAE/GP,EAAwB1Q,EAAS2Q,GAEjCpa,EAAGiI,QAAS3H,GAAI,aAAc,WAE1B6Z,EAAwB1Q,EAAS2Q,KAIrCJ,EAAqBI,GAAe9V,KAAM,wBAAyBpD,KAAM,SAAU5F,EAAGiL,GAGlF,GAAIrG,GAAQF,EAAGuG,GACX1L,EAAQqF,EAAMe,KAAM,qBAExBf,GAAM8O,MAAO,WAGTvF,EAAQzC,IAAKnM,EAGb,IAAI8f,KACJA,GAAclR,EAAQxI,KAAM,SAAYpG,EACxCse,EAAYpD,OAAQ4E,GAGpBpB,QAOR9P,EAAQ5M,SAAS2T,OAAQwJ,EAAqBI,IAGlD,QAASlB,KAEL,MAA+C,eAAtCU,EAAQgB,OAAO5T,MAAM6T,eAAwE,eAAtCjB,EAAQgB,OAAO5T,MAAM6T,cAjKzF,GASI1B,GACAJ,EAVAM,EAAuBrZ,EAAGiR,GAC1B2I,GACAgB,OAASvB,EAAM/U,KAAM,wBACrBwW,IAASzB,EAAM/U,KAAM,qBACrByW,KAAS1B,EAAM/U,KAAM,sBACrBuV,QAASR,EAAM/U,KAAM,0BAErB0V,IAKJ,QACIhB,QAASA,GAyJjB,QAASI,GAAa4B,GAalB,QAAS7E,KAELrC,EAAIpQ,IAAK,gDACLuX,eAAgB,gBAChBC,OAAgBF,EAAaJ,OAC7BE,IAAgBE,EAAaF,IAC7BK,KAAgBH,EAAaD,KAC7BK,QAAgBJ,EAAanB,QAC7BwB,QAAgBL,EAAaM,YAC9B,GAAO,GAAO,GAAO5V,KAAM,SAAUC,GAKpC,IAAM,GAFF4V,GAAiB5V,EAASX,KAAKlL,OAEzBwB,EAAI,EAAOigB,EAAJjgB,EAAoBA,IACrC,CACI,GAAIkgB,GAAkB7V,EAASX,KAAK1J,GAEhCmgB,EAAUC,EAAYF,EACpBC,GAOFA,EAAQ5B,QAAQpe,KAAM+f,EAAgB3B,UALtC2B,EAAgB3B,SAAW2B,EAAgB3B,SAC3C8B,EAAUlgB,KAAM+f,OAYhC,QAASE,GAAYE,GAIjB,IAAM,GAFFC,GAAeF,EAAU7hB,OAEnByF,EAAI,EAAOsc,EAAJtc,EAAkBA,IAE/B,GAAKqc,EAAWhB,QAAUe,EAAUpc,GAAGqb,QAAUe,EAAUb,KAAOa,EAAUpc,GAAGub,KAAOc,EAAWb,MAAQY,EAAUpc,GAAGwb,KAElH,MAAOY,GAAUpc,EAIzB,OAAO,MAIX,QAASia,KAEL,MAAOmC,GAGX,QAAS5B,GAASrC,GAKd,IAAM,GAHFoE,MACAD,EAAeF,EAAU7hB,OAEnBwB,EAAI,EAAOugB,EAAJvgB,EAAkBA,IACnC,CACI,GAAImgB,GAAUE,EAAUrgB,EACnB0E,GAAE6C,QAAS4Y,EAAQ/D,GAAMoE,GAAY,GAEtCA,EAAQrgB,KAAMggB,EAAQ/D,IAI9B,MAAOoE,GAGX,QAAS/F,GAAQ4E,GAKb,IAAM,GAHFoB,MACAF,EAAoBF,EAAU7hB,OAExBwB,EAAI,EAAOugB,EAAJvgB,EAAkBA,IACnC,CACI,GAAImgB,GAAUE,EAAUrgB,IAChBqf,EAAcC,QAAUD,EAAcC,QAAUa,EAAQb,QACtDD,EAAcG,KAAOH,EAAcG,KAAOW,EAAQX,KAClDH,EAAcI,MAAQJ,EAAcI,MAAQU,EAAQV,OAE1DgB,EAAkBtgB,KAAMggB,GAIhCE,EAAYI,EAGhB,QAASpC,GAAgByB,GAErBA,EAAU3X,SAAU2X,EAIpB,KAAM,GAFFS,GAAeF,EAAU7hB,OAEnBwB,EAAI,EAAOugB,EAAJvgB,EAAkBA,IAI/B,IAAM,GAFFmgB,GAAUE,EAAUrgB,GAEdiE,EAAI,EAAGA,EAAIkc,EAAQ5B,QAAQ/f,OAAQyF,IAC7C,CACI,GAAIyc,GAAQP,EAAQ5B,QAAQta,GAAGpF,MAAO,IACtC,IAAuB,GAAhB6hB,EAAMliB,QAAeshB,GAAWY,EAAM,IACtB,GAAhBA,EAAMliB,QAAeshB,GAAWY,EAAM,IAAMZ,GAAWY,EAAM,GAEhE,OAAO,EAKnB,OAAO,EA3HX,GAAIL,KAIJ,OAFAxF,MAGIqD,aAAgBA,EAChBO,QAAgBA,EAChBhE,OAAgBA,EAChB4D,eAAgBA,GAxMxB,OACIjB,gBAAiBA,KA8TrB,gBACLvS,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAaVA,EAAG1B,QAAS,wBAAyB,SAAUoP,EAAKS,EAAUpD,GAkB1D,QAAS8K,KAGL,GAAIhL,GAAOjR,EAAG,4CAEd,IAAKiR,EAAKiL,eACV,CAEI,GAAIxB,GAASzJ,EAAKqI,gBAEdjZ,GACA8b,MAAOzB,EAAOyB,MAGlB,OAAOrI,GAAIJ,KAAM,+BAAgCrT,GAC5CqF,KAAM,SAAUC,GAEoB,GAA5BA,EAASX,KAAKoX,aAEfpc,EAAG,sDAAuDsM,OAC1DtM,EAAG,uDAAwDyM,WAgB/E,QAAShG,GAAewK,GAEpB,GAAKA,EAAKiL,eACV,CACI,GAAIxB,GAASzJ,EAAKqI,gBAEdjZ,GACA8b,MAAUzB,EAAO2B,UACjBC,SAAU5B,EAAO6B,cAIrB,OADApL,GAAGuB,iBACIoB,EAAIJ,KAAM,wBAAyBrT,GACrCqF,KAAM,WAGHuC,OAAO6C,SAASC,OAAQkG,EAAKhQ,KAAM,cAcnD,QAASub,GAAmBC,GAGxB,MAAO3I,GAAIJ,KAAM,yCAA0C+I,GACtD/W,KAAM,SAAUC,GAEb4O,EAASE,cAAciI,uBAAyB/W,EAASX,OAarE,QAAS2X,KAEL,GAAI1L,GAAOjR,EAAG,qDAEd,IAAKiR,EAAKiL,gBAAkB9V,EAAG/C,cAAcuZ,qBAAqBlE,kBAClE,CACI,GAAIgC,GAAezJ,EAAKqI,eAGxB,IAFAoB,EAAOmC,UAAY,EAEdnC,EAAO/F,UACL+F,EAAO/F,SAASmI,wBAChBpC,EAAO/F,SAASmI,uBAAuBC,iBAC9C,CACI,GAAIC,GAA4BtC,EAAO/F,SAASmI,uBAAuBC,gBACvErC,GAAOuC,uBAAyBvC,EAAOuC,0BAEvC,KAAM,GAAIC,KAAYF,GAEbA,EAAcE,IAEfxC,EAAOuC,uBAAuBxhB,MAC1B0hB,WAAeD,EACfE,cAAeJ,EAAcE,KAM7C,MAAOV,GAAmB9B,GACrBhV,KAAM,WAEHuC,OAAO6C,SAASC,OAAQkG,EAAKhQ,KAAM,cAnInD,OACIgb,cAAmBA,EACnBxV,cAAmBA,EACnB+V,kBAAmBA,EACnBG,iBAAmBA,KAmIvB,aAAc,kBAAmB,eAEtCxW,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAgBVA,EAAG1B,QAAS,gBAAiB,SAAUoP,EAAK3C,EAAImD,EAAKC,EAAUnD,GAsB3D,QAASzK,GAAe0W,GAGbA,GAGHvJ,EAAIpQ,IAAK,4BAA8B,0BAA0BrB,cAAgB,KAEzEib,OAAUD,EAAQ,GAAGtW,iBACrBwW,SAAUF,EAAQ,GAAGnW,qBACtB,GAAO,GAAOxB,KAAM,SAAU8X,GAG5BA,EAAKxY,KAAK,GAAG3G,QAAS,cAAiB,EAExC+S,EAAMG,UACDzF,WAAY0R,EAAKxY,KAAK,IACtBwM,SAAUpL,EAAGnB,UAAW,4BACxByM,gBAAiBtL,EAAGnB,UAAW,SAC/B0M,UAAW,WAGR,MAAK3R,GAAG,iDAAkDkc,gBAGtDuB,EAAYC,EAAiBL,KAGtB,IAIA,IAGd5Q,OAILgR,EAAYJ,KAa5B,QAASK,GAAiBC,GAGtB,GAGIhgB,GAHAigB,EAAkB5d,EAAG,iDACrB6P,KACAgO,EAAkB,EAwCtB,OApCAD,GAAgBtZ,KAAM,wBAAyBpD,KAAM,WAEjDvD,EAAoB1F,KAAK+F,KAAKL,MAAO,gCACrCggB,EAAoBG,EAAoBH,EAAmBhgB,EAAM,GAAIqC,EAAG/H,MAAO+O,MAAOhH,EAAG/H,MAAO+O,SAIpG4W,EAAgBtZ,KAAM,wBAAyBpD,KAAM,WAKjD,GAHA2O,EAAW7P,EAAG/H,MACd4lB,EAAWhO,EAAM5O,KAAM,SAEJ,YAAZ4c,GAA0BhO,EAAM/O,GAAI,aAC1B,SAAZ+c,GAAuBhO,EAAM/O,GAAI,aACrB,SAAZ+c,GAAmC,YAAZA,IAAwC,QAAZA,GAAkC,UAAZA,EAC9E,CAEI,GAAIlgB,GAAgBkS,EAAM,GAAG7R,KAAKL,MAAO,+BACzCggB,GAAoBG,EAAoBH,EAAmBhgB,EAAM,GAAIA,EAAM,GAAIkS,EAAM7I,WAGpF,IAAiB,QAAZ6W,EAEN,GAAKhO,EAAM,GAAGkO,OAASlO,EAAM,GAAGkO,MAAMjkB,OAAS,EAE3C6jB,EAAoBK,EAAsBnO,EAAO8N,OAGrD,CACI,GAAIhgB,GAAgBkS,EAAM,GAAG7R,KAAKL,MAAO,oCACrCsgB,EAAgBje,EAAG,yCAA2CrC,EAAM,GAAK,KAAOA,EAAM,GAAK,OAAQqJ,KACvG2W,GAAoBG,EAAoBH,EAAmBhgB,EAAM,GAAIA,EAAM,GAAIsgB,MAKpFN,EAGX,QAASF,GAAYJ,GAEjBvJ,EAAIJ,KAAM,kCAAmC2J,GAAS,GACjD3X,KAAM,WAGH6O,EAASK,eACJlP,KAAM,WAEHwY,IAEA5J,EAAIP,aAAc,2CAA4CoK,UAAWd,EAAQ,GAAGtW,mBAAoBkN,KAAM,YACzGvO,KAAM,SAAUC,GAEb,GAAIqC,GAAU5B,EAAGpC,UAAW,6BAA8B,KACtDwR,EAAUpE,EAAMG,UAAUzF,WAAYnG,EAASX,KAAK,GAEnDgD,GAAU,GAEXwN,EAAMrN,WAAYH,GAGtBwN,EAAM/I,aAGtBnE,KAAM,SAAUwJ,GAGpBX,EAAGc,YAAaiB,KAAK3U,MAAOuT,EAAMC,cAAejQ,MAAMoQ,eAI/D,QAASkM,GAAef,GAEpBvJ,EAAIH,IAAK,kCAAmC0J,GACvC3X,KAAM,WAGH6O,EAASW,iBAAkB9O,EAAGpC,UAAW,gBACzCuQ,EAASK,eACJlP,KAAM,WAEHwY,QAKpB,QAASF,GAAsBK,EAAQV,GAEnC,GAGIW,GACAC,EAJA7G,EAAwB2G,EAAO,GAAG3R,GAClC8R,KACAC,KAGApe,GACAzF,KAAa,OACboK,QACA+N,QAAa,EACbpW,OAAa,EACb8I,SAAa,OACbuN,aAAa,EACbC,aAAa,EAGjBuL,GAAsB9G,GAAO2G,EAAO,GAAGN,MAGM,IAAxCU,EAAsBpgB,QAASqZ,IAEhC+G,EAAsBhjB,KAAMic,EAGhC,KAAM,GAAIpc,GAAI,EAAGxB,EAAS2kB,EAAsB3kB,OAAYA,EAAJwB,IAAcA,EAElEgjB,EAAW,GAAII,UACfH,EAAWC,EAAsBC,EAAsBnjB,IACvDgjB,EAAS9N,OAAQ,IAAK+N,EAAS,GAAIA,EAAS,GAAGvgB,MAE/CqC,EAAO2E,KAAOsZ,EAEdxK,EAAIJ,KAAM,iCAAkCrT,EAGhD,IAAI1C,GAAQ0gB,EAAO,GAAGrgB,KAAKL,MAAO,mCAElC,OAAOmgB,GAAoBH,EAAmBhgB,EAAM,GAAIA,EAAM,GAAI6gB,EAAsB9G,GAAK,GAAS,MAa1G,QAASoG,GAAoBa,EAAYnE,EAAUoE,EAASX,GAwBxD,MAtBKzD,GAAW,GAA6B1b,QAAxB6f,EAAWnE,KAE5BmE,EAAWnE,GAAsCxa,EAAE6U,QAAQ,KAAU8J,EAAW,IAChFA,EAAWnE,GAAUqE,8BAGI/f,QAAxB6f,EAAWnE,KAEZmE,EAAWnE,GAAUtT,mBAAqB,EACapI,QAAlD6f,EAAWnE,GAAUqE,4BAEtBF,EAAWnE,GAAUqE,8BAEpBZ,GAEDU,EAAWnE,GAAUqE,0BAA0BpjB,MAC3CqjB,uBAA2BF,EAC3BG,0BAA2Bd,KAKhCU,EAGX,QAASK,GAAoBC,GAEzB,GAAIzJ,GAAQxV,EAAG,6BAA+Bif,EAAe,KAC7DzJ,GAAMA,MAAO,QACbA,EAAMlR,KAAM,iCAAkChE,GAAI,QAAS,WAEvD,GAAIiI,GAAiB2W,EAAeD,GAChC5X,IAGJmO,GAAMlR,KAAM,iEAAkEpD,KAAM,SAAU5F,EAAG6jB,GAE7F,GAAIxhB,GAAQwhB,EAAgBnhB,KAAKL,MAAO,yCACnCA,IAASA,EAAM,IAEhB0J,EAAe5L,MACX8L,sBAA4B5J,EAAM,GAClC6J,2BAA4BxH,EAAGmf,GAAkBnY,UAM/B,GAAzBK,EAAevN,SAEhByO,EAAWd,yBAA2BJ,GAG1C+W,GAAgB7V,MAKxB,QAAS6W,GAAiBH,GAGtB,GAAI1W,GAAa2W,EAAeD,EAGhC1W,GAAWsW,6BAEX/K,EAAIpQ,IAAK,4BAA8B,0BAA0BrB,cAAgB,KAC7Eib,OAAc/U,EAAWxB,iBACzBwW,SAAchV,EAAWrB,mBACzBmB,aAAc4W,IACdvZ,KAAM,SAAU8X,GAGhBpM,EAAMG,UACDzF,WAAY0R,EAAKxY,KAAK,IACtBwM,SAAUpL,EAAGnB,UAAW,0BACxByM,gBAAiBtL,EAAGnB,UAAW,SAC/B0M,UAAW,WAGR,MAAK3R,GAAG,iDAAkDkc,gBAGtDkC,EAAeV,GAAkBnV,MAG1B,IAIA,IAGdkE,SAIb,QAASyS,GAAeD,GAGpB,IAAM,GADFI,GAAc9K,EAASE,cAAc6K,gBAC/BhkB,EAAI,EAAGA,EAAI+jB,EAAYvlB,OAAQwB,IAErC,GAAK+jB,EAAY/jB,GAAG2jB,cAAgBA,EAEhC,MAAOI,GAAY/jB,EAI3B,OAAO,MAUX,QAASikB,GAAkBN,EAAcO,GASrC,QAASC,KAEL3L,EAAAA,UAAY,wDAA0DmL,GACjEvZ,KAAM,WAEH6O,EAASK,eAAelP,KAAM,YAIpB6O,EAASE,cAAc6K,iBAAmB/K,EAASE,cAAc6K,gBAAgBxlB,QAAU,EAE7Fya,EAASW,iBAAkB9O,EAAGpC,UAAW,iBAMpChE,EAAG,qDAAsDlG,QAAU,EAEpEga,EAAIpQ,IAAK,qDAAsDgC,KAAM,SAAUC,GAE3E,GAAI+Z,GAAuB1f,EAAG,yBAA0B8G,QAAS,MAC7D6Y,EAAuBD,EAAe5Y,QAAS,cACnD4Y,GAAeE,QAAS,WAEpB5f,EAAG/H,MAAOqS,SAAU,2CAA4CiO,SAChEvY,EAAG/H,MAAOsgB,SACVoH,EAAqBE,QAAS7f,EAAG2F,EAASX,KAAK,KAAOsH,OAAOwT,OAAO,WAChE1Z,EAAG/C,cAAce,eAAgBub,SAO7CpL,EAASQ,gBAAiB,mBAE9BR,EAASQ,gBAAiB,WAG9BmJ,IAEA6B,EAASvM,cAhDzB,GAAIuM,GAAW/f,EAAEuT,WAGbyM,EAAWd,EAAeD,GAAegB,kBAAkB,EA0E/D,OAxBMT,GAqBFC,IAlBArO,EAAMG,UACDC,SAAUpL,EAAGnB,UAAW,mBACxB6G,WAAY,MAAQ1F,EAAGnB,UAAW,6DAAgEib,KAAMF,IAAc,QACtHpO,UAAW,WAIRmO,EAASI,WAEZxO,UAAW,WAER8N,MAEH/N,gBAAiBtL,EAAGnB,UAAW,WAC/BwH,OAOFsT,EAUX,QAAS3X,GAAiB6W,EAAc/X,GAGpC,GAA2B,GAAtBA,EAED,MAAOqY,GAAkBN,EAQ7B,KAAM,GAHF1W,GACA6X,EAHAL,EAAW/f,EAAEuT,WACblT,EAAWkU,EAASE,cAAc6K,gBAI5BhkB,EAAI,EAAGA,EAAI+E,EAAOvG,OAAQwB,IAEhC,GAAK+E,EAAO/E,GAAG2jB,cAAgBA,EAC/B,CACImB,EAAkB9kB,EAClBiN,EAAkBlI,EAAO/E,EACzB,OAqBR,MAhBOiN,IAAcA,EAAWrB,oBAAsBA,IAElD7G,EAAO+f,GAAiBlZ,mBAAqBzD,SAAUyD,GAEvD4M,EAAIJ,KAAM,kCAAmCrT,GACxCqF,KAAM,WAEH6O,EAASO,cAAcpP,KAAM,WAEzB6O,EAASW,iBAAkB9O,EAAGpC,UAAW,gBACzCka,IACA6B,EAASvM,eAKlBuM,EAQX,QAAS7B,KAGL3J,EAASa,oBAAqB,qBACzB1P,KAAM,WAGH1F,EAAG,8BAA+BkB,KAAM,SAAU5F,EAAGiL,GAEjD,GAAIyJ,GAAchQ,EAAGuG,GAAOtF,KAAM,2BAC7BsT,GAASE,cAAc6K,gBAAgBxlB,QAAU,EAElDkG,EAAGuG,GAAOyD,SAAUgG,GAIpBhQ,EAAGuG,GAAO+C,YAAa0G,MAOvC,IAAIqQ,GAAoB,CACxBrgB,GAAEkB,KAAMqT,EAASE,cAAc6K,gBAAiB,SAAUhkB,EAAGiN,GAEzD8X,GAAqB9X,EAAWrB,qBAGpClH,EAAG,oDAAqDkF,KAAMmb,GAC9DrgB,EAAG,gDAAiDkF,KAAMqP,EAASE,cAAc6L,OAAOC,eAU5F,QAASC,KAEL,GAAIngB,IACAogB,uBAAwBzgB,EAAG,4CAA6CgH,MAG5E,OAAO8M,GAAIJ,KAAM,yBAA0BrT,GACtCqF,KAAM,WAEH6O,EAASO,cACJpP,KAAM,WAGHgb,QAWpB,QAASC,KAEL,GAAItgB,IACAogB,uBAAwBlM,EAASE,cAAcmM,OAAOH,uBAG1D,OAAO3M,GAAAA,UAAY,yBAA0BzT,GACxCqF,KAAM,WAEH6O,EAASO,cACJpP,KAAM,iBAEI6O,GAASE,cAAcmM,OAE9BF,QAMpB,QAASA,KAELnM,EAASQ,gBAAiB,UAErB/U,EAAG,4CAA6ClG,OAAS,GAE1Dya,EAASQ,gBAAiB,UArjBlC,OACIrN,QAAoBf,EACpBka,WAAoBtB,EACpB/W,QAAoB0W,EACpB9W,gBAAoBA,EACpB4W,mBAAoBA,EACpBI,gBAAoBA,EACpBoB,UAAoBA,EACpBG,aAAoBA,KAijBxB,aAAc,YAAa,aAAc,kBAAmB,kBACjExa,OAAQnD,iBAcV,SAAUhD,EAAGoG,GAeVA,EAAG1B,QAAS,kBAAmB,SAAUoP,EAAK3C,EAAImD,EAAKC,EAAUnD,GAsB7D,QAAS+E,KAEL5B,EAASK,cAAc,GAU3B,QAASkM,KAEL,GAAI7P,GAASjR,EAAG,yCACZ0a,EAASzJ,EAAKqI,eAYlB,OATM/E,GAASE,cAAcsM,uBAEzBxM,EAASE,cAAcsM,qBAAuB,IAE5CxM,EAASE,cAAcuM,wBAEzBzM,EAASE,cAAcuM,sBAAwB,IAG5CzM,EAASE,cAAcsM,uBAAyBrG,EAAOuG,cAAgBjhB,EAAGiR,GAAO3M,KAAM,yBAA0BxK,OAAS,GACxHya,EAASE,cAAcuM,wBAA0BtG,EAAOwG,eAAiBlhB,EAAGiR,GAAO3M,KAAM,0BAA2BxK,OAAS,GAGlIya,EAASE,cAAcsM,qBAAwBrG,EAAOuG,aACtD1M,EAASE,cAAcuM,sBAAwBtG,EAAOwG,cAE/C3M,EAASO,eAMThB,EAAID,OAYnB,QAASsN,GAAqBjF,GAE1B,GAAIjL,GAAOjR,EAAG,gDAEd,KAAMkc,IAAiBjL,EAAKiL,eAExB,OAAO,CAGX,KAAMA,IAAiB9V,EAAG/C,cAAcuZ,qBAAqBlE,gBAAiBzH,GAE1E,OAAO,CAGX,IAAIyJ,GAAoBzJ,EAAKqI,gBACzB8H,EAAoBphB,EAAG,sCAAuCgH,KAElE,IAAyB,EAApBoa,EACL,CAEI,GAAIC,GAAkB3G,CAEtB,OAAM4G,GAAmBD,EAAiB9M,EAASE,cAAc8M,yBA2BtDzN,EAAID,QAzBoB,eAA1BwN,EAAgBzG,QAEjByG,EAAgBG,cAAgB,EAChCH,EAAgBI,cAAgBJ,EAAgBxH,SAEhB,eAA1BwH,EAAgBzG,SAEtByG,EAAgBK,cAAgB,EAChCL,EAAgBM,aAAgBN,EAAgBxH,SAI7C/F,EAAIJ,KAAM,0CAA2C2N,GACvD3b,KAAM,SAAUC,GAGb4O,EAASE,cAAcmN,kCAAoCjc,EAASX,KAAK6c,GACzEtN,EAASE,cAAcqN,0BAAoCnc,EAASX,KAAKsW,UAEzEyG,OAYZ,MAAKX,IAAqB7M,EAASE,cAAcmN,kCAStC9N,EAAID,QANXU,EAASE,cAAcmN,kCAAoCR,MAE3DW,MASZ,QAASA,KAKL,aAHOxN,GAASE,cAAcuN,gCACvBzN,GAASE,cAAcwN,0BAEvB1N,EAASO,cAAcpP,KAAM,WAEhC6O,EAASQ,gBAAiB,wBAC1BR,EAASQ,gBAAiB,wBAEsC,GAA3DR,EAASE,cAAciI,uBAAuBG,WAE/CtI,EAASQ,gBAAiB,2BAE9B/U,EAAG,yBAA0BwV,MAAO,QAGjCxV,EAAE,oBACDA,EAAE,mBAAmBuY,WAYjC,QAAS2J,KAEL,GAAIjR,GAAOjR,EAAG,mDAEVyc,EAAuBxL,EAAKqI,eAGhC,IAFAmD,EAAeI,UAAY,EAEtBJ,EAAe9H,UACb8H,EAAe9H,SAASmI,wBACxBL,EAAe9H,SAASmI,uBAAuBC,iBACtD,CACI,GAAIC,GAAoCP,EAAe9H,SAASmI,uBAAuBC,gBACvFN,GAAeQ,uBAAyBR,EAAeQ,0BAEvD,KAAM,GAAIC,KAAYF,GAEbA,EAAcE,IAEfT,EAAeQ,uBAAuBxhB,MAClC0hB,WAAeD,EACfE,cAAeJ,EAAcE,KAM7C,MAAMoE,GAAmB7E,EAAgBlI,EAASE,cAAciI,wBAUrDyE,IARArN,EAAIJ,KAAM,yCAA0C+I,GACtD/W,KAAM,SAAUC,GAEbwb,IAAsBzb,KAAM6O,EAASK,gBAiBrD,QAAS0M,GAAmBa,EAAUC,GAElC,IAAM,GAAI1K,KAAOyK,GAEb,GAAKA,EAASzK,GAAO,IAAO0K,EAAS1K,GAAO,IAAc,gBAARA,EAE9C,OAAO,CAGf,QAAO,EAUX,QAAS2K,KAGL,GAAI3H,GAAS1a,EAAG,uDAAwDsZ,eAMxE,OAJA/E,GAASE,cAAcwN,0BAA4BvH,EAAO4H,wBACnD/N,GAASE,cAAcmN,wCACvBrN,GAASE,cAAcuN,0BAEvBzN,EAASO,cACXpP,KAAM,WAEH6O,EAASQ,gBAAiB,0BAWtC,QAASwN,KAEL,GAAI5Z,GAAc4L,EAASE,cAAcuN,0BACrCQ,EAAcxiB,EAAG,wDAA0D2I,EAAY,MAAO9L,SAASyc,eAC3G,OAAOxF,GAAIJ,KAAM,iCAAkC8O,GAAa,GAC3D9c,KAAM,SAAUC,GAEb,GAAyD,IAApDA,EAASX,KAAKyd,mCAGf/hB,SAASoK,SAASC,OAAQpF,EAASX,KAAKyd,wCAGvC,IAAO9c,EAASX,KAAK0d,yCAC1B,CAEI,GAAIC,GAAgB3iB,EAAG2F,EAASX,KAAK0d,0CAA2Cpe,KAAM,6CAA8CxK,OAAS,CAC7IsX,GAAMG,UACDzF,WAAYnG,EAASX,KAAK0d,0CAC1B/Q,UAAW,WAER,MAAKgR,GAEMC,IAIAC,MAGdpW,UAGZnE,KAAM,SAAUwJ,GAEb,IAKI,IAAM,GAHFnM,GAAW3F,EAAEgS,UAAWF,EAAMC,cAE9B+Q,KACMxnB,EAAI,EAAGA,EAAIqK,EAAS7D,MAAMoQ,YAAYpY,OAAQwB,IAET,KAAtCqK,EAAS7D,MAAMoQ,YAAY5W,GAAG8b,KAG/B7C,EAASQ,gBAAiB,wBAAyBrP,KAAM,WAErD1F,EAAGU,UAAWK,QAAS,mCAK3B+hB,EAAWrnB,KAAMkK,EAAS7D,MAAMoQ,YAAY5W,GAK/CwnB,GAAWhpB,OAAS,GAErBqX,EAAGc,YAAa6Q,GAGxB,MAAQ5Y,GAEJiH,EAAGgB,WAAYL,EAAMM,OAAQN,EAAMO,eAcnD,QAAS3J,GAAoBC,GA+BzB,MAhBMA,KAGFA,EAAY3I,EAAG,2CAA4CgH,OAG/DuN,EAASE,cAAcuN,0BAA4BrZ,EAE7CvC,EAAGpC,UAAW,4CAEhBuQ,EAASE,cAAcsO,6BAA8B,SAGlDxO,GAASE,cAAcmN,wCACvBrN,GAASE,cAAcwN,0BAEvB1N,EAASO,cACXpP,KAAM,WAEH6O,EAASQ,gBAAiB,0BAItC,QAASnM,GAAqBoa,GAG1B,MADAzO,GAASE,cAAcsO,8BAAgCC,EAChDlP,EAAIH,IAAK,kBACZoP,8BAA+BC,IASvC,QAASC,KAGL3O,EAAIP,aAAc,yCAA0CE,KAAM,YAC7DvO,KAAM,SAAUC,GAEbyL,EAAMG,UACDzF,WAAYnG,EAASX,KAAK,IAC1B4M,UAAW,WAER5R,EAAG,mCAAoCkB,KAAM,SAAU5F,EAAG6F,GAEjDnB,EAAGmB,GAAQ6F,OAASuN,EAASE,cAAcuN,0BAE5ChiB,EAAGmB,GAAQF,KAAM,UAAW,WAI5BjB,EAAGmB,GAAQqJ,WAAY,eAG/BmH,UAAW,WAEX,MAAOiR,OAEVnW,SAWjB,QAASmW,KAEL,GAAI3R,GAAOjR,EAAG,4CAEd,IAAKiR,EAAKiL,eACV,CACI,GAAIxB,GAASzJ,EAAKqI,gBAAgB3E,SAASuO,oBAEvCC,GACAC,iBAAuB1I,EAAO2I,SAC9BC,YAAuB5I,EAAO6I,IAC9BC,sBAAuB9I,EAAO+I,UAC9BC,qBAAuBhJ,EAAOiJ,aAC9BC,aAAuBlJ,EAAOmJ,KAC9BC,YAAuBpJ,EAAOqJ,IAYlC,OATAjQ,GAAIJ,KAAM,gDAAiDyP,GACtDzd,KAAM,WAEH6O,EAASK,eAAelP,KAAM,WAE1BgD,EAAoB,GACpB6L,EAASQ,gBAAiB,6BAG/B,EAIP,OAAO,EAQf,QAASiP,KAGL1P,EAAIP,aAAc,wCAAyCE,KAAM,YAC5DvO,KAAM,SAAUC,GAEbyL,EAAMG,UACDzF,WAAYnG,EAASX,KAAK,IAC1B4M,UAAW,WAER5R,EAAG,mCAAoCkB,KAAM,SAAU5F,EAAG6F,GAEjDnB,EAAGmB,GAAQ6F,OAASuN,EAASE,cAAcuN,0BAE5ChiB,EAAGmB,GAAQF,KAAM,UAAW,WAI5BjB,EAAGmB,GAAQqJ,WAAY,eAG/BmH,UAAW,WAEX,MAAOkR,OAEVpW,SAUjB,QAASoW,KAEL,GAAI5R,GAAOjR,EAAG,2CAEd,IAAKiR,EAAKiL,eACV,CAEI,GAAIxB,GAASzJ,EAAKqI,gBAAgB3E,SAASsP,qBAEvCC,GACAC,MAAUzJ,EAAO0J,MACjBC,KAAU3J,EAAO4J,KACjBC,OAAU7J,EAAO8J,OACjBC,KAAU/J,EAAOgK,KACjBC,MAAUjK,EAAOkK,MACjBC,SAAUnK,EAAOoK,SAQrB,OALAhR,GAAIJ,KAAM,+CAAgDwQ,GACrDxe,KAAM,WAEH6O,EAASK,kBAEV,EAIP,OAAO,EAQf,QAASmQ,GAAuBnqB,GAI5B,GAAgE,GAA3D2Z,EAASE,cAAciI,uBAAuBG,UAE/C,GAAInC,GAAS1a,EAAG,iDAAkDsZ,oBAIlE,IAAIoB,GAAS1a,EAAG,mDAAoDsZ,eAGxE,IAAIjZ,IACA6a,OAAgBR,EAAOE,OACvBQ,QAAgBV,EAAOb,QACvBiB,IAAgBJ,EAAOI,IACvBK,KAAgBT,EAAOK,KACvBiK,WAAgBtK,EAAOuK,WACvBhK,eAAgB,aAGpB3G,GAAIP,aAAc,uCAAwC1T,GAAS4T,KAAM,YACpEvO,KAAM,SAAUC,GAEbyL,EAAMG,UACDzF,WAAYnG,EAASX,KAAK,IAC1ByH,SAWjB,QAASyY,KAEL,GAAIjU,GAAOjR,EAAG,2CACd,IAAKiR,EAAKiL,eACV,CAEI,GAAIxB,GAASzJ,EAAKqI,gBAGdjZ,GACA8kB,wBAA+BzK,EAAO0K,yBAA2B,EACjEC,gBAA+B3K,EAAO4K,iBAAmB,EACzDC,mBAA+B7K,EAAO8K,oBAAsB,EAC5DC,oBAA+B/K,EAAOgL,qBAAuB,EAC7DC,gBAA+BjL,EAAOkL,iBAAmB,EACzDC,8BAA+BnL,EAAOoL,+BAAiC,EACvEC,8BAA+BrL,EAAOsL,+BAAiC,EACvEC,mBAA+BvL,EAAOwL,oBAAsB,EAGhE,OAAOpS,GAAIJ,KAAM,6BAA8BrT,GAC1CqF,KAAM,SAAUC,GAEoC,IAA5CA,EAASX,KAAKmhB,2BAGfle,OAAO6C,SAASC,OAAQpF,EAASX,KAAKmhB,4BAGkB,IAAlDxgB,EAASX,KAAKohB,iCAGpBhV,EAAMG,UACDzF,WAAYnG,EAASX,KAAKohB,kCAC1B3U,gBAAiB,IACjBG,UAAW,WAER3J,OAAO6C,SAASC,OAAQkG,EAAKhQ,KAAM,aACnC0Q,UAAW,WAEf1J,OAAO6C,SAASC,OAAQkG,EAAKhQ,KAAM,aACnCwL,OAMJxE,OAAO6C,SAASC,OAAQkG,EAAKhQ,KAAM,cA1mBvD,OACIkV,KAAwBA,EACxB2K,uBAAwBA,EACxBoB,cAAwBA,EACxBG,mBAAwBA,EACxBlB,oBAAwBA,EACxB4D,sBAAwBA,EACxBxC,eAAwBA,EACxB7Z,mBAAwBA,EACxBE,oBAAwBA,EACxBqa,gBAAwBA,EACxBe,eAAwBA,EACxBkB,WAAwBA,KAqmB5B,aAAc,YAAa,aAAc,kBAAmB,kBACjE/e,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAGVA,EAAG1B,QAAS,kBAAmB,SAAUoP,GAerC,QAASuS,KAYL,QAASC,GAAqB3rB,EAAO4rB,GAIjC,MAFAC,GAAiBC,UAAY9rB,EAC7B6rB,EAAiBE,QAAYH,EACtBtuB,KAGX,QAAS0uB,GAAeC,EAAaC,EAAaC,GAG9C,GAAIzmB,IACA0mB,YAAcF,EACdG,SAAcR,EAAiBC,UAC/BQ,OAAcT,EAAiBE,QAC/BQ,aAAcJ,GAAgBK,IAAgBC,qBAElD,OAAOtT,GAAIpQ,IAAK,kBAAoBkjB,EAAc,IAAKvmB,GA1B3D,GAAImmB,IACAC,UAAW,KACXC,QAAW,KAGf,QACIW,QAASf,EACTgB,MAASX,GAgCjB,QAASY,KAkBL,QAASC,GAAYC,GAGjB,MADApnB,GAAOqnB,OAASD,EACTxvB,KAGX,QAAS0vB,GAAaC,GAGlB,MADAvnB,GAAOwnB,KAAOD,EACP3vB,KAGX,QAAS6vB,GAAYC,EAAQC,EAAMC,GAW/B,MATA5nB,GAAO6nB,OAASH,EACTC,IAEH3nB,EAAO8b,MAAQ6L,GAEZC,IAEH5nB,EAAO8nB,WAAaF,GAEjBhwB,KAGX,QAASmwB,GAAcxB,EAAaC,GAEhC,MAAO/S,GAAIJ,KAAM,kBAAoBkT,EAAc,IAAKvmB,GA3C5D,GAAIA,IACAqnB,OAAY,EACZG,KAAY,GACZK,OAAY,GACZ/L,MAAY,GACZgM,WAAY,EAGhB,QACIX,WAAaA,EACbG,YAAaA,EACbG,WAAaA,EACbnd,GAAayd,GAqCrB,QAASjB,KAEL,OACIkB,cAAsB,gBACtBC,aAAsB,eACtBlB,qBAAsB,yBAI9B,QAASmB,KAEL,OACIC,KAAU,OACVC,SAAU,WACVC,KAAU,QAvHlB,OACIrC,aAAeA,EACfkB,YAAeA,EACfoB,aAAeJ,IACfK,cAAezB,OAuHnB,gBACLhhB,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAYVA,EAAG1B,QAAS,mBAAoB,WAqB5B,QAASmkB,KAOL,MALOC,IAEHC,IAGGD,EAQX,QAASC,KAEL,GAAIC,EAuCJ,IAlCQA,EAJD/gB,OAAOghB,WAELhhB,OAAOghB,WAAY,sBAAuBC,QAEpC,KAEDjhB,OAAOghB,WAAY,qBAAsBC,QAExC,KAEDjhB,OAAOghB,WAAY,qBAAsBC,QAExC,KAIA,KAKNlpB,EAAGiI,QAASoS,SAAW,KAEjB,KAEDra,EAAGiI,QAASoS,SAAW,IAEtB,KAEDra,EAAGiI,QAASoS,SAAW,IAEtB,KAIA,KAGV2O,GAAQF,GAAuB,OAATE,EAC3B,CACI,GAAIG,GAAWL,CACfA,GAAeE,EACfhpB,EAAGiI,QAASlH,QAAS,cAAe+nB,EAAYK,KAIxD,QAASzf,GAAYmB,GAGjB,IAAM,GADFue,GAAeve,EAASnS,QAAS,MAAO,IAAKyB,MAAO,KAC9CmB,EAAI,EAAGA,EAAI8tB,EAAatvB,OAAQwB,IAEtC,GAAK8tB,EAAa9tB,IAAMwtB,EAEpB,OAAO,CAGf,QAAO,EA5FX,GAAIA,EAQJ,OALA9oB,GAAGiI,QAASohB,OAAQN,GAGpB/oB,EAAGU,UAAW+S,MAAOsV,IAGjBle,SAAYge,EACZnf,WAAYA,MAuFrBvD,OAAQnD,iBAaV,SAAUhD,EAAGoG,GASVA,EAAG1B,QAAS,mBAAoB,SAAU4P,EAAKC,GAkD3C,QAAS4B,KASL,GALAvI,EAAa5N,EAAG,4CAChBgV,EAAahV,EAAG,4CAChBspB,EAAatpB,EAAG,iCAChBupB,EAAavpB,EAAG,iCAEX4N,EAAW9T,QAAUkb,EAAUlb,QAAUkb,EAAUlb,OAAS,EACjE,CACmBya,EAASE,aAExBO,GAAU1I,OAGVsB,EAAW1M,KAAM,SAAU5F,EAAGiL,GAE1BvG,EAAGuG,GAAOyD,SAAU,YAEpBhK,EAAGuG,GAAOyI,MAAO,WAEPhP,EAAG/H,MAAO6I,GAAI,cAEhB0oB,EAAMluB,OAKlBguB,EAAWroB,KAAM,WAAY,YAC7BqoB,EAAWta,MAAO,WAEdya,MAGJF,EAAWtoB,KAAM,WAAY,YAC7BsoB,EAAWva,MAAO,WAEd0a,MAGJzhB,OAAO0hB,iBAAkB,aAAc,WAE9B1hB,OAAO6C,SAAS8e,KAAK9vB,OAAS,EAE/BoR,EAAQjD,OAAO6C,SAAS8e,MAIxBJ,EAAM,KAEX,GAIHxpB,EAAE6pB,SAAW,SAAU7rB,GAEnB,GAAI8d,GAAU,GAAIvhB,QAAQ,OAAUyD,EAAO,aAAc8rB,KAAM7hB,OAAO6C,SAASF,KAC/E,OAAgB,OAAXkR,EAEM,KAIAA,EAAQ,IAAM,EAI7B,IAAI5Z,GAAQlC,EAAE6pB,SAAU,UAEY,IAA/B5hB,OAAO6C,SAAS8e,KAAK9vB,QAAiBoI,GAASlC,EAAG,6BAA+BkC,EAAQ,MAAOpI,OAAS,EAE1GmO,OAAO6C,SAAS8e,KAAO1nB,EAKvBsnB,GAFOte,EAAQjD,OAAO6C,SAAS8e,OAAUxb,GAAW,EAE9CA,EAIA,GAGV2b,IACA/pB,EAAGiI,QAAS3H,GAAI,aAAcypB,GAC9B/pB,EAAGiI,QAASohB,OAAQ,WAEqC,MAAhDjjB,EAAG/C,cAAcoH,iBAAiBI,YAEnCkf,OAYhB,QAASC,KAEL,MAAK5b,IAAW,GAGR1B,GAAO1M,EAAGgV,EAAU5G,IAAWnN,KAAM,2BACrCrD,MAAOwQ,GAKJ,KAmBf,QAAS6b,GAAcC,GAGnB,MADAC,GAAaF,aAAaxuB,KAAMyuB,GACzB9jB,EAAG/C,cAAcqH,iBAS5B,QAAS0f,GAAaF,GAGlB,MADAC,GAAaC,YAAY3uB,KAAMyuB,GACxB9jB,EAAG/C,cAAcqH,iBAY5B,QAAS2f,GAAqBtmB,EAAYnG,GAEtC,GAAI0sB,IAAoB,CAExB,IAAKlc,GAAW,GAAoB,gBAAfrK,EACrB,CAEI,GAAIwmB,GAAmBP,IACnBQ,GACA5sB,MAAOA,EACP8O,GAAO1M,EAAGgV,EAAUpX,IAASqD,KAAM,2BAGvCjB,GAAEkB,KAAMipB,EAAapmB,GAAa,SAAUzI,EAAG4uB,GAE3C,MAAKA,GAAaK,EAAkBC,MAAsB,GAEtDF,GAAoB,GACb,GAHX,SAQR,MAAOA,GAUX,QAASd,GAAM5rB,EAAO6sB,GAGlB,GAAIC,GAAiBtc,IAAYxQ,IAE5B8sB,GAAmBD,GAEdJ,EAAqB,eAAgBzsB,MAM/CwQ,EAAUxQ,GAEJZ,OAAO2G,OAAQgnB,EAAevc,GAAUmG,EAASE,aAAa,KAAYiW,GAAoB1qB,EAAGgV,EAAU5G,IAAWnN,KAAM,iCAE9H0pB,EAAevc,GAAWmG,EAASE,aAAa,GAEhDH,EAAIF,mBAAoBpU,EAAGgV,EAAU5G,IAAWnN,KAAM,iCACjDyE,KAAM,SAAUC,GAEb3F,EAAGgV,EAAU5G,IAAW6G,KAAMtP,EAASX,KAAK,IAE5C4lB,EAAkBF,GAClBtkB,EAAG/C,cAAce,eAAgB4Q,EAAU5G,IAC3CpO,EAAGiI,QAASlH,QAAS,qBAM7B6pB,EAAkBF,IAM1B,QAASE,GAAkBF,GAIvB1qB,EAAGgV,GAAY1I,MAGf,IAAIpM,EACJF,GAAG4N,GAAa1M,KAAM,SAAU5F,EAAGiL,GAE/BrG,EAAQF,EAAGuG,GACXrG,EAAMoJ,YAAa,mBAEnBpJ,EAAMoE,KAAM,gBAAiBrD,KAAM,gBAAiB,SAE3CmN,EAAJ9S,EAGD4E,EAAM8J,SAAU,WAIX1O,GAAK8S,GAENlO,EAAM8J,SAAU,kBAChB9J,EAAMoE,KAAM,gBAAiBrD,KAAM,gBAAiB,SAI/C3F,EAAI8S,IAAYlO,EAAMY,GAAI,aAG3BZ,EAAM8J,SAAU,cAKhC+f,IAGgB,GAAX3b,EAEDmb,EAAWtoB,KAAM,WAAY,YAI7BsoB,EAAW/e,WAAY,YAItB4D,EAAU,GAAKR,EAAW9T,OAE3BwvB,EAAWroB,KAAM,WAAY,YAI7BqoB,EAAW9e,WAAY,YAI3BxK,EAAGgV,EAAU5G,IAAW3B,OAGnB2B,EAAU,EAEXnG,OAAO6C,SAAS8e,KAAO5pB,EAAGgV,EAAU5G,IAAWnN,KAAM,2BAIhDgH,OAAO6C,SAAS8e,KAAK9vB,OAAS,IAE/BmO,OAAO6C,SAAS8e,KAAO,IAI1Bc,GAEDL,EAAqB,cAAejc,GAS5C,QAASyc,GAAgBL,GAErBhB,EAAMgB,EAAgB5sB,OAAO,GAYjC,QAAS6rB,KAEArb,EAAUR,EAAW9T,OAAS,GAE/B0vB,EAAMpb,EAAU,GAQxB,QAASsb,KAEAtb,EAAU,GAEXob,EAAMpb,EAAU,GAUxB,QAASlD,GAAQ4f,GAEb,MAAoB,QAAfA,GAEDrB,KACO,GAEc,QAAfqB,GAENpB,KACO,IAIPoB,EAAcA,EAAYpyB,QAAS,IAAK,IACxCsH,EAAGgV,GAAY9T,KAAM,SAAU5F,EAAGiL,GAE9B,MAAKvG,GAAGuG,GAAOtF,KAAM,4BAA+B6pB,GAEhDtB,EAAMluB,IACC,GAHX,UAQD,GAQX,QAASyuB,KAGL,GAAIgB,GAAkBnd,EAAW9T,MACjC,MAAwB,GAAnBixB,GAAL,CAMA/qB,EAAG4N,GAAapD,WAAY,SAC5BxK,EAAG4N,GAAae,SAAU,QAASnE,WAAY,SAC/CxK,EAAGspB,GAAa9e,WAAY,SAC5BxK,EAAGupB,GAAa/e,WAAY,QAE5B,IAAIwgB,GAAehrB,EAAGupB,GAAajP,aAAeta,EAAGspB,GAAahP,aAAgBta,EAAGspB,GAAahP,YAAY,GAAS,EAAIta,EAAGupB,GAAajP,YAAY,GAAS,CAChKta,GAAGspB,GAAajd,KAAMgO,MAAO2Q,EAAc,OAC3ChrB,EAAGupB,GAAald,KAAMgO,MAAO2Q,EAAc,MAG3C,IAAI3Q,GAAQra,EAAG4N,GAAa/Q,SAASA,SAASyd,YAAY,GAAW,EAAI0Q,CACzE3Q,IAAS5W,SAAUzD,EAAG4N,GAAa/Q,SAASwP,IAAK,eAAmB5I,SAAUzD,EAAG4N,GAAa/Q,SAASwP,IAAK,eAE5G,IAAI4e,GAAW5Q,EACX6Q,IAEJlrB,GAAG4N,GAAa1M,KAAM,SAAU5F,EAAGiL,GAE/B0kB,GAAWxnB,SAAUzD,EAAGuG,GAAO8F,IAAK,eACpC4e,GAAWxnB,SAAUzD,EAAGuG,GAAO8F,IAAK,gBAEpC6e,EAAS5vB,GAAK0E,EAAGuG,GAAOoI,SAAU,QAAS0L,QAC3C4Q,GAAWC,EAAS5vB,GAEpB2vB,GAAWxnB,SAAUzD,EAAGuG,GAAOoI,SAAU,QAAStC,IAAK,eACvD4e,GAAWxnB,SAAUzD,EAAGuG,GAAOoI,SAAU,QAAStC,IAAK,iBAG3D,IAEI8e,GAAaC,EAFbC,EAAkB5nB,SAAUwnB,EAAUF,EAGrCM,GAAkB,GAAK,GAExBF,EAAiBE,EAAkB,EAAM,GACzCD,EAAiBC,EAAkB,EAAM,KAIzCF,EAAeE,EAAkB,EACjCD,EAAeC,EAAkB,EAGrC,IACIC,GAAiBC,EADjBC,EAAkB/nB,SAAUwnB,GAAcF,EAAkB,IAAQI,EAAcC,GAEjFI,GAAkB,GAAK,GAExBF,EAAqBE,EAAkB,EAAM,GAC7CD,EAAqBC,EAAkB,EAAK,KAI5CF,EAAmBE,EAAkB,EACrCD,EAAmBC,EAAkB,EAIzCxrB,GAAG4N,GAAa1M,KAAM,SAAU5F,EAAGiL,GAEtBwkB,EAAkB,EAAtBzvB,EAED0E,EAAGuG,GAAOoI,SAAU,QAAStC,KAAM8e,YAAeA,EAAc,KAAMC,aAAgBA,EAAe,OAIrGprB,EAAGuG,GAAOoI,SAAU,QAAStC,KAAM8e,YAAeG,EAAkB,KAAMF,aAAgBG,EAAmB,UA/fzH,GAAI3d,MACAoH,KACA5G,EAAU,GACVmb,KACAD,KACAa,GACAF,gBACAG,gBAEAO,IAEJ,QACIxU,KAAqBA,EACrB6T,oBAAqBA,EACrBR,KAAqBA,EACrBS,aAAqBA,EACrBG,YAAqBA,EACrBS,eAAqBA,EACrBpB,KAAqBA,EACrBC,SAAqBA,EACrBxe,OAAqBA,EACrB6e,eAAqBA,KAifzB,aAAc,qBAEnB5jB,OAAQnD,iBAWV,SAAUhD,EAAGoG,GAEVA,EAAG1B,QAAS,oBAAqB,SAAUoP,EAAK1C,EAAOnE,GAYnD,QAASiM,KAEL,GAAIgC,GAASlb,EAAG,wBAAyBgH,KACzC,OAAiC,eAAxBkU,EAAOL,eAA0D,eAAxBK,EAAOL,cAG7D,QAAS4Q,KAELC,GACIC,qBAAuB3rB,EAAG,uBAAwB,iDAClD4rB,kBAAuB5rB,EAAG,oBAAqB,iDAC/C6rB,mBAAuB7rB,EAAG,qBAAsB,iDAChD8rB,sBAAuB9rB,EAAG,wBAAyB,kDAIvD0rB,EAAeC,qBAAqB3kB,IAAK,IAEnC0kB,EAAeE,kBAAkB5kB,MAAMlN,OAAS,GAAK4xB,EAAeG,mBAAmB7kB,MAAMlN,OAAS,EAGxGga,EAAIpQ,IAAK,iDAEDuX,eAAgB,aAChB8Q,IAAgBL,EAAeE,kBAAkB5kB,MACjDmU,KAAgBuQ,EAAeG,mBAAmB7kB,QAGrDtB,KAAM,SAAUC,GAEb5F,EAAkB4F,EAASX,KAC3BgnB,EAAkBjsB,EAAOjG,OAED,GAAnBkyB,GAEDC,GAOJ,KAAM,GAJF5rB,IACAsb,cAGMrgB,EAAI,EAAO0wB,EAAJ1wB,EAAqBA,IACtC,CACI,GAAI4wB,GAAmB,KACnBC,EAAmBpsB,EAAOzE,GAAG8wB,uBAC7BC,EAAmBF,EAAe,GACtCE,IAAyBtV,KAAKC,MAA0B,IAAnBqV,GAA2B,KAAKC,QAAS,GAAK5zB,QAAS,IAAK,KAE7E,IAAfyzB,IAEDE,EAAmBF,EACnBD,EAAmB,KAGvB7rB,EAAOsb,UAAUlgB,MACbmC,MAAWtC,EACX4wB,UAAWA,EACXtxB,KAAWmF,EAAOzE,GAAGixB,4BAA8B,cAAgB,cACnE/H,OAAWzkB,EAAOzE,GAAGixB,4BAA8BxsB,EAAOzE,GAAGkxB,4BAA8BzsB,EAAOzE,GAAGmxB,2BACrGvR,OAAWnb,EAAOzE,GAAGqwB,qBACrBvQ,QAAWrb,EAAOzE,GAAGwwB,sBACrBC,IAAWhsB,EAAOzE,GAAGswB,kBACrBzQ,KAAWpb,EAAOzE,GAAGuwB,mBACrBa,SAAW3sB,EAAOzE,GAAGqxB,uBACrBC,SAAWP,EACXQ,OAAW9sB,EAAOzE,GAAGwxB,uBAI7B,GAAI7X,GAAO7O,EAAGrB,gBAAiB,qCAAsC1E,EAErE+Q,GAAMG,UACDC,SAAUpL,EAAGnB,UAAW,+CACxB6G,WAAYmJ,GACZQ,SAAU,YACV9D,UAAW,WA8BR,MA5BA+Z,GAAeG,mBAAmBviB,YAAa,aAAcU,SAAU,eACvEhK,EAAG,cAAgB0rB,EAAeG,mBAAmB5qB,KAAM,MAAS,MAAOqI,YAAa,aAAcU,SAAU,eAEhH0hB,EAAeE,kBAAkBtiB,YAAa,aAAcU,SAAU,eACtEhK,EAAG,cAAgB0rB,EAAeE,kBAAkB3qB,KAAM,MAAS,MAAOqI,YAAa,aAAcU,SAAU,eAE/G0hB,EAAeC,qBAAqBriB,YAAa,aAAcU,SAAU,eACzEhK,EAAG,cAAgB0rB,EAAeC,qBAAqB1qB,KAAM,MAAS,MAAOqI,YAAa,aAAcU,SAAU,eAElH0hB,EAAeI,sBAAsBxiB,YAAa,aAAcU,SAAU,eAC1EhK,EAAG,cAAgB0rB,EAAeI,sBAAsB7qB,KAAM,MAAS,MAAOqI,YAAa,aAAcU,SAAU,eAEnH+iB,EAAgB/sB,EAAG,kDAAmDgH,MAEjEjH,EAAOgtB,GAAeR,6BAEvBvsB,EAAG0rB,EAAeC,sBAAuB3kB,IAAK,eAC9ChH,EAAG0rB,EAAeI,uBAAwB9kB,IAAKjH,EAAOgtB,GAAeP,+BAIrExsB,EAAG0rB,EAAeC,sBAAuB3kB,IAAK,eAC9ChH,EAAG0rB,EAAeI,uBAAwB9kB,IAAKjH,EAAOgtB,GAAeN,6BAEzEzsB,EAAG0rB,EAAeC,sBAAuB5qB,QAAS,UAElDf,EAAG0rB,EAAeG,oBAAqB7kB,IAAKjH,EAAOgtB,GAAelB,oBAClE7rB,EAAG0rB,EAAeE,mBAAoB5kB,IAAKjH,EAAOgtB,GAAenB,oBAC1D,IAEVnf,SAKbwf,IAKR,QAASA,KAELhf,EAAUkF,WAAY,EAAG/L,EAAGnB,UAAW,2CAEvCymB,EAAeG,mBAAmBviB,YAAa,eAAgBU,SAAU,aACzEhK,EAAG,cAAgB0rB,EAAeG,mBAAmB5qB,KAAM,MAAS,MAAOqI,YAAa,eAAgBU,SAAU,aAElH0hB,EAAeE,kBAAkBtiB,YAAa,eAAgBU,SAAU,aACxEhK,EAAG,cAAgB0rB,EAAeE,kBAAkB3qB,KAAM,MAAS,MAAOqI,YAAa,eAAgBU,SAAU,aAEjH0hB,EAAeG,mBAAmB3R,MAAO,WAErCla,EAAG/H,MAAOqR,YAAa,YACvB,IAAI0jB,GAAUhtB,EAAG/H,MAAOgJ,KAAM,KAC9BjB,GAAG/H,MAAOg1B,QAAS,eAAgB3oB,KAAM,SAAW0oB,EAAU,MAAO1jB,YAAa,eAGtFoiB,EAAeE,kBAAkB1R,MAAO,WAEpCla,EAAG/H,MAAOqR,YAAa,YACvB,IAAI0jB,GAAUhtB,EAAG/H,MAAOgJ,KAAM,KAC9BjB,GAAG/H,MAAOg1B,QAAS,eAAgB3oB,KAAM,SAAW0oB,EAAU,MAAO1jB,YAAa,eArJ1F,GAAIyjB,GAAkB,GAClBrB,KACAM,KACAjsB,IAEJ,QACI0rB,oBAAqBA,EACrBvS,cAAqBA,KAiJzB,aAAc,eAAgB,eAEnC/S,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAQVA,EAAG1B,QAAS,qBAAsB,WAuB9B,QAASwoB,GAAYnpB,GAEjB,GAAId,IACAkqB,gBAAiB,2DACFC,iBACb,aAAeC,mBAAoBC,KACnC,qQAQFC,qBAAsB,2DACPH,iBACb,aAAeC,mBAAoBC,KACnC,0QAQFE,QAAW,qEACCH,mBAAoBC,KAC9B,aAAeG,IACf,2IAGFC,cAAe,wDAGGJ,IAAW,mEACkCK,WAAa,sQAGhF,OAAO1qB,GAASc,GASpB,QAASupB,KAEL,GAAIM,GAAYltB,SAASoK,SAASF,KAC9BijB,EAAY7tB,EAAG,uBAAwBiB,KAAM,OAWjD,OATK4sB,IAAaA,EAAU/zB,OAAS,IAE5B+zB,EAAUxvB,QAAS,QAAW,IAE/BwvB,EAAYntB,SAASoK,SAASgjB,SAAW,KAAOptB,SAASoK,SAASijB,KAAOF,GAE7ED,EAAMC,GAGHD,EASX,QAASI,GAAShwB,GAEd,GAAIiwB,GAAcjuB,EAAG,cAAgBhC,EAAO,MAAOiD,KAAM,UACzD,OAAOgtB,IAAe,GAS1B,QAASR,KAEL,GAAIlY,GAAUyY,EAAS,YACnBE,EAAUF,EAAS,aAWvB,OATKzY,GAAMzb,OAAS,GAAKo0B,EAAQp0B,OAAS,EAEtCyb,GAAS,MAAQ2Y,EAIjB3Y,EAAQvV,EAAG,SAAUkF,OAGlBmoB,mBAAoB9X,GA1G/B,MATiC,mBAAtB,oBAEP6X,iBAAmB,SAEI,mBAAhB,cAEPO,WAAa,OAIbhd,iBAAkBuc,MA8G3B/mB,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAQVA,EAAG1B,QAAS,oBAAqB,WAc7B,QAASypB,GAAgBttB,GAGrB,MADAA,GAAUb,EAAGa,GACRA,EAAQC,GAAI,UAAaD,EAAQC,GAAI,WAAcD,EAAQC,GAAI,YAEzDD,EAIFA,EAAQyD,KAAM,SAAUxK,OAAS,EAE3B+G,EAAQyD,KAAM,SAGfzD,EAAQyD,KAAM,UAAWxK,OAAS,EAEjC+G,EAAQyD,KAAM,UAGfzD,EAAQyD,KAAM,YAAaxK,OAAS,EAEnC+G,EAAQyD,KAAM,YAKd,KAanB,QAAS8pB,GAAcC,GAGnB,MAAKA,GAAYvtB,GAAI,UAAautB,EAAYvtB,GAAI,WAAcutB,EAAYvtB,GAAI,YAGrEd,EAAE4B,KAAMysB,EAAYrnB,OAAQlN,OAAS,GAK5C+H,QAAQC,MAAO,+CAAiDusB,EAAYC,KAAM,WAAc,MACzF,GAWf,QAASC,GAAcF,GAEnB,GAAIG,GAAa,yIACjB,OAAKJ,GAAcC,GAERG,EAAWpxB,KAAM4C,EAAE4B,KAAMysB,EAAYrnB,SAIrC,EAWf,QAASynB,GAAgBJ,GAErB,MAAKD,GAAcC,GAERruB,EAAE0uB,UAAW1uB,EAAE4B,KAAMysB,EAAYrnB,SAIjC,EAYf,QAAS2nB,GAAeN,EAAaO,GAEjC,MAAK5uB,GAAG4uB,GAAY90B,OAAS,EAElBkG,EAAE4B,KAAMysB,EAAYrnB,QAAWhH,EAAE4B,KAAM5B,EAAG4uB,GAAY5nB,OAItDhH,EAAE4B,KAAMysB,EAAYrnB,QAAW4nB,EAI9C,QAASC,GAAYR,GAEjB,MAAOA,GAAYvtB,GAAI,YAG3B,QAASguB,GAAWT,GAEhB,MAAOA,GAAYvtB,GAAI,YAoD3B,QAASkQ,GAAUC,EAAMC,GAErB,GAAImd,GAAaU,EAAcC,EAAeC,EAAiBC,EAAO1f,EAAS2f,EAAYC,EAAYC,EAAcC,EAAgBC,EACjIlW,EAAgBrZ,EAAGiR,EACvBC,GAAoBA,GAAc,WAClC,IAAIse,MACAC,GAAgB,CAGpBpW,GAAM/U,KAAM,qCAAsCpD,KAAM,SAAU5F,EAAGiL,GAEjE8oB,EAAervB,EAAGuG,GAAOtF,KAAM,wBAC/B8tB,EAAeZ,EAAgB5nB,GAE/B+oB,EAAmBD,EAAeA,EAAe,OACjDC,EAAiBA,EAAen1B,MAAO,IAEvC,KAAM,GAAImB,GAAI,EAAGxB,EAASi1B,EAAaj1B,OAAYA,EAAJwB,EAAYA,IAC3D,CAII,GAHA+yB,EAAsBruB,EAAG+uB,EAAazzB,IACtCi0B,EAAsBlB,EAAYptB,KAAM,SAElC4tB,EAAYR,KAAkBS,EAAWT,GAE3C,MAOJ,IAJAW,EAAkBM,EAAeh0B,GAAGsG,QAAU0tB,EAAe,GAAG1tB,OAChEqtB,GAAkB,EAGZZ,EAAYvtB,GAAI,UACQ,SAAvByuB,GACuB,YAAvBA,GACAlB,EAAYvtB,GAAI,YAEnB,OAASkuB,GAGL,IAAK,OACDC,GAAmBb,EAAcC,EACjC,MAEJ,KAAK,OACDY,GAAmBV,EAAcF,EACjC,MAEJ,KAAK,SACDY,GAAmBR,EAAgBJ,EACnC,MAEJ,KAAK,QACDY,GAAmBN,EAAeN,EAAaruB,EAAGuG,GAAOtF,KAAM,gCAC/D,MAEJ,KAAK,OAED,KAEJ,SACIY,QAAQC,MAAO,sDAAwDutB,EAAe,SAI7F,KAAKhB,EAAYvtB,GAAI,UACK,SAAvByuB,GACsB,YAAvBA,EAqBF,CAAA,IAAKlB,EAAYvtB,GAAI,UAQtB,WADAe,SAAQC,MAAO,0BAA4B9B,EAAGuG,GAAO+nB,KAAM,WAAc,oCAJzEW,GAAyC,IAArBZ,EAAYrnB,OAAoC,MAArBqnB,EAAYrnB,UAvB/D,CAKI,GAHAkoB,EAAUb,EAAYptB,KAAM,QAC5BuO,EAAU6J,EAAM/U,KAAM,eAAiB4qB,EAAQ,cAAep1B,OAElC,SAAvBy1B,EAEDJ,EAAa,EACbC,EAAa,MAGjB,CACI,GAAIM,GAAS,GAAKC,UAAS,UAAYN,OAAqBO,IAAK,EAAGC,IAAK,EACzEV,GAAaO,EAAOE,IACpBR,EAAaM,EAAOG,IAGxBZ,EAA8BE,EAAV3f,GAAwBA,EAAU4f,EAcrDH,IAEDQ,GAAW,EACXD,EAAc/zB,KAAM4yB,GAEfU,EAAaj1B,OAAS,GAEvBu0B,EAAYrkB,SAAUkH,GACtBmI,EAAM/U,KAAM,cAAgB+pB,EAAYptB,KAAM,MAAS,MAAO+I,SAAUkH,IAIxElR,EAAGuG,GAAOyD,SAAUkH,OAQpCmI,EAAM/Y,GAAI,mBAAoB,WAE1B,GAAIwvB,GAAgB,GAChBC,EAAgB1W,EAAM/U,KAAM,IAAM4M,GAAa8e,QAC/CC,EAAgBF,EAAOG,SAASzV,IAChC0V,EAAgBnwB,EAAG,aAGlBqZ,GAAMvS,QAAS,UAAWhN,OAAS,GAEpCq2B,EAAgB9W,EAAMvS,QAAS,UAAWxC,KAAM,eAChD2rB,EAAgBE,EAAc9iB,aAAgB8iB,EAAcD,SAASzV,IAAMsV,EAAOG,SAASzV,MAGrFpB,EAAMvY,GAAI,YAEhBqvB,EAAgB9W,EAAM/U,KAAM,eAC5B2rB,EAAgBE,EAAc9iB,aAAgB8iB,EAAcD,SAASzV,IAAMsV,EAAOG,SAASzV,OAI1FwV,EAAcH,EAAc7nB,OAAOmoB,aAAeH,EAAehoB,OAAOmoB,YAAcnoB,OAAOooB,cAE9FF,EAAclhB,SACV5B,UAAW4iB,EAAcH,MAKhCL,IAGDpW,EAAM/U,KAAM,IAAM4M,GAAahQ,KAAM,SAAU5F,EAAGiL,GAE9C8nB,EAAcruB,EAAGmuB,EAAgB5nB;AACjC8nB,EAAY/tB,GAAI,cAAe,WAE3B,GAAIgwB,GAAgBtwB,EAAGuG,EACvB+pB,GAAchnB,YAAa4H,GAC3BmI,EAAM/U,KAAM,cAAgBtE,EAAG/H,MAAOgJ,KAAM,MAAS,MAAOqI,YAAa4H,OAIjFmI,EAAMtY,QAAS,oBAAqByuB,IAGxC,IAAIpvB,GAAWiZ,EAAMpY,KAAM,uBAE3B,KAAMwuB,GAAcrvB,GAAwB,UAAZA,GAAmD,kBAApB6H,QAAO7H,GACtE,CAEI,GAAI6Y,KAcJ,OAbAI,GAAM/U,KAAM,2BAA4BpD,KAAM,WAET,YAA5BlB,EAAG/H,MAAOgJ,KAAM,QAEjBgY,EAAOjZ,EAAG/H,MAAOgJ,KAAM,SAAYjB,EAAG/H,MAAO6I,GAAI,YAIjDmY,EAAOjZ,EAAG/H,MAAOgJ,KAAM,SAAYjB,EAAG/H,MAAO+O,QAIrDiB,OAAO7H,GAAW6Y,IACX,EAIP,OAAQwW,EAnXhB,OACIze,SAAUA,KA4XlBhR,EAAEuwB,GAAGrU,aAAe,WAEhB,MAAO9V,GAAG/C,cAAc0N,kBAAkBC,SAAU/Y,OAOxD+H,EAAEuwB,GAAGjX,cAAgB,WAMjB,QAASkX,GAAQhW,EAAU3f,GAEvB,GAAI8C,GAAQ6c,EAAS7c,MAAO,gBAE5B,IAAOA,EAAM,GACb,CACI,GACI8yB,GADAC,EAAW,eAEX/hB,IAEJ,KADAA,EAAS,GAAMhR,EAAM,GACsB,QAAlC8yB,EAAQC,EAAI5G,KAAMnsB,EAAM,MAE7BgR,EAASlT,KAAMg1B,EAAM,GAGzB,KAAM,GAAIn1B,GAAIqT,EAAS7U,OAAS,EAAGwB,GAAK,EAAGA,IAC3C,CACI,GAAI0L,KACJA,GAAI2H,EAASrT,IAAMT,EACnBA,EAAmBmM,EAEvB0T,EAAS1a,EAAE6U,QAAQ,EAAM6F,EAAQ7f,OAIjC6f,GAAO/c,EAAM,IAAM9C,EA5B3B,GAAIoW,GAAShZ,KACTyiB,IA2DJ,OA5BAzJ,GAAK3M,KAAM,2BAA4BpD,KAAM,SAAU5F,EAAGiL,GAEtD,GAAOvG,EAAGuG,GAAOtF,KAAM,QAEnB,GAAiC,YAA5BjB,EAAGuG,GAAOtF,KAAM,QACrB,CAEI,GAAI0vB,KACJ3wB,GAAGiR,GAAO3M,KAAM,UAAYtE,EAAGuG,GAAOtF,KAAM,QAAW,cAAeC,KAAM,SAAU3B,EAAGqxB,GAErFD,EAAYl1B,KAAMuE,EAAG4wB,GAAW5pB,SAEpCwpB,EAAQxwB,EAAGuG,GAAOtF,KAAM,QAAU0vB,OAEA,SAA5B3wB,EAAGuG,GAAOtF,KAAM,QAEjBjB,EAAGuG,GAAOzF,GAAI,aAEf0vB,EAAQxwB,EAAGuG,GAAOtF,KAAM,QAAUjB,EAAGuG,GAAOS,OAKhDwpB,EAAQxwB,EAAGuG,GAAOtF,KAAM,QAAUjB,EAAGuG,GAAOS,SAKjD0T,IAEZvU,OAAQnD,iBAyBXA,gBAAgB8C,SAGhB,IAAI+qB,QAAS7tB,gBAAgBK,aAQ7B8C,QAAQzF,UAAW+S,MAAO,WAEtBod,OAAOzsB", + "mappings": "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", "sourcesContent": [ - "var TemplateCache = {};\n\nTemplateCache[\"addressSuggestions/addressDoctor.html\"] = \"\";\n\nTemplateCache[\"addressSuggestions/postFinder.html\"] = \"{{#addresses}}\\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"{{/addresses}}\\n\" +\n \"\";\n\nTemplateCache[\"error/errorMessage.html\"] = \"
    \\n\" +\n \" Code {{code}}:\\n\" +\n \" {{{message}}}\\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"error/errorPopup.html\"] = \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"modal/modal.html\"] = \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#title}}\\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"

    {{{title}}}

    \\n\" +\n \"
    \\n\" +\n \" {{/title}}\\n\" +\n \"\\n\" +\n \"
    {{{content}}}
    \\n\" +\n \"\\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#labelDismiss}}\\n\" +\n \" \\n\" +\n \" {{/labelDismiss}}\\n\" +\n \"\\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"waitscreen/waitscreen.html\"] = \"
    \";\n\n(function defineMustache(global,factory){if(typeof exports===\"object\"&&exports&&typeof exports.nodeName!==\"string\"){factory(exports)}else if(typeof define===\"function\"&&define.amd){define([\"exports\"],factory)}else{global.Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)===\"[object Array]\"};function isFunction(object){return typeof object===\"function\"}function typeStr(obj){return isArray(obj)?\"array\":typeof obj}function escapeRegExp(string){return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")}function hasProperty(obj,propName){return obj!=null&&typeof obj===\"object\"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"/\":\"/\"};function escapeHtml(string){return String(string).replace(/[&<>\"'\\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\\s*/;var spaceRe=/\\s+/;var equalsRe=/\\s*=/;var curlyRe=/\\s*\\}/;var tagRe=/#|\\^|\\/|>|\\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile===\"string\")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error(\"Invalid tags: \"+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+\"\\\\s*\");closingTagRe=new RegExp(\"\\\\s*\"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp(\"\\\\s*\"+escapeRegExp(\"}\"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===\"\"};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return\"\";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail=\"\";break;case 0:match=\"\";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={\".\":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(\".\")>0){value=context.view;names=name.split(\".\");index=0;while(value!=null&&index\")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol===\"&\")value=this.unescapedValue(token,context);else if(symbol===\"name\")value=this.escapedValue(token,context);else if(symbol===\"text\")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer=\"\";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j\n * =====================================================================================\n */\n\n/**\n * @module PlentyFramework\n */\n(function( $ )\n{\n // will be overridden by grunt\n var version = \"1.0.8\";\n\n /**\n * Collection of uncompiled registered factories & services.\n * See {{#crossLink \"PlentyFramework/compile:method\"}}.compile(){{/crossLink}}\n * @attribute components\n * @static\n * @type {{factories: {}, services: {}}}\n */\n var components = {\n factories : {},\n services : {},\n directives: {}\n };\n\n /**\n * Framework providing client functions for plentymarkets Webshops.\n * @class PlentyFramework\n * @constructor\n */\n PlentyFramework = function()\n {\n };\n\n var instance = null;\n PlentyFramework.getInstance = function()\n {\n instance = instance || new PlentyFramework();\n return instance;\n };\n\n PlentyFramework.version = (function() {\n\n return {\n get: function() {\n return version;\n },\n equals: function( v ) {\n return compare(v) == 0;\n },\n compare: compare\n };\n\n function compare( compare )\n {\n var localVersion = version.split(\".\");\n var compareVersion = compare.split(\".\");\n\n for( var i = 0; i < compareVersion.length; i++ )\n {\n if( localVersion[i] === compareVersion[i] || compareVersion[i] === \"*\" )\n {\n continue;\n }\n\n if( parseInt(localVersion[i]) < parseInt(compareVersion[i]) )\n {\n return -1;\n }\n\n if( parseInt(localVersion[i]) > parseInt(compareVersion[i]) )\n {\n return 1;\n }\n }\n return 0;\n }\n\n })();\n\n /**\n * Customizable controls for partials will be injected here.\n * (e.g. Modal)\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.partials = {};\n\n /**\n * Collection of registered global variables\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.globals = {};\n\n /**\n * Set a global variable.\n * @function setGlobal\n * @static\n * @param {string} identifier A unique identifier to reference this variable\n * @param {*} value The value to set\n * @return {*} The value\n */\n PlentyFramework.setGlobal = function( identifier, value )\n {\n if ( PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n console.error( 'Global variable \"' + identifier + '\" already exists and cannot be overridden.' );\n return null;\n }\n\n PlentyFramework.globals[identifier] = value;\n\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Get the value of a global variable or undefined if not exists\n * @function getGlobal\n * @static\n * @param identifier The identifier of the requested variable\n * @return {*} The value of the variable\n */\n PlentyFramework.getGlobal = function( identifier, fallbackValue )\n {\n if( !PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n return fallbackValue;\n }\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Collection of registered directives\n * @type {Array}\n * @static\n */\n PlentyFramework.directives = {};\n\n /**\n * Register directive. Directives can be bound to dynamically added nodes by calling pm.bindPlentyFunctions();\n * @function directive\n * @static\n * @param {string} selector jQuery selector of the DOM-elements to bind the directive to\n * @param {function} callback Function to add directives behaviour\n * @param {Array} dependencies List of required services. Services will be passed to callback function\n * @param {boolean} allowDuplicates Defines if a directive can be bound to the same element multiple times\n * @return {object} The created directive\n */\n PlentyFramework.directive = function( directiveName, directiveFunctions, dependencies )\n {\n // Catch type mismatching for 'directiveName'\n if ( typeof directiveName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof directiveName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof directiveFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof directiveFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.directives[directiveName] = {\n name : directiveName,\n dependencies: dependencies,\n setup : directiveFunctions\n };\n };\n\n /**\n * Bind registered directives.\n * @function bindDirectives\n * @param {string} [directiveSelector] restrict binding to elements matching this selector\n */\n PlentyFramework.prototype.bindDirectives = function( rootElement )\n {\n\n rootElement = rootElement || 'html';\n\n $( rootElement ).find( '[data-plenty]' ).each( function( i, element )\n {\n\n var directives = parseDirectives( $( element ).attr( 'data-plenty' ), $( element ) );\n\n if ( directives.length <= 0 )\n {\n // continue\n return;\n }\n\n addCustomEvents( element );\n\n for ( var i = 0; i < directives.length; i++ )\n {\n var directive = directives[i];\n if ( !!PlentyFramework.directives[directive.class] && PlentyFramework.directives.hasOwnProperty( directive.class ) )\n {\n\n var callback = PlentyFramework.directives[directive.class][directive.method];\n if ( !!callback && typeof callback == \"function\" )\n {\n\n if ( directive.event == \"ready\" )\n {\n callback.apply( null, directive.params );\n }\n else\n {\n bindEventCallback( $( element ), directive.event, callback, directive.params );\n /*\n $( element ).on( directive.event, function( e )\n {\n directive = injectEvent( directive, e );\n return callback.apply( null, directive.params );\n } );\n */\n }\n\n }\n else\n {\n console.error( \"Method not found: \" + directive.method + \" in \" + directive.class );\n }\n\n }\n else\n {\n console.error( \"Directive not found: \" + directive.class );\n }\n }\n } );\n\n $( document ).trigger( 'initPartials', rootElement );\n };\n\n var eventStack = [];\n\n PlentyFramework.getRecentEvent = function( eventType )\n {\n var lastEventIdx = eventStack.length - 1;\n if ( !eventType )\n {\n return eventStack[lastEventIdx];\n }\n else\n {\n for ( var i = lastEventIdx; i >= 0; i-- )\n {\n if ( eventType == eventStack[i].type )\n {\n return eventStack[i];\n }\n }\n }\n\n return null;\n\n };\n\n PlentyFramework.pushEvent = function( event )\n {\n eventStack.push( event );\n };\n\n /**\n * Bind event to element by eventType.\n * If cms says \"click:Foo.bar(this, event)\" eventType is \"click\".\n *\n * @param $elem - jQuery object on which event was triggered\n * @param eventType - type of event\n * @param callback - callback function of directive [example: \"bar(this, event)\"]\n * @param params - list of parameters for callback function.\n */\n function bindEventCallback( $elem, eventType, callback, params )\n {\n $elem.on( eventType, function( event )\n {\n eventStack.push( event );\n return callback.apply( null, params );\n } );\n\n if( document.readyState === \"complete\" && eventType === \"ready\" )\n {\n // execute 'ready' directives directly if document is already loaded\n callback.apply( null, params );\n }\n }\n\n function addCustomEvents( element )\n {\n\n var $elem = $( element );\n\n if ( $elem.is( 'input[type=\"checkbox\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n if ( $elem.is( ':checked' ) )\n {\n $elem.trigger( 'check' );\n }\n else\n {\n $elem.trigger( 'uncheck' );\n }\n } );\n }\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n var radioGroup = $elem.attr( 'name' );\n\n $( 'input[type=\"radio\"][name=\"' + radioGroup + '\"]' ).each( function( i, radio )\n {\n var $radio = $( radio );\n if ( $radio.is( ':checked' ) )\n {\n $radio.trigger( 'check' );\n }\n else\n {\n $radio.trigger( 'uncheck' );\n }\n\n } );\n\n } );\n }\n }\n\n function parseDirectives( input, thisValue )\n {\n var directivePattern = /^(([\\w]+):)?([\\w]+)\\.([\\w]+)(\\((.*)\\))?$/;\n var expressions = input.split( ';' );\n var directives = [];\n\n for ( var i = 0; i < expressions.length; i++ )\n {\n var expression = expressions[i].trim();\n\n if ( !expression )\n {\n continue;\n }\n\n if ( !directivePattern.test( expression ) )\n {\n // console.warn( \"Invalid directive: \" + expression );\n continue;\n }\n\n var match = expression.match( directivePattern );\n\n if ( !match[3] || match[3].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Class name not set.\" );\n continue;\n }\n\n if ( !match[4] || match[4].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Method not set.\" );\n continue;\n }\n\n var directive = {\n event : match[2] || 'ready',\n class : match[3],\n method: match[4],\n params: []\n };\n\n if ( !!match[6] && match[6].length > 0 )\n {\n var params = match[6].match( /(['][^']+['])|([\\w-]+)|([\"][^\"]+[\"])/g );\n for ( var j = 0; j < params.length; j++ )\n {\n var param = params[j].trim();\n if ( !isNaN( parseFloat( param ) ) )\n {\n directive.params.push( parseFloat( param ) );\n }\n else if ( param.toLowerCase() == 'true' )\n {\n directive.params.push( true );\n }\n else if ( param.toLowerCase() == 'false' )\n {\n directive.params.push( false );\n }\n else if ( param.toLowerCase() == 'this' )\n {\n directive.params.push( thisValue );\n }\n else\n {\n directive.params.push( param.replace( /^['\"]|['\"]$/g, '' ) );\n }\n }\n }\n\n directives.push( directive );\n\n }\n return directives;\n }\n\n /**\n * Register a new service\n * @function service\n * @static\n * @param {string} serviceName Unique identifier of the service to get/ create\n * @param {function} serviceFunctions Callback containing all public functions of this service.\n * @param {Array} [dependencies] Identifiers of required services to inject in serviceFunctions\n * @return {object} The object described in serviceFunctions(). Can be received via\n * PlentyFramework.[serviceName]\n */\n PlentyFramework.service = function( serviceName, serviceFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof serviceName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof serviceName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof serviceFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof serviceFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.services[serviceName] = {\n name : serviceName,\n dependencies: dependencies,\n setup : serviceFunctions\n };\n\n };\n\n /**\n * Collection of compiled factories\n * @attribute factories\n * @static\n * @type {object}\n */\n PlentyFramework.factories = {};\n\n /**\n * Register a new factory\n * @function factory\n * @static\n * @param {string} factoryName A unique name of the new factory\n * @param {function} factoryFunctions The function describing the factory\n * @param {Array} dependencies List of required factories to inject\n */\n PlentyFramework.factory = function( factoryName, factoryFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof factoryName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof factoryName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof factoryFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof factoryFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n components.factories[factoryName] = {\n name : factoryName,\n dependencies: dependencies,\n setup : factoryFunctions\n }\n\n };\n\n /**\n * Renders html template. Will provide given data to templates scope.\n * Uses Mustache syntax for data-binding.\n * @function compileTemplate\n * @static\n * @param {String} template relative path to partials template to load. Base path = '/src/partials/'\n * @param {Object} data data to privide to templates scope.\n * @returns {String} The rendered html string\n */\n PlentyFramework.compileTemplate = function( template, data )\n {\n data = data || {};\n data.translate = function()\n {\n return function( text, render )\n {\n return render( PlentyFramework.translate( text ) );\n };\n };\n return Mustache.render( TemplateCache[template], data );\n };\n\n /**\n * The path on the server where the script is located in.\n * @attribute\n * @static\n * @type {String}\n */\n PlentyFramework.scriptPath = '';\n\n /**\n * Collection of locale strings will be injected here after reading language file.\n * @attribute\n * @static\n * @type {Object}\n */\n PlentyFramework.Strings = {};\n\n /**\n * Load language file containing translations of locale strings.\n * @function loadLanguageFile\n * @static\n * @param fileName relative path to language file.\n */\n PlentyFramework.loadLanguageFile = function( fileName )\n {\n $.ajax({\n url: PlentyFramework.scriptPath + fileName,\n dataType: 'json'\n }).done( function( response ) {\n PlentyFramework.Strings = response;\n });\n };\n\n /**\n * Try to get locale translation of given string.\n * Render translated string using Mustache syntax\n * if additional parameters are given.\n * @function translate\n * @static\n * @param {String} string The string to translate\n * @param {Object} [params] additional data for rendering\n * @returns {String} The translation of the given string if found. Otherwise returns the original string.\n */\n PlentyFramework.translate = function( string, params )\n {\n var localeString;\n if ( PlentyFramework.Strings.hasOwnProperty( string ) )\n {\n localeString = PlentyFramework.Strings[string];\n }\n else\n {\n localeString = string;\n console.warn( 'No translation found for \"' + localeString + '\".' );\n }\n\n if ( !!params )\n {\n localeString = Mustache.render( localeString, params );\n }\n\n return localeString;\n\n };\n\n /**\n * Compile registered factories & services\n * @function compile\n * @static\n */\n PlentyFramework.compile = function()\n {\n\n for ( var factory in components.factories )\n {\n if ( !PlentyFramework.factories.hasOwnProperty( factory ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.factories[factory], 3 );\n }\n }\n\n for ( var service in components.services )\n {\n if ( !PlentyFramework.prototype.hasOwnProperty( service ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.services[service], 2 );\n }\n }\n\n for ( var directive in components.directives )\n {\n if ( !PlentyFramework.directives.hasOwnProperty( directive ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.directives[directive], 1 );\n }\n }\n\n var scripts = document.getElementsByTagName( 'SCRIPT' );\n for( var i = scripts.length - 1; i >= 0; i-- ) {\n var path = scripts[i].src.match( /(.*)\\/(.*)\\.js(\\?\\S*)?$/ );\n if( !!path ) {\n PlentyFramework.scriptPath = path[1];\n break;\n }\n }\n\n };\n\n // Level: 1 = directive, 2 = service, 3 = factory\n function compileComponent( component, componentLevel, dependencyStack )\n {\n dependencyStack = dependencyStack || [];\n\n // resolve dependencies\n var compiledDependencies = [];\n for ( var i = 0; i < component.dependencies.length; i++ )\n {\n var dependency = component.dependencies[i];\n if ( $.inArray( dependency, dependencyStack ) < 0 )\n {\n // add dependency to stack to avoid cyclic injection\n dependencyStack.push( dependency );\n\n if ( components.factories.hasOwnProperty( dependency ) )\n {\n // required dependency is a factory\n if ( !PlentyFramework.factories.hasOwnProperty( dependency ) )\n {\n // factory is not compiled yet\n compileComponent( components.factories[dependency], 3, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.factories[dependency] );\n continue;\n }\n\n if ( componentLevel <= 2 && components.services.hasOwnProperty( dependency ) )\n {\n // required dependency is a service\n if ( !PlentyFramework.prototype.hasOwnProperty( dependency ) )\n {\n // service is not compiled yet\n compileComponent( components.services[dependency], 2, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.prototype[dependency] );\n continue;\n }\n\n if ( componentLevel <= 1 && components.directives.hasOwnProperty( dependency ) )\n {\n // required dependency is a directive\n if ( !PlentyFramework.directives.hasOwnProperty( dependency ) )\n {\n // directive is not compiled yet\n compileComponent( components.directives[dependency], 1, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.directives[dependency] );\n continue;\n }\n\n console.error( 'Cannot inject dependency \"' + dependency + '\": Object not found.' );\n }\n else\n {\n console.error( 'Cyclic dependency injection: ' + dependencyStack.join( ' -> ' ) + ' -> ' + dependency );\n }\n }\n\n // compile component\n if ( componentLevel == 3 )\n {\n PlentyFramework.factories[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 2 )\n {\n PlentyFramework.prototype[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 1 )\n {\n PlentyFramework.directives[component.name] = component.setup.apply( null, compiledDependencies );\n }\n }\n\n}( jQuery ));\n\n\n\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.directive( 'Authentication', function( AuthenticationService )\n {\n return {\n login: login\n };\n\n function login( elem )\n {\n pm.getRecentEvent().preventDefault();\n AuthenticationService.customerLogin( $( elem ) );\n }\n }, [\"AuthenticationService\"] );\n\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Basket', function( BasketService )\n {\n\n return {\n addBasketItem : addBasketItem,\n changeItemQuantity: changeItemQuantity,\n setItemQuantity : setItemQuantity\n };\n\n function addBasketItem( elem )\n {\n pm.getRecentEvent().preventDefault();\n //init\n var basketItemsList = {};\n var $elem = $( elem );\n var parentForm = $elem.parents( 'form' );\n\n basketItemsList.BasketItemItemID = parentForm.find( '[name=\"ArticleID\"]' ).val();\n basketItemsList.BasketItemPriceID = parentForm.find( '[name=\"SYS_P_ID\"]' ).val();\n basketItemsList.BasketItemQuantity = parentForm.find( '[name=\"ArticleQuantity\"]' ).val();\n basketItemsList.BasketItemBranchID = parentForm.find( '[name=\"source_category\"]' ).val();\n\n //attributes\n var attributeInputsList = parentForm.find( '[name^=\"ArticleAttribute\"]' );\n var attributesList = [];\n\n $.each( attributeInputsList, function( idx, elem )\n {\n var match = elem.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( elem ).val()\n } );\n }\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItemsList.BasketItemAttributesList = attributesList;\n }\n\n //add basketItem and refresh previewLists\n BasketService.addItem( [basketItemsList] );\n\n }\n\n function changeItemQuantity( elem, increment )\n {\n var $elem = $( elem );\n var $quantityInput = $elem.parent().find( 'input' );\n var maxLength = parseInt( $quantityInput.attr( 'maxlength' ) ) || 5;\n var value = parseInt( $quantityInput.val() ) + increment;\n\n var isBasketView = $elem.parents( '[data-basket-item-id]' ).length > 0;\n\n if ( isBasketView )\n {\n if ( (value + '').length <= maxLength && value >= 0 )\n {\n $quantityInput.val( value );\n }\n\n var timeout = $elem.data( 'timeout' );\n\n if ( !!timeout )\n {\n window.clearTimeout( timeout );\n }\n\n timeout = window.setTimeout( function()\n {\n $quantityInput.trigger( 'change' );\n }, 1000 );\n\n $elem.data( 'timeout', timeout );\n }\n else\n {\n if ( (value + '').length <= maxLength && value >= 1 )\n {\n $quantityInput.val( value );\n }\n }\n }\n\n function setItemQuantity( basketItemID, input )\n {\n BasketService.setItemQuantity(\n basketItemID,\n parseInt( $( input ).val() )\n ).fail( function()\n {\n // reset input's value on cancel\n var basketItem = BasketService.getItem( basketItemID );\n $( input ).val( basketItem.BasketItemQuantity );\n } );\n }\n\n }, ['BasketService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Checkout', function( CheckoutService )\n {\n\n return {\n setMethodOfPayment: setMethodOfPayment,\n confirmAtrigaPaymax: confirmAtrigaPaymax\n };\n\n function setMethodOfPayment( paymentID )\n {\n CheckoutService.setMethodOfPayment( paymentID );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxConfirmed )\n {\n CheckoutService.confirmAtrigaPaymax( atrigaPaymaxConfirmed );\n }\n }, ['CheckoutService'] );\n})( jQuery, PlentyFramework );\n/**\n * Mobile dropdowns\n * Toggles dropdowns using css class 'open' instead of pseudo class :hover\n * Usage:\n *
  • \n * ...\n *
  • \n *\n * possible values for CONDITION\n * \"touch\" : use 'open'-class if device is touch-device AND media size is 'md' or 'lg'\n * \"toggle-xs-sm-or-touch\" : use 'open'-class if device is \"touch\" (as above) OR media size is 'xs' or 'sm'\n *\n */\n(function( $, pm )\n{\n pm.directive( 'MobileDropdown', function( MediaSize )\n {\n // store all dropdown elements\n var dropdownElements = [];\n\n // store dropdown elements which should be closed by clicking outside the element itself\n var closableDropdownElements = [];\n\n return {\n initDropdowns: initDropdowns,\n openDropdown : openDropdown,\n slideDropdown: slideDropdown\n };\n\n function initDropdowns()\n {\n $( window ).on( 'orientationchange sizeChange', function()\n {\n resetDropdowns( dropdownElements );\n resetDropdowns( closableDropdownElements );\n } );\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", function( event )\n {\n resetDropdowns( closableDropdownElements, event );\n } );\n }\n\n function resetDropdowns( dropdownList, event )\n {\n var $current;\n for ( var i = 0; i < dropdownList.length; i++ )\n {\n $current = $( dropdownList[i] );\n if ( !!event )\n {\n if ( $current.find( $( event.target ) ).length === 0 )\n {\n $current.removeClass( 'open' );\n }\n }\n else\n {\n $current.removeClass( 'open' );\n }\n }\n\n }\n\n function openDropdown( elem, alwaysClickable )\n {\n var $elem = $( elem );\n var $parent = $elem.parent();\n\n // case 1: xs || sm || ( touch && ( md || lg ) ) -> open/close via click on small devices, open/close via\n // css-hover on desktop, open/close via click on touch-desktop (e.g. top navigation)\n\n if ( !!alwaysClickable && ( MediaSize.isInterval( 'xs, sm' ) || ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n // if href\n if ( !$elem.attr( 'href' ) )\n {\n avoidRedirectinStopPropagation( $parent.not( $elem ) );\n }\n }\n else\n {\n if ( !$elem.attr( 'href' ) )\n {\n // hide dropdown\n $parent.removeClass( 'open' );\n }\n }\n }\n\n // case 2: touch && ( md || lg ) -> open via 1st click on touch-desktop, return false (e.g. main navigation)\n\n if ( !alwaysClickable && ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n avoidRedirectinStopPropagation( $parent );\n }\n else\n {\n // redirect to href if dropdown is already open\n // do nothing\n }\n }\n }\n\n function showDropdownHideOthers( elem, parent )\n {\n var $parent = $( parent );\n\n // hide other dropdowns\n resetDropdowns( closableDropdownElements );\n\n // remember opened dropdown\n if ( $.inArray( $parent[0], closableDropdownElements ) < 0 )\n {\n closableDropdownElements.push( $parent[0] );\n }\n\n // show dropdown\n $parent.addClass( 'open' );\n }\n\n function avoidRedirectinStopPropagation( elem )\n {\n var $elem = $( elem );\n\n // avoid redirecting\n pm.getRecentEvent().preventDefault();\n\n // avoid closing popup by clicking itself\n $elem.off( 'click' );\n $elem.on( 'click', function( e )\n {\n e.stopPropagation();\n } );\n }\n\n function slideDropdown( elem )\n {\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n // size interval query is required since function is used on document ready to initial open active\n // navigation (on small devices)\n if ( MediaSize.isInterval( 'xs, sm' ) )\n {\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 400, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n if ( $.inArray( $elemParent[0], dropdownElements ) < 0 )\n {\n dropdownElements.push( $elemParent[0] );\n }\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n }\n\n }, ['MediaSizeService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Redirect', function( MediaSizeService, NavigatorService )\n {\n\n return {\n to : to,\n toCheckoutTab: toCheckoutTab\n };\n\n function to( href )\n {\n if ( MediaSizeService.interval() != 'xs' )\n {\n if ( typeof href === 'string' && href.indexOf('/') == -1 && $( href ).length > 0 )\n {\n window.location.assign( $( href ).attr( 'href' ) );\n }\n else\n {\n window.location.assign( href );\n }\n }\n }\n\n function toCheckoutTab( tabID )\n {\n NavigatorService.goToID( tabID );\n }\n\n }, ['MediaSizeService', 'NavigatorService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Tab', function( MediaSize )\n {\n\n var tabGroups = {};\n\n return {\n showTab : showTab,\n initRemoteLabel: initRemoteLabel,\n initRemoteTab : initRemoteTab,\n showRemoteTab : showRemoteTab\n };\n\n function showTab( tabSelector )\n {\n $( tabSelector ).tab( 'show' );\n }\n\n function initRemoteLabel( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).addLabel( $elem );\n }\n\n function initRemoteTab( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).setContent( $elem );\n }\n\n function showRemoteTab( tabID, groupID, interval )\n {\n if ( MediaSize.isInterval( interval ) )\n {\n pm.getRecentEvent().preventDefault();\n\n if ( !!tabGroups[groupID] && !!tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].showTab( tabID );\n }\n\n }\n }\n\n function TabGroup()\n {\n var tabs = {};\n var activeTab;\n\n return {\n addTab : addTab,\n showTab : showTab,\n getTab : getTab,\n resetTabs: resetTabs\n };\n\n function addTab( tabID )\n {\n tabs[tabID] = new Tab( tabID );\n return tabs[tabID];\n }\n\n function showTab( tabID )\n {\n var zIndex = 0;\n if ( !!activeTab )\n {\n // activeTab is set\n zIndex = parseInt( activeTab.getContent().parent().css( 'zIndex' ) );\n activeTab.hide();\n activeTab.getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n else\n {\n // activeTab not set before\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n var currentZ = parseInt( tabs[tab].getContent().parent().css( 'zIndex' ) );\n if ( zIndex == 0 || currentZ < zIndex )\n {\n zIndex = currentZ;\n }\n tabs[tab].hide();\n }\n }\n\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n }\n\n $( window ).on( 'sizeChange', resetTabs );\n }\n\n activeTab = tabs[tabID];\n activeTab.getContent().parent().css( 'zIndex', zIndex );\n activeTab.show();\n }\n\n function getTab( tabID )\n {\n return tabs[tabID];\n }\n\n function resetTabs()\n {\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].show();\n }\n }\n\n activeTab = null;\n }\n }\n\n function Tab( id )\n {\n var $content;\n var $labels = [];\n var tabID = id;\n\n return {\n addLabel : addLabel,\n setContent: setContent,\n getContent: getContent,\n getID : getID,\n show : show,\n hide : hide\n };\n\n function getID()\n {\n return tabID;\n }\n\n function addLabel( label )\n {\n $labels.push( label );\n return this;\n }\n\n function setContent( content )\n {\n $content = content;\n return this;\n }\n\n function getContent()\n {\n return $content;\n }\n\n function show()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].addClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.show().addClass( 'in' );\n }\n\n }\n\n function hide()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].removeClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.hide().removeClass( 'in' );\n }\n }\n }\n\n }, ['MediaSizeService'] );\n})( jQuery, PlentyFramework );\n/**\n * Add fancy ui modifications - the visual stuff - here.\n * Respond functionality like 'event':UI.myFunctionality(currentElement)\n *\n * Example:\n * \n *\n */\n(function( $, pm )\n{\n pm.directive( 'UI', function( MediaSizeService, SocialShareService, UIFactory )\n {\n // elements to calculate height.\n var equalHeightElementList = [];\n var toTopButtonList = [];\n\n return {\n initUIWindowEvents : initUIWindowEvents,\n showWaitscreen : showWaitscreen,\n hideWaitscreen : hideWaitscreen,\n addContentPageSlider: addContentPageSlider,\n equalHeight : equalHeight,\n initToTop : initToTop,\n initLazyload : initLazyload,\n initSlideToggle : initSlideToggle,\n slideDown : slideDown,\n slideUp : slideUp,\n slideToggle : slideToggle,\n toggleHideShow : toggleHideShow,\n toggleSocialShare : toggleSocialShare,\n toggleClass : toggleClass,\n addClass : addClass,\n removeClass : removeClass\n };\n\n function initUIWindowEvents()\n {\n // resize elements on window size change.\n $( window ).on( 'sizeChange contentChanged', function()\n {\n fireEqualHeight();\n } );\n\n $( window ).on( \"scroll resize\", function()\n {\n if ( toTopButtonList.length > 0 )\n {\n if ( $( document ).scrollTop() > 100 )\n {\n doToArrayElements( toTopButtonList, \"addClass\", \"visible\" );\n }\n else\n {\n doToArrayElements( toTopButtonList, \"removeClass\", \"visible\" );\n }\n }\n } );\n }\n\n /**\n * Display waitscreen on page e.g. for requests.\n * Use with care and don't forget to hide waitscreen, if your calls are done or broke!!\n */\n function showWaitscreen()\n {\n UIFactory.showWaitscreen();\n }\n\n /**\n * Just hide the waitscreen.\n * @param forceClose\n */\n function hideWaitscreen( forceClose )\n {\n UIFactory.hideWaitscreen( forceClose );\n }\n\n /**\n * Adds content page slider (owlCarousel)\n *\n * usage:\n *
    \n *
    \n * ...\n *
    \n *
    \n * ...\n *
    \n * ...\n *
    \n *\n * Legacy directive selector: data-plenty=\"contentpageSlider\"\n *\n * @param elem\n */\n function addContentPageSlider( elem )\n {\n $( elem ).owlCarousel( {\n navigation : true,\n navigationText : false,\n slideSpeed : 1000,\n paginationSpeed: 1000,\n singleItem : true,\n autoPlay : 6000,\n stopOnHover : true,\n afterMove : function( current )\n {\n $( current ).find( '[data-plenty-rel=\"lazyload\"]' ).trigger( 'appear' );\n }\n } );\n }\n\n /**\n * Equal Box height\n * Calculates equal box height for chosen elements.\n *\n * Legacy directive selector: data-plenty-equal\n *\n * @param elem\n * @param elementExists - default false\n */\n function equalHeight( elem, mediaSizes, elementExists )\n {\n var $elem = $( elem );\n var maxHeight = 0;\n var $equalTarget = {};\n var $equalTargetList = $elem.find( '[data-plenty-rel=\"equal-target\"]' ).length > 0 ? $elem.find( '[data-plenty-rel=\"equal-target\"]' ) : $elem.children();\n\n // if element wasn't pushed before.\n if ( elementExists !== true )\n {\n equalHeightElementList.push( elem );\n }\n\n for ( var i = $equalTargetList.length; i >= 0; i-- )\n {\n $equalTarget = $( $equalTargetList[i] );\n $equalTarget.css( 'height', '' );\n\n if ( $equalTarget.outerHeight( true ) > maxHeight )\n {\n maxHeight = $equalTarget.outerHeight( true );\n }\n }\n\n if ( !mediaSizes || MediaSizeService.isInterval( mediaSizes ) )\n {\n $equalTargetList.height( maxHeight );\n }\n }\n\n /**\n * Scroll page to top.\n * Just add without events.\n *\n * Legacy directive selector: data-plenty=\"toTop\"\n *\n * @param elem\n */\n function initToTop( elem )\n {\n var $elem = $( elem );\n\n $elem.click( function()\n {\n $( 'html, body' ).animate( {\n scrollTop: 0\n }, 400 );\n return false;\n } );\n\n if ( !!$.inArray( $elem, toTopButtonList ) )\n {\n toTopButtonList.push( $elem );\n }\n }\n\n /**\n * lazy load on ready.\n *\n * Legacy directive selector: img[data-plenty-lazyload]\n *\n * @param elem\n */\n function initLazyload( elem, effect )\n {\n var $elem = $( elem );\n\n $elem.lazyload( {\n effect: effect\n } );\n if ( $elem.is( 'img' ) )\n {\n $elem.on( 'loaded', function()\n {\n $elem.css( 'display', 'inline-block' );\n } );\n }\n }\n\n /**\n * Toggle show and hide animation.\n *\n * Legacy directive selector: data-plenty=\"openCloseToggle\"\n *\n * @param elem\n */\n function toggleHideShow( elem )\n {\n\n console.log( elem );\n\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 200, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n /**\n * Toggle target content on click.\n * Bind to checked-/ unchecked-property of radio buttons\n *\n * Legacy directive selector: data-plenty-slidetoggle\n *\n * @param elem\n */\n function initSlideToggle( elem, checked )\n {\n var $elem = $( elem );\n var $targetElement = $( $elem.attr( 'data-plenty-rel' ) );\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n // is radio button\n var $radioGroupList = $( 'input[type=\"radio\"][name=\"' + ( $elem.attr( 'name' ) ) + '\"]' );\n var visibleOnChecked = !checked || checked == 'checked';\n\n $radioGroupList.change( function()\n {\n var $self = $( this );\n $targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n if ( $self.is( ':checked' ) && $self[0] === $elem[0] && visibleOnChecked == true )\n {\n // checked\n $targetElement.slideDown( 400, function()\n {\n fireEqualHeight();\n } );\n }\n else\n {\n // unchecked (since other radio button has been checked)\n $targetElement.slideUp( 400, function()\n {\n fireEqualHeight();\n } );\n }\n } );\n }\n else\n {\n // is not radio button\n $elem.click( function()\n {\n //$targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n $elem.addClass( 'animating' );\n $targetElement.slideToggle( 400, function()\n {\n $elem.removeClass( 'animating' );\n $elem.toggleClass( 'active' );\n fireEqualHeight();\n } );\n } );\n }\n }\n\n function slideDown( target, duration )\n {\n slideAction( $( target ), duration, 'slideDown' );\n }\n\n function slideUp( target, duration )\n {\n slideAction( $( target ), duration, 'slideUp' );\n }\n\n function slideToggle( target, duration )\n {\n slideAction( $( target ), duration, 'slideToggle' );\n }\n\n function slideAction( $target, duration, callbackString )\n {\n duration = duration || 400;\n $target.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n $target[callbackString]( duration, function()\n {\n fireEqualHeight();\n } );\n }\n\n /**\n * TODO check comment\n * Social Share Activation\n * Activate and load share-buttons manually by clicking a separate button\n * Usage / data-attributes:\n *
    \n * Will be used to activate the service set in\n * data-plenty-social=\"\"\n * Will be replaced with loaded share button\n *
    \n *\n * possible values for data-plenty-social:\n * \"facebook-like\" : Load Facebooks \"Like\"-Button\n * \"facebook-recommend\" : Load Facebooks \"Recommend\"-Button\n * \"twitter\" : Load Twitter Button\n * \"google-plus\" : Load google \"+1\"-Button\n *\n * Additional Tooltips\n * You can extend the parent element with a (bootstrap) tooltip by adding data-toggle=\"tooltip\" and\n * title=\"TOOLTIP CONTENT\" Tooltip will be destroyed after activating a social service\n * (!) Requires bootstrap.js\n *\n * Legacy directive selector: data-plenty-social\n *\n * @param elem\n */\n function toggleSocialShare( elem, socialShareService )\n {\n var $elem = $( elem );\n var $toggle = $elem.find( '[data-plenty-rel=\"social-switch\"]' );\n\n // append container to put / delete service.html\n $elem.append( '
    ' );\n\n // add \"off\" class to switch, if neither \"off\" or \"on\" is set\n // replaced hasClass() with is() benchmark: http://jsperf.com/hasclasstest\n if ( !$toggle.is( 'off, on' ) )\n {\n $toggle.addClass( 'off' );\n }\n\n // toggle switch\n $toggle.on( 'click', function()\n {\n if ( $toggle.hasClass( 'off' ) )\n {\n // TODO remove bootstrap dependency\n if ( $elem.attr( \"data-toggle\" ) == \"tooltip\" )\n {\n $elem.tooltip( 'destroy' )\n }\n $toggle.removeClass( 'off' ).addClass( 'on' );\n // hide dummy button\n $elem.find( '[data-plenty-rel=\"social-placeholder\"]' ).hide();\n // load HTML defined in 'api'\n $elem.find( '.social-container' ).append( SocialShareService.getSocialService( socialShareService ) );\n }\n // do not disable social medias after activation\n } );\n }\n\n /**\n * Toggle Class\n * toggle style-classes on click\n * Usage / data-attribute:\n *
    \n * target : jQuery selector to toggle the class at.\n * class : class(es) to toggle at target element\n * media : only toggle class on given media sizes (optional)\n *\n * (!) using data-plenty-toggle on -elements will prevent redirecting to href=\"\"\n *\n * Legacy directive selector: data-plenty-toggle\n *\n * @param cssClass\n * @param target\n * @param interval\n */\n function toggleClass( cssClass, target, interval )\n {\n var $target = $( target );\n /* FIXME\n * Callisto 3.1 Design adaption:\n * NavigationCategoriesList\n * Line 8\n * BEFORE:\n *
  • \n * AFTER:\n *
  • \n *\n * Line 10\n * BEFORE:\n * \n * AFTER:\n * \n *\n * */\n if ( $target.parents( \".navbar-main\" ).length > 0 )\n {\n var $elem = $target.children( \"span\" );\n pm.directives[\"MobileDropdown\"].slideDropdown( $elem );\n return true;\n }\n\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $target.toggleClass( cssClass );\n return false;\n }\n }\n\n function addClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).addClass( cssClass );\n return false;\n }\n }\n\n function removeClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).removeClass( cssClass );\n return false;\n }\n }\n\n /*\n ##### PRIVATE FUNCTIONS ######\n */\n\n function fireEqualHeight()\n {\n for ( var i = equalHeightElementList.length - 1; i >= 0; i-- )\n {\n equalHeight( equalHeightElementList[i], '', true );\n }\n }\n\n function doToArrayElements( array, func, params )\n {\n for ( var i = array.length - 1; i >= 0; i-- )\n {\n array[i][func]( params );\n }\n }\n\n }, ['MediaSizeService', 'SocialShareService', 'UIFactory'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Validator', function( ValidationService )\n {\n\n return {\n validate: validate\n };\n\n function validate( form, errorClass )\n {\n return ValidationService.validate( form, errorClass );\n }\n\n }, ['ValidationService'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Handles requests to ReST API. Provides a {{#crossLink \"APIFactory/handleError:method\"}}default\n * error-handling{{/crossLink}}. Request parameters will be parsed to json internally
    \n * Requires:\n *
      \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class APIFactory\n * @static\n */\n pm.factory( 'APIFactory', function( UI, Modal )\n {\n\n var sessionExpirationTimeout = null;\n $( document ).ready( function()\n {\n renewLoginSession();\n } );\n\n return {\n get : _get,\n post : _post,\n put : _put,\n delete: _delete,\n idle : _idle\n };\n\n function renewLoginSession()\n {\n if ( !pm.getGlobal( 'LoginSession' ) )\n {\n return;\n }\n\n if ( !!sessionExpirationTimeout )\n {\n clearTimeout( sessionExpirationTimeout );\n }\n\n sessionExpirationTimeout = setTimeout( function()\n {\n $( window ).trigger( 'login-expired' );\n\n if ( pm.getGlobal( 'PageDesign' ) === \"Checkout\" )\n {\n Modal.prepare()\n .setTitle( pm.translate( 'Your session has expired.' ) )\n .setContent( pm.translate( 'Please log in again to continue shopping.' ) )\n .setLabelDismiss( null )\n .setLabelConfirm( pm.translate( 'OK' ) )\n .onConfirm( function()\n {\n window.location.assign( '/' );\n } )\n .onDismiss( function()\n {\n window.location.assign( '/' );\n } )\n .show();\n }\n\n }, pm.getGlobal( 'LoginSessionExpiration' ) );\n }\n\n /**\n * Is called by default if a request failed.
    \n * Can be prevented by setting the requests last parameter to false.\n *\n * @function handleError\n * @private\n *\n * @param {object} jqXHR
    jQuery\n * deferred Object\n */\n function handleError( jqXHR )\n {\n try\n {\n var responseText = $.parseJSON( jqXHR.responseText );\n UI.printErrors( responseText.error.error_stack );\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n }\n\n /**\n * Sends a GET request to ReST-API\n *\n * @function get\n *\n * @param {string} url The URL to send the request to\n * @param {object} params The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _get( url, params, ignoreErrors, runInBackground, sync )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'GET',\n data : params,\n dataType: 'json',\n async : !sync,\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a POST request to ReST-API\n *\n * @function post\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _post( url, data, ignoreErrors, runInBackground )\n {\n\n var params = {\n type : 'POST',\n dataType: 'json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n };\n\n if ( !!data && data.isFile )\n {\n params.cache = data.cache;\n params.processData = data.processData;\n params.data = data.data;\n params.contentType = false;\n }\n else\n {\n params.data = JSON.stringify( data );\n params.contentType = 'application/json';\n }\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url, params\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n }\n\n /**\n * Sends a PUT request to ReST-API\n *\n * @function put\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _put( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'PUT',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a DELETE request to ReST-API\n *\n * @function delete\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @returns {object} jQuery\n * deferred Object\n */\n function _delete( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'DELETE',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Get a idle request doing nothing for chaining methods\n * @returns {object} jQuery\n * deferred Object\n */\n function _idle()\n {\n return $.Deferred().resolve();\n }\n\n }, ['UIFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Provide methods for receiving layout containers, layout parameters\n * or category content from API
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    \n * @class CMSFactory\n * @static\n */\n pm.factory( 'CMSFactory', function( API )\n {\n\n return {\n getContainer : getContainer,\n getParams : getParams,\n getCategoryContent: getCategoryContent\n };\n\n /**\n * Prepare the request to receive HTML-Content from CMS\n * @function getContainer\n * @param {string} containerName The Layoutcontainer to receive.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the location in\n * the CMS\n * (e.g. 'Checkout')\n * @example\n * CMSFactory.getContainer( 'CheckoutTotals' ).from( 'Checkout' )\n * .done(function( response ) {\n * // container content\n * var html = response.data[0]\n * });\n */\n function getContainer( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/container_' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n\n }\n\n /**\n * Prepare the request to receive Layout parameters for a template\n * @function getParams\n * @param {string} containerName The Layoutcontainer to receive the parameteres of.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the\n * location in the CMS\n * (e.g. 'ItemView')\n * @example\n * CMSFactory.getParams( 'BasketItemsList' ).from( 'ItemView' )\n * .done(function( response ) {\n * // BasketItems\n * var items = response.data;\n * });\n */\n function getParams( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n }\n\n /**\n * Get the content of a category specified by its ID\n * @function getCategoryContent\n * @param {number} categoryID The ID of the category to get the content from\n * @returns {object} jQuery deferred\n * Object\n */\n function getCategoryContent( categoryID )\n {\n return API.get( '/rest/categoryview/categorycontentbody/?categoryID=' + categoryID );\n }\n\n }, ['APIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Holds checkout data for global access and provides methods\n * for reloading content dynamically-
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutFactory\n * @static\n */\n pm.factory( 'CheckoutFactory', function( API, CMS, UI )\n {\n\n // data received from ReST API\n var checkoutData;\n\n // instance wrapped checkout object for global access\n var checkout;\n\n return {\n getCheckout : getCheckout,\n setCheckout : setCheckout,\n loadCheckout : loadCheckout,\n reloadContainer : reloadContainer,\n reloadCatContent : reloadCatContent,\n reloadItemContainer: reloadItemContainer\n };\n\n function Checkout()\n {\n return checkoutData;\n }\n\n /**\n * Returns instance of wrapped checkout object\n * @function getCheckout\n * @returns {Checkout} Instance of checkout object\n */\n function getCheckout( copy )\n {\n if ( !checkout || !checkoutData )\n {\n loadCheckout( true );\n }\n\n if ( !!copy )\n {\n return $.extend( true, {}, checkoutData );\n }\n return checkout;\n }\n\n /**\n * Receive global checkout data from ReST-API\n * @function loadCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function loadCheckout( sync )\n {\n\n return API.get( '/rest/checkout/', null, false, false, sync )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n }\n\n /**\n * Update checkout data on server\n * @function setCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function setCheckout()\n {\n\n return API.put( '/rest/checkout', checkout )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-checkout-template=\"...\"\n * @function reloadContainer\n * @param {string} container Name of the template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadContainer( container )\n {\n\n return CMS.getContainer( \"checkout\" + container ).from( 'checkout' )\n .done( function( response )\n {\n $( '[data-plenty-checkout-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n } );\n } );\n }\n\n /**\n * Get category content from server and replace received HTML\n * in containers marked with data-plenty-checkout-catcontent=\"...\"\n * @function reloadCatContent\n * @param {number} catId ID of the category to load content (description 1) from server\n * @return {object} jQuery deferred\n * Object\n * @deprecated\n */\n function reloadCatContent( catId )\n {\n\n return CMS.getCategoryContent( catId )\n .done( function( response )\n {\n $( '[data-plenty-checkout-catcontent=\"' + catId + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-itemview-template=\"...\"\n * @function reloadItemContainer\n * @param {string} container Name of the (item view) template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadItemContainer( container )\n {\n\n return CMS.getContainer( 'itemview' + container ).from( 'itemview' )\n .done( function( response )\n {\n $( '[data-plenty-itemview-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n }, ['APIFactory', 'CMSFactory', 'UIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Provides methods for creating and displaying modal popups.\n * @class ModalFactory\n * @static\n */\n pm.factory( 'ModalFactory', function()\n {\n\n return {\n prepare: prepare,\n isModal: isModal\n };\n\n /**\n * Detect if given html contains a valid modal\n * @function isModal\n * @param {string} html\n * @returns {boolean}\n */\n function isModal( html )\n {\n return PlentyFramework.partials.Modal.isModal( html );\n }\n\n /**\n * Create a new Instance of {{#crossLink \"ModalFactory.Modal\"}}Modal{{/crossLink}}\n * @function prepare\n * @returns {Modal}\n */\n function prepare( selector )\n {\n return new Modal( selector );\n }\n\n /**\n * Holds configuration of a modal and provides methods for displaying and hiding the modal\n * @class Modal\n * @for ModalFactory\n * @returns {Modal}\n * @constructor\n */\n function Modal( selector )\n {\n\n var modal = this;\n modal.selector = selector;\n\n /**\n * The title of the modal\n * @attribute title\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.title = '';\n\n modal.cssClass = '';\n\n /**\n * The content of the modal\n * @attribute content\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.content = '';\n\n /**\n * The content of the dismiss-button\n * @attribute labelDismiss\n * @type {string}\n * @private\n * @default \"Abbrechen\"\n */\n modal.labelDismiss = pm.translate( \"Cancel\" );\n\n /**\n * the label of the confirmation button\n * @attribute labelConfirm\n * @type {string}\n * @private\n * @default \"Bestätigen\"\n */\n modal.labelConfirm = pm.translate( \"Confirm\" );\n\n /**\n * Callback when modal is confirmed by clicking confirmation button.\n * Modal will not be dismissed if callback returns false.\n * @attribute onConfirm\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onConfirm = function()\n {\n };\n\n /**\n * Callback when modal is dismissed by closing the modal\n * @attribute onDismiss\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onDismiss = function()\n {\n };\n\n /**\n * jQuery selector of the container element to display the modal in.\n * @attribute container\n * @type {string}\n * @private\n * @default \"body\"\n */\n modal.container = 'body';\n\n /**\n * Timeout to close the modal automatically. Set <0 to disable.\n * @attribute timeout\n * @type {number}\n * @private\n * @default -1\n */\n modal.timeout = -1;\n\n modal.hide = hide;\n modal.startTimeout = startTimeout;\n modal.stopTimeout = stopTimeout;\n modal.pauseTimeout = pauseTimeout;\n modal.continueTimeout = continueTimeout;\n\n var bsModal;\n var timeout, interval;\n var timeRemaining, timeStart;\n var paused = false;\n\n return {\n setTitle : setTitle,\n setClass : setClass,\n setContent : setContent,\n setContainer : setContainer,\n setLabelConfirm: setLabelConfirm,\n setLabelDismiss: setLabelDismiss,\n onConfirm : onConfirm,\n onDismiss : onDismiss,\n setTimeout : setTimeout,\n show : show,\n hide : hide\n };\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/title:attribute}}title{{/crossLink}} of the modal\n * @function setTitle\n * @param {string} title The title\n * @returns {Modal} Modal object for chaining methods\n */\n function setTitle( title )\n {\n modal.title = title;\n return this;\n }\n\n function setClass( cssClass )\n {\n modal.cssClass = cssClass;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/content:attribute}}content{{/crossLink}} of the modal\n * @function setContent\n * @param {string} content The content\n * @returns {Modal} Modal object for chaining methods\n */\n function setContent( content )\n {\n modal.content = content;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelConfirm:attribute}}label of the confirmation\n * button{{/crossLink}} of the modal\n * @function setLabelConfirm\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelConfirm( label )\n {\n modal.labelConfirm = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelDismiss:attribute}}label if the dismiss\n * button{{/crossLink}} of the modal\n * @function setLabelDismiss\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelDismiss( label )\n {\n modal.labelDismiss = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onConfirm:attribute}}confirmation callback{{/crossLink}} of the\n * modal\n * @function onConfirm\n * @param {function} callback The callback if modal is confirmed\n * @returns {Modal} Modal object for chaining methods\n */\n function onConfirm( callback )\n {\n modal.onConfirm = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onDismiss:attribute}}dismiss callback{{/crossLink}} of the modal\n * @function onDismiss\n * @param {function} callback The callback if modal is dismissed\n * @returns {Modal} Modal object for chaining methods\n */\n function onDismiss( callback )\n {\n modal.onDismiss = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/container:attribute}}container{{/crossLink}} of the modal\n * @function setContainer\n * @param {string} container The jQuery selector of the container to display the modal in\n * @returns {Modal} Modal object for chaining methods\n */\n function setContainer( container )\n {\n modal.container = container;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/timeout:attribute}}timeout{{/crossLink}} of the modal\n * @function setTimeout\n * @param {number} timeout The timeout to close the modal automatically. Set <0 to disable\n * @returns {Modal} Modal object for chaining methods\n */\n function setTimeout( timeout )\n {\n modal.timeout = timeout;\n return this;\n }\n\n /**\n * Inject modal data in default template if not template is given\n * and display the modal inside the configured container.
    \n * Start timer to hide the modal automatically if timeout is set.\n * @function show\n */\n function show()\n {\n if( !!modal.selector )\n {\n bsModal = $( modal.selector );\n }\n else\n {\n if ( isModal( modal.content ) )\n {\n bsModal = PlentyFramework.partials.Modal.getModal( modal.content );\n }\n else\n {\n bsModal = $( PlentyFramework.compileTemplate( 'modal/modal.html', modal ) );\n }\n\n $( modal.container ).append( bsModal );\n\n // append additional scripts executable\n var scripts = $( modal.content ).filter( 'script' );\n if ( scripts.length > 0 )\n {\n scripts.each( function( i, script )\n {\n var element = document.createElement( 'script' );\n element.type = 'text/javascript';\n element.innerHTML = $( script ).text();\n $( modal.container ).append( element );\n } );\n }\n }\n\n // bind callback functions\n PlentyFramework.partials.Modal.init( bsModal, modal );\n bsModal.find( '[data-plenty-modal=\"confirm\"]' ).click( function()\n {\n var close = modal.onConfirm();\n\n if ( typeof close == \"undefined\" )\n {\n close = true;\n }\n\n if ( close )\n {\n hide( true );\n }\n } );\n\n PlentyFramework.partials.Modal.show( bsModal );\n\n if ( modal.timeout > 0 )\n {\n startTimeout();\n }\n\n }\n\n /**\n * Hide the modal.\n * @function hide\n * @param {boolean} confirmed Flag indicating of modal is closed by confirmation button or dismissed\n */\n function hide( confirmed )\n {\n PlentyFramework.partials.Modal.hide( bsModal );\n\n if ( !confirmed )\n {\n modal.onDismiss();\n }\n }\n\n /**\n * Start the configured timeout initially\n * @function startTimeout\n * @private\n */\n function startTimeout()\n {\n timeRemaining = modal.timeout;\n timeStart = (new Date()).getTime();\n\n timeout = window.setTimeout( function()\n {\n window.clearInterval( interval );\n hide();\n }, modal.timeout );\n\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( timeRemaining / 1000 );\n interval = window.setInterval( function()\n {\n if ( !paused )\n {\n var secondsRemaining = timeRemaining - (new Date()).getTime() + timeStart;\n secondsRemaining = Math.round( secondsRemaining / 1000 );\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( secondsRemaining );\n }\n }, 1000 )\n }\n\n /**\n * Pause the timeout (e.g. on hover)\n * @function pauseTimeout\n * @private\n */\n function pauseTimeout()\n {\n paused = true;\n timeRemaining -= (new Date()).getTime() - timeStart;\n window.clearTimeout( timeout );\n }\n\n /**\n * Continue paused timeout\n * @function continueTimeout\n * @private\n */\n function continueTimeout()\n {\n paused = false;\n timeStart = (new Date()).getTime();\n timeout = window.setTimeout( function()\n {\n hide();\n window.clearInterval( interval );\n }, timeRemaining );\n }\n\n /**\n * Stop timeout. Stopped timeouts cannot be continued.\n * @function stopTimeout\n * @private\n */\n function stopTimeout()\n {\n window.clearTimeout( timeout );\n window.clearInterval( interval );\n }\n\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Displaying error messages and handling wait screen\n * @class UIFactory\n * @static\n */\n pm.factory( 'UIFactory', function()\n {\n /**\n * Increased/ decreased when showing/ hiding wait screen to avoid stacking\n * multiple instances of overlays.\n * @attribute waitScreenCount\n * @private\n * @type {number}\n * @default 0\n */\n var waitScreenCount = 0;\n var waitScreen;\n var errorPopup = null;\n\n return {\n throwError : throwError,\n printErrors : printErrors,\n showWaitScreen: showWaitScreen,\n hideWaitScreen: hideWaitScreen\n };\n\n /**\n * Display a single error message.\n * @function throwError\n * @param {number} code A code identifying this error\n * @param {string} msg The error message to display\n */\n function throwError( code, msg )\n {\n printErrors( [{code: code, message: msg}] );\n }\n\n /**\n * Wrap error messages in error popup, if popup doesn't already contain this error\n * If popup is already visible, append new errors to popup's inner HTML\n * otherwise create new popup\n * @function printErrors\n * @param {Array} errorMessages A list of errors to display\n */\n function printErrors( errorMessages )\n {\n\n // create error-popup if not exist\n if ( !errorPopup || $( 'body' ).has( errorPopup ).length <= 0 )\n {\n errorPopup = $( pm.compileTemplate( 'error/errorPopup.html' ) );\n $( 'body' ).append( errorPopup );\n pm.partials.Error.init( errorPopup );\n }\n\n $.each( errorMessages, function( key, error )\n {\n // add additional error, if not exist.\n pm.partials.Error.addError( errorPopup, $( pm.compileTemplate( 'error/errorMessage.html', error ) ) );\n } );\n\n pm.partials.Error.show( errorPopup );\n\n hideWaitScreen( true );\n }\n\n /**\n * Show wait screen if not visible and increase\n * {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * @function showWaitScreen\n */\n function showWaitScreen()\n {\n waitScreenCount = waitScreenCount || 0;\n\n // create wait-overlay if not exist\n if ( !waitScreen || $( 'body' ).has( waitScreen ).length <= 0 )\n {\n waitScreen = $( pm.compileTemplate( 'waitscreen/waitscreen.html' ) );\n $( 'body' ).append( waitScreen );\n }\n\n pm.partials.WaitScreen.show( waitScreen );\n\n // increase instance counter to avoid showing multiple overlays\n waitScreenCount++;\n return waitScreenCount;\n }\n\n /**\n * Decrease {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * and hide wait screen if waitScreenCount is 0\n * @function hideWaitScreen\n * @param {boolean} forceClose set true to hide wait screen independent from the value of waitScreenCount.\n */\n function hideWaitScreen( forceClose )\n {\n\n // decrease overlay count\n waitScreenCount--;\n\n // hide if all instances of overlays has been closed\n // or if closing is forced by user\n if ( waitScreenCount <= 0 || !!forceClose )\n {\n waitScreenCount = 0;\n pm.partials.WaitScreen.hide( waitScreen );\n }\n return waitScreenCount;\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Factories provide static functions and can be injected into\n * {{#crossLinkModule \"Services\"}}services{{/crossLinkModule}}.
    \n * Factories also can inject other factories. Compared to services,\n * factories are not visible in instances of {{#crossLinkModule \"PlentyFramework\"}}PlentyFramework{{/crossLinkModule}}.\n *\n * @module Factories\n * @main Factories\n */\nObject.equals = function( a, b )\n{\n if ( a === b )\n {\n return true;\n }\n if ( !(a instanceof Object) || !(b instanceof Object) )\n {\n return false;\n }\n if ( a.constructor !== b.constructor )\n {\n return false;\n }\n\n for ( var key in a )\n {\n if ( !a.hasOwnProperty( key ) )\n {\n continue;\n }\n if ( !b.hasOwnProperty( key ) )\n {\n return false;\n }\n if ( a[key] === b[key] )\n {\n continue;\n }\n if ( typeof( a[key] ) !== \"object\" )\n {\n return false;\n }\n if ( !Object.equals( a[key], b[key] ) )\n {\n return false;\n }\n }\n\n for ( var key in b )\n {\n if ( b.hasOwnProperty( key ) && !a.hasOwnProperty( key ) )\n {\n return false;\n }\n }\n\n return true;\n\n};\nPlentyFramework.cssClasses = {\n\n active: \"active\"\n\n};\n(function( $, pm )\n{\n\n pm.partials.Error = {\n\n /**\n * Will be called, after the error popup was created and injected in DOM.\n * @param {HTMLElement} popup The injected element of the popup\n */\n init: function( popup )\n {\n $( popup ).find( '.close' ).click( function()\n {\n pm.partials.Error.hideAll();\n } );\n },\n\n /**\n * Will be called for each thrown error. Has to be injected in DOM manually.\n * @param {HTMLElement} popup The error popup element\n * @param {HTMLElement} error The error message element\n */\n addError: function( popup, error )\n {\n var errorCode = $( error ).attr( 'data-plenty-error-code' );\n\n if ( $( popup ).find( '[data-plenty-error-code=\"' + errorCode + '\"]' ).length <= 0 )\n {\n $( popup ).find( '.plentyErrorBoxInner' ).append( error );\n }\n },\n\n /**\n * Will be called, after initialization and injection of all errors\n * @param {HTMLElement} popup The error popup element\n */\n show: function( popup )\n {\n $( popup ).show();\n },\n\n hideAll: function() {\n $( '#CheckoutErrorPane' ).hide();\n $( '#CheckoutErrorPane' ).find( '.plentyErrorBoxInner' ).html( '' );\n }\n\n }\n\n})( jQuery, PlentyFramework );\n(function( $, pm )\n{\n\n pm.partials.Modal = {\n\n /**\n * Will be called after a new modal was created and injected into DOM\n * @param {HTMLElement} element The injected modal element\n * @param {Modal} modal The instance of the current modal\n */\n init: function( element, modal )\n {\n element.on( 'hidden.bs.modal', function()\n {\n modal.hide();\n if( !modal.selector )\n {\n //Do not remove static modals\n element.remove();\n }\n } );\n\n if ( modal.timeout > 0 )\n {\n element.on( 'hide.bs.modal', modal.stopTimeout );\n element.find( '.modal-content' ).hover( function()\n {\n modal.pauseTimeout();\n }, function()\n {\n if ( element.is( '.in' ) )\n {\n modal.continueTimeout();\n }\n } );\n }\n },\n\n /**\n * Will be called if a Modal requests to show.\n * @param {HTMLElement} element The injected modal element\n */\n show: function( element )\n {\n element.modal( 'show' );\n },\n\n /**\n * Will be called if a Modal requests to hide.\n * @param {HTMLElement} element The injected modal element\n */\n hide: function( element )\n {\n element.modal( 'hide' );\n },\n\n /**\n * Detect if a given HTML string contains a modal\n * @param {HTMLElement} html the element to search a modal in.\n * @returns {boolean} true if a modal was found\n */\n isModal: function( html )\n {\n return $( html ).filter( '.modal' ).length + $( html ).find( '.modal' ).length > 0;\n },\n\n /**\n * Filter a modal from a given HTML string\n * @param {HTMLElement} html the element to get a modal from.\n * @returns {HTMLElement} the filtered modal element\n */\n getModal: function( html )\n {\n var modal = $( html );\n if ( modal.length > 1 )\n {\n modal = $( html ).filter( '.modal' ) || $( html ).find( '.modal' );\n }\n\n return modal;\n }\n\n };\n\n}( jQuery, PlentyFramework ));\n(function( $ )\n{\n\n $( document ).on( 'initPartials', function( e, root )\n {\n\n $( root ).find( '[data-toggle=\"tooltip\"]' ).tooltip( {\n container: 'body'\n } );\n\n } );\n\n})( jQuery );\n(function( $, pm )\n{\n\n pm.partials.WaitScreen = {\n\n /**\n * Will be called if the wait screen should be shown\n * @param {HTMLElement} element The wait screen element\n */\n show: function( element )\n {\n element.addClass( 'in' );\n },\n\n /**\n * Will be called if the wait screen should be hidden\n * @param {HTMLElement} element The wait screen element\n */\n hide: function( element )\n {\n element.removeClass( 'in' );\n }\n\n };\n\n})( jQuery, PlentyFramework );\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.service( 'AddressDoctorService', function( API )\n {\n return {\n validateAddress: validateAddress\n };\n\n function validateAddress( addressForms )\n {\n var addressIsValid = true;\n addressForms = addressForms || '[data-plenty-address-doctor]';\n $( addressForms ).filter( '[data-plenty-address-doctor]:visible' ).each( function( i, form )\n {\n var addressDoctor = new AddressDoctor( form );\n var requiredFields = $( form ).attr( 'data-plenty-address-doctor' ).replace( /\\s/g, '' ).split( ',' );\n if ( !addressDoctor.isValid( requiredFields ) )\n {\n addressIsValid = false;\n }\n\n } );\n\n return addressIsValid;\n }\n\n function AddressDoctor( form )\n {\n var $form = $( form );\n var $inputs = {\n Street : $form.find( 'input[name=\"Street\"]' ),\n ZIP : $form.find( 'input[name=\"ZIP\"]' ),\n City : $form.find( 'input[name=\"City\"]' ),\n HouseNo: $form.find( 'input[name=\"HouseNo\"]' )\n };\n var $suggestionContainer = {};\n\n var suggestions;\n var requiredFields;\n\n return {\n isValid: isValid\n };\n\n function isValid( fields )\n {\n\n if ( isPackstation() )\n {\n return true;\n }\n\n suggestions = new AddressList( $form.getFormValues() );\n requiredFields = fields;\n\n refreshView();\n\n return suggestions.getAddresses().length == 1;\n }\n\n function refreshView()\n {\n $( '.suggestion-list' ).remove();\n\n var suggestionListVisible = false;\n for ( var i = 0; i < requiredFields.length; i++ )\n {\n if ( !validateInput( requiredFields[i], suggestionListVisible ) )\n {\n $form.trigger( 'validationFailed' );\n suggestionListVisible = true;\n }\n }\n\n if ( suggestions.houseNoAllowed( $inputs.HouseNo.val() ) || suggestions.getAddresses().length == 1 )\n {\n $inputs.HouseNo.removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs.HouseNo.addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n }\n else\n {\n $inputs.HouseNo.removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs.HouseNo.addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n }\n }\n\n function validateInput( key, suggestionListVisible )\n {\n var valueList = suggestions.getList( key );\n\n if ( !!$suggestionContainer[key] )\n {\n $suggestionContainer[key].remove();\n }\n\n if ( !$inputs[key] )\n {\n return true;\n }\n\n if ( valueList.length == 1 )\n {\n $inputs[key].val( valueList[0] );\n\n $inputs[key].removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs[key].addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n return true;\n }\n else\n {\n $inputs[key].removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs[key].addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n\n if ( !suggestionListVisible )\n {\n buildSuggestionList( $inputs[key], valueList );\n }\n $inputs[key].off( 'focus' );\n $inputs[key].focus();\n return false;\n\n }\n }\n\n function positionSuggestionList( $parent, suggestionKey )\n {\n $suggestionContainer[suggestionKey].css( {\n 'width': $parent.outerWidth( true ),\n 'left' : $parent.position().left,\n 'top' : $parent.position().top + $parent.outerHeight( true )\n } );\n }\n\n function buildSuggestionList( $parent, values )\n {\n var suggestionKey = $parent.attr( 'name' );\n\n // render html content\n $suggestionContainer[suggestionKey] = $( pm.compileTemplate( 'addressSuggestions/addressDoctor.html', {values: values} ) );\n\n positionSuggestionList( $parent, suggestionKey );\n\n $( window ).on( 'sizeChange', function()\n {\n positionSuggestionList( $parent, suggestionKey );\n } );\n\n // bind click event to list elements\n $suggestionContainer[suggestionKey].find( '[data-address-value]' ).each( function( i, elem )\n {\n\n var $elem = $( elem );\n var value = $elem.attr( 'data-address-value' );\n\n $elem.click( function()\n {\n // insert clicked value in input\n $parent.val( value );\n\n // filter addresses and show remaining suggestions\n var filterAddress = {};\n filterAddress[$parent.attr( 'name' )] = value;\n suggestions.filter( filterAddress );\n\n // refresh suggestion lists\n refreshView();\n\n } );\n\n } );\n\n // inject html\n $parent.parent().append( $suggestionContainer[suggestionKey] );\n }\n\n function isPackstation()\n {\n return ( $inputs.Street.val().toUpperCase() == \"PACKSTATION\" || $inputs.Street.val().toUpperCase() == \"POSTFILIALE\" );\n }\n\n }\n\n function AddressList( addressInput )\n {\n var addresses = [];\n\n init();\n\n return {\n getAddresses : getAddresses,\n getList : getList,\n filter : filter,\n houseNoAllowed: houseNoAllowed\n };\n\n function init()\n {\n API.get( '/rest/checkout/addresssuggestionresultslist/', {\n suggestionType: \"addressdoctor\",\n street : addressInput.Street,\n ZIP : addressInput.ZIP,\n city : addressInput.City,\n houseNo : addressInput.HouseNo,\n country : addressInput.CountryID\n }, false, false, true ).done( function( response )\n {\n\n var responseLength = response.data.length;\n\n for ( var i = 0; i < responseLength; i++ )\n {\n var currentResponse = response.data[i];\n\n var address = getAddress( currentResponse )\n if ( !address )\n {\n currentResponse.HouseNo = [currentResponse.HouseNo];\n addresses.push( currentResponse );\n }\n else\n {\n address.HouseNo.push( currentResponse.HouseNo );\n }\n\n }\n\n } );\n }\n\n function getAddress( suggestion )\n {\n var addressCount = addresses.length;\n\n for ( var j = 0; j < addressCount; j++ )\n {\n if ( suggestion.Street == addresses[j].Street && addresses.ZIP == addresses[j].ZIP && suggestion.City == addresses[j].City )\n {\n return addresses[j];\n }\n }\n\n return null;\n\n }\n\n function getAddresses()\n {\n return addresses;\n }\n\n function getList( key )\n {\n var results = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( $.inArray( address[key], results ) < 0 )\n {\n results.push( address[key] );\n }\n }\n\n return results;\n }\n\n function filter( filterAddress )\n {\n var filteredAddresses = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( (!!filterAddress.Street && filterAddress.Street == address.Street)\n || (!!filterAddress.ZIP && filterAddress.ZIP == address.ZIP)\n || (!!filterAddress.City && filterAddress.City == address.City) )\n {\n filteredAddresses.push( address );\n }\n }\n\n addresses = filteredAddresses;\n }\n\n function houseNoAllowed( houseNo )\n {\n houseNo = parseInt( houseNo );\n\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n\n for ( var j = 0; j < address.HouseNo.length; j++ )\n {\n var range = address.HouseNo[j].split( '-' );\n if ( ( range.length == 1 && houseNo == range[0] )\n || range.length == 2 && houseNo >= range[0] && houseNo <= range[1] )\n {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for logging in and out and registering new customers.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    \n * @class AuthenticationService\n * @static\n */\n pm.service( 'AuthenticationService', function( API, Checkout, UI )\n {\n\n return {\n resetPassword : resetPassword,\n customerLogin : customerLogin,\n setInvoiceAddress: setInvoiceAddress,\n registerCustomer : registerCustomer\n };\n\n /**\n * Reading E-Mail from form marked with data-plenty-checkout=\"lostPasswordForm\"\n * and sends request to provide a new password to the entered E-Mail-Address.\n *\n * @function resetPasswort\n * @return {object} jQuery deferred\n * Object\n */\n function resetPassword()\n {\n\n var form = $( '[data-plenty-checkout=\"lostPasswordForm\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n var params = {\n Email: values.Email\n };\n\n return API.post( \"/rest/checkout/lostpassword/\", params )\n .done( function( response )\n {\n if ( response.data.IsMailSend == true )\n {\n $( '[data-plenty-checkout=\"lostPasswordTextContainer\"]' ).hide();\n $( '[data-plenty-checkout=\"lostPasswordSuccessMessage\"]' ).show();\n }\n } );\n\n }\n }\n\n /**\n * Try to login in with credentials read from given <form> - element.\n * On success redirect to forms 'action' attribute.\n *\n * @function customerLogin\n * @param {object} form The jQuery-wrapped form-element to read the credentials from\n * @return {object} jQuery deferred\n * Object\n */\n function customerLogin( form )\n {\n if ( form.validateForm() )\n {\n var values = form.getFormValues();\n\n var params = {\n Email : values.loginMail,\n Password: values.loginPassword\n };\n\n UI.showWaitScreen();\n return API.post( \"/rest/checkout/login/\", params )\n .done( function()\n {\n // successful login -> go to form's target referenced by action-attribute\n window.location.assign( form.attr( 'action' ) );\n\n } );\n }\n }\n\n /**\n * Setting the invoice address of a newly registered customer or a guest.\n *\n * @function setInvoiceAddress\n * @param {object} invoiceAddress containing address-data sent to server\n * @return {object} jQuery deferred\n * Object\n */\n function setInvoiceAddress( invoiceAddress )\n {\n\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n Checkout.getCheckout().CustomerInvoiceAddress = response.data;\n } );\n }\n\n /**\n * Prepare address-data to register new customer. Read the address-data from a <form> marked with\n * data-plenty-checkout-form=\"customerRegistration\"
    \n * On success, redirect to forms target referenced by action-attribute\n *\n * @function registerCustomer\n * @return {object} jQuery deferred\n * Object\n */\n function registerCustomer()\n {\n var form = $( '[data-plenty-checkout-form=\"customerRegistration\"]' );\n\n if ( form.validateForm() && pm.getInstance().AddressDoctorService.validateAddress() )\n {\n var values = form.getFormValues();\n values.LoginType = 2;\n\n if ( values.checkout\n && values.checkout.customerInvoiceAddress\n && values.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = values.checkout.customerInvoiceAddress.CustomerProperty;\n values.CustomerPropertiesList = values.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n values.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n return setInvoiceAddress( values )\n .done( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } );\n }\n }\n }, ['APIFactory', 'CheckoutFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for adding, editing or removing basket items and coupon codes
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class BasketService\n * @static\n */\n pm.service( 'BasketService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n addItem : addBasketItem,\n removeItem : removeBasketItem,\n getItem : getBasketItem,\n setItemQuantity : setItemQuantity,\n editItemAttributes: editItemAttributes,\n editOrderParams : editOrderParams,\n addCoupon : addCoupon,\n removeCoupon : removeCoupon\n };\n\n /**\n * Add item to basket. Will fail and show a popup if item has order params\n * @function addBasketItem\n * @param {Array} article Array containing the item to add\n * @param {boolean} [isUpdate=false] Indicating if item's OrderParams are updated\n * @return {object} jQuery deferred\n * Object\n */\n function addBasketItem( article )\n {\n\n if ( !!article )\n {\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/',\n {\n itemID : article[0].BasketItemItemID,\n quantity: article[0].BasketItemQuantity\n }, false, true ).done( function( resp )\n {\n // checking for order params!\n if ( resp.data[0].indexOf( \"form-group\" ) > 0 )\n {\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Select order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n addArticle( saveOrderParams( article ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n }\n else\n {\n addArticle( article );\n }\n } );\n }\n }\n\n /**\n * Read OrderParams from <form> marked with data-plenty-checkout-form=\"OrderParamsForm\" and inject\n * read values in 'addBasketList'. Update item by calling addBasketItem() again\n * @function saveOrderParams\n * @private\n * @param {Array} articleWithParams Containing the current item to add. Read OrderParams will be injected\n */\n function saveOrderParams( articleWithParams )\n {\n //TODO use $(\"[data-plenty-checkout-form='OrderParamsForm']\").serializeArray() to get order params\n var orderParamsForm = $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' );\n var $self = {};\n var attrType = \"\";\n var match;\n\n //Groups\n orderParamsForm.find( '[name^=\"ParamGroup\"]' ).each( function()\n {\n match = this.name.match( /^ParamGroup\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], $( this ).val(), $( this ).val() );\n } );\n\n //Values\n orderParamsForm.find( '[name^=\"ParamValue\"]' ).each( function()\n {\n $self = $( this );\n attrType = $self.attr( 'type' );\n\n if ( ((attrType == 'checkbox' && $self.is( ':checked' )) ||\n (attrType == 'radio' && $self.is( ':checked' )) ||\n (attrType != 'radio' && attrType != 'checkbox')) && attrType != 'file' && attrType != 'hidden' )\n {\n\n var match = $self[0].name.match( /^ParamValue\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], $self.val() );\n\n }\n else if ( attrType == 'file' )\n {\n if ( $self[0].files && $self[0].files.length > 0 )\n {\n articleWithParams = orderParamFileUpload( $self, articleWithParams );\n }\n else\n {\n var match = $self[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n var paramValue = $( 'input[type=\"hidden\"][name=\"ParamValue[' + match[1] + '][' + match[2] + ']\"]' ).val();\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], paramValue );\n }\n }\n } );\n\n return articleWithParams;\n }\n\n function addArticle( article )\n {\n API.post( '/rest/checkout/basketitemslist/', article, true )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n // Show confirmation popup\n CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', {ArticleID: article[0].BasketItemItemID} ).from( 'ItemView' )\n .done( function( response )\n {\n var timeout = pm.getGlobal( 'TimeoutItemToBasketOverlay', 5000 );\n var modal = Modal.prepare().setContent( response.data[0] );\n\n if ( timeout > 0 )\n {\n modal.setTimeout( timeout );\n }\n\n modal.show();\n } );\n } );\n } ).fail( function( jqXHR )\n {\n // some other error occured\n UI.printErrors( JSON.parse( jqXHR.responseText ).error.error_stack );\n } );\n }\n\n function updateArticle( article )\n {\n API.put( '/rest/checkout/basketitemslist/', article )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n } );\n } )\n }\n\n function orderParamFileUpload( $input, articleWithParams )\n {\n var key = $input[0].id;\n var orderParamUploadFiles = {};\n var orderParamFileIdStack = [];\n var formData;\n var fileData;\n var params = {\n type : 'POST',\n data : {},\n isFile : true,\n cache : false,\n dataType : 'json',\n processData: false,\n contentType: false\n };\n\n orderParamUploadFiles[key] = $input[0].files;\n\n // if input not pushed before.\n if ( orderParamFileIdStack.indexOf( key ) == -1 )\n {\n orderParamFileIdStack.push( key );\n }\n\n for ( var i = 0, length = orderParamFileIdStack.length; i < length; ++i )\n {\n formData = new FormData();\n fileData = orderParamUploadFiles[orderParamFileIdStack[i]];\n formData.append( \"0\", fileData[0], fileData[0].name );\n\n params.data = formData;\n\n API.post( \"/rest/checkout/orderparamfile/\", params );\n }\n\n var match = $input[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n\n return addOrderParamValue( articleWithParams, match[1], match[2], orderParamUploadFiles[key][0]['name'] );\n }\n\n /**\n * Inject an OrderParam.\n * @function addOrderParamValue\n * @private\n * @param {Array} basketList The target to inject the value in.\n * @param {number} position Position where to inject the value\n * @param {number} paramId The ID of the OrderParam to inject\n * @param {string|number} paramValue the value of the OrderParam to inject\n * @returns {Array} Containing the item and the injected OrderParam\n */\n function addOrderParamValue( basketList, position, paramId, paramValue )\n {\n if ( position > 0 && basketList[position] == undefined )\n {\n basketList[position] = $.extend( true, {}, basketList[0] );\n basketList[position].BasketItemOrderParamsList = [];\n }\n\n if ( basketList[position] != undefined )\n {\n basketList[position].BasketItemQuantity = 1;\n if ( basketList[position].BasketItemOrderParamsList == undefined )\n {\n basketList[position].BasketItemOrderParamsList = [];\n }\n if ( paramValue )\n {\n basketList[position].BasketItemOrderParamsList.push( {\n BasketItemOrderParamID : paramId,\n BasketItemOrderParamValue: paramValue\n } );\n }\n }\n\n return basketList;\n }\n\n function editItemAttributes( BasketItemID )\n {\n var modal = $( '[data-plenty-basket-item=\"' + BasketItemID + '\"]' );\n modal.modal( 'show' );\n modal.find( '[data-plenty-modal=\"confirm\"]' ).on( 'click', function()\n {\n var basketItem = getBasketItem( BasketItemID );\n var attributesList = [];\n\n // check for select or list of images\n modal.find( 'select, .PlentyFormContainer.AttrImage > input[type=\"hidden\"]' ).each( function( i, attributeSelect )\n {\n var match = attributeSelect.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( attributeSelect ).val()\n } );\n }\n\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItem.BasketItemAttributesList = attributesList;\n }\n //update basketItem and refresh previewLists\n updateArticle( [basketItem] );\n\n } );\n }\n\n function editOrderParams( BasketItemID )\n {\n\n var basketItem = getBasketItem( BasketItemID );\n // FIX: unset old order params\n\n basketItem.BasketItemOrderParamsList = [];\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/', {\n itemID : basketItem.BasketItemItemID,\n quantity : basketItem.BasketItemQuantity,\n basketItemID: BasketItemID\n } ).done( function( resp )\n {\n // checking for order params!\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Edit order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n updateArticle( saveOrderParams( [basketItem] ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n } );\n }\n\n function getBasketItem( BasketItemID )\n {\n var basketItems = Checkout.getCheckout().BasketItemsList;\n for ( var i = 0; i < basketItems.length; i++ )\n {\n if ( basketItems[i].BasketItemID == BasketItemID )\n {\n return basketItems[i];\n }\n }\n\n return null;\n }\n\n /**\n * Remove item from basket. Will show a confirmation popup at first.\n * @function removeBasketItem\n * @param {number} BasketItemID The ID of the basket item to remove\n * @param {boolean} [forceDelete=false] Set true to remove the basket item without showing a confirmation popup\n * @return Promise\n */\n function removeBasketItem( BasketItemID, forceDelete )\n {\n\n var deferred = $.Deferred();\n\n // get item name\n var itemName = getBasketItem( BasketItemID ).BasketItemNameMap[1];\n\n // calling the delete request\n function doDelete()\n {\n API.delete( '/rest/checkout/basketitemslist/?basketItemIdsList[0]=' + BasketItemID )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n //$( '[data-basket-item-id=\"' + BasketItemID + '\"]' ).remove();\n\n if ( !Checkout.getCheckout().BasketItemsList || Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n }\n else\n {\n // FALLBACK if design not support selector\n // [data-plenty-checkout-template=\"BasketItemsList\"]\n if ( $( '[data-plenty-checkout-template=\"BasketItemsList\"]' ).length >= 0 )\n {\n API.get( \"/rest/checkout/container_checkoutbasketitemslist/\" ).done( function( response )\n {\n var $oldBasketList = $( '[data-basket-item-id]' ).parents( \"ul\" );\n var $basketListContainer = $oldBasketList.parents( \".panel-body\" );\n $oldBasketList.fadeOut( function()\n {\n $( this ).siblings( \":not('[data-plenty-checkout-template]')\" ).remove();\n $( this ).remove();\n $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn(function() {\n pm.getInstance().bindDirectives( $basketListContainer );\n });\n } );\n } );\n }\n else\n {\n Checkout.reloadContainer( 'BasketItemsList' );\n }\n Checkout.reloadContainer( 'Totals' );\n }\n\n refreshBasketPreview();\n\n deferred.resolve();\n } );\n } );\n }\n\n if ( !forceDelete )\n {\n // show confirmation popup\n Modal.prepare()\n .setTitle( pm.translate( 'Please confirm' ) )\n .setContent( '

    ' + pm.translate( \"Do you really want to remove \\\"{{item}}\\\" from your basket?\", {item: itemName} ) + '

    ' )\n .onDismiss( function()\n {\n //$('[data-basket-item-id=\"' + BasketItemID +\n // '\"]').find('[data-plenty=\"quantityInput\"]').val(originalItemQuantity);\n deferred.reject();\n } )\n .onConfirm( function()\n {\n doDelete();\n } )\n .setLabelConfirm( pm.translate( \"Delete\" ) )\n .show();\n }\n else\n {\n doDelete();\n }\n\n return deferred;\n }\n\n /**\n * Set a new quantity for the given BasketItem. If quantity is set to 0,\n * remove the item.\n * @function setItemQuantity\n * @param {number} BasketItemID The ID of the basket item to change the quantity of\n * @param {number} BasketItemQuantity The new quantity to set or 0 to remove the item\n */\n function setItemQuantity( BasketItemID, BasketItemQuantity )\n {\n // delete item if quantity is 0\n if ( BasketItemQuantity <= 0 )\n {\n return removeBasketItem( BasketItemID );\n }\n\n var deferred = $.Deferred();\n var params = Checkout.getCheckout().BasketItemsList;\n var basketItem;\n var basketItemIndex;\n\n for ( var i = 0; i < params.length; i++ )\n {\n if ( params[i].BasketItemID == BasketItemID )\n {\n basketItemIndex = i;\n basketItem = params[i];\n break;\n\n }\n }\n\n if ( !!basketItem && basketItem.BasketItemQuantity != BasketItemQuantity )\n {\n params[basketItemIndex].BasketItemQuantity = parseInt( BasketItemQuantity );\n\n API.post( \"/rest/checkout/basketitemslist/\", params )\n .done( function()\n {\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n refreshBasketPreview();\n deferred.resolve();\n } );\n } );\n }\n\n return deferred;\n }\n\n /**\n * Reload BasketPreview-Template and update basket totals\n * @function refreshBasketPreview\n * @private\n */\n function refreshBasketPreview()\n {\n\n Checkout.reloadItemContainer( 'BasketPreviewList' )\n .done( function()\n {\n\n $( '[data-plenty-basket-empty]' ).each( function( i, elem )\n {\n var toggleClass = $( elem ).attr( 'data-plenty-basket-empty' );\n if ( Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n $( elem ).addClass( toggleClass );\n }\n else\n {\n $( elem ).removeClass( toggleClass );\n }\n } );\n\n } );\n\n //update quantity\n var itemQuantityTotal = 0;\n $.each( Checkout.getCheckout().BasketItemsList, function( i, basketItem )\n {\n itemQuantityTotal += basketItem.BasketItemQuantity;\n } );\n\n $( '[data-plenty-basket-preview=\"itemQuantityTotal\"]' ).text( itemQuantityTotal );\n $( '[data-plenty-basket-preview=\"totalsItemSum\"]' ).text( Checkout.getCheckout().Totals.TotalsItemSum );\n }\n\n /**\n * Read the coupon code from an <input> element marked with data-plenty-checkout-form=\"couponCode\"\n * and try to add this coupon.\n * @function addCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function addCoupon()\n {\n var params = {\n CouponActiveCouponCode: $( '[data-plenty-checkout-form=\"couponCode\"]' ).val()\n };\n\n return API.post( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n\n updateContainer();\n } );\n } );\n }\n\n /**\n * Remove the currently added coupon\n * @function removeCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function removeCoupon()\n {\n var params = {\n CouponActiveCouponCode: Checkout.getCheckout().Coupon.CouponActiveCouponCode\n };\n\n return API.delete( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n delete Checkout.getCheckout().Coupon;\n\n updateContainer();\n } );\n } );\n }\n\n // update container\n function updateContainer()\n {\n Checkout.reloadContainer( 'Coupon' );\n // reload totals, if we are at basket\n if ( $( '[data-plenty-checkout-template=\"Totals\"]' ).length > 0 )\n {\n Checkout.reloadContainer( 'Totals' );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for checkout process like setting shipping & payment information and placing the order.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutService\n * @static\n */\n pm.service( 'CheckoutService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n init : init,\n setCustomerSignAndInfo: setCustomerSignAndInfo,\n registerGuest : registerGuest,\n setShippingProfile : setShippingProfile,\n saveShippingAddress : saveShippingAddress,\n loadAddressSuggestion : loadAddressSuggestion,\n preparePayment : preparePayment,\n setMethodOfPayment : setMethodOfPayment,\n confirmAtrigaPaymax : confirmAtrigaPaymax,\n editBankDetails : editBankDetails,\n editCreditCard : editCreditCard,\n placeOrder : placeOrder\n };\n\n /**\n * Load checkout data initially on page load\n * @function init\n */\n function init()\n {\n Checkout.loadCheckout( true );\n }\n\n /**\n * Read customer sign and order information text from <form> marked with\n * data-plenty-checkout-form=\"details\" and update checkout.\n * @function setCustomerSignAndInfo\n * @return {object} jQuery deferred\n * Object\n */\n function setCustomerSignAndInfo()\n {\n var form = $( '[data-plenty-checkout-form=\"details\"]' );\n var values = form.getFormValues();\n\n // initialize CustomerSign & InfoText to avoid updating empty values\n if ( !Checkout.getCheckout().CheckoutCustomerSign )\n {\n Checkout.getCheckout().CheckoutCustomerSign = \"\";\n }\n if ( !Checkout.getCheckout().CheckoutOrderInfoText )\n {\n Checkout.getCheckout().CheckoutOrderInfoText = \"\";\n }\n\n if ( ( Checkout.getCheckout().CheckoutCustomerSign !== values.CustomerSign && $( form ).find( '[name=\"CustomerSign\"]' ).length > 0 )\n || ( Checkout.getCheckout().CheckoutOrderInfoText !== values.OrderInfoText && $( form ).find( '[name=\"OrderInfoText\"]' ).length > 0 ) )\n {\n\n Checkout.getCheckout().CheckoutCustomerSign = values.CustomerSign;\n Checkout.getCheckout().CheckoutOrderInfoText = values.OrderInfoText;\n\n return Checkout.setCheckout();\n\n }\n else\n {\n // No changes detected -> Do nothing\n return API.idle();\n }\n }\n\n /**\n * Read address data from <form> marked with data-plenty-checkout-form=\"shippingAddress\".\n * Create new shipping address or update the shipping address ID.\n * @function saveShippingAddress\n * @param {boolean} [validateForm = false] validate form before processing requests\n * @return {object} jQuery deferred\n * Object\n */\n function saveShippingAddress( validateForm )\n {\n var form = $( '[data-plenty-checkout-form=\"shippingAddress\"]' );\n\n if ( !validateForm && !form.validateForm() )\n {\n return false;\n }\n\n if ( !validateForm && !pm.getInstance().AddressDoctorService.validateAddress( form ) )\n {\n return false;\n }\n\n var values = form.getFormValues();\n var shippingAddressID = $( '[name=\"shippingAddressID\"]:checked' ).val();\n\n if ( shippingAddressID < 0 )\n {\n // save separate\n var shippingAddress = values;\n\n if ( !addressesAreEqual( shippingAddress, Checkout.getCheckout().CustomerShippingAddress ) )\n {\n if ( shippingAddress.Street == \"PACKSTATION\" )\n {\n shippingAddress.IsPackstation = 1;\n shippingAddress.PackstationNo = shippingAddress.HouseNo;\n }\n else if ( shippingAddress.Street == \"POSTFILIALE\" )\n {\n shippingAddress.IsPostfiliale = 1;\n shippingAddress.PostfilialNo = shippingAddress.HouseNo;\n }\n\n // new shipping address\n return API.post( \"/rest/checkout/customershippingaddress/\", shippingAddress )\n .done( function( response )\n {\n\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = response.data.ID;\n Checkout.getCheckout().CheckoutShippingCountryID = response.data.CountryID;\n\n updatePaymentAndShippingDependencies();\n } );\n }\n else\n {\n // no changes detected\n return API.idle();\n }\n\n }\n else\n {\n if ( shippingAddressID != Checkout.getCheckout().CheckoutCustomerShippingAddressID )\n {\n // change shipping address id\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = shippingAddressID;\n\n updatePaymentAndShippingDependencies();\n }\n else\n {\n return API.idle();\n }\n }\n }\n\n function updatePaymentAndShippingDependencies()\n {\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n $( '#shippingAdressSelect' ).modal( 'hide' );\n\n // don't hit me. Ugly hack: this is to force quit/remove everything from modal.\n if($(\".modal-backdrop\")) {\n $(\".modal-backdrop\").remove();\n }\n } );\n }\n\n /**\n * Prepare address-data to register a guest. Reads the address-data from a <form> marked with\n * data-plenty-checkout-form=\"guestRegistration\"\n * @function registerGuest\n * @return {object} jQuery deferred\n * Object\n */\n function registerGuest()\n {\n var form = $( '[data-plenty-checkout-form=\"guestRegistration\"]' );\n\n var invoiceAddress = form.getFormValues();\n invoiceAddress.LoginType = 1;\n\n if ( invoiceAddress.checkout\n && invoiceAddress.checkout.customerInvoiceAddress\n && invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty;\n invoiceAddress.CustomerPropertiesList = invoiceAddress.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n invoiceAddress.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n if ( !addressesAreEqual( invoiceAddress, Checkout.getCheckout().CustomerInvoiceAddress ) )\n {\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n saveShippingAddress().done( Checkout.loadCheckout );\n } );\n }\n else\n {\n return saveShippingAddress();\n }\n }\n\n /**\n * Check if values of addresses are equal\n * @function addressesAreEqual\n * @private\n * @param {object} address1\n * @param {object} address2\n * @returns {boolean}\n */\n function addressesAreEqual( address1, address2 )\n {\n for ( var key in address1 )\n {\n if ( address1[key] + '' !== address2[key] + '' && key !== 'EmailRepeat' )\n {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Set the shipping profile used for this order and update checkout. Selected shipping profile will be\n * read from <form> marked with data-plenty-checkout-form=\"shippingProfileSelect\"\n * @function setShippingProfile\n * @return {object} jQuery deferred\n * Object\n */\n function setShippingProfile()\n {\n\n var values = $( '[data-plenty-checkout-form=\"shippingProfileSelect\"]' ).getFormValues();\n\n Checkout.getCheckout().CheckoutShippingProfileID = values.ShippingProfileID;\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n\n }\n\n /**\n * Prepare method of payment to check if external checkout is used or addition content should be displayed\n * @function preparePayment\n * @return {object} jQuery deferred\n * Object\n */\n function preparePayment()\n {\n var paymentID = Checkout.getCheckout().CheckoutMethodOfPaymentID;\n var paymentData = $( 'input[type=\"radio\"][name=\"MethodOfPaymentID\"][value=\"' + paymentID + '\"]' ).parent().getFormValues();\n return API.post( \"/rest/checkout/preparepayment/\", paymentData, true )\n .done( function( response )\n {\n if ( response.data.CheckoutMethodOfPaymentRedirectURL != '' )\n {\n\n document.location.assign( response.data.CheckoutMethodOfPaymentRedirectURL );\n\n }\n else if ( !!response.data.CheckoutMethodOfPaymentAdditionalContent )\n {\n\n var isBankDetails = $( response.data.CheckoutMethodOfPaymentAdditionalContent ).find( '[data-plenty-checkout-form=\"bankDetails\"]' ).length > 0;\n Modal.prepare()\n .setContent( response.data.CheckoutMethodOfPaymentAdditionalContent )\n .onConfirm( function()\n {\n if ( isBankDetails )\n {\n return saveBankDetails();\n }\n else\n {\n return saveCreditCard();\n }\n } )\n .show();\n }\n } )\n .fail( function( jqXHR )\n {\n try\n {\n var response = $.parseJSON( jqXHR.responseText );\n\n var errorStack = [];\n for ( var i = 0; i < response.error.error_stack.length; i++ )\n {\n if ( response.error.error_stack[i].code == 651 )\n {\n // notify atriga validation errors\n Checkout.reloadContainer( 'MethodsOfPaymentList' ).done( function()\n {\n $( document ).trigger( 'plenty.AtrigaValidationFailed' );\n } );\n }\n else\n {\n errorStack.push( response.error.error_stack[i] );\n }\n }\n\n // display remaining errors\n if ( errorStack.length > 0 )\n {\n UI.printErrors( errorStack );\n }\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n } );\n\n }\n\n /**\n * Set the method of payment used for this order.\n * @function setMethodOfPayment\n * @param {number|undefined} paymentID ID of the method of payment to use. Read from <form> marked with\n * data-plenty-checkout-form=\"methodOfPayment\" if unset.\n * @return {object} jQuery deferred\n * Object\n */\n function setMethodOfPayment( paymentID )\n {\n /*\n var methodsOfPaymentList = Checkout.getCheckout().MethodsOfPaymentList;\n var methodOfPayment;\n for( var i = 0; i < methodsOfPaymentList.length; i++ )\n {\n if( methodsOfPaymentList[i].MethodOfPaymentID == paymentID )\n {\n methodOfPayment = methodsOfPaymentList[i];\n break;\n }\n }\n */\n\n if ( !paymentID )\n {\n // FIX for older callisto layouts (< 3.3): get payment id from input field\n paymentID = $( 'input[name=\"MethodOfPaymentID\"]:checked' ).val();\n }\n\n Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID;\n\n if ( !pm.getGlobal( 'Checkout.AtrigaRequireUserConfirmation' ) )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = true;\n }\n\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'ShippingProfilesList' );\n } );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxChecked )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = !!atrigaPaymaxChecked;\n return API.put( '/rest/checkout', {\n CheckoutAtrigapaymaxChecked: !!atrigaPaymaxChecked\n } );\n //return Checkout.setCheckout();\n }\n\n /**\n * Display the popup to enter or edit customers bank details\n * @function editBankDetails\n */\n function editBankDetails()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationBankDetails' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveBankDetails();\n } )\n .show();\n } );\n\n }\n\n /**\n * Read entered bank details from data-plenty-checkout-form=\"bankDetails\" and update checkout.\n * @function saveBankDetails\n * @private\n * @return {boolean} the result of form validation\n */\n function saveBankDetails()\n {\n var form = $( '[data-plenty-checkout-form=\"bankDetails\"]' );\n\n if ( form.validateForm() )\n {\n var values = form.getFormValues().checkout.customerBankDetails;\n\n var bankDetails = {\n CustomerBankName : values.bankName,\n CustomerBLZ : values.blz,\n CustomerAccountNumber: values.accountNo,\n CustomerAccountOwner : values.accountOwner,\n CustomerIBAN : values.iban,\n CustomerBIC : values.bic\n };\n\n API.post( \"/rest/checkout/paymentinformationbankdetails/\", bankDetails )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n setMethodOfPayment( 3 );\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing credit card form\n * @function editCreditCard\n */\n function editCreditCard()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationCreditCard' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveCreditCard();\n } )\n .show();\n } );\n }\n\n /**\n * Read values from <form> marked with data-plenty-checkout-form=\"creditCard\" and update checkout.\n * @function saveCreditCard\n * @private\n * @return {boolean} the result of form validation\n */\n function saveCreditCard()\n {\n var form = $( '[data-plenty-checkout-form=\"creditCard\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues().checkout.paymentInformationCC;\n\n var creditCard = {\n Owner : values.owner,\n Cvv2 : values.cvv2,\n Number : values.number,\n Year : values.year,\n Month : values.month,\n Provider: values.provider\n };\n\n API.post( '/rest/checkout/paymentinformationcreditcard/', creditCard )\n .done( function()\n {\n Checkout.loadCheckout();\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing address suggestions\n * @param {string} type\n */\n function loadAddressSuggestion( type )\n {\n\n //check login type\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n var values = $( '[data-plenty-checkout-form=\"shippingAddress\"]' ).getFormValues();\n }\n else\n {\n var values = $( '[data-plenty-checkout-form=\"guestRegistration\"]' ).getFormValues();\n }\n\n var params = {\n street : values.Street,\n houseNo : values.HouseNo,\n ZIP : values.ZIP,\n city : values.City,\n postnummer : values.Postnummer,\n suggestionType: 'postfinder'\n };\n\n CMS.getContainer( 'CheckoutAddressSuggestionResultsList', params ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .show();\n } );\n }\n\n /**\n * Place the order prepared before and finish the checkout process.
    \n * Validate required checkboxes in data-plenty-checkout-form=\"placeOrder\"\n * @function placeOrder\n * @return {object} jQuery deferred\n * Object\n */\n function placeOrder()\n {\n var form = $( '[data-plenty-checkout-form=\"placeOrder\"]' );\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n // if not shown in layout set default 1 for mandatory fields\n var params = {\n TermsAndConditionsCheck : values.termsAndConditionsCheck || 0,\n WithdrawalCheck : values.withdrawalCheck || 0,\n PrivacyPolicyCheck : values.privacyPolicyCheck || 0,\n AgeRestrictionCheck : values.ageRestrictionCheck || 0,\n NewsletterCheck : values.newsletterCheck || 0,\n KlarnaTermsAndConditionsCheck: values.klarnaTermsAndConditionsCheck || 0,\n PayoneDirectDebitMandateCheck: values.payoneDirectDebitMandateCheck || 0,\n PayoneInvoiceCheck : values.payoneInvoiceCheck || 0\n };\n\n return API.post( \"/rest/checkout/placeorder/\", params )\n .done( function( response )\n {\n if ( response.data.MethodOfPaymentRedirectURL != '' )\n {\n\n window.location.assign( response.data.MethodOfPaymentRedirectURL );\n\n }\n else if ( response.data.MethodOfPaymentAdditionalContent != '' )\n {\n\n Modal.prepare()\n .setContent( response.data.MethodOfPaymentAdditionalContent )\n .setLabelDismiss( '' )\n .onDismiss( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).onConfirm( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).show();\n\n }\n else\n {\n\n window.location.assign( form.attr( 'action' ) );\n\n }\n } );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n pm.service( 'FeedbackService', function( API )\n {\n\n return {\n getFeedbacks : getFeedbacks,\n addFeedback : addFeedback,\n ArticleTypes : articleTypes(),\n FeedbackTypes: feedbackTypes()\n };\n\n /*\n FeedbackService\n .getFeedbacks().between('2014-12-03', '2015-07-01')\n .for( FeedbackService.ArticleTypes.ITEM, 2732, FeedbackService.FeedbackTypes.COMMENTS_ONLY );\n */\n function getFeedbacks()\n {\n var feedbackInterval = {\n dateStart: null,\n dateEnd : null\n };\n\n return {\n between: setFeedbackInterval,\n for : listFeedbacks\n };\n\n function setFeedbackInterval( start, end )\n {\n feedbackInterval.dateStart = start;\n feedbackInterval.dateEnd = end;\n return this;\n }\n\n function listFeedbacks( articleType, referenceId, feedbackType )\n {\n\n var params = {\n ReferenceId : referenceId,\n FromDate : feedbackInterval.dateStart,\n ToDate : feedbackInterval.dateEnd,\n FeedbackType: feedbackType || feedbackTypes().COMMENTS_AND_RATINGS\n };\n return API.get( '/rest/feedback/' + articleType + '/', params );\n\n }\n }\n\n /*\n FeedbackService\n .addFeedback()\n .withRating( 5 )\n .withComment( 'Hallo' )\n .withAuthor( 'Felix', 'felix.dausch@plentymarkets.com', 123456 )\n .to( FeedbackService.ArticleTypes.ITEM, 2732 );\n */\n function addFeedback()\n {\n\n var params = {\n Rating : 1.0,\n Text : '',\n Author : '',\n Email : '',\n CustomerId: 0\n };\n\n return {\n withRating : withRating,\n withComment: withComment,\n withAuthor : withAuthor,\n to : sendFeedback\n };\n\n function withRating( rating )\n {\n params.Rating = rating;\n return this;\n }\n\n function withComment( comment )\n {\n params.Text = comment;\n return this;\n }\n\n function withAuthor( author, mail, customerID )\n {\n params.Author = author;\n if ( !!mail )\n {\n params.Email = mail;\n }\n if ( !!customerID )\n {\n params.CustomerId = customerID;\n }\n return this;\n }\n\n function sendFeedback( articleType, referenceId )\n {\n return API.post( '/rest/feedback/' + articleType + '/', params );\n\n }\n\n }\n\n function feedbackTypes()\n {\n return {\n COMMENTS_ONLY : 'comments_only',\n RATINGS_ONLY : 'ratings_only',\n COMMENTS_AND_RATINGS: 'comments_with_ratings'\n }\n }\n\n function articleTypes()\n {\n return {\n ITEM : 'item',\n CATEGORY: 'category',\n BLOG : 'blog'\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Listens to window's size and trigger 'sizeChange' event if the Bootstrap interval changes.\n * @class MediaSizeService\n * @static\n * @example\n * $(window).on('sizeChange', function(newValue, oldValue) {\n * console.log('The interval changed from ' + oldValue + ' to ' + newValue.');\n * });\n */\n pm.service( 'MediaSizeService', function()\n {\n\n var bsInterval;\n\n // recalculation of the current interval on window resize\n $( window ).resize( calculateMediaSize );\n\n // initially calculation of the interval\n $( document ).ready( calculateMediaSize );\n\n return {\n interval : getInterval,\n isInterval: isInterval\n };\n\n /**\n * Get the currently used Bootstrap interval\n * @function getInterval\n * @return {\"xs\"|\"sm\"|\"md\"|\"lg\"}\n */\n function getInterval()\n {\n if ( !!bsInterval )\n {\n calculateMediaSize();\n }\n\n return bsInterval;\n }\n\n /**\n * Calculate the currently used Bootstrap interval\n * @function calculateMediaSize\n * @private\n */\n function calculateMediaSize()\n {\n var size;\n if ( !!window.matchMedia )\n { // FIX IE support\n if ( window.matchMedia( '(min-width:1200px)' ).matches )\n {\n size = 'lg';\n }\n else if ( window.matchMedia( '(min-width:992px)' ).matches )\n {\n size = 'md';\n }\n else if ( window.matchMedia( '(min-width:768px)' ).matches )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n else\n {\n if ( $( window ).width() >= 1200 )\n {\n size = 'lg';\n }\n else if ( $( window ).width() >= 992 )\n {\n size = 'md';\n }\n else if ( $( window ).width() >= 768 )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n if ( size != bsInterval || size === 'xs' )\n {\n var oldValue = bsInterval;\n bsInterval = size;\n $( window ).trigger( 'sizeChange', [bsInterval, oldValue] );\n }\n }\n\n function isInterval( interval )\n {\n var intervalList = interval.replace( /\\s/g, '' ).split( ',' );\n for ( var i = 0; i < intervalList.length; i++ )\n {\n if ( intervalList[i] == bsInterval )\n {\n return true;\n }\n }\n return false;\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Handling navigation while checkout processes\n * @class NavigatorService\n * @static\n *\n */\n pm.service( 'NavigatorService', function( CMS, Checkout )\n {\n var navigation = [];\t\t// contains navigation list elements\n var container = [];\t\t// content containers\n var current = -1;\t\t// index of currently shown content container\n var buttonPrev = {};\t\t// navigation buttons\n var buttonNext = {};\n var interceptors = {\n beforeChange: [],\n afterChange : []\n };\n var checkoutStates = [];\n\n return {\n init : init,\n getCurrentContainer: getCurrentContainer,\n goTo : goTo,\n beforeChange : beforeChange,\n afterChange : afterChange,\n continueChange : continueChange,\n next : next,\n previous : previous,\n goToID : goToID,\n fillNavigation : fillNavigation\n };\n\n /**\n * Initialize checkout navigation. Shows first container.\n * @function init\n * @example\n * ```html\n * \n *
      \n *
    • Checkout Step 1
    • \n *
    • Checkout Step 2
    • \n *
    • ...
    • \n *
    \n * \n *\n *
    \n *
    \n * Checkout Step 1 Content\n *
    \n *
    \n * Checkout Step 2 Content\n *
    \n *
    ...
    \n *
    \n * ```\n */\n function init()\n {\n\n // get elements from DOM\n navigation = $( '[data-plenty-checkout=\"navigation\"] > li' );\n container = $( '[data-plenty-checkout=\"container\"] > div' );\n buttonNext = $( '[data-plenty-checkout=\"next\"]' );\n buttonPrev = $( '[data-plenty-checkout=\"prev\"]' );\n\n if ( navigation.length == container.length && container.length > 0 )\n {\n var checkout = Checkout.getCheckout();\n\n container.hide();\n\n // initialize navigation\n navigation.each( function( i, elem )\n {\n $( elem ).addClass( 'disabled' );\n // handle navigation click events\n $( elem ).click( function()\n {\n if ( !$( this ).is( '.disabled' ) )\n {\n goTo( i );\n }\n } );\n } );\n\n buttonNext.attr( \"disabled\", \"disabled\" );\n buttonNext.click( function()\n {\n next();\n } );\n\n buttonPrev.attr( \"disabled\", \"disabled\" );\n buttonPrev.click( function()\n {\n previous();\n } );\n\n window.addEventListener( 'hashchange', function()\n {\n if ( window.location.hash.length > 0 )\n {\n goToID( window.location.hash );\n }\n else\n {\n goTo( 0 );\n }\n }, false );\n\n // initialize GUI\n // check url param for jumping to tab\n $.urlParam = function( name )\n {\n var results = new RegExp( '[\\?&]' + name + '=([^&#]*)' ).exec( window.location.href );\n if ( results == null )\n {\n return null;\n }\n else\n {\n return results[1] || 0;\n }\n };\n\n var param = $.urlParam( 'gototab' );\n // jump to hash from url param 'gototab'\n if ( window.location.hash.length == 0 && !!param && $( '[data-plenty-checkout-id=\"' + param + '\"]' ).length > 0 )\n {\n window.location.hash = param;\n }\n // jump to hash\n else if ( !goToID( window.location.hash ) && current >= 0 )\n {\n goTo( current );\n }\n else\n {\n goTo( 0 );\n }\n\n fillNavigation();\n $( window ).on( 'sizeChange', fillNavigation );\n $( window ).resize( function()\n {\n if ( pm.getInstance().MediaSizeService.interval() == 'xs' )\n {\n fillNavigation();\n }\n } );\n\n }\n }\n\n /**\n * Get the currently active checkout container.\n * @function getCurrentContainer\n * @return {{id: string, index: number}}\n */\n function getCurrentContainer()\n {\n if ( current >= 0 )\n {\n return {\n id : $( container[current] ).attr( 'data-plenty-checkout-id' ),\n index: current\n };\n }\n else\n {\n return null;\n }\n }\n\n /**\n * Register an interceptor called before each tab change.\n * Tabchange will break if any interceptor returns false.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n * @example\n * plenty.NavigatorService.beforeChange( function(targetContainer) {\n * if( targetContainer.id === 'details' ) {\n * // stop tabchange if user tries to access checkout container with id \"details\"\n * return false;\n * }\n * return true;\n * });\n */\n function beforeChange( interceptor )\n {\n interceptors.beforeChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Register an interceptor called after each tab change.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n */\n function afterChange( interceptor )\n {\n interceptors.afterChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Call registered interceptors. Break if any interceptor returns false.\n * Do not call beforeChange-interceptors on initially tabchange\n * @function resolveInterceptors\n * @private\n * @param {\"beforeChange\"|\"afterChange\"} identifier Describe which interceptors should be called\n * @param {number} index the index of the target container\n * @returns {boolean} Conjunction of all interceptor return values\n */\n function resolveInterceptors( identifier, index )\n {\n var continueTabChange = true;\n\n if ( current >= 0 || identifier === 'afterChange' )\n {\n\n var currentContainer = getCurrentContainer();\n var targetContainer = {\n index: index,\n id : $( container[index] ).attr( 'data-plenty-checkout-id' )\n };\n\n $.each( interceptors[identifier], function( i, interceptor )\n {\n if ( interceptor( currentContainer, targetContainer ) === false )\n {\n continueTabChange = false;\n return false;\n }\n } );\n }\n\n return continueTabChange;\n }\n\n /**\n * Show checkout tab given by index\n * @function goTo\n * @param {number} index Index of target tab, starting at 0\n * @param {boolean} [ignoreInterceptors=false] Set true to not call registered interceptors and force changing\n * tab\n */\n function goTo( index, ignoreInterceptors )\n {\n\n var contentChanged = current !== index;\n\n if ( contentChanged && !ignoreInterceptors )\n {\n if ( !resolveInterceptors( \"beforeChange\", index ) )\n {\n return;\n }\n }\n\n current = index;\n\n if ( !Object.equals( checkoutStates[current], Checkout.getCheckout( true ) ) && contentChanged && !!$( container[current] ).attr( 'data-plenty-checkout-content' ) )\n {\n checkoutStates[current] = Checkout.getCheckout( true );\n // reload tab content\n CMS.getCategoryContent( $( container[current] ).attr( 'data-plenty-checkout-content' ) )\n .done( function( response )\n {\n $( container[current] ).html( response.data[0] );\n // continue tab change\n proceedTabChange( contentChanged );\n pm.getInstance().bindDirectives( container[current] );\n $( window ).trigger( 'contentChanged' );\n } );\n }\n else\n {\n // continue tab change without reloading tab content\n proceedTabChange( contentChanged );\n //pm.getInstance().bindDirectives();\n }\n\n }\n\n function proceedTabChange( contentChanged )\n {\n\n // hide content containers\n $( container ).hide();\n\n // refresh navigation elements\n var $elem;\n $( navigation ).each( function( i, elem )\n {\n $elem = $( elem );\n $elem.removeClass( 'disabled active' );\n\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'false' );\n\n if ( i < current )\n {\n // set current element as active\n $elem.addClass( 'visited' );\n }\n else\n {\n if ( i == current )\n {\n $elem.addClass( 'active visited' );\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'true' );\n }\n else\n {\n if ( i > current && !$elem.is( '.visited' ) )\n {\n // disable elements behind active\n $elem.addClass( 'disabled' );\n }\n }\n }\n } );\n fillNavigation();\n\n // hide \"previous\"-button if first content container is shown\n if ( current <= 0 )\n {\n buttonPrev.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonPrev.removeAttr( \"disabled\" );\n }\n\n // hide \"next\"-button if last content container is shown\n if ( current + 1 == navigation.length )\n {\n buttonNext.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonNext.removeAttr( \"disabled\" );\n }\n\n // show current content container\n $( container[current] ).show();\n\n // set location hash\n if ( current > 0 )\n {\n window.location.hash = $( container[current] ).attr( 'data-plenty-checkout-id' );\n }\n else\n {\n if ( window.location.hash.length > 0 )\n {\n window.location.hash = '';\n }\n }\n\n if ( contentChanged )\n {\n resolveInterceptors( \"afterChange\", current );\n }\n }\n\n /**\n * Continue interrupted tabchange. Shorthand for: goTo(targetContainer.index, true)\n * @function continueChange\n * @param targetContainer The tab-object received from an interceptor\n */\n function continueChange( targetContainer )\n {\n goTo( targetContainer.index, true );\n }\n\n /**\n * Show next checkout tab if available. Shorthand for\n * \n * if (current < navigation.length - 1) {\n * goTo(current + 1);\n * }\n * \n * @function next\n */\n function next()\n {\n if ( current < navigation.length - 1 )\n {\n goTo( current + 1 );\n }\n }\n\n /**\n * Show previous checkout tab if available\n * @function next\n */\n function previous()\n {\n if ( current > 0 )\n {\n goTo( current - 1 );\n }\n }\n\n /**\n * Show checkout tab given by ID\n * @function goToID\n * @param {string} containerID ID of tab to show. Target tab must be marked with\n * data-plenty-checkout-id=\"#...\"\n */\n function goToID( containerID )\n {\n if ( containerID == 'next' )\n {\n next();\n return true;\n }\n else if ( containerID == 'prev' )\n {\n previous();\n return true;\n }\n else\n {\n containerID = containerID.replace( '#', '' );\n $( container ).each( function( i, elem )\n {\n if ( $( elem ).attr( 'data-plenty-checkout-id' ) == containerID )\n {\n goTo( i );\n return true;\n }\n } );\n }\n\n return false;\n }\n\n /**\n * Calculate navigation's width to match its parent element\n * by increasing its items padding.\n * @function fillNavigation\n */\n function fillNavigation()\n {\n // break if manager has not been initialized\n var navigationCount = navigation.length;\n if ( navigationCount <= 0 )\n {\n return;\n }\n\n // reset inline styles\n $( navigation ).removeAttr( 'style' );\n $( navigation ).children( 'span' ).removeAttr( 'style' );\n $( buttonNext ).removeAttr( 'style' );\n $( buttonPrev ).removeAttr( 'style' );\n\n var buttonWidth = ($( buttonPrev ).outerWidth() < $( buttonNext ).outerWidth()) ? $( buttonNext ).outerWidth( true ) + 1 : $( buttonPrev ).outerWidth( true ) + 1;\n $( buttonNext ).css( {width: buttonWidth + 'px'} );\n $( buttonPrev ).css( {width: buttonWidth + 'px'} );\n\n // calculate width to fill\n var width = $( navigation ).parent().parent().outerWidth( true ) - ( 2 * buttonWidth);\n width -= parseInt( $( navigation ).parent().css( 'marginLeft' ) ) + parseInt( $( navigation ).parent().css( 'marginRight' ) );\n\n var padding = width;\n var tabWidth = [];\n\n $( navigation ).each( function( i, elem )\n {\n padding -= parseInt( $( elem ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).css( 'marginRight' ) );\n\n tabWidth[i] = $( elem ).children( 'span' ).width();\n padding -= tabWidth[i];\n\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginRight' ) );\n } );\n\n var paddingEachItem = parseInt( padding / navigationCount );\n\n var paddingLeft, paddingRight;\n if ( paddingEachItem % 2 == 1 )\n {\n paddingLeft = ( paddingEachItem / 2 ) + 0.5;\n paddingRight = ( paddingEachItem / 2 ) - 0.5;\n }\n else\n {\n paddingLeft = paddingEachItem / 2;\n paddingRight = paddingEachItem / 2;\n }\n\n var paddingLastItem = parseInt( padding - ( ( navigationCount - 1 ) * ( paddingLeft + paddingRight ) ) );\n var paddingLastLeft, paddingLastRight;\n if ( paddingLastItem % 2 == 1 )\n {\n paddingLastLeft = ( paddingLastItem / 2 ) + 0.5;\n paddingLastRight = ( paddingLastItem / 2) - 0.5;\n }\n else\n {\n paddingLastLeft = paddingLastItem / 2;\n paddingLastRight = paddingLastItem / 2;\n }\n\n var diff = width;\n $( navigation ).each( function( i, elem )\n {\n if ( i < navigationCount - 1 )\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLeft + 'px', 'paddingRight': paddingRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLeft + paddingRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n else\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLastLeft + 'px', 'paddingRight': paddingLastRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLastLeft + paddingLastRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n } );\n\n //$(navigation).parent().css('marginRight', 0);\n }\n\n }, ['CMSFactory', 'CheckoutFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Magnus Martin \n * =====================================================================================\n */\n\n\n(function( $, pm )\n{\n pm.service( 'PostfinderService', function( API, Modal, UIFactory )\n {\n var packstationID = '';\n var shippingFields = {};\n var numberOfResults = {};\n var result = {};\n\n return {\n openPostfinderModal: openPostfinderModal,\n isPackstation : isPackstation\n };\n\n function isPackstation()\n {\n var street = $( 'input[name=\"Street\"]' ).val();\n return ( street.toUpperCase() == \"PACKSTATION\" || street.toUpperCase() == \"POSTFILIALE\" );\n }\n\n function openPostfinderModal()\n {\n shippingFields = {\n PostfinderItemStreet : $( 'input[name=\"Street\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemZIP : $( 'input[name=\"ZIP\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemCity : $( 'input[name=\"City\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemHouseNo: $( 'input[name=\"HouseNo\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' )\n\n };\n\n shippingFields.PostfinderItemStreet.val( '' );\n\n if ( (shippingFields.PostfinderItemZIP.val().length > 2 || shippingFields.PostfinderItemCity.val().length > 2) )\n {\n\n API.get( '/rest/checkout/shippingaddresspostfinderlist/',\n {\n suggestionType: \"postfinder\",\n zip : shippingFields.PostfinderItemZIP.val(),\n city : shippingFields.PostfinderItemCity.val()\n } )\n\n .done( function( response )\n {\n result = response.data;\n numberOfResults = result.length;\n\n if ( numberOfResults == 0 )\n {\n showErrorMessage();\n }\n\n var params = {\n addresses: []\n };\n\n for ( var i = 0; i < numberOfResults; i++ )\n {\n var dimension = 'km';\n var distInMeters = result[i].PostfinderItemDistance;\n var distInKilometers = distInMeters / 1000;\n distInKilometers = ((Math.round( distInKilometers * 100 ) / 100).toFixed( 2 )).replace( '.', ',' );\n\n if ( distInMeters < 1000 )\n {\n distInKilometers = distInMeters;\n dimension = 'm';\n }\n\n params.addresses.push( {\n index : i,\n dimension: dimension,\n type : result[i].PostfinderItemIsPackstation ? 'Packstation' : 'Postfiliale',\n number : result[i].PostfinderItemIsPackstation ? result[i].PostfinderItemPackstationNo : result[i].PostfinderItemPostfilialNo,\n street : result[i].PostfinderItemStreet,\n houseNo : result[i].PostfinderItemHouseNo,\n zip : result[i].PostfinderItemZIP,\n city : result[i].PostfinderItemCity,\n district : result[i].PostfinderItemDistrict,\n distance : distInKilometers,\n remark : result[i].PostfinderItemRemark\n } );\n }\n\n var html = pm.compileTemplate( 'addressSuggestions/postFinder.html', params );\n\n Modal.prepare()\n .setTitle( pm.translate( 'Packstations and post offices in your area' ) )\n .setContent( html )\n .setClass( 'checkout' )\n .onConfirm( function()\n {\n shippingFields.PostfinderItemCity.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemStreet.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemStreet.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemHouseNo.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemHouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n packstationID = $( 'input[type=\"radio\"][name=\"postfinder\"]:checked' ).val();\n\n if ( result[packstationID].PostfinderItemIsPackstation )\n {\n $( shippingFields.PostfinderItemStreet ).val( 'PACKSTATION' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPackstationNo );\n }\n else\n {\n $( shippingFields.PostfinderItemStreet ).val( 'POSTFILIALE' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPostfilialNo );\n }\n $( shippingFields.PostfinderItemStreet ).trigger( 'change' );\n\n $( shippingFields.PostfinderItemCity ).val( result[packstationID].PostfinderItemCity );\n $( shippingFields.PostfinderItemZIP ).val( result[packstationID].PostfinderItemZIP );\n return true;\n } )\n .show()\n } );\n }\n else\n {\n showErrorMessage();\n }\n\n }\n\n function showErrorMessage()\n {\n UIFactory.throwError( 0, pm.translate( 'Please enter a ZIP code and/or a city.' ) );\n\n shippingFields.PostfinderItemCity.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemCity.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n\n shippingFields.PostfinderItemZIP.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n }\n }, ['APIFactory', 'ModalFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide templates for social share providers to inject them dynamically.\n * @class SocialShareService\n * @static\n */\n pm.service( 'SocialShareService', function()\n {\n\n //TODO: move to global variables\n if ( typeof(socialLangLocale) == 'undefined' )\n {\n socialLangLocale = 'en_US';\n }\n if ( typeof(socialLang) == 'undefined' )\n {\n socialLang = 'en';\n }\n\n return {\n getSocialService: getService\n };\n\n /**\n * Get the template for social media provider\n * @function getService\n * @param {string} identifier name of the social media provider to get the template for\n * @returns {string} the template to inject in DOM\n */\n function getService( identifier )\n {\n var services = {\n 'facebook-like': '',\n\n 'facebook-recommend': '',\n\n 'twitter': '',\n\n 'google-plus': '
    '\n + '',\n };\n\n return services[identifier];\n }\n\n /**\n * get the canonical URL if defined\n * @function getURL\n * @private\n * @return {string} The Canonical URL if defined or the current URI\n */\n function getURI()\n {\n var uri = document.location.href;\n var canonical = $( \"link[rel=canonical]\" ).attr( \"href\" );\n\n if ( canonical && canonical.length > 0 )\n {\n if ( canonical.indexOf( \"http\" ) < 0 )\n {\n canonical = document.location.protocol + \"//\" + document.location.host + canonical;\n }\n uri = canonical;\n }\n\n return uri;\n }\n\n /**\n * returns content of <meta name=\"\" content=\"\"> tags or '' if empty/non existant\n * @function getMeta\n * @private\n * @param {string} name The meta name to get the value of;\n */\n function getMeta( name )\n {\n var metaContent = $( 'meta[name=\"' + name + '\"]' ).attr( 'content' );\n return metaContent || '';\n }\n\n /**\n * create tweet text from content of <meta name=\"DC.title\"> and <meta name=\"DC.creator\">\n * fallback to content of <title> tag\n * @function getTweetText\n * @private\n */\n function getTweetText()\n {\n var title = getMeta( 'DC.title' );\n var creator = getMeta( 'DC.creator' );\n\n if ( title.length > 0 && creator.length > 0 )\n {\n title += ' - ' + creator;\n }\n else\n {\n title = $( 'title' ).text();\n }\n\n return encodeURIComponent( title );\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide methods for client-side form validation.\n * @class ValidationService\n * @static\n */\n pm.service( 'ValidationService', function()\n {\n\n return {\n validate: validate\n };\n\n /**\n * Check if element is a form element (input, select, textarea) or search for child form elements\n * @function getFormControl\n * @private\n * @param {object} element the element to get the form element from\n * @return {object} a valid form element (input, select, textarea)\n */\n function getFormControl( element )\n {\n element = $( element );\n if ( element.is( 'input' ) || element.is( 'select' ) || element.is( 'textarea' ) )\n {\n return element;\n }\n else\n {\n if ( element.find( 'input' ).length > 0 )\n {\n return element.find( 'input' );\n }\n\n else if ( element.find( 'select' ).length > 0 )\n {\n return element.find( 'select' );\n }\n\n else if ( element.find( 'textarea' ).length > 0 )\n {\n return element.find( 'textarea' );\n }\n\n else\n {\n return null;\n }\n }\n\n }\n\n /**\n * Check given element has any value\n * @function validateText\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateText( formControl )\n {\n // check if formControl is no checkbox or radio\n if ( formControl.is( 'input' ) || formControl.is( 'select' ) || formControl.is( 'textarea' ) )\n {\n // check if length of trimmed value is greater then zero\n return $.trim( formControl.val() ).length > 0;\n\n }\n else\n {\n console.error( 'Validation Error: Cannot validate Text for <' + formControl.prop( \"tagName\" ) + '>' );\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid email-address\n * @function validateMail\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateMail( formControl )\n {\n var mailRegExp = /[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n if ( validateText( formControl ) )\n {\n return mailRegExp.test( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid number\n * @function validateNumber\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateNumber( formControl )\n {\n if ( validateText( formControl ) )\n {\n return $.isNumeric( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is equal to a references value\n * @function validateValue\n * @private\n * @param {object} formControl the form element to validate\n * @param {string} reference the required value\n * @return {boolean}\n */\n function validateValue( formControl, reference )\n {\n if ( $( reference ).length > 0 )\n {\n return $.trim( formControl.val() ) == $.trim( $( reference ).val() );\n }\n else\n {\n return $.trim( formControl.val() ) == reference;\n }\n }\n\n function visibility( formControl )\n {\n return formControl.is( ':visible' );\n }\n\n function isEnabled( formControl )\n {\n return formControl.is( ':enabled' );\n }\n\n /**\n * Validate a form. Triggers event 'validationFailed' if any element has an invalid value\n * @function validate\n * @param {object} form The form element to validate\n * @returns {boolean}\n * @example\n * ```html\n * \n *
    \n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n *
    \n * \n * \n *
    \n *\n *
    \n * ```\n *\n * @example\n * $(form).on('validationFailed', function(missingFields) {\n * // handle missing fields\n * });\n */\n function validate( form, errorClass )\n {\n var formControl, formControls, validationKey, currentHasError, group, checked, checkedMin, checkedMax, attrValidate, validationKeys, formControlAttrType;\n var $form = $( form );\n errorClass = errorClass || 'has-error';\n var missingFields = [];\n var hasError = false;\n\n // check every required input inside form\n $form.find( '[data-plenty-validate], :required' ).each( function( i, elem )\n {\n attrValidate = $( elem ).attr( 'data-plenty-validate' );\n formControls = getFormControl( elem )\n // validate text inputs\n validationKeys = !!attrValidate ? attrValidate : 'text';\n validationKeys = validationKeys.split( ',' );\n\n for ( var i = 0, length = formControls.length; i < length; i++ )\n {\n formControl = $( formControls[i] );\n formControlAttrType = formControl.attr( 'type' );\n\n if ( !visibility( formControl ) || !isEnabled( formControl ) )\n {\n return;\n }\n\n validationKey = validationKeys[i].trim() || validationKeys[0].trim();\n currentHasError = false;\n\n // formControl is textfield (text, mail, password) or textarea\n if ( (formControl.is( 'input' )\n && formControlAttrType != 'radio'\n && formControlAttrType != 'checkbox')\n || formControl.is( 'textarea' ) )\n {\n switch ( validationKey )\n {\n\n case 'text':\n currentHasError = !validateText( formControl );\n break;\n\n case 'mail':\n currentHasError = !validateMail( formControl );\n break;\n\n case 'number':\n currentHasError = !validateNumber( formControl );\n break;\n\n case 'value':\n currentHasError = !validateValue( formControl, $( elem ).attr( 'data-plenty-validation-value' ) );\n break;\n\n case 'none':\n // do not validate\n break;\n\n default:\n console.error( 'Form validation error: unknown validate property: \"' + attrValidate + '\"' );\n break;\n }\n }\n else if ( formControl.is( 'input' )\n && (formControlAttrType == 'radio'\n || formControlAttrType == 'checkbox') )\n {\n // validate radio buttons\n group = formControl.attr( 'name' );\n checked = $form.find( 'input[name=\"' + group + '\"]:checked' ).length;\n\n if ( formControlAttrType == 'radio' )\n {\n checkedMin = 1;\n checkedMax = 1;\n }\n else\n {\n var minMax = (new Function(\"return \" + attrValidate))() || {min: 1, max: 1};\n checkedMin = minMax.min;\n checkedMax = minMax.max;\n }\n\n currentHasError = ( checked < checkedMin || checked > checkedMax );\n\n }\n else if ( formControl.is( 'select' ) )\n {\n // validate selects\n currentHasError = ( formControl.val() == '' || formControl.val() == '-1' );\n }\n else\n {\n console.error( 'Form validation error: ' + $( elem ).prop( \"tagName\" ) + ' does not contain an form element' );\n return;\n }\n\n if ( currentHasError )\n {\n hasError = true;\n missingFields.push( formControl );\n\n if ( formControls.length > 1 )\n {\n formControl.addClass( errorClass );\n $form.find( 'label[for=\"' + formControl.attr( 'id' ) + '\"]' ).addClass( errorClass );\n }\n else\n {\n $( elem ).addClass( errorClass );\n }\n }\n }\n\n } );\n\n // scroll to element on 'validationFailed'\n $form.on( 'validationFailed', function()\n {\n var distanceTop = 50;\n var $error = $form.find( '.' + errorClass ).first();\n var errorOffset = $error.offset().top;\n var $scrollTarget = $( 'html, body' );\n\n // if form is inside of modal, scroll modal instead of body\n if ( $form.parents( '.modal' ).length > 0 )\n {\n $scrollTarget = $form.parents( '.modal' ).find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n\n }\n else if ( $form.is( '.modal' ) )\n {\n $scrollTarget = $form.find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n }\n\n // only scroll if error is outside of viewport\n if ( errorOffset - distanceTop < window.pageYOffset || errorOffset > (window.pageYOffset + window.innerHeight) )\n {\n $scrollTarget.animate( {\n scrollTop: errorOffset - distanceTop\n } );\n }\n } );\n\n if ( hasError )\n {\n // remove error class on focus\n $form.find( '.' + errorClass ).each( function( i, elem )\n {\n formControl = $( getFormControl( elem ) );\n formControl.on( 'focus click', function()\n {\n var $errorElement = $( elem );\n $errorElement.removeClass( errorClass );\n $form.find( 'label[for=\"' + $( this ).attr( 'id' ) + '\"]' ).removeClass( errorClass );\n } );\n } );\n\n $form.trigger( 'validationFailed', [missingFields] );\n }\n\n var callback = $form.attr( 'data-plenty-callback' );\n\n if ( !hasError && !!callback && callback != \"submit\" && typeof window[callback] == \"function\" )\n {\n\n var fields = {};\n $form.find( 'input, textarea, select' ).each( function()\n {\n if ( $( this ).attr( 'type' ) == 'checkbox' )\n {\n fields[$( this ).attr( 'name' )] = $( this ).is( ':checked' );\n }\n else\n {\n fields[$( this ).attr( 'name' )] = $( this ).val();\n }\n } );\n\n window[callback]( fields );\n return false;\n }\n else\n {\n return !hasError;\n }\n }\n } );\n\n /**\n * jQuery-Plugin to calling {{#crossLink \"ValidationService/validate\"}}ValidationService.validate{{/crossLink}}\n * on jQuery wrapped elements.\n * @return {boolean}\n */\n $.fn.validateForm = function()\n {\n return pm.getInstance().ValidationService.validate( this );\n };\n\n /**\n * jQuery-Plugin to get the values of contained form elements.\n * @return {object}\n */\n $.fn.getFormValues = function()\n {\n\n var form = this;\n var values = {};\n\n function inject( position, value )\n {\n var match = position.match( /^([^\\[]+)(.*)/ );\n\n if ( !!match[2] )\n {\n var exp = /\\[([^\\]]+)]/g;\n var child;\n var children = [];\n children[0] = match[1];\n while ( (child = exp.exec( match[2] )) !== null )\n {\n children.push( child[1] );\n }\n\n for ( var i = children.length - 1; i >= 0; i-- )\n {\n var val = {};\n val[children[i]] = value;\n value = val;\n }\n values = $.extend( true, values, value );\n }\n else\n {\n values[match[1]] = value;\n }\n }\n\n form.find( 'input, select, textarea' ).each( function( i, elem )\n {\n if ( !!$( elem ).attr( 'name' ) )\n {\n if ( $( elem ).attr( 'type' ) == \"checkbox\" )\n {\n // get checkbox group\n var groupValues = [];\n $( form ).find( '[name=\"' + $( elem ).attr( 'name' ) + '\"]:checked' ).each( function( j, checkbox )\n {\n groupValues.push( $( checkbox ).val() );\n } );\n inject( $( elem ).attr( 'name' ), groupValues );\n }\n else if ( $( elem ).attr( 'type' ) == 'radio' )\n {\n if ( $( elem ).is( ':checked' ) )\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n else\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n\n } );\n return values;\n }\n}( jQuery, PlentyFramework ));\n/**\n * Services provide functions to be called from the instanced PlentyFramework.
    \n * Services can inject Factories and can be injected into Directives. The are also\n * available from the global instance of PlentyFramework\n * @module Services\n * @main Services\n * @example\n * PlentyFramework.service('ServiceName', serviceFunctions() {\n * return {\n * functionInService: function() {}\n * }\n * });\n * //...\n * plenty.ServiceName.functionInService/();\n */\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\nPlentyFramework.compile();\n\n// Create global instance of PlentyFramework for usage in Webshop-Layouts\nvar plenty = PlentyFramework.getInstance();\n\n/*\n * initially bind all registered directives\n *\n * will not be tested. reasons:\n * http://stackoverflow.com/questions/29153733/how-to-unit-test-a-document-ready-function-using-jasmine\n */\njQuery( document ).ready( function()\n{\n plenty.bindDirectives();\n} );" + "var TemplateCache = {};\n\nTemplateCache[\"addressSuggestions/addressDoctor.html\"] = \"\";\n\nTemplateCache[\"addressSuggestions/postFinder.html\"] = \"{{#addresses}}\\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"{{/addresses}}\\n\" +\n \"\";\n\nTemplateCache[\"error/errorMessage.html\"] = \"
    \\n\" +\n \" Code {{code}}:\\n\" +\n \" {{{message}}}\\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"error/errorPopup.html\"] = \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"modal/modal.html\"] = \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#title}}\\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"

    {{{title}}}

    \\n\" +\n \"
    \\n\" +\n \" {{/title}}\\n\" +\n \"\\n\" +\n \"
    {{{content}}}
    \\n\" +\n \"\\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#labelDismiss}}\\n\" +\n \" \\n\" +\n \" {{/labelDismiss}}\\n\" +\n \"\\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"waitscreen/waitscreen.html\"] = \"
    \";\n\n(function defineMustache(global,factory){if(typeof exports===\"object\"&&exports&&typeof exports.nodeName!==\"string\"){factory(exports)}else if(typeof define===\"function\"&&define.amd){define([\"exports\"],factory)}else{global.Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)===\"[object Array]\"};function isFunction(object){return typeof object===\"function\"}function typeStr(obj){return isArray(obj)?\"array\":typeof obj}function escapeRegExp(string){return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")}function hasProperty(obj,propName){return obj!=null&&typeof obj===\"object\"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"/\":\"/\"};function escapeHtml(string){return String(string).replace(/[&<>\"'\\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\\s*/;var spaceRe=/\\s+/;var equalsRe=/\\s*=/;var curlyRe=/\\s*\\}/;var tagRe=/#|\\^|\\/|>|\\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile===\"string\")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error(\"Invalid tags: \"+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+\"\\\\s*\");closingTagRe=new RegExp(\"\\\\s*\"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp(\"\\\\s*\"+escapeRegExp(\"}\"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===\"\"};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return\"\";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail=\"\";break;case 0:match=\"\";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={\".\":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(\".\")>0){value=context.view;names=name.split(\".\");index=0;while(value!=null&&index\")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol===\"&\")value=this.unescapedValue(token,context);else if(symbol===\"name\")value=this.escapedValue(token,context);else if(symbol===\"text\")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer=\"\";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j\n * =====================================================================================\n */\n\n/**\n * @module PlentyFramework\n */\n(function( $ )\n{\n // will be overridden by grunt\n var version = \"1.0.8\";\n\n /**\n * Collection of uncompiled registered factories & services.\n * See {{#crossLink \"PlentyFramework/compile:method\"}}.compile(){{/crossLink}}\n * @attribute components\n * @static\n * @type {{factories: {}, services: {}}}\n */\n var components = {\n factories : {},\n services : {},\n directives: {}\n };\n\n /**\n * Framework providing client functions for plentymarkets Webshops.\n * @class PlentyFramework\n * @constructor\n */\n PlentyFramework = function()\n {\n };\n\n var instance = null;\n PlentyFramework.getInstance = function()\n {\n instance = instance || new PlentyFramework();\n return instance;\n };\n\n PlentyFramework.version = (function() {\n\n return {\n get: function() {\n return version;\n },\n equals: function( v ) {\n return compare(v) == 0;\n },\n compare: compare\n };\n\n function compare( compare )\n {\n var localVersion = version.split(\".\");\n var compareVersion = compare.split(\".\");\n\n for( var i = 0; i < compareVersion.length; i++ )\n {\n if( localVersion[i] === compareVersion[i] || compareVersion[i] === \"*\" )\n {\n continue;\n }\n\n if( parseInt(localVersion[i]) < parseInt(compareVersion[i]) )\n {\n return -1;\n }\n\n if( parseInt(localVersion[i]) > parseInt(compareVersion[i]) )\n {\n return 1;\n }\n }\n return 0;\n }\n\n })();\n\n /**\n * Customizable controls for partials will be injected here.\n * (e.g. Modal)\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.partials = {};\n\n /**\n * Collection of registered global variables\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.globals = {};\n\n /**\n * Set a global variable.\n * @function setGlobal\n * @static\n * @param {string} identifier A unique identifier to reference this variable\n * @param {*} value The value to set\n * @return {*} The value\n */\n PlentyFramework.setGlobal = function( identifier, value )\n {\n if ( PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n console.error( 'Global variable \"' + identifier + '\" already exists and cannot be overridden.' );\n return null;\n }\n\n PlentyFramework.globals[identifier] = value;\n\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Get the value of a global variable or undefined if not exists\n * @function getGlobal\n * @static\n * @param identifier The identifier of the requested variable\n * @return {*} The value of the variable\n */\n PlentyFramework.getGlobal = function( identifier, fallbackValue )\n {\n if( !PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n return fallbackValue;\n }\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Collection of registered directives\n * @type {Array}\n * @static\n */\n PlentyFramework.directives = {};\n\n /**\n * Register directive. Directives can be bound to dynamically added nodes by calling pm.bindPlentyFunctions();\n * @function directive\n * @static\n * @param {string} selector jQuery selector of the DOM-elements to bind the directive to\n * @param {function} callback Function to add directives behaviour\n * @param {Array} dependencies List of required services. Services will be passed to callback function\n * @param {boolean} allowDuplicates Defines if a directive can be bound to the same element multiple times\n * @return {object} The created directive\n */\n PlentyFramework.directive = function( directiveName, directiveFunctions, dependencies )\n {\n // Catch type mismatching for 'directiveName'\n if ( typeof directiveName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof directiveName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof directiveFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof directiveFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.directives[directiveName] = {\n name : directiveName,\n dependencies: dependencies,\n setup : directiveFunctions\n };\n };\n\n /**\n * Bind registered directives.\n * @function bindDirectives\n * @param {string} [directiveSelector] restrict binding to elements matching this selector\n */\n PlentyFramework.prototype.bindDirectives = function( rootElement )\n {\n\n rootElement = rootElement || 'html';\n\n $( rootElement ).find( '[data-plenty]' ).each( function( i, element )\n {\n\n var directives = parseDirectives( $( element ).attr( 'data-plenty' ), $( element ) );\n\n if ( directives.length <= 0 )\n {\n // continue\n return;\n }\n\n addCustomEvents( element );\n\n for ( var i = 0; i < directives.length; i++ )\n {\n var directive = directives[i];\n if ( !!PlentyFramework.directives[directive.class] && PlentyFramework.directives.hasOwnProperty( directive.class ) )\n {\n\n var callback = PlentyFramework.directives[directive.class][directive.method];\n if ( !!callback && typeof callback == \"function\" )\n {\n\n if ( directive.event == \"ready\" )\n {\n callback.apply( null, directive.params );\n }\n else\n {\n bindEventCallback( $( element ), directive.event, callback, directive.params );\n /*\n $( element ).on( directive.event, function( e )\n {\n directive = injectEvent( directive, e );\n return callback.apply( null, directive.params );\n } );\n */\n }\n\n }\n else\n {\n console.error( \"Method not found: \" + directive.method + \" in \" + directive.class );\n }\n\n }\n else\n {\n console.error( \"Directive not found: \" + directive.class );\n }\n }\n } );\n\n $( document ).trigger( 'initPartials', rootElement );\n };\n\n var eventStack = [];\n\n PlentyFramework.getRecentEvent = function( eventType )\n {\n var lastEventIdx = eventStack.length - 1;\n if ( !eventType )\n {\n return eventStack[lastEventIdx];\n }\n else\n {\n for ( var i = lastEventIdx; i >= 0; i-- )\n {\n if ( eventType == eventStack[i].type )\n {\n return eventStack[i];\n }\n }\n }\n\n return null;\n\n };\n\n PlentyFramework.pushEvent = function( event )\n {\n eventStack.push( event );\n };\n\n /**\n * Bind event to element by eventType.\n * If cms says \"click:Foo.bar(this, event)\" eventType is \"click\".\n *\n * @param $elem - jQuery object on which event was triggered\n * @param eventType - type of event\n * @param callback - callback function of directive [example: \"bar(this, event)\"]\n * @param params - list of parameters for callback function.\n */\n function bindEventCallback( $elem, eventType, callback, params )\n {\n $elem.on( eventType, function( event )\n {\n eventStack.push( event );\n return callback.apply( null, params );\n } );\n\n if( document.readyState === \"complete\" && eventType === \"ready\" )\n {\n // execute 'ready' directives directly if document is already loaded\n callback.apply( null, params );\n }\n }\n\n function addCustomEvents( element )\n {\n\n var $elem = $( element );\n\n if ( $elem.is( 'input[type=\"checkbox\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n if ( $elem.is( ':checked' ) )\n {\n $elem.trigger( 'check' );\n }\n else\n {\n $elem.trigger( 'uncheck' );\n }\n } );\n }\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n var radioGroup = $elem.attr( 'name' );\n\n $( 'input[type=\"radio\"][name=\"' + radioGroup + '\"]' ).each( function( i, radio )\n {\n var $radio = $( radio );\n if ( $radio.is( ':checked' ) )\n {\n $radio.trigger( 'check' );\n }\n else\n {\n $radio.trigger( 'uncheck' );\n }\n\n } );\n\n } );\n }\n }\n\n function parseDirectives( input, thisValue )\n {\n var directivePattern = /^(([\\w]+):)?([\\w]+)\\.([\\w]+)(\\((.*)\\))?$/;\n var expressions = input.split( ';' );\n var directives = [];\n\n for ( var i = 0; i < expressions.length; i++ )\n {\n var expression = expressions[i].trim();\n\n if ( !expression )\n {\n continue;\n }\n\n if ( !directivePattern.test( expression ) )\n {\n // console.warn( \"Invalid directive: \" + expression );\n continue;\n }\n\n var match = expression.match( directivePattern );\n\n if ( !match[3] || match[3].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Class name not set.\" );\n continue;\n }\n\n if ( !match[4] || match[4].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Method not set.\" );\n continue;\n }\n\n var directive = {\n event : match[2] || 'ready',\n class : match[3],\n method: match[4],\n params: []\n };\n\n if ( !!match[6] && match[6].length > 0 )\n {\n var params = match[6].match( /(['][^']+['])|([\\w-]+)|([\"][^\"]+[\"])/g );\n for ( var j = 0; j < params.length; j++ )\n {\n var param = params[j].trim();\n if ( !isNaN( parseFloat( param ) ) )\n {\n directive.params.push( parseFloat( param ) );\n }\n else if ( param.toLowerCase() == 'true' )\n {\n directive.params.push( true );\n }\n else if ( param.toLowerCase() == 'false' )\n {\n directive.params.push( false );\n }\n else if ( param.toLowerCase() == 'this' )\n {\n directive.params.push( thisValue );\n }\n else\n {\n directive.params.push( param.replace( /^['\"]|['\"]$/g, '' ) );\n }\n }\n }\n\n directives.push( directive );\n\n }\n return directives;\n }\n\n /**\n * Register a new service\n * @function service\n * @static\n * @param {string} serviceName Unique identifier of the service to get/ create\n * @param {function} serviceFunctions Callback containing all public functions of this service.\n * @param {Array} [dependencies] Identifiers of required services to inject in serviceFunctions\n * @return {object} The object described in serviceFunctions(). Can be received via\n * PlentyFramework.[serviceName]\n */\n PlentyFramework.service = function( serviceName, serviceFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof serviceName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof serviceName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof serviceFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof serviceFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.services[serviceName] = {\n name : serviceName,\n dependencies: dependencies,\n setup : serviceFunctions\n };\n\n };\n\n /**\n * Collection of compiled factories\n * @attribute factories\n * @static\n * @type {object}\n */\n PlentyFramework.factories = {};\n\n /**\n * Register a new factory\n * @function factory\n * @static\n * @param {string} factoryName A unique name of the new factory\n * @param {function} factoryFunctions The function describing the factory\n * @param {Array} dependencies List of required factories to inject\n */\n PlentyFramework.factory = function( factoryName, factoryFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof factoryName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof factoryName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof factoryFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof factoryFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n components.factories[factoryName] = {\n name : factoryName,\n dependencies: dependencies,\n setup : factoryFunctions\n }\n\n };\n\n /**\n * Renders html template. Will provide given data to templates scope.\n * Uses Mustache syntax for data-binding.\n * @function compileTemplate\n * @static\n * @param {String} template relative path to partials template to load. Base path = '/src/partials/'\n * @param {Object} data data to privide to templates scope.\n * @returns {String} The rendered html string\n */\n PlentyFramework.compileTemplate = function( template, data )\n {\n data = data || {};\n data.translate = function()\n {\n return function( text, render )\n {\n return render( PlentyFramework.translate( text ) );\n };\n };\n return Mustache.render( TemplateCache[template], data );\n };\n\n /**\n * The path on the server where the script is located in.\n * @attribute\n * @static\n * @type {String}\n */\n PlentyFramework.scriptPath = '';\n\n /**\n * Collection of locale strings will be injected here after reading language file.\n * @attribute\n * @static\n * @type {Object}\n */\n PlentyFramework.Strings = {};\n\n /**\n * Load language file containing translations of locale strings.\n * @function loadLanguageFile\n * @static\n * @param fileName relative path to language file.\n */\n PlentyFramework.loadLanguageFile = function( fileName )\n {\n $.ajax({\n url: PlentyFramework.scriptPath + fileName,\n dataType: 'json'\n }).done( function( response ) {\n PlentyFramework.Strings = response;\n });\n };\n\n /**\n * Try to get locale translation of given string.\n * Render translated string using Mustache syntax\n * if additional parameters are given.\n * @function translate\n * @static\n * @param {String} string The string to translate\n * @param {Object} [params] additional data for rendering\n * @returns {String} The translation of the given string if found. Otherwise returns the original string.\n */\n PlentyFramework.translate = function( string, params )\n {\n var localeString;\n if ( PlentyFramework.Strings.hasOwnProperty( string ) )\n {\n localeString = PlentyFramework.Strings[string];\n }\n else\n {\n localeString = string;\n console.warn( 'No translation found for \"' + localeString + '\".' );\n }\n\n if ( !!params )\n {\n localeString = Mustache.render( localeString, params );\n }\n\n return localeString;\n\n };\n\n /**\n * Compile registered factories & services\n * @function compile\n * @static\n */\n PlentyFramework.compile = function()\n {\n\n for ( var factory in components.factories )\n {\n if ( !PlentyFramework.factories.hasOwnProperty( factory ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.factories[factory], 3 );\n }\n }\n\n for ( var service in components.services )\n {\n if ( !PlentyFramework.prototype.hasOwnProperty( service ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.services[service], 2 );\n }\n }\n\n for ( var directive in components.directives )\n {\n if ( !PlentyFramework.directives.hasOwnProperty( directive ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.directives[directive], 1 );\n }\n }\n\n var scripts = document.getElementsByTagName( 'SCRIPT' );\n for( var i = scripts.length - 1; i >= 0; i-- ) {\n var path = scripts[i].src.match( /(.*)\\/(.*)\\.js(\\?\\S*)?$/ );\n if( !!path ) {\n PlentyFramework.scriptPath = path[1];\n break;\n }\n }\n\n };\n\n // Level: 1 = directive, 2 = service, 3 = factory\n function compileComponent( component, componentLevel, dependencyStack )\n {\n dependencyStack = dependencyStack || [];\n\n // resolve dependencies\n var compiledDependencies = [];\n for ( var i = 0; i < component.dependencies.length; i++ )\n {\n var dependency = component.dependencies[i];\n if ( $.inArray( dependency, dependencyStack ) < 0 )\n {\n // add dependency to stack to avoid cyclic injection\n dependencyStack.push( dependency );\n\n if ( components.factories.hasOwnProperty( dependency ) )\n {\n // required dependency is a factory\n if ( !PlentyFramework.factories.hasOwnProperty( dependency ) )\n {\n // factory is not compiled yet\n compileComponent( components.factories[dependency], 3, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.factories[dependency] );\n continue;\n }\n\n if ( componentLevel <= 2 && components.services.hasOwnProperty( dependency ) )\n {\n // required dependency is a service\n if ( !PlentyFramework.prototype.hasOwnProperty( dependency ) )\n {\n // service is not compiled yet\n compileComponent( components.services[dependency], 2, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.prototype[dependency] );\n continue;\n }\n\n if ( componentLevel <= 1 && components.directives.hasOwnProperty( dependency ) )\n {\n // required dependency is a directive\n if ( !PlentyFramework.directives.hasOwnProperty( dependency ) )\n {\n // directive is not compiled yet\n compileComponent( components.directives[dependency], 1, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.directives[dependency] );\n continue;\n }\n\n console.error( 'Cannot inject dependency \"' + dependency + '\": Object not found.' );\n }\n else\n {\n console.error( 'Cyclic dependency injection: ' + dependencyStack.join( ' -> ' ) + ' -> ' + dependency );\n }\n }\n\n // compile component\n if ( componentLevel == 3 )\n {\n PlentyFramework.factories[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 2 )\n {\n PlentyFramework.prototype[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 1 )\n {\n PlentyFramework.directives[component.name] = component.setup.apply( null, compiledDependencies );\n }\n }\n\n}( jQuery ));\n\n\n\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.directive( 'Authentication', function( AuthenticationService )\n {\n return {\n login: login\n };\n\n function login( elem )\n {\n pm.getRecentEvent().preventDefault();\n AuthenticationService.customerLogin( $( elem ) );\n }\n }, [\"AuthenticationService\"] );\n\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Basket', function( BasketService )\n {\n\n return {\n addBasketItem : addBasketItem,\n changeItemQuantity: changeItemQuantity,\n setItemQuantity : setItemQuantity\n };\n\n function addBasketItem( elem )\n {\n pm.getRecentEvent().preventDefault();\n //init\n var basketItemsList = {};\n var $elem = $( elem );\n var parentForm = $elem.parents( 'form' );\n\n basketItemsList.BasketItemItemID = parentForm.find( '[name=\"ArticleID\"]' ).val();\n basketItemsList.BasketItemPriceID = parentForm.find( '[name=\"SYS_P_ID\"]' ).val();\n basketItemsList.BasketItemQuantity = parentForm.find( '[name=\"ArticleQuantity\"]' ).val();\n basketItemsList.BasketItemBranchID = parentForm.find( '[name=\"source_category\"]' ).val();\n\n //attributes\n var attributeInputsList = parentForm.find( '[name^=\"ArticleAttribute\"]' );\n var attributesList = [];\n\n $.each( attributeInputsList, function( idx, elem )\n {\n var match = elem.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( elem ).val()\n } );\n }\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItemsList.BasketItemAttributesList = attributesList;\n }\n\n //add basketItem and refresh previewLists\n BasketService.addItem( [basketItemsList] );\n\n }\n\n function changeItemQuantity( elem, increment )\n {\n var $elem = $( elem );\n var $quantityInput = $elem.parent().find( 'input' );\n var maxLength = parseInt( $quantityInput.attr( 'maxlength' ) ) || 5;\n var value = parseInt( $quantityInput.val() ) + increment;\n\n var isBasketView = $elem.parents( '[data-basket-item-id]' ).length > 0;\n\n if ( isBasketView )\n {\n if ( (value + '').length <= maxLength && value >= 0 )\n {\n $quantityInput.val( value );\n }\n\n var timeout = $elem.data( 'timeout' );\n\n if ( !!timeout )\n {\n window.clearTimeout( timeout );\n }\n\n timeout = window.setTimeout( function()\n {\n $quantityInput.trigger( 'change' );\n }, 1000 );\n\n $elem.data( 'timeout', timeout );\n }\n else\n {\n if ( (value + '').length <= maxLength && value >= 1 )\n {\n $quantityInput.val( value );\n }\n }\n }\n\n function setItemQuantity( basketItemID, input )\n {\n BasketService.setItemQuantity(\n basketItemID,\n parseInt( $( input ).val() )\n ).fail( function()\n {\n // reset input's value on cancel\n var basketItem = BasketService.getItem( basketItemID );\n $( input ).val( basketItem.BasketItemQuantity );\n } );\n }\n\n }, ['BasketService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Checkout', function( CheckoutService )\n {\n\n return {\n setMethodOfPayment: setMethodOfPayment,\n confirmAtrigaPaymax: confirmAtrigaPaymax\n };\n\n function setMethodOfPayment( paymentID )\n {\n CheckoutService.setMethodOfPayment( paymentID );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxConfirmed )\n {\n CheckoutService.confirmAtrigaPaymax( atrigaPaymaxConfirmed );\n }\n }, ['CheckoutService'] );\n})( jQuery, PlentyFramework );\n/**\n * Mobile dropdowns\n * Toggles dropdowns using css class 'open' instead of pseudo class :hover\n * Usage:\n *
  • \n * ...\n *
  • \n *\n * possible values for CONDITION\n * \"touch\" : use 'open'-class if device is touch-device AND media size is 'md' or 'lg'\n * \"toggle-xs-sm-or-touch\" : use 'open'-class if device is \"touch\" (as above) OR media size is 'xs' or 'sm'\n *\n */\n(function( $, pm )\n{\n pm.directive( 'MobileDropdown', function( MediaSize )\n {\n // store all dropdown elements\n var dropdownElements = [];\n\n // store dropdown elements which should be closed by clicking outside the element itself\n var closableDropdownElements = [];\n\n return {\n initDropdowns: initDropdowns,\n openDropdown : openDropdown,\n slideDropdown: slideDropdown\n };\n\n function initDropdowns()\n {\n $( window ).on( 'orientationchange sizeChange', function()\n {\n resetDropdowns( dropdownElements );\n resetDropdowns( closableDropdownElements );\n } );\n }\n\n function resetDropdowns( dropdownList, event )\n {\n var $current;\n for ( var i = 0; i < dropdownList.length; i++ )\n {\n $current = $( dropdownList[i] );\n if ( !!event )\n {\n if ( $current.find( $( event.target ) ).length === 0\n && !$( \"#LiveSearchParam\" ).is( \":focus\" )\n && !$( \"#checkout-login-email\" ).is( \":focus\" )\n && !$( \"#checkout-login-password\" ).is( \":focus\" ) )\n {\n $current.removeClass( 'open' );\n $( 'html' ).unbind( \"click touchstart\", resetEvent );\n }\n }\n else\n {\n if ( $current.find( $( event.target ) ).length === 0\n && !$( \"#LiveSearchParam\" ).is( \":focus\" )\n && !$( \"#checkout-login-email\" ).is( \":focus\" )\n && !$( \"#checkout-login-password\" ).is( \":focus\" ) )\n {\n $current.removeClass( 'open' );\n $( 'html' ).unbind( \"click touchstart\", resetEvent );\n }\n }\n }\n\n }\n\n function openDropdown( elem, alwaysClickable )\n {\n var $elem = $( elem );\n var $parent = $elem.parent();\n\n // case 1: xs || sm || ( touch && ( md || lg ) ) -> open/close via click on small devices, open/close via\n // css-hover on desktop, open/close via click on touch-desktop (e.g. top navigation)\n\n if ( !!alwaysClickable && ( MediaSize.isInterval( 'xs, sm' ) || ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n // if href\n if ( !$elem.attr( 'href' ) )\n {\n avoidRedirectinStopPropagation( $parent.not( $elem ) );\n }\n }\n else\n {\n if ( !$elem.attr( 'href' ) )\n {\n // hide dropdown\n $parent.removeClass( 'open' );\n }\n }\n }\n\n // case 2: touch && ( md || lg ) -> open via 1st click on touch-desktop, return false (e.g. main navigation)\n\n if ( !alwaysClickable && ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n avoidRedirectinStopPropagation( $parent );\n }\n else\n {\n // redirect to href if dropdown is already open\n // do nothing\n }\n }\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", resetEvent );\n }\n\n function showDropdownHideOthers( elem, parent )\n {\n var $parent = $( parent );\n\n // hide other dropdowns\n resetDropdowns( closableDropdownElements );\n\n // remember opened dropdown\n if ( $.inArray( $parent[0], closableDropdownElements ) < 0 )\n {\n closableDropdownElements.push( $parent[0] );\n }\n\n // show dropdown\n $parent.addClass( 'open' );\n }\n\n function avoidRedirectinStopPropagation( elem )\n {\n var $elem = $( elem );\n\n // avoid redirecting\n pm.getRecentEvent().preventDefault();\n\n // avoid closing popup by clicking itself\n $elem.off( 'click' );\n $elem.on( 'click', function( e )\n {\n e.stopPropagation();\n } );\n }\n\n function slideDropdown( elem )\n {\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n // size interval query is required since function is used on document ready to initial open active\n // navigation (on small devices)\n if ( MediaSize.isInterval( 'xs, sm' ) )\n {\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 400, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n if ( $.inArray( $elemParent[0], dropdownElements ) < 0 )\n {\n dropdownElements.push( $elemParent[0] );\n }\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", resetEvent );\n }\n\n function resetEvent( event )\n {\n resetDropdowns( closableDropdownElements, event );\n }\n\n }, ['MediaSizeService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Redirect', function( MediaSizeService, NavigatorService )\n {\n\n return {\n to : to,\n toCheckoutTab: toCheckoutTab\n };\n\n function to( href )\n {\n if ( MediaSizeService.interval() != 'xs' )\n {\n if ( typeof href === 'string' && href.indexOf('/') == -1 && $( href ).length > 0 )\n {\n window.location.assign( $( href ).attr( 'href' ) );\n }\n else\n {\n window.location.assign( href );\n }\n }\n }\n\n function toCheckoutTab( tabID )\n {\n NavigatorService.goToID( tabID );\n }\n\n }, ['MediaSizeService', 'NavigatorService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Tab', function( MediaSize )\n {\n\n var tabGroups = {};\n\n return {\n showTab : showTab,\n initRemoteLabel: initRemoteLabel,\n initRemoteTab : initRemoteTab,\n showRemoteTab : showRemoteTab\n };\n\n function showTab( tabSelector )\n {\n $( tabSelector ).tab( 'show' );\n }\n\n function initRemoteLabel( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).addLabel( $elem );\n }\n\n function initRemoteTab( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).setContent( $elem );\n }\n\n function showRemoteTab( tabID, groupID, interval )\n {\n if ( MediaSize.isInterval( interval ) )\n {\n pm.getRecentEvent().preventDefault();\n\n if ( !!tabGroups[groupID] && !!tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].showTab( tabID );\n }\n\n }\n }\n\n function TabGroup()\n {\n var tabs = {};\n var activeTab;\n\n return {\n addTab : addTab,\n showTab : showTab,\n getTab : getTab,\n resetTabs: resetTabs\n };\n\n function addTab( tabID )\n {\n tabs[tabID] = new Tab( tabID );\n return tabs[tabID];\n }\n\n function showTab( tabID )\n {\n var zIndex = 0;\n if ( !!activeTab )\n {\n // activeTab is set\n zIndex = parseInt( activeTab.getContent().parent().css( 'zIndex' ) );\n activeTab.hide();\n activeTab.getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n else\n {\n // activeTab not set before\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n var currentZ = parseInt( tabs[tab].getContent().parent().css( 'zIndex' ) );\n if ( zIndex == 0 || currentZ < zIndex )\n {\n zIndex = currentZ;\n }\n tabs[tab].hide();\n }\n }\n\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n }\n\n $( window ).on( 'sizeChange', resetTabs );\n }\n\n activeTab = tabs[tabID];\n activeTab.getContent().parent().css( 'zIndex', zIndex );\n activeTab.show();\n }\n\n function getTab( tabID )\n {\n return tabs[tabID];\n }\n\n function resetTabs()\n {\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].show();\n }\n }\n\n activeTab = null;\n }\n }\n\n function Tab( id )\n {\n var $content;\n var $labels = [];\n var tabID = id;\n\n return {\n addLabel : addLabel,\n setContent: setContent,\n getContent: getContent,\n getID : getID,\n show : show,\n hide : hide\n };\n\n function getID()\n {\n return tabID;\n }\n\n function addLabel( label )\n {\n $labels.push( label );\n return this;\n }\n\n function setContent( content )\n {\n $content = content;\n return this;\n }\n\n function getContent()\n {\n return $content;\n }\n\n function show()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].addClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.show().addClass( 'in' );\n }\n\n }\n\n function hide()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].removeClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.hide().removeClass( 'in' );\n }\n }\n }\n\n }, ['MediaSizeService'] );\n})( jQuery, PlentyFramework );\n/**\n * Add fancy ui modifications - the visual stuff - here.\n * Respond functionality like 'event':UI.myFunctionality(currentElement)\n *\n * Example:\n * \n *\n */\n(function( $, pm )\n{\n pm.directive( 'UI', function( MediaSizeService, SocialShareService, UIFactory )\n {\n // elements to calculate height.\n var equalHeightElementList = [];\n var toTopButtonList = [];\n\n return {\n initUIWindowEvents : initUIWindowEvents,\n showWaitscreen : showWaitscreen,\n hideWaitscreen : hideWaitscreen,\n addContentPageSlider: addContentPageSlider,\n equalHeight : equalHeight,\n initToTop : initToTop,\n initLazyload : initLazyload,\n initSlideToggle : initSlideToggle,\n slideDown : slideDown,\n slideUp : slideUp,\n slideToggle : slideToggle,\n toggleHideShow : toggleHideShow,\n toggleSocialShare : toggleSocialShare,\n toggleClass : toggleClass,\n addClass : addClass,\n removeClass : removeClass\n };\n\n function initUIWindowEvents()\n {\n // resize elements on window size change.\n $( window ).on( 'sizeChange contentChanged', function()\n {\n fireEqualHeight();\n } );\n\n $( window ).on( \"scroll resize\", function()\n {\n if ( toTopButtonList.length > 0 )\n {\n if ( $( document ).scrollTop() > 100 )\n {\n doToArrayElements( toTopButtonList, \"addClass\", \"visible\" );\n }\n else\n {\n doToArrayElements( toTopButtonList, \"removeClass\", \"visible\" );\n }\n }\n } );\n }\n\n /**\n * Display waitscreen on page e.g. for requests.\n * Use with care and don't forget to hide waitscreen, if your calls are done or broke!!\n */\n function showWaitscreen()\n {\n UIFactory.showWaitscreen();\n }\n\n /**\n * Just hide the waitscreen.\n * @param forceClose\n */\n function hideWaitscreen( forceClose )\n {\n UIFactory.hideWaitscreen( forceClose );\n }\n\n /**\n * Adds content page slider (owlCarousel)\n *\n * usage:\n *
    \n *
    \n * ...\n *
    \n *
    \n * ...\n *
    \n * ...\n *
    \n *\n * Legacy directive selector: data-plenty=\"contentpageSlider\"\n *\n * @param elem\n */\n function addContentPageSlider( elem )\n {\n $( elem ).owlCarousel( {\n navigation : true,\n navigationText : false,\n slideSpeed : 1000,\n paginationSpeed: 1000,\n singleItem : true,\n autoPlay : 6000,\n stopOnHover : true,\n afterMove : function( current )\n {\n $( current ).find( '[data-plenty-rel=\"lazyload\"]' ).trigger( 'appear' );\n }\n } );\n }\n\n /**\n * Equal Box height\n * Calculates equal box height for chosen elements.\n *\n * Legacy directive selector: data-plenty-equal\n *\n * @param elem\n * @param elementExists - default false\n */\n function equalHeight( elem, mediaSizes, elementExists )\n {\n var $elem = $( elem );\n var maxHeight = 0;\n var $equalTarget = {};\n var $equalTargetList = $elem.find( '[data-plenty-rel=\"equal-target\"]' ).length > 0 ? $elem.find( '[data-plenty-rel=\"equal-target\"]' ) : $elem.children();\n\n // if element wasn't pushed before.\n if ( elementExists !== true )\n {\n equalHeightElementList.push( elem );\n }\n\n for ( var i = $equalTargetList.length; i >= 0; i-- )\n {\n $equalTarget = $( $equalTargetList[i] );\n $equalTarget.css( 'height', '' );\n\n if ( $equalTarget.outerHeight( true ) > maxHeight )\n {\n maxHeight = $equalTarget.outerHeight( true );\n }\n }\n\n if ( !mediaSizes || MediaSizeService.isInterval( mediaSizes ) )\n {\n $equalTargetList.height( maxHeight );\n }\n }\n\n /**\n * Scroll page to top.\n * Just add without events.\n *\n * Legacy directive selector: data-plenty=\"toTop\"\n *\n * @param elem\n */\n function initToTop( elem )\n {\n var $elem = $( elem );\n\n $elem.click( function()\n {\n $( 'html, body' ).animate( {\n scrollTop: 0\n }, 400 );\n return false;\n } );\n\n if ( !!$.inArray( $elem, toTopButtonList ) )\n {\n toTopButtonList.push( $elem );\n }\n }\n\n /**\n * lazy load on ready.\n *\n * Legacy directive selector: img[data-plenty-lazyload]\n *\n * @param elem\n */\n function initLazyload( elem, effect )\n {\n var $elem = $( elem );\n\n $elem.lazyload( {\n effect: effect\n } );\n if ( $elem.is( 'img' ) )\n {\n $elem.on( 'loaded', function()\n {\n $elem.css( 'display', 'inline-block' );\n } );\n }\n }\n\n /**\n * Toggle show and hide animation.\n *\n * Legacy directive selector: data-plenty=\"openCloseToggle\"\n *\n * @param elem\n */\n function toggleHideShow( elem )\n {\n\n console.log( elem );\n\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 200, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n /**\n * Toggle target content on click.\n * Bind to checked-/ unchecked-property of radio buttons\n *\n * Legacy directive selector: data-plenty-slidetoggle\n *\n * @param elem\n */\n function initSlideToggle( elem, checked )\n {\n var $elem = $( elem );\n var $targetElement = $( $elem.attr( 'data-plenty-rel' ) );\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n // is radio button\n var $radioGroupList = $( 'input[type=\"radio\"][name=\"' + ( $elem.attr( 'name' ) ) + '\"]' );\n var visibleOnChecked = !checked || checked == 'checked';\n\n $radioGroupList.change( function()\n {\n var $self = $( this );\n $targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n if ( $self.is( ':checked' ) && $self[0] === $elem[0] && visibleOnChecked == true )\n {\n // checked\n $targetElement.slideDown( 400, function()\n {\n fireEqualHeight();\n } );\n }\n else\n {\n // unchecked (since other radio button has been checked)\n $targetElement.slideUp( 400, function()\n {\n fireEqualHeight();\n } );\n }\n } );\n }\n else\n {\n // is not radio button\n $elem.click( function()\n {\n //$targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n $elem.addClass( 'animating' );\n $targetElement.slideToggle( 400, function()\n {\n $elem.removeClass( 'animating' );\n $elem.toggleClass( 'active' );\n fireEqualHeight();\n } );\n } );\n }\n }\n\n function slideDown( target, duration )\n {\n slideAction( $( target ), duration, 'slideDown' );\n }\n\n function slideUp( target, duration )\n {\n slideAction( $( target ), duration, 'slideUp' );\n }\n\n function slideToggle( target, duration )\n {\n slideAction( $( target ), duration, 'slideToggle' );\n }\n\n function slideAction( $target, duration, callbackString )\n {\n duration = duration || 400;\n $target.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n $target[callbackString]( duration, function()\n {\n fireEqualHeight();\n } );\n }\n\n /**\n * TODO check comment\n * Social Share Activation\n * Activate and load share-buttons manually by clicking a separate button\n * Usage / data-attributes:\n *
    \n * Will be used to activate the service set in\n * data-plenty-social=\"\"\n * Will be replaced with loaded share button\n *
    \n *\n * possible values for data-plenty-social:\n * \"facebook-like\" : Load Facebooks \"Like\"-Button\n * \"facebook-recommend\" : Load Facebooks \"Recommend\"-Button\n * \"twitter\" : Load Twitter Button\n * \"google-plus\" : Load google \"+1\"-Button\n *\n * Additional Tooltips\n * You can extend the parent element with a (bootstrap) tooltip by adding data-toggle=\"tooltip\" and\n * title=\"TOOLTIP CONTENT\" Tooltip will be destroyed after activating a social service\n * (!) Requires bootstrap.js\n *\n * Legacy directive selector: data-plenty-social\n *\n * @param elem\n */\n function toggleSocialShare( elem, socialShareService )\n {\n var $elem = $( elem );\n var $toggle = $elem.find( '[data-plenty-rel=\"social-switch\"]' );\n\n // append container to put / delete service.html\n $elem.append( '
    ' );\n\n // add \"off\" class to switch, if neither \"off\" or \"on\" is set\n // replaced hasClass() with is() benchmark: http://jsperf.com/hasclasstest\n if ( !$toggle.is( 'off, on' ) )\n {\n $toggle.addClass( 'off' );\n }\n\n // toggle switch\n $toggle.on( 'click', function()\n {\n if ( $toggle.hasClass( 'off' ) )\n {\n // TODO remove bootstrap dependency\n if ( $elem.attr( \"data-toggle\" ) == \"tooltip\" )\n {\n $elem.tooltip( 'destroy' )\n }\n $toggle.removeClass( 'off' ).addClass( 'on' );\n // hide dummy button\n $elem.find( '[data-plenty-rel=\"social-placeholder\"]' ).hide();\n // load HTML defined in 'api'\n $elem.find( '.social-container' ).append( SocialShareService.getSocialService( socialShareService ) );\n }\n // do not disable social medias after activation\n } );\n }\n\n /**\n * Toggle Class\n * toggle style-classes on click\n * Usage / data-attribute:\n *
    \n * target : jQuery selector to toggle the class at.\n * class : class(es) to toggle at target element\n * media : only toggle class on given media sizes (optional)\n *\n * (!) using data-plenty-toggle on -elements will prevent redirecting to href=\"\"\n *\n * Legacy directive selector: data-plenty-toggle\n *\n * @param cssClass\n * @param target\n * @param interval\n */\n function toggleClass( cssClass, target, interval )\n {\n var $target = $( target );\n /* FIXME\n * Callisto 3.1 Design adaption:\n * NavigationCategoriesList\n * Line 8\n * BEFORE:\n *
  • \n * AFTER:\n *
  • \n *\n * Line 10\n * BEFORE:\n * \n * AFTER:\n * \n *\n * */\n if ( $target.parents( \".navbar-main\" ).length > 0 )\n {\n var $elem = $target.children( \"span\" );\n pm.directives[\"MobileDropdown\"].slideDropdown( $elem );\n return true;\n }\n\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $target.toggleClass( cssClass );\n return false;\n }\n }\n\n function addClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).addClass( cssClass );\n return false;\n }\n }\n\n function removeClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).removeClass( cssClass );\n return false;\n }\n }\n\n /*\n ##### PRIVATE FUNCTIONS ######\n */\n\n function fireEqualHeight()\n {\n for ( var i = equalHeightElementList.length - 1; i >= 0; i-- )\n {\n equalHeight( equalHeightElementList[i], '', true );\n }\n }\n\n function doToArrayElements( array, func, params )\n {\n for ( var i = array.length - 1; i >= 0; i-- )\n {\n array[i][func]( params );\n }\n }\n\n }, ['MediaSizeService', 'SocialShareService', 'UIFactory'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Validator', function( ValidationService )\n {\n\n return {\n validate: validate\n };\n\n function validate( form, errorClass )\n {\n return ValidationService.validate( form, errorClass );\n }\n\n }, ['ValidationService'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Handles requests to ReST API. Provides a {{#crossLink \"APIFactory/handleError:method\"}}default\n * error-handling{{/crossLink}}. Request parameters will be parsed to json internally
    \n * Requires:\n *
      \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class APIFactory\n * @static\n */\n pm.factory( 'APIFactory', function( UI, Modal )\n {\n\n var sessionExpirationTimeout = null;\n $( document ).ready( function()\n {\n renewLoginSession();\n } );\n\n return {\n get : _get,\n post : _post,\n put : _put,\n delete: _delete,\n idle : _idle\n };\n\n function renewLoginSession()\n {\n if ( !pm.getGlobal( 'LoginSession' ) )\n {\n return;\n }\n\n if ( !!sessionExpirationTimeout )\n {\n clearTimeout( sessionExpirationTimeout );\n }\n\n sessionExpirationTimeout = setTimeout( function()\n {\n $( window ).trigger( 'login-expired' );\n\n if ( pm.getGlobal( 'PageDesign' ) === \"Checkout\" )\n {\n Modal.prepare()\n .setTitle( pm.translate( 'Your session has expired.' ) )\n .setContent( pm.translate( 'Please log in again to continue shopping.' ) )\n .setLabelDismiss( null )\n .setLabelConfirm( pm.translate( 'OK' ) )\n .onConfirm( function()\n {\n window.location.assign( '/' );\n } )\n .onDismiss( function()\n {\n window.location.assign( '/' );\n } )\n .show();\n }\n\n }, pm.getGlobal( 'LoginSessionExpiration' ) );\n }\n\n /**\n * Is called by default if a request failed.
    \n * Can be prevented by setting the requests last parameter to false.\n *\n * @function handleError\n * @private\n *\n * @param {object} jqXHR
    jQuery\n * deferred Object\n */\n function handleError( jqXHR )\n {\n try\n {\n var responseText = $.parseJSON( jqXHR.responseText );\n UI.printErrors( responseText.error.error_stack );\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n }\n\n /**\n * Sends a GET request to ReST-API\n *\n * @function get\n *\n * @param {string} url The URL to send the request to\n * @param {object} params The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _get( url, params, ignoreErrors, runInBackground, sync )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'GET',\n data : params,\n dataType: 'json',\n async : !sync,\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a POST request to ReST-API\n *\n * @function post\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _post( url, data, ignoreErrors, runInBackground )\n {\n\n var params = {\n type : 'POST',\n dataType: 'json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n };\n\n if ( !!data && data.isFile )\n {\n params.cache = data.cache;\n params.processData = data.processData;\n params.data = data.data;\n params.contentType = false;\n }\n else\n {\n params.data = JSON.stringify( data );\n params.contentType = 'application/json';\n }\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url, params\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n }\n\n /**\n * Sends a PUT request to ReST-API\n *\n * @function put\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _put( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'PUT',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a DELETE request to ReST-API\n *\n * @function delete\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @returns {object} jQuery\n * deferred Object\n */\n function _delete( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'DELETE',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Get a idle request doing nothing for chaining methods\n * @returns {object} jQuery\n * deferred Object\n */\n function _idle()\n {\n return $.Deferred().resolve();\n }\n\n }, ['UIFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Provide methods for receiving layout containers, layout parameters\n * or category content from API
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    \n * @class CMSFactory\n * @static\n */\n pm.factory( 'CMSFactory', function( API )\n {\n\n return {\n getContainer : getContainer,\n getParams : getParams,\n getCategoryContent: getCategoryContent\n };\n\n /**\n * Prepare the request to receive HTML-Content from CMS\n * @function getContainer\n * @param {string} containerName The Layoutcontainer to receive.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the location in\n * the CMS\n * (e.g. 'Checkout')\n * @example\n * CMSFactory.getContainer( 'CheckoutTotals' ).from( 'Checkout' )\n * .done(function( response ) {\n * // container content\n * var html = response.data[0]\n * });\n */\n function getContainer( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/container_' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n\n }\n\n /**\n * Prepare the request to receive Layout parameters for a template\n * @function getParams\n * @param {string} containerName The Layoutcontainer to receive the parameteres of.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the\n * location in the CMS\n * (e.g. 'ItemView')\n * @example\n * CMSFactory.getParams( 'BasketItemsList' ).from( 'ItemView' )\n * .done(function( response ) {\n * // BasketItems\n * var items = response.data;\n * });\n */\n function getParams( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n }\n\n /**\n * Get the content of a category specified by its ID\n * @function getCategoryContent\n * @param {number} categoryID The ID of the category to get the content from\n * @returns {object} jQuery deferred\n * Object\n */\n function getCategoryContent( categoryID )\n {\n return API.get( '/rest/categoryview/categorycontentbody/?categoryID=' + categoryID );\n }\n\n }, ['APIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Holds checkout data for global access and provides methods\n * for reloading content dynamically-
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutFactory\n * @static\n */\n pm.factory( 'CheckoutFactory', function( API, CMS, UI )\n {\n\n // data received from ReST API\n var checkoutData;\n\n // instance wrapped checkout object for global access\n var checkout;\n\n return {\n getCheckout : getCheckout,\n setCheckout : setCheckout,\n loadCheckout : loadCheckout,\n reloadContainer : reloadContainer,\n reloadCatContent : reloadCatContent,\n reloadItemContainer: reloadItemContainer\n };\n\n function Checkout()\n {\n return checkoutData;\n }\n\n /**\n * Returns instance of wrapped checkout object\n * @function getCheckout\n * @returns {Checkout} Instance of checkout object\n */\n function getCheckout( copy )\n {\n if ( !checkout || !checkoutData )\n {\n loadCheckout( true );\n }\n\n if ( !!copy )\n {\n return $.extend( true, {}, checkoutData );\n }\n return checkout;\n }\n\n /**\n * Receive global checkout data from ReST-API\n * @function loadCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function loadCheckout( sync )\n {\n\n return API.get( '/rest/checkout/', null, false, false, sync )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n }\n\n /**\n * Update checkout data on server\n * @function setCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function setCheckout()\n {\n\n return API.put( '/rest/checkout', checkout )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-checkout-template=\"...\"\n * @function reloadContainer\n * @param {string} container Name of the template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadContainer( container )\n {\n\n return CMS.getContainer( \"checkout\" + container ).from( 'checkout' )\n .done( function( response )\n {\n $( '[data-plenty-checkout-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n } );\n } );\n }\n\n /**\n * Get category content from server and replace received HTML\n * in containers marked with data-plenty-checkout-catcontent=\"...\"\n * @function reloadCatContent\n * @param {number} catId ID of the category to load content (description 1) from server\n * @return {object} jQuery deferred\n * Object\n * @deprecated\n */\n function reloadCatContent( catId )\n {\n\n return CMS.getCategoryContent( catId )\n .done( function( response )\n {\n $( '[data-plenty-checkout-catcontent=\"' + catId + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-itemview-template=\"...\"\n * @function reloadItemContainer\n * @param {string} container Name of the (item view) template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadItemContainer( container )\n {\n\n return CMS.getContainer( 'itemview' + container ).from( 'itemview' )\n .done( function( response )\n {\n $( '[data-plenty-itemview-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n }, ['APIFactory', 'CMSFactory', 'UIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Provides methods for creating and displaying modal popups.\n * @class ModalFactory\n * @static\n */\n pm.factory( 'ModalFactory', function()\n {\n\n return {\n prepare: prepare,\n isModal: isModal\n };\n\n /**\n * Detect if given html contains a valid modal\n * @function isModal\n * @param {string} html\n * @returns {boolean}\n */\n function isModal( html )\n {\n return PlentyFramework.partials.Modal.isModal( html );\n }\n\n /**\n * Create a new Instance of {{#crossLink \"ModalFactory.Modal\"}}Modal{{/crossLink}}\n * @function prepare\n * @returns {Modal}\n */\n function prepare( selector )\n {\n return new Modal( selector );\n }\n\n /**\n * Holds configuration of a modal and provides methods for displaying and hiding the modal\n * @class Modal\n * @for ModalFactory\n * @returns {Modal}\n * @constructor\n */\n function Modal( selector )\n {\n\n var modal = this;\n modal.selector = selector;\n\n /**\n * The title of the modal\n * @attribute title\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.title = '';\n\n modal.cssClass = '';\n\n /**\n * The content of the modal\n * @attribute content\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.content = '';\n\n /**\n * The content of the dismiss-button\n * @attribute labelDismiss\n * @type {string}\n * @private\n * @default \"Abbrechen\"\n */\n modal.labelDismiss = pm.translate( \"Cancel\" );\n\n /**\n * the label of the confirmation button\n * @attribute labelConfirm\n * @type {string}\n * @private\n * @default \"Bestätigen\"\n */\n modal.labelConfirm = pm.translate( \"Confirm\" );\n\n /**\n * Callback when modal is confirmed by clicking confirmation button.\n * Modal will not be dismissed if callback returns false.\n * @attribute onConfirm\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onConfirm = function()\n {\n };\n\n /**\n * Callback when modal is dismissed by closing the modal\n * @attribute onDismiss\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onDismiss = function()\n {\n };\n\n /**\n * jQuery selector of the container element to display the modal in.\n * @attribute container\n * @type {string}\n * @private\n * @default \"body\"\n */\n modal.container = 'body';\n\n /**\n * Timeout to close the modal automatically. Set <0 to disable.\n * @attribute timeout\n * @type {number}\n * @private\n * @default -1\n */\n modal.timeout = -1;\n\n modal.hide = hide;\n modal.startTimeout = startTimeout;\n modal.stopTimeout = stopTimeout;\n modal.pauseTimeout = pauseTimeout;\n modal.continueTimeout = continueTimeout;\n\n var bsModal;\n var timeout, interval;\n var timeRemaining, timeStart;\n var paused = false;\n\n return {\n setTitle : setTitle,\n setClass : setClass,\n setContent : setContent,\n setContainer : setContainer,\n setLabelConfirm: setLabelConfirm,\n setLabelDismiss: setLabelDismiss,\n onConfirm : onConfirm,\n onDismiss : onDismiss,\n setTimeout : setTimeout,\n show : show,\n hide : hide\n };\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/title:attribute}}title{{/crossLink}} of the modal\n * @function setTitle\n * @param {string} title The title\n * @returns {Modal} Modal object for chaining methods\n */\n function setTitle( title )\n {\n modal.title = title;\n return this;\n }\n\n function setClass( cssClass )\n {\n modal.cssClass = cssClass;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/content:attribute}}content{{/crossLink}} of the modal\n * @function setContent\n * @param {string} content The content\n * @returns {Modal} Modal object for chaining methods\n */\n function setContent( content )\n {\n modal.content = content;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelConfirm:attribute}}label of the confirmation\n * button{{/crossLink}} of the modal\n * @function setLabelConfirm\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelConfirm( label )\n {\n modal.labelConfirm = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelDismiss:attribute}}label if the dismiss\n * button{{/crossLink}} of the modal\n * @function setLabelDismiss\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelDismiss( label )\n {\n modal.labelDismiss = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onConfirm:attribute}}confirmation callback{{/crossLink}} of the\n * modal\n * @function onConfirm\n * @param {function} callback The callback if modal is confirmed\n * @returns {Modal} Modal object for chaining methods\n */\n function onConfirm( callback )\n {\n modal.onConfirm = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onDismiss:attribute}}dismiss callback{{/crossLink}} of the modal\n * @function onDismiss\n * @param {function} callback The callback if modal is dismissed\n * @returns {Modal} Modal object for chaining methods\n */\n function onDismiss( callback )\n {\n modal.onDismiss = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/container:attribute}}container{{/crossLink}} of the modal\n * @function setContainer\n * @param {string} container The jQuery selector of the container to display the modal in\n * @returns {Modal} Modal object for chaining methods\n */\n function setContainer( container )\n {\n modal.container = container;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/timeout:attribute}}timeout{{/crossLink}} of the modal\n * @function setTimeout\n * @param {number} timeout The timeout to close the modal automatically. Set <0 to disable\n * @returns {Modal} Modal object for chaining methods\n */\n function setTimeout( timeout )\n {\n modal.timeout = timeout;\n return this;\n }\n\n /**\n * Inject modal data in default template if not template is given\n * and display the modal inside the configured container.
    \n * Start timer to hide the modal automatically if timeout is set.\n * @function show\n */\n function show()\n {\n if( !!modal.selector )\n {\n bsModal = $( modal.selector );\n }\n else\n {\n if ( isModal( modal.content ) )\n {\n bsModal = PlentyFramework.partials.Modal.getModal( modal.content );\n }\n else\n {\n bsModal = $( PlentyFramework.compileTemplate( 'modal/modal.html', modal ) );\n }\n\n $( modal.container ).append( bsModal );\n\n // append additional scripts executable\n var scripts = $( modal.content ).filter( 'script' );\n if ( scripts.length > 0 )\n {\n scripts.each( function( i, script )\n {\n var element = document.createElement( 'script' );\n element.type = 'text/javascript';\n element.innerHTML = $( script ).text();\n $( modal.container ).append( element );\n } );\n }\n }\n\n // bind callback functions\n PlentyFramework.partials.Modal.init( bsModal, modal );\n bsModal.find( '[data-plenty-modal=\"confirm\"]' ).click( function()\n {\n var close = modal.onConfirm();\n\n if ( typeof close == \"undefined\" )\n {\n close = true;\n }\n\n if ( close )\n {\n hide( true );\n }\n } );\n\n PlentyFramework.partials.Modal.show( bsModal );\n\n if ( modal.timeout > 0 )\n {\n startTimeout();\n }\n\n }\n\n /**\n * Hide the modal.\n * @function hide\n * @param {boolean} confirmed Flag indicating of modal is closed by confirmation button or dismissed\n */\n function hide( confirmed )\n {\n PlentyFramework.partials.Modal.hide( bsModal );\n\n if ( !confirmed )\n {\n modal.onDismiss();\n }\n }\n\n /**\n * Start the configured timeout initially\n * @function startTimeout\n * @private\n */\n function startTimeout()\n {\n timeRemaining = modal.timeout;\n timeStart = (new Date()).getTime();\n\n timeout = window.setTimeout( function()\n {\n window.clearInterval( interval );\n hide();\n }, modal.timeout );\n\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( timeRemaining / 1000 );\n interval = window.setInterval( function()\n {\n if ( !paused )\n {\n var secondsRemaining = timeRemaining - (new Date()).getTime() + timeStart;\n secondsRemaining = Math.round( secondsRemaining / 1000 );\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( secondsRemaining );\n }\n }, 1000 )\n }\n\n /**\n * Pause the timeout (e.g. on hover)\n * @function pauseTimeout\n * @private\n */\n function pauseTimeout()\n {\n paused = true;\n timeRemaining -= (new Date()).getTime() - timeStart;\n window.clearTimeout( timeout );\n }\n\n /**\n * Continue paused timeout\n * @function continueTimeout\n * @private\n */\n function continueTimeout()\n {\n paused = false;\n timeStart = (new Date()).getTime();\n timeout = window.setTimeout( function()\n {\n hide();\n window.clearInterval( interval );\n }, timeRemaining );\n }\n\n /**\n * Stop timeout. Stopped timeouts cannot be continued.\n * @function stopTimeout\n * @private\n */\n function stopTimeout()\n {\n window.clearTimeout( timeout );\n window.clearInterval( interval );\n }\n\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Displaying error messages and handling wait screen\n * @class UIFactory\n * @static\n */\n pm.factory( 'UIFactory', function()\n {\n /**\n * Increased/ decreased when showing/ hiding wait screen to avoid stacking\n * multiple instances of overlays.\n * @attribute waitScreenCount\n * @private\n * @type {number}\n * @default 0\n */\n var waitScreenCount = 0;\n var waitScreen;\n var errorPopup = null;\n\n return {\n throwError : throwError,\n printErrors : printErrors,\n showWaitScreen: showWaitScreen,\n hideWaitScreen: hideWaitScreen\n };\n\n /**\n * Display a single error message.\n * @function throwError\n * @param {number} code A code identifying this error\n * @param {string} msg The error message to display\n */\n function throwError( code, msg )\n {\n printErrors( [{code: code, message: msg}] );\n }\n\n /**\n * Wrap error messages in error popup, if popup doesn't already contain this error\n * If popup is already visible, append new errors to popup's inner HTML\n * otherwise create new popup\n * @function printErrors\n * @param {Array} errorMessages A list of errors to display\n */\n function printErrors( errorMessages )\n {\n\n // create error-popup if not exist\n if ( !errorPopup || $( 'body' ).has( errorPopup ).length <= 0 )\n {\n errorPopup = $( pm.compileTemplate( 'error/errorPopup.html' ) );\n $( 'body' ).append( errorPopup );\n pm.partials.Error.init( errorPopup );\n }\n\n $.each( errorMessages, function( key, error )\n {\n // add additional error, if not exist.\n pm.partials.Error.addError( errorPopup, $( pm.compileTemplate( 'error/errorMessage.html', error ) ) );\n } );\n\n pm.partials.Error.show( errorPopup );\n\n hideWaitScreen( true );\n }\n\n /**\n * Show wait screen if not visible and increase\n * {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * @function showWaitScreen\n */\n function showWaitScreen()\n {\n waitScreenCount = waitScreenCount || 0;\n\n // create wait-overlay if not exist\n if ( !waitScreen || $( 'body' ).has( waitScreen ).length <= 0 )\n {\n waitScreen = $( pm.compileTemplate( 'waitscreen/waitscreen.html' ) );\n $( 'body' ).append( waitScreen );\n }\n\n pm.partials.WaitScreen.show( waitScreen );\n\n // increase instance counter to avoid showing multiple overlays\n waitScreenCount++;\n return waitScreenCount;\n }\n\n /**\n * Decrease {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * and hide wait screen if waitScreenCount is 0\n * @function hideWaitScreen\n * @param {boolean} forceClose set true to hide wait screen independent from the value of waitScreenCount.\n */\n function hideWaitScreen( forceClose )\n {\n\n // decrease overlay count\n waitScreenCount--;\n\n // hide if all instances of overlays has been closed\n // or if closing is forced by user\n if ( waitScreenCount <= 0 || !!forceClose )\n {\n waitScreenCount = 0;\n pm.partials.WaitScreen.hide( waitScreen );\n }\n return waitScreenCount;\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Factories provide static functions and can be injected into\n * {{#crossLinkModule \"Services\"}}services{{/crossLinkModule}}.
    \n * Factories also can inject other factories. Compared to services,\n * factories are not visible in instances of {{#crossLinkModule \"PlentyFramework\"}}PlentyFramework{{/crossLinkModule}}.\n *\n * @module Factories\n * @main Factories\n */\nObject.equals = function( a, b )\n{\n if ( a === b )\n {\n return true;\n }\n if ( !(a instanceof Object) || !(b instanceof Object) )\n {\n return false;\n }\n if ( a.constructor !== b.constructor )\n {\n return false;\n }\n\n for ( var key in a )\n {\n if ( !a.hasOwnProperty( key ) )\n {\n continue;\n }\n if ( !b.hasOwnProperty( key ) )\n {\n return false;\n }\n if ( a[key] === b[key] )\n {\n continue;\n }\n if ( typeof( a[key] ) !== \"object\" )\n {\n return false;\n }\n if ( !Object.equals( a[key], b[key] ) )\n {\n return false;\n }\n }\n\n for ( var key in b )\n {\n if ( b.hasOwnProperty( key ) && !a.hasOwnProperty( key ) )\n {\n return false;\n }\n }\n\n return true;\n\n};\nPlentyFramework.cssClasses = {\n\n active: \"active\"\n\n};\n(function( $, pm )\n{\n\n pm.partials.Error = {\n\n /**\n * Will be called, after the error popup was created and injected in DOM.\n * @param {HTMLElement} popup The injected element of the popup\n */\n init: function( popup )\n {\n $( popup ).find( '.close' ).click( function()\n {\n pm.partials.Error.hideAll();\n } );\n },\n\n /**\n * Will be called for each thrown error. Has to be injected in DOM manually.\n * @param {HTMLElement} popup The error popup element\n * @param {HTMLElement} error The error message element\n */\n addError: function( popup, error )\n {\n var errorCode = $( error ).attr( 'data-plenty-error-code' );\n\n if ( $( popup ).find( '[data-plenty-error-code=\"' + errorCode + '\"]' ).length <= 0 )\n {\n $( popup ).find( '.plentyErrorBoxInner' ).append( error );\n }\n },\n\n /**\n * Will be called, after initialization and injection of all errors\n * @param {HTMLElement} popup The error popup element\n */\n show: function( popup )\n {\n $( popup ).show();\n },\n\n hideAll: function() {\n $( '#CheckoutErrorPane' ).hide();\n $( '#CheckoutErrorPane' ).find( '.plentyErrorBoxInner' ).html( '' );\n }\n\n }\n\n})( jQuery, PlentyFramework );\n(function( $, pm )\n{\n\n pm.partials.Modal = {\n\n /**\n * Will be called after a new modal was created and injected into DOM\n * @param {HTMLElement} element The injected modal element\n * @param {Modal} modal The instance of the current modal\n */\n init: function( element, modal )\n {\n element.on( 'hidden.bs.modal', function()\n {\n modal.hide();\n if( !modal.selector )\n {\n //Do not remove static modals\n element.remove();\n }\n } );\n\n if ( modal.timeout > 0 )\n {\n element.on( 'hide.bs.modal', modal.stopTimeout );\n element.find( '.modal-content' ).hover( function()\n {\n modal.pauseTimeout();\n }, function()\n {\n if ( element.is( '.in' ) )\n {\n modal.continueTimeout();\n }\n } );\n }\n },\n\n /**\n * Will be called if a Modal requests to show.\n * @param {HTMLElement} element The injected modal element\n */\n show: function( element )\n {\n element.modal( 'show' );\n },\n\n /**\n * Will be called if a Modal requests to hide.\n * @param {HTMLElement} element The injected modal element\n */\n hide: function( element )\n {\n element.modal( 'hide' );\n },\n\n /**\n * Detect if a given HTML string contains a modal\n * @param {HTMLElement} html the element to search a modal in.\n * @returns {boolean} true if a modal was found\n */\n isModal: function( html )\n {\n return $( html ).filter( '.modal' ).length + $( html ).find( '.modal' ).length > 0;\n },\n\n /**\n * Filter a modal from a given HTML string\n * @param {HTMLElement} html the element to get a modal from.\n * @returns {HTMLElement} the filtered modal element\n */\n getModal: function( html )\n {\n var modal = $( html );\n if ( modal.length > 1 )\n {\n modal = $( html ).filter( '.modal' ) || $( html ).find( '.modal' );\n }\n\n return modal;\n }\n\n };\n\n}( jQuery, PlentyFramework ));\n(function( $ )\n{\n\n $( document ).on( 'initPartials', function( e, root )\n {\n\n $( root ).find( '[data-toggle=\"tooltip\"]' ).tooltip( {\n container: 'body'\n } );\n\n } );\n\n})( jQuery );\n(function( $, pm )\n{\n\n pm.partials.WaitScreen = {\n\n /**\n * Will be called if the wait screen should be shown\n * @param {HTMLElement} element The wait screen element\n */\n show: function( element )\n {\n element.addClass( 'in' );\n },\n\n /**\n * Will be called if the wait screen should be hidden\n * @param {HTMLElement} element The wait screen element\n */\n hide: function( element )\n {\n element.removeClass( 'in' );\n }\n\n };\n\n})( jQuery, PlentyFramework );\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.service( 'AddressDoctorService', function( API )\n {\n return {\n validateAddress: validateAddress\n };\n\n function validateAddress( addressForms )\n {\n var addressIsValid = true;\n addressForms = addressForms || '[data-plenty-address-doctor]';\n $( addressForms ).filter( '[data-plenty-address-doctor]:visible' ).each( function( i, form )\n {\n var addressDoctor = new AddressDoctor( form );\n var requiredFields = $( form ).attr( 'data-plenty-address-doctor' ).replace( /\\s/g, '' ).split( ',' );\n if ( !addressDoctor.isValid( requiredFields ) )\n {\n addressIsValid = false;\n }\n\n } );\n\n return addressIsValid;\n }\n\n function AddressDoctor( form )\n {\n var $form = $( form );\n var $inputs = {\n Street : $form.find( 'input[name=\"Street\"]' ),\n ZIP : $form.find( 'input[name=\"ZIP\"]' ),\n City : $form.find( 'input[name=\"City\"]' ),\n HouseNo: $form.find( 'input[name=\"HouseNo\"]' )\n };\n var $suggestionContainer = {};\n\n var suggestions;\n var requiredFields;\n\n return {\n isValid: isValid\n };\n\n function isValid( fields )\n {\n\n if ( isPackstation() )\n {\n return true;\n }\n\n suggestions = new AddressList( $form.getFormValues() );\n requiredFields = fields;\n\n refreshView();\n\n return suggestions.getAddresses().length == 1;\n }\n\n function refreshView()\n {\n $( '.suggestion-list' ).remove();\n\n var suggestionListVisible = false;\n for ( var i = 0; i < requiredFields.length; i++ )\n {\n if ( !validateInput( requiredFields[i], suggestionListVisible ) )\n {\n $form.trigger( 'validationFailed' );\n suggestionListVisible = true;\n }\n }\n\n if ( suggestions.houseNoAllowed( $inputs.HouseNo.val() ) || suggestions.getAddresses().length == 1 )\n {\n $inputs.HouseNo.removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs.HouseNo.addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n }\n else\n {\n $inputs.HouseNo.removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs.HouseNo.addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n }\n }\n\n function validateInput( key, suggestionListVisible )\n {\n var valueList = suggestions.getList( key );\n\n if ( !!$suggestionContainer[key] )\n {\n $suggestionContainer[key].remove();\n }\n\n if ( !$inputs[key] )\n {\n return true;\n }\n\n if ( valueList.length == 1 )\n {\n $inputs[key].val( valueList[0] );\n\n $inputs[key].removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs[key].addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n return true;\n }\n else\n {\n $inputs[key].removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs[key].addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n\n if ( !suggestionListVisible )\n {\n buildSuggestionList( $inputs[key], valueList );\n }\n $inputs[key].off( 'focus' );\n $inputs[key].focus();\n return false;\n\n }\n }\n\n function positionSuggestionList( $parent, suggestionKey )\n {\n $suggestionContainer[suggestionKey].css( {\n 'width': $parent.outerWidth( true ),\n 'left' : $parent.position().left,\n 'top' : $parent.position().top + $parent.outerHeight( true )\n } );\n }\n\n function buildSuggestionList( $parent, values )\n {\n var suggestionKey = $parent.attr( 'name' );\n\n // render html content\n $suggestionContainer[suggestionKey] = $( pm.compileTemplate( 'addressSuggestions/addressDoctor.html', {values: values} ) );\n\n positionSuggestionList( $parent, suggestionKey );\n\n $( window ).on( 'sizeChange', function()\n {\n positionSuggestionList( $parent, suggestionKey );\n } );\n\n // bind click event to list elements\n $suggestionContainer[suggestionKey].find( '[data-address-value]' ).each( function( i, elem )\n {\n\n var $elem = $( elem );\n var value = $elem.attr( 'data-address-value' );\n\n $elem.click( function()\n {\n // insert clicked value in input\n $parent.val( value );\n\n // filter addresses and show remaining suggestions\n var filterAddress = {};\n filterAddress[$parent.attr( 'name' )] = value;\n suggestions.filter( filterAddress );\n\n // refresh suggestion lists\n refreshView();\n\n } );\n\n } );\n\n // inject html\n $parent.parent().append( $suggestionContainer[suggestionKey] );\n }\n\n function isPackstation()\n {\n return ( $inputs.Street.val().toUpperCase() == \"PACKSTATION\" || $inputs.Street.val().toUpperCase() == \"POSTFILIALE\" );\n }\n\n }\n\n function AddressList( addressInput )\n {\n var addresses = [];\n\n init();\n\n return {\n getAddresses : getAddresses,\n getList : getList,\n filter : filter,\n houseNoAllowed: houseNoAllowed\n };\n\n function init()\n {\n API.get( '/rest/checkout/addresssuggestionresultslist/', {\n suggestionType: \"addressdoctor\",\n street : addressInput.Street,\n ZIP : addressInput.ZIP,\n city : addressInput.City,\n houseNo : addressInput.HouseNo,\n country : addressInput.CountryID\n }, false, false, true ).done( function( response )\n {\n\n var responseLength = response.data.length;\n\n for ( var i = 0; i < responseLength; i++ )\n {\n var currentResponse = response.data[i];\n\n var address = getAddress( currentResponse )\n if ( !address )\n {\n currentResponse.HouseNo = [currentResponse.HouseNo];\n addresses.push( currentResponse );\n }\n else\n {\n address.HouseNo.push( currentResponse.HouseNo );\n }\n\n }\n\n } );\n }\n\n function getAddress( suggestion )\n {\n var addressCount = addresses.length;\n\n for ( var j = 0; j < addressCount; j++ )\n {\n if ( suggestion.Street == addresses[j].Street && addresses.ZIP == addresses[j].ZIP && suggestion.City == addresses[j].City )\n {\n return addresses[j];\n }\n }\n\n return null;\n\n }\n\n function getAddresses()\n {\n return addresses;\n }\n\n function getList( key )\n {\n var results = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( $.inArray( address[key], results ) < 0 )\n {\n results.push( address[key] );\n }\n }\n\n return results;\n }\n\n function filter( filterAddress )\n {\n var filteredAddresses = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( (!!filterAddress.Street && filterAddress.Street == address.Street)\n || (!!filterAddress.ZIP && filterAddress.ZIP == address.ZIP)\n || (!!filterAddress.City && filterAddress.City == address.City) )\n {\n filteredAddresses.push( address );\n }\n }\n\n addresses = filteredAddresses;\n }\n\n function houseNoAllowed( houseNo )\n {\n houseNo = parseInt( houseNo );\n\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n\n for ( var j = 0; j < address.HouseNo.length; j++ )\n {\n var range = address.HouseNo[j].split( '-' );\n if ( ( range.length == 1 && houseNo == range[0] )\n || range.length == 2 && houseNo >= range[0] && houseNo <= range[1] )\n {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for logging in and out and registering new customers.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    \n * @class AuthenticationService\n * @static\n */\n pm.service( 'AuthenticationService', function( API, Checkout, UI )\n {\n\n return {\n resetPassword : resetPassword,\n customerLogin : customerLogin,\n setInvoiceAddress: setInvoiceAddress,\n registerCustomer : registerCustomer\n };\n\n /**\n * Reading E-Mail from form marked with data-plenty-checkout=\"lostPasswordForm\"\n * and sends request to provide a new password to the entered E-Mail-Address.\n *\n * @function resetPasswort\n * @return {object} jQuery deferred\n * Object\n */\n function resetPassword()\n {\n\n var form = $( '[data-plenty-checkout=\"lostPasswordForm\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n var params = {\n Email: values.Email\n };\n\n return API.post( \"/rest/checkout/lostpassword/\", params )\n .done( function( response )\n {\n if ( response.data.IsMailSend == true )\n {\n $( '[data-plenty-checkout=\"lostPasswordTextContainer\"]' ).hide();\n $( '[data-plenty-checkout=\"lostPasswordSuccessMessage\"]' ).show();\n }\n } );\n\n }\n }\n\n /**\n * Try to login in with credentials read from given <form> - element.\n * On success redirect to forms 'action' attribute.\n *\n * @function customerLogin\n * @param {object} form The jQuery-wrapped form-element to read the credentials from\n * @return {object} jQuery deferred\n * Object\n */\n function customerLogin( form )\n {\n if ( form.validateForm() )\n {\n var values = form.getFormValues();\n\n var params = {\n Email : values.loginMail,\n Password: values.loginPassword\n };\n\n UI.showWaitScreen();\n return API.post( \"/rest/checkout/login/\", params )\n .done( function()\n {\n // successful login -> go to form's target referenced by action-attribute\n window.location.assign( form.attr( 'action' ) );\n\n } );\n }\n }\n\n /**\n * Setting the invoice address of a newly registered customer or a guest.\n *\n * @function setInvoiceAddress\n * @param {object} invoiceAddress containing address-data sent to server\n * @return {object} jQuery deferred\n * Object\n */\n function setInvoiceAddress( invoiceAddress )\n {\n\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n Checkout.getCheckout().CustomerInvoiceAddress = response.data;\n } );\n }\n\n /**\n * Prepare address-data to register new customer. Read the address-data from a <form> marked with\n * data-plenty-checkout-form=\"customerRegistration\"
    \n * On success, redirect to forms target referenced by action-attribute\n *\n * @function registerCustomer\n * @return {object} jQuery deferred\n * Object\n */\n function registerCustomer()\n {\n var form = $( '[data-plenty-checkout-form=\"customerRegistration\"]' );\n\n if ( form.validateForm() && pm.getInstance().AddressDoctorService.validateAddress() )\n {\n var values = form.getFormValues();\n values.LoginType = 2;\n\n if ( values.checkout\n && values.checkout.customerInvoiceAddress\n && values.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = values.checkout.customerInvoiceAddress.CustomerProperty;\n values.CustomerPropertiesList = values.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n values.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n return setInvoiceAddress( values )\n .done( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } );\n }\n }\n }, ['APIFactory', 'CheckoutFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for adding, editing or removing basket items and coupon codes
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class BasketService\n * @static\n */\n pm.service( 'BasketService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n addItem : addBasketItem,\n removeItem : removeBasketItem,\n getItem : getBasketItem,\n setItemQuantity : setItemQuantity,\n editItemAttributes: editItemAttributes,\n editOrderParams : editOrderParams,\n addCoupon : addCoupon,\n removeCoupon : removeCoupon\n };\n\n /**\n * Add item to basket. Will fail and show a popup if item has order params\n * @function addBasketItem\n * @param {Array} article Array containing the item to add\n * @param {boolean} [isUpdate=false] Indicating if item's OrderParams are updated\n * @return {object} jQuery deferred\n * Object\n */\n function addBasketItem( article )\n {\n\n if ( !!article )\n {\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/',\n {\n itemID : article[0].BasketItemItemID,\n quantity: article[0].BasketItemQuantity\n }, false, true ).done( function( resp )\n {\n // checking for order params!\n if ( resp.data[0].indexOf( \"form-group\" ) > 0 )\n {\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Select order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n addArticle( saveOrderParams( article ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n }\n else\n {\n addArticle( article );\n }\n } );\n }\n }\n\n /**\n * Read OrderParams from <form> marked with data-plenty-checkout-form=\"OrderParamsForm\" and inject\n * read values in 'addBasketList'. Update item by calling addBasketItem() again\n * @function saveOrderParams\n * @private\n * @param {Array} articleWithParams Containing the current item to add. Read OrderParams will be injected\n */\n function saveOrderParams( articleWithParams )\n {\n //TODO use $(\"[data-plenty-checkout-form='OrderParamsForm']\").serializeArray() to get order params\n var orderParamsForm = $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' );\n var $self = {};\n var attrType = \"\";\n var match;\n\n //Groups\n orderParamsForm.find( '[name^=\"ParamGroup\"]' ).each( function()\n {\n match = this.name.match( /^ParamGroup\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], $( this ).val(), $( this ).val() );\n } );\n\n //Values\n orderParamsForm.find( '[name^=\"ParamValue\"]' ).each( function()\n {\n $self = $( this );\n attrType = $self.attr( 'type' );\n\n if ( ((attrType == 'checkbox' && $self.is( ':checked' )) ||\n (attrType == 'radio' && $self.is( ':checked' )) ||\n (attrType != 'radio' && attrType != 'checkbox')) && attrType != 'file' && attrType != 'hidden' )\n {\n\n var match = $self[0].name.match( /^ParamValue\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], $self.val() );\n\n }\n else if ( attrType == 'file' )\n {\n if ( $self[0].files && $self[0].files.length > 0 )\n {\n articleWithParams = orderParamFileUpload( $self, articleWithParams );\n }\n else\n {\n var match = $self[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n var paramValue = $( 'input[type=\"hidden\"][name=\"ParamValue[' + match[1] + '][' + match[2] + ']\"]' ).val();\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], paramValue );\n }\n }\n } );\n\n return articleWithParams;\n }\n\n function addArticle( article )\n {\n API.post( '/rest/checkout/basketitemslist/', article, true )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n // Show confirmation popup\n CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', {ArticleID: article[0].BasketItemItemID} ).from( 'ItemView' )\n .done( function( response )\n {\n var timeout = pm.getGlobal( 'TimeoutItemToBasketOverlay', 5000 );\n var modal = Modal.prepare().setContent( response.data[0] );\n\n if ( timeout > 0 )\n {\n modal.setTimeout( timeout );\n }\n\n modal.show();\n } );\n } );\n } ).fail( function( jqXHR )\n {\n // some other error occured\n UI.printErrors( JSON.parse( jqXHR.responseText ).error.error_stack );\n } );\n }\n\n function updateArticle( article )\n {\n API.put( '/rest/checkout/basketitemslist/', article )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n } );\n } )\n }\n\n function orderParamFileUpload( $input, articleWithParams )\n {\n var key = $input[0].id;\n var orderParamUploadFiles = {};\n var orderParamFileIdStack = [];\n var formData;\n var fileData;\n var params = {\n type : 'POST',\n data : {},\n isFile : true,\n cache : false,\n dataType : 'json',\n processData: false,\n contentType: false\n };\n\n orderParamUploadFiles[key] = $input[0].files;\n\n // if input not pushed before.\n if ( orderParamFileIdStack.indexOf( key ) == -1 )\n {\n orderParamFileIdStack.push( key );\n }\n\n for ( var i = 0, length = orderParamFileIdStack.length; i < length; ++i )\n {\n formData = new FormData();\n fileData = orderParamUploadFiles[orderParamFileIdStack[i]];\n formData.append( \"0\", fileData[0], fileData[0].name );\n\n params.data = formData;\n\n API.post( \"/rest/checkout/orderparamfile/\", params );\n }\n\n var match = $input[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n\n return addOrderParamValue( articleWithParams, match[1], match[2], orderParamUploadFiles[key][0]['name'] );\n }\n\n /**\n * Inject an OrderParam.\n * @function addOrderParamValue\n * @private\n * @param {Array} basketList The target to inject the value in.\n * @param {number} position Position where to inject the value\n * @param {number} paramId The ID of the OrderParam to inject\n * @param {string|number} paramValue the value of the OrderParam to inject\n * @returns {Array} Containing the item and the injected OrderParam\n */\n function addOrderParamValue( basketList, position, paramId, paramValue )\n {\n if ( position > 0 && basketList[position] == undefined )\n {\n basketList[position] = $.extend( true, {}, basketList[0] );\n basketList[position].BasketItemOrderParamsList = [];\n }\n\n if ( basketList[position] != undefined )\n {\n basketList[position].BasketItemQuantity = 1;\n if ( basketList[position].BasketItemOrderParamsList == undefined )\n {\n basketList[position].BasketItemOrderParamsList = [];\n }\n if ( paramValue )\n {\n basketList[position].BasketItemOrderParamsList.push( {\n BasketItemOrderParamID : paramId,\n BasketItemOrderParamValue: paramValue\n } );\n }\n }\n\n return basketList;\n }\n\n function editItemAttributes( BasketItemID )\n {\n var modal = $( '[data-plenty-basket-item=\"' + BasketItemID + '\"]' );\n modal.modal( 'show' );\n modal.find( '[data-plenty-modal=\"confirm\"]' ).on( 'click', function()\n {\n var basketItem = getBasketItem( BasketItemID );\n var attributesList = [];\n\n // check for select or list of images\n modal.find( 'select, .PlentyFormContainer.AttrImage > input[type=\"hidden\"]' ).each( function( i, attributeSelect )\n {\n var match = attributeSelect.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( attributeSelect ).val()\n } );\n }\n\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItem.BasketItemAttributesList = attributesList;\n }\n //update basketItem and refresh previewLists\n updateArticle( [basketItem] );\n\n } );\n }\n\n function editOrderParams( BasketItemID )\n {\n\n var basketItem = getBasketItem( BasketItemID );\n // FIX: unset old order params\n\n basketItem.BasketItemOrderParamsList = [];\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/', {\n itemID : basketItem.BasketItemItemID,\n quantity : basketItem.BasketItemQuantity,\n basketItemID: BasketItemID\n } ).done( function( resp )\n {\n // checking for order params!\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Edit order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n updateArticle( saveOrderParams( [basketItem] ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n } );\n }\n\n function getBasketItem( BasketItemID )\n {\n var basketItems = Checkout.getCheckout().BasketItemsList;\n for ( var i = 0; i < basketItems.length; i++ )\n {\n if ( basketItems[i].BasketItemID == BasketItemID )\n {\n return basketItems[i];\n }\n }\n\n return null;\n }\n\n /**\n * Remove item from basket. Will show a confirmation popup at first.\n * @function removeBasketItem\n * @param {number} BasketItemID The ID of the basket item to remove\n * @param {boolean} [forceDelete=false] Set true to remove the basket item without showing a confirmation popup\n * @return Promise\n */\n function removeBasketItem( BasketItemID, forceDelete )\n {\n\n var deferred = $.Deferred();\n\n // get item name\n var itemName = getBasketItem( BasketItemID ).BasketItemNameMap[1];\n\n // calling the delete request\n function doDelete()\n {\n API.delete( '/rest/checkout/basketitemslist/?basketItemIdsList[0]=' + BasketItemID )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n //$( '[data-basket-item-id=\"' + BasketItemID + '\"]' ).remove();\n\n if ( !Checkout.getCheckout().BasketItemsList || Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n }\n else\n {\n // FALLBACK if design not support selector\n // [data-plenty-checkout-template=\"BasketItemsList\"]\n if ( $( '[data-plenty-checkout-template=\"BasketItemsList\"]' ).length >= 0 )\n {\n API.get( \"/rest/checkout/container_checkoutbasketitemslist/\" ).done( function( response )\n {\n var $oldBasketList = $( '[data-basket-item-id]' ).parents( \"ul\" );\n var $basketListContainer = $oldBasketList.parents( \".panel-body\" );\n $oldBasketList.fadeOut( function()\n {\n $( this ).siblings( \":not('[data-plenty-checkout-template]')\" ).remove();\n $( this ).remove();\n $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn(function() {\n pm.getInstance().bindDirectives( $basketListContainer );\n });\n } );\n } );\n }\n else\n {\n Checkout.reloadContainer( 'BasketItemsList' );\n }\n Checkout.reloadContainer( 'Totals' );\n }\n\n refreshBasketPreview();\n\n deferred.resolve();\n } );\n } );\n }\n\n if ( !forceDelete )\n {\n // show confirmation popup\n Modal.prepare()\n .setTitle( pm.translate( 'Please confirm' ) )\n .setContent( '

    ' + pm.translate( \"Do you really want to remove \\\"{{item}}\\\" from your basket?\", {item: itemName} ) + '

    ' )\n .onDismiss( function()\n {\n //$('[data-basket-item-id=\"' + BasketItemID +\n // '\"]').find('[data-plenty=\"quantityInput\"]').val(originalItemQuantity);\n deferred.reject();\n } )\n .onConfirm( function()\n {\n doDelete();\n } )\n .setLabelConfirm( pm.translate( \"Delete\" ) )\n .show();\n }\n else\n {\n doDelete();\n }\n\n return deferred;\n }\n\n /**\n * Set a new quantity for the given BasketItem. If quantity is set to 0,\n * remove the item.\n * @function setItemQuantity\n * @param {number} BasketItemID The ID of the basket item to change the quantity of\n * @param {number} BasketItemQuantity The new quantity to set or 0 to remove the item\n */\n function setItemQuantity( BasketItemID, BasketItemQuantity )\n {\n // delete item if quantity is 0\n if ( BasketItemQuantity <= 0 )\n {\n return removeBasketItem( BasketItemID );\n }\n\n var deferred = $.Deferred();\n var params = Checkout.getCheckout().BasketItemsList;\n var basketItem;\n var basketItemIndex;\n\n for ( var i = 0; i < params.length; i++ )\n {\n if ( params[i].BasketItemID == BasketItemID )\n {\n basketItemIndex = i;\n basketItem = params[i];\n break;\n\n }\n }\n\n if ( !!basketItem && basketItem.BasketItemQuantity != BasketItemQuantity )\n {\n params[basketItemIndex].BasketItemQuantity = parseInt( BasketItemQuantity );\n\n API.post( \"/rest/checkout/basketitemslist/\", params )\n .done( function()\n {\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n refreshBasketPreview();\n deferred.resolve();\n } );\n } );\n }\n\n return deferred;\n }\n\n /**\n * Reload BasketPreview-Template and update basket totals\n * @function refreshBasketPreview\n * @private\n */\n function refreshBasketPreview()\n {\n\n Checkout.reloadItemContainer( 'BasketPreviewList' )\n .done( function()\n {\n\n $( '[data-plenty-basket-empty]' ).each( function( i, elem )\n {\n var toggleClass = $( elem ).attr( 'data-plenty-basket-empty' );\n if ( Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n $( elem ).addClass( toggleClass );\n }\n else\n {\n $( elem ).removeClass( toggleClass );\n }\n } );\n\n } );\n\n //update quantity\n var itemQuantityTotal = 0;\n $.each( Checkout.getCheckout().BasketItemsList, function( i, basketItem )\n {\n itemQuantityTotal += basketItem.BasketItemQuantity;\n } );\n\n $( '[data-plenty-basket-preview=\"itemQuantityTotal\"]' ).text( itemQuantityTotal );\n $( '[data-plenty-basket-preview=\"totalsItemSum\"]' ).text( Checkout.getCheckout().Totals.TotalsItemSum );\n }\n\n /**\n * Read the coupon code from an <input> element marked with data-plenty-checkout-form=\"couponCode\"\n * and try to add this coupon.\n * @function addCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function addCoupon()\n {\n var params = {\n CouponActiveCouponCode: $( '[data-plenty-checkout-form=\"couponCode\"]' ).val()\n };\n\n return API.post( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n\n updateContainer();\n } );\n } );\n }\n\n /**\n * Remove the currently added coupon\n * @function removeCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function removeCoupon()\n {\n var params = {\n CouponActiveCouponCode: Checkout.getCheckout().Coupon.CouponActiveCouponCode\n };\n\n return API.delete( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n delete Checkout.getCheckout().Coupon;\n\n updateContainer();\n } );\n } );\n }\n\n // update container\n function updateContainer()\n {\n Checkout.reloadContainer( 'Coupon' );\n // reload totals, if we are at basket\n if ( $( '[data-plenty-checkout-template=\"Totals\"]' ).length > 0 )\n {\n Checkout.reloadContainer( 'Totals' );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for checkout process like setting shipping & payment information and placing the order.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutService\n * @static\n */\n pm.service( 'CheckoutService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n init : init,\n setCustomerSignAndInfo: setCustomerSignAndInfo,\n registerGuest : registerGuest,\n setShippingProfile : setShippingProfile,\n saveShippingAddress : saveShippingAddress,\n loadAddressSuggestion : loadAddressSuggestion,\n preparePayment : preparePayment,\n setMethodOfPayment : setMethodOfPayment,\n confirmAtrigaPaymax : confirmAtrigaPaymax,\n editBankDetails : editBankDetails,\n editCreditCard : editCreditCard,\n placeOrder : placeOrder\n };\n\n /**\n * Load checkout data initially on page load\n * @function init\n */\n function init()\n {\n Checkout.loadCheckout( true );\n }\n\n /**\n * Read customer sign and order information text from <form> marked with\n * data-plenty-checkout-form=\"details\" and update checkout.\n * @function setCustomerSignAndInfo\n * @return {object} jQuery deferred\n * Object\n */\n function setCustomerSignAndInfo()\n {\n var form = $( '[data-plenty-checkout-form=\"details\"]' );\n var values = form.getFormValues();\n\n // initialize CustomerSign & InfoText to avoid updating empty values\n if ( !Checkout.getCheckout().CheckoutCustomerSign )\n {\n Checkout.getCheckout().CheckoutCustomerSign = \"\";\n }\n if ( !Checkout.getCheckout().CheckoutOrderInfoText )\n {\n Checkout.getCheckout().CheckoutOrderInfoText = \"\";\n }\n\n if ( ( Checkout.getCheckout().CheckoutCustomerSign !== values.CustomerSign && $( form ).find( '[name=\"CustomerSign\"]' ).length > 0 )\n || ( Checkout.getCheckout().CheckoutOrderInfoText !== values.OrderInfoText && $( form ).find( '[name=\"OrderInfoText\"]' ).length > 0 ) )\n {\n\n Checkout.getCheckout().CheckoutCustomerSign = values.CustomerSign;\n Checkout.getCheckout().CheckoutOrderInfoText = values.OrderInfoText;\n\n return Checkout.setCheckout();\n\n }\n else\n {\n // No changes detected -> Do nothing\n return API.idle();\n }\n }\n\n /**\n * Read address data from <form> marked with data-plenty-checkout-form=\"shippingAddress\".\n * Create new shipping address or update the shipping address ID.\n * @function saveShippingAddress\n * @param {boolean} [validateForm = false] validate form before processing requests\n * @return {object} jQuery deferred\n * Object\n */\n function saveShippingAddress( validateForm )\n {\n var form = $( '[data-plenty-checkout-form=\"shippingAddress\"]' );\n\n if ( !validateForm && !form.validateForm() )\n {\n return false;\n }\n\n if ( !validateForm && !pm.getInstance().AddressDoctorService.validateAddress( form ) )\n {\n return false;\n }\n\n var values = form.getFormValues();\n var shippingAddressID = $( '[name=\"shippingAddressID\"]:checked' ).val();\n\n if ( shippingAddressID < 0 )\n {\n // save separate\n var shippingAddress = values;\n\n if ( !addressesAreEqual( shippingAddress, Checkout.getCheckout().CustomerShippingAddress ) )\n {\n if ( shippingAddress.Street == \"PACKSTATION\" )\n {\n shippingAddress.IsPackstation = 1;\n shippingAddress.PackstationNo = shippingAddress.HouseNo;\n }\n else if ( shippingAddress.Street == \"POSTFILIALE\" )\n {\n shippingAddress.IsPostfiliale = 1;\n shippingAddress.PostfilialNo = shippingAddress.HouseNo;\n }\n\n // new shipping address\n return API.post( \"/rest/checkout/customershippingaddress/\", shippingAddress )\n .done( function( response )\n {\n\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = response.data.ID;\n Checkout.getCheckout().CheckoutShippingCountryID = response.data.CountryID;\n\n updatePaymentAndShippingDependencies();\n } );\n }\n else\n {\n // no changes detected\n return API.idle();\n }\n\n }\n else\n {\n if ( shippingAddressID != Checkout.getCheckout().CheckoutCustomerShippingAddressID )\n {\n // change shipping address id\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = shippingAddressID;\n\n updatePaymentAndShippingDependencies();\n }\n else\n {\n return API.idle();\n }\n }\n }\n\n function updatePaymentAndShippingDependencies()\n {\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n $( '#shippingAdressSelect' ).modal( 'hide' );\n\n // don't hit me. Ugly hack: this is to force quit/remove everything from modal.\n if ( $( \".modal-backdrop\" ) )\n {\n $( \".modal-backdrop\" ).remove();\n }\n } );\n }\n\n /**\n * Prepare address-data to register a guest. Reads the address-data from a <form> marked with\n * data-plenty-checkout-form=\"guestRegistration\"\n * @function registerGuest\n * @return {object} jQuery deferred\n * Object\n */\n function registerGuest()\n {\n var form = $( '[data-plenty-checkout-form=\"guestRegistration\"]' );\n\n var invoiceAddress = form.getFormValues();\n invoiceAddress.LoginType = 1;\n\n // add custom properties if necessary.\n if ( invoiceAddress.checkout\n && invoiceAddress.checkout.customerInvoiceAddress\n && invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty;\n invoiceAddress.CustomerPropertiesList = invoiceAddress.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n invoiceAddress.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n if ( !addressesAreEqual( invoiceAddress, Checkout.getCheckout().CustomerInvoiceAddress ) )\n {\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n saveShippingAddress().done( Checkout.loadCheckout );\n } );\n }\n else\n {\n return saveShippingAddress();\n }\n }\n\n /**\n * Check if values of addresses are equal\n * @function addressesAreEqual\n * @private\n * @param {object} address1\n * @param {object} address2\n * @returns {boolean}\n */\n function addressesAreEqual( address1, address2 )\n {\n for ( var key in address1 )\n {\n if ( address1[key] + '' !== address2[key] + '' && key !== 'EmailRepeat' )\n {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Set the shipping profile used for this order and update checkout. Selected shipping profile will be\n * read from <form> marked with data-plenty-checkout-form=\"shippingProfileSelect\"\n * @function setShippingProfile\n * @return {object} jQuery deferred\n * Object\n */\n function setShippingProfile()\n {\n\n var values = $( '[data-plenty-checkout-form=\"shippingProfileSelect\"]' ).getFormValues();\n\n Checkout.getCheckout().CheckoutShippingProfileID = values.ShippingProfileID;\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n\n }\n\n /**\n * Prepare method of payment to check if external checkout is used or addition content should be displayed\n * @function preparePayment\n * @return {object} jQuery deferred\n * Object\n */\n function preparePayment()\n {\n var paymentID = Checkout.getCheckout().CheckoutMethodOfPaymentID;\n var paymentData = $( 'input[type=\"radio\"][name=\"MethodOfPaymentID\"][value=\"' + paymentID + '\"]' ).parent().getFormValues();\n return API.post( \"/rest/checkout/preparepayment/\", paymentData, true )\n .done( function( response )\n {\n if ( response.data.CheckoutMethodOfPaymentRedirectURL != '' )\n {\n\n document.location.assign( response.data.CheckoutMethodOfPaymentRedirectURL );\n\n }\n else if ( !!response.data.CheckoutMethodOfPaymentAdditionalContent )\n {\n\n var isBankDetails = $( response.data.CheckoutMethodOfPaymentAdditionalContent ).find( '[data-plenty-checkout-form=\"bankDetails\"]' ).length > 0;\n Modal.prepare()\n .setContent( response.data.CheckoutMethodOfPaymentAdditionalContent )\n .onConfirm( function()\n {\n if ( isBankDetails )\n {\n return saveBankDetails();\n }\n else\n {\n return saveCreditCard();\n }\n } )\n .show();\n }\n } )\n .fail( function( jqXHR )\n {\n try\n {\n var response = $.parseJSON( jqXHR.responseText );\n\n var errorStack = [];\n for ( var i = 0; i < response.error.error_stack.length; i++ )\n {\n if ( response.error.error_stack[i].code == 651 )\n {\n // notify atriga validation errors\n Checkout.reloadContainer( 'MethodsOfPaymentList' ).done( function()\n {\n $( document ).trigger( 'plenty.AtrigaValidationFailed' );\n } );\n }\n else\n {\n errorStack.push( response.error.error_stack[i] );\n }\n }\n\n // display remaining errors\n if ( errorStack.length > 0 )\n {\n UI.printErrors( errorStack );\n }\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n } );\n\n }\n\n /**\n * Set the method of payment used for this order.\n * @function setMethodOfPayment\n * @param {number|undefined} paymentID ID of the method of payment to use. Read from <form> marked with\n * data-plenty-checkout-form=\"methodOfPayment\" if unset.\n * @return {object} jQuery deferred\n * Object\n */\n function setMethodOfPayment( paymentID )\n {\n /*\n var methodsOfPaymentList = Checkout.getCheckout().MethodsOfPaymentList;\n var methodOfPayment;\n for( var i = 0; i < methodsOfPaymentList.length; i++ )\n {\n if( methodsOfPaymentList[i].MethodOfPaymentID == paymentID )\n {\n methodOfPayment = methodsOfPaymentList[i];\n break;\n }\n }\n */\n\n if ( !paymentID )\n {\n // FIX for older callisto layouts (< 3.3): get payment id from input field\n paymentID = $( 'input[name=\"MethodOfPaymentID\"]:checked' ).val();\n }\n\n Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID;\n\n if ( !pm.getGlobal( 'Checkout.AtrigaRequireUserConfirmation' ) )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = true;\n }\n\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'ShippingProfilesList' );\n } );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxChecked )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = !!atrigaPaymaxChecked;\n return API.put( '/rest/checkout', {\n CheckoutAtrigapaymaxChecked: !!atrigaPaymaxChecked\n } );\n //return Checkout.setCheckout();\n }\n\n /**\n * Display the popup to enter or edit customers bank details\n * @function editBankDetails\n */\n function editBankDetails()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationBankDetails' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveBankDetails();\n } )\n .show();\n } );\n\n }\n\n /**\n * Read entered bank details from data-plenty-checkout-form=\"bankDetails\" and update checkout.\n * @function saveBankDetails\n * @private\n * @return {boolean} the result of form validation\n */\n function saveBankDetails()\n {\n var form = $( '[data-plenty-checkout-form=\"bankDetails\"]' );\n\n if ( form.validateForm() )\n {\n var values = form.getFormValues().checkout.customerBankDetails;\n\n var bankDetails = {\n CustomerBankName : values.bankName,\n CustomerBLZ : values.blz,\n CustomerAccountNumber: values.accountNo,\n CustomerAccountOwner : values.accountOwner,\n CustomerIBAN : values.iban,\n CustomerBIC : values.bic\n };\n\n API.post( \"/rest/checkout/paymentinformationbankdetails/\", bankDetails )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n setMethodOfPayment( 3 );\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing credit card form\n * @function editCreditCard\n */\n function editCreditCard()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationCreditCard' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveCreditCard();\n } )\n .show();\n } );\n }\n\n /**\n * Read values from <form> marked with data-plenty-checkout-form=\"creditCard\" and update checkout.\n * @function saveCreditCard\n * @private\n * @return {boolean} the result of form validation\n */\n function saveCreditCard()\n {\n var form = $( '[data-plenty-checkout-form=\"creditCard\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues().checkout.paymentInformationCC;\n\n var creditCard = {\n Owner : values.owner,\n Cvv2 : values.cvv2,\n Number : values.number,\n Year : values.year,\n Month : values.month,\n Provider: values.provider\n };\n\n API.post( '/rest/checkout/paymentinformationcreditcard/', creditCard )\n .done( function()\n {\n Checkout.loadCheckout();\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing address suggestions\n * @param {string} type\n */\n function loadAddressSuggestion( type )\n {\n\n //check login type\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n var values = $( '[data-plenty-checkout-form=\"shippingAddress\"]' ).getFormValues();\n }\n else\n {\n var values = $( '[data-plenty-checkout-form=\"guestRegistration\"]' ).getFormValues();\n }\n\n var params = {\n street : values.Street,\n houseNo : values.HouseNo,\n ZIP : values.ZIP,\n city : values.City,\n postnummer : values.Postnummer,\n suggestionType: 'postfinder'\n };\n\n CMS.getContainer( 'CheckoutAddressSuggestionResultsList', params ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .show();\n } );\n }\n\n /**\n * Place the order prepared before and finish the checkout process.
    \n * Validate required checkboxes in data-plenty-checkout-form=\"placeOrder\"\n * @function placeOrder\n * @return {object} jQuery deferred\n * Object\n */\n function placeOrder()\n {\n var form = $( '[data-plenty-checkout-form=\"placeOrder\"]' );\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n // if not shown in layout set default 1 for mandatory fields\n var params = {\n TermsAndConditionsCheck : values.termsAndConditionsCheck || 0,\n WithdrawalCheck : values.withdrawalCheck || 0,\n PrivacyPolicyCheck : values.privacyPolicyCheck || 0,\n AgeRestrictionCheck : values.ageRestrictionCheck || 0,\n NewsletterCheck : values.newsletterCheck || 0,\n KlarnaTermsAndConditionsCheck: values.klarnaTermsAndConditionsCheck || 0,\n PayoneDirectDebitMandateCheck: values.payoneDirectDebitMandateCheck || 0,\n PayoneInvoiceCheck : values.payoneInvoiceCheck || 0\n };\n\n return API.post( \"/rest/checkout/placeorder/\", params )\n .done( function( response )\n {\n if ( response.data.MethodOfPaymentRedirectURL != '' )\n {\n\n window.location.assign( response.data.MethodOfPaymentRedirectURL );\n\n }\n else if ( response.data.MethodOfPaymentAdditionalContent != '' )\n {\n\n Modal.prepare()\n .setContent( response.data.MethodOfPaymentAdditionalContent )\n .setLabelDismiss( '' )\n .onDismiss( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).onConfirm( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).show();\n\n }\n else\n {\n\n window.location.assign( form.attr( 'action' ) );\n\n }\n } );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n pm.service( 'FeedbackService', function( API )\n {\n\n return {\n getFeedbacks : getFeedbacks,\n addFeedback : addFeedback,\n ArticleTypes : articleTypes(),\n FeedbackTypes: feedbackTypes()\n };\n\n /*\n FeedbackService\n .getFeedbacks().between('2014-12-03', '2015-07-01')\n .for( FeedbackService.ArticleTypes.ITEM, 2732, FeedbackService.FeedbackTypes.COMMENTS_ONLY );\n */\n function getFeedbacks()\n {\n var feedbackInterval = {\n dateStart: null,\n dateEnd : null\n };\n\n return {\n between: setFeedbackInterval,\n for : listFeedbacks\n };\n\n function setFeedbackInterval( start, end )\n {\n feedbackInterval.dateStart = start;\n feedbackInterval.dateEnd = end;\n return this;\n }\n\n function listFeedbacks( articleType, referenceId, feedbackType )\n {\n\n var params = {\n ReferenceId : referenceId,\n FromDate : feedbackInterval.dateStart,\n ToDate : feedbackInterval.dateEnd,\n FeedbackType: feedbackType || feedbackTypes().COMMENTS_AND_RATINGS\n };\n return API.get( '/rest/feedback/' + articleType + '/', params );\n\n }\n }\n\n /*\n FeedbackService\n .addFeedback()\n .withRating( 5 )\n .withComment( 'Hallo' )\n .withAuthor( 'Felix', 'felix.dausch@plentymarkets.com', 123456 )\n .to( FeedbackService.ArticleTypes.ITEM, 2732 );\n */\n function addFeedback()\n {\n\n var params = {\n Rating : 1.0,\n Text : '',\n Author : '',\n Email : '',\n CustomerId: 0\n };\n\n return {\n withRating : withRating,\n withComment: withComment,\n withAuthor : withAuthor,\n to : sendFeedback\n };\n\n function withRating( rating )\n {\n params.Rating = rating;\n return this;\n }\n\n function withComment( comment )\n {\n params.Text = comment;\n return this;\n }\n\n function withAuthor( author, mail, customerID )\n {\n params.Author = author;\n if ( !!mail )\n {\n params.Email = mail;\n }\n if ( !!customerID )\n {\n params.CustomerId = customerID;\n }\n return this;\n }\n\n function sendFeedback( articleType, referenceId )\n {\n return API.post( '/rest/feedback/' + articleType + '/', params );\n\n }\n\n }\n\n function feedbackTypes()\n {\n return {\n COMMENTS_ONLY : 'comments_only',\n RATINGS_ONLY : 'ratings_only',\n COMMENTS_AND_RATINGS: 'comments_with_ratings'\n }\n }\n\n function articleTypes()\n {\n return {\n ITEM : 'item',\n CATEGORY: 'category',\n BLOG : 'blog'\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Listens to window's size and trigger 'sizeChange' event if the Bootstrap interval changes.\n * @class MediaSizeService\n * @static\n * @example\n * $(window).on('sizeChange', function(newValue, oldValue) {\n * console.log('The interval changed from ' + oldValue + ' to ' + newValue.');\n * });\n */\n pm.service( 'MediaSizeService', function()\n {\n\n var bsInterval;\n\n // recalculation of the current interval on window resize\n $( window ).resize( calculateMediaSize );\n\n // initially calculation of the interval\n $( document ).ready( calculateMediaSize );\n\n return {\n interval : getInterval,\n isInterval: isInterval\n };\n\n /**\n * Get the currently used Bootstrap interval\n * @function getInterval\n * @return {\"xs\"|\"sm\"|\"md\"|\"lg\"}\n */\n function getInterval()\n {\n if ( !!bsInterval )\n {\n calculateMediaSize();\n }\n\n return bsInterval;\n }\n\n /**\n * Calculate the currently used Bootstrap interval\n * @function calculateMediaSize\n * @private\n */\n function calculateMediaSize()\n {\n var size;\n if ( !!window.matchMedia )\n { // FIX IE support\n if ( window.matchMedia( '(min-width:1200px)' ).matches )\n {\n size = 'lg';\n }\n else if ( window.matchMedia( '(min-width:992px)' ).matches )\n {\n size = 'md';\n }\n else if ( window.matchMedia( '(min-width:768px)' ).matches )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n else\n {\n if ( $( window ).width() >= 1200 )\n {\n size = 'lg';\n }\n else if ( $( window ).width() >= 992 )\n {\n size = 'md';\n }\n else if ( $( window ).width() >= 768 )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n if ( size != bsInterval || size === 'xs' )\n {\n var oldValue = bsInterval;\n bsInterval = size;\n $( window ).trigger( 'sizeChange', [bsInterval, oldValue] );\n }\n }\n\n function isInterval( interval )\n {\n var intervalList = interval.replace( /\\s/g, '' ).split( ',' );\n for ( var i = 0; i < intervalList.length; i++ )\n {\n if ( intervalList[i] == bsInterval )\n {\n return true;\n }\n }\n return false;\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Handling navigation while checkout processes\n * @class NavigatorService\n * @static\n *\n */\n pm.service( 'NavigatorService', function( CMS, Checkout )\n {\n var navigation = [];\t\t// contains navigation list elements\n var container = [];\t\t// content containers\n var current = -1;\t\t// index of currently shown content container\n var buttonPrev = {};\t\t// navigation buttons\n var buttonNext = {};\n var interceptors = {\n beforeChange: [],\n afterChange : []\n };\n var checkoutStates = [];\n\n return {\n init : init,\n getCurrentContainer: getCurrentContainer,\n goTo : goTo,\n beforeChange : beforeChange,\n afterChange : afterChange,\n continueChange : continueChange,\n next : next,\n previous : previous,\n goToID : goToID,\n fillNavigation : fillNavigation\n };\n\n /**\n * Initialize checkout navigation. Shows first container.\n * @function init\n * @example\n * ```html\n * \n *
      \n *
    • Checkout Step 1
    • \n *
    • Checkout Step 2
    • \n *
    • ...
    • \n *
    \n * \n *\n *
    \n *
    \n * Checkout Step 1 Content\n *
    \n *
    \n * Checkout Step 2 Content\n *
    \n *
    ...
    \n *
    \n * ```\n */\n function init()\n {\n\n // get elements from DOM\n navigation = $( '[data-plenty-checkout=\"navigation\"] > li' );\n container = $( '[data-plenty-checkout=\"container\"] > div' );\n buttonNext = $( '[data-plenty-checkout=\"next\"]' );\n buttonPrev = $( '[data-plenty-checkout=\"prev\"]' );\n\n if ( navigation.length == container.length && container.length > 0 )\n {\n var checkout = Checkout.getCheckout();\n\n container.hide();\n\n // initialize navigation\n navigation.each( function( i, elem )\n {\n $( elem ).addClass( 'disabled' );\n // handle navigation click events\n $( elem ).click( function()\n {\n if ( !$( this ).is( '.disabled' ) )\n {\n goTo( i );\n }\n } );\n } );\n\n buttonNext.attr( \"disabled\", \"disabled\" );\n buttonNext.click( function()\n {\n next();\n } );\n\n buttonPrev.attr( \"disabled\", \"disabled\" );\n buttonPrev.click( function()\n {\n previous();\n } );\n\n window.addEventListener( 'hashchange', function()\n {\n if ( window.location.hash.length > 0 )\n {\n goToID( window.location.hash );\n }\n else\n {\n goTo( 0 );\n }\n }, false );\n\n // initialize GUI\n // check url param for jumping to tab\n $.urlParam = function( name )\n {\n var results = new RegExp( '[\\?&]' + name + '=([^&#]*)' ).exec( window.location.href );\n if ( results == null )\n {\n return null;\n }\n else\n {\n return results[1] || 0;\n }\n };\n\n var param = $.urlParam( 'gototab' );\n // jump to hash from url param 'gototab'\n if ( window.location.hash.length == 0 && !!param && $( '[data-plenty-checkout-id=\"' + param + '\"]' ).length > 0 )\n {\n window.location.hash = param;\n }\n // jump to hash\n else if ( !goToID( window.location.hash ) && current >= 0 )\n {\n goTo( current );\n }\n else\n {\n goTo( 0 );\n }\n\n fillNavigation();\n $( window ).on( 'sizeChange', fillNavigation );\n $( window ).resize( function()\n {\n if ( pm.getInstance().MediaSizeService.interval() == 'xs' )\n {\n fillNavigation();\n }\n } );\n\n }\n }\n\n /**\n * Get the currently active checkout container.\n * @function getCurrentContainer\n * @return {{id: string, index: number}}\n */\n function getCurrentContainer()\n {\n if ( current >= 0 )\n {\n return {\n id : $( container[current] ).attr( 'data-plenty-checkout-id' ),\n index: current\n };\n }\n else\n {\n return null;\n }\n }\n\n /**\n * Register an interceptor called before each tab change.\n * Tabchange will break if any interceptor returns false.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n * @example\n * plenty.NavigatorService.beforeChange( function(targetContainer) {\n * if( targetContainer.id === 'details' ) {\n * // stop tabchange if user tries to access checkout container with id \"details\"\n * return false;\n * }\n * return true;\n * });\n */\n function beforeChange( interceptor )\n {\n interceptors.beforeChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Register an interceptor called after each tab change.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n */\n function afterChange( interceptor )\n {\n interceptors.afterChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Call registered interceptors. Break if any interceptor returns false.\n * Do not call beforeChange-interceptors on initially tabchange\n * @function resolveInterceptors\n * @private\n * @param {\"beforeChange\"|\"afterChange\"} identifier Describe which interceptors should be called\n * @param {number} index the index of the target container\n * @returns {boolean} Conjunction of all interceptor return values\n */\n function resolveInterceptors( identifier, index )\n {\n var continueTabChange = true;\n\n if ( current >= 0 || identifier === 'afterChange' )\n {\n\n var currentContainer = getCurrentContainer();\n var targetContainer = {\n index: index,\n id : $( container[index] ).attr( 'data-plenty-checkout-id' )\n };\n\n $.each( interceptors[identifier], function( i, interceptor )\n {\n if ( interceptor( currentContainer, targetContainer ) === false )\n {\n continueTabChange = false;\n return false;\n }\n } );\n }\n\n return continueTabChange;\n }\n\n /**\n * Show checkout tab given by index\n * @function goTo\n * @param {number} index Index of target tab, starting at 0\n * @param {boolean} [ignoreInterceptors=false] Set true to not call registered interceptors and force changing\n * tab\n */\n function goTo( index, ignoreInterceptors )\n {\n\n var contentChanged = current !== index;\n\n if ( contentChanged && !ignoreInterceptors )\n {\n if ( !resolveInterceptors( \"beforeChange\", index ) )\n {\n return;\n }\n }\n\n current = index;\n\n if ( !Object.equals( checkoutStates[current], Checkout.getCheckout( true ) ) && contentChanged && !!$( container[current] ).attr( 'data-plenty-checkout-content' ) )\n {\n checkoutStates[current] = Checkout.getCheckout( true );\n // reload tab content\n CMS.getCategoryContent( $( container[current] ).attr( 'data-plenty-checkout-content' ) )\n .done( function( response )\n {\n $( container[current] ).html( response.data[0] );\n // continue tab change\n proceedTabChange( contentChanged );\n pm.getInstance().bindDirectives( container[current] );\n $( window ).trigger( 'contentChanged' );\n } );\n }\n else\n {\n // continue tab change without reloading tab content\n proceedTabChange( contentChanged );\n //pm.getInstance().bindDirectives();\n }\n\n }\n\n function proceedTabChange( contentChanged )\n {\n\n // hide content containers\n $( container ).hide();\n\n // refresh navigation elements\n var $elem;\n $( navigation ).each( function( i, elem )\n {\n $elem = $( elem );\n $elem.removeClass( 'disabled active' );\n\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'false' );\n\n if ( i < current )\n {\n // set current element as active\n $elem.addClass( 'visited' );\n }\n else\n {\n if ( i == current )\n {\n $elem.addClass( 'active visited' );\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'true' );\n }\n else\n {\n if ( i > current && !$elem.is( '.visited' ) )\n {\n // disable elements behind active\n $elem.addClass( 'disabled' );\n }\n }\n }\n } );\n fillNavigation();\n\n // hide \"previous\"-button if first content container is shown\n if ( current <= 0 )\n {\n buttonPrev.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonPrev.removeAttr( \"disabled\" );\n }\n\n // hide \"next\"-button if last content container is shown\n if ( current + 1 == navigation.length )\n {\n buttonNext.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonNext.removeAttr( \"disabled\" );\n }\n\n // show current content container\n $( container[current] ).show();\n\n // set location hash\n if ( current > 0 )\n {\n window.location.hash = $( container[current] ).attr( 'data-plenty-checkout-id' );\n }\n else\n {\n if ( window.location.hash.length > 0 )\n {\n window.location.hash = '';\n }\n }\n\n if ( contentChanged )\n {\n resolveInterceptors( \"afterChange\", current );\n }\n }\n\n /**\n * Continue interrupted tabchange. Shorthand for: goTo(targetContainer.index, true)\n * @function continueChange\n * @param targetContainer The tab-object received from an interceptor\n */\n function continueChange( targetContainer )\n {\n goTo( targetContainer.index, true );\n }\n\n /**\n * Show next checkout tab if available. Shorthand for\n * \n * if (current < navigation.length - 1) {\n * goTo(current + 1);\n * }\n * \n * @function next\n */\n function next()\n {\n if ( current < navigation.length - 1 )\n {\n goTo( current + 1 );\n }\n }\n\n /**\n * Show previous checkout tab if available\n * @function next\n */\n function previous()\n {\n if ( current > 0 )\n {\n goTo( current - 1 );\n }\n }\n\n /**\n * Show checkout tab given by ID\n * @function goToID\n * @param {string} containerID ID of tab to show. Target tab must be marked with\n * data-plenty-checkout-id=\"#...\"\n */\n function goToID( containerID )\n {\n if ( containerID == 'next' )\n {\n next();\n return true;\n }\n else if ( containerID == 'prev' )\n {\n previous();\n return true;\n }\n else\n {\n containerID = containerID.replace( '#', '' );\n $( container ).each( function( i, elem )\n {\n if ( $( elem ).attr( 'data-plenty-checkout-id' ) == containerID )\n {\n goTo( i );\n return true;\n }\n } );\n }\n\n return false;\n }\n\n /**\n * Calculate navigation's width to match its parent element\n * by increasing its items padding.\n * @function fillNavigation\n */\n function fillNavigation()\n {\n // break if manager has not been initialized\n var navigationCount = navigation.length;\n if ( navigationCount <= 0 )\n {\n return;\n }\n\n // reset inline styles\n $( navigation ).removeAttr( 'style' );\n $( navigation ).children( 'span' ).removeAttr( 'style' );\n $( buttonNext ).removeAttr( 'style' );\n $( buttonPrev ).removeAttr( 'style' );\n\n var buttonWidth = ($( buttonPrev ).outerWidth() < $( buttonNext ).outerWidth()) ? $( buttonNext ).outerWidth( true ) + 1 : $( buttonPrev ).outerWidth( true ) + 1;\n $( buttonNext ).css( {width: buttonWidth + 'px'} );\n $( buttonPrev ).css( {width: buttonWidth + 'px'} );\n\n // calculate width to fill\n var width = $( navigation ).parent().parent().outerWidth( true ) - ( 2 * buttonWidth);\n width -= parseInt( $( navigation ).parent().css( 'marginLeft' ) ) + parseInt( $( navigation ).parent().css( 'marginRight' ) );\n\n var padding = width;\n var tabWidth = [];\n\n $( navigation ).each( function( i, elem )\n {\n padding -= parseInt( $( elem ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).css( 'marginRight' ) );\n\n tabWidth[i] = $( elem ).children( 'span' ).width();\n padding -= tabWidth[i];\n\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginRight' ) );\n } );\n\n var paddingEachItem = parseInt( padding / navigationCount );\n\n var paddingLeft, paddingRight;\n if ( paddingEachItem % 2 == 1 )\n {\n paddingLeft = ( paddingEachItem / 2 ) + 0.5;\n paddingRight = ( paddingEachItem / 2 ) - 0.5;\n }\n else\n {\n paddingLeft = paddingEachItem / 2;\n paddingRight = paddingEachItem / 2;\n }\n\n var paddingLastItem = parseInt( padding - ( ( navigationCount - 1 ) * ( paddingLeft + paddingRight ) ) );\n var paddingLastLeft, paddingLastRight;\n if ( paddingLastItem % 2 == 1 )\n {\n paddingLastLeft = ( paddingLastItem / 2 ) + 0.5;\n paddingLastRight = ( paddingLastItem / 2) - 0.5;\n }\n else\n {\n paddingLastLeft = paddingLastItem / 2;\n paddingLastRight = paddingLastItem / 2;\n }\n\n var diff = width;\n $( navigation ).each( function( i, elem )\n {\n if ( i < navigationCount - 1 )\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLeft + 'px', 'paddingRight': paddingRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLeft + paddingRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n else\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLastLeft + 'px', 'paddingRight': paddingLastRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLastLeft + paddingLastRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n } );\n\n //$(navigation).parent().css('marginRight', 0);\n }\n\n }, ['CMSFactory', 'CheckoutFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Magnus Martin \n * =====================================================================================\n */\n\n\n(function( $, pm )\n{\n pm.service( 'PostfinderService', function( API, Modal, UIFactory )\n {\n var packstationID = '';\n var shippingFields = {};\n var numberOfResults = {};\n var result = {};\n\n return {\n openPostfinderModal: openPostfinderModal,\n isPackstation : isPackstation\n };\n\n function isPackstation()\n {\n var street = $( 'input[name=\"Street\"]' ).val();\n return ( street.toUpperCase() == \"PACKSTATION\" || street.toUpperCase() == \"POSTFILIALE\" );\n }\n\n function openPostfinderModal()\n {\n shippingFields = {\n PostfinderItemStreet : $( 'input[name=\"Street\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemZIP : $( 'input[name=\"ZIP\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemCity : $( 'input[name=\"City\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemHouseNo: $( 'input[name=\"HouseNo\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' )\n\n };\n\n shippingFields.PostfinderItemStreet.val( '' );\n\n if ( (shippingFields.PostfinderItemZIP.val().length > 2 || shippingFields.PostfinderItemCity.val().length > 2) )\n {\n\n API.get( '/rest/checkout/shippingaddresspostfinderlist/',\n {\n suggestionType: \"postfinder\",\n zip : shippingFields.PostfinderItemZIP.val(),\n city : shippingFields.PostfinderItemCity.val()\n } )\n\n .done( function( response )\n {\n result = response.data;\n numberOfResults = result.length;\n\n if ( numberOfResults == 0 )\n {\n showErrorMessage();\n }\n\n var params = {\n addresses: []\n };\n\n for ( var i = 0; i < numberOfResults; i++ )\n {\n var dimension = 'km';\n var distInMeters = result[i].PostfinderItemDistance;\n var distInKilometers = distInMeters / 1000;\n distInKilometers = ((Math.round( distInKilometers * 100 ) / 100).toFixed( 2 )).replace( '.', ',' );\n\n if ( distInMeters < 1000 )\n {\n distInKilometers = distInMeters;\n dimension = 'm';\n }\n\n params.addresses.push( {\n index : i,\n dimension: dimension,\n type : result[i].PostfinderItemIsPackstation ? 'Packstation' : 'Postfiliale',\n number : result[i].PostfinderItemIsPackstation ? result[i].PostfinderItemPackstationNo : result[i].PostfinderItemPostfilialNo,\n street : result[i].PostfinderItemStreet,\n houseNo : result[i].PostfinderItemHouseNo,\n zip : result[i].PostfinderItemZIP,\n city : result[i].PostfinderItemCity,\n district : result[i].PostfinderItemDistrict,\n distance : distInKilometers,\n remark : result[i].PostfinderItemRemark\n } );\n }\n\n var html = pm.compileTemplate( 'addressSuggestions/postFinder.html', params );\n\n Modal.prepare()\n .setTitle( pm.translate( 'Packstations and post offices in your area' ) )\n .setContent( html )\n .setClass( 'checkout' )\n .onConfirm( function()\n {\n shippingFields.PostfinderItemCity.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemStreet.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemStreet.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemHouseNo.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemHouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n packstationID = $( 'input[type=\"radio\"][name=\"postfinder\"]:checked' ).val();\n\n if ( result[packstationID].PostfinderItemIsPackstation )\n {\n $( shippingFields.PostfinderItemStreet ).val( 'PACKSTATION' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPackstationNo );\n }\n else\n {\n $( shippingFields.PostfinderItemStreet ).val( 'POSTFILIALE' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPostfilialNo );\n }\n $( shippingFields.PostfinderItemStreet ).trigger( 'change' );\n\n $( shippingFields.PostfinderItemCity ).val( result[packstationID].PostfinderItemCity );\n $( shippingFields.PostfinderItemZIP ).val( result[packstationID].PostfinderItemZIP );\n return true;\n } )\n .show()\n } );\n }\n else\n {\n showErrorMessage();\n }\n\n }\n\n function showErrorMessage()\n {\n UIFactory.throwError( 0, pm.translate( 'Please enter a ZIP code and/or a city.' ) );\n\n shippingFields.PostfinderItemCity.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemCity.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n\n shippingFields.PostfinderItemZIP.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n }\n }, ['APIFactory', 'ModalFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide templates for social share providers to inject them dynamically.\n * @class SocialShareService\n * @static\n */\n pm.service( 'SocialShareService', function()\n {\n\n //TODO: move to global variables\n if ( typeof(socialLangLocale) == 'undefined' )\n {\n socialLangLocale = 'en_US';\n }\n if ( typeof(socialLang) == 'undefined' )\n {\n socialLang = 'en';\n }\n\n return {\n getSocialService: getService\n };\n\n /**\n * Get the template for social media provider\n * @function getService\n * @param {string} identifier name of the social media provider to get the template for\n * @returns {string} the template to inject in DOM\n */\n function getService( identifier )\n {\n var services = {\n 'facebook-like': '',\n\n 'facebook-recommend': '',\n\n 'twitter': '',\n\n 'google-plus': '
    '\n + '',\n };\n\n return services[identifier];\n }\n\n /**\n * get the canonical URL if defined\n * @function getURL\n * @private\n * @return {string} The Canonical URL if defined or the current URI\n */\n function getURI()\n {\n var uri = document.location.href;\n var canonical = $( \"link[rel=canonical]\" ).attr( \"href\" );\n\n if ( canonical && canonical.length > 0 )\n {\n if ( canonical.indexOf( \"http\" ) < 0 )\n {\n canonical = document.location.protocol + \"//\" + document.location.host + canonical;\n }\n uri = canonical;\n }\n\n return uri;\n }\n\n /**\n * returns content of <meta name=\"\" content=\"\"> tags or '' if empty/non existant\n * @function getMeta\n * @private\n * @param {string} name The meta name to get the value of;\n */\n function getMeta( name )\n {\n var metaContent = $( 'meta[name=\"' + name + '\"]' ).attr( 'content' );\n return metaContent || '';\n }\n\n /**\n * create tweet text from content of <meta name=\"DC.title\"> and <meta name=\"DC.creator\">\n * fallback to content of <title> tag\n * @function getTweetText\n * @private\n */\n function getTweetText()\n {\n var title = getMeta( 'DC.title' );\n var creator = getMeta( 'DC.creator' );\n\n if ( title.length > 0 && creator.length > 0 )\n {\n title += ' - ' + creator;\n }\n else\n {\n title = $( 'title' ).text();\n }\n\n return encodeURIComponent( title );\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide methods for client-side form validation.\n * @class ValidationService\n * @static\n */\n pm.service( 'ValidationService', function()\n {\n\n return {\n validate: validate\n };\n\n /**\n * Check if element is a form element (input, select, textarea) or search for child form elements\n * @function getFormControl\n * @private\n * @param {object} element the element to get the form element from\n * @return {object} a valid form element (input, select, textarea)\n */\n function getFormControl( element )\n {\n element = $( element );\n if ( element.is( 'input' ) || element.is( 'select' ) || element.is( 'textarea' ) )\n {\n return element;\n }\n else\n {\n if ( element.find( 'input' ).length > 0 )\n {\n return element.find( 'input' );\n }\n\n else if ( element.find( 'select' ).length > 0 )\n {\n return element.find( 'select' );\n }\n\n else if ( element.find( 'textarea' ).length > 0 )\n {\n return element.find( 'textarea' );\n }\n\n else\n {\n return null;\n }\n }\n\n }\n\n /**\n * Check given element has any value\n * @function validateText\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateText( formControl )\n {\n // check if formControl is no checkbox or radio\n if ( formControl.is( 'input' ) || formControl.is( 'select' ) || formControl.is( 'textarea' ) )\n {\n // check if length of trimmed value is greater then zero\n return $.trim( formControl.val() ).length > 0;\n\n }\n else\n {\n console.error( 'Validation Error: Cannot validate Text for <' + formControl.prop( \"tagName\" ) + '>' );\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid email-address\n * @function validateMail\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateMail( formControl )\n {\n var mailRegExp = /[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n if ( validateText( formControl ) )\n {\n return mailRegExp.test( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid number\n * @function validateNumber\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateNumber( formControl )\n {\n if ( validateText( formControl ) )\n {\n return $.isNumeric( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is equal to a references value\n * @function validateValue\n * @private\n * @param {object} formControl the form element to validate\n * @param {string} reference the required value\n * @return {boolean}\n */\n function validateValue( formControl, reference )\n {\n if ( $( reference ).length > 0 )\n {\n return $.trim( formControl.val() ) == $.trim( $( reference ).val() );\n }\n else\n {\n return $.trim( formControl.val() ) == reference;\n }\n }\n\n function visibility( formControl )\n {\n return formControl.is( ':visible' );\n }\n\n function isEnabled( formControl )\n {\n return formControl.is( ':enabled' );\n }\n\n /**\n * Validate a form. Triggers event 'validationFailed' if any element has an invalid value\n * @function validate\n * @param {object} form The form element to validate\n * @returns {boolean}\n * @example\n * ```html\n * \n *
    \n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n *
    \n * \n * \n *
    \n *\n *
    \n * ```\n *\n * @example\n * $(form).on('validationFailed', function(missingFields) {\n * // handle missing fields\n * });\n */\n function validate( form, errorClass )\n {\n var formControl, formControls, validationKey, currentHasError, group, checked, checkedMin, checkedMax, attrValidate, validationKeys, formControlAttrType;\n var $form = $( form );\n errorClass = errorClass || 'has-error';\n var missingFields = [];\n var hasError = false;\n\n // check every required input inside form\n $form.find( '[data-plenty-validate], :required' ).each( function( i, elem )\n {\n attrValidate = $( elem ).attr( 'data-plenty-validate' );\n formControls = getFormControl( elem ); \n // validate text inputs\n validationKeys = !!attrValidate ? attrValidate : 'text';\n validationKeys = validationKeys.split( ',' );\n\n for ( var i = 0, length = formControls.length; i < length; i++ )\n {\n formControl = $( formControls[i] );\n formControlAttrType = formControl.attr( 'type' );\n\n if ( !visibility( formControl ) || !isEnabled( formControl ) )\n {\n return;\n }\n\n validationKey = validationKeys[i].trim() || validationKeys[0].trim();\n currentHasError = false;\n\n // formControl is textfield (text, mail, password) or textarea\n if ( (formControl.is( 'input' )\n && formControlAttrType != 'radio'\n && formControlAttrType != 'checkbox')\n || formControl.is( 'textarea' ) )\n {\n switch ( validationKey )\n {\n\n case 'text':\n currentHasError = !validateText( formControl );\n break;\n\n case 'mail':\n currentHasError = !validateMail( formControl );\n break;\n\n case 'number':\n currentHasError = !validateNumber( formControl );\n break;\n\n case 'value':\n currentHasError = !validateValue( formControl, $( elem ).attr( 'data-plenty-validation-value' ) );\n break;\n\n case 'none':\n // do not validate\n break;\n\n default:\n console.error( 'Form validation error: unknown validate property: \"' + attrValidate + '\"' );\n break;\n }\n }\n else if ( formControl.is( 'input' )\n && (formControlAttrType == 'radio'\n || formControlAttrType == 'checkbox') )\n {\n // validate radio buttons\n group = formControl.attr( 'name' );\n checked = $form.find( 'input[name=\"' + group + '\"]:checked' ).length;\n\n if ( formControlAttrType == 'radio' )\n {\n checkedMin = 1;\n checkedMax = 1;\n }\n else\n {\n var minMax = (new Function(\"return \" + attrValidate))() || {min: 1, max: 1};\n checkedMin = minMax.min;\n checkedMax = minMax.max;\n }\n\n currentHasError = ( checked < checkedMin || checked > checkedMax );\n\n }\n else if ( formControl.is( 'select' ) )\n {\n // validate selects\n currentHasError = ( formControl.val() == '' || formControl.val() == '-1' );\n }\n else\n {\n console.error( 'Form validation error: ' + $( elem ).prop( \"tagName\" ) + ' does not contain an form element' );\n return;\n }\n\n if ( currentHasError )\n {\n hasError = true;\n missingFields.push( formControl );\n\n if ( formControls.length > 1 )\n {\n formControl.addClass( errorClass );\n $form.find( 'label[for=\"' + formControl.attr( 'id' ) + '\"]' ).addClass( errorClass );\n }\n else\n {\n $( elem ).addClass( errorClass );\n }\n }\n }\n\n } );\n\n // scroll to element on 'validationFailed'\n $form.on( 'validationFailed', function()\n {\n var distanceTop = 50;\n var $error = $form.find( '.' + errorClass ).first();\n var errorOffset = $error.offset().top;\n var $scrollTarget = $( 'html, body' );\n\n // if form is inside of modal, scroll modal instead of body\n if ( $form.parents( '.modal' ).length > 0 )\n {\n $scrollTarget = $form.parents( '.modal' ).find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n\n }\n else if ( $form.is( '.modal' ) )\n {\n $scrollTarget = $form.find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n }\n\n // only scroll if error is outside of viewport\n if ( errorOffset - distanceTop < window.pageYOffset || errorOffset > (window.pageYOffset + window.innerHeight) )\n {\n $scrollTarget.animate( {\n scrollTop: errorOffset - distanceTop\n } );\n }\n } );\n\n if ( hasError )\n {\n // remove error class on focus\n $form.find( '.' + errorClass ).each( function( i, elem )\n {\n formControl = $( getFormControl( elem ) );\n formControl.on( 'focus click', function()\n {\n var $errorElement = $( elem );\n $errorElement.removeClass( errorClass );\n $form.find( 'label[for=\"' + $( this ).attr( 'id' ) + '\"]' ).removeClass( errorClass );\n } );\n } );\n\n $form.trigger( 'validationFailed', [missingFields] );\n }\n\n var callback = $form.attr( 'data-plenty-callback' );\n\n if ( !hasError && !!callback && callback != \"submit\" && typeof window[callback] == \"function\" )\n {\n\n var fields = {};\n $form.find( 'input, textarea, select' ).each( function()\n {\n if ( $( this ).attr( 'type' ) == 'checkbox' )\n {\n fields[$( this ).attr( 'name' )] = $( this ).is( ':checked' );\n }\n else\n {\n fields[$( this ).attr( 'name' )] = $( this ).val();\n }\n } );\n\n window[callback]( fields );\n return false;\n }\n else\n {\n return !hasError;\n }\n }\n } );\n\n /**\n * jQuery-Plugin to calling {{#crossLink \"ValidationService/validate\"}}ValidationService.validate{{/crossLink}}\n * on jQuery wrapped elements.\n * @return {boolean}\n */\n $.fn.validateForm = function()\n {\n return pm.getInstance().ValidationService.validate( this );\n };\n\n /**\n * jQuery-Plugin to get the values of contained form elements.\n * @return {object}\n */\n $.fn.getFormValues = function()\n {\n\n var form = this;\n var values = {};\n\n function inject( position, value )\n {\n var match = position.match( /^([^\\[]+)(.*)/ );\n\n if ( !!match[2] )\n {\n var exp = /\\[([^\\]]+)]/g;\n var child;\n var children = [];\n children[0] = match[1];\n while ( (child = exp.exec( match[2] )) !== null )\n {\n children.push( child[1] );\n }\n\n for ( var i = children.length - 1; i >= 0; i-- )\n {\n var val = {};\n val[children[i]] = value;\n value = val;\n }\n values = $.extend( true, values, value );\n }\n else\n {\n values[match[1]] = value;\n }\n }\n\n form.find( 'input, select, textarea' ).each( function( i, elem )\n {\n if ( !!$( elem ).attr( 'name' ) )\n {\n if ( $( elem ).attr( 'type' ) == \"checkbox\" )\n {\n // get checkbox group\n var groupValues = [];\n $( form ).find( '[name=\"' + $( elem ).attr( 'name' ) + '\"]:checked' ).each( function( j, checkbox )\n {\n groupValues.push( $( checkbox ).val() );\n } );\n inject( $( elem ).attr( 'name' ), groupValues );\n }\n else if ( $( elem ).attr( 'type' ) == 'radio' )\n {\n if ( $( elem ).is( ':checked' ) )\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n else\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n\n } );\n return values;\n }\n}( jQuery, PlentyFramework ));\n/**\n * Services provide functions to be called from the instanced PlentyFramework.
    \n * Services can inject Factories and can be injected into Directives. The are also\n * available from the global instance of PlentyFramework\n * @module Services\n * @main Services\n * @example\n * PlentyFramework.service('ServiceName', serviceFunctions() {\n * return {\n * functionInService: function() {}\n * }\n * });\n * //...\n * plenty.ServiceName.functionInService/();\n */\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\nPlentyFramework.compile();\n\n// Create global instance of PlentyFramework for usage in Webshop-Layouts\nvar plenty = PlentyFramework.getInstance();\n\n/*\n * initially bind all registered directives\n *\n * will not be tested. reasons:\n * http://stackoverflow.com/questions/29153733/how-to-unit-test-a-document-ready-function-using-jasmine\n */\njQuery( document ).ready( function()\n{\n plenty.bindDirectives();\n} );" ] } \ No newline at end of file diff --git a/src/directives/MobileDropdown.js b/src/directives/MobileDropdown.js index d268596..10c73c1 100644 --- a/src/directives/MobileDropdown.js +++ b/src/directives/MobileDropdown.js @@ -34,12 +34,6 @@ resetDropdowns( dropdownElements ); resetDropdowns( closableDropdownElements ); } ); - - // handle "close menu on click outside" - $( 'html' ).on( "click touchstart", function( event ) - { - resetDropdowns( closableDropdownElements, event ); - } ); } function resetDropdowns( dropdownList, event ) @@ -50,14 +44,25 @@ $current = $( dropdownList[i] ); if ( !!event ) { - if ( $current.find( $( event.target ) ).length === 0 ) + if ( $current.find( $( event.target ) ).length === 0 + && !$( "#LiveSearchParam" ).is( ":focus" ) + && !$( "#checkout-login-email" ).is( ":focus" ) + && !$( "#checkout-login-password" ).is( ":focus" ) ) { $current.removeClass( 'open' ); + $( 'html' ).unbind( "click touchstart", resetEvent ); } } else { - $current.removeClass( 'open' ); + if ( $current.find( $( event.target ) ).length === 0 + && !$( "#LiveSearchParam" ).is( ":focus" ) + && !$( "#checkout-login-email" ).is( ":focus" ) + && !$( "#checkout-login-password" ).is( ":focus" ) ) + { + $current.removeClass( 'open' ); + $( 'html' ).unbind( "click touchstart", resetEvent ); + } } } @@ -109,6 +114,9 @@ // do nothing } } + + // handle "close menu on click outside" + $( 'html' ).on( "click touchstart", resetEvent ); } function showDropdownHideOthers( elem, parent ) @@ -171,6 +179,14 @@ $elemParent.removeClass( 'animating' ); } ); } + + // handle "close menu on click outside" + $( 'html' ).on( "click touchstart", resetEvent ); + } + + function resetEvent( event ) + { + resetDropdowns( closableDropdownElements, event ); } }, ['MediaSizeService'] ); diff --git a/src/services/CheckoutService.js b/src/services/CheckoutService.js index 994f1b4..0d4696e 100644 --- a/src/services/CheckoutService.js +++ b/src/services/CheckoutService.js @@ -206,6 +206,7 @@ var invoiceAddress = form.getFormValues(); invoiceAddress.LoginType = 1; + // add custom properties if necessary. if ( invoiceAddress.checkout && invoiceAddress.checkout.customerInvoiceAddress && invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty ) diff --git a/tools/ScriptLoader.js b/tools/ScriptLoader.js index 6f1fd63..6d064d1 100644 --- a/tools/ScriptLoader.js +++ b/tools/ScriptLoader.js @@ -12,7 +12,6 @@ var ScriptLoader = { { // define config defaults - config.layout = config.layout || 'PageDesignGlobal'; config.position = config.position || 'head'; config.rootPath = absolutePath( config.rootPath || '/' ); config.sourceMap = absolutePath( config.sourceMap || config.rootPath + 'scripts.json' ) + addPostfix( config.debug ); @@ -45,8 +44,7 @@ var ScriptLoader = { function loadScripts() { // concat global dependencies and layout specific dependencies - var libs = ScriptLoader.scripts.PageDesignGlobal[config.position] - .concat( ScriptLoader.scripts[config.layout][config.position] ); + var libs = ScriptLoader.scripts.PageDesignGlobal[config.position]; for ( var i = 0; i < libs.length; i++ ) { From b2cdfab6caac6280f30df42d8cd4127ec98051bc Mon Sep 17 00:00:00 2001 From: Magnus Martin Date: Thu, 12 May 2016 17:00:29 +0200 Subject: [PATCH 3/6] ADD fix for mobile login dropdown --- src/directives/MobileDropdown.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/directives/MobileDropdown.js b/src/directives/MobileDropdown.js index d268596..ad1d879 100644 --- a/src/directives/MobileDropdown.js +++ b/src/directives/MobileDropdown.js @@ -116,7 +116,7 @@ var $parent = $( parent ); // hide other dropdowns - resetDropdowns( closableDropdownElements ); + resetDropdowns( closableDropdownElements, elem ); // remember opened dropdown if ( $.inArray( $parent[0], closableDropdownElements ) < 0 ) From 5d1d0e9ec55f24241e0b88de4e26ec49fde83155 Mon Sep 17 00:00:00 2001 From: Maximilian Lauterbach Date: Tue, 17 May 2016 18:11:31 +0200 Subject: [PATCH 4/6] Added some conditions to prevent closing responsive menus if input field is focused. Fix for attribute selection. Modal displayed wrong price if item has a attributes. Added plenty-2.js to tools-folder/project and fixed close-issuse for menus if input-field was focused. Removed CheckoutManager-migrate.js. --- dist/plentymarketsCMStools-1.0.8.js | 43 ++-- dist/plentymarketsCMStools-1.0.8.min.js | 4 +- dist/plentymarketsCMStools-1.0.8.min.js.map | 8 +- src/directives/MobileDropdown.js | 22 +- src/services/BasketService.js | 19 +- tools/CheckoutManager-migrate.js | 18 -- tools/plenty-2.js | 232 ++++++++++++++++++++ 7 files changed, 292 insertions(+), 54 deletions(-) delete mode 100644 tools/CheckoutManager-migrate.js create mode 100644 tools/plenty-2.js diff --git a/dist/plentymarketsCMStools-1.0.8.js b/dist/plentymarketsCMStools-1.0.8.js index f537a82..2fa4a78 100644 --- a/dist/plentymarketsCMStools-1.0.8.js +++ b/dist/plentymarketsCMStools-1.0.8.js @@ -985,8 +985,11 @@ TemplateCache["waitscreen/waitscreen.html"] = "
    * ===================================================================================== */ -var TemplateCache={};TemplateCache["addressSuggestions/addressDoctor.html"]='',TemplateCache["addressSuggestions/postFinder.html"]='{{#addresses}}\n
    \n
    \n \n
    \n
    \n{{/addresses}}\n',TemplateCache["error/errorMessage.html"]='
    \n Code {{code}}:\n {{{message}}}\n
    \n',TemplateCache["error/errorPopup.html"]='
    \n \n
    \n
    \n
    \n',TemplateCache["modal/modal.html"]='\n',TemplateCache["waitscreen/waitscreen.html"]='
    ',function(a,b){"object"==typeof exports&&exports&&"string"!=typeof exports.nodeName?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):(a.Mustache={},b(Mustache))}(this,function(a){function b(a){return"function"==typeof a}function c(a){return p(a)?"array":typeof a}function d(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function e(a,b){return null!=a&&"object"==typeof a&&b in a}function f(a,b){return q.call(a,b)}function g(a){return!f(r,a)}function h(a){return String(a).replace(/[&<>"'\/]/g,function(a){return s[a]})}function i(b,c){function e(){if(r&&!s)for(;q.length;)delete o[q.pop()];else q=[];r=!1,s=!1}function f(a){if("string"==typeof a&&(a=a.split(u,2)),!p(a)||2!==a.length)throw new Error("Invalid tags: "+a);h=new RegExp(d(a[0])+"\\s*"),i=new RegExp("\\s*"+d(a[1])),m=new RegExp("\\s*"+d("}"+a[1]))}if(!b)return[];var h,i,m,n=[],o=[],q=[],r=!1,s=!1;f(c||a.tags);for(var y,z,A,B,C,D,E=new l(b);!E.eos();){if(y=E.pos,A=E.scanUntil(h))for(var F=0,G=A.length;G>F;++F)B=A.charAt(F),g(B)?q.push(o.length):s=!0,o.push(["text",B,y,y+1]),y+=1,"\n"===B&&e();if(!E.scan(h))break;if(r=!0,z=E.scan(x)||"name",E.scan(t),"="===z?(A=E.scanUntil(v),E.scan(v),E.scanUntil(i)):"{"===z?(A=E.scanUntil(m),E.scan(w),E.scanUntil(i),z="&"):A=E.scanUntil(i),!E.scan(i))throw new Error("Unclosed tag at "+E.pos);if(C=[z,A,y,E.pos],o.push(C),"#"===z||"^"===z)n.push(C);else if("/"===z){if(D=n.pop(),!D)throw new Error('Unopened section "'+A+'" at '+y);if(D[1]!==A)throw new Error('Unclosed section "'+D[1]+'" at '+y)}else"name"===z||"{"===z||"&"===z?s=!0:"="===z&&f(A)}if(D=n.pop())throw new Error('Unclosed section "'+D[1]+'" at '+E.pos);return k(j(o))}function j(a){for(var b,c,d=[],e=0,f=a.length;f>e;++e)b=a[e],b&&("text"===b[0]&&c&&"text"===c[0]?(c[1]+=b[1],c[3]=b[3]):(d.push(b),c=b));return d}function k(a){for(var b,c,d=[],e=d,f=[],g=0,h=a.length;h>g;++g)switch(b=a[g],b[0]){case"#":case"^":e.push(b),f.push(b),e=b[4]=[];break;case"/":c=f.pop(),c[5]=b[2],e=f.length>0?f[f.length-1][4]:d;break;default:e.push(b)}return d}function l(a){this.string=a,this.tail=a,this.pos=0}function m(a,b){this.view=a,this.cache={".":this.view},this.parent=b}function n(){this.cache={}}var o=Object.prototype.toString,p=Array.isArray||function(a){return"[object Array]"===o.call(a)},q=RegExp.prototype.test,r=/\S/,s={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},t=/\s*/,u=/\s+/,v=/\s*=/,w=/\s*\}/,x=/#|\^|\/|>|\{|&|=|!/;l.prototype.eos=function(){return""===this.tail},l.prototype.scan=function(a){var b=this.tail.match(a);if(!b||0!==b.index)return"";var c=b[0];return this.tail=this.tail.substring(c.length),this.pos+=c.length,c},l.prototype.scanUntil=function(a){var b,c=this.tail.search(a);switch(c){case-1:b=this.tail,this.tail="";break;case 0:b="";break;default:b=this.tail.substring(0,c),this.tail=this.tail.substring(c)}return this.pos+=b.length,b},m.prototype.push=function(a){return new m(a,this)},m.prototype.lookup=function(a){var c,d=this.cache;if(d.hasOwnProperty(a))c=d[a];else{for(var f,g,h=this,i=!1;h;){if(a.indexOf(".")>0)for(c=h.view,f=a.split("."),g=0;null!=c&&gi;++i)g=void 0,e=a[i],f=e[0],"#"===f?g=this.renderSection(e,b,c,d):"^"===f?g=this.renderInverted(e,b,c,d):">"===f?g=this.renderPartial(e,b,c,d):"&"===f?g=this.unescapedValue(e,b):"name"===f?g=this.escapedValue(e,b):"text"===f&&(g=this.rawValue(e)),void 0!==g&&(h+=g);return h},n.prototype.renderSection=function(a,c,d,e){function f(a){return g.render(a,c,d)}var g=this,h="",i=c.lookup(a[1]);if(i){if(p(i))for(var j=0,k=i.length;k>j;++j)h+=this.renderTokens(a[4],c.push(i[j]),d,e);else if("object"==typeof i||"string"==typeof i||"number"==typeof i)h+=this.renderTokens(a[4],c.push(i),d,e);else if(b(i)){if("string"!=typeof e)throw new Error("Cannot use higher-order sections without the original template");i=i.call(c.view,e.slice(a[3],a[5]),f),null!=i&&(h+=i)}else h+=this.renderTokens(a[4],c,d,e);return h}},n.prototype.renderInverted=function(a,b,c,d){var e=b.lookup(a[1]);return!e||p(e)&&0===e.length?this.renderTokens(a[4],b,c,d):void 0},n.prototype.renderPartial=function(a,c,d){if(d){var e=b(d)?d(a[1]):d[a[1]];return null!=e?this.renderTokens(this.parse(e),c,d,e):void 0}},n.prototype.unescapedValue=function(a,b){var c=b.lookup(a[1]);return null!=c?c:void 0},n.prototype.escapedValue=function(b,c){var d=c.lookup(b[1]);return null!=d?a.escape(d):void 0},n.prototype.rawValue=function(a){return a[1]},a.name="mustache.js",a.version="2.1.3",a.tags=["{{","}}"];var y=new n;a.clearCache=function(){return y.clearCache()},a.parse=function(a,b){return y.parse(a,b)},a.render=function(a,b,d){if("string"!=typeof a)throw new TypeError('Invalid template! Template should be a "string" but "'+c(a)+'" was given as the first argument for mustache#render(template, view, partials)');return y.render(a,b,d)},a.to_html=function(c,d,e,f){var g=a.render(c,d,e);return b(f)?void f(g):g},a.escape=h,a.Scanner=l,a.Context=m,a.Writer=n}),function(a){function b(a,b,c,d){a.on(b,function(a){return i.push(a),c.apply(null,d)}),"complete"===document.readyState&&"ready"===b&&c.apply(null,d)}function c(b){var c=a(b);c.is('input[type="checkbox"]')&&c.on("change",function(){c.is(":checked")?c.trigger("check"):c.trigger("uncheck")}),c.is('input[type="radio"]')&&c.on("change",function(){var b=c.attr("name");a('input[type="radio"][name="'+b+'"]').each(function(b,c){var d=a(c);d.is(":checked")?d.trigger("check"):d.trigger("uncheck")})})}function d(a,b){for(var c=/^(([\w]+):)?([\w]+)\.([\w]+)(\((.*)\))?$/,d=a.split(";"),e=[],f=0;f0)for(var j=h[6].match(/(['][^']+['])|([\w-]+)|(["][^"]+["])/g),k=0;k=c&&g.services.hasOwnProperty(i)){PlentyFramework.prototype.hasOwnProperty(i)||e(g.services[i],2,d),f.push(PlentyFramework.prototype[i]);continue}if(1>=c&&g.directives.hasOwnProperty(i)){PlentyFramework.directives.hasOwnProperty(i)||e(g.directives[i],1,d),f.push(PlentyFramework.directives[i]);continue}console.error('Cannot inject dependency "'+i+'": Object not found.')}else console.error("Cyclic dependency injection: "+d.join(" -> ")+" -> "+i)}3==c?PlentyFramework.factories[b.name]=b.setup.apply(null,f):2==c?PlentyFramework.prototype[b.name]=b.setup.apply(null,f):1==c&&(PlentyFramework.directives[b.name]=b.setup.apply(null,f))}var f="1.0.8",g={factories:{},services:{},directives:{}};PlentyFramework=function(){};var h=null;PlentyFramework.getInstance=function(){return h=h||new PlentyFramework},PlentyFramework.version=function(){function a(a){for(var b=f.split("."),c=a.split("."),d=0;dparseInt(c[d]))return 1}return 0}return{get:function(){return f},equals:function(b){return 0==a(b)},compare:a}}(),PlentyFramework.partials={},PlentyFramework.globals={},PlentyFramework.setGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?(console.error('Global variable "'+a+'" already exists and cannot be overridden.'),null):(PlentyFramework.globals[a]=b,PlentyFramework.globals[a])},PlentyFramework.getGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?PlentyFramework.globals[a]:b},PlentyFramework.directives={},PlentyFramework.directive=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.directives[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.prototype.bindDirectives=function(e){e=e||"html",a(e).find("[data-plenty]").each(function(e,f){var g=d(a(f).attr("data-plenty"),a(f));if(!(g.length<=0)){c(f);for(var e=0;e=0;c--)if(a==i[c].type)return i[c];return null},PlentyFramework.pushEvent=function(a){i.push(a)},PlentyFramework.service=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.services[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.factories={},PlentyFramework.factory=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.factories[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.compileTemplate=function(a,b){return b=b||{},b.translate=function(){return function(a,b){return b(PlentyFramework.translate(a))}},Mustache.render(TemplateCache[a],b)},PlentyFramework.scriptPath="",PlentyFramework.Strings={},PlentyFramework.loadLanguageFile=function(b){a.ajax({url:PlentyFramework.scriptPath+b,dataType:"json"}).done(function(a){PlentyFramework.Strings=a})},PlentyFramework.translate=function(a,b){var c;return PlentyFramework.Strings.hasOwnProperty(a)?c=PlentyFramework.Strings[a]:(c=a,console.warn('No translation found for "'+c+'".')),b&&(c=Mustache.render(c,b)),c},PlentyFramework.compile=function(){for(var a in g.factories)PlentyFramework.factories.hasOwnProperty(a)||e(g.factories[a],3);for(var b in g.services)PlentyFramework.prototype.hasOwnProperty(b)||e(g.services[b],2);for(var c in g.directives)PlentyFramework.directives.hasOwnProperty(c)||e(g.directives[c],1);for(var d=document.getElementsByTagName("SCRIPT"),f=d.length-1;f>=0;f--){var h=d[f].src.match(/(.*)\/(.*)\.js(\?\S*)?$/);if(h){PlentyFramework.scriptPath=h[1];break}}}}(jQuery),function(a,b){b.directive("Authentication",function(c){function d(d){b.getRecentEvent().preventDefault(),c.customerLogin(a(d))}return{login:d}},["AuthenticationService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Basket",function(c){function d(d){b.getRecentEvent().preventDefault();var e={},f=a(d),g=f.parents("form");e.BasketItemItemID=g.find('[name="ArticleID"]').val(),e.BasketItemPriceID=g.find('[name="SYS_P_ID"]').val(),e.BasketItemQuantity=g.find('[name="ArticleQuantity"]').val(),e.BasketItemBranchID=g.find('[name="source_category"]').val();var h=g.find('[name^="ArticleAttribute"]'),i=[];a.each(h,function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&i.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=i.length&&(e.BasketItemAttributesList=i),c.addItem([e])}function e(b,c){var d=a(b),e=d.parent().find("input"),f=parseInt(e.attr("maxlength"))||5,g=parseInt(e.val())+c,h=d.parents("[data-basket-item-id]").length>0;if(h){(g+"").length<=f&&g>=0&&e.val(g);var i=d.data("timeout");i&&window.clearTimeout(i),i=window.setTimeout(function(){e.trigger("change")},1e3),d.data("timeout",i)}else(g+"").length<=f&&g>=1&&e.val(g)}function f(b,d){c.setItemQuantity(b,parseInt(a(d).val())).fail(function(){var e=c.getItem(b);a(d).val(e.BasketItemQuantity)})}return{addBasketItem:d,changeItemQuantity:e,setItemQuantity:f}},["BasketService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Checkout",function(a){function b(b){a.setMethodOfPayment(b)}function c(b){a.confirmAtrigaPaymax(b)}return{setMethodOfPayment:b,confirmAtrigaPaymax:c}},["CheckoutService"])}(jQuery,PlentyFramework),function(a,b){b.directive("MobileDropdown",function(c){function d(){a(window).on("orientationchange sizeChange",function(){e(k),e(l)})}function e(b,c){for(var d,e=0;e0?window.location.assign(a(c).attr("href")):window.location.assign(c))}function e(a){c.goToID(a)}return{to:d,toCheckoutTab:e}},["MediaSizeService","NavigatorService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Tab",function(c){function d(b){a(b).tab("show")}function e(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).addLabel(a)}function f(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).setContent(a)}function g(a,d,e){c.isInterval(e)&&(b.getRecentEvent().preventDefault(),j[d]&&j[d].getTab(a)&&j[d].showTab(a))}function h(){function b(a){return g[a]=new i(a),g[a]}function c(b){var c=0;if(f)c=parseInt(f.getContent().parent().css("zIndex")),f.hide(),f.getContent().parent().css("zIndex",c-1);else{for(var d in g)if(g[d].getContent()){var h=parseInt(g[d].getContent().parent().css("zIndex"));(0==c||c>h)&&(c=h),g[d].hide()}for(var d in g)g[d].getContent()&&g[d].getContent().parent().css("zIndex",c-1);a(window).on("sizeChange",e)}f=g[b],f.getContent().parent().css("zIndex",c),f.show()}function d(a){return g[a]}function e(){for(var a in g)g[a].getContent()&&g[a].show();f=null}var f,g={};return{addTab:b,showTab:c,getTab:d,resetTabs:e}}function i(a){function b(){return j}function c(a){return i.push(a),this}function d(a){return h=a,this}function e(){return h}function f(){for(var a=0;a0&&(a(document).scrollTop()>100?x(z,"addClass","visible"):x(z,"removeClass","visible"))})}function g(){e.showWaitscreen()}function h(a){e.hideWaitscreen(a)}function i(b){a(b).owlCarousel({navigation:!0,navigationText:!1,slideSpeed:1e3,paginationSpeed:1e3,singleItem:!0,autoPlay:6e3,stopOnHover:!0,afterMove:function(b){a(b).find('[data-plenty-rel="lazyload"]').trigger("appear")}})}function j(b,d,e){var f=a(b),g=0,h={},i=f.find('[data-plenty-rel="equal-target"]').length>0?f.find('[data-plenty-rel="equal-target"]'):f.children();e!==!0&&y.push(b);for(var j=i.length;j>=0;j--)h=a(i[j]),h.css("height",""),h.outerHeight(!0)>g&&(g=h.outerHeight(!0));(!d||c.isInterval(d))&&i.height(g)}function k(b){var c=a(b);c.click(function(){return a("html, body").animate({scrollTop:0},400),!1}),a.inArray(c,z)&&z.push(c)}function l(b,c){var d=a(b);d.lazyload({effect:c}),d.is("img")&&d.on("loaded",function(){d.css("display","inline-block")})}function m(b){console.log(b);var c=a(b),d=c.parent();d.addClass("animating"),c.siblings("ul").slideToggle(200,function(){d.is(".open")?d.removeClass("open"):d.addClass("open"),c.siblings("ul").removeAttr("style"),d.removeClass("animating")})}function n(b,c){var d=a(b),e=a(d.attr("data-plenty-rel"));if(d.is('input[type="radio"]')){var f=a('input[type="radio"][name="'+d.attr("name")+'"]'),g=!c||"checked"==c;f.change(function(){var b=a(this);e.parents('[data-plenty-rel="equal-target"]').css("height","auto"),b.is(":checked")&&b[0]===d[0]&&1==g?e.slideDown(400,function(){w()}):e.slideUp(400,function(){w()})})}else d.click(function(){d.addClass("animating"),e.slideToggle(400,function(){d.removeClass("animating"),d.toggleClass("active"),w()})})}function o(b,c){r(a(b),c,"slideDown")}function p(b,c){r(a(b),c,"slideUp")}function q(b,c){r(a(b),c,"slideToggle")}function r(a,b,c){b=b||400,a.parents('[data-plenty-rel="equal-target"]').css("height","auto"),a[c](b,function(){w()})}function s(b,c){var e=a(b),f=e.find('[data-plenty-rel="social-switch"]');e.append(''),f.is("off, on")||f.addClass("off"),f.on("click",function(){f.hasClass("off")&&("tooltip"==e.attr("data-toggle")&&e.tooltip("destroy"),f.removeClass("off").addClass("on"),e.find('[data-plenty-rel="social-placeholder"]').hide(),e.find(".social-container").append(d.getSocialService(c)))})}function t(d,e,f){var g=a(e);if(g.parents(".navbar-main").length>0){var h=g.children("span");return b.directives.MobileDropdown.slideDropdown(h),!0}if(e&&d&&(!f||c.isInterval(f))){var i=b.getRecentEvent();return i&&i.preventDefault(),g.toggleClass(d),!1}}function u(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).addClass(d),!1}}function v(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).removeClass(d),!1}}function w(){for(var a=y.length-1;a>=0;a--)j(y[a],"",!0)}function x(a,b,c){for(var d=a.length-1;d>=0;d--)a[d][b](c)}var y=[],z=[];return{initUIWindowEvents:f,showWaitscreen:g,hideWaitscreen:h,addContentPageSlider:i,equalHeight:j,initToTop:k,initLazyload:l,initSlideToggle:n,slideDown:o,slideUp:p,slideToggle:q,toggleHideShow:m,toggleSocialShare:s,toggleClass:t,addClass:u,removeClass:v}},["MediaSizeService","SocialShareService","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.directive("Validator",function(a){function b(b,c){return a.validate(b,c)}return{validate:b}},["ValidationService"])}(jQuery,PlentyFramework),function(a,b){b.factory("APIFactory",function(c,d){function e(){b.getGlobal("LoginSession")&&(l&&clearTimeout(l),l=setTimeout(function(){a(window).trigger("login-expired"),"Checkout"===b.getGlobal("PageDesign")&&d.prepare().setTitle(b.translate("Your session has expired.")).setContent(b.translate("Please log in again to continue shopping.")).setLabelDismiss(null).setLabelConfirm(b.translate("OK")).onConfirm(function(){window.location.assign("/")}).onDismiss(function(){window.location.assign("/")}).show()},b.getGlobal("LoginSessionExpiration")))}function f(b){try{var d=a.parseJSON(b.responseText);c.printErrors(d.error.error_stack)}catch(e){c.throwError(b.status,b.statusText)}}function g(b,d,g,h,i){return h||c.showWaitScreen(),a.ajax(b,{type:"GET",data:d,dataType:"json",async:!i,error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function h(b,d,g,h){var i={type:"POST",dataType:"json",error:function(a){g||f(a)}};return d&&d.isFile?(i.cache=d.cache,i.processData=d.processData,i.data=d.data,i.contentType=!1):(i.data=JSON.stringify(d),i.contentType="application/json"),h||c.showWaitScreen(),a.ajax(b,i).always(function(){h||c.hideWaitScreen(),e()})}function i(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"PUT",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function j(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"DELETE",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function k(){return a.Deferred().resolve()}var l=null;return a(document).ready(function(){e()}),{get:g,post:h,put:i,"delete":j,idle:k}},["UIFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a){a.factory("CMSFactory",function(a){function b(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/container_"+b.toLowerCase()+"/",c)}return{from:d}}function c(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/"+b.toLowerCase()+"/",c)}return{from:d}}function d(b){return a.get("/rest/categoryview/categorycontentbody/?categoryID="+b)}return{getContainer:b,getParams:c,getCategoryContent:d}},["APIFactory"])}(PlentyFramework),function(a){a.factory("CheckoutFactory",function(b,c,d){function e(){return l}function f(a){return m&&l||g(!0),a?$.extend(!0,{},l):m}function g(a){return b.get("/rest/checkout/",null,!1,!1,a).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function h(){return b.put("/rest/checkout",m).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function i(b){return c.getContainer("checkout"+b).from("checkout").done(function(c){$('[data-plenty-checkout-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function j(b){return c.getCategoryContent(b).done(function(c){$('[data-plenty-checkout-catcontent="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function k(b){return c.getContainer("itemview"+b).from("itemview").done(function(c){$('[data-plenty-itemview-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}var l,m;return{getCheckout:f,setCheckout:h,loadCheckout:g,reloadContainer:i,reloadCatContent:j,reloadItemContainer:k}},["APIFactory","CMSFactory","UIFactory"])}(PlentyFramework),function(a,b){b.factory("ModalFactory",function(){function c(a){return PlentyFramework.partials.Modal.isModal(a)}function d(a){return new e(a)}function e(d){function e(a){return t.title=a,this}function f(a){return t.cssClass=a,this}function g(a){return t.content=a,this}function h(a){return t.labelConfirm=a,this}function i(a){return t.labelDismiss=a,this}function j(a){return t.onConfirm=a,this}function k(a){return t.onDismiss=a,this}function l(a){return t.container=a,this}function m(a){return t.timeout=a,this}function n(){if(t.selector)u=a(t.selector);else{u=c(t.content)?PlentyFramework.partials.Modal.getModal(t.content):a(PlentyFramework.compileTemplate("modal/modal.html",t)),a(t.container).append(u);var b=a(t.content).filter("script");b.length>0&&b.each(function(b,c){var d=document.createElement("script");d.type="text/javascript",d.innerHTML=a(c).text(),a(t.container).append(d)})}PlentyFramework.partials.Modal.init(u,t),u.find('[data-plenty-modal="confirm"]').click(function(){var a=t.onConfirm();"undefined"==typeof a&&(a=!0),a&&o(!0)}),PlentyFramework.partials.Modal.show(u),t.timeout>0&&p()}function o(a){PlentyFramework.partials.Modal.hide(u),a||t.onDismiss()}function p(){x=t.timeout,y=(new Date).getTime(),v=window.setTimeout(function(){window.clearInterval(w),o()},t.timeout),u.find('[data-plenty-modal="timer"]').text(x/1e3),w=window.setInterval(function(){if(!z){var a=x-(new Date).getTime()+y;a=Math.round(a/1e3),u.find('[data-plenty-modal="timer"]').text(a)}},1e3)}function q(){z=!0,x-=(new Date).getTime()-y,window.clearTimeout(v)}function r(){z=!1,y=(new Date).getTime(),v=window.setTimeout(function(){o(),window.clearInterval(w)},x)}function s(){window.clearTimeout(v),window.clearInterval(w)}var t=this;t.selector=d,t.title="",t.cssClass="",t.content="",t.labelDismiss=b.translate("Cancel"),t.labelConfirm=b.translate("Confirm"),t.onConfirm=function(){},t.onDismiss=function(){},t.container="body",t.timeout=-1,t.hide=o,t.startTimeout=p,t.stopTimeout=s,t.pauseTimeout=q,t.continueTimeout=r;var u,v,w,x,y,z=!1;return{setTitle:e,setClass:f,setContent:g,setContainer:l,setLabelConfirm:h,setLabelDismiss:i,onConfirm:j,onDismiss:k,setTimeout:m,show:n,hide:o}}return{prepare:d,isModal:c}})}(jQuery,PlentyFramework),function(a,b){b.factory("UIFactory",function(){function c(a,b){d([{code:a,message:b}])}function d(c){(!i||a("body").has(i).length<=0)&&(i=a(b.compileTemplate("error/errorPopup.html")),a("body").append(i),b.partials.Error.init(i)),a.each(c,function(c,d){b.partials.Error.addError(i,a(b.compileTemplate("error/errorMessage.html",d)))}),b.partials.Error.show(i),f(!0)}function e(){return h=h||0,(!g||a("body").has(g).length<=0)&&(g=a(b.compileTemplate("waitscreen/waitscreen.html")),a("body").append(g)),b.partials.WaitScreen.show(g),h++,h}function f(a){return h--,(0>=h||a)&&(h=0,b.partials.WaitScreen.hide(g)),h}var g,h=0,i=null;return{throwError:c,printErrors:d,showWaitScreen:e,hideWaitScreen:f}})}(jQuery,PlentyFramework),Object.equals=function(a,b){if(a===b)return!0;if(!(a instanceof Object&&b instanceof Object))return!1;if(a.constructor!==b.constructor)return!1;for(var c in a)if(a.hasOwnProperty(c)){if(!b.hasOwnProperty(c))return!1;if(a[c]!==b[c]){if("object"!=typeof a[c])return!1;if(!Object.equals(a[c],b[c]))return!1}}for(var c in b)if(b.hasOwnProperty(c)&&!a.hasOwnProperty(c))return!1;return!0},PlentyFramework.cssClasses={active:"active"},function(a,b){b.partials.Error={init:function(c){a(c).find(".close").click(function(){b.partials.Error.hideAll()})},addError:function(b,c){var d=a(c).attr("data-plenty-error-code");a(b).find('[data-plenty-error-code="'+d+'"]').length<=0&&a(b).find(".plentyErrorBoxInner").append(c)},show:function(b){a(b).show()},hideAll:function(){a("#CheckoutErrorPane").hide(),a("#CheckoutErrorPane").find(".plentyErrorBoxInner").html("")}}}(jQuery,PlentyFramework),function(a,b){b.partials.Modal={init:function(a,b){a.on("hidden.bs.modal",function(){b.hide(),b.selector||a.remove()}),b.timeout>0&&(a.on("hide.bs.modal",b.stopTimeout),a.find(".modal-content").hover(function(){b.pauseTimeout()},function(){a.is(".in")&&b.continueTimeout()}))},show:function(a){a.modal("show")},hide:function(a){a.modal("hide")},isModal:function(b){return a(b).filter(".modal").length+a(b).find(".modal").length>0},getModal:function(b){var c=a(b);return c.length>1&&(c=a(b).filter(".modal")||a(b).find(".modal")),c}}}(jQuery,PlentyFramework),function(a){a(document).on("initPartials",function(b,c){a(c).find('[data-toggle="tooltip"]').tooltip({container:"body"})})}(jQuery),function(a,b){b.partials.WaitScreen={show:function(a){a.addClass("in")},hide:function(a){a.removeClass("in")}}}(jQuery,PlentyFramework),function(a,b){b.service("AddressDoctorService",function(c){function d(b){var c=!0;return b=b||"[data-plenty-address-doctor]",a(b).filter("[data-plenty-address-doctor]:visible").each(function(b,d){var f=new e(d),g=a(d).attr("data-plenty-address-doctor").replace(/\s/g,"").split(",");f.isValid(g)||(c=!1)}),c}function e(c){function d(a){return j()?!0:(k=new f(m.getFormValues()),l=a,e(),1==k.getAddresses().length)}function e(){a(".suggestion-list").remove();for(var b=!1,c=0;cc;c++){var d=a.data[c],f=e(d);f?f.HouseNo.push(d.HouseNo):(d.HouseNo=[d.HouseNo],j.push(d))}})}function e(a){for(var b=j.length,c=0;b>c;c++)if(a.Street==j[c].Street&&j.ZIP==j[c].ZIP&&a.City==j[c].City)return j[c];return null}function f(){return j}function g(b){for(var c=[],d=j.length,e=0;d>e;e++){var f=j[e];a.inArray(f[b],c)<0&&c.push(f[b])}return c}function h(a){for(var b=[],c=j.length,d=0;c>d;d++){var e=j[d];(a.Street&&a.Street==e.Street||a.ZIP&&a.ZIP==e.ZIP||a.City&&a.City==e.City)&&b.push(e)}j=b}function i(a){a=parseInt(a);for(var b=j.length,c=0;b>c;c++)for(var d=j[c],e=0;e=f[0]&&a<=f[1])return!0}return!1}var j=[];return d(),{getAddresses:f,getList:g,filter:h,houseNoAllowed:i}}return{validateAddress:d}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("AuthenticationService",function(c,d,e){function f(){var b=a('[data-plenty-checkout="lostPasswordForm"]');if(b.validateForm()){var d=b.getFormValues(),e={Email:d.Email};return c.post("/rest/checkout/lostpassword/",e).done(function(b){1==b.data.IsMailSend&&(a('[data-plenty-checkout="lostPasswordTextContainer"]').hide(),a('[data-plenty-checkout="lostPasswordSuccessMessage"]').show())})}}function g(a){if(a.validateForm()){var b=a.getFormValues(),d={Email:b.loginMail,Password:b.loginPassword};return e.showWaitScreen(),c.post("/rest/checkout/login/",d).done(function(){window.location.assign(a.attr("action"))})}}function h(a){return c.post("/rest/checkout/customerinvoiceaddress/",a).done(function(a){d.getCheckout().CustomerInvoiceAddress=a.data})}function i(){var c=a('[data-plenty-checkout-form="customerRegistration"]');if(c.validateForm()&&b.getInstance().AddressDoctorService.validateAddress()){var d=c.getFormValues();if(d.LoginType=2,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var f in e)e[f]&&d.CustomerPropertiesList.push({PropertyID:f,PropertyValue:e[f]})}return h(d).done(function(){window.location.assign(c.attr("action"))})}}return{resetPassword:f,customerLogin:g,setInvoiceAddress:h,registerCustomer:i}},["APIFactory","CheckoutFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("BasketService",function(c,d,e,f,g){function h(d){d&&c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:d[0].BasketItemItemID,quantity:d[0].BasketItemQuantity},!1,!0).done(function(c){c.data[0].indexOf("form-group")>0?g.prepare().setContent(c.data[0]).setTitle(b.translate("Select order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(j(i(d)),!0):!1}).show():j(d)})}function i(b){var c,d=a('[data-plenty-checkout-form="OrderParamsForm"]'),e={},f="";return d.find('[name^="ParamGroup"]').each(function(){c=this.name.match(/^ParamGroup\[(\d+)]\[(\d+)]$/),b=m(b,c[1],a(this).val(),a(this).val())}),d.find('[name^="ParamValue"]').each(function(){if(e=a(this),f=e.attr("type"),("checkbox"==f&&e.is(":checked")||"radio"==f&&e.is(":checked")||"radio"!=f&&"checkbox"!=f)&&"file"!=f&&"hidden"!=f){var c=e[0].name.match(/^ParamValue\[(\d+)]\[(\d+)]$/);b=m(b,c[1],c[2],e.val())}else if("file"==f)if(e[0].files&&e[0].files.length>0)b=l(e,b);else{var c=e[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/),d=a('input[type="hidden"][name="ParamValue['+c[1]+"]["+c[2]+']"]').val();b=m(b,c[1],c[2],d)}}),b}function j(a){c.post("/rest/checkout/basketitemslist/",a,!0).done(function(){f.loadCheckout().done(function(){s(),e.getContainer("ItemViewItemToBasketConfirmationOverlay",{ArticleID:a[0].BasketItemItemID}).from("ItemView").done(function(a){var c=b.getGlobal("TimeoutItemToBasketOverlay",5e3),d=g.prepare().setContent(a.data[0]);c>0&&d.setTimeout(c),d.show()})})}).fail(function(a){d.printErrors(JSON.parse(a.responseText).error.error_stack)})}function k(a){c.put("/rest/checkout/basketitemslist/",a).done(function(){f.reloadCatContent(b.getGlobal("basketCatID")),f.loadCheckout().done(function(){s()})})}function l(a,b){var d,e,f=a[0].id,g={},h=[],i={type:"POST",data:{},isFile:!0,cache:!1,dataType:"json",processData:!1,contentType:!1};g[f]=a[0].files,-1==h.indexOf(f)&&h.push(f);for(var j=0,k=h.length;k>j;++j)d=new FormData,e=g[h[j]],d.append("0",e[0],e[0].name),i.data=d,c.post("/rest/checkout/orderparamfile/",i);var l=a[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/);return m(b,l[1],l[2],g[f][0].name)}function m(b,c,d,e){return c>0&&void 0==b[c]&&(b[c]=a.extend(!0,{},b[0]),b[c].BasketItemOrderParamsList=[]),void 0!=b[c]&&(b[c].BasketItemQuantity=1,void 0==b[c].BasketItemOrderParamsList&&(b[c].BasketItemOrderParamsList=[]),e&&b[c].BasketItemOrderParamsList.push({BasketItemOrderParamID:d,BasketItemOrderParamValue:e})),b}function n(b){var c=a('[data-plenty-basket-item="'+b+'"]');c.modal("show"),c.find('[data-plenty-modal="confirm"]').on("click",function(){var d=p(b),e=[];c.find('select, .PlentyFormContainer.AttrImage > input[type="hidden"]').each(function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&e.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=e.length&&(d.BasketItemAttributesList=e),k([d])})}function o(d){var e=p(d);e.BasketItemOrderParamsList=[],c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:e.BasketItemItemID,quantity:e.BasketItemQuantity,basketItemID:d}).done(function(c){g.prepare().setContent(c.data[0]).setTitle(b.translate("Edit order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(k(i([e])),!0):!1}).show()})}function p(a){for(var b=f.getCheckout().BasketItemsList,c=0;c=0?c.get("/rest/checkout/container_checkoutbasketitemslist/").done(function(c){var d=a("[data-basket-item-id]").parents("ul"),e=d.parents(".panel-body");d.fadeOut(function(){a(this).siblings(":not('[data-plenty-checkout-template]')").remove(),a(this).remove(),e.prepend(a(c.data[0])).hide().fadeIn(function(){b.getInstance().bindDirectives(e)})})}):f.reloadContainer("BasketItemsList"),f.reloadContainer("Totals")),s(),i.resolve()})})}var i=a.Deferred(),j=p(d).BasketItemNameMap[1];return e?h():g.prepare().setTitle(b.translate("Please confirm")).setContent("

    "+b.translate('Do you really want to remove "{{item}}" from your basket?',{item:j})+"

    ").onDismiss(function(){i.reject()}).onConfirm(function(){h()}).setLabelConfirm(b.translate("Delete")).show(),i}function r(d,e){if(0>=e)return q(d);for(var g,h,i=a.Deferred(),j=f.getCheckout().BasketItemsList,k=0;k0&&f.reloadContainer("Totals")}return{addItem:h,removeItem:q,getItem:p,setItemQuantity:r,editItemAttributes:n,editOrderParams:o,addCoupon:t,removeCoupon:u}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("CheckoutService",function(c,d,e,f,g){function h(){f.loadCheckout(!0)}function i(){var b=a('[data-plenty-checkout-form="details"]'),d=b.getFormValues();return f.getCheckout().CheckoutCustomerSign||(f.getCheckout().CheckoutCustomerSign=""),f.getCheckout().CheckoutOrderInfoText||(f.getCheckout().CheckoutOrderInfoText=""),f.getCheckout().CheckoutCustomerSign!==d.CustomerSign&&a(b).find('[name="CustomerSign"]').length>0||f.getCheckout().CheckoutOrderInfoText!==d.OrderInfoText&&a(b).find('[name="OrderInfoText"]').length>0?(f.getCheckout().CheckoutCustomerSign=d.CustomerSign,f.getCheckout().CheckoutOrderInfoText=d.OrderInfoText,f.setCheckout()):c.idle()}function j(d){var e=a('[data-plenty-checkout-form="shippingAddress"]');if(!d&&!e.validateForm())return!1;if(!d&&!b.getInstance().AddressDoctorService.validateAddress(e))return!1;var g=e.getFormValues(),h=a('[name="shippingAddressID"]:checked').val();if(0>h){var i=g;return m(i,f.getCheckout().CustomerShippingAddress)?c.idle():("PACKSTATION"==i.Street?(i.IsPackstation=1,i.PackstationNo=i.HouseNo):"POSTFILIALE"==i.Street&&(i.IsPostfiliale=1,i.PostfilialNo=i.HouseNo),c.post("/rest/checkout/customershippingaddress/",i).done(function(a){f.getCheckout().CheckoutCustomerShippingAddressID=a.data.ID,f.getCheckout().CheckoutShippingCountryID=a.data.CountryID,k()}))}return h==f.getCheckout().CheckoutCustomerShippingAddressID?c.idle():(f.getCheckout().CheckoutCustomerShippingAddressID=h,void k())}function k(){return delete f.getCheckout().CheckoutMethodOfPaymentID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList"),f.reloadContainer("ShippingProfilesList"),2==f.getCheckout().CustomerInvoiceAddress.LoginType&&f.reloadContainer("CustomerShippingAddress"),a("#shippingAdressSelect").modal("hide"),a(".modal-backdrop")&&a(".modal-backdrop").remove()})}function l(){var b=a('[data-plenty-checkout-form="guestRegistration"]'),d=b.getFormValues();if(d.LoginType=1,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var g in e)e[g]&&d.CustomerPropertiesList.push({PropertyID:g,PropertyValue:e[g]})}return m(d,f.getCheckout().CustomerInvoiceAddress)?j():c.post("/rest/checkout/customerinvoiceaddress/",d).done(function(a){j().done(f.loadCheckout)})}function m(a,b){for(var c in a)if(a[c]+""!=b[c]+""&&"EmailRepeat"!==c)return!1;return!0}function n(){var b=a('[data-plenty-checkout-form="shippingProfileSelect"]').getFormValues();return f.getCheckout().CheckoutShippingProfileID=b.ShippingProfileID,delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutMethodOfPaymentID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList")})}function o(){var b=f.getCheckout().CheckoutMethodOfPaymentID,e=a('input[type="radio"][name="MethodOfPaymentID"][value="'+b+'"]').parent().getFormValues();return c.post("/rest/checkout/preparepayment/",e,!0).done(function(b){if(""!=b.data.CheckoutMethodOfPaymentRedirectURL)document.location.assign(b.data.CheckoutMethodOfPaymentRedirectURL);else if(b.data.CheckoutMethodOfPaymentAdditionalContent){var c=a(b.data.CheckoutMethodOfPaymentAdditionalContent).find('[data-plenty-checkout-form="bankDetails"]').length>0;g.prepare().setContent(b.data.CheckoutMethodOfPaymentAdditionalContent).onConfirm(function(){return c?s():u()}).show()}}).fail(function(b){try{for(var c=a.parseJSON(b.responseText),e=[],g=0;g0&&d.printErrors(e)}catch(h){d.throwError(b.status,b.statusText)}})}function p(c){return c||(c=a('input[name="MethodOfPaymentID"]:checked').val()),f.getCheckout().CheckoutMethodOfPaymentID=c,b.getGlobal("Checkout.AtrigaRequireUserConfirmation")||(f.getCheckout().CheckoutAtrigapaymaxChecked=!0),delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("ShippingProfilesList")})}function q(a){return f.getCheckout().CheckoutAtrigapaymaxChecked=!!a,c.put("/rest/checkout",{CheckoutAtrigapaymaxChecked:!!a})}function r(){e.getContainer("CheckoutPaymentInformationBankDetails").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return s()}).show()})}function s(){var b=a('[data-plenty-checkout-form="bankDetails"]');if(b.validateForm()){var d=b.getFormValues().checkout.customerBankDetails,e={CustomerBankName:d.bankName,CustomerBLZ:d.blz,CustomerAccountNumber:d.accountNo,CustomerAccountOwner:d.accountOwner,CustomerIBAN:d.iban,CustomerBIC:d.bic};return c.post("/rest/checkout/paymentinformationbankdetails/",e).done(function(){f.loadCheckout().done(function(){p(3),f.reloadContainer("MethodsOfPaymentList")})}),!0}return!1}function t(){e.getContainer("CheckoutPaymentInformationCreditCard").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return u()}).show()})}function u(){var b=a('[data-plenty-checkout-form="creditCard"]');if(b.validateForm()){var d=b.getFormValues().checkout.paymentInformationCC,e={Owner:d.owner,Cvv2:d.cvv2,Number:d.number,Year:d.year,Month:d.month,Provider:d.provider};return c.post("/rest/checkout/paymentinformationcreditcard/",e).done(function(){f.loadCheckout()}),!0}return!1}function v(b){if(2==f.getCheckout().CustomerInvoiceAddress.LoginType)var c=a('[data-plenty-checkout-form="shippingAddress"]').getFormValues();else var c=a('[data-plenty-checkout-form="guestRegistration"]').getFormValues();var d={street:c.Street,houseNo:c.HouseNo,ZIP:c.ZIP,city:c.City,postnummer:c.Postnummer,suggestionType:"postfinder"};e.getContainer("CheckoutAddressSuggestionResultsList",d).from("Checkout").done(function(a){g.prepare().setContent(a.data[0]).show()})}function w(){var b=a('[data-plenty-checkout-form="placeOrder"]');if(b.validateForm()){var d=b.getFormValues(),e={TermsAndConditionsCheck:d.termsAndConditionsCheck||0,WithdrawalCheck:d.withdrawalCheck||0,PrivacyPolicyCheck:d.privacyPolicyCheck||0,AgeRestrictionCheck:d.ageRestrictionCheck||0,NewsletterCheck:d.newsletterCheck||0,KlarnaTermsAndConditionsCheck:d.klarnaTermsAndConditionsCheck||0,PayoneDirectDebitMandateCheck:d.payoneDirectDebitMandateCheck||0,PayoneInvoiceCheck:d.payoneInvoiceCheck||0};return c.post("/rest/checkout/placeorder/",e).done(function(a){""!=a.data.MethodOfPaymentRedirectURL?window.location.assign(a.data.MethodOfPaymentRedirectURL):""!=a.data.MethodOfPaymentAdditionalContent?g.prepare().setContent(a.data.MethodOfPaymentAdditionalContent).setLabelDismiss("").onDismiss(function(){window.location.assign(b.attr("action"))}).onConfirm(function(){window.location.assign(b.attr("action"))}).show():window.location.assign(b.attr("action"))})}}return{init:h,setCustomerSignAndInfo:i,registerGuest:l,setShippingProfile:n,saveShippingAddress:j,loadAddressSuggestion:v,preparePayment:o,setMethodOfPayment:p,confirmAtrigaPaymax:q,editBankDetails:r,editCreditCard:t,placeOrder:w}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("FeedbackService",function(a){function b(){function b(a,b){return e.dateStart=a,e.dateEnd=b,this}function c(b,c,f){var g={ReferenceId:c,FromDate:e.dateStart,ToDate:e.dateEnd,FeedbackType:f||d().COMMENTS_AND_RATINGS};return a.get("/rest/feedback/"+b+"/",g)}var e={dateStart:null,dateEnd:null};return{between:b,"for":c}}function c(){function b(a){return f.Rating=a,this}function c(a){return f.Text=a,this}function d(a,b,c){return f.Author=a,b&&(f.Email=b),c&&(f.CustomerId=c),this}function e(b,c){return a.post("/rest/feedback/"+b+"/",f)}var f={Rating:1,Text:"",Author:"",Email:"",CustomerId:0};return{withRating:b,withComment:c,withAuthor:d,to:e}}function d(){return{COMMENTS_ONLY:"comments_only",RATINGS_ONLY:"ratings_only",COMMENTS_AND_RATINGS:"comments_with_ratings"}}function e(){return{ITEM:"item",CATEGORY:"category",BLOG:"blog"}}return{getFeedbacks:b,addFeedback:c,ArticleTypes:e(),FeedbackTypes:d()}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("MediaSizeService",function(){function b(){return e&&c(),e}function c(){var b;if(b=window.matchMedia?window.matchMedia("(min-width:1200px)").matches?"lg":window.matchMedia("(min-width:992px)").matches?"md":window.matchMedia("(min-width:768px)").matches?"sm":"xs":a(window).width()>=1200?"lg":a(window).width()>=992?"md":a(window).width()>=768?"sm":"xs",b!=e||"xs"===b){var c=e;e=b,a(window).trigger("sizeChange",[e,c])}}function d(a){for(var b=a.replace(/\s/g,"").split(","),c=0;c li'),r=a('[data-plenty-checkout="container"] > div'),u=a('[data-plenty-checkout="next"]'),t=a('[data-plenty-checkout="prev"]'),q.length==r.length&&r.length>0){d.getCheckout();r.hide(),q.each(function(b,c){a(c).addClass("disabled"),a(c).click(function(){a(this).is(".disabled")||j(b)})}),u.attr("disabled","disabled"),u.click(function(){m()}),t.attr("disabled","disabled"),t.click(function(){n()}),window.addEventListener("hashchange",function(){window.location.hash.length>0?o(window.location.hash):j(0)},!1),a.urlParam=function(a){var b=new RegExp("[?&]"+a+"=([^&#]*)").exec(window.location.href);return null==b?null:b[1]||0};var c=a.urlParam("gototab");0==window.location.hash.length&&c&&a('[data-plenty-checkout-id="'+c+'"]').length>0?window.location.hash=c:j(!o(window.location.hash)&&s>=0?s:0),p(),a(window).on("sizeChange",p),a(window).resize(function(){"xs"==b.getInstance().MediaSizeService.interval()&&p()})}}function f(){return s>=0?{id:a(r[s]).attr("data-plenty-checkout-id"),index:s}:null}function g(a){return v.beforeChange.push(a),b.getInstance().NavigatorService}function h(a){return v.afterChange.push(a),b.getInstance().NavigatorService}function i(b,c){var d=!0;if(s>=0||"afterChange"===b){var e=f(),g={index:c,id:a(r[c]).attr("data-plenty-checkout-id")};a.each(v[b],function(a,b){return b(e,g)===!1?(d=!1,!1):void 0})}return d}function j(e,f){var g=s!==e;(!g||f||i("beforeChange",e))&&(s=e,!Object.equals(w[s],d.getCheckout(!0))&&g&&a(r[s]).attr("data-plenty-checkout-content")?(w[s]=d.getCheckout(!0),c.getCategoryContent(a(r[s]).attr("data-plenty-checkout-content")).done(function(c){a(r[s]).html(c.data[0]),k(g),b.getInstance().bindDirectives(r[s]),a(window).trigger("contentChanged")})):k(g))}function k(b){a(r).hide();var c;a(q).each(function(b,d){c=a(d),c.removeClass("disabled active"),c.find('[role="tab"]').attr("aria-selected","false"),s>b?c.addClass("visited"):b==s?(c.addClass("active visited"),c.find('[role="tab"]').attr("aria-selected","true")):b>s&&!c.is(".visited")&&c.addClass("disabled")}),p(),0>=s?t.attr("disabled","disabled"):t.removeAttr("disabled"),s+1==q.length?u.attr("disabled","disabled"):u.removeAttr("disabled"),a(r[s]).show(),s>0?window.location.hash=a(r[s]).attr("data-plenty-checkout-id"):window.location.hash.length>0&&(window.location.hash=""),b&&i("afterChange",s)}function l(a){j(a.index,!0)}function m(){s0&&j(s-1)}function o(b){return"next"==b?(m(),!0):"prev"==b?(n(),!0):(b=b.replace("#",""),a(r).each(function(c,d){return a(d).attr("data-plenty-checkout-id")==b?(j(c),!0):void 0}),!1)}function p(){var b=q.length;if(!(0>=b)){a(q).removeAttr("style"),a(q).children("span").removeAttr("style"),a(u).removeAttr("style"),a(t).removeAttr("style");var c=a(t).outerWidth()c?a(d).children("span").css({paddingLeft:g+"px",paddingRight:h+"px"}):a(d).children("span").css({paddingLeft:j+"px",paddingRight:k+"px"})})}}var q=[],r=[],s=-1,t={},u={},v={beforeChange:[],afterChange:[]},w=[];return{init:e,getCurrentContainer:f,goTo:j,beforeChange:g,afterChange:h,continueChange:l,next:m,previous:n,goToID:o,fillNavigation:p}},["CMSFactory","CheckoutFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("PostfinderService",function(c,d,e){function f(){var b=a('input[name="Street"]').val();return"PACKSTATION"==b.toUpperCase()||"POSTFILIALE"==b.toUpperCase()}function g(){j={PostfinderItemStreet:a('input[name="Street"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemZIP:a('input[name="ZIP"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemCity:a('input[name="City"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemHouseNo:a('input[name="HouseNo"]','[data-plenty-checkout-form="shippingAddress"]')},j.PostfinderItemStreet.val(""),j.PostfinderItemZIP.val().length>2||j.PostfinderItemCity.val().length>2?c.get("/rest/checkout/shippingaddresspostfinderlist/",{suggestionType:"postfinder",zip:j.PostfinderItemZIP.val(),city:j.PostfinderItemCity.val()}).done(function(c){l=c.data,k=l.length,0==k&&h();for(var e={addresses:[]},f=0;k>f;f++){var g="km",m=l[f].PostfinderItemDistance,n=m/1e3;n=(Math.round(100*n)/100).toFixed(2).replace(".",","),1e3>m&&(n=m,g="m"),e.addresses.push({index:f,dimension:g,type:l[f].PostfinderItemIsPackstation?"Packstation":"Postfiliale",number:l[f].PostfinderItemIsPackstation?l[f].PostfinderItemPackstationNo:l[f].PostfinderItemPostfilialNo,street:l[f].PostfinderItemStreet,houseNo:l[f].PostfinderItemHouseNo,zip:l[f].PostfinderItemZIP,city:l[f].PostfinderItemCity,district:l[f].PostfinderItemDistrict,distance:n,remark:l[f].PostfinderItemRemark})}var o=b.compileTemplate("addressSuggestions/postFinder.html",e);d.prepare().setTitle(b.translate("Packstations and post offices in your area")).setContent(o).setClass("checkout").onConfirm(function(){return j.PostfinderItemCity.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemZIP.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemStreet.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemStreet.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemHouseNo.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemHouseNo.attr("id")+'"]').removeClass("has-error").addClass("has-success"),i=a('input[type="radio"][name="postfinder"]:checked').val(),l[i].PostfinderItemIsPackstation?(a(j.PostfinderItemStreet).val("PACKSTATION"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPackstationNo)):(a(j.PostfinderItemStreet).val("POSTFILIALE"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPostfilialNo)),a(j.PostfinderItemStreet).trigger("change"),a(j.PostfinderItemCity).val(l[i].PostfinderItemCity),a(j.PostfinderItemZIP).val(l[i].PostfinderItemZIP),!0}).show()}):h()}function h(){e.throwError(0,b.translate("Please enter a ZIP code and/or a city.")),j.PostfinderItemCity.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemZIP.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemCity.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")}),j.PostfinderItemZIP.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")})}var i="",j={},k={},l={};return{openPostfinderModal:g,isPackstation:f}},["APIFactory","ModalFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("SocialShareService",function(){function b(a){var b={"facebook-like":'',"facebook-recommend":'',twitter:'',"google-plus":'
    '};return b[a]}function c(){var b=document.location.href,c=a("link[rel=canonical]").attr("href");return c&&c.length>0&&(c.indexOf("http")<0&&(c=document.location.protocol+"//"+document.location.host+c),b=c),b}function d(b){var c=a('meta[name="'+b+'"]').attr("content");return c||""}function e(){var b=d("DC.title"),c=d("DC.creator");return b.length>0&&c.length>0?b+=" - "+c:b=a("title").text(),encodeURIComponent(b)}return"undefined"==typeof socialLangLocale&&(socialLangLocale="en_US"),"undefined"==typeof socialLang&&(socialLang="en"),{getSocialService:b}})}(jQuery,PlentyFramework),function(a,b){b.service("ValidationService",function(){function b(b){return b=a(b),b.is("input")||b.is("select")||b.is("textarea")?b:b.find("input").length>0?b.find("input"):b.find("select").length>0?b.find("select"):b.find("textarea").length>0?b.find("textarea"):null}function c(b){return b.is("input")||b.is("select")||b.is("textarea")?a.trim(b.val()).length>0:(console.error("Validation Error: Cannot validate Text for <"+b.prop("tagName")+">"),!1)}function d(b){var d=/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;return c(b)?d.test(a.trim(b.val())):!1}function e(b){return c(b)?a.isNumeric(a.trim(b.val())):!1}function f(b,c){return a(c).length>0?a.trim(b.val())==a.trim(a(c).val()):a.trim(b.val())==c}function g(a){return a.is(":visible")}function h(a){return a.is(":enabled")}function i(i,j){var k,l,m,n,o,p,q,r,s,t,u,v=a(i);j=j||"has-error";var w=[],x=!1;v.find("[data-plenty-validate], :required").each(function(i,y){s=a(y).attr("data-plenty-validate"),l=b(y),t=s?s:"text",t=t.split(",");for(var i=0,z=l.length;z>i;i++){if(k=a(l[i]),u=k.attr("type"),!g(k)||!h(k))return;if(m=t[i].trim()||t[0].trim(),n=!1,k.is("input")&&"radio"!=u&&"checkbox"!=u||k.is("textarea"))switch(m){case"text":n=!c(k);break;case"mail":n=!d(k);break;case"number":n=!e(k);break;case"value":n=!f(k,a(y).attr("data-plenty-validation-value"));break;case"none":break;default:console.error('Form validation error: unknown validate property: "'+s+'"')}else if(!k.is("input")||"radio"!=u&&"checkbox"!=u){if(!k.is("select"))return void console.error("Form validation error: "+a(y).prop("tagName")+" does not contain an form element");n=""==k.val()||"-1"==k.val()}else{if(o=k.attr("name"),p=v.find('input[name="'+o+'"]:checked').length,"radio"==u)q=1,r=1;else{var A=new Function("return "+s)()||{min:1,max:1};q=A.min,r=A.max}n=q>p||p>r}n&&(x=!0,w.push(k),l.length>1?(k.addClass(j),v.find('label[for="'+k.attr("id")+'"]').addClass(j)):a(y).addClass(j))}}),v.on("validationFailed",function(){var b=50,c=v.find("."+j).first(),d=c.offset().top,e=a("html, body");v.parents(".modal").length>0?(e=v.parents(".modal").find(".modal-body"), +var TemplateCache={};TemplateCache["addressSuggestions/addressDoctor.html"]='',TemplateCache["addressSuggestions/postFinder.html"]='{{#addresses}}\n
    \n
    \n \n
    \n
    \n{{/addresses}}\n',TemplateCache["error/errorMessage.html"]='
    \n Code {{code}}:\n {{{message}}}\n
    \n',TemplateCache["error/errorPopup.html"]='
    \n \n
    \n
    \n
    \n',TemplateCache["modal/modal.html"]='\n',TemplateCache["waitscreen/waitscreen.html"]='
    ',function(a,b){"object"==typeof exports&&exports&&"string"!=typeof exports.nodeName?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):(a.Mustache={},b(Mustache))}(this,function(a){function b(a){return"function"==typeof a}function c(a){return p(a)?"array":typeof a}function d(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function e(a,b){return null!=a&&"object"==typeof a&&b in a}function f(a,b){return q.call(a,b)}function g(a){return!f(r,a)}function h(a){return String(a).replace(/[&<>"'\/]/g,function(a){return s[a]})}function i(b,c){function e(){if(r&&!s)for(;q.length;)delete o[q.pop()];else q=[];r=!1,s=!1}function f(a){if("string"==typeof a&&(a=a.split(u,2)),!p(a)||2!==a.length)throw new Error("Invalid tags: "+a);h=new RegExp(d(a[0])+"\\s*"),i=new RegExp("\\s*"+d(a[1])),m=new RegExp("\\s*"+d("}"+a[1]))}if(!b)return[];var h,i,m,n=[],o=[],q=[],r=!1,s=!1;f(c||a.tags);for(var y,z,A,B,C,D,E=new l(b);!E.eos();){if(y=E.pos,A=E.scanUntil(h))for(var F=0,G=A.length;G>F;++F)B=A.charAt(F),g(B)?q.push(o.length):s=!0,o.push(["text",B,y,y+1]),y+=1,"\n"===B&&e();if(!E.scan(h))break;if(r=!0,z=E.scan(x)||"name",E.scan(t),"="===z?(A=E.scanUntil(v),E.scan(v),E.scanUntil(i)):"{"===z?(A=E.scanUntil(m),E.scan(w),E.scanUntil(i),z="&"):A=E.scanUntil(i),!E.scan(i))throw new Error("Unclosed tag at "+E.pos);if(C=[z,A,y,E.pos],o.push(C),"#"===z||"^"===z)n.push(C);else if("/"===z){if(D=n.pop(),!D)throw new Error('Unopened section "'+A+'" at '+y);if(D[1]!==A)throw new Error('Unclosed section "'+D[1]+'" at '+y)}else"name"===z||"{"===z||"&"===z?s=!0:"="===z&&f(A)}if(D=n.pop())throw new Error('Unclosed section "'+D[1]+'" at '+E.pos);return k(j(o))}function j(a){for(var b,c,d=[],e=0,f=a.length;f>e;++e)b=a[e],b&&("text"===b[0]&&c&&"text"===c[0]?(c[1]+=b[1],c[3]=b[3]):(d.push(b),c=b));return d}function k(a){for(var b,c,d=[],e=d,f=[],g=0,h=a.length;h>g;++g)switch(b=a[g],b[0]){case"#":case"^":e.push(b),f.push(b),e=b[4]=[];break;case"/":c=f.pop(),c[5]=b[2],e=f.length>0?f[f.length-1][4]:d;break;default:e.push(b)}return d}function l(a){this.string=a,this.tail=a,this.pos=0}function m(a,b){this.view=a,this.cache={".":this.view},this.parent=b}function n(){this.cache={}}var o=Object.prototype.toString,p=Array.isArray||function(a){return"[object Array]"===o.call(a)},q=RegExp.prototype.test,r=/\S/,s={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},t=/\s*/,u=/\s+/,v=/\s*=/,w=/\s*\}/,x=/#|\^|\/|>|\{|&|=|!/;l.prototype.eos=function(){return""===this.tail},l.prototype.scan=function(a){var b=this.tail.match(a);if(!b||0!==b.index)return"";var c=b[0];return this.tail=this.tail.substring(c.length),this.pos+=c.length,c},l.prototype.scanUntil=function(a){var b,c=this.tail.search(a);switch(c){case-1:b=this.tail,this.tail="";break;case 0:b="";break;default:b=this.tail.substring(0,c),this.tail=this.tail.substring(c)}return this.pos+=b.length,b},m.prototype.push=function(a){return new m(a,this)},m.prototype.lookup=function(a){var c,d=this.cache;if(d.hasOwnProperty(a))c=d[a];else{for(var f,g,h=this,i=!1;h;){if(a.indexOf(".")>0)for(c=h.view,f=a.split("."),g=0;null!=c&&gi;++i)g=void 0,e=a[i],f=e[0],"#"===f?g=this.renderSection(e,b,c,d):"^"===f?g=this.renderInverted(e,b,c,d):">"===f?g=this.renderPartial(e,b,c,d):"&"===f?g=this.unescapedValue(e,b):"name"===f?g=this.escapedValue(e,b):"text"===f&&(g=this.rawValue(e)),void 0!==g&&(h+=g);return h},n.prototype.renderSection=function(a,c,d,e){function f(a){return g.render(a,c,d)}var g=this,h="",i=c.lookup(a[1]);if(i){if(p(i))for(var j=0,k=i.length;k>j;++j)h+=this.renderTokens(a[4],c.push(i[j]),d,e);else if("object"==typeof i||"string"==typeof i||"number"==typeof i)h+=this.renderTokens(a[4],c.push(i),d,e);else if(b(i)){if("string"!=typeof e)throw new Error("Cannot use higher-order sections without the original template");i=i.call(c.view,e.slice(a[3],a[5]),f),null!=i&&(h+=i)}else h+=this.renderTokens(a[4],c,d,e);return h}},n.prototype.renderInverted=function(a,b,c,d){var e=b.lookup(a[1]);return!e||p(e)&&0===e.length?this.renderTokens(a[4],b,c,d):void 0},n.prototype.renderPartial=function(a,c,d){if(d){var e=b(d)?d(a[1]):d[a[1]];return null!=e?this.renderTokens(this.parse(e),c,d,e):void 0}},n.prototype.unescapedValue=function(a,b){var c=b.lookup(a[1]);return null!=c?c:void 0},n.prototype.escapedValue=function(b,c){var d=c.lookup(b[1]);return null!=d?a.escape(d):void 0},n.prototype.rawValue=function(a){return a[1]},a.name="mustache.js",a.version="2.1.3",a.tags=["{{","}}"];var y=new n;a.clearCache=function(){return y.clearCache()},a.parse=function(a,b){return y.parse(a,b)},a.render=function(a,b,d){if("string"!=typeof a)throw new TypeError('Invalid template! Template should be a "string" but "'+c(a)+'" was given as the first argument for mustache#render(template, view, partials)');return y.render(a,b,d)},a.to_html=function(c,d,e,f){var g=a.render(c,d,e);return b(f)?void f(g):g},a.escape=h,a.Scanner=l,a.Context=m,a.Writer=n}),function(a){function b(a,b,c,d){a.on(b,function(a){return i.push(a),c.apply(null,d)}),"complete"===document.readyState&&"ready"===b&&c.apply(null,d)}function c(b){var c=a(b);c.is('input[type="checkbox"]')&&c.on("change",function(){c.is(":checked")?c.trigger("check"):c.trigger("uncheck")}),c.is('input[type="radio"]')&&c.on("change",function(){var b=c.attr("name");a('input[type="radio"][name="'+b+'"]').each(function(b,c){var d=a(c);d.is(":checked")?d.trigger("check"):d.trigger("uncheck")})})}function d(a,b){for(var c=/^(([\w]+):)?([\w]+)\.([\w]+)(\((.*)\))?$/,d=a.split(";"),e=[],f=0;f0)for(var j=h[6].match(/(['][^']+['])|([\w-]+)|(["][^"]+["])/g),k=0;k=c&&g.services.hasOwnProperty(i)){PlentyFramework.prototype.hasOwnProperty(i)||e(g.services[i],2,d),f.push(PlentyFramework.prototype[i]);continue}if(1>=c&&g.directives.hasOwnProperty(i)){PlentyFramework.directives.hasOwnProperty(i)||e(g.directives[i],1,d),f.push(PlentyFramework.directives[i]);continue}console.error('Cannot inject dependency "'+i+'": Object not found.')}else console.error("Cyclic dependency injection: "+d.join(" -> ")+" -> "+i)}3==c?PlentyFramework.factories[b.name]=b.setup.apply(null,f):2==c?PlentyFramework.prototype[b.name]=b.setup.apply(null,f):1==c&&(PlentyFramework.directives[b.name]=b.setup.apply(null,f))}var f="1.0.8",g={factories:{},services:{},directives:{}};PlentyFramework=function(){};var h=null;PlentyFramework.getInstance=function(){return h=h||new PlentyFramework},PlentyFramework.version=function(){function a(a){for(var b=f.split("."),c=a.split("."),d=0;dparseInt(c[d]))return 1}return 0}return{get:function(){return f},equals:function(b){return 0==a(b)},compare:a}}(),PlentyFramework.partials={},PlentyFramework.globals={},PlentyFramework.setGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?(console.error('Global variable "'+a+'" already exists and cannot be overridden.'),null):(PlentyFramework.globals[a]=b,PlentyFramework.globals[a])},PlentyFramework.getGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?PlentyFramework.globals[a]:b},PlentyFramework.directives={},PlentyFramework.directive=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.directives[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.prototype.bindDirectives=function(e){e=e||"html",a(e).find("[data-plenty]").each(function(e,f){var g=d(a(f).attr("data-plenty"),a(f));if(!(g.length<=0)){c(f);for(var e=0;e=0;c--)if(a==i[c].type)return i[c];return null},PlentyFramework.pushEvent=function(a){i.push(a)},PlentyFramework.service=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.services[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.factories={},PlentyFramework.factory=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.factories[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.compileTemplate=function(a,b){return b=b||{},b.translate=function(){return function(a,b){return b(PlentyFramework.translate(a))}},Mustache.render(TemplateCache[a],b)},PlentyFramework.scriptPath="",PlentyFramework.Strings={},PlentyFramework.loadLanguageFile=function(b){a.ajax({url:PlentyFramework.scriptPath+b,dataType:"json"}).done(function(a){PlentyFramework.Strings=a})},PlentyFramework.translate=function(a,b){var c;return PlentyFramework.Strings.hasOwnProperty(a)?c=PlentyFramework.Strings[a]:(c=a,console.warn('No translation found for "'+c+'".')),b&&(c=Mustache.render(c,b)),c},PlentyFramework.compile=function(){for(var a in g.factories)PlentyFramework.factories.hasOwnProperty(a)||e(g.factories[a],3);for(var b in g.services)PlentyFramework.prototype.hasOwnProperty(b)||e(g.services[b],2);for(var c in g.directives)PlentyFramework.directives.hasOwnProperty(c)||e(g.directives[c],1);for(var d=document.getElementsByTagName("SCRIPT"),f=d.length-1;f>=0;f--){var h=d[f].src.match(/(.*)\/(.*)\.js(\?\S*)?$/);if(h){PlentyFramework.scriptPath=h[1];break}}}}(jQuery),function(a,b){b.directive("Authentication",function(c){function d(d){b.getRecentEvent().preventDefault(),c.customerLogin(a(d))}return{login:d}},["AuthenticationService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Basket",function(c){function d(d){b.getRecentEvent().preventDefault();var e={},f=a(d),g=f.parents("form");e.BasketItemItemID=g.find('[name="ArticleID"]').val(),e.BasketItemPriceID=g.find('[name="SYS_P_ID"]').val(),e.BasketItemQuantity=g.find('[name="ArticleQuantity"]').val(),e.BasketItemBranchID=g.find('[name="source_category"]').val();var h=g.find('[name^="ArticleAttribute"]'),i=[];a.each(h,function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&i.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=i.length&&(e.BasketItemAttributesList=i),c.addItem([e])}function e(b,c){var d=a(b),e=d.parent().find("input"),f=parseInt(e.attr("maxlength"))||5,g=parseInt(e.val())+c,h=d.parents("[data-basket-item-id]").length>0;if(h){(g+"").length<=f&&g>=0&&e.val(g);var i=d.data("timeout");i&&window.clearTimeout(i),i=window.setTimeout(function(){e.trigger("change")},1e3),d.data("timeout",i)}else(g+"").length<=f&&g>=1&&e.val(g)}function f(b,d){c.setItemQuantity(b,parseInt(a(d).val())).fail(function(){var e=c.getItem(b);a(d).val(e.BasketItemQuantity)})}return{addBasketItem:d,changeItemQuantity:e,setItemQuantity:f}},["BasketService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Checkout",function(a){function b(b){a.setMethodOfPayment(b)}function c(b){a.confirmAtrigaPaymax(b)}return{setMethodOfPayment:b,confirmAtrigaPaymax:c}},["CheckoutService"])}(jQuery,PlentyFramework),function(a,b){b.directive("MobileDropdown",function(c){function d(){a(window).on("orientationchange sizeChange",function(){a("input").is(":focus")||(e(k),e(l))})}function e(b,c){for(var d,e=0;e0?window.location.assign(a(c).attr("href")):window.location.assign(c))}function e(a){c.goToID(a)}return{to:d,toCheckoutTab:e}},["MediaSizeService","NavigatorService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Tab",function(c){function d(b){a(b).tab("show")}function e(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).addLabel(a)}function f(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).setContent(a)}function g(a,d,e){c.isInterval(e)&&(b.getRecentEvent().preventDefault(),j[d]&&j[d].getTab(a)&&j[d].showTab(a))}function h(){function b(a){return g[a]=new i(a),g[a]}function c(b){var c=0;if(f)c=parseInt(f.getContent().parent().css("zIndex")),f.hide(),f.getContent().parent().css("zIndex",c-1);else{for(var d in g)if(g[d].getContent()){var h=parseInt(g[d].getContent().parent().css("zIndex"));(0==c||c>h)&&(c=h),g[d].hide()}for(var d in g)g[d].getContent()&&g[d].getContent().parent().css("zIndex",c-1);a(window).on("sizeChange",e)}f=g[b],f.getContent().parent().css("zIndex",c),f.show()}function d(a){return g[a]}function e(){for(var a in g)g[a].getContent()&&g[a].show();f=null}var f,g={};return{addTab:b,showTab:c,getTab:d,resetTabs:e}}function i(a){function b(){return j}function c(a){return i.push(a),this}function d(a){return h=a,this}function e(){return h}function f(){for(var a=0;a0&&(a(document).scrollTop()>100?x(z,"addClass","visible"):x(z,"removeClass","visible"))})}function g(){e.showWaitscreen()}function h(a){e.hideWaitscreen(a)}function i(b){a(b).owlCarousel({navigation:!0,navigationText:!1,slideSpeed:1e3,paginationSpeed:1e3,singleItem:!0,autoPlay:6e3,stopOnHover:!0,afterMove:function(b){a(b).find('[data-plenty-rel="lazyload"]').trigger("appear")}})}function j(b,d,e){var f=a(b),g=0,h={},i=f.find('[data-plenty-rel="equal-target"]').length>0?f.find('[data-plenty-rel="equal-target"]'):f.children();e!==!0&&y.push(b);for(var j=i.length;j>=0;j--)h=a(i[j]),h.css("height",""),h.outerHeight(!0)>g&&(g=h.outerHeight(!0));(!d||c.isInterval(d))&&i.height(g)}function k(b){var c=a(b);c.click(function(){return a("html, body").animate({scrollTop:0},400),!1}),a.inArray(c,z)&&z.push(c)}function l(b,c){var d=a(b);d.lazyload({effect:c}),d.is("img")&&d.on("loaded",function(){d.css("display","inline-block")})}function m(b){console.log(b);var c=a(b),d=c.parent();d.addClass("animating"),c.siblings("ul").slideToggle(200,function(){d.is(".open")?d.removeClass("open"):d.addClass("open"),c.siblings("ul").removeAttr("style"),d.removeClass("animating")})}function n(b,c){var d=a(b),e=a(d.attr("data-plenty-rel"));if(d.is('input[type="radio"]')){var f=a('input[type="radio"][name="'+d.attr("name")+'"]'),g=!c||"checked"==c;f.change(function(){var b=a(this);e.parents('[data-plenty-rel="equal-target"]').css("height","auto"),b.is(":checked")&&b[0]===d[0]&&1==g?e.slideDown(400,function(){w()}):e.slideUp(400,function(){w()})})}else d.click(function(){d.addClass("animating"),e.slideToggle(400,function(){d.removeClass("animating"),d.toggleClass("active"),w()})})}function o(b,c){r(a(b),c,"slideDown")}function p(b,c){r(a(b),c,"slideUp")}function q(b,c){r(a(b),c,"slideToggle")}function r(a,b,c){b=b||400,a.parents('[data-plenty-rel="equal-target"]').css("height","auto"),a[c](b,function(){w()})}function s(b,c){var e=a(b),f=e.find('[data-plenty-rel="social-switch"]');e.append(''),f.is("off, on")||f.addClass("off"),f.on("click",function(){f.hasClass("off")&&("tooltip"==e.attr("data-toggle")&&e.tooltip("destroy"),f.removeClass("off").addClass("on"),e.find('[data-plenty-rel="social-placeholder"]').hide(),e.find(".social-container").append(d.getSocialService(c)))})}function t(d,e,f){var g=a(e);if(g.parents(".navbar-main").length>0){var h=g.children("span");return b.directives.MobileDropdown.slideDropdown(h),!0}if(e&&d&&(!f||c.isInterval(f))){var i=b.getRecentEvent();return i&&i.preventDefault(),g.toggleClass(d),!1}}function u(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).addClass(d),!1}}function v(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).removeClass(d),!1}}function w(){for(var a=y.length-1;a>=0;a--)j(y[a],"",!0)}function x(a,b,c){for(var d=a.length-1;d>=0;d--)a[d][b](c)}var y=[],z=[];return{initUIWindowEvents:f,showWaitscreen:g,hideWaitscreen:h,addContentPageSlider:i,equalHeight:j,initToTop:k,initLazyload:l,initSlideToggle:n,slideDown:o,slideUp:p,slideToggle:q,toggleHideShow:m,toggleSocialShare:s,toggleClass:t,addClass:u,removeClass:v}},["MediaSizeService","SocialShareService","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.directive("Validator",function(a){function b(b,c){return a.validate(b,c)}return{validate:b}},["ValidationService"])}(jQuery,PlentyFramework),function(a,b){b.factory("APIFactory",function(c,d){function e(){b.getGlobal("LoginSession")&&(l&&clearTimeout(l),l=setTimeout(function(){a(window).trigger("login-expired"),"Checkout"===b.getGlobal("PageDesign")&&d.prepare().setTitle(b.translate("Your session has expired.")).setContent(b.translate("Please log in again to continue shopping.")).setLabelDismiss(null).setLabelConfirm(b.translate("OK")).onConfirm(function(){window.location.assign("/")}).onDismiss(function(){window.location.assign("/")}).show()},b.getGlobal("LoginSessionExpiration")))}function f(b){try{var d=a.parseJSON(b.responseText);c.printErrors(d.error.error_stack)}catch(e){c.throwError(b.status,b.statusText)}}function g(b,d,g,h,i){return h||c.showWaitScreen(),a.ajax(b,{type:"GET",data:d,dataType:"json",async:!i,error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function h(b,d,g,h){var i={type:"POST",dataType:"json",error:function(a){g||f(a)}};return d&&d.isFile?(i.cache=d.cache,i.processData=d.processData,i.data=d.data,i.contentType=!1):(i.data=JSON.stringify(d),i.contentType="application/json"),h||c.showWaitScreen(),a.ajax(b,i).always(function(){h||c.hideWaitScreen(),e()})}function i(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"PUT",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function j(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"DELETE",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function k(){return a.Deferred().resolve()}var l=null;return a(document).ready(function(){e()}),{get:g,post:h,put:i,"delete":j,idle:k}},["UIFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a){a.factory("CMSFactory",function(a){function b(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/container_"+b.toLowerCase()+"/",c)}return{from:d}}function c(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/"+b.toLowerCase()+"/",c)}return{from:d}}function d(b){return a.get("/rest/categoryview/categorycontentbody/?categoryID="+b)}return{getContainer:b,getParams:c,getCategoryContent:d}},["APIFactory"])}(PlentyFramework),function(a){a.factory("CheckoutFactory",function(b,c,d){function e(){return l}function f(a){return m&&l||g(!0),a?$.extend(!0,{},l):m}function g(a){return b.get("/rest/checkout/",null,!1,!1,a).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function h(){return b.put("/rest/checkout",m).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function i(b){return c.getContainer("checkout"+b).from("checkout").done(function(c){$('[data-plenty-checkout-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function j(b){return c.getCategoryContent(b).done(function(c){$('[data-plenty-checkout-catcontent="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function k(b){return c.getContainer("itemview"+b).from("itemview").done(function(c){$('[data-plenty-itemview-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}var l,m;return{getCheckout:f,setCheckout:h,loadCheckout:g,reloadContainer:i,reloadCatContent:j,reloadItemContainer:k}},["APIFactory","CMSFactory","UIFactory"])}(PlentyFramework),function(a,b){b.factory("ModalFactory",function(){function c(a){return PlentyFramework.partials.Modal.isModal(a)}function d(a){return new e(a)}function e(d){function e(a){return t.title=a,this}function f(a){return t.cssClass=a,this}function g(a){return t.content=a,this}function h(a){return t.labelConfirm=a,this}function i(a){return t.labelDismiss=a,this}function j(a){return t.onConfirm=a,this}function k(a){return t.onDismiss=a,this}function l(a){return t.container=a,this}function m(a){return t.timeout=a,this}function n(){if(t.selector)u=a(t.selector);else{u=c(t.content)?PlentyFramework.partials.Modal.getModal(t.content):a(PlentyFramework.compileTemplate("modal/modal.html",t)),a(t.container).append(u);var b=a(t.content).filter("script");b.length>0&&b.each(function(b,c){var d=document.createElement("script");d.type="text/javascript",d.innerHTML=a(c).text(),a(t.container).append(d)})}PlentyFramework.partials.Modal.init(u,t),u.find('[data-plenty-modal="confirm"]').click(function(){var a=t.onConfirm();"undefined"==typeof a&&(a=!0),a&&o(!0)}),PlentyFramework.partials.Modal.show(u),t.timeout>0&&p()}function o(a){PlentyFramework.partials.Modal.hide(u),a||t.onDismiss()}function p(){x=t.timeout,y=(new Date).getTime(),v=window.setTimeout(function(){window.clearInterval(w),o()},t.timeout),u.find('[data-plenty-modal="timer"]').text(x/1e3),w=window.setInterval(function(){if(!z){var a=x-(new Date).getTime()+y;a=Math.round(a/1e3),u.find('[data-plenty-modal="timer"]').text(a)}},1e3)}function q(){z=!0,x-=(new Date).getTime()-y,window.clearTimeout(v)}function r(){z=!1,y=(new Date).getTime(),v=window.setTimeout(function(){o(),window.clearInterval(w)},x)}function s(){window.clearTimeout(v),window.clearInterval(w)}var t=this;t.selector=d,t.title="",t.cssClass="",t.content="",t.labelDismiss=b.translate("Cancel"),t.labelConfirm=b.translate("Confirm"),t.onConfirm=function(){},t.onDismiss=function(){},t.container="body",t.timeout=-1,t.hide=o,t.startTimeout=p,t.stopTimeout=s,t.pauseTimeout=q,t.continueTimeout=r;var u,v,w,x,y,z=!1;return{setTitle:e,setClass:f,setContent:g,setContainer:l,setLabelConfirm:h,setLabelDismiss:i,onConfirm:j,onDismiss:k,setTimeout:m,show:n,hide:o}}return{prepare:d,isModal:c}})}(jQuery,PlentyFramework),function(a,b){b.factory("UIFactory",function(){function c(a,b){d([{code:a,message:b}])}function d(c){(!i||a("body").has(i).length<=0)&&(i=a(b.compileTemplate("error/errorPopup.html")),a("body").append(i),b.partials.Error.init(i)),a.each(c,function(c,d){b.partials.Error.addError(i,a(b.compileTemplate("error/errorMessage.html",d)))}),b.partials.Error.show(i),f(!0)}function e(){return h=h||0,(!g||a("body").has(g).length<=0)&&(g=a(b.compileTemplate("waitscreen/waitscreen.html")),a("body").append(g)),b.partials.WaitScreen.show(g),h++,h}function f(a){return h--,(0>=h||a)&&(h=0,b.partials.WaitScreen.hide(g)),h}var g,h=0,i=null;return{throwError:c,printErrors:d,showWaitScreen:e,hideWaitScreen:f}})}(jQuery,PlentyFramework),Object.equals=function(a,b){if(a===b)return!0;if(!(a instanceof Object&&b instanceof Object))return!1;if(a.constructor!==b.constructor)return!1;for(var c in a)if(a.hasOwnProperty(c)){if(!b.hasOwnProperty(c))return!1;if(a[c]!==b[c]){if("object"!=typeof a[c])return!1;if(!Object.equals(a[c],b[c]))return!1}}for(var c in b)if(b.hasOwnProperty(c)&&!a.hasOwnProperty(c))return!1;return!0},PlentyFramework.cssClasses={active:"active"},function(a,b){b.partials.Error={init:function(c){a(c).find(".close").click(function(){b.partials.Error.hideAll()})},addError:function(b,c){var d=a(c).attr("data-plenty-error-code");a(b).find('[data-plenty-error-code="'+d+'"]').length<=0&&a(b).find(".plentyErrorBoxInner").append(c)},show:function(b){a(b).show()},hideAll:function(){a("#CheckoutErrorPane").hide(),a("#CheckoutErrorPane").find(".plentyErrorBoxInner").html("")}}}(jQuery,PlentyFramework),function(a,b){b.partials.Modal={init:function(a,b){a.on("hidden.bs.modal",function(){b.hide(),b.selector||a.remove()}),b.timeout>0&&(a.on("hide.bs.modal",b.stopTimeout),a.find(".modal-content").hover(function(){b.pauseTimeout()},function(){a.is(".in")&&b.continueTimeout()}))},show:function(a){a.modal("show")},hide:function(a){a.modal("hide")},isModal:function(b){return a(b).filter(".modal").length+a(b).find(".modal").length>0},getModal:function(b){var c=a(b);return c.length>1&&(c=a(b).filter(".modal")||a(b).find(".modal")),c}}}(jQuery,PlentyFramework),function(a){a(document).on("initPartials",function(b,c){a(c).find('[data-toggle="tooltip"]').tooltip({container:"body"})})}(jQuery),function(a,b){b.partials.WaitScreen={show:function(a){a.addClass("in")},hide:function(a){a.removeClass("in")}}}(jQuery,PlentyFramework),function(a,b){b.service("AddressDoctorService",function(c){function d(b){var c=!0;return b=b||"[data-plenty-address-doctor]",a(b).filter("[data-plenty-address-doctor]:visible").each(function(b,d){var f=new e(d),g=a(d).attr("data-plenty-address-doctor").replace(/\s/g,"").split(",");f.isValid(g)||(c=!1)}),c}function e(c){function d(a){return j()?!0:(k=new f(m.getFormValues()),l=a,e(),1==k.getAddresses().length)}function e(){a(".suggestion-list").remove();for(var b=!1,c=0;cc;c++){var d=a.data[c],f=e(d);f?f.HouseNo.push(d.HouseNo):(d.HouseNo=[d.HouseNo],j.push(d))}})}function e(a){for(var b=j.length,c=0;b>c;c++)if(a.Street==j[c].Street&&j.ZIP==j[c].ZIP&&a.City==j[c].City)return j[c];return null}function f(){return j}function g(b){for(var c=[],d=j.length,e=0;d>e;e++){var f=j[e];a.inArray(f[b],c)<0&&c.push(f[b])}return c}function h(a){for(var b=[],c=j.length,d=0;c>d;d++){var e=j[d];(a.Street&&a.Street==e.Street||a.ZIP&&a.ZIP==e.ZIP||a.City&&a.City==e.City)&&b.push(e)}j=b}function i(a){a=parseInt(a);for(var b=j.length,c=0;b>c;c++)for(var d=j[c],e=0;e=f[0]&&a<=f[1])return!0}return!1}var j=[];return d(),{getAddresses:f,getList:g,filter:h,houseNoAllowed:i}}return{validateAddress:d}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("AuthenticationService",function(c,d,e){function f(){var b=a('[data-plenty-checkout="lostPasswordForm"]');if(b.validateForm()){var d=b.getFormValues(),e={Email:d.Email};return c.post("/rest/checkout/lostpassword/",e).done(function(b){1==b.data.IsMailSend&&(a('[data-plenty-checkout="lostPasswordTextContainer"]').hide(),a('[data-plenty-checkout="lostPasswordSuccessMessage"]').show())})}}function g(a){if(a.validateForm()){var b=a.getFormValues(),d={Email:b.loginMail,Password:b.loginPassword};return e.showWaitScreen(),c.post("/rest/checkout/login/",d).done(function(){window.location.assign(a.attr("action"))})}}function h(a){return c.post("/rest/checkout/customerinvoiceaddress/",a).done(function(a){d.getCheckout().CustomerInvoiceAddress=a.data})}function i(){var c=a('[data-plenty-checkout-form="customerRegistration"]');if(c.validateForm()&&b.getInstance().AddressDoctorService.validateAddress()){var d=c.getFormValues();if(d.LoginType=2,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var f in e)e[f]&&d.CustomerPropertiesList.push({PropertyID:f,PropertyValue:e[f]})}return h(d).done(function(){window.location.assign(c.attr("action"))})}}return{resetPassword:f,customerLogin:g,setInvoiceAddress:h,registerCustomer:i}},["APIFactory","CheckoutFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("BasketService",function(c,d,e,f,g){function h(d){d&&c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:d[0].BasketItemItemID,quantity:d[0].BasketItemQuantity},!1,!0).done(function(c){c.data[0].indexOf("form-group")>0?g.prepare().setContent(c.data[0]).setTitle(b.translate("Select order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(j(i(d)),!0):!1}).show():j(d)})}function i(b){var c,d=a('[data-plenty-checkout-form="OrderParamsForm"]'),e={},f="";return d.find('[name^="ParamGroup"]').each(function(){c=this.name.match(/^ParamGroup\[(\d+)]\[(\d+)]$/),b=m(b,c[1],a(this).val(),a(this).val())}),d.find('[name^="ParamValue"]').each(function(){if(e=a(this),f=e.attr("type"),("checkbox"==f&&e.is(":checked")||"radio"==f&&e.is(":checked")||"radio"!=f&&"checkbox"!=f)&&"file"!=f&&"hidden"!=f){var c=e[0].name.match(/^ParamValue\[(\d+)]\[(\d+)]$/);b=m(b,c[1],c[2],e.val())}else if("file"==f)if(e[0].files&&e[0].files.length>0)b=l(e,b);else{var c=e[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/),d=a('input[type="hidden"][name="ParamValue['+c[1]+"]["+c[2]+']"]').val();b=m(b,c[1],c[2],d)}}),b}function j(h){c.post("/rest/checkout/basketitemslist/",h,!0).done(function(){f.loadCheckout().done(function(){var c=a("[name^=ArticleAttribute]"),d={ArticleID:h[0].BasketItemItemID};c&&a("[name^=ArticleAttribute]").each(function(b,c){d[a(c).attr("name")]=a(c).val()}),s(),e.getContainer("ItemViewItemToBasketConfirmationOverlay",d).from("ItemView").done(function(a){var c=b.getGlobal("TimeoutItemToBasketOverlay",5e3),d=g.prepare().setContent(a.data[0]);c>0&&d.setTimeout(c),d.show()})})}).fail(function(a){d.printErrors(JSON.parse(a.responseText).error.error_stack)})}function k(a){c.put("/rest/checkout/basketitemslist/",a).done(function(){f.reloadCatContent(b.getGlobal("basketCatID")),f.loadCheckout().done(function(){s()})})}function l(a,b){var d,e,f=a[0].id,g={},h=[],i={type:"POST",data:{},isFile:!0,cache:!1,dataType:"json",processData:!1,contentType:!1};g[f]=a[0].files,-1==h.indexOf(f)&&h.push(f);for(var j=0,k=h.length;k>j;++j)d=new FormData,e=g[h[j]],d.append("0",e[0],e[0].name),i.data=d,c.post("/rest/checkout/orderparamfile/",i);var l=a[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/);return m(b,l[1],l[2],g[f][0].name)}function m(b,c,d,e){return c>0&&void 0==b[c]&&(b[c]=a.extend(!0,{},b[0]),b[c].BasketItemOrderParamsList=[]),void 0!=b[c]&&(b[c].BasketItemQuantity=1,void 0==b[c].BasketItemOrderParamsList&&(b[c].BasketItemOrderParamsList=[]),e&&b[c].BasketItemOrderParamsList.push({BasketItemOrderParamID:d,BasketItemOrderParamValue:e})),b}function n(b){var c=a('[data-plenty-basket-item="'+b+'"]');c.modal("show"),c.find('[data-plenty-modal="confirm"]').on("click",function(){var d=p(b),e=[];c.find('select, .PlentyFormContainer.AttrImage > input[type="hidden"]').each(function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&e.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=e.length&&(d.BasketItemAttributesList=e),k([d])})}function o(d){var e=p(d);e.BasketItemOrderParamsList=[],c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:e.BasketItemItemID,quantity:e.BasketItemQuantity,basketItemID:d}).done(function(c){g.prepare().setContent(c.data[0]).setTitle(b.translate("Edit order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(k(i([e])),!0):!1}).show()})}function p(a){for(var b=f.getCheckout().BasketItemsList,c=0;c=0?c.get("/rest/checkout/container_checkoutbasketitemslist/").done(function(c){var d=a("[data-basket-item-id]").parents("ul"),e=d.parents(".panel-body");d.fadeOut(function(){a(this).siblings(":not('[data-plenty-checkout-template]')").remove(),a(this).remove(),e.prepend(a(c.data[0])).hide().fadeIn(function(){b.getInstance().bindDirectives(e)})})}):f.reloadContainer("BasketItemsList"),f.reloadContainer("Totals")),s(),i.resolve()})})}var i=a.Deferred(),j=p(d).BasketItemNameMap[1];return e?h():g.prepare().setTitle(b.translate("Please confirm")).setContent("

    "+b.translate('Do you really want to remove "{{item}}" from your basket?',{item:j})+"

    ").onDismiss(function(){i.reject()}).onConfirm(function(){h()}).setLabelConfirm(b.translate("Delete")).show(),i}function r(d,e){if(0>=e)return q(d);for(var g,h,i=a.Deferred(),j=f.getCheckout().BasketItemsList,k=0;k0&&f.reloadContainer("Totals")}return{addItem:h,removeItem:q,getItem:p,setItemQuantity:r,editItemAttributes:n,editOrderParams:o,addCoupon:t,removeCoupon:u}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("CheckoutService",function(c,d,e,f,g){function h(){f.loadCheckout(!0)}function i(){var b=a('[data-plenty-checkout-form="details"]'),d=b.getFormValues();return f.getCheckout().CheckoutCustomerSign||(f.getCheckout().CheckoutCustomerSign=""),f.getCheckout().CheckoutOrderInfoText||(f.getCheckout().CheckoutOrderInfoText=""),f.getCheckout().CheckoutCustomerSign!==d.CustomerSign&&a(b).find('[name="CustomerSign"]').length>0||f.getCheckout().CheckoutOrderInfoText!==d.OrderInfoText&&a(b).find('[name="OrderInfoText"]').length>0?(f.getCheckout().CheckoutCustomerSign=d.CustomerSign,f.getCheckout().CheckoutOrderInfoText=d.OrderInfoText,f.setCheckout()):c.idle()}function j(d){var e=a('[data-plenty-checkout-form="shippingAddress"]');if(!d&&!e.validateForm())return!1;if(!d&&!b.getInstance().AddressDoctorService.validateAddress(e))return!1;var g=e.getFormValues(),h=a('[name="shippingAddressID"]:checked').val();if(0>h){var i=g;return m(i,f.getCheckout().CustomerShippingAddress)?c.idle():("PACKSTATION"==i.Street?(i.IsPackstation=1,i.PackstationNo=i.HouseNo):"POSTFILIALE"==i.Street&&(i.IsPostfiliale=1,i.PostfilialNo=i.HouseNo),c.post("/rest/checkout/customershippingaddress/",i).done(function(a){f.getCheckout().CheckoutCustomerShippingAddressID=a.data.ID,f.getCheckout().CheckoutShippingCountryID=a.data.CountryID,k()}))}return h==f.getCheckout().CheckoutCustomerShippingAddressID?c.idle():(f.getCheckout().CheckoutCustomerShippingAddressID=h,void k())}function k(){return delete f.getCheckout().CheckoutMethodOfPaymentID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList"),f.reloadContainer("ShippingProfilesList"),2==f.getCheckout().CustomerInvoiceAddress.LoginType&&f.reloadContainer("CustomerShippingAddress"),a("#shippingAdressSelect").modal("hide"),a(".modal-backdrop")&&a(".modal-backdrop").remove()})}function l(){var b=a('[data-plenty-checkout-form="guestRegistration"]'),d=b.getFormValues();if(d.LoginType=1,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var g in e)e[g]&&d.CustomerPropertiesList.push({PropertyID:g,PropertyValue:e[g]})}return m(d,f.getCheckout().CustomerInvoiceAddress)?j():c.post("/rest/checkout/customerinvoiceaddress/",d).done(function(a){j().done(f.loadCheckout)})}function m(a,b){for(var c in a)if(a[c]+""!=b[c]+""&&"EmailRepeat"!==c)return!1;return!0}function n(){var b=a('[data-plenty-checkout-form="shippingProfileSelect"]').getFormValues();return f.getCheckout().CheckoutShippingProfileID=b.ShippingProfileID,delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutMethodOfPaymentID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList")})}function o(){var b=f.getCheckout().CheckoutMethodOfPaymentID,e=a('input[type="radio"][name="MethodOfPaymentID"][value="'+b+'"]').parent().getFormValues();return c.post("/rest/checkout/preparepayment/",e,!0).done(function(b){if(""!=b.data.CheckoutMethodOfPaymentRedirectURL)document.location.assign(b.data.CheckoutMethodOfPaymentRedirectURL);else if(b.data.CheckoutMethodOfPaymentAdditionalContent){var c=a(b.data.CheckoutMethodOfPaymentAdditionalContent).find('[data-plenty-checkout-form="bankDetails"]').length>0;g.prepare().setContent(b.data.CheckoutMethodOfPaymentAdditionalContent).onConfirm(function(){return c?s():u()}).show()}}).fail(function(b){try{for(var c=a.parseJSON(b.responseText),e=[],g=0;g0&&d.printErrors(e)}catch(h){d.throwError(b.status,b.statusText)}})}function p(c){return c||(c=a('input[name="MethodOfPaymentID"]:checked').val()),f.getCheckout().CheckoutMethodOfPaymentID=c,b.getGlobal("Checkout.AtrigaRequireUserConfirmation")||(f.getCheckout().CheckoutAtrigapaymaxChecked=!0),delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("ShippingProfilesList")})}function q(a){return f.getCheckout().CheckoutAtrigapaymaxChecked=!!a,c.put("/rest/checkout",{CheckoutAtrigapaymaxChecked:!!a})}function r(){e.getContainer("CheckoutPaymentInformationBankDetails").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return s()}).show()})}function s(){var b=a('[data-plenty-checkout-form="bankDetails"]');if(b.validateForm()){var d=b.getFormValues().checkout.customerBankDetails,e={CustomerBankName:d.bankName,CustomerBLZ:d.blz,CustomerAccountNumber:d.accountNo,CustomerAccountOwner:d.accountOwner,CustomerIBAN:d.iban,CustomerBIC:d.bic};return c.post("/rest/checkout/paymentinformationbankdetails/",e).done(function(){f.loadCheckout().done(function(){p(3),f.reloadContainer("MethodsOfPaymentList")})}),!0}return!1}function t(){e.getContainer("CheckoutPaymentInformationCreditCard").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return u()}).show()})}function u(){var b=a('[data-plenty-checkout-form="creditCard"]');if(b.validateForm()){var d=b.getFormValues().checkout.paymentInformationCC,e={Owner:d.owner,Cvv2:d.cvv2,Number:d.number,Year:d.year,Month:d.month,Provider:d.provider};return c.post("/rest/checkout/paymentinformationcreditcard/",e).done(function(){f.loadCheckout()}),!0}return!1}function v(b){if(2==f.getCheckout().CustomerInvoiceAddress.LoginType)var c=a('[data-plenty-checkout-form="shippingAddress"]').getFormValues();else var c=a('[data-plenty-checkout-form="guestRegistration"]').getFormValues();var d={street:c.Street,houseNo:c.HouseNo,ZIP:c.ZIP,city:c.City,postnummer:c.Postnummer,suggestionType:"postfinder"};e.getContainer("CheckoutAddressSuggestionResultsList",d).from("Checkout").done(function(a){g.prepare().setContent(a.data[0]).show()})}function w(){var b=a('[data-plenty-checkout-form="placeOrder"]');if(b.validateForm()){var d=b.getFormValues(),e={TermsAndConditionsCheck:d.termsAndConditionsCheck||0,WithdrawalCheck:d.withdrawalCheck||0,PrivacyPolicyCheck:d.privacyPolicyCheck||0,AgeRestrictionCheck:d.ageRestrictionCheck||0,NewsletterCheck:d.newsletterCheck||0,KlarnaTermsAndConditionsCheck:d.klarnaTermsAndConditionsCheck||0,PayoneDirectDebitMandateCheck:d.payoneDirectDebitMandateCheck||0,PayoneInvoiceCheck:d.payoneInvoiceCheck||0};return c.post("/rest/checkout/placeorder/",e).done(function(a){""!=a.data.MethodOfPaymentRedirectURL?window.location.assign(a.data.MethodOfPaymentRedirectURL):""!=a.data.MethodOfPaymentAdditionalContent?g.prepare().setContent(a.data.MethodOfPaymentAdditionalContent).setLabelDismiss("").onDismiss(function(){window.location.assign(b.attr("action"))}).onConfirm(function(){window.location.assign(b.attr("action"))}).show():window.location.assign(b.attr("action"))})}}return{init:h,setCustomerSignAndInfo:i,registerGuest:l,setShippingProfile:n,saveShippingAddress:j,loadAddressSuggestion:v,preparePayment:o,setMethodOfPayment:p,confirmAtrigaPaymax:q,editBankDetails:r,editCreditCard:t,placeOrder:w}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("FeedbackService",function(a){function b(){function b(a,b){return e.dateStart=a,e.dateEnd=b,this}function c(b,c,f){var g={ReferenceId:c,FromDate:e.dateStart,ToDate:e.dateEnd,FeedbackType:f||d().COMMENTS_AND_RATINGS};return a.get("/rest/feedback/"+b+"/",g)}var e={dateStart:null,dateEnd:null};return{between:b,"for":c}}function c(){function b(a){return f.Rating=a,this}function c(a){return f.Text=a,this}function d(a,b,c){return f.Author=a,b&&(f.Email=b),c&&(f.CustomerId=c),this}function e(b,c){return a.post("/rest/feedback/"+b+"/",f)}var f={Rating:1,Text:"",Author:"",Email:"",CustomerId:0};return{withRating:b,withComment:c,withAuthor:d,to:e}}function d(){return{COMMENTS_ONLY:"comments_only",RATINGS_ONLY:"ratings_only",COMMENTS_AND_RATINGS:"comments_with_ratings"}}function e(){return{ITEM:"item",CATEGORY:"category",BLOG:"blog"}}return{getFeedbacks:b,addFeedback:c,ArticleTypes:e(),FeedbackTypes:d()}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("MediaSizeService",function(){function b(){return e&&c(),e}function c(){var b;if(b=window.matchMedia?window.matchMedia("(min-width:1200px)").matches?"lg":window.matchMedia("(min-width:992px)").matches?"md":window.matchMedia("(min-width:768px)").matches?"sm":"xs":a(window).width()>=1200?"lg":a(window).width()>=992?"md":a(window).width()>=768?"sm":"xs",b!=e||"xs"===b){var c=e;e=b,a(window).trigger("sizeChange",[e,c])}}function d(a){for(var b=a.replace(/\s/g,"").split(","),c=0;c li'),r=a('[data-plenty-checkout="container"] > div'),u=a('[data-plenty-checkout="next"]'),t=a('[data-plenty-checkout="prev"]'),q.length==r.length&&r.length>0){d.getCheckout();r.hide(),q.each(function(b,c){a(c).addClass("disabled"),a(c).click(function(){a(this).is(".disabled")||j(b)})}),u.attr("disabled","disabled"),u.click(function(){m()}),t.attr("disabled","disabled"),t.click(function(){n()}),window.addEventListener("hashchange",function(){window.location.hash.length>0?o(window.location.hash):j(0)},!1),a.urlParam=function(a){var b=new RegExp("[?&]"+a+"=([^&#]*)").exec(window.location.href);return null==b?null:b[1]||0};var c=a.urlParam("gototab");0==window.location.hash.length&&c&&a('[data-plenty-checkout-id="'+c+'"]').length>0?window.location.hash=c:j(!o(window.location.hash)&&s>=0?s:0),p(),a(window).on("sizeChange",p),a(window).resize(function(){"xs"==b.getInstance().MediaSizeService.interval()&&p()})}}function f(){return s>=0?{id:a(r[s]).attr("data-plenty-checkout-id"),index:s}:null}function g(a){return v.beforeChange.push(a),b.getInstance().NavigatorService}function h(a){return v.afterChange.push(a),b.getInstance().NavigatorService}function i(b,c){var d=!0;if(s>=0||"afterChange"===b){var e=f(),g={index:c,id:a(r[c]).attr("data-plenty-checkout-id")};a.each(v[b],function(a,b){return b(e,g)===!1?(d=!1,!1):void 0})}return d}function j(e,f){var g=s!==e;(!g||f||i("beforeChange",e))&&(s=e,!Object.equals(w[s],d.getCheckout(!0))&&g&&a(r[s]).attr("data-plenty-checkout-content")?(w[s]=d.getCheckout(!0),c.getCategoryContent(a(r[s]).attr("data-plenty-checkout-content")).done(function(c){a(r[s]).html(c.data[0]),k(g),b.getInstance().bindDirectives(r[s]),a(window).trigger("contentChanged")})):k(g))}function k(b){a(r).hide();var c;a(q).each(function(b,d){c=a(d),c.removeClass("disabled active"),c.find('[role="tab"]').attr("aria-selected","false"),s>b?c.addClass("visited"):b==s?(c.addClass("active visited"),c.find('[role="tab"]').attr("aria-selected","true")):b>s&&!c.is(".visited")&&c.addClass("disabled")}),p(),0>=s?t.attr("disabled","disabled"):t.removeAttr("disabled"),s+1==q.length?u.attr("disabled","disabled"):u.removeAttr("disabled"),a(r[s]).show(),s>0?window.location.hash=a(r[s]).attr("data-plenty-checkout-id"):window.location.hash.length>0&&(window.location.hash=""),b&&i("afterChange",s)}function l(a){j(a.index,!0)}function m(){s0&&j(s-1)}function o(b){return"next"==b?(m(),!0):"prev"==b?(n(),!0):(b=b.replace("#",""),a(r).each(function(c,d){return a(d).attr("data-plenty-checkout-id")==b?(j(c),!0):void 0}),!1)}function p(){var b=q.length;if(!(0>=b)){a(q).removeAttr("style"),a(q).children("span").removeAttr("style"),a(u).removeAttr("style"),a(t).removeAttr("style");var c=a(t).outerWidth()c?a(d).children("span").css({paddingLeft:g+"px",paddingRight:h+"px"}):a(d).children("span").css({paddingLeft:j+"px",paddingRight:k+"px"})})}}var q=[],r=[],s=-1,t={},u={},v={beforeChange:[],afterChange:[]},w=[];return{init:e,getCurrentContainer:f,goTo:j,beforeChange:g,afterChange:h,continueChange:l,next:m,previous:n,goToID:o,fillNavigation:p}},["CMSFactory","CheckoutFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("PostfinderService",function(c,d,e){function f(){var b=a('input[name="Street"]').val();return"PACKSTATION"==b.toUpperCase()||"POSTFILIALE"==b.toUpperCase()}function g(){j={PostfinderItemStreet:a('input[name="Street"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemZIP:a('input[name="ZIP"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemCity:a('input[name="City"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemHouseNo:a('input[name="HouseNo"]','[data-plenty-checkout-form="shippingAddress"]')},j.PostfinderItemStreet.val(""),j.PostfinderItemZIP.val().length>2||j.PostfinderItemCity.val().length>2?c.get("/rest/checkout/shippingaddresspostfinderlist/",{suggestionType:"postfinder",zip:j.PostfinderItemZIP.val(),city:j.PostfinderItemCity.val()}).done(function(c){l=c.data,k=l.length,0==k&&h();for(var e={addresses:[]},f=0;k>f;f++){var g="km",m=l[f].PostfinderItemDistance,n=m/1e3;n=(Math.round(100*n)/100).toFixed(2).replace(".",","),1e3>m&&(n=m,g="m"),e.addresses.push({index:f,dimension:g,type:l[f].PostfinderItemIsPackstation?"Packstation":"Postfiliale",number:l[f].PostfinderItemIsPackstation?l[f].PostfinderItemPackstationNo:l[f].PostfinderItemPostfilialNo,street:l[f].PostfinderItemStreet,houseNo:l[f].PostfinderItemHouseNo,zip:l[f].PostfinderItemZIP,city:l[f].PostfinderItemCity,district:l[f].PostfinderItemDistrict,distance:n,remark:l[f].PostfinderItemRemark})}var o=b.compileTemplate("addressSuggestions/postFinder.html",e);d.prepare().setTitle(b.translate("Packstations and post offices in your area")).setContent(o).setClass("checkout").onConfirm(function(){return j.PostfinderItemCity.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemZIP.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemStreet.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemStreet.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemHouseNo.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemHouseNo.attr("id")+'"]').removeClass("has-error").addClass("has-success"),i=a('input[type="radio"][name="postfinder"]:checked').val(),l[i].PostfinderItemIsPackstation?(a(j.PostfinderItemStreet).val("PACKSTATION"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPackstationNo)):(a(j.PostfinderItemStreet).val("POSTFILIALE"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPostfilialNo)),a(j.PostfinderItemStreet).trigger("change"),a(j.PostfinderItemCity).val(l[i].PostfinderItemCity),a(j.PostfinderItemZIP).val(l[i].PostfinderItemZIP),!0}).show()}):h()}function h(){e.throwError(0,b.translate("Please enter a ZIP code and/or a city.")),j.PostfinderItemCity.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemZIP.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemCity.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")}),j.PostfinderItemZIP.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")})}var i="",j={},k={},l={};return{openPostfinderModal:g,isPackstation:f}},["APIFactory","ModalFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("SocialShareService",function(){function b(a){var b={"facebook-like":'',"facebook-recommend":'',twitter:'',"google-plus":'
    '};return b[a]}function c(){var b=document.location.href,c=a("link[rel=canonical]").attr("href");return c&&c.length>0&&(c.indexOf("http")<0&&(c=document.location.protocol+"//"+document.location.host+c),b=c),b}function d(b){var c=a('meta[name="'+b+'"]').attr("content");return c||""}function e(){var b=d("DC.title"),c=d("DC.creator");return b.length>0&&c.length>0?b+=" - "+c:b=a("title").text(),encodeURIComponent(b)}return"undefined"==typeof socialLangLocale&&(socialLangLocale="en_US"),"undefined"==typeof socialLang&&(socialLang="en"),{getSocialService:b}})}(jQuery,PlentyFramework),function(a,b){b.service("ValidationService",function(){function b(b){return b=a(b),b.is("input")||b.is("select")||b.is("textarea")?b:b.find("input").length>0?b.find("input"):b.find("select").length>0?b.find("select"):b.find("textarea").length>0?b.find("textarea"):null}function c(b){return b.is("input")||b.is("select")||b.is("textarea")?a.trim(b.val()).length>0:(console.error("Validation Error: Cannot validate Text for <"+b.prop("tagName")+">"),!1)}function d(b){var d=/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;return c(b)?d.test(a.trim(b.val())):!1}function e(b){return c(b)?a.isNumeric(a.trim(b.val())):!1}function f(b,c){return a(c).length>0?a.trim(b.val())==a.trim(a(c).val()):a.trim(b.val())==c}function g(a){return a.is(":visible")}function h(a){return a.is(":enabled")}function i(i,j){var k,l,m,n,o,p,q,r,s,t,u,v=a(i);j=j||"has-error";var w=[],x=!1;v.find("[data-plenty-validate], :required").each(function(i,y){s=a(y).attr("data-plenty-validate"),l=b(y),t=s?s:"text",t=t.split(",");for(var i=0,z=l.length;z>i;i++){if(k=a(l[i]),u=k.attr("type"),!g(k)||!h(k))return;if(m=t[i].trim()||t[0].trim(),n=!1,k.is("input")&&"radio"!=u&&"checkbox"!=u||k.is("textarea"))switch(m){case"text":n=!c(k);break;case"mail":n=!d(k);break;case"number":n=!e(k);break;case"value":n=!f(k,a(y).attr("data-plenty-validation-value"));break;case"none":break;default:console.error('Form validation error: unknown validate property: "'+s+'"')}else if(!k.is("input")||"radio"!=u&&"checkbox"!=u){if(!k.is("select"))return void console.error("Form validation error: "+a(y).prop("tagName")+" does not contain an form element");n=""==k.val()||"-1"==k.val()}else{if(o=k.attr("name"),p=v.find('input[name="'+o+'"]:checked').length,"radio"==u)q=1,r=1;else{var A=new Function("return "+s)()||{min:1,max:1};q=A.min,r=A.max}n=q>p||p>r}n&&(x=!0,w.push(k),l.length>1?(k.addClass(j),v.find('label[for="'+k.attr("id")+'"]').addClass(j)):a(y).addClass(j))}}),v.on("validationFailed",function(){var b=50,c=v.find("."+j).first(),d=c.offset().top,e=a("html, body");v.parents(".modal").length>0?(e=v.parents(".modal").find(".modal-body"), d=e.scrollTop()-(e.offset().top-c.offset().top)):v.is(".modal")&&(e=v.find(".modal-body"),d=e.scrollTop()-(e.offset().top-c.offset().top)),(d-bwindow.pageYOffset+window.innerHeight)&&e.animate({scrollTop:d-b})}),x&&(v.find("."+j).each(function(c,d){k=a(b(d)),k.on("focus click",function(){var b=a(d);b.removeClass(j),v.find('label[for="'+a(this).attr("id")+'"]').removeClass(j)})}),v.trigger("validationFailed",[w]));var y=v.attr("data-plenty-callback");if(!x&&y&&"submit"!=y&&"function"==typeof window[y]){var z={};return v.find("input, textarea, select").each(function(){"checkbox"==a(this).attr("type")?z[a(this).attr("name")]=a(this).is(":checked"):z[a(this).attr("name")]=a(this).val()}),window[y](z),!1}return!x}return{validate:i}}),a.fn.validateForm=function(){return b.getInstance().ValidationService.validate(this)},a.fn.getFormValues=function(){function b(b,c){var e=b.match(/^([^\[]+)(.*)/);if(e[2]){var f,g=/\[([^\]]+)]/g,h=[];for(h[0]=e[1];null!==(f=g.exec(e[2]));)h.push(f[1]);for(var i=h.length-1;i>=0;i--){var j={};j[h[i]]=c,c=j}d=a.extend(!0,d,c)}else d[e[1]]=c}var c=this,d={};return c.find("input, select, textarea").each(function(d,e){if(a(e).attr("name"))if("checkbox"==a(e).attr("type")){var f=[];a(c).find('[name="'+a(e).attr("name")+'"]:checked').each(function(b,c){f.push(a(c).val())}),b(a(e).attr("name"),f)}else"radio"==a(e).attr("type")?a(e).is(":checked")&&b(a(e).attr("name"),a(e).val()):b(a(e).attr("name"),a(e).val())}),d}}(jQuery,PlentyFramework),PlentyFramework.compile();var plenty=PlentyFramework.getInstance();jQuery(document).ready(function(){plenty.bindDirectives()}); //# sourceMappingURL=plentymarketsCMStools-1.0.8.min.js.map \ No newline at end of file diff --git a/dist/plentymarketsCMStools-1.0.8.min.js.map b/dist/plentymarketsCMStools-1.0.8.min.js.map index ac92fe3..d8a4c62 100644 --- a/dist/plentymarketsCMStools-1.0.8.min.js.map +++ b/dist/plentymarketsCMStools-1.0.8.min.js.map @@ -624,8 +624,10 @@ "files", "orderParamFileUpload", "paramValue", - "refreshBasketPreview", + "artAttr", + "requestData", "ArticleID", + "refreshBasketPreview", "updateArticle", "$input", "formData", @@ -925,8 +927,8 @@ "checkbox", "plenty" ], - "mappings": "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", + "mappings": "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", "sourcesContent": [ - "var TemplateCache = {};\n\nTemplateCache[\"addressSuggestions/addressDoctor.html\"] = \"\";\n\nTemplateCache[\"addressSuggestions/postFinder.html\"] = \"{{#addresses}}\\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"{{/addresses}}\\n\" +\n \"\";\n\nTemplateCache[\"error/errorMessage.html\"] = \"
    \\n\" +\n \" Code {{code}}:\\n\" +\n \" {{{message}}}\\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"error/errorPopup.html\"] = \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"modal/modal.html\"] = \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#title}}\\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"

    {{{title}}}

    \\n\" +\n \"
    \\n\" +\n \" {{/title}}\\n\" +\n \"\\n\" +\n \"
    {{{content}}}
    \\n\" +\n \"\\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#labelDismiss}}\\n\" +\n \" \\n\" +\n \" {{/labelDismiss}}\\n\" +\n \"\\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"waitscreen/waitscreen.html\"] = \"
    \";\n\n(function defineMustache(global,factory){if(typeof exports===\"object\"&&exports&&typeof exports.nodeName!==\"string\"){factory(exports)}else if(typeof define===\"function\"&&define.amd){define([\"exports\"],factory)}else{global.Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)===\"[object Array]\"};function isFunction(object){return typeof object===\"function\"}function typeStr(obj){return isArray(obj)?\"array\":typeof obj}function escapeRegExp(string){return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")}function hasProperty(obj,propName){return obj!=null&&typeof obj===\"object\"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"/\":\"/\"};function escapeHtml(string){return String(string).replace(/[&<>\"'\\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\\s*/;var spaceRe=/\\s+/;var equalsRe=/\\s*=/;var curlyRe=/\\s*\\}/;var tagRe=/#|\\^|\\/|>|\\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile===\"string\")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error(\"Invalid tags: \"+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+\"\\\\s*\");closingTagRe=new RegExp(\"\\\\s*\"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp(\"\\\\s*\"+escapeRegExp(\"}\"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===\"\"};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return\"\";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail=\"\";break;case 0:match=\"\";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={\".\":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(\".\")>0){value=context.view;names=name.split(\".\");index=0;while(value!=null&&index\")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol===\"&\")value=this.unescapedValue(token,context);else if(symbol===\"name\")value=this.escapedValue(token,context);else if(symbol===\"text\")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer=\"\";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j\n * =====================================================================================\n */\n\n/**\n * @module PlentyFramework\n */\n(function( $ )\n{\n // will be overridden by grunt\n var version = \"1.0.8\";\n\n /**\n * Collection of uncompiled registered factories & services.\n * See {{#crossLink \"PlentyFramework/compile:method\"}}.compile(){{/crossLink}}\n * @attribute components\n * @static\n * @type {{factories: {}, services: {}}}\n */\n var components = {\n factories : {},\n services : {},\n directives: {}\n };\n\n /**\n * Framework providing client functions for plentymarkets Webshops.\n * @class PlentyFramework\n * @constructor\n */\n PlentyFramework = function()\n {\n };\n\n var instance = null;\n PlentyFramework.getInstance = function()\n {\n instance = instance || new PlentyFramework();\n return instance;\n };\n\n PlentyFramework.version = (function() {\n\n return {\n get: function() {\n return version;\n },\n equals: function( v ) {\n return compare(v) == 0;\n },\n compare: compare\n };\n\n function compare( compare )\n {\n var localVersion = version.split(\".\");\n var compareVersion = compare.split(\".\");\n\n for( var i = 0; i < compareVersion.length; i++ )\n {\n if( localVersion[i] === compareVersion[i] || compareVersion[i] === \"*\" )\n {\n continue;\n }\n\n if( parseInt(localVersion[i]) < parseInt(compareVersion[i]) )\n {\n return -1;\n }\n\n if( parseInt(localVersion[i]) > parseInt(compareVersion[i]) )\n {\n return 1;\n }\n }\n return 0;\n }\n\n })();\n\n /**\n * Customizable controls for partials will be injected here.\n * (e.g. Modal)\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.partials = {};\n\n /**\n * Collection of registered global variables\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.globals = {};\n\n /**\n * Set a global variable.\n * @function setGlobal\n * @static\n * @param {string} identifier A unique identifier to reference this variable\n * @param {*} value The value to set\n * @return {*} The value\n */\n PlentyFramework.setGlobal = function( identifier, value )\n {\n if ( PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n console.error( 'Global variable \"' + identifier + '\" already exists and cannot be overridden.' );\n return null;\n }\n\n PlentyFramework.globals[identifier] = value;\n\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Get the value of a global variable or undefined if not exists\n * @function getGlobal\n * @static\n * @param identifier The identifier of the requested variable\n * @return {*} The value of the variable\n */\n PlentyFramework.getGlobal = function( identifier, fallbackValue )\n {\n if( !PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n return fallbackValue;\n }\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Collection of registered directives\n * @type {Array}\n * @static\n */\n PlentyFramework.directives = {};\n\n /**\n * Register directive. Directives can be bound to dynamically added nodes by calling pm.bindPlentyFunctions();\n * @function directive\n * @static\n * @param {string} selector jQuery selector of the DOM-elements to bind the directive to\n * @param {function} callback Function to add directives behaviour\n * @param {Array} dependencies List of required services. Services will be passed to callback function\n * @param {boolean} allowDuplicates Defines if a directive can be bound to the same element multiple times\n * @return {object} The created directive\n */\n PlentyFramework.directive = function( directiveName, directiveFunctions, dependencies )\n {\n // Catch type mismatching for 'directiveName'\n if ( typeof directiveName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof directiveName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof directiveFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof directiveFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.directives[directiveName] = {\n name : directiveName,\n dependencies: dependencies,\n setup : directiveFunctions\n };\n };\n\n /**\n * Bind registered directives.\n * @function bindDirectives\n * @param {string} [directiveSelector] restrict binding to elements matching this selector\n */\n PlentyFramework.prototype.bindDirectives = function( rootElement )\n {\n\n rootElement = rootElement || 'html';\n\n $( rootElement ).find( '[data-plenty]' ).each( function( i, element )\n {\n\n var directives = parseDirectives( $( element ).attr( 'data-plenty' ), $( element ) );\n\n if ( directives.length <= 0 )\n {\n // continue\n return;\n }\n\n addCustomEvents( element );\n\n for ( var i = 0; i < directives.length; i++ )\n {\n var directive = directives[i];\n if ( !!PlentyFramework.directives[directive.class] && PlentyFramework.directives.hasOwnProperty( directive.class ) )\n {\n\n var callback = PlentyFramework.directives[directive.class][directive.method];\n if ( !!callback && typeof callback == \"function\" )\n {\n\n if ( directive.event == \"ready\" )\n {\n callback.apply( null, directive.params );\n }\n else\n {\n bindEventCallback( $( element ), directive.event, callback, directive.params );\n /*\n $( element ).on( directive.event, function( e )\n {\n directive = injectEvent( directive, e );\n return callback.apply( null, directive.params );\n } );\n */\n }\n\n }\n else\n {\n console.error( \"Method not found: \" + directive.method + \" in \" + directive.class );\n }\n\n }\n else\n {\n console.error( \"Directive not found: \" + directive.class );\n }\n }\n } );\n\n $( document ).trigger( 'initPartials', rootElement );\n };\n\n var eventStack = [];\n\n PlentyFramework.getRecentEvent = function( eventType )\n {\n var lastEventIdx = eventStack.length - 1;\n if ( !eventType )\n {\n return eventStack[lastEventIdx];\n }\n else\n {\n for ( var i = lastEventIdx; i >= 0; i-- )\n {\n if ( eventType == eventStack[i].type )\n {\n return eventStack[i];\n }\n }\n }\n\n return null;\n\n };\n\n PlentyFramework.pushEvent = function( event )\n {\n eventStack.push( event );\n };\n\n /**\n * Bind event to element by eventType.\n * If cms says \"click:Foo.bar(this, event)\" eventType is \"click\".\n *\n * @param $elem - jQuery object on which event was triggered\n * @param eventType - type of event\n * @param callback - callback function of directive [example: \"bar(this, event)\"]\n * @param params - list of parameters for callback function.\n */\n function bindEventCallback( $elem, eventType, callback, params )\n {\n $elem.on( eventType, function( event )\n {\n eventStack.push( event );\n return callback.apply( null, params );\n } );\n\n if( document.readyState === \"complete\" && eventType === \"ready\" )\n {\n // execute 'ready' directives directly if document is already loaded\n callback.apply( null, params );\n }\n }\n\n function addCustomEvents( element )\n {\n\n var $elem = $( element );\n\n if ( $elem.is( 'input[type=\"checkbox\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n if ( $elem.is( ':checked' ) )\n {\n $elem.trigger( 'check' );\n }\n else\n {\n $elem.trigger( 'uncheck' );\n }\n } );\n }\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n var radioGroup = $elem.attr( 'name' );\n\n $( 'input[type=\"radio\"][name=\"' + radioGroup + '\"]' ).each( function( i, radio )\n {\n var $radio = $( radio );\n if ( $radio.is( ':checked' ) )\n {\n $radio.trigger( 'check' );\n }\n else\n {\n $radio.trigger( 'uncheck' );\n }\n\n } );\n\n } );\n }\n }\n\n function parseDirectives( input, thisValue )\n {\n var directivePattern = /^(([\\w]+):)?([\\w]+)\\.([\\w]+)(\\((.*)\\))?$/;\n var expressions = input.split( ';' );\n var directives = [];\n\n for ( var i = 0; i < expressions.length; i++ )\n {\n var expression = expressions[i].trim();\n\n if ( !expression )\n {\n continue;\n }\n\n if ( !directivePattern.test( expression ) )\n {\n // console.warn( \"Invalid directive: \" + expression );\n continue;\n }\n\n var match = expression.match( directivePattern );\n\n if ( !match[3] || match[3].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Class name not set.\" );\n continue;\n }\n\n if ( !match[4] || match[4].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Method not set.\" );\n continue;\n }\n\n var directive = {\n event : match[2] || 'ready',\n class : match[3],\n method: match[4],\n params: []\n };\n\n if ( !!match[6] && match[6].length > 0 )\n {\n var params = match[6].match( /(['][^']+['])|([\\w-]+)|([\"][^\"]+[\"])/g );\n for ( var j = 0; j < params.length; j++ )\n {\n var param = params[j].trim();\n if ( !isNaN( parseFloat( param ) ) )\n {\n directive.params.push( parseFloat( param ) );\n }\n else if ( param.toLowerCase() == 'true' )\n {\n directive.params.push( true );\n }\n else if ( param.toLowerCase() == 'false' )\n {\n directive.params.push( false );\n }\n else if ( param.toLowerCase() == 'this' )\n {\n directive.params.push( thisValue );\n }\n else\n {\n directive.params.push( param.replace( /^['\"]|['\"]$/g, '' ) );\n }\n }\n }\n\n directives.push( directive );\n\n }\n return directives;\n }\n\n /**\n * Register a new service\n * @function service\n * @static\n * @param {string} serviceName Unique identifier of the service to get/ create\n * @param {function} serviceFunctions Callback containing all public functions of this service.\n * @param {Array} [dependencies] Identifiers of required services to inject in serviceFunctions\n * @return {object} The object described in serviceFunctions(). Can be received via\n * PlentyFramework.[serviceName]\n */\n PlentyFramework.service = function( serviceName, serviceFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof serviceName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof serviceName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof serviceFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof serviceFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.services[serviceName] = {\n name : serviceName,\n dependencies: dependencies,\n setup : serviceFunctions\n };\n\n };\n\n /**\n * Collection of compiled factories\n * @attribute factories\n * @static\n * @type {object}\n */\n PlentyFramework.factories = {};\n\n /**\n * Register a new factory\n * @function factory\n * @static\n * @param {string} factoryName A unique name of the new factory\n * @param {function} factoryFunctions The function describing the factory\n * @param {Array} dependencies List of required factories to inject\n */\n PlentyFramework.factory = function( factoryName, factoryFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof factoryName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof factoryName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof factoryFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof factoryFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n components.factories[factoryName] = {\n name : factoryName,\n dependencies: dependencies,\n setup : factoryFunctions\n }\n\n };\n\n /**\n * Renders html template. Will provide given data to templates scope.\n * Uses Mustache syntax for data-binding.\n * @function compileTemplate\n * @static\n * @param {String} template relative path to partials template to load. Base path = '/src/partials/'\n * @param {Object} data data to privide to templates scope.\n * @returns {String} The rendered html string\n */\n PlentyFramework.compileTemplate = function( template, data )\n {\n data = data || {};\n data.translate = function()\n {\n return function( text, render )\n {\n return render( PlentyFramework.translate( text ) );\n };\n };\n return Mustache.render( TemplateCache[template], data );\n };\n\n /**\n * The path on the server where the script is located in.\n * @attribute\n * @static\n * @type {String}\n */\n PlentyFramework.scriptPath = '';\n\n /**\n * Collection of locale strings will be injected here after reading language file.\n * @attribute\n * @static\n * @type {Object}\n */\n PlentyFramework.Strings = {};\n\n /**\n * Load language file containing translations of locale strings.\n * @function loadLanguageFile\n * @static\n * @param fileName relative path to language file.\n */\n PlentyFramework.loadLanguageFile = function( fileName )\n {\n $.ajax({\n url: PlentyFramework.scriptPath + fileName,\n dataType: 'json'\n }).done( function( response ) {\n PlentyFramework.Strings = response;\n });\n };\n\n /**\n * Try to get locale translation of given string.\n * Render translated string using Mustache syntax\n * if additional parameters are given.\n * @function translate\n * @static\n * @param {String} string The string to translate\n * @param {Object} [params] additional data for rendering\n * @returns {String} The translation of the given string if found. Otherwise returns the original string.\n */\n PlentyFramework.translate = function( string, params )\n {\n var localeString;\n if ( PlentyFramework.Strings.hasOwnProperty( string ) )\n {\n localeString = PlentyFramework.Strings[string];\n }\n else\n {\n localeString = string;\n console.warn( 'No translation found for \"' + localeString + '\".' );\n }\n\n if ( !!params )\n {\n localeString = Mustache.render( localeString, params );\n }\n\n return localeString;\n\n };\n\n /**\n * Compile registered factories & services\n * @function compile\n * @static\n */\n PlentyFramework.compile = function()\n {\n\n for ( var factory in components.factories )\n {\n if ( !PlentyFramework.factories.hasOwnProperty( factory ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.factories[factory], 3 );\n }\n }\n\n for ( var service in components.services )\n {\n if ( !PlentyFramework.prototype.hasOwnProperty( service ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.services[service], 2 );\n }\n }\n\n for ( var directive in components.directives )\n {\n if ( !PlentyFramework.directives.hasOwnProperty( directive ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.directives[directive], 1 );\n }\n }\n\n var scripts = document.getElementsByTagName( 'SCRIPT' );\n for( var i = scripts.length - 1; i >= 0; i-- ) {\n var path = scripts[i].src.match( /(.*)\\/(.*)\\.js(\\?\\S*)?$/ );\n if( !!path ) {\n PlentyFramework.scriptPath = path[1];\n break;\n }\n }\n\n };\n\n // Level: 1 = directive, 2 = service, 3 = factory\n function compileComponent( component, componentLevel, dependencyStack )\n {\n dependencyStack = dependencyStack || [];\n\n // resolve dependencies\n var compiledDependencies = [];\n for ( var i = 0; i < component.dependencies.length; i++ )\n {\n var dependency = component.dependencies[i];\n if ( $.inArray( dependency, dependencyStack ) < 0 )\n {\n // add dependency to stack to avoid cyclic injection\n dependencyStack.push( dependency );\n\n if ( components.factories.hasOwnProperty( dependency ) )\n {\n // required dependency is a factory\n if ( !PlentyFramework.factories.hasOwnProperty( dependency ) )\n {\n // factory is not compiled yet\n compileComponent( components.factories[dependency], 3, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.factories[dependency] );\n continue;\n }\n\n if ( componentLevel <= 2 && components.services.hasOwnProperty( dependency ) )\n {\n // required dependency is a service\n if ( !PlentyFramework.prototype.hasOwnProperty( dependency ) )\n {\n // service is not compiled yet\n compileComponent( components.services[dependency], 2, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.prototype[dependency] );\n continue;\n }\n\n if ( componentLevel <= 1 && components.directives.hasOwnProperty( dependency ) )\n {\n // required dependency is a directive\n if ( !PlentyFramework.directives.hasOwnProperty( dependency ) )\n {\n // directive is not compiled yet\n compileComponent( components.directives[dependency], 1, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.directives[dependency] );\n continue;\n }\n\n console.error( 'Cannot inject dependency \"' + dependency + '\": Object not found.' );\n }\n else\n {\n console.error( 'Cyclic dependency injection: ' + dependencyStack.join( ' -> ' ) + ' -> ' + dependency );\n }\n }\n\n // compile component\n if ( componentLevel == 3 )\n {\n PlentyFramework.factories[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 2 )\n {\n PlentyFramework.prototype[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 1 )\n {\n PlentyFramework.directives[component.name] = component.setup.apply( null, compiledDependencies );\n }\n }\n\n}( jQuery ));\n\n\n\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.directive( 'Authentication', function( AuthenticationService )\n {\n return {\n login: login\n };\n\n function login( elem )\n {\n pm.getRecentEvent().preventDefault();\n AuthenticationService.customerLogin( $( elem ) );\n }\n }, [\"AuthenticationService\"] );\n\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Basket', function( BasketService )\n {\n\n return {\n addBasketItem : addBasketItem,\n changeItemQuantity: changeItemQuantity,\n setItemQuantity : setItemQuantity\n };\n\n function addBasketItem( elem )\n {\n pm.getRecentEvent().preventDefault();\n //init\n var basketItemsList = {};\n var $elem = $( elem );\n var parentForm = $elem.parents( 'form' );\n\n basketItemsList.BasketItemItemID = parentForm.find( '[name=\"ArticleID\"]' ).val();\n basketItemsList.BasketItemPriceID = parentForm.find( '[name=\"SYS_P_ID\"]' ).val();\n basketItemsList.BasketItemQuantity = parentForm.find( '[name=\"ArticleQuantity\"]' ).val();\n basketItemsList.BasketItemBranchID = parentForm.find( '[name=\"source_category\"]' ).val();\n\n //attributes\n var attributeInputsList = parentForm.find( '[name^=\"ArticleAttribute\"]' );\n var attributesList = [];\n\n $.each( attributeInputsList, function( idx, elem )\n {\n var match = elem.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( elem ).val()\n } );\n }\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItemsList.BasketItemAttributesList = attributesList;\n }\n\n //add basketItem and refresh previewLists\n BasketService.addItem( [basketItemsList] );\n\n }\n\n function changeItemQuantity( elem, increment )\n {\n var $elem = $( elem );\n var $quantityInput = $elem.parent().find( 'input' );\n var maxLength = parseInt( $quantityInput.attr( 'maxlength' ) ) || 5;\n var value = parseInt( $quantityInput.val() ) + increment;\n\n var isBasketView = $elem.parents( '[data-basket-item-id]' ).length > 0;\n\n if ( isBasketView )\n {\n if ( (value + '').length <= maxLength && value >= 0 )\n {\n $quantityInput.val( value );\n }\n\n var timeout = $elem.data( 'timeout' );\n\n if ( !!timeout )\n {\n window.clearTimeout( timeout );\n }\n\n timeout = window.setTimeout( function()\n {\n $quantityInput.trigger( 'change' );\n }, 1000 );\n\n $elem.data( 'timeout', timeout );\n }\n else\n {\n if ( (value + '').length <= maxLength && value >= 1 )\n {\n $quantityInput.val( value );\n }\n }\n }\n\n function setItemQuantity( basketItemID, input )\n {\n BasketService.setItemQuantity(\n basketItemID,\n parseInt( $( input ).val() )\n ).fail( function()\n {\n // reset input's value on cancel\n var basketItem = BasketService.getItem( basketItemID );\n $( input ).val( basketItem.BasketItemQuantity );\n } );\n }\n\n }, ['BasketService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Checkout', function( CheckoutService )\n {\n\n return {\n setMethodOfPayment: setMethodOfPayment,\n confirmAtrigaPaymax: confirmAtrigaPaymax\n };\n\n function setMethodOfPayment( paymentID )\n {\n CheckoutService.setMethodOfPayment( paymentID );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxConfirmed )\n {\n CheckoutService.confirmAtrigaPaymax( atrigaPaymaxConfirmed );\n }\n }, ['CheckoutService'] );\n})( jQuery, PlentyFramework );\n/**\n * Mobile dropdowns\n * Toggles dropdowns using css class 'open' instead of pseudo class :hover\n * Usage:\n *
  • \n * ...\n *
  • \n *\n * possible values for CONDITION\n * \"touch\" : use 'open'-class if device is touch-device AND media size is 'md' or 'lg'\n * \"toggle-xs-sm-or-touch\" : use 'open'-class if device is \"touch\" (as above) OR media size is 'xs' or 'sm'\n *\n */\n(function( $, pm )\n{\n pm.directive( 'MobileDropdown', function( MediaSize )\n {\n // store all dropdown elements\n var dropdownElements = [];\n\n // store dropdown elements which should be closed by clicking outside the element itself\n var closableDropdownElements = [];\n\n return {\n initDropdowns: initDropdowns,\n openDropdown : openDropdown,\n slideDropdown: slideDropdown\n };\n\n function initDropdowns()\n {\n $( window ).on( 'orientationchange sizeChange', function()\n {\n resetDropdowns( dropdownElements );\n resetDropdowns( closableDropdownElements );\n } );\n }\n\n function resetDropdowns( dropdownList, event )\n {\n var $current;\n for ( var i = 0; i < dropdownList.length; i++ )\n {\n $current = $( dropdownList[i] );\n if ( !!event )\n {\n if ( $current.find( $( event.target ) ).length === 0\n && !$( \"#LiveSearchParam\" ).is( \":focus\" )\n && !$( \"#checkout-login-email\" ).is( \":focus\" )\n && !$( \"#checkout-login-password\" ).is( \":focus\" ) )\n {\n $current.removeClass( 'open' );\n $( 'html' ).unbind( \"click touchstart\", resetEvent );\n }\n }\n else\n {\n if ( $current.find( $( event.target ) ).length === 0\n && !$( \"#LiveSearchParam\" ).is( \":focus\" )\n && !$( \"#checkout-login-email\" ).is( \":focus\" )\n && !$( \"#checkout-login-password\" ).is( \":focus\" ) )\n {\n $current.removeClass( 'open' );\n $( 'html' ).unbind( \"click touchstart\", resetEvent );\n }\n }\n }\n\n }\n\n function openDropdown( elem, alwaysClickable )\n {\n var $elem = $( elem );\n var $parent = $elem.parent();\n\n // case 1: xs || sm || ( touch && ( md || lg ) ) -> open/close via click on small devices, open/close via\n // css-hover on desktop, open/close via click on touch-desktop (e.g. top navigation)\n\n if ( !!alwaysClickable && ( MediaSize.isInterval( 'xs, sm' ) || ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n // if href\n if ( !$elem.attr( 'href' ) )\n {\n avoidRedirectinStopPropagation( $parent.not( $elem ) );\n }\n }\n else\n {\n if ( !$elem.attr( 'href' ) )\n {\n // hide dropdown\n $parent.removeClass( 'open' );\n }\n }\n }\n\n // case 2: touch && ( md || lg ) -> open via 1st click on touch-desktop, return false (e.g. main navigation)\n\n if ( !alwaysClickable && ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n avoidRedirectinStopPropagation( $parent );\n }\n else\n {\n // redirect to href if dropdown is already open\n // do nothing\n }\n }\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", resetEvent );\n }\n\n function showDropdownHideOthers( elem, parent )\n {\n var $parent = $( parent );\n\n // hide other dropdowns\n resetDropdowns( closableDropdownElements );\n\n // remember opened dropdown\n if ( $.inArray( $parent[0], closableDropdownElements ) < 0 )\n {\n closableDropdownElements.push( $parent[0] );\n }\n\n // show dropdown\n $parent.addClass( 'open' );\n }\n\n function avoidRedirectinStopPropagation( elem )\n {\n var $elem = $( elem );\n\n // avoid redirecting\n pm.getRecentEvent().preventDefault();\n\n // avoid closing popup by clicking itself\n $elem.off( 'click' );\n $elem.on( 'click', function( e )\n {\n e.stopPropagation();\n } );\n }\n\n function slideDropdown( elem )\n {\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n // size interval query is required since function is used on document ready to initial open active\n // navigation (on small devices)\n if ( MediaSize.isInterval( 'xs, sm' ) )\n {\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 400, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n if ( $.inArray( $elemParent[0], dropdownElements ) < 0 )\n {\n dropdownElements.push( $elemParent[0] );\n }\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", resetEvent );\n }\n\n function resetEvent( event )\n {\n resetDropdowns( closableDropdownElements, event );\n }\n\n }, ['MediaSizeService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Redirect', function( MediaSizeService, NavigatorService )\n {\n\n return {\n to : to,\n toCheckoutTab: toCheckoutTab\n };\n\n function to( href )\n {\n if ( MediaSizeService.interval() != 'xs' )\n {\n if ( typeof href === 'string' && href.indexOf('/') == -1 && $( href ).length > 0 )\n {\n window.location.assign( $( href ).attr( 'href' ) );\n }\n else\n {\n window.location.assign( href );\n }\n }\n }\n\n function toCheckoutTab( tabID )\n {\n NavigatorService.goToID( tabID );\n }\n\n }, ['MediaSizeService', 'NavigatorService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Tab', function( MediaSize )\n {\n\n var tabGroups = {};\n\n return {\n showTab : showTab,\n initRemoteLabel: initRemoteLabel,\n initRemoteTab : initRemoteTab,\n showRemoteTab : showRemoteTab\n };\n\n function showTab( tabSelector )\n {\n $( tabSelector ).tab( 'show' );\n }\n\n function initRemoteLabel( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).addLabel( $elem );\n }\n\n function initRemoteTab( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).setContent( $elem );\n }\n\n function showRemoteTab( tabID, groupID, interval )\n {\n if ( MediaSize.isInterval( interval ) )\n {\n pm.getRecentEvent().preventDefault();\n\n if ( !!tabGroups[groupID] && !!tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].showTab( tabID );\n }\n\n }\n }\n\n function TabGroup()\n {\n var tabs = {};\n var activeTab;\n\n return {\n addTab : addTab,\n showTab : showTab,\n getTab : getTab,\n resetTabs: resetTabs\n };\n\n function addTab( tabID )\n {\n tabs[tabID] = new Tab( tabID );\n return tabs[tabID];\n }\n\n function showTab( tabID )\n {\n var zIndex = 0;\n if ( !!activeTab )\n {\n // activeTab is set\n zIndex = parseInt( activeTab.getContent().parent().css( 'zIndex' ) );\n activeTab.hide();\n activeTab.getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n else\n {\n // activeTab not set before\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n var currentZ = parseInt( tabs[tab].getContent().parent().css( 'zIndex' ) );\n if ( zIndex == 0 || currentZ < zIndex )\n {\n zIndex = currentZ;\n }\n tabs[tab].hide();\n }\n }\n\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n }\n\n $( window ).on( 'sizeChange', resetTabs );\n }\n\n activeTab = tabs[tabID];\n activeTab.getContent().parent().css( 'zIndex', zIndex );\n activeTab.show();\n }\n\n function getTab( tabID )\n {\n return tabs[tabID];\n }\n\n function resetTabs()\n {\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].show();\n }\n }\n\n activeTab = null;\n }\n }\n\n function Tab( id )\n {\n var $content;\n var $labels = [];\n var tabID = id;\n\n return {\n addLabel : addLabel,\n setContent: setContent,\n getContent: getContent,\n getID : getID,\n show : show,\n hide : hide\n };\n\n function getID()\n {\n return tabID;\n }\n\n function addLabel( label )\n {\n $labels.push( label );\n return this;\n }\n\n function setContent( content )\n {\n $content = content;\n return this;\n }\n\n function getContent()\n {\n return $content;\n }\n\n function show()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].addClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.show().addClass( 'in' );\n }\n\n }\n\n function hide()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].removeClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.hide().removeClass( 'in' );\n }\n }\n }\n\n }, ['MediaSizeService'] );\n})( jQuery, PlentyFramework );\n/**\n * Add fancy ui modifications - the visual stuff - here.\n * Respond functionality like 'event':UI.myFunctionality(currentElement)\n *\n * Example:\n * \n *\n */\n(function( $, pm )\n{\n pm.directive( 'UI', function( MediaSizeService, SocialShareService, UIFactory )\n {\n // elements to calculate height.\n var equalHeightElementList = [];\n var toTopButtonList = [];\n\n return {\n initUIWindowEvents : initUIWindowEvents,\n showWaitscreen : showWaitscreen,\n hideWaitscreen : hideWaitscreen,\n addContentPageSlider: addContentPageSlider,\n equalHeight : equalHeight,\n initToTop : initToTop,\n initLazyload : initLazyload,\n initSlideToggle : initSlideToggle,\n slideDown : slideDown,\n slideUp : slideUp,\n slideToggle : slideToggle,\n toggleHideShow : toggleHideShow,\n toggleSocialShare : toggleSocialShare,\n toggleClass : toggleClass,\n addClass : addClass,\n removeClass : removeClass\n };\n\n function initUIWindowEvents()\n {\n // resize elements on window size change.\n $( window ).on( 'sizeChange contentChanged', function()\n {\n fireEqualHeight();\n } );\n\n $( window ).on( \"scroll resize\", function()\n {\n if ( toTopButtonList.length > 0 )\n {\n if ( $( document ).scrollTop() > 100 )\n {\n doToArrayElements( toTopButtonList, \"addClass\", \"visible\" );\n }\n else\n {\n doToArrayElements( toTopButtonList, \"removeClass\", \"visible\" );\n }\n }\n } );\n }\n\n /**\n * Display waitscreen on page e.g. for requests.\n * Use with care and don't forget to hide waitscreen, if your calls are done or broke!!\n */\n function showWaitscreen()\n {\n UIFactory.showWaitscreen();\n }\n\n /**\n * Just hide the waitscreen.\n * @param forceClose\n */\n function hideWaitscreen( forceClose )\n {\n UIFactory.hideWaitscreen( forceClose );\n }\n\n /**\n * Adds content page slider (owlCarousel)\n *\n * usage:\n *
    \n *
    \n * ...\n *
    \n *
    \n * ...\n *
    \n * ...\n *
    \n *\n * Legacy directive selector: data-plenty=\"contentpageSlider\"\n *\n * @param elem\n */\n function addContentPageSlider( elem )\n {\n $( elem ).owlCarousel( {\n navigation : true,\n navigationText : false,\n slideSpeed : 1000,\n paginationSpeed: 1000,\n singleItem : true,\n autoPlay : 6000,\n stopOnHover : true,\n afterMove : function( current )\n {\n $( current ).find( '[data-plenty-rel=\"lazyload\"]' ).trigger( 'appear' );\n }\n } );\n }\n\n /**\n * Equal Box height\n * Calculates equal box height for chosen elements.\n *\n * Legacy directive selector: data-plenty-equal\n *\n * @param elem\n * @param elementExists - default false\n */\n function equalHeight( elem, mediaSizes, elementExists )\n {\n var $elem = $( elem );\n var maxHeight = 0;\n var $equalTarget = {};\n var $equalTargetList = $elem.find( '[data-plenty-rel=\"equal-target\"]' ).length > 0 ? $elem.find( '[data-plenty-rel=\"equal-target\"]' ) : $elem.children();\n\n // if element wasn't pushed before.\n if ( elementExists !== true )\n {\n equalHeightElementList.push( elem );\n }\n\n for ( var i = $equalTargetList.length; i >= 0; i-- )\n {\n $equalTarget = $( $equalTargetList[i] );\n $equalTarget.css( 'height', '' );\n\n if ( $equalTarget.outerHeight( true ) > maxHeight )\n {\n maxHeight = $equalTarget.outerHeight( true );\n }\n }\n\n if ( !mediaSizes || MediaSizeService.isInterval( mediaSizes ) )\n {\n $equalTargetList.height( maxHeight );\n }\n }\n\n /**\n * Scroll page to top.\n * Just add without events.\n *\n * Legacy directive selector: data-plenty=\"toTop\"\n *\n * @param elem\n */\n function initToTop( elem )\n {\n var $elem = $( elem );\n\n $elem.click( function()\n {\n $( 'html, body' ).animate( {\n scrollTop: 0\n }, 400 );\n return false;\n } );\n\n if ( !!$.inArray( $elem, toTopButtonList ) )\n {\n toTopButtonList.push( $elem );\n }\n }\n\n /**\n * lazy load on ready.\n *\n * Legacy directive selector: img[data-plenty-lazyload]\n *\n * @param elem\n */\n function initLazyload( elem, effect )\n {\n var $elem = $( elem );\n\n $elem.lazyload( {\n effect: effect\n } );\n if ( $elem.is( 'img' ) )\n {\n $elem.on( 'loaded', function()\n {\n $elem.css( 'display', 'inline-block' );\n } );\n }\n }\n\n /**\n * Toggle show and hide animation.\n *\n * Legacy directive selector: data-plenty=\"openCloseToggle\"\n *\n * @param elem\n */\n function toggleHideShow( elem )\n {\n\n console.log( elem );\n\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 200, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n /**\n * Toggle target content on click.\n * Bind to checked-/ unchecked-property of radio buttons\n *\n * Legacy directive selector: data-plenty-slidetoggle\n *\n * @param elem\n */\n function initSlideToggle( elem, checked )\n {\n var $elem = $( elem );\n var $targetElement = $( $elem.attr( 'data-plenty-rel' ) );\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n // is radio button\n var $radioGroupList = $( 'input[type=\"radio\"][name=\"' + ( $elem.attr( 'name' ) ) + '\"]' );\n var visibleOnChecked = !checked || checked == 'checked';\n\n $radioGroupList.change( function()\n {\n var $self = $( this );\n $targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n if ( $self.is( ':checked' ) && $self[0] === $elem[0] && visibleOnChecked == true )\n {\n // checked\n $targetElement.slideDown( 400, function()\n {\n fireEqualHeight();\n } );\n }\n else\n {\n // unchecked (since other radio button has been checked)\n $targetElement.slideUp( 400, function()\n {\n fireEqualHeight();\n } );\n }\n } );\n }\n else\n {\n // is not radio button\n $elem.click( function()\n {\n //$targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n $elem.addClass( 'animating' );\n $targetElement.slideToggle( 400, function()\n {\n $elem.removeClass( 'animating' );\n $elem.toggleClass( 'active' );\n fireEqualHeight();\n } );\n } );\n }\n }\n\n function slideDown( target, duration )\n {\n slideAction( $( target ), duration, 'slideDown' );\n }\n\n function slideUp( target, duration )\n {\n slideAction( $( target ), duration, 'slideUp' );\n }\n\n function slideToggle( target, duration )\n {\n slideAction( $( target ), duration, 'slideToggle' );\n }\n\n function slideAction( $target, duration, callbackString )\n {\n duration = duration || 400;\n $target.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n $target[callbackString]( duration, function()\n {\n fireEqualHeight();\n } );\n }\n\n /**\n * TODO check comment\n * Social Share Activation\n * Activate and load share-buttons manually by clicking a separate button\n * Usage / data-attributes:\n *
    \n * Will be used to activate the service set in\n * data-plenty-social=\"\"\n * Will be replaced with loaded share button\n *
    \n *\n * possible values for data-plenty-social:\n * \"facebook-like\" : Load Facebooks \"Like\"-Button\n * \"facebook-recommend\" : Load Facebooks \"Recommend\"-Button\n * \"twitter\" : Load Twitter Button\n * \"google-plus\" : Load google \"+1\"-Button\n *\n * Additional Tooltips\n * You can extend the parent element with a (bootstrap) tooltip by adding data-toggle=\"tooltip\" and\n * title=\"TOOLTIP CONTENT\" Tooltip will be destroyed after activating a social service\n * (!) Requires bootstrap.js\n *\n * Legacy directive selector: data-plenty-social\n *\n * @param elem\n */\n function toggleSocialShare( elem, socialShareService )\n {\n var $elem = $( elem );\n var $toggle = $elem.find( '[data-plenty-rel=\"social-switch\"]' );\n\n // append container to put / delete service.html\n $elem.append( '
    ' );\n\n // add \"off\" class to switch, if neither \"off\" or \"on\" is set\n // replaced hasClass() with is() benchmark: http://jsperf.com/hasclasstest\n if ( !$toggle.is( 'off, on' ) )\n {\n $toggle.addClass( 'off' );\n }\n\n // toggle switch\n $toggle.on( 'click', function()\n {\n if ( $toggle.hasClass( 'off' ) )\n {\n // TODO remove bootstrap dependency\n if ( $elem.attr( \"data-toggle\" ) == \"tooltip\" )\n {\n $elem.tooltip( 'destroy' )\n }\n $toggle.removeClass( 'off' ).addClass( 'on' );\n // hide dummy button\n $elem.find( '[data-plenty-rel=\"social-placeholder\"]' ).hide();\n // load HTML defined in 'api'\n $elem.find( '.social-container' ).append( SocialShareService.getSocialService( socialShareService ) );\n }\n // do not disable social medias after activation\n } );\n }\n\n /**\n * Toggle Class\n * toggle style-classes on click\n * Usage / data-attribute:\n *
    \n * target : jQuery selector to toggle the class at.\n * class : class(es) to toggle at target element\n * media : only toggle class on given media sizes (optional)\n *\n * (!) using data-plenty-toggle on -elements will prevent redirecting to href=\"\"\n *\n * Legacy directive selector: data-plenty-toggle\n *\n * @param cssClass\n * @param target\n * @param interval\n */\n function toggleClass( cssClass, target, interval )\n {\n var $target = $( target );\n /* FIXME\n * Callisto 3.1 Design adaption:\n * NavigationCategoriesList\n * Line 8\n * BEFORE:\n *
  • \n * AFTER:\n *
  • \n *\n * Line 10\n * BEFORE:\n * \n * AFTER:\n * \n *\n * */\n if ( $target.parents( \".navbar-main\" ).length > 0 )\n {\n var $elem = $target.children( \"span\" );\n pm.directives[\"MobileDropdown\"].slideDropdown( $elem );\n return true;\n }\n\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $target.toggleClass( cssClass );\n return false;\n }\n }\n\n function addClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).addClass( cssClass );\n return false;\n }\n }\n\n function removeClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).removeClass( cssClass );\n return false;\n }\n }\n\n /*\n ##### PRIVATE FUNCTIONS ######\n */\n\n function fireEqualHeight()\n {\n for ( var i = equalHeightElementList.length - 1; i >= 0; i-- )\n {\n equalHeight( equalHeightElementList[i], '', true );\n }\n }\n\n function doToArrayElements( array, func, params )\n {\n for ( var i = array.length - 1; i >= 0; i-- )\n {\n array[i][func]( params );\n }\n }\n\n }, ['MediaSizeService', 'SocialShareService', 'UIFactory'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Validator', function( ValidationService )\n {\n\n return {\n validate: validate\n };\n\n function validate( form, errorClass )\n {\n return ValidationService.validate( form, errorClass );\n }\n\n }, ['ValidationService'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Handles requests to ReST API. Provides a {{#crossLink \"APIFactory/handleError:method\"}}default\n * error-handling{{/crossLink}}. Request parameters will be parsed to json internally
    \n * Requires:\n *
      \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class APIFactory\n * @static\n */\n pm.factory( 'APIFactory', function( UI, Modal )\n {\n\n var sessionExpirationTimeout = null;\n $( document ).ready( function()\n {\n renewLoginSession();\n } );\n\n return {\n get : _get,\n post : _post,\n put : _put,\n delete: _delete,\n idle : _idle\n };\n\n function renewLoginSession()\n {\n if ( !pm.getGlobal( 'LoginSession' ) )\n {\n return;\n }\n\n if ( !!sessionExpirationTimeout )\n {\n clearTimeout( sessionExpirationTimeout );\n }\n\n sessionExpirationTimeout = setTimeout( function()\n {\n $( window ).trigger( 'login-expired' );\n\n if ( pm.getGlobal( 'PageDesign' ) === \"Checkout\" )\n {\n Modal.prepare()\n .setTitle( pm.translate( 'Your session has expired.' ) )\n .setContent( pm.translate( 'Please log in again to continue shopping.' ) )\n .setLabelDismiss( null )\n .setLabelConfirm( pm.translate( 'OK' ) )\n .onConfirm( function()\n {\n window.location.assign( '/' );\n } )\n .onDismiss( function()\n {\n window.location.assign( '/' );\n } )\n .show();\n }\n\n }, pm.getGlobal( 'LoginSessionExpiration' ) );\n }\n\n /**\n * Is called by default if a request failed.
    \n * Can be prevented by setting the requests last parameter to false.\n *\n * @function handleError\n * @private\n *\n * @param {object} jqXHR
    jQuery\n * deferred Object\n */\n function handleError( jqXHR )\n {\n try\n {\n var responseText = $.parseJSON( jqXHR.responseText );\n UI.printErrors( responseText.error.error_stack );\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n }\n\n /**\n * Sends a GET request to ReST-API\n *\n * @function get\n *\n * @param {string} url The URL to send the request to\n * @param {object} params The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _get( url, params, ignoreErrors, runInBackground, sync )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'GET',\n data : params,\n dataType: 'json',\n async : !sync,\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a POST request to ReST-API\n *\n * @function post\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _post( url, data, ignoreErrors, runInBackground )\n {\n\n var params = {\n type : 'POST',\n dataType: 'json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n };\n\n if ( !!data && data.isFile )\n {\n params.cache = data.cache;\n params.processData = data.processData;\n params.data = data.data;\n params.contentType = false;\n }\n else\n {\n params.data = JSON.stringify( data );\n params.contentType = 'application/json';\n }\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url, params\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n }\n\n /**\n * Sends a PUT request to ReST-API\n *\n * @function put\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _put( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'PUT',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a DELETE request to ReST-API\n *\n * @function delete\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @returns {object} jQuery\n * deferred Object\n */\n function _delete( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'DELETE',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Get a idle request doing nothing for chaining methods\n * @returns {object} jQuery\n * deferred Object\n */\n function _idle()\n {\n return $.Deferred().resolve();\n }\n\n }, ['UIFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Provide methods for receiving layout containers, layout parameters\n * or category content from API
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    \n * @class CMSFactory\n * @static\n */\n pm.factory( 'CMSFactory', function( API )\n {\n\n return {\n getContainer : getContainer,\n getParams : getParams,\n getCategoryContent: getCategoryContent\n };\n\n /**\n * Prepare the request to receive HTML-Content from CMS\n * @function getContainer\n * @param {string} containerName The Layoutcontainer to receive.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the location in\n * the CMS\n * (e.g. 'Checkout')\n * @example\n * CMSFactory.getContainer( 'CheckoutTotals' ).from( 'Checkout' )\n * .done(function( response ) {\n * // container content\n * var html = response.data[0]\n * });\n */\n function getContainer( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/container_' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n\n }\n\n /**\n * Prepare the request to receive Layout parameters for a template\n * @function getParams\n * @param {string} containerName The Layoutcontainer to receive the parameteres of.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the\n * location in the CMS\n * (e.g. 'ItemView')\n * @example\n * CMSFactory.getParams( 'BasketItemsList' ).from( 'ItemView' )\n * .done(function( response ) {\n * // BasketItems\n * var items = response.data;\n * });\n */\n function getParams( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n }\n\n /**\n * Get the content of a category specified by its ID\n * @function getCategoryContent\n * @param {number} categoryID The ID of the category to get the content from\n * @returns {object} jQuery deferred\n * Object\n */\n function getCategoryContent( categoryID )\n {\n return API.get( '/rest/categoryview/categorycontentbody/?categoryID=' + categoryID );\n }\n\n }, ['APIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Holds checkout data for global access and provides methods\n * for reloading content dynamically-
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutFactory\n * @static\n */\n pm.factory( 'CheckoutFactory', function( API, CMS, UI )\n {\n\n // data received from ReST API\n var checkoutData;\n\n // instance wrapped checkout object for global access\n var checkout;\n\n return {\n getCheckout : getCheckout,\n setCheckout : setCheckout,\n loadCheckout : loadCheckout,\n reloadContainer : reloadContainer,\n reloadCatContent : reloadCatContent,\n reloadItemContainer: reloadItemContainer\n };\n\n function Checkout()\n {\n return checkoutData;\n }\n\n /**\n * Returns instance of wrapped checkout object\n * @function getCheckout\n * @returns {Checkout} Instance of checkout object\n */\n function getCheckout( copy )\n {\n if ( !checkout || !checkoutData )\n {\n loadCheckout( true );\n }\n\n if ( !!copy )\n {\n return $.extend( true, {}, checkoutData );\n }\n return checkout;\n }\n\n /**\n * Receive global checkout data from ReST-API\n * @function loadCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function loadCheckout( sync )\n {\n\n return API.get( '/rest/checkout/', null, false, false, sync )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n }\n\n /**\n * Update checkout data on server\n * @function setCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function setCheckout()\n {\n\n return API.put( '/rest/checkout', checkout )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-checkout-template=\"...\"\n * @function reloadContainer\n * @param {string} container Name of the template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadContainer( container )\n {\n\n return CMS.getContainer( \"checkout\" + container ).from( 'checkout' )\n .done( function( response )\n {\n $( '[data-plenty-checkout-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n } );\n } );\n }\n\n /**\n * Get category content from server and replace received HTML\n * in containers marked with data-plenty-checkout-catcontent=\"...\"\n * @function reloadCatContent\n * @param {number} catId ID of the category to load content (description 1) from server\n * @return {object} jQuery deferred\n * Object\n * @deprecated\n */\n function reloadCatContent( catId )\n {\n\n return CMS.getCategoryContent( catId )\n .done( function( response )\n {\n $( '[data-plenty-checkout-catcontent=\"' + catId + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-itemview-template=\"...\"\n * @function reloadItemContainer\n * @param {string} container Name of the (item view) template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadItemContainer( container )\n {\n\n return CMS.getContainer( 'itemview' + container ).from( 'itemview' )\n .done( function( response )\n {\n $( '[data-plenty-itemview-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n }, ['APIFactory', 'CMSFactory', 'UIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Provides methods for creating and displaying modal popups.\n * @class ModalFactory\n * @static\n */\n pm.factory( 'ModalFactory', function()\n {\n\n return {\n prepare: prepare,\n isModal: isModal\n };\n\n /**\n * Detect if given html contains a valid modal\n * @function isModal\n * @param {string} html\n * @returns {boolean}\n */\n function isModal( html )\n {\n return PlentyFramework.partials.Modal.isModal( html );\n }\n\n /**\n * Create a new Instance of {{#crossLink \"ModalFactory.Modal\"}}Modal{{/crossLink}}\n * @function prepare\n * @returns {Modal}\n */\n function prepare( selector )\n {\n return new Modal( selector );\n }\n\n /**\n * Holds configuration of a modal and provides methods for displaying and hiding the modal\n * @class Modal\n * @for ModalFactory\n * @returns {Modal}\n * @constructor\n */\n function Modal( selector )\n {\n\n var modal = this;\n modal.selector = selector;\n\n /**\n * The title of the modal\n * @attribute title\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.title = '';\n\n modal.cssClass = '';\n\n /**\n * The content of the modal\n * @attribute content\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.content = '';\n\n /**\n * The content of the dismiss-button\n * @attribute labelDismiss\n * @type {string}\n * @private\n * @default \"Abbrechen\"\n */\n modal.labelDismiss = pm.translate( \"Cancel\" );\n\n /**\n * the label of the confirmation button\n * @attribute labelConfirm\n * @type {string}\n * @private\n * @default \"Bestätigen\"\n */\n modal.labelConfirm = pm.translate( \"Confirm\" );\n\n /**\n * Callback when modal is confirmed by clicking confirmation button.\n * Modal will not be dismissed if callback returns false.\n * @attribute onConfirm\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onConfirm = function()\n {\n };\n\n /**\n * Callback when modal is dismissed by closing the modal\n * @attribute onDismiss\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onDismiss = function()\n {\n };\n\n /**\n * jQuery selector of the container element to display the modal in.\n * @attribute container\n * @type {string}\n * @private\n * @default \"body\"\n */\n modal.container = 'body';\n\n /**\n * Timeout to close the modal automatically. Set <0 to disable.\n * @attribute timeout\n * @type {number}\n * @private\n * @default -1\n */\n modal.timeout = -1;\n\n modal.hide = hide;\n modal.startTimeout = startTimeout;\n modal.stopTimeout = stopTimeout;\n modal.pauseTimeout = pauseTimeout;\n modal.continueTimeout = continueTimeout;\n\n var bsModal;\n var timeout, interval;\n var timeRemaining, timeStart;\n var paused = false;\n\n return {\n setTitle : setTitle,\n setClass : setClass,\n setContent : setContent,\n setContainer : setContainer,\n setLabelConfirm: setLabelConfirm,\n setLabelDismiss: setLabelDismiss,\n onConfirm : onConfirm,\n onDismiss : onDismiss,\n setTimeout : setTimeout,\n show : show,\n hide : hide\n };\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/title:attribute}}title{{/crossLink}} of the modal\n * @function setTitle\n * @param {string} title The title\n * @returns {Modal} Modal object for chaining methods\n */\n function setTitle( title )\n {\n modal.title = title;\n return this;\n }\n\n function setClass( cssClass )\n {\n modal.cssClass = cssClass;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/content:attribute}}content{{/crossLink}} of the modal\n * @function setContent\n * @param {string} content The content\n * @returns {Modal} Modal object for chaining methods\n */\n function setContent( content )\n {\n modal.content = content;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelConfirm:attribute}}label of the confirmation\n * button{{/crossLink}} of the modal\n * @function setLabelConfirm\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelConfirm( label )\n {\n modal.labelConfirm = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelDismiss:attribute}}label if the dismiss\n * button{{/crossLink}} of the modal\n * @function setLabelDismiss\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelDismiss( label )\n {\n modal.labelDismiss = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onConfirm:attribute}}confirmation callback{{/crossLink}} of the\n * modal\n * @function onConfirm\n * @param {function} callback The callback if modal is confirmed\n * @returns {Modal} Modal object for chaining methods\n */\n function onConfirm( callback )\n {\n modal.onConfirm = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onDismiss:attribute}}dismiss callback{{/crossLink}} of the modal\n * @function onDismiss\n * @param {function} callback The callback if modal is dismissed\n * @returns {Modal} Modal object for chaining methods\n */\n function onDismiss( callback )\n {\n modal.onDismiss = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/container:attribute}}container{{/crossLink}} of the modal\n * @function setContainer\n * @param {string} container The jQuery selector of the container to display the modal in\n * @returns {Modal} Modal object for chaining methods\n */\n function setContainer( container )\n {\n modal.container = container;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/timeout:attribute}}timeout{{/crossLink}} of the modal\n * @function setTimeout\n * @param {number} timeout The timeout to close the modal automatically. Set <0 to disable\n * @returns {Modal} Modal object for chaining methods\n */\n function setTimeout( timeout )\n {\n modal.timeout = timeout;\n return this;\n }\n\n /**\n * Inject modal data in default template if not template is given\n * and display the modal inside the configured container.
    \n * Start timer to hide the modal automatically if timeout is set.\n * @function show\n */\n function show()\n {\n if( !!modal.selector )\n {\n bsModal = $( modal.selector );\n }\n else\n {\n if ( isModal( modal.content ) )\n {\n bsModal = PlentyFramework.partials.Modal.getModal( modal.content );\n }\n else\n {\n bsModal = $( PlentyFramework.compileTemplate( 'modal/modal.html', modal ) );\n }\n\n $( modal.container ).append( bsModal );\n\n // append additional scripts executable\n var scripts = $( modal.content ).filter( 'script' );\n if ( scripts.length > 0 )\n {\n scripts.each( function( i, script )\n {\n var element = document.createElement( 'script' );\n element.type = 'text/javascript';\n element.innerHTML = $( script ).text();\n $( modal.container ).append( element );\n } );\n }\n }\n\n // bind callback functions\n PlentyFramework.partials.Modal.init( bsModal, modal );\n bsModal.find( '[data-plenty-modal=\"confirm\"]' ).click( function()\n {\n var close = modal.onConfirm();\n\n if ( typeof close == \"undefined\" )\n {\n close = true;\n }\n\n if ( close )\n {\n hide( true );\n }\n } );\n\n PlentyFramework.partials.Modal.show( bsModal );\n\n if ( modal.timeout > 0 )\n {\n startTimeout();\n }\n\n }\n\n /**\n * Hide the modal.\n * @function hide\n * @param {boolean} confirmed Flag indicating of modal is closed by confirmation button or dismissed\n */\n function hide( confirmed )\n {\n PlentyFramework.partials.Modal.hide( bsModal );\n\n if ( !confirmed )\n {\n modal.onDismiss();\n }\n }\n\n /**\n * Start the configured timeout initially\n * @function startTimeout\n * @private\n */\n function startTimeout()\n {\n timeRemaining = modal.timeout;\n timeStart = (new Date()).getTime();\n\n timeout = window.setTimeout( function()\n {\n window.clearInterval( interval );\n hide();\n }, modal.timeout );\n\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( timeRemaining / 1000 );\n interval = window.setInterval( function()\n {\n if ( !paused )\n {\n var secondsRemaining = timeRemaining - (new Date()).getTime() + timeStart;\n secondsRemaining = Math.round( secondsRemaining / 1000 );\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( secondsRemaining );\n }\n }, 1000 )\n }\n\n /**\n * Pause the timeout (e.g. on hover)\n * @function pauseTimeout\n * @private\n */\n function pauseTimeout()\n {\n paused = true;\n timeRemaining -= (new Date()).getTime() - timeStart;\n window.clearTimeout( timeout );\n }\n\n /**\n * Continue paused timeout\n * @function continueTimeout\n * @private\n */\n function continueTimeout()\n {\n paused = false;\n timeStart = (new Date()).getTime();\n timeout = window.setTimeout( function()\n {\n hide();\n window.clearInterval( interval );\n }, timeRemaining );\n }\n\n /**\n * Stop timeout. Stopped timeouts cannot be continued.\n * @function stopTimeout\n * @private\n */\n function stopTimeout()\n {\n window.clearTimeout( timeout );\n window.clearInterval( interval );\n }\n\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Displaying error messages and handling wait screen\n * @class UIFactory\n * @static\n */\n pm.factory( 'UIFactory', function()\n {\n /**\n * Increased/ decreased when showing/ hiding wait screen to avoid stacking\n * multiple instances of overlays.\n * @attribute waitScreenCount\n * @private\n * @type {number}\n * @default 0\n */\n var waitScreenCount = 0;\n var waitScreen;\n var errorPopup = null;\n\n return {\n throwError : throwError,\n printErrors : printErrors,\n showWaitScreen: showWaitScreen,\n hideWaitScreen: hideWaitScreen\n };\n\n /**\n * Display a single error message.\n * @function throwError\n * @param {number} code A code identifying this error\n * @param {string} msg The error message to display\n */\n function throwError( code, msg )\n {\n printErrors( [{code: code, message: msg}] );\n }\n\n /**\n * Wrap error messages in error popup, if popup doesn't already contain this error\n * If popup is already visible, append new errors to popup's inner HTML\n * otherwise create new popup\n * @function printErrors\n * @param {Array} errorMessages A list of errors to display\n */\n function printErrors( errorMessages )\n {\n\n // create error-popup if not exist\n if ( !errorPopup || $( 'body' ).has( errorPopup ).length <= 0 )\n {\n errorPopup = $( pm.compileTemplate( 'error/errorPopup.html' ) );\n $( 'body' ).append( errorPopup );\n pm.partials.Error.init( errorPopup );\n }\n\n $.each( errorMessages, function( key, error )\n {\n // add additional error, if not exist.\n pm.partials.Error.addError( errorPopup, $( pm.compileTemplate( 'error/errorMessage.html', error ) ) );\n } );\n\n pm.partials.Error.show( errorPopup );\n\n hideWaitScreen( true );\n }\n\n /**\n * Show wait screen if not visible and increase\n * {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * @function showWaitScreen\n */\n function showWaitScreen()\n {\n waitScreenCount = waitScreenCount || 0;\n\n // create wait-overlay if not exist\n if ( !waitScreen || $( 'body' ).has( waitScreen ).length <= 0 )\n {\n waitScreen = $( pm.compileTemplate( 'waitscreen/waitscreen.html' ) );\n $( 'body' ).append( waitScreen );\n }\n\n pm.partials.WaitScreen.show( waitScreen );\n\n // increase instance counter to avoid showing multiple overlays\n waitScreenCount++;\n return waitScreenCount;\n }\n\n /**\n * Decrease {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * and hide wait screen if waitScreenCount is 0\n * @function hideWaitScreen\n * @param {boolean} forceClose set true to hide wait screen independent from the value of waitScreenCount.\n */\n function hideWaitScreen( forceClose )\n {\n\n // decrease overlay count\n waitScreenCount--;\n\n // hide if all instances of overlays has been closed\n // or if closing is forced by user\n if ( waitScreenCount <= 0 || !!forceClose )\n {\n waitScreenCount = 0;\n pm.partials.WaitScreen.hide( waitScreen );\n }\n return waitScreenCount;\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Factories provide static functions and can be injected into\n * {{#crossLinkModule \"Services\"}}services{{/crossLinkModule}}.
    \n * Factories also can inject other factories. Compared to services,\n * factories are not visible in instances of {{#crossLinkModule \"PlentyFramework\"}}PlentyFramework{{/crossLinkModule}}.\n *\n * @module Factories\n * @main Factories\n */\nObject.equals = function( a, b )\n{\n if ( a === b )\n {\n return true;\n }\n if ( !(a instanceof Object) || !(b instanceof Object) )\n {\n return false;\n }\n if ( a.constructor !== b.constructor )\n {\n return false;\n }\n\n for ( var key in a )\n {\n if ( !a.hasOwnProperty( key ) )\n {\n continue;\n }\n if ( !b.hasOwnProperty( key ) )\n {\n return false;\n }\n if ( a[key] === b[key] )\n {\n continue;\n }\n if ( typeof( a[key] ) !== \"object\" )\n {\n return false;\n }\n if ( !Object.equals( a[key], b[key] ) )\n {\n return false;\n }\n }\n\n for ( var key in b )\n {\n if ( b.hasOwnProperty( key ) && !a.hasOwnProperty( key ) )\n {\n return false;\n }\n }\n\n return true;\n\n};\nPlentyFramework.cssClasses = {\n\n active: \"active\"\n\n};\n(function( $, pm )\n{\n\n pm.partials.Error = {\n\n /**\n * Will be called, after the error popup was created and injected in DOM.\n * @param {HTMLElement} popup The injected element of the popup\n */\n init: function( popup )\n {\n $( popup ).find( '.close' ).click( function()\n {\n pm.partials.Error.hideAll();\n } );\n },\n\n /**\n * Will be called for each thrown error. Has to be injected in DOM manually.\n * @param {HTMLElement} popup The error popup element\n * @param {HTMLElement} error The error message element\n */\n addError: function( popup, error )\n {\n var errorCode = $( error ).attr( 'data-plenty-error-code' );\n\n if ( $( popup ).find( '[data-plenty-error-code=\"' + errorCode + '\"]' ).length <= 0 )\n {\n $( popup ).find( '.plentyErrorBoxInner' ).append( error );\n }\n },\n\n /**\n * Will be called, after initialization and injection of all errors\n * @param {HTMLElement} popup The error popup element\n */\n show: function( popup )\n {\n $( popup ).show();\n },\n\n hideAll: function() {\n $( '#CheckoutErrorPane' ).hide();\n $( '#CheckoutErrorPane' ).find( '.plentyErrorBoxInner' ).html( '' );\n }\n\n }\n\n})( jQuery, PlentyFramework );\n(function( $, pm )\n{\n\n pm.partials.Modal = {\n\n /**\n * Will be called after a new modal was created and injected into DOM\n * @param {HTMLElement} element The injected modal element\n * @param {Modal} modal The instance of the current modal\n */\n init: function( element, modal )\n {\n element.on( 'hidden.bs.modal', function()\n {\n modal.hide();\n if( !modal.selector )\n {\n //Do not remove static modals\n element.remove();\n }\n } );\n\n if ( modal.timeout > 0 )\n {\n element.on( 'hide.bs.modal', modal.stopTimeout );\n element.find( '.modal-content' ).hover( function()\n {\n modal.pauseTimeout();\n }, function()\n {\n if ( element.is( '.in' ) )\n {\n modal.continueTimeout();\n }\n } );\n }\n },\n\n /**\n * Will be called if a Modal requests to show.\n * @param {HTMLElement} element The injected modal element\n */\n show: function( element )\n {\n element.modal( 'show' );\n },\n\n /**\n * Will be called if a Modal requests to hide.\n * @param {HTMLElement} element The injected modal element\n */\n hide: function( element )\n {\n element.modal( 'hide' );\n },\n\n /**\n * Detect if a given HTML string contains a modal\n * @param {HTMLElement} html the element to search a modal in.\n * @returns {boolean} true if a modal was found\n */\n isModal: function( html )\n {\n return $( html ).filter( '.modal' ).length + $( html ).find( '.modal' ).length > 0;\n },\n\n /**\n * Filter a modal from a given HTML string\n * @param {HTMLElement} html the element to get a modal from.\n * @returns {HTMLElement} the filtered modal element\n */\n getModal: function( html )\n {\n var modal = $( html );\n if ( modal.length > 1 )\n {\n modal = $( html ).filter( '.modal' ) || $( html ).find( '.modal' );\n }\n\n return modal;\n }\n\n };\n\n}( jQuery, PlentyFramework ));\n(function( $ )\n{\n\n $( document ).on( 'initPartials', function( e, root )\n {\n\n $( root ).find( '[data-toggle=\"tooltip\"]' ).tooltip( {\n container: 'body'\n } );\n\n } );\n\n})( jQuery );\n(function( $, pm )\n{\n\n pm.partials.WaitScreen = {\n\n /**\n * Will be called if the wait screen should be shown\n * @param {HTMLElement} element The wait screen element\n */\n show: function( element )\n {\n element.addClass( 'in' );\n },\n\n /**\n * Will be called if the wait screen should be hidden\n * @param {HTMLElement} element The wait screen element\n */\n hide: function( element )\n {\n element.removeClass( 'in' );\n }\n\n };\n\n})( jQuery, PlentyFramework );\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.service( 'AddressDoctorService', function( API )\n {\n return {\n validateAddress: validateAddress\n };\n\n function validateAddress( addressForms )\n {\n var addressIsValid = true;\n addressForms = addressForms || '[data-plenty-address-doctor]';\n $( addressForms ).filter( '[data-plenty-address-doctor]:visible' ).each( function( i, form )\n {\n var addressDoctor = new AddressDoctor( form );\n var requiredFields = $( form ).attr( 'data-plenty-address-doctor' ).replace( /\\s/g, '' ).split( ',' );\n if ( !addressDoctor.isValid( requiredFields ) )\n {\n addressIsValid = false;\n }\n\n } );\n\n return addressIsValid;\n }\n\n function AddressDoctor( form )\n {\n var $form = $( form );\n var $inputs = {\n Street : $form.find( 'input[name=\"Street\"]' ),\n ZIP : $form.find( 'input[name=\"ZIP\"]' ),\n City : $form.find( 'input[name=\"City\"]' ),\n HouseNo: $form.find( 'input[name=\"HouseNo\"]' )\n };\n var $suggestionContainer = {};\n\n var suggestions;\n var requiredFields;\n\n return {\n isValid: isValid\n };\n\n function isValid( fields )\n {\n\n if ( isPackstation() )\n {\n return true;\n }\n\n suggestions = new AddressList( $form.getFormValues() );\n requiredFields = fields;\n\n refreshView();\n\n return suggestions.getAddresses().length == 1;\n }\n\n function refreshView()\n {\n $( '.suggestion-list' ).remove();\n\n var suggestionListVisible = false;\n for ( var i = 0; i < requiredFields.length; i++ )\n {\n if ( !validateInput( requiredFields[i], suggestionListVisible ) )\n {\n $form.trigger( 'validationFailed' );\n suggestionListVisible = true;\n }\n }\n\n if ( suggestions.houseNoAllowed( $inputs.HouseNo.val() ) || suggestions.getAddresses().length == 1 )\n {\n $inputs.HouseNo.removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs.HouseNo.addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n }\n else\n {\n $inputs.HouseNo.removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs.HouseNo.addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n }\n }\n\n function validateInput( key, suggestionListVisible )\n {\n var valueList = suggestions.getList( key );\n\n if ( !!$suggestionContainer[key] )\n {\n $suggestionContainer[key].remove();\n }\n\n if ( !$inputs[key] )\n {\n return true;\n }\n\n if ( valueList.length == 1 )\n {\n $inputs[key].val( valueList[0] );\n\n $inputs[key].removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs[key].addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n return true;\n }\n else\n {\n $inputs[key].removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs[key].addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n\n if ( !suggestionListVisible )\n {\n buildSuggestionList( $inputs[key], valueList );\n }\n $inputs[key].off( 'focus' );\n $inputs[key].focus();\n return false;\n\n }\n }\n\n function positionSuggestionList( $parent, suggestionKey )\n {\n $suggestionContainer[suggestionKey].css( {\n 'width': $parent.outerWidth( true ),\n 'left' : $parent.position().left,\n 'top' : $parent.position().top + $parent.outerHeight( true )\n } );\n }\n\n function buildSuggestionList( $parent, values )\n {\n var suggestionKey = $parent.attr( 'name' );\n\n // render html content\n $suggestionContainer[suggestionKey] = $( pm.compileTemplate( 'addressSuggestions/addressDoctor.html', {values: values} ) );\n\n positionSuggestionList( $parent, suggestionKey );\n\n $( window ).on( 'sizeChange', function()\n {\n positionSuggestionList( $parent, suggestionKey );\n } );\n\n // bind click event to list elements\n $suggestionContainer[suggestionKey].find( '[data-address-value]' ).each( function( i, elem )\n {\n\n var $elem = $( elem );\n var value = $elem.attr( 'data-address-value' );\n\n $elem.click( function()\n {\n // insert clicked value in input\n $parent.val( value );\n\n // filter addresses and show remaining suggestions\n var filterAddress = {};\n filterAddress[$parent.attr( 'name' )] = value;\n suggestions.filter( filterAddress );\n\n // refresh suggestion lists\n refreshView();\n\n } );\n\n } );\n\n // inject html\n $parent.parent().append( $suggestionContainer[suggestionKey] );\n }\n\n function isPackstation()\n {\n return ( $inputs.Street.val().toUpperCase() == \"PACKSTATION\" || $inputs.Street.val().toUpperCase() == \"POSTFILIALE\" );\n }\n\n }\n\n function AddressList( addressInput )\n {\n var addresses = [];\n\n init();\n\n return {\n getAddresses : getAddresses,\n getList : getList,\n filter : filter,\n houseNoAllowed: houseNoAllowed\n };\n\n function init()\n {\n API.get( '/rest/checkout/addresssuggestionresultslist/', {\n suggestionType: \"addressdoctor\",\n street : addressInput.Street,\n ZIP : addressInput.ZIP,\n city : addressInput.City,\n houseNo : addressInput.HouseNo,\n country : addressInput.CountryID\n }, false, false, true ).done( function( response )\n {\n\n var responseLength = response.data.length;\n\n for ( var i = 0; i < responseLength; i++ )\n {\n var currentResponse = response.data[i];\n\n var address = getAddress( currentResponse )\n if ( !address )\n {\n currentResponse.HouseNo = [currentResponse.HouseNo];\n addresses.push( currentResponse );\n }\n else\n {\n address.HouseNo.push( currentResponse.HouseNo );\n }\n\n }\n\n } );\n }\n\n function getAddress( suggestion )\n {\n var addressCount = addresses.length;\n\n for ( var j = 0; j < addressCount; j++ )\n {\n if ( suggestion.Street == addresses[j].Street && addresses.ZIP == addresses[j].ZIP && suggestion.City == addresses[j].City )\n {\n return addresses[j];\n }\n }\n\n return null;\n\n }\n\n function getAddresses()\n {\n return addresses;\n }\n\n function getList( key )\n {\n var results = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( $.inArray( address[key], results ) < 0 )\n {\n results.push( address[key] );\n }\n }\n\n return results;\n }\n\n function filter( filterAddress )\n {\n var filteredAddresses = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( (!!filterAddress.Street && filterAddress.Street == address.Street)\n || (!!filterAddress.ZIP && filterAddress.ZIP == address.ZIP)\n || (!!filterAddress.City && filterAddress.City == address.City) )\n {\n filteredAddresses.push( address );\n }\n }\n\n addresses = filteredAddresses;\n }\n\n function houseNoAllowed( houseNo )\n {\n houseNo = parseInt( houseNo );\n\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n\n for ( var j = 0; j < address.HouseNo.length; j++ )\n {\n var range = address.HouseNo[j].split( '-' );\n if ( ( range.length == 1 && houseNo == range[0] )\n || range.length == 2 && houseNo >= range[0] && houseNo <= range[1] )\n {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for logging in and out and registering new customers.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    \n * @class AuthenticationService\n * @static\n */\n pm.service( 'AuthenticationService', function( API, Checkout, UI )\n {\n\n return {\n resetPassword : resetPassword,\n customerLogin : customerLogin,\n setInvoiceAddress: setInvoiceAddress,\n registerCustomer : registerCustomer\n };\n\n /**\n * Reading E-Mail from form marked with data-plenty-checkout=\"lostPasswordForm\"\n * and sends request to provide a new password to the entered E-Mail-Address.\n *\n * @function resetPasswort\n * @return {object} jQuery deferred\n * Object\n */\n function resetPassword()\n {\n\n var form = $( '[data-plenty-checkout=\"lostPasswordForm\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n var params = {\n Email: values.Email\n };\n\n return API.post( \"/rest/checkout/lostpassword/\", params )\n .done( function( response )\n {\n if ( response.data.IsMailSend == true )\n {\n $( '[data-plenty-checkout=\"lostPasswordTextContainer\"]' ).hide();\n $( '[data-plenty-checkout=\"lostPasswordSuccessMessage\"]' ).show();\n }\n } );\n\n }\n }\n\n /**\n * Try to login in with credentials read from given <form> - element.\n * On success redirect to forms 'action' attribute.\n *\n * @function customerLogin\n * @param {object} form The jQuery-wrapped form-element to read the credentials from\n * @return {object} jQuery deferred\n * Object\n */\n function customerLogin( form )\n {\n if ( form.validateForm() )\n {\n var values = form.getFormValues();\n\n var params = {\n Email : values.loginMail,\n Password: values.loginPassword\n };\n\n UI.showWaitScreen();\n return API.post( \"/rest/checkout/login/\", params )\n .done( function()\n {\n // successful login -> go to form's target referenced by action-attribute\n window.location.assign( form.attr( 'action' ) );\n\n } );\n }\n }\n\n /**\n * Setting the invoice address of a newly registered customer or a guest.\n *\n * @function setInvoiceAddress\n * @param {object} invoiceAddress containing address-data sent to server\n * @return {object} jQuery deferred\n * Object\n */\n function setInvoiceAddress( invoiceAddress )\n {\n\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n Checkout.getCheckout().CustomerInvoiceAddress = response.data;\n } );\n }\n\n /**\n * Prepare address-data to register new customer. Read the address-data from a <form> marked with\n * data-plenty-checkout-form=\"customerRegistration\"
    \n * On success, redirect to forms target referenced by action-attribute\n *\n * @function registerCustomer\n * @return {object} jQuery deferred\n * Object\n */\n function registerCustomer()\n {\n var form = $( '[data-plenty-checkout-form=\"customerRegistration\"]' );\n\n if ( form.validateForm() && pm.getInstance().AddressDoctorService.validateAddress() )\n {\n var values = form.getFormValues();\n values.LoginType = 2;\n\n if ( values.checkout\n && values.checkout.customerInvoiceAddress\n && values.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = values.checkout.customerInvoiceAddress.CustomerProperty;\n values.CustomerPropertiesList = values.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n values.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n return setInvoiceAddress( values )\n .done( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } );\n }\n }\n }, ['APIFactory', 'CheckoutFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for adding, editing or removing basket items and coupon codes
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class BasketService\n * @static\n */\n pm.service( 'BasketService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n addItem : addBasketItem,\n removeItem : removeBasketItem,\n getItem : getBasketItem,\n setItemQuantity : setItemQuantity,\n editItemAttributes: editItemAttributes,\n editOrderParams : editOrderParams,\n addCoupon : addCoupon,\n removeCoupon : removeCoupon\n };\n\n /**\n * Add item to basket. Will fail and show a popup if item has order params\n * @function addBasketItem\n * @param {Array} article Array containing the item to add\n * @param {boolean} [isUpdate=false] Indicating if item's OrderParams are updated\n * @return {object} jQuery deferred\n * Object\n */\n function addBasketItem( article )\n {\n\n if ( !!article )\n {\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/',\n {\n itemID : article[0].BasketItemItemID,\n quantity: article[0].BasketItemQuantity\n }, false, true ).done( function( resp )\n {\n // checking for order params!\n if ( resp.data[0].indexOf( \"form-group\" ) > 0 )\n {\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Select order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n addArticle( saveOrderParams( article ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n }\n else\n {\n addArticle( article );\n }\n } );\n }\n }\n\n /**\n * Read OrderParams from <form> marked with data-plenty-checkout-form=\"OrderParamsForm\" and inject\n * read values in 'addBasketList'. Update item by calling addBasketItem() again\n * @function saveOrderParams\n * @private\n * @param {Array} articleWithParams Containing the current item to add. Read OrderParams will be injected\n */\n function saveOrderParams( articleWithParams )\n {\n //TODO use $(\"[data-plenty-checkout-form='OrderParamsForm']\").serializeArray() to get order params\n var orderParamsForm = $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' );\n var $self = {};\n var attrType = \"\";\n var match;\n\n //Groups\n orderParamsForm.find( '[name^=\"ParamGroup\"]' ).each( function()\n {\n match = this.name.match( /^ParamGroup\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], $( this ).val(), $( this ).val() );\n } );\n\n //Values\n orderParamsForm.find( '[name^=\"ParamValue\"]' ).each( function()\n {\n $self = $( this );\n attrType = $self.attr( 'type' );\n\n if ( ((attrType == 'checkbox' && $self.is( ':checked' )) ||\n (attrType == 'radio' && $self.is( ':checked' )) ||\n (attrType != 'radio' && attrType != 'checkbox')) && attrType != 'file' && attrType != 'hidden' )\n {\n\n var match = $self[0].name.match( /^ParamValue\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], $self.val() );\n\n }\n else if ( attrType == 'file' )\n {\n if ( $self[0].files && $self[0].files.length > 0 )\n {\n articleWithParams = orderParamFileUpload( $self, articleWithParams );\n }\n else\n {\n var match = $self[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n var paramValue = $( 'input[type=\"hidden\"][name=\"ParamValue[' + match[1] + '][' + match[2] + ']\"]' ).val();\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], paramValue );\n }\n }\n } );\n\n return articleWithParams;\n }\n\n function addArticle( article )\n {\n API.post( '/rest/checkout/basketitemslist/', article, true )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n // Show confirmation popup\n CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', {ArticleID: article[0].BasketItemItemID} ).from( 'ItemView' )\n .done( function( response )\n {\n var timeout = pm.getGlobal( 'TimeoutItemToBasketOverlay', 5000 );\n var modal = Modal.prepare().setContent( response.data[0] );\n\n if ( timeout > 0 )\n {\n modal.setTimeout( timeout );\n }\n\n modal.show();\n } );\n } );\n } ).fail( function( jqXHR )\n {\n // some other error occured\n UI.printErrors( JSON.parse( jqXHR.responseText ).error.error_stack );\n } );\n }\n\n function updateArticle( article )\n {\n API.put( '/rest/checkout/basketitemslist/', article )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n } );\n } )\n }\n\n function orderParamFileUpload( $input, articleWithParams )\n {\n var key = $input[0].id;\n var orderParamUploadFiles = {};\n var orderParamFileIdStack = [];\n var formData;\n var fileData;\n var params = {\n type : 'POST',\n data : {},\n isFile : true,\n cache : false,\n dataType : 'json',\n processData: false,\n contentType: false\n };\n\n orderParamUploadFiles[key] = $input[0].files;\n\n // if input not pushed before.\n if ( orderParamFileIdStack.indexOf( key ) == -1 )\n {\n orderParamFileIdStack.push( key );\n }\n\n for ( var i = 0, length = orderParamFileIdStack.length; i < length; ++i )\n {\n formData = new FormData();\n fileData = orderParamUploadFiles[orderParamFileIdStack[i]];\n formData.append( \"0\", fileData[0], fileData[0].name );\n\n params.data = formData;\n\n API.post( \"/rest/checkout/orderparamfile/\", params );\n }\n\n var match = $input[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n\n return addOrderParamValue( articleWithParams, match[1], match[2], orderParamUploadFiles[key][0]['name'] );\n }\n\n /**\n * Inject an OrderParam.\n * @function addOrderParamValue\n * @private\n * @param {Array} basketList The target to inject the value in.\n * @param {number} position Position where to inject the value\n * @param {number} paramId The ID of the OrderParam to inject\n * @param {string|number} paramValue the value of the OrderParam to inject\n * @returns {Array} Containing the item and the injected OrderParam\n */\n function addOrderParamValue( basketList, position, paramId, paramValue )\n {\n if ( position > 0 && basketList[position] == undefined )\n {\n basketList[position] = $.extend( true, {}, basketList[0] );\n basketList[position].BasketItemOrderParamsList = [];\n }\n\n if ( basketList[position] != undefined )\n {\n basketList[position].BasketItemQuantity = 1;\n if ( basketList[position].BasketItemOrderParamsList == undefined )\n {\n basketList[position].BasketItemOrderParamsList = [];\n }\n if ( paramValue )\n {\n basketList[position].BasketItemOrderParamsList.push( {\n BasketItemOrderParamID : paramId,\n BasketItemOrderParamValue: paramValue\n } );\n }\n }\n\n return basketList;\n }\n\n function editItemAttributes( BasketItemID )\n {\n var modal = $( '[data-plenty-basket-item=\"' + BasketItemID + '\"]' );\n modal.modal( 'show' );\n modal.find( '[data-plenty-modal=\"confirm\"]' ).on( 'click', function()\n {\n var basketItem = getBasketItem( BasketItemID );\n var attributesList = [];\n\n // check for select or list of images\n modal.find( 'select, .PlentyFormContainer.AttrImage > input[type=\"hidden\"]' ).each( function( i, attributeSelect )\n {\n var match = attributeSelect.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( attributeSelect ).val()\n } );\n }\n\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItem.BasketItemAttributesList = attributesList;\n }\n //update basketItem and refresh previewLists\n updateArticle( [basketItem] );\n\n } );\n }\n\n function editOrderParams( BasketItemID )\n {\n\n var basketItem = getBasketItem( BasketItemID );\n // FIX: unset old order params\n\n basketItem.BasketItemOrderParamsList = [];\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/', {\n itemID : basketItem.BasketItemItemID,\n quantity : basketItem.BasketItemQuantity,\n basketItemID: BasketItemID\n } ).done( function( resp )\n {\n // checking for order params!\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Edit order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n updateArticle( saveOrderParams( [basketItem] ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n } );\n }\n\n function getBasketItem( BasketItemID )\n {\n var basketItems = Checkout.getCheckout().BasketItemsList;\n for ( var i = 0; i < basketItems.length; i++ )\n {\n if ( basketItems[i].BasketItemID == BasketItemID )\n {\n return basketItems[i];\n }\n }\n\n return null;\n }\n\n /**\n * Remove item from basket. Will show a confirmation popup at first.\n * @function removeBasketItem\n * @param {number} BasketItemID The ID of the basket item to remove\n * @param {boolean} [forceDelete=false] Set true to remove the basket item without showing a confirmation popup\n * @return Promise\n */\n function removeBasketItem( BasketItemID, forceDelete )\n {\n\n var deferred = $.Deferred();\n\n // get item name\n var itemName = getBasketItem( BasketItemID ).BasketItemNameMap[1];\n\n // calling the delete request\n function doDelete()\n {\n API.delete( '/rest/checkout/basketitemslist/?basketItemIdsList[0]=' + BasketItemID )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n //$( '[data-basket-item-id=\"' + BasketItemID + '\"]' ).remove();\n\n if ( !Checkout.getCheckout().BasketItemsList || Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n }\n else\n {\n // FALLBACK if design not support selector\n // [data-plenty-checkout-template=\"BasketItemsList\"]\n if ( $( '[data-plenty-checkout-template=\"BasketItemsList\"]' ).length >= 0 )\n {\n API.get( \"/rest/checkout/container_checkoutbasketitemslist/\" ).done( function( response )\n {\n var $oldBasketList = $( '[data-basket-item-id]' ).parents( \"ul\" );\n var $basketListContainer = $oldBasketList.parents( \".panel-body\" );\n $oldBasketList.fadeOut( function()\n {\n $( this ).siblings( \":not('[data-plenty-checkout-template]')\" ).remove();\n $( this ).remove();\n $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn(function() {\n pm.getInstance().bindDirectives( $basketListContainer );\n });\n } );\n } );\n }\n else\n {\n Checkout.reloadContainer( 'BasketItemsList' );\n }\n Checkout.reloadContainer( 'Totals' );\n }\n\n refreshBasketPreview();\n\n deferred.resolve();\n } );\n } );\n }\n\n if ( !forceDelete )\n {\n // show confirmation popup\n Modal.prepare()\n .setTitle( pm.translate( 'Please confirm' ) )\n .setContent( '

    ' + pm.translate( \"Do you really want to remove \\\"{{item}}\\\" from your basket?\", {item: itemName} ) + '

    ' )\n .onDismiss( function()\n {\n //$('[data-basket-item-id=\"' + BasketItemID +\n // '\"]').find('[data-plenty=\"quantityInput\"]').val(originalItemQuantity);\n deferred.reject();\n } )\n .onConfirm( function()\n {\n doDelete();\n } )\n .setLabelConfirm( pm.translate( \"Delete\" ) )\n .show();\n }\n else\n {\n doDelete();\n }\n\n return deferred;\n }\n\n /**\n * Set a new quantity for the given BasketItem. If quantity is set to 0,\n * remove the item.\n * @function setItemQuantity\n * @param {number} BasketItemID The ID of the basket item to change the quantity of\n * @param {number} BasketItemQuantity The new quantity to set or 0 to remove the item\n */\n function setItemQuantity( BasketItemID, BasketItemQuantity )\n {\n // delete item if quantity is 0\n if ( BasketItemQuantity <= 0 )\n {\n return removeBasketItem( BasketItemID );\n }\n\n var deferred = $.Deferred();\n var params = Checkout.getCheckout().BasketItemsList;\n var basketItem;\n var basketItemIndex;\n\n for ( var i = 0; i < params.length; i++ )\n {\n if ( params[i].BasketItemID == BasketItemID )\n {\n basketItemIndex = i;\n basketItem = params[i];\n break;\n\n }\n }\n\n if ( !!basketItem && basketItem.BasketItemQuantity != BasketItemQuantity )\n {\n params[basketItemIndex].BasketItemQuantity = parseInt( BasketItemQuantity );\n\n API.post( \"/rest/checkout/basketitemslist/\", params )\n .done( function()\n {\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n refreshBasketPreview();\n deferred.resolve();\n } );\n } );\n }\n\n return deferred;\n }\n\n /**\n * Reload BasketPreview-Template and update basket totals\n * @function refreshBasketPreview\n * @private\n */\n function refreshBasketPreview()\n {\n\n Checkout.reloadItemContainer( 'BasketPreviewList' )\n .done( function()\n {\n\n $( '[data-plenty-basket-empty]' ).each( function( i, elem )\n {\n var toggleClass = $( elem ).attr( 'data-plenty-basket-empty' );\n if ( Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n $( elem ).addClass( toggleClass );\n }\n else\n {\n $( elem ).removeClass( toggleClass );\n }\n } );\n\n } );\n\n //update quantity\n var itemQuantityTotal = 0;\n $.each( Checkout.getCheckout().BasketItemsList, function( i, basketItem )\n {\n itemQuantityTotal += basketItem.BasketItemQuantity;\n } );\n\n $( '[data-plenty-basket-preview=\"itemQuantityTotal\"]' ).text( itemQuantityTotal );\n $( '[data-plenty-basket-preview=\"totalsItemSum\"]' ).text( Checkout.getCheckout().Totals.TotalsItemSum );\n }\n\n /**\n * Read the coupon code from an <input> element marked with data-plenty-checkout-form=\"couponCode\"\n * and try to add this coupon.\n * @function addCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function addCoupon()\n {\n var params = {\n CouponActiveCouponCode: $( '[data-plenty-checkout-form=\"couponCode\"]' ).val()\n };\n\n return API.post( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n\n updateContainer();\n } );\n } );\n }\n\n /**\n * Remove the currently added coupon\n * @function removeCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function removeCoupon()\n {\n var params = {\n CouponActiveCouponCode: Checkout.getCheckout().Coupon.CouponActiveCouponCode\n };\n\n return API.delete( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n delete Checkout.getCheckout().Coupon;\n\n updateContainer();\n } );\n } );\n }\n\n // update container\n function updateContainer()\n {\n Checkout.reloadContainer( 'Coupon' );\n // reload totals, if we are at basket\n if ( $( '[data-plenty-checkout-template=\"Totals\"]' ).length > 0 )\n {\n Checkout.reloadContainer( 'Totals' );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for checkout process like setting shipping & payment information and placing the order.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutService\n * @static\n */\n pm.service( 'CheckoutService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n init : init,\n setCustomerSignAndInfo: setCustomerSignAndInfo,\n registerGuest : registerGuest,\n setShippingProfile : setShippingProfile,\n saveShippingAddress : saveShippingAddress,\n loadAddressSuggestion : loadAddressSuggestion,\n preparePayment : preparePayment,\n setMethodOfPayment : setMethodOfPayment,\n confirmAtrigaPaymax : confirmAtrigaPaymax,\n editBankDetails : editBankDetails,\n editCreditCard : editCreditCard,\n placeOrder : placeOrder\n };\n\n /**\n * Load checkout data initially on page load\n * @function init\n */\n function init()\n {\n Checkout.loadCheckout( true );\n }\n\n /**\n * Read customer sign and order information text from <form> marked with\n * data-plenty-checkout-form=\"details\" and update checkout.\n * @function setCustomerSignAndInfo\n * @return {object} jQuery deferred\n * Object\n */\n function setCustomerSignAndInfo()\n {\n var form = $( '[data-plenty-checkout-form=\"details\"]' );\n var values = form.getFormValues();\n\n // initialize CustomerSign & InfoText to avoid updating empty values\n if ( !Checkout.getCheckout().CheckoutCustomerSign )\n {\n Checkout.getCheckout().CheckoutCustomerSign = \"\";\n }\n if ( !Checkout.getCheckout().CheckoutOrderInfoText )\n {\n Checkout.getCheckout().CheckoutOrderInfoText = \"\";\n }\n\n if ( ( Checkout.getCheckout().CheckoutCustomerSign !== values.CustomerSign && $( form ).find( '[name=\"CustomerSign\"]' ).length > 0 )\n || ( Checkout.getCheckout().CheckoutOrderInfoText !== values.OrderInfoText && $( form ).find( '[name=\"OrderInfoText\"]' ).length > 0 ) )\n {\n\n Checkout.getCheckout().CheckoutCustomerSign = values.CustomerSign;\n Checkout.getCheckout().CheckoutOrderInfoText = values.OrderInfoText;\n\n return Checkout.setCheckout();\n\n }\n else\n {\n // No changes detected -> Do nothing\n return API.idle();\n }\n }\n\n /**\n * Read address data from <form> marked with data-plenty-checkout-form=\"shippingAddress\".\n * Create new shipping address or update the shipping address ID.\n * @function saveShippingAddress\n * @param {boolean} [validateForm = false] validate form before processing requests\n * @return {object} jQuery deferred\n * Object\n */\n function saveShippingAddress( validateForm )\n {\n var form = $( '[data-plenty-checkout-form=\"shippingAddress\"]' );\n\n if ( !validateForm && !form.validateForm() )\n {\n return false;\n }\n\n if ( !validateForm && !pm.getInstance().AddressDoctorService.validateAddress( form ) )\n {\n return false;\n }\n\n var values = form.getFormValues();\n var shippingAddressID = $( '[name=\"shippingAddressID\"]:checked' ).val();\n\n if ( shippingAddressID < 0 )\n {\n // save separate\n var shippingAddress = values;\n\n if ( !addressesAreEqual( shippingAddress, Checkout.getCheckout().CustomerShippingAddress ) )\n {\n if ( shippingAddress.Street == \"PACKSTATION\" )\n {\n shippingAddress.IsPackstation = 1;\n shippingAddress.PackstationNo = shippingAddress.HouseNo;\n }\n else if ( shippingAddress.Street == \"POSTFILIALE\" )\n {\n shippingAddress.IsPostfiliale = 1;\n shippingAddress.PostfilialNo = shippingAddress.HouseNo;\n }\n\n // new shipping address\n return API.post( \"/rest/checkout/customershippingaddress/\", shippingAddress )\n .done( function( response )\n {\n\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = response.data.ID;\n Checkout.getCheckout().CheckoutShippingCountryID = response.data.CountryID;\n\n updatePaymentAndShippingDependencies();\n } );\n }\n else\n {\n // no changes detected\n return API.idle();\n }\n\n }\n else\n {\n if ( shippingAddressID != Checkout.getCheckout().CheckoutCustomerShippingAddressID )\n {\n // change shipping address id\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = shippingAddressID;\n\n updatePaymentAndShippingDependencies();\n }\n else\n {\n return API.idle();\n }\n }\n }\n\n function updatePaymentAndShippingDependencies()\n {\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n $( '#shippingAdressSelect' ).modal( 'hide' );\n\n // don't hit me. Ugly hack: this is to force quit/remove everything from modal.\n if ( $( \".modal-backdrop\" ) )\n {\n $( \".modal-backdrop\" ).remove();\n }\n } );\n }\n\n /**\n * Prepare address-data to register a guest. Reads the address-data from a <form> marked with\n * data-plenty-checkout-form=\"guestRegistration\"\n * @function registerGuest\n * @return {object} jQuery deferred\n * Object\n */\n function registerGuest()\n {\n var form = $( '[data-plenty-checkout-form=\"guestRegistration\"]' );\n\n var invoiceAddress = form.getFormValues();\n invoiceAddress.LoginType = 1;\n\n // add custom properties if necessary.\n if ( invoiceAddress.checkout\n && invoiceAddress.checkout.customerInvoiceAddress\n && invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty;\n invoiceAddress.CustomerPropertiesList = invoiceAddress.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n invoiceAddress.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n if ( !addressesAreEqual( invoiceAddress, Checkout.getCheckout().CustomerInvoiceAddress ) )\n {\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n saveShippingAddress().done( Checkout.loadCheckout );\n } );\n }\n else\n {\n return saveShippingAddress();\n }\n }\n\n /**\n * Check if values of addresses are equal\n * @function addressesAreEqual\n * @private\n * @param {object} address1\n * @param {object} address2\n * @returns {boolean}\n */\n function addressesAreEqual( address1, address2 )\n {\n for ( var key in address1 )\n {\n if ( address1[key] + '' !== address2[key] + '' && key !== 'EmailRepeat' )\n {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Set the shipping profile used for this order and update checkout. Selected shipping profile will be\n * read from <form> marked with data-plenty-checkout-form=\"shippingProfileSelect\"\n * @function setShippingProfile\n * @return {object} jQuery deferred\n * Object\n */\n function setShippingProfile()\n {\n\n var values = $( '[data-plenty-checkout-form=\"shippingProfileSelect\"]' ).getFormValues();\n\n Checkout.getCheckout().CheckoutShippingProfileID = values.ShippingProfileID;\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n\n }\n\n /**\n * Prepare method of payment to check if external checkout is used or addition content should be displayed\n * @function preparePayment\n * @return {object} jQuery deferred\n * Object\n */\n function preparePayment()\n {\n var paymentID = Checkout.getCheckout().CheckoutMethodOfPaymentID;\n var paymentData = $( 'input[type=\"radio\"][name=\"MethodOfPaymentID\"][value=\"' + paymentID + '\"]' ).parent().getFormValues();\n return API.post( \"/rest/checkout/preparepayment/\", paymentData, true )\n .done( function( response )\n {\n if ( response.data.CheckoutMethodOfPaymentRedirectURL != '' )\n {\n\n document.location.assign( response.data.CheckoutMethodOfPaymentRedirectURL );\n\n }\n else if ( !!response.data.CheckoutMethodOfPaymentAdditionalContent )\n {\n\n var isBankDetails = $( response.data.CheckoutMethodOfPaymentAdditionalContent ).find( '[data-plenty-checkout-form=\"bankDetails\"]' ).length > 0;\n Modal.prepare()\n .setContent( response.data.CheckoutMethodOfPaymentAdditionalContent )\n .onConfirm( function()\n {\n if ( isBankDetails )\n {\n return saveBankDetails();\n }\n else\n {\n return saveCreditCard();\n }\n } )\n .show();\n }\n } )\n .fail( function( jqXHR )\n {\n try\n {\n var response = $.parseJSON( jqXHR.responseText );\n\n var errorStack = [];\n for ( var i = 0; i < response.error.error_stack.length; i++ )\n {\n if ( response.error.error_stack[i].code == 651 )\n {\n // notify atriga validation errors\n Checkout.reloadContainer( 'MethodsOfPaymentList' ).done( function()\n {\n $( document ).trigger( 'plenty.AtrigaValidationFailed' );\n } );\n }\n else\n {\n errorStack.push( response.error.error_stack[i] );\n }\n }\n\n // display remaining errors\n if ( errorStack.length > 0 )\n {\n UI.printErrors( errorStack );\n }\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n } );\n\n }\n\n /**\n * Set the method of payment used for this order.\n * @function setMethodOfPayment\n * @param {number|undefined} paymentID ID of the method of payment to use. Read from <form> marked with\n * data-plenty-checkout-form=\"methodOfPayment\" if unset.\n * @return {object} jQuery deferred\n * Object\n */\n function setMethodOfPayment( paymentID )\n {\n /*\n var methodsOfPaymentList = Checkout.getCheckout().MethodsOfPaymentList;\n var methodOfPayment;\n for( var i = 0; i < methodsOfPaymentList.length; i++ )\n {\n if( methodsOfPaymentList[i].MethodOfPaymentID == paymentID )\n {\n methodOfPayment = methodsOfPaymentList[i];\n break;\n }\n }\n */\n\n if ( !paymentID )\n {\n // FIX for older callisto layouts (< 3.3): get payment id from input field\n paymentID = $( 'input[name=\"MethodOfPaymentID\"]:checked' ).val();\n }\n\n Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID;\n\n if ( !pm.getGlobal( 'Checkout.AtrigaRequireUserConfirmation' ) )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = true;\n }\n\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'ShippingProfilesList' );\n } );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxChecked )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = !!atrigaPaymaxChecked;\n return API.put( '/rest/checkout', {\n CheckoutAtrigapaymaxChecked: !!atrigaPaymaxChecked\n } );\n //return Checkout.setCheckout();\n }\n\n /**\n * Display the popup to enter or edit customers bank details\n * @function editBankDetails\n */\n function editBankDetails()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationBankDetails' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveBankDetails();\n } )\n .show();\n } );\n\n }\n\n /**\n * Read entered bank details from data-plenty-checkout-form=\"bankDetails\" and update checkout.\n * @function saveBankDetails\n * @private\n * @return {boolean} the result of form validation\n */\n function saveBankDetails()\n {\n var form = $( '[data-plenty-checkout-form=\"bankDetails\"]' );\n\n if ( form.validateForm() )\n {\n var values = form.getFormValues().checkout.customerBankDetails;\n\n var bankDetails = {\n CustomerBankName : values.bankName,\n CustomerBLZ : values.blz,\n CustomerAccountNumber: values.accountNo,\n CustomerAccountOwner : values.accountOwner,\n CustomerIBAN : values.iban,\n CustomerBIC : values.bic\n };\n\n API.post( \"/rest/checkout/paymentinformationbankdetails/\", bankDetails )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n setMethodOfPayment( 3 );\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing credit card form\n * @function editCreditCard\n */\n function editCreditCard()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationCreditCard' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveCreditCard();\n } )\n .show();\n } );\n }\n\n /**\n * Read values from <form> marked with data-plenty-checkout-form=\"creditCard\" and update checkout.\n * @function saveCreditCard\n * @private\n * @return {boolean} the result of form validation\n */\n function saveCreditCard()\n {\n var form = $( '[data-plenty-checkout-form=\"creditCard\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues().checkout.paymentInformationCC;\n\n var creditCard = {\n Owner : values.owner,\n Cvv2 : values.cvv2,\n Number : values.number,\n Year : values.year,\n Month : values.month,\n Provider: values.provider\n };\n\n API.post( '/rest/checkout/paymentinformationcreditcard/', creditCard )\n .done( function()\n {\n Checkout.loadCheckout();\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing address suggestions\n * @param {string} type\n */\n function loadAddressSuggestion( type )\n {\n\n //check login type\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n var values = $( '[data-plenty-checkout-form=\"shippingAddress\"]' ).getFormValues();\n }\n else\n {\n var values = $( '[data-plenty-checkout-form=\"guestRegistration\"]' ).getFormValues();\n }\n\n var params = {\n street : values.Street,\n houseNo : values.HouseNo,\n ZIP : values.ZIP,\n city : values.City,\n postnummer : values.Postnummer,\n suggestionType: 'postfinder'\n };\n\n CMS.getContainer( 'CheckoutAddressSuggestionResultsList', params ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .show();\n } );\n }\n\n /**\n * Place the order prepared before and finish the checkout process.
    \n * Validate required checkboxes in data-plenty-checkout-form=\"placeOrder\"\n * @function placeOrder\n * @return {object} jQuery deferred\n * Object\n */\n function placeOrder()\n {\n var form = $( '[data-plenty-checkout-form=\"placeOrder\"]' );\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n // if not shown in layout set default 1 for mandatory fields\n var params = {\n TermsAndConditionsCheck : values.termsAndConditionsCheck || 0,\n WithdrawalCheck : values.withdrawalCheck || 0,\n PrivacyPolicyCheck : values.privacyPolicyCheck || 0,\n AgeRestrictionCheck : values.ageRestrictionCheck || 0,\n NewsletterCheck : values.newsletterCheck || 0,\n KlarnaTermsAndConditionsCheck: values.klarnaTermsAndConditionsCheck || 0,\n PayoneDirectDebitMandateCheck: values.payoneDirectDebitMandateCheck || 0,\n PayoneInvoiceCheck : values.payoneInvoiceCheck || 0\n };\n\n return API.post( \"/rest/checkout/placeorder/\", params )\n .done( function( response )\n {\n if ( response.data.MethodOfPaymentRedirectURL != '' )\n {\n\n window.location.assign( response.data.MethodOfPaymentRedirectURL );\n\n }\n else if ( response.data.MethodOfPaymentAdditionalContent != '' )\n {\n\n Modal.prepare()\n .setContent( response.data.MethodOfPaymentAdditionalContent )\n .setLabelDismiss( '' )\n .onDismiss( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).onConfirm( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).show();\n\n }\n else\n {\n\n window.location.assign( form.attr( 'action' ) );\n\n }\n } );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n pm.service( 'FeedbackService', function( API )\n {\n\n return {\n getFeedbacks : getFeedbacks,\n addFeedback : addFeedback,\n ArticleTypes : articleTypes(),\n FeedbackTypes: feedbackTypes()\n };\n\n /*\n FeedbackService\n .getFeedbacks().between('2014-12-03', '2015-07-01')\n .for( FeedbackService.ArticleTypes.ITEM, 2732, FeedbackService.FeedbackTypes.COMMENTS_ONLY );\n */\n function getFeedbacks()\n {\n var feedbackInterval = {\n dateStart: null,\n dateEnd : null\n };\n\n return {\n between: setFeedbackInterval,\n for : listFeedbacks\n };\n\n function setFeedbackInterval( start, end )\n {\n feedbackInterval.dateStart = start;\n feedbackInterval.dateEnd = end;\n return this;\n }\n\n function listFeedbacks( articleType, referenceId, feedbackType )\n {\n\n var params = {\n ReferenceId : referenceId,\n FromDate : feedbackInterval.dateStart,\n ToDate : feedbackInterval.dateEnd,\n FeedbackType: feedbackType || feedbackTypes().COMMENTS_AND_RATINGS\n };\n return API.get( '/rest/feedback/' + articleType + '/', params );\n\n }\n }\n\n /*\n FeedbackService\n .addFeedback()\n .withRating( 5 )\n .withComment( 'Hallo' )\n .withAuthor( 'Felix', 'felix.dausch@plentymarkets.com', 123456 )\n .to( FeedbackService.ArticleTypes.ITEM, 2732 );\n */\n function addFeedback()\n {\n\n var params = {\n Rating : 1.0,\n Text : '',\n Author : '',\n Email : '',\n CustomerId: 0\n };\n\n return {\n withRating : withRating,\n withComment: withComment,\n withAuthor : withAuthor,\n to : sendFeedback\n };\n\n function withRating( rating )\n {\n params.Rating = rating;\n return this;\n }\n\n function withComment( comment )\n {\n params.Text = comment;\n return this;\n }\n\n function withAuthor( author, mail, customerID )\n {\n params.Author = author;\n if ( !!mail )\n {\n params.Email = mail;\n }\n if ( !!customerID )\n {\n params.CustomerId = customerID;\n }\n return this;\n }\n\n function sendFeedback( articleType, referenceId )\n {\n return API.post( '/rest/feedback/' + articleType + '/', params );\n\n }\n\n }\n\n function feedbackTypes()\n {\n return {\n COMMENTS_ONLY : 'comments_only',\n RATINGS_ONLY : 'ratings_only',\n COMMENTS_AND_RATINGS: 'comments_with_ratings'\n }\n }\n\n function articleTypes()\n {\n return {\n ITEM : 'item',\n CATEGORY: 'category',\n BLOG : 'blog'\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Listens to window's size and trigger 'sizeChange' event if the Bootstrap interval changes.\n * @class MediaSizeService\n * @static\n * @example\n * $(window).on('sizeChange', function(newValue, oldValue) {\n * console.log('The interval changed from ' + oldValue + ' to ' + newValue.');\n * });\n */\n pm.service( 'MediaSizeService', function()\n {\n\n var bsInterval;\n\n // recalculation of the current interval on window resize\n $( window ).resize( calculateMediaSize );\n\n // initially calculation of the interval\n $( document ).ready( calculateMediaSize );\n\n return {\n interval : getInterval,\n isInterval: isInterval\n };\n\n /**\n * Get the currently used Bootstrap interval\n * @function getInterval\n * @return {\"xs\"|\"sm\"|\"md\"|\"lg\"}\n */\n function getInterval()\n {\n if ( !!bsInterval )\n {\n calculateMediaSize();\n }\n\n return bsInterval;\n }\n\n /**\n * Calculate the currently used Bootstrap interval\n * @function calculateMediaSize\n * @private\n */\n function calculateMediaSize()\n {\n var size;\n if ( !!window.matchMedia )\n { // FIX IE support\n if ( window.matchMedia( '(min-width:1200px)' ).matches )\n {\n size = 'lg';\n }\n else if ( window.matchMedia( '(min-width:992px)' ).matches )\n {\n size = 'md';\n }\n else if ( window.matchMedia( '(min-width:768px)' ).matches )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n else\n {\n if ( $( window ).width() >= 1200 )\n {\n size = 'lg';\n }\n else if ( $( window ).width() >= 992 )\n {\n size = 'md';\n }\n else if ( $( window ).width() >= 768 )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n if ( size != bsInterval || size === 'xs' )\n {\n var oldValue = bsInterval;\n bsInterval = size;\n $( window ).trigger( 'sizeChange', [bsInterval, oldValue] );\n }\n }\n\n function isInterval( interval )\n {\n var intervalList = interval.replace( /\\s/g, '' ).split( ',' );\n for ( var i = 0; i < intervalList.length; i++ )\n {\n if ( intervalList[i] == bsInterval )\n {\n return true;\n }\n }\n return false;\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Handling navigation while checkout processes\n * @class NavigatorService\n * @static\n *\n */\n pm.service( 'NavigatorService', function( CMS, Checkout )\n {\n var navigation = [];\t\t// contains navigation list elements\n var container = [];\t\t// content containers\n var current = -1;\t\t// index of currently shown content container\n var buttonPrev = {};\t\t// navigation buttons\n var buttonNext = {};\n var interceptors = {\n beforeChange: [],\n afterChange : []\n };\n var checkoutStates = [];\n\n return {\n init : init,\n getCurrentContainer: getCurrentContainer,\n goTo : goTo,\n beforeChange : beforeChange,\n afterChange : afterChange,\n continueChange : continueChange,\n next : next,\n previous : previous,\n goToID : goToID,\n fillNavigation : fillNavigation\n };\n\n /**\n * Initialize checkout navigation. Shows first container.\n * @function init\n * @example\n * ```html\n * \n *
      \n *
    • Checkout Step 1
    • \n *
    • Checkout Step 2
    • \n *
    • ...
    • \n *
    \n * \n *\n *
    \n *
    \n * Checkout Step 1 Content\n *
    \n *
    \n * Checkout Step 2 Content\n *
    \n *
    ...
    \n *
    \n * ```\n */\n function init()\n {\n\n // get elements from DOM\n navigation = $( '[data-plenty-checkout=\"navigation\"] > li' );\n container = $( '[data-plenty-checkout=\"container\"] > div' );\n buttonNext = $( '[data-plenty-checkout=\"next\"]' );\n buttonPrev = $( '[data-plenty-checkout=\"prev\"]' );\n\n if ( navigation.length == container.length && container.length > 0 )\n {\n var checkout = Checkout.getCheckout();\n\n container.hide();\n\n // initialize navigation\n navigation.each( function( i, elem )\n {\n $( elem ).addClass( 'disabled' );\n // handle navigation click events\n $( elem ).click( function()\n {\n if ( !$( this ).is( '.disabled' ) )\n {\n goTo( i );\n }\n } );\n } );\n\n buttonNext.attr( \"disabled\", \"disabled\" );\n buttonNext.click( function()\n {\n next();\n } );\n\n buttonPrev.attr( \"disabled\", \"disabled\" );\n buttonPrev.click( function()\n {\n previous();\n } );\n\n window.addEventListener( 'hashchange', function()\n {\n if ( window.location.hash.length > 0 )\n {\n goToID( window.location.hash );\n }\n else\n {\n goTo( 0 );\n }\n }, false );\n\n // initialize GUI\n // check url param for jumping to tab\n $.urlParam = function( name )\n {\n var results = new RegExp( '[\\?&]' + name + '=([^&#]*)' ).exec( window.location.href );\n if ( results == null )\n {\n return null;\n }\n else\n {\n return results[1] || 0;\n }\n };\n\n var param = $.urlParam( 'gototab' );\n // jump to hash from url param 'gototab'\n if ( window.location.hash.length == 0 && !!param && $( '[data-plenty-checkout-id=\"' + param + '\"]' ).length > 0 )\n {\n window.location.hash = param;\n }\n // jump to hash\n else if ( !goToID( window.location.hash ) && current >= 0 )\n {\n goTo( current );\n }\n else\n {\n goTo( 0 );\n }\n\n fillNavigation();\n $( window ).on( 'sizeChange', fillNavigation );\n $( window ).resize( function()\n {\n if ( pm.getInstance().MediaSizeService.interval() == 'xs' )\n {\n fillNavigation();\n }\n } );\n\n }\n }\n\n /**\n * Get the currently active checkout container.\n * @function getCurrentContainer\n * @return {{id: string, index: number}}\n */\n function getCurrentContainer()\n {\n if ( current >= 0 )\n {\n return {\n id : $( container[current] ).attr( 'data-plenty-checkout-id' ),\n index: current\n };\n }\n else\n {\n return null;\n }\n }\n\n /**\n * Register an interceptor called before each tab change.\n * Tabchange will break if any interceptor returns false.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n * @example\n * plenty.NavigatorService.beforeChange( function(targetContainer) {\n * if( targetContainer.id === 'details' ) {\n * // stop tabchange if user tries to access checkout container with id \"details\"\n * return false;\n * }\n * return true;\n * });\n */\n function beforeChange( interceptor )\n {\n interceptors.beforeChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Register an interceptor called after each tab change.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n */\n function afterChange( interceptor )\n {\n interceptors.afterChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Call registered interceptors. Break if any interceptor returns false.\n * Do not call beforeChange-interceptors on initially tabchange\n * @function resolveInterceptors\n * @private\n * @param {\"beforeChange\"|\"afterChange\"} identifier Describe which interceptors should be called\n * @param {number} index the index of the target container\n * @returns {boolean} Conjunction of all interceptor return values\n */\n function resolveInterceptors( identifier, index )\n {\n var continueTabChange = true;\n\n if ( current >= 0 || identifier === 'afterChange' )\n {\n\n var currentContainer = getCurrentContainer();\n var targetContainer = {\n index: index,\n id : $( container[index] ).attr( 'data-plenty-checkout-id' )\n };\n\n $.each( interceptors[identifier], function( i, interceptor )\n {\n if ( interceptor( currentContainer, targetContainer ) === false )\n {\n continueTabChange = false;\n return false;\n }\n } );\n }\n\n return continueTabChange;\n }\n\n /**\n * Show checkout tab given by index\n * @function goTo\n * @param {number} index Index of target tab, starting at 0\n * @param {boolean} [ignoreInterceptors=false] Set true to not call registered interceptors and force changing\n * tab\n */\n function goTo( index, ignoreInterceptors )\n {\n\n var contentChanged = current !== index;\n\n if ( contentChanged && !ignoreInterceptors )\n {\n if ( !resolveInterceptors( \"beforeChange\", index ) )\n {\n return;\n }\n }\n\n current = index;\n\n if ( !Object.equals( checkoutStates[current], Checkout.getCheckout( true ) ) && contentChanged && !!$( container[current] ).attr( 'data-plenty-checkout-content' ) )\n {\n checkoutStates[current] = Checkout.getCheckout( true );\n // reload tab content\n CMS.getCategoryContent( $( container[current] ).attr( 'data-plenty-checkout-content' ) )\n .done( function( response )\n {\n $( container[current] ).html( response.data[0] );\n // continue tab change\n proceedTabChange( contentChanged );\n pm.getInstance().bindDirectives( container[current] );\n $( window ).trigger( 'contentChanged' );\n } );\n }\n else\n {\n // continue tab change without reloading tab content\n proceedTabChange( contentChanged );\n //pm.getInstance().bindDirectives();\n }\n\n }\n\n function proceedTabChange( contentChanged )\n {\n\n // hide content containers\n $( container ).hide();\n\n // refresh navigation elements\n var $elem;\n $( navigation ).each( function( i, elem )\n {\n $elem = $( elem );\n $elem.removeClass( 'disabled active' );\n\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'false' );\n\n if ( i < current )\n {\n // set current element as active\n $elem.addClass( 'visited' );\n }\n else\n {\n if ( i == current )\n {\n $elem.addClass( 'active visited' );\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'true' );\n }\n else\n {\n if ( i > current && !$elem.is( '.visited' ) )\n {\n // disable elements behind active\n $elem.addClass( 'disabled' );\n }\n }\n }\n } );\n fillNavigation();\n\n // hide \"previous\"-button if first content container is shown\n if ( current <= 0 )\n {\n buttonPrev.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonPrev.removeAttr( \"disabled\" );\n }\n\n // hide \"next\"-button if last content container is shown\n if ( current + 1 == navigation.length )\n {\n buttonNext.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonNext.removeAttr( \"disabled\" );\n }\n\n // show current content container\n $( container[current] ).show();\n\n // set location hash\n if ( current > 0 )\n {\n window.location.hash = $( container[current] ).attr( 'data-plenty-checkout-id' );\n }\n else\n {\n if ( window.location.hash.length > 0 )\n {\n window.location.hash = '';\n }\n }\n\n if ( contentChanged )\n {\n resolveInterceptors( \"afterChange\", current );\n }\n }\n\n /**\n * Continue interrupted tabchange. Shorthand for: goTo(targetContainer.index, true)\n * @function continueChange\n * @param targetContainer The tab-object received from an interceptor\n */\n function continueChange( targetContainer )\n {\n goTo( targetContainer.index, true );\n }\n\n /**\n * Show next checkout tab if available. Shorthand for\n * \n * if (current < navigation.length - 1) {\n * goTo(current + 1);\n * }\n * \n * @function next\n */\n function next()\n {\n if ( current < navigation.length - 1 )\n {\n goTo( current + 1 );\n }\n }\n\n /**\n * Show previous checkout tab if available\n * @function next\n */\n function previous()\n {\n if ( current > 0 )\n {\n goTo( current - 1 );\n }\n }\n\n /**\n * Show checkout tab given by ID\n * @function goToID\n * @param {string} containerID ID of tab to show. Target tab must be marked with\n * data-plenty-checkout-id=\"#...\"\n */\n function goToID( containerID )\n {\n if ( containerID == 'next' )\n {\n next();\n return true;\n }\n else if ( containerID == 'prev' )\n {\n previous();\n return true;\n }\n else\n {\n containerID = containerID.replace( '#', '' );\n $( container ).each( function( i, elem )\n {\n if ( $( elem ).attr( 'data-plenty-checkout-id' ) == containerID )\n {\n goTo( i );\n return true;\n }\n } );\n }\n\n return false;\n }\n\n /**\n * Calculate navigation's width to match its parent element\n * by increasing its items padding.\n * @function fillNavigation\n */\n function fillNavigation()\n {\n // break if manager has not been initialized\n var navigationCount = navigation.length;\n if ( navigationCount <= 0 )\n {\n return;\n }\n\n // reset inline styles\n $( navigation ).removeAttr( 'style' );\n $( navigation ).children( 'span' ).removeAttr( 'style' );\n $( buttonNext ).removeAttr( 'style' );\n $( buttonPrev ).removeAttr( 'style' );\n\n var buttonWidth = ($( buttonPrev ).outerWidth() < $( buttonNext ).outerWidth()) ? $( buttonNext ).outerWidth( true ) + 1 : $( buttonPrev ).outerWidth( true ) + 1;\n $( buttonNext ).css( {width: buttonWidth + 'px'} );\n $( buttonPrev ).css( {width: buttonWidth + 'px'} );\n\n // calculate width to fill\n var width = $( navigation ).parent().parent().outerWidth( true ) - ( 2 * buttonWidth);\n width -= parseInt( $( navigation ).parent().css( 'marginLeft' ) ) + parseInt( $( navigation ).parent().css( 'marginRight' ) );\n\n var padding = width;\n var tabWidth = [];\n\n $( navigation ).each( function( i, elem )\n {\n padding -= parseInt( $( elem ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).css( 'marginRight' ) );\n\n tabWidth[i] = $( elem ).children( 'span' ).width();\n padding -= tabWidth[i];\n\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginRight' ) );\n } );\n\n var paddingEachItem = parseInt( padding / navigationCount );\n\n var paddingLeft, paddingRight;\n if ( paddingEachItem % 2 == 1 )\n {\n paddingLeft = ( paddingEachItem / 2 ) + 0.5;\n paddingRight = ( paddingEachItem / 2 ) - 0.5;\n }\n else\n {\n paddingLeft = paddingEachItem / 2;\n paddingRight = paddingEachItem / 2;\n }\n\n var paddingLastItem = parseInt( padding - ( ( navigationCount - 1 ) * ( paddingLeft + paddingRight ) ) );\n var paddingLastLeft, paddingLastRight;\n if ( paddingLastItem % 2 == 1 )\n {\n paddingLastLeft = ( paddingLastItem / 2 ) + 0.5;\n paddingLastRight = ( paddingLastItem / 2) - 0.5;\n }\n else\n {\n paddingLastLeft = paddingLastItem / 2;\n paddingLastRight = paddingLastItem / 2;\n }\n\n var diff = width;\n $( navigation ).each( function( i, elem )\n {\n if ( i < navigationCount - 1 )\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLeft + 'px', 'paddingRight': paddingRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLeft + paddingRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n else\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLastLeft + 'px', 'paddingRight': paddingLastRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLastLeft + paddingLastRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n } );\n\n //$(navigation).parent().css('marginRight', 0);\n }\n\n }, ['CMSFactory', 'CheckoutFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Magnus Martin \n * =====================================================================================\n */\n\n\n(function( $, pm )\n{\n pm.service( 'PostfinderService', function( API, Modal, UIFactory )\n {\n var packstationID = '';\n var shippingFields = {};\n var numberOfResults = {};\n var result = {};\n\n return {\n openPostfinderModal: openPostfinderModal,\n isPackstation : isPackstation\n };\n\n function isPackstation()\n {\n var street = $( 'input[name=\"Street\"]' ).val();\n return ( street.toUpperCase() == \"PACKSTATION\" || street.toUpperCase() == \"POSTFILIALE\" );\n }\n\n function openPostfinderModal()\n {\n shippingFields = {\n PostfinderItemStreet : $( 'input[name=\"Street\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemZIP : $( 'input[name=\"ZIP\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemCity : $( 'input[name=\"City\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemHouseNo: $( 'input[name=\"HouseNo\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' )\n\n };\n\n shippingFields.PostfinderItemStreet.val( '' );\n\n if ( (shippingFields.PostfinderItemZIP.val().length > 2 || shippingFields.PostfinderItemCity.val().length > 2) )\n {\n\n API.get( '/rest/checkout/shippingaddresspostfinderlist/',\n {\n suggestionType: \"postfinder\",\n zip : shippingFields.PostfinderItemZIP.val(),\n city : shippingFields.PostfinderItemCity.val()\n } )\n\n .done( function( response )\n {\n result = response.data;\n numberOfResults = result.length;\n\n if ( numberOfResults == 0 )\n {\n showErrorMessage();\n }\n\n var params = {\n addresses: []\n };\n\n for ( var i = 0; i < numberOfResults; i++ )\n {\n var dimension = 'km';\n var distInMeters = result[i].PostfinderItemDistance;\n var distInKilometers = distInMeters / 1000;\n distInKilometers = ((Math.round( distInKilometers * 100 ) / 100).toFixed( 2 )).replace( '.', ',' );\n\n if ( distInMeters < 1000 )\n {\n distInKilometers = distInMeters;\n dimension = 'm';\n }\n\n params.addresses.push( {\n index : i,\n dimension: dimension,\n type : result[i].PostfinderItemIsPackstation ? 'Packstation' : 'Postfiliale',\n number : result[i].PostfinderItemIsPackstation ? result[i].PostfinderItemPackstationNo : result[i].PostfinderItemPostfilialNo,\n street : result[i].PostfinderItemStreet,\n houseNo : result[i].PostfinderItemHouseNo,\n zip : result[i].PostfinderItemZIP,\n city : result[i].PostfinderItemCity,\n district : result[i].PostfinderItemDistrict,\n distance : distInKilometers,\n remark : result[i].PostfinderItemRemark\n } );\n }\n\n var html = pm.compileTemplate( 'addressSuggestions/postFinder.html', params );\n\n Modal.prepare()\n .setTitle( pm.translate( 'Packstations and post offices in your area' ) )\n .setContent( html )\n .setClass( 'checkout' )\n .onConfirm( function()\n {\n shippingFields.PostfinderItemCity.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemStreet.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemStreet.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemHouseNo.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemHouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n packstationID = $( 'input[type=\"radio\"][name=\"postfinder\"]:checked' ).val();\n\n if ( result[packstationID].PostfinderItemIsPackstation )\n {\n $( shippingFields.PostfinderItemStreet ).val( 'PACKSTATION' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPackstationNo );\n }\n else\n {\n $( shippingFields.PostfinderItemStreet ).val( 'POSTFILIALE' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPostfilialNo );\n }\n $( shippingFields.PostfinderItemStreet ).trigger( 'change' );\n\n $( shippingFields.PostfinderItemCity ).val( result[packstationID].PostfinderItemCity );\n $( shippingFields.PostfinderItemZIP ).val( result[packstationID].PostfinderItemZIP );\n return true;\n } )\n .show()\n } );\n }\n else\n {\n showErrorMessage();\n }\n\n }\n\n function showErrorMessage()\n {\n UIFactory.throwError( 0, pm.translate( 'Please enter a ZIP code and/or a city.' ) );\n\n shippingFields.PostfinderItemCity.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemCity.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n\n shippingFields.PostfinderItemZIP.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n }\n }, ['APIFactory', 'ModalFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide templates for social share providers to inject them dynamically.\n * @class SocialShareService\n * @static\n */\n pm.service( 'SocialShareService', function()\n {\n\n //TODO: move to global variables\n if ( typeof(socialLangLocale) == 'undefined' )\n {\n socialLangLocale = 'en_US';\n }\n if ( typeof(socialLang) == 'undefined' )\n {\n socialLang = 'en';\n }\n\n return {\n getSocialService: getService\n };\n\n /**\n * Get the template for social media provider\n * @function getService\n * @param {string} identifier name of the social media provider to get the template for\n * @returns {string} the template to inject in DOM\n */\n function getService( identifier )\n {\n var services = {\n 'facebook-like': '',\n\n 'facebook-recommend': '',\n\n 'twitter': '',\n\n 'google-plus': '
    '\n + '',\n };\n\n return services[identifier];\n }\n\n /**\n * get the canonical URL if defined\n * @function getURL\n * @private\n * @return {string} The Canonical URL if defined or the current URI\n */\n function getURI()\n {\n var uri = document.location.href;\n var canonical = $( \"link[rel=canonical]\" ).attr( \"href\" );\n\n if ( canonical && canonical.length > 0 )\n {\n if ( canonical.indexOf( \"http\" ) < 0 )\n {\n canonical = document.location.protocol + \"//\" + document.location.host + canonical;\n }\n uri = canonical;\n }\n\n return uri;\n }\n\n /**\n * returns content of <meta name=\"\" content=\"\"> tags or '' if empty/non existant\n * @function getMeta\n * @private\n * @param {string} name The meta name to get the value of;\n */\n function getMeta( name )\n {\n var metaContent = $( 'meta[name=\"' + name + '\"]' ).attr( 'content' );\n return metaContent || '';\n }\n\n /**\n * create tweet text from content of <meta name=\"DC.title\"> and <meta name=\"DC.creator\">\n * fallback to content of <title> tag\n * @function getTweetText\n * @private\n */\n function getTweetText()\n {\n var title = getMeta( 'DC.title' );\n var creator = getMeta( 'DC.creator' );\n\n if ( title.length > 0 && creator.length > 0 )\n {\n title += ' - ' + creator;\n }\n else\n {\n title = $( 'title' ).text();\n }\n\n return encodeURIComponent( title );\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide methods for client-side form validation.\n * @class ValidationService\n * @static\n */\n pm.service( 'ValidationService', function()\n {\n\n return {\n validate: validate\n };\n\n /**\n * Check if element is a form element (input, select, textarea) or search for child form elements\n * @function getFormControl\n * @private\n * @param {object} element the element to get the form element from\n * @return {object} a valid form element (input, select, textarea)\n */\n function getFormControl( element )\n {\n element = $( element );\n if ( element.is( 'input' ) || element.is( 'select' ) || element.is( 'textarea' ) )\n {\n return element;\n }\n else\n {\n if ( element.find( 'input' ).length > 0 )\n {\n return element.find( 'input' );\n }\n\n else if ( element.find( 'select' ).length > 0 )\n {\n return element.find( 'select' );\n }\n\n else if ( element.find( 'textarea' ).length > 0 )\n {\n return element.find( 'textarea' );\n }\n\n else\n {\n return null;\n }\n }\n\n }\n\n /**\n * Check given element has any value\n * @function validateText\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateText( formControl )\n {\n // check if formControl is no checkbox or radio\n if ( formControl.is( 'input' ) || formControl.is( 'select' ) || formControl.is( 'textarea' ) )\n {\n // check if length of trimmed value is greater then zero\n return $.trim( formControl.val() ).length > 0;\n\n }\n else\n {\n console.error( 'Validation Error: Cannot validate Text for <' + formControl.prop( \"tagName\" ) + '>' );\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid email-address\n * @function validateMail\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateMail( formControl )\n {\n var mailRegExp = /[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n if ( validateText( formControl ) )\n {\n return mailRegExp.test( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid number\n * @function validateNumber\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateNumber( formControl )\n {\n if ( validateText( formControl ) )\n {\n return $.isNumeric( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is equal to a references value\n * @function validateValue\n * @private\n * @param {object} formControl the form element to validate\n * @param {string} reference the required value\n * @return {boolean}\n */\n function validateValue( formControl, reference )\n {\n if ( $( reference ).length > 0 )\n {\n return $.trim( formControl.val() ) == $.trim( $( reference ).val() );\n }\n else\n {\n return $.trim( formControl.val() ) == reference;\n }\n }\n\n function visibility( formControl )\n {\n return formControl.is( ':visible' );\n }\n\n function isEnabled( formControl )\n {\n return formControl.is( ':enabled' );\n }\n\n /**\n * Validate a form. Triggers event 'validationFailed' if any element has an invalid value\n * @function validate\n * @param {object} form The form element to validate\n * @returns {boolean}\n * @example\n * ```html\n * \n *
    \n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n *
    \n * \n * \n *
    \n *\n *
    \n * ```\n *\n * @example\n * $(form).on('validationFailed', function(missingFields) {\n * // handle missing fields\n * });\n */\n function validate( form, errorClass )\n {\n var formControl, formControls, validationKey, currentHasError, group, checked, checkedMin, checkedMax, attrValidate, validationKeys, formControlAttrType;\n var $form = $( form );\n errorClass = errorClass || 'has-error';\n var missingFields = [];\n var hasError = false;\n\n // check every required input inside form\n $form.find( '[data-plenty-validate], :required' ).each( function( i, elem )\n {\n attrValidate = $( elem ).attr( 'data-plenty-validate' );\n formControls = getFormControl( elem ); \n // validate text inputs\n validationKeys = !!attrValidate ? attrValidate : 'text';\n validationKeys = validationKeys.split( ',' );\n\n for ( var i = 0, length = formControls.length; i < length; i++ )\n {\n formControl = $( formControls[i] );\n formControlAttrType = formControl.attr( 'type' );\n\n if ( !visibility( formControl ) || !isEnabled( formControl ) )\n {\n return;\n }\n\n validationKey = validationKeys[i].trim() || validationKeys[0].trim();\n currentHasError = false;\n\n // formControl is textfield (text, mail, password) or textarea\n if ( (formControl.is( 'input' )\n && formControlAttrType != 'radio'\n && formControlAttrType != 'checkbox')\n || formControl.is( 'textarea' ) )\n {\n switch ( validationKey )\n {\n\n case 'text':\n currentHasError = !validateText( formControl );\n break;\n\n case 'mail':\n currentHasError = !validateMail( formControl );\n break;\n\n case 'number':\n currentHasError = !validateNumber( formControl );\n break;\n\n case 'value':\n currentHasError = !validateValue( formControl, $( elem ).attr( 'data-plenty-validation-value' ) );\n break;\n\n case 'none':\n // do not validate\n break;\n\n default:\n console.error( 'Form validation error: unknown validate property: \"' + attrValidate + '\"' );\n break;\n }\n }\n else if ( formControl.is( 'input' )\n && (formControlAttrType == 'radio'\n || formControlAttrType == 'checkbox') )\n {\n // validate radio buttons\n group = formControl.attr( 'name' );\n checked = $form.find( 'input[name=\"' + group + '\"]:checked' ).length;\n\n if ( formControlAttrType == 'radio' )\n {\n checkedMin = 1;\n checkedMax = 1;\n }\n else\n {\n var minMax = (new Function(\"return \" + attrValidate))() || {min: 1, max: 1};\n checkedMin = minMax.min;\n checkedMax = minMax.max;\n }\n\n currentHasError = ( checked < checkedMin || checked > checkedMax );\n\n }\n else if ( formControl.is( 'select' ) )\n {\n // validate selects\n currentHasError = ( formControl.val() == '' || formControl.val() == '-1' );\n }\n else\n {\n console.error( 'Form validation error: ' + $( elem ).prop( \"tagName\" ) + ' does not contain an form element' );\n return;\n }\n\n if ( currentHasError )\n {\n hasError = true;\n missingFields.push( formControl );\n\n if ( formControls.length > 1 )\n {\n formControl.addClass( errorClass );\n $form.find( 'label[for=\"' + formControl.attr( 'id' ) + '\"]' ).addClass( errorClass );\n }\n else\n {\n $( elem ).addClass( errorClass );\n }\n }\n }\n\n } );\n\n // scroll to element on 'validationFailed'\n $form.on( 'validationFailed', function()\n {\n var distanceTop = 50;\n var $error = $form.find( '.' + errorClass ).first();\n var errorOffset = $error.offset().top;\n var $scrollTarget = $( 'html, body' );\n\n // if form is inside of modal, scroll modal instead of body\n if ( $form.parents( '.modal' ).length > 0 )\n {\n $scrollTarget = $form.parents( '.modal' ).find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n\n }\n else if ( $form.is( '.modal' ) )\n {\n $scrollTarget = $form.find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n }\n\n // only scroll if error is outside of viewport\n if ( errorOffset - distanceTop < window.pageYOffset || errorOffset > (window.pageYOffset + window.innerHeight) )\n {\n $scrollTarget.animate( {\n scrollTop: errorOffset - distanceTop\n } );\n }\n } );\n\n if ( hasError )\n {\n // remove error class on focus\n $form.find( '.' + errorClass ).each( function( i, elem )\n {\n formControl = $( getFormControl( elem ) );\n formControl.on( 'focus click', function()\n {\n var $errorElement = $( elem );\n $errorElement.removeClass( errorClass );\n $form.find( 'label[for=\"' + $( this ).attr( 'id' ) + '\"]' ).removeClass( errorClass );\n } );\n } );\n\n $form.trigger( 'validationFailed', [missingFields] );\n }\n\n var callback = $form.attr( 'data-plenty-callback' );\n\n if ( !hasError && !!callback && callback != \"submit\" && typeof window[callback] == \"function\" )\n {\n\n var fields = {};\n $form.find( 'input, textarea, select' ).each( function()\n {\n if ( $( this ).attr( 'type' ) == 'checkbox' )\n {\n fields[$( this ).attr( 'name' )] = $( this ).is( ':checked' );\n }\n else\n {\n fields[$( this ).attr( 'name' )] = $( this ).val();\n }\n } );\n\n window[callback]( fields );\n return false;\n }\n else\n {\n return !hasError;\n }\n }\n } );\n\n /**\n * jQuery-Plugin to calling {{#crossLink \"ValidationService/validate\"}}ValidationService.validate{{/crossLink}}\n * on jQuery wrapped elements.\n * @return {boolean}\n */\n $.fn.validateForm = function()\n {\n return pm.getInstance().ValidationService.validate( this );\n };\n\n /**\n * jQuery-Plugin to get the values of contained form elements.\n * @return {object}\n */\n $.fn.getFormValues = function()\n {\n\n var form = this;\n var values = {};\n\n function inject( position, value )\n {\n var match = position.match( /^([^\\[]+)(.*)/ );\n\n if ( !!match[2] )\n {\n var exp = /\\[([^\\]]+)]/g;\n var child;\n var children = [];\n children[0] = match[1];\n while ( (child = exp.exec( match[2] )) !== null )\n {\n children.push( child[1] );\n }\n\n for ( var i = children.length - 1; i >= 0; i-- )\n {\n var val = {};\n val[children[i]] = value;\n value = val;\n }\n values = $.extend( true, values, value );\n }\n else\n {\n values[match[1]] = value;\n }\n }\n\n form.find( 'input, select, textarea' ).each( function( i, elem )\n {\n if ( !!$( elem ).attr( 'name' ) )\n {\n if ( $( elem ).attr( 'type' ) == \"checkbox\" )\n {\n // get checkbox group\n var groupValues = [];\n $( form ).find( '[name=\"' + $( elem ).attr( 'name' ) + '\"]:checked' ).each( function( j, checkbox )\n {\n groupValues.push( $( checkbox ).val() );\n } );\n inject( $( elem ).attr( 'name' ), groupValues );\n }\n else if ( $( elem ).attr( 'type' ) == 'radio' )\n {\n if ( $( elem ).is( ':checked' ) )\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n else\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n\n } );\n return values;\n }\n}( jQuery, PlentyFramework ));\n/**\n * Services provide functions to be called from the instanced PlentyFramework.
    \n * Services can inject Factories and can be injected into Directives. The are also\n * available from the global instance of PlentyFramework\n * @module Services\n * @main Services\n * @example\n * PlentyFramework.service('ServiceName', serviceFunctions() {\n * return {\n * functionInService: function() {}\n * }\n * });\n * //...\n * plenty.ServiceName.functionInService/();\n */\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\nPlentyFramework.compile();\n\n// Create global instance of PlentyFramework for usage in Webshop-Layouts\nvar plenty = PlentyFramework.getInstance();\n\n/*\n * initially bind all registered directives\n *\n * will not be tested. reasons:\n * http://stackoverflow.com/questions/29153733/how-to-unit-test-a-document-ready-function-using-jasmine\n */\njQuery( document ).ready( function()\n{\n plenty.bindDirectives();\n} );" + "var TemplateCache = {};\n\nTemplateCache[\"addressSuggestions/addressDoctor.html\"] = \"\";\n\nTemplateCache[\"addressSuggestions/postFinder.html\"] = \"{{#addresses}}\\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"{{/addresses}}\\n\" +\n \"\";\n\nTemplateCache[\"error/errorMessage.html\"] = \"
    \\n\" +\n \" Code {{code}}:\\n\" +\n \" {{{message}}}\\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"error/errorPopup.html\"] = \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"modal/modal.html\"] = \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#title}}\\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"

    {{{title}}}

    \\n\" +\n \"
    \\n\" +\n \" {{/title}}\\n\" +\n \"\\n\" +\n \"
    {{{content}}}
    \\n\" +\n \"\\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#labelDismiss}}\\n\" +\n \" \\n\" +\n \" {{/labelDismiss}}\\n\" +\n \"\\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"waitscreen/waitscreen.html\"] = \"
    \";\n\n(function defineMustache(global,factory){if(typeof exports===\"object\"&&exports&&typeof exports.nodeName!==\"string\"){factory(exports)}else if(typeof define===\"function\"&&define.amd){define([\"exports\"],factory)}else{global.Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)===\"[object Array]\"};function isFunction(object){return typeof object===\"function\"}function typeStr(obj){return isArray(obj)?\"array\":typeof obj}function escapeRegExp(string){return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")}function hasProperty(obj,propName){return obj!=null&&typeof obj===\"object\"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"/\":\"/\"};function escapeHtml(string){return String(string).replace(/[&<>\"'\\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\\s*/;var spaceRe=/\\s+/;var equalsRe=/\\s*=/;var curlyRe=/\\s*\\}/;var tagRe=/#|\\^|\\/|>|\\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile===\"string\")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error(\"Invalid tags: \"+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+\"\\\\s*\");closingTagRe=new RegExp(\"\\\\s*\"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp(\"\\\\s*\"+escapeRegExp(\"}\"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===\"\"};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return\"\";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail=\"\";break;case 0:match=\"\";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={\".\":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(\".\")>0){value=context.view;names=name.split(\".\");index=0;while(value!=null&&index\")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol===\"&\")value=this.unescapedValue(token,context);else if(symbol===\"name\")value=this.escapedValue(token,context);else if(symbol===\"text\")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer=\"\";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j\n * =====================================================================================\n */\n\n/**\n * @module PlentyFramework\n */\n(function( $ )\n{\n // will be overridden by grunt\n var version = \"1.0.8\";\n\n /**\n * Collection of uncompiled registered factories & services.\n * See {{#crossLink \"PlentyFramework/compile:method\"}}.compile(){{/crossLink}}\n * @attribute components\n * @static\n * @type {{factories: {}, services: {}}}\n */\n var components = {\n factories : {},\n services : {},\n directives: {}\n };\n\n /**\n * Framework providing client functions for plentymarkets Webshops.\n * @class PlentyFramework\n * @constructor\n */\n PlentyFramework = function()\n {\n };\n\n var instance = null;\n PlentyFramework.getInstance = function()\n {\n instance = instance || new PlentyFramework();\n return instance;\n };\n\n PlentyFramework.version = (function() {\n\n return {\n get: function() {\n return version;\n },\n equals: function( v ) {\n return compare(v) == 0;\n },\n compare: compare\n };\n\n function compare( compare )\n {\n var localVersion = version.split(\".\");\n var compareVersion = compare.split(\".\");\n\n for( var i = 0; i < compareVersion.length; i++ )\n {\n if( localVersion[i] === compareVersion[i] || compareVersion[i] === \"*\" )\n {\n continue;\n }\n\n if( parseInt(localVersion[i]) < parseInt(compareVersion[i]) )\n {\n return -1;\n }\n\n if( parseInt(localVersion[i]) > parseInt(compareVersion[i]) )\n {\n return 1;\n }\n }\n return 0;\n }\n\n })();\n\n /**\n * Customizable controls for partials will be injected here.\n * (e.g. Modal)\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.partials = {};\n\n /**\n * Collection of registered global variables\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.globals = {};\n\n /**\n * Set a global variable.\n * @function setGlobal\n * @static\n * @param {string} identifier A unique identifier to reference this variable\n * @param {*} value The value to set\n * @return {*} The value\n */\n PlentyFramework.setGlobal = function( identifier, value )\n {\n if ( PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n console.error( 'Global variable \"' + identifier + '\" already exists and cannot be overridden.' );\n return null;\n }\n\n PlentyFramework.globals[identifier] = value;\n\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Get the value of a global variable or undefined if not exists\n * @function getGlobal\n * @static\n * @param identifier The identifier of the requested variable\n * @return {*} The value of the variable\n */\n PlentyFramework.getGlobal = function( identifier, fallbackValue )\n {\n if( !PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n return fallbackValue;\n }\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Collection of registered directives\n * @type {Array}\n * @static\n */\n PlentyFramework.directives = {};\n\n /**\n * Register directive. Directives can be bound to dynamically added nodes by calling pm.bindPlentyFunctions();\n * @function directive\n * @static\n * @param {string} selector jQuery selector of the DOM-elements to bind the directive to\n * @param {function} callback Function to add directives behaviour\n * @param {Array} dependencies List of required services. Services will be passed to callback function\n * @param {boolean} allowDuplicates Defines if a directive can be bound to the same element multiple times\n * @return {object} The created directive\n */\n PlentyFramework.directive = function( directiveName, directiveFunctions, dependencies )\n {\n // Catch type mismatching for 'directiveName'\n if ( typeof directiveName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof directiveName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof directiveFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof directiveFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.directives[directiveName] = {\n name : directiveName,\n dependencies: dependencies,\n setup : directiveFunctions\n };\n };\n\n /**\n * Bind registered directives.\n * @function bindDirectives\n * @param {string} [directiveSelector] restrict binding to elements matching this selector\n */\n PlentyFramework.prototype.bindDirectives = function( rootElement )\n {\n\n rootElement = rootElement || 'html';\n\n $( rootElement ).find( '[data-plenty]' ).each( function( i, element )\n {\n\n var directives = parseDirectives( $( element ).attr( 'data-plenty' ), $( element ) );\n\n if ( directives.length <= 0 )\n {\n // continue\n return;\n }\n\n addCustomEvents( element );\n\n for ( var i = 0; i < directives.length; i++ )\n {\n var directive = directives[i];\n if ( !!PlentyFramework.directives[directive.class] && PlentyFramework.directives.hasOwnProperty( directive.class ) )\n {\n\n var callback = PlentyFramework.directives[directive.class][directive.method];\n if ( !!callback && typeof callback == \"function\" )\n {\n\n if ( directive.event == \"ready\" )\n {\n callback.apply( null, directive.params );\n }\n else\n {\n bindEventCallback( $( element ), directive.event, callback, directive.params );\n /*\n $( element ).on( directive.event, function( e )\n {\n directive = injectEvent( directive, e );\n return callback.apply( null, directive.params );\n } );\n */\n }\n\n }\n else\n {\n console.error( \"Method not found: \" + directive.method + \" in \" + directive.class );\n }\n\n }\n else\n {\n console.error( \"Directive not found: \" + directive.class );\n }\n }\n } );\n\n $( document ).trigger( 'initPartials', rootElement );\n };\n\n var eventStack = [];\n\n PlentyFramework.getRecentEvent = function( eventType )\n {\n var lastEventIdx = eventStack.length - 1;\n if ( !eventType )\n {\n return eventStack[lastEventIdx];\n }\n else\n {\n for ( var i = lastEventIdx; i >= 0; i-- )\n {\n if ( eventType == eventStack[i].type )\n {\n return eventStack[i];\n }\n }\n }\n\n return null;\n\n };\n\n PlentyFramework.pushEvent = function( event )\n {\n eventStack.push( event );\n };\n\n /**\n * Bind event to element by eventType.\n * If cms says \"click:Foo.bar(this, event)\" eventType is \"click\".\n *\n * @param $elem - jQuery object on which event was triggered\n * @param eventType - type of event\n * @param callback - callback function of directive [example: \"bar(this, event)\"]\n * @param params - list of parameters for callback function.\n */\n function bindEventCallback( $elem, eventType, callback, params )\n {\n $elem.on( eventType, function( event )\n {\n eventStack.push( event );\n return callback.apply( null, params );\n } );\n\n if( document.readyState === \"complete\" && eventType === \"ready\" )\n {\n // execute 'ready' directives directly if document is already loaded\n callback.apply( null, params );\n }\n }\n\n function addCustomEvents( element )\n {\n\n var $elem = $( element );\n\n if ( $elem.is( 'input[type=\"checkbox\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n if ( $elem.is( ':checked' ) )\n {\n $elem.trigger( 'check' );\n }\n else\n {\n $elem.trigger( 'uncheck' );\n }\n } );\n }\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n var radioGroup = $elem.attr( 'name' );\n\n $( 'input[type=\"radio\"][name=\"' + radioGroup + '\"]' ).each( function( i, radio )\n {\n var $radio = $( radio );\n if ( $radio.is( ':checked' ) )\n {\n $radio.trigger( 'check' );\n }\n else\n {\n $radio.trigger( 'uncheck' );\n }\n\n } );\n\n } );\n }\n }\n\n function parseDirectives( input, thisValue )\n {\n var directivePattern = /^(([\\w]+):)?([\\w]+)\\.([\\w]+)(\\((.*)\\))?$/;\n var expressions = input.split( ';' );\n var directives = [];\n\n for ( var i = 0; i < expressions.length; i++ )\n {\n var expression = expressions[i].trim();\n\n if ( !expression )\n {\n continue;\n }\n\n if ( !directivePattern.test( expression ) )\n {\n // console.warn( \"Invalid directive: \" + expression );\n continue;\n }\n\n var match = expression.match( directivePattern );\n\n if ( !match[3] || match[3].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Class name not set.\" );\n continue;\n }\n\n if ( !match[4] || match[4].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Method not set.\" );\n continue;\n }\n\n var directive = {\n event : match[2] || 'ready',\n class : match[3],\n method: match[4],\n params: []\n };\n\n if ( !!match[6] && match[6].length > 0 )\n {\n var params = match[6].match( /(['][^']+['])|([\\w-]+)|([\"][^\"]+[\"])/g );\n for ( var j = 0; j < params.length; j++ )\n {\n var param = params[j].trim();\n if ( !isNaN( parseFloat( param ) ) )\n {\n directive.params.push( parseFloat( param ) );\n }\n else if ( param.toLowerCase() == 'true' )\n {\n directive.params.push( true );\n }\n else if ( param.toLowerCase() == 'false' )\n {\n directive.params.push( false );\n }\n else if ( param.toLowerCase() == 'this' )\n {\n directive.params.push( thisValue );\n }\n else\n {\n directive.params.push( param.replace( /^['\"]|['\"]$/g, '' ) );\n }\n }\n }\n\n directives.push( directive );\n\n }\n return directives;\n }\n\n /**\n * Register a new service\n * @function service\n * @static\n * @param {string} serviceName Unique identifier of the service to get/ create\n * @param {function} serviceFunctions Callback containing all public functions of this service.\n * @param {Array} [dependencies] Identifiers of required services to inject in serviceFunctions\n * @return {object} The object described in serviceFunctions(). Can be received via\n * PlentyFramework.[serviceName]\n */\n PlentyFramework.service = function( serviceName, serviceFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof serviceName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof serviceName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof serviceFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof serviceFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.services[serviceName] = {\n name : serviceName,\n dependencies: dependencies,\n setup : serviceFunctions\n };\n\n };\n\n /**\n * Collection of compiled factories\n * @attribute factories\n * @static\n * @type {object}\n */\n PlentyFramework.factories = {};\n\n /**\n * Register a new factory\n * @function factory\n * @static\n * @param {string} factoryName A unique name of the new factory\n * @param {function} factoryFunctions The function describing the factory\n * @param {Array} dependencies List of required factories to inject\n */\n PlentyFramework.factory = function( factoryName, factoryFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof factoryName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof factoryName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof factoryFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof factoryFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n components.factories[factoryName] = {\n name : factoryName,\n dependencies: dependencies,\n setup : factoryFunctions\n }\n\n };\n\n /**\n * Renders html template. Will provide given data to templates scope.\n * Uses Mustache syntax for data-binding.\n * @function compileTemplate\n * @static\n * @param {String} template relative path to partials template to load. Base path = '/src/partials/'\n * @param {Object} data data to privide to templates scope.\n * @returns {String} The rendered html string\n */\n PlentyFramework.compileTemplate = function( template, data )\n {\n data = data || {};\n data.translate = function()\n {\n return function( text, render )\n {\n return render( PlentyFramework.translate( text ) );\n };\n };\n return Mustache.render( TemplateCache[template], data );\n };\n\n /**\n * The path on the server where the script is located in.\n * @attribute\n * @static\n * @type {String}\n */\n PlentyFramework.scriptPath = '';\n\n /**\n * Collection of locale strings will be injected here after reading language file.\n * @attribute\n * @static\n * @type {Object}\n */\n PlentyFramework.Strings = {};\n\n /**\n * Load language file containing translations of locale strings.\n * @function loadLanguageFile\n * @static\n * @param fileName relative path to language file.\n */\n PlentyFramework.loadLanguageFile = function( fileName )\n {\n $.ajax({\n url: PlentyFramework.scriptPath + fileName,\n dataType: 'json'\n }).done( function( response ) {\n PlentyFramework.Strings = response;\n });\n };\n\n /**\n * Try to get locale translation of given string.\n * Render translated string using Mustache syntax\n * if additional parameters are given.\n * @function translate\n * @static\n * @param {String} string The string to translate\n * @param {Object} [params] additional data for rendering\n * @returns {String} The translation of the given string if found. Otherwise returns the original string.\n */\n PlentyFramework.translate = function( string, params )\n {\n var localeString;\n if ( PlentyFramework.Strings.hasOwnProperty( string ) )\n {\n localeString = PlentyFramework.Strings[string];\n }\n else\n {\n localeString = string;\n console.warn( 'No translation found for \"' + localeString + '\".' );\n }\n\n if ( !!params )\n {\n localeString = Mustache.render( localeString, params );\n }\n\n return localeString;\n\n };\n\n /**\n * Compile registered factories & services\n * @function compile\n * @static\n */\n PlentyFramework.compile = function()\n {\n\n for ( var factory in components.factories )\n {\n if ( !PlentyFramework.factories.hasOwnProperty( factory ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.factories[factory], 3 );\n }\n }\n\n for ( var service in components.services )\n {\n if ( !PlentyFramework.prototype.hasOwnProperty( service ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.services[service], 2 );\n }\n }\n\n for ( var directive in components.directives )\n {\n if ( !PlentyFramework.directives.hasOwnProperty( directive ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.directives[directive], 1 );\n }\n }\n\n var scripts = document.getElementsByTagName( 'SCRIPT' );\n for( var i = scripts.length - 1; i >= 0; i-- ) {\n var path = scripts[i].src.match( /(.*)\\/(.*)\\.js(\\?\\S*)?$/ );\n if( !!path ) {\n PlentyFramework.scriptPath = path[1];\n break;\n }\n }\n\n };\n\n // Level: 1 = directive, 2 = service, 3 = factory\n function compileComponent( component, componentLevel, dependencyStack )\n {\n dependencyStack = dependencyStack || [];\n\n // resolve dependencies\n var compiledDependencies = [];\n for ( var i = 0; i < component.dependencies.length; i++ )\n {\n var dependency = component.dependencies[i];\n if ( $.inArray( dependency, dependencyStack ) < 0 )\n {\n // add dependency to stack to avoid cyclic injection\n dependencyStack.push( dependency );\n\n if ( components.factories.hasOwnProperty( dependency ) )\n {\n // required dependency is a factory\n if ( !PlentyFramework.factories.hasOwnProperty( dependency ) )\n {\n // factory is not compiled yet\n compileComponent( components.factories[dependency], 3, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.factories[dependency] );\n continue;\n }\n\n if ( componentLevel <= 2 && components.services.hasOwnProperty( dependency ) )\n {\n // required dependency is a service\n if ( !PlentyFramework.prototype.hasOwnProperty( dependency ) )\n {\n // service is not compiled yet\n compileComponent( components.services[dependency], 2, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.prototype[dependency] );\n continue;\n }\n\n if ( componentLevel <= 1 && components.directives.hasOwnProperty( dependency ) )\n {\n // required dependency is a directive\n if ( !PlentyFramework.directives.hasOwnProperty( dependency ) )\n {\n // directive is not compiled yet\n compileComponent( components.directives[dependency], 1, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.directives[dependency] );\n continue;\n }\n\n console.error( 'Cannot inject dependency \"' + dependency + '\": Object not found.' );\n }\n else\n {\n console.error( 'Cyclic dependency injection: ' + dependencyStack.join( ' -> ' ) + ' -> ' + dependency );\n }\n }\n\n // compile component\n if ( componentLevel == 3 )\n {\n PlentyFramework.factories[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 2 )\n {\n PlentyFramework.prototype[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 1 )\n {\n PlentyFramework.directives[component.name] = component.setup.apply( null, compiledDependencies );\n }\n }\n\n}( jQuery ));\n\n\n\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.directive( 'Authentication', function( AuthenticationService )\n {\n return {\n login: login\n };\n\n function login( elem )\n {\n pm.getRecentEvent().preventDefault();\n AuthenticationService.customerLogin( $( elem ) );\n }\n }, [\"AuthenticationService\"] );\n\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Basket', function( BasketService )\n {\n\n return {\n addBasketItem : addBasketItem,\n changeItemQuantity: changeItemQuantity,\n setItemQuantity : setItemQuantity\n };\n\n function addBasketItem( elem )\n {\n pm.getRecentEvent().preventDefault();\n //init\n var basketItemsList = {};\n var $elem = $( elem );\n var parentForm = $elem.parents( 'form' );\n\n basketItemsList.BasketItemItemID = parentForm.find( '[name=\"ArticleID\"]' ).val();\n basketItemsList.BasketItemPriceID = parentForm.find( '[name=\"SYS_P_ID\"]' ).val();\n basketItemsList.BasketItemQuantity = parentForm.find( '[name=\"ArticleQuantity\"]' ).val();\n basketItemsList.BasketItemBranchID = parentForm.find( '[name=\"source_category\"]' ).val();\n\n //attributes\n var attributeInputsList = parentForm.find( '[name^=\"ArticleAttribute\"]' );\n var attributesList = [];\n\n $.each( attributeInputsList, function( idx, elem )\n {\n var match = elem.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( elem ).val()\n } );\n }\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItemsList.BasketItemAttributesList = attributesList;\n }\n\n //add basketItem and refresh previewLists\n BasketService.addItem( [basketItemsList] );\n\n }\n\n function changeItemQuantity( elem, increment )\n {\n var $elem = $( elem );\n var $quantityInput = $elem.parent().find( 'input' );\n var maxLength = parseInt( $quantityInput.attr( 'maxlength' ) ) || 5;\n var value = parseInt( $quantityInput.val() ) + increment;\n\n var isBasketView = $elem.parents( '[data-basket-item-id]' ).length > 0;\n\n if ( isBasketView )\n {\n if ( (value + '').length <= maxLength && value >= 0 )\n {\n $quantityInput.val( value );\n }\n\n var timeout = $elem.data( 'timeout' );\n\n if ( !!timeout )\n {\n window.clearTimeout( timeout );\n }\n\n timeout = window.setTimeout( function()\n {\n $quantityInput.trigger( 'change' );\n }, 1000 );\n\n $elem.data( 'timeout', timeout );\n }\n else\n {\n if ( (value + '').length <= maxLength && value >= 1 )\n {\n $quantityInput.val( value );\n }\n }\n }\n\n function setItemQuantity( basketItemID, input )\n {\n BasketService.setItemQuantity(\n basketItemID,\n parseInt( $( input ).val() )\n ).fail( function()\n {\n // reset input's value on cancel\n var basketItem = BasketService.getItem( basketItemID );\n $( input ).val( basketItem.BasketItemQuantity );\n } );\n }\n\n }, ['BasketService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Checkout', function( CheckoutService )\n {\n\n return {\n setMethodOfPayment: setMethodOfPayment,\n confirmAtrigaPaymax: confirmAtrigaPaymax\n };\n\n function setMethodOfPayment( paymentID )\n {\n CheckoutService.setMethodOfPayment( paymentID );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxConfirmed )\n {\n CheckoutService.confirmAtrigaPaymax( atrigaPaymaxConfirmed );\n }\n }, ['CheckoutService'] );\n})( jQuery, PlentyFramework );\n/**\n * Mobile dropdowns\n * Toggles dropdowns using css class 'open' instead of pseudo class :hover\n * Usage:\n *
  • \n * ...\n *
  • \n *\n * possible values for CONDITION\n * \"touch\" : use 'open'-class if device is touch-device AND media size is 'md' or 'lg'\n * \"toggle-xs-sm-or-touch\" : use 'open'-class if device is \"touch\" (as above) OR media size is 'xs' or 'sm'\n *\n */\n(function( $, pm )\n{\n pm.directive( 'MobileDropdown', function( MediaSize )\n {\n // store all dropdown elements\n var dropdownElements = [];\n\n // store dropdown elements which should be closed by clicking outside the element itself\n var closableDropdownElements = [];\n\n return {\n initDropdowns: initDropdowns,\n openDropdown : openDropdown,\n slideDropdown: slideDropdown\n };\n\n function initDropdowns()\n {\n $( window ).on( 'orientationchange sizeChange', function()\n {\n if ( !$( \"input\" ).is( \":focus\" ) )\n {\n resetDropdowns( dropdownElements );\n resetDropdowns( closableDropdownElements );\n }\n } );\n }\n\n function resetDropdowns( dropdownList, event )\n {\n var $current;\n for ( var i = 0; i < dropdownList.length; i++ )\n {\n $current = $( dropdownList[i] );\n if ( !!event )\n {\n if ( $current.find( $( event.target ) ).length === 0\n && !$( \"input\" ).is( \":focus\" ) )\n {\n $current.removeClass( 'open' );\n $( 'html' ).unbind( \"click touchstart\", resetEvent );\n }\n }\n else\n {\n if ( !$( \"input\" ).is( \":focus\" ) )\n {\n $current.removeClass( 'open' );\n $( 'html' ).unbind( \"click touchstart\", resetEvent );\n }\n }\n }\n\n }\n\n function openDropdown( elem, alwaysClickable )\n {\n var $elem = $( elem );\n var $parent = $elem.parent();\n\n // case 1: xs || sm || ( touch && ( md || lg ) ) -> open/close via click on small devices, open/close via\n // css-hover on desktop, open/close via click on touch-desktop (e.g. top navigation)\n\n if ( !!alwaysClickable && ( MediaSize.isInterval( 'xs, sm' ) || ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n // if href\n if ( !$elem.attr( 'href' ) )\n {\n avoidRedirectinStopPropagation( $parent.not( $elem ) );\n }\n }\n else\n {\n if ( !$elem.attr( 'href' ) )\n {\n // hide dropdown\n $parent.removeClass( 'open' );\n }\n }\n }\n\n // case 2: touch && ( md || lg ) -> open via 1st click on touch-desktop, return false (e.g. main navigation)\n\n if ( !alwaysClickable && ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n avoidRedirectinStopPropagation( $parent );\n }\n else\n {\n // redirect to href if dropdown is already open\n // do nothing\n }\n }\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", resetEvent );\n }\n\n function showDropdownHideOthers( elem, parent )\n {\n var $parent = $( parent );\n\n // hide other dropdowns\n resetDropdowns( closableDropdownElements, elem );\n\n // remember opened dropdown\n if ( $.inArray( $parent[0], closableDropdownElements ) < 0 )\n {\n closableDropdownElements.push( $parent[0] );\n }\n\n // show dropdown\n $parent.addClass( 'open' );\n }\n\n function avoidRedirectinStopPropagation( elem )\n {\n var $elem = $( elem );\n\n // avoid redirecting\n pm.getRecentEvent().preventDefault();\n\n // avoid closing popup by clicking itself\n $elem.off( 'click' );\n $elem.on( 'click', function( e )\n {\n e.stopPropagation();\n } );\n }\n\n function slideDropdown( elem )\n {\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n // size interval query is required since function is used on document ready to initial open active\n // navigation (on small devices)\n if ( MediaSize.isInterval( 'xs, sm' ) )\n {\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 400, function()\n {\n if ( $elemParent.is( '.open' ) && !$( \"input\" ).is( \":focus\" ) )\n {\n $elemParent.removeClass( 'open' );\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n if ( $.inArray( $elemParent[0], dropdownElements ) < 0 )\n {\n dropdownElements.push( $elemParent[0] );\n }\n }\n } );\n }\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", resetEvent );\n }\n\n function resetEvent( event )\n {\n resetDropdowns( closableDropdownElements, event );\n }\n\n }, ['MediaSizeService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Redirect', function( MediaSizeService, NavigatorService )\n {\n\n return {\n to : to,\n toCheckoutTab: toCheckoutTab\n };\n\n function to( href )\n {\n if ( MediaSizeService.interval() != 'xs' )\n {\n if ( typeof href === 'string' && href.indexOf('/') == -1 && $( href ).length > 0 )\n {\n window.location.assign( $( href ).attr( 'href' ) );\n }\n else\n {\n window.location.assign( href );\n }\n }\n }\n\n function toCheckoutTab( tabID )\n {\n NavigatorService.goToID( tabID );\n }\n\n }, ['MediaSizeService', 'NavigatorService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Tab', function( MediaSize )\n {\n\n var tabGroups = {};\n\n return {\n showTab : showTab,\n initRemoteLabel: initRemoteLabel,\n initRemoteTab : initRemoteTab,\n showRemoteTab : showRemoteTab\n };\n\n function showTab( tabSelector )\n {\n $( tabSelector ).tab( 'show' );\n }\n\n function initRemoteLabel( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).addLabel( $elem );\n }\n\n function initRemoteTab( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).setContent( $elem );\n }\n\n function showRemoteTab( tabID, groupID, interval )\n {\n if ( MediaSize.isInterval( interval ) )\n {\n pm.getRecentEvent().preventDefault();\n\n if ( !!tabGroups[groupID] && !!tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].showTab( tabID );\n }\n\n }\n }\n\n function TabGroup()\n {\n var tabs = {};\n var activeTab;\n\n return {\n addTab : addTab,\n showTab : showTab,\n getTab : getTab,\n resetTabs: resetTabs\n };\n\n function addTab( tabID )\n {\n tabs[tabID] = new Tab( tabID );\n return tabs[tabID];\n }\n\n function showTab( tabID )\n {\n var zIndex = 0;\n if ( !!activeTab )\n {\n // activeTab is set\n zIndex = parseInt( activeTab.getContent().parent().css( 'zIndex' ) );\n activeTab.hide();\n activeTab.getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n else\n {\n // activeTab not set before\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n var currentZ = parseInt( tabs[tab].getContent().parent().css( 'zIndex' ) );\n if ( zIndex == 0 || currentZ < zIndex )\n {\n zIndex = currentZ;\n }\n tabs[tab].hide();\n }\n }\n\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n }\n\n $( window ).on( 'sizeChange', resetTabs );\n }\n\n activeTab = tabs[tabID];\n activeTab.getContent().parent().css( 'zIndex', zIndex );\n activeTab.show();\n }\n\n function getTab( tabID )\n {\n return tabs[tabID];\n }\n\n function resetTabs()\n {\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].show();\n }\n }\n\n activeTab = null;\n }\n }\n\n function Tab( id )\n {\n var $content;\n var $labels = [];\n var tabID = id;\n\n return {\n addLabel : addLabel,\n setContent: setContent,\n getContent: getContent,\n getID : getID,\n show : show,\n hide : hide\n };\n\n function getID()\n {\n return tabID;\n }\n\n function addLabel( label )\n {\n $labels.push( label );\n return this;\n }\n\n function setContent( content )\n {\n $content = content;\n return this;\n }\n\n function getContent()\n {\n return $content;\n }\n\n function show()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].addClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.show().addClass( 'in' );\n }\n\n }\n\n function hide()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].removeClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.hide().removeClass( 'in' );\n }\n }\n }\n\n }, ['MediaSizeService'] );\n})( jQuery, PlentyFramework );\n/**\n * Add fancy ui modifications - the visual stuff - here.\n * Respond functionality like 'event':UI.myFunctionality(currentElement)\n *\n * Example:\n * \n *\n */\n(function( $, pm )\n{\n pm.directive( 'UI', function( MediaSizeService, SocialShareService, UIFactory )\n {\n // elements to calculate height.\n var equalHeightElementList = [];\n var toTopButtonList = [];\n\n return {\n initUIWindowEvents : initUIWindowEvents,\n showWaitscreen : showWaitscreen,\n hideWaitscreen : hideWaitscreen,\n addContentPageSlider: addContentPageSlider,\n equalHeight : equalHeight,\n initToTop : initToTop,\n initLazyload : initLazyload,\n initSlideToggle : initSlideToggle,\n slideDown : slideDown,\n slideUp : slideUp,\n slideToggle : slideToggle,\n toggleHideShow : toggleHideShow,\n toggleSocialShare : toggleSocialShare,\n toggleClass : toggleClass,\n addClass : addClass,\n removeClass : removeClass\n };\n\n function initUIWindowEvents()\n {\n // resize elements on window size change.\n $( window ).on( 'sizeChange contentChanged', function()\n {\n fireEqualHeight();\n } );\n\n $( window ).on( \"scroll resize\", function()\n {\n if ( toTopButtonList.length > 0 )\n {\n if ( $( document ).scrollTop() > 100 )\n {\n doToArrayElements( toTopButtonList, \"addClass\", \"visible\" );\n }\n else\n {\n doToArrayElements( toTopButtonList, \"removeClass\", \"visible\" );\n }\n }\n } );\n }\n\n /**\n * Display waitscreen on page e.g. for requests.\n * Use with care and don't forget to hide waitscreen, if your calls are done or broke!!\n */\n function showWaitscreen()\n {\n UIFactory.showWaitscreen();\n }\n\n /**\n * Just hide the waitscreen.\n * @param forceClose\n */\n function hideWaitscreen( forceClose )\n {\n UIFactory.hideWaitscreen( forceClose );\n }\n\n /**\n * Adds content page slider (owlCarousel)\n *\n * usage:\n *
    \n *
    \n * ...\n *
    \n *
    \n * ...\n *
    \n * ...\n *
    \n *\n * Legacy directive selector: data-plenty=\"contentpageSlider\"\n *\n * @param elem\n */\n function addContentPageSlider( elem )\n {\n $( elem ).owlCarousel( {\n navigation : true,\n navigationText : false,\n slideSpeed : 1000,\n paginationSpeed: 1000,\n singleItem : true,\n autoPlay : 6000,\n stopOnHover : true,\n afterMove : function( current )\n {\n $( current ).find( '[data-plenty-rel=\"lazyload\"]' ).trigger( 'appear' );\n }\n } );\n }\n\n /**\n * Equal Box height\n * Calculates equal box height for chosen elements.\n *\n * Legacy directive selector: data-plenty-equal\n *\n * @param elem\n * @param elementExists - default false\n */\n function equalHeight( elem, mediaSizes, elementExists )\n {\n var $elem = $( elem );\n var maxHeight = 0;\n var $equalTarget = {};\n var $equalTargetList = $elem.find( '[data-plenty-rel=\"equal-target\"]' ).length > 0 ? $elem.find( '[data-plenty-rel=\"equal-target\"]' ) : $elem.children();\n\n // if element wasn't pushed before.\n if ( elementExists !== true )\n {\n equalHeightElementList.push( elem );\n }\n\n for ( var i = $equalTargetList.length; i >= 0; i-- )\n {\n $equalTarget = $( $equalTargetList[i] );\n $equalTarget.css( 'height', '' );\n\n if ( $equalTarget.outerHeight( true ) > maxHeight )\n {\n maxHeight = $equalTarget.outerHeight( true );\n }\n }\n\n if ( !mediaSizes || MediaSizeService.isInterval( mediaSizes ) )\n {\n $equalTargetList.height( maxHeight );\n }\n }\n\n /**\n * Scroll page to top.\n * Just add without events.\n *\n * Legacy directive selector: data-plenty=\"toTop\"\n *\n * @param elem\n */\n function initToTop( elem )\n {\n var $elem = $( elem );\n\n $elem.click( function()\n {\n $( 'html, body' ).animate( {\n scrollTop: 0\n }, 400 );\n return false;\n } );\n\n if ( !!$.inArray( $elem, toTopButtonList ) )\n {\n toTopButtonList.push( $elem );\n }\n }\n\n /**\n * lazy load on ready.\n *\n * Legacy directive selector: img[data-plenty-lazyload]\n *\n * @param elem\n */\n function initLazyload( elem, effect )\n {\n var $elem = $( elem );\n\n $elem.lazyload( {\n effect: effect\n } );\n if ( $elem.is( 'img' ) )\n {\n $elem.on( 'loaded', function()\n {\n $elem.css( 'display', 'inline-block' );\n } );\n }\n }\n\n /**\n * Toggle show and hide animation.\n *\n * Legacy directive selector: data-plenty=\"openCloseToggle\"\n *\n * @param elem\n */\n function toggleHideShow( elem )\n {\n\n console.log( elem );\n\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 200, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n /**\n * Toggle target content on click.\n * Bind to checked-/ unchecked-property of radio buttons\n *\n * Legacy directive selector: data-plenty-slidetoggle\n *\n * @param elem\n */\n function initSlideToggle( elem, checked )\n {\n var $elem = $( elem );\n var $targetElement = $( $elem.attr( 'data-plenty-rel' ) );\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n // is radio button\n var $radioGroupList = $( 'input[type=\"radio\"][name=\"' + ( $elem.attr( 'name' ) ) + '\"]' );\n var visibleOnChecked = !checked || checked == 'checked';\n\n $radioGroupList.change( function()\n {\n var $self = $( this );\n $targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n if ( $self.is( ':checked' ) && $self[0] === $elem[0] && visibleOnChecked == true )\n {\n // checked\n $targetElement.slideDown( 400, function()\n {\n fireEqualHeight();\n } );\n }\n else\n {\n // unchecked (since other radio button has been checked)\n $targetElement.slideUp( 400, function()\n {\n fireEqualHeight();\n } );\n }\n } );\n }\n else\n {\n // is not radio button\n $elem.click( function()\n {\n //$targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n $elem.addClass( 'animating' );\n $targetElement.slideToggle( 400, function()\n {\n $elem.removeClass( 'animating' );\n $elem.toggleClass( 'active' );\n fireEqualHeight();\n } );\n } );\n }\n }\n\n function slideDown( target, duration )\n {\n slideAction( $( target ), duration, 'slideDown' );\n }\n\n function slideUp( target, duration )\n {\n slideAction( $( target ), duration, 'slideUp' );\n }\n\n function slideToggle( target, duration )\n {\n slideAction( $( target ), duration, 'slideToggle' );\n }\n\n function slideAction( $target, duration, callbackString )\n {\n duration = duration || 400;\n $target.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n $target[callbackString]( duration, function()\n {\n fireEqualHeight();\n } );\n }\n\n /**\n * TODO check comment\n * Social Share Activation\n * Activate and load share-buttons manually by clicking a separate button\n * Usage / data-attributes:\n *
    \n * Will be used to activate the service set in\n * data-plenty-social=\"\"\n * Will be replaced with loaded share button\n *
    \n *\n * possible values for data-plenty-social:\n * \"facebook-like\" : Load Facebooks \"Like\"-Button\n * \"facebook-recommend\" : Load Facebooks \"Recommend\"-Button\n * \"twitter\" : Load Twitter Button\n * \"google-plus\" : Load google \"+1\"-Button\n *\n * Additional Tooltips\n * You can extend the parent element with a (bootstrap) tooltip by adding data-toggle=\"tooltip\" and\n * title=\"TOOLTIP CONTENT\" Tooltip will be destroyed after activating a social service\n * (!) Requires bootstrap.js\n *\n * Legacy directive selector: data-plenty-social\n *\n * @param elem\n */\n function toggleSocialShare( elem, socialShareService )\n {\n var $elem = $( elem );\n var $toggle = $elem.find( '[data-plenty-rel=\"social-switch\"]' );\n\n // append container to put / delete service.html\n $elem.append( '
    ' );\n\n // add \"off\" class to switch, if neither \"off\" or \"on\" is set\n // replaced hasClass() with is() benchmark: http://jsperf.com/hasclasstest\n if ( !$toggle.is( 'off, on' ) )\n {\n $toggle.addClass( 'off' );\n }\n\n // toggle switch\n $toggle.on( 'click', function()\n {\n if ( $toggle.hasClass( 'off' ) )\n {\n // TODO remove bootstrap dependency\n if ( $elem.attr( \"data-toggle\" ) == \"tooltip\" )\n {\n $elem.tooltip( 'destroy' )\n }\n $toggle.removeClass( 'off' ).addClass( 'on' );\n // hide dummy button\n $elem.find( '[data-plenty-rel=\"social-placeholder\"]' ).hide();\n // load HTML defined in 'api'\n $elem.find( '.social-container' ).append( SocialShareService.getSocialService( socialShareService ) );\n }\n // do not disable social medias after activation\n } );\n }\n\n /**\n * Toggle Class\n * toggle style-classes on click\n * Usage / data-attribute:\n *
    \n * target : jQuery selector to toggle the class at.\n * class : class(es) to toggle at target element\n * media : only toggle class on given media sizes (optional)\n *\n * (!) using data-plenty-toggle on -elements will prevent redirecting to href=\"\"\n *\n * Legacy directive selector: data-plenty-toggle\n *\n * @param cssClass\n * @param target\n * @param interval\n */\n function toggleClass( cssClass, target, interval )\n {\n var $target = $( target );\n /* FIXME\n * Callisto 3.1 Design adaption:\n * NavigationCategoriesList\n * Line 8\n * BEFORE:\n *
  • \n * AFTER:\n *
  • \n *\n * Line 10\n * BEFORE:\n * \n * AFTER:\n * \n *\n * */\n if ( $target.parents( \".navbar-main\" ).length > 0 )\n {\n var $elem = $target.children( \"span\" );\n pm.directives[\"MobileDropdown\"].slideDropdown( $elem );\n return true;\n }\n\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $target.toggleClass( cssClass );\n return false;\n }\n }\n\n function addClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).addClass( cssClass );\n return false;\n }\n }\n\n function removeClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).removeClass( cssClass );\n return false;\n }\n }\n\n /*\n ##### PRIVATE FUNCTIONS ######\n */\n\n function fireEqualHeight()\n {\n for ( var i = equalHeightElementList.length - 1; i >= 0; i-- )\n {\n equalHeight( equalHeightElementList[i], '', true );\n }\n }\n\n function doToArrayElements( array, func, params )\n {\n for ( var i = array.length - 1; i >= 0; i-- )\n {\n array[i][func]( params );\n }\n }\n\n }, ['MediaSizeService', 'SocialShareService', 'UIFactory'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Validator', function( ValidationService )\n {\n\n return {\n validate: validate\n };\n\n function validate( form, errorClass )\n {\n return ValidationService.validate( form, errorClass );\n }\n\n }, ['ValidationService'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Handles requests to ReST API. Provides a {{#crossLink \"APIFactory/handleError:method\"}}default\n * error-handling{{/crossLink}}. Request parameters will be parsed to json internally
    \n * Requires:\n *
      \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class APIFactory\n * @static\n */\n pm.factory( 'APIFactory', function( UI, Modal )\n {\n\n var sessionExpirationTimeout = null;\n $( document ).ready( function()\n {\n renewLoginSession();\n } );\n\n return {\n get : _get,\n post : _post,\n put : _put,\n delete: _delete,\n idle : _idle\n };\n\n function renewLoginSession()\n {\n if ( !pm.getGlobal( 'LoginSession' ) )\n {\n return;\n }\n\n if ( !!sessionExpirationTimeout )\n {\n clearTimeout( sessionExpirationTimeout );\n }\n\n sessionExpirationTimeout = setTimeout( function()\n {\n $( window ).trigger( 'login-expired' );\n\n if ( pm.getGlobal( 'PageDesign' ) === \"Checkout\" )\n {\n Modal.prepare()\n .setTitle( pm.translate( 'Your session has expired.' ) )\n .setContent( pm.translate( 'Please log in again to continue shopping.' ) )\n .setLabelDismiss( null )\n .setLabelConfirm( pm.translate( 'OK' ) )\n .onConfirm( function()\n {\n window.location.assign( '/' );\n } )\n .onDismiss( function()\n {\n window.location.assign( '/' );\n } )\n .show();\n }\n\n }, pm.getGlobal( 'LoginSessionExpiration' ) );\n }\n\n /**\n * Is called by default if a request failed.
    \n * Can be prevented by setting the requests last parameter to false.\n *\n * @function handleError\n * @private\n *\n * @param {object} jqXHR
    jQuery\n * deferred Object\n */\n function handleError( jqXHR )\n {\n try\n {\n var responseText = $.parseJSON( jqXHR.responseText );\n UI.printErrors( responseText.error.error_stack );\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n }\n\n /**\n * Sends a GET request to ReST-API\n *\n * @function get\n *\n * @param {string} url The URL to send the request to\n * @param {object} params The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _get( url, params, ignoreErrors, runInBackground, sync )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'GET',\n data : params,\n dataType: 'json',\n async : !sync,\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a POST request to ReST-API\n *\n * @function post\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _post( url, data, ignoreErrors, runInBackground )\n {\n\n var params = {\n type : 'POST',\n dataType: 'json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n };\n\n if ( !!data && data.isFile )\n {\n params.cache = data.cache;\n params.processData = data.processData;\n params.data = data.data;\n params.contentType = false;\n }\n else\n {\n params.data = JSON.stringify( data );\n params.contentType = 'application/json';\n }\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url, params\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n }\n\n /**\n * Sends a PUT request to ReST-API\n *\n * @function put\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _put( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'PUT',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a DELETE request to ReST-API\n *\n * @function delete\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @returns {object} jQuery\n * deferred Object\n */\n function _delete( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'DELETE',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Get a idle request doing nothing for chaining methods\n * @returns {object} jQuery\n * deferred Object\n */\n function _idle()\n {\n return $.Deferred().resolve();\n }\n\n }, ['UIFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Provide methods for receiving layout containers, layout parameters\n * or category content from API
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    \n * @class CMSFactory\n * @static\n */\n pm.factory( 'CMSFactory', function( API )\n {\n\n return {\n getContainer : getContainer,\n getParams : getParams,\n getCategoryContent: getCategoryContent\n };\n\n /**\n * Prepare the request to receive HTML-Content from CMS\n * @function getContainer\n * @param {string} containerName The Layoutcontainer to receive.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the location in\n * the CMS\n * (e.g. 'Checkout')\n * @example\n * CMSFactory.getContainer( 'CheckoutTotals' ).from( 'Checkout' )\n * .done(function( response ) {\n * // container content\n * var html = response.data[0]\n * });\n */\n function getContainer( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/container_' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n\n }\n\n /**\n * Prepare the request to receive Layout parameters for a template\n * @function getParams\n * @param {string} containerName The Layoutcontainer to receive the parameteres of.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the\n * location in the CMS\n * (e.g. 'ItemView')\n * @example\n * CMSFactory.getParams( 'BasketItemsList' ).from( 'ItemView' )\n * .done(function( response ) {\n * // BasketItems\n * var items = response.data;\n * });\n */\n function getParams( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n }\n\n /**\n * Get the content of a category specified by its ID\n * @function getCategoryContent\n * @param {number} categoryID The ID of the category to get the content from\n * @returns {object} jQuery deferred\n * Object\n */\n function getCategoryContent( categoryID )\n {\n return API.get( '/rest/categoryview/categorycontentbody/?categoryID=' + categoryID );\n }\n\n }, ['APIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Holds checkout data for global access and provides methods\n * for reloading content dynamically-
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutFactory\n * @static\n */\n pm.factory( 'CheckoutFactory', function( API, CMS, UI )\n {\n\n // data received from ReST API\n var checkoutData;\n\n // instance wrapped checkout object for global access\n var checkout;\n\n return {\n getCheckout : getCheckout,\n setCheckout : setCheckout,\n loadCheckout : loadCheckout,\n reloadContainer : reloadContainer,\n reloadCatContent : reloadCatContent,\n reloadItemContainer: reloadItemContainer\n };\n\n function Checkout()\n {\n return checkoutData;\n }\n\n /**\n * Returns instance of wrapped checkout object\n * @function getCheckout\n * @returns {Checkout} Instance of checkout object\n */\n function getCheckout( copy )\n {\n if ( !checkout || !checkoutData )\n {\n loadCheckout( true );\n }\n\n if ( !!copy )\n {\n return $.extend( true, {}, checkoutData );\n }\n return checkout;\n }\n\n /**\n * Receive global checkout data from ReST-API\n * @function loadCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function loadCheckout( sync )\n {\n\n return API.get( '/rest/checkout/', null, false, false, sync )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n }\n\n /**\n * Update checkout data on server\n * @function setCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function setCheckout()\n {\n\n return API.put( '/rest/checkout', checkout )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-checkout-template=\"...\"\n * @function reloadContainer\n * @param {string} container Name of the template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadContainer( container )\n {\n\n return CMS.getContainer( \"checkout\" + container ).from( 'checkout' )\n .done( function( response )\n {\n $( '[data-plenty-checkout-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n } );\n } );\n }\n\n /**\n * Get category content from server and replace received HTML\n * in containers marked with data-plenty-checkout-catcontent=\"...\"\n * @function reloadCatContent\n * @param {number} catId ID of the category to load content (description 1) from server\n * @return {object} jQuery deferred\n * Object\n * @deprecated\n */\n function reloadCatContent( catId )\n {\n\n return CMS.getCategoryContent( catId )\n .done( function( response )\n {\n $( '[data-plenty-checkout-catcontent=\"' + catId + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-itemview-template=\"...\"\n * @function reloadItemContainer\n * @param {string} container Name of the (item view) template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadItemContainer( container )\n {\n\n return CMS.getContainer( 'itemview' + container ).from( 'itemview' )\n .done( function( response )\n {\n $( '[data-plenty-itemview-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n }, ['APIFactory', 'CMSFactory', 'UIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Provides methods for creating and displaying modal popups.\n * @class ModalFactory\n * @static\n */\n pm.factory( 'ModalFactory', function()\n {\n\n return {\n prepare: prepare,\n isModal: isModal\n };\n\n /**\n * Detect if given html contains a valid modal\n * @function isModal\n * @param {string} html\n * @returns {boolean}\n */\n function isModal( html )\n {\n return PlentyFramework.partials.Modal.isModal( html );\n }\n\n /**\n * Create a new Instance of {{#crossLink \"ModalFactory.Modal\"}}Modal{{/crossLink}}\n * @function prepare\n * @returns {Modal}\n */\n function prepare( selector )\n {\n return new Modal( selector );\n }\n\n /**\n * Holds configuration of a modal and provides methods for displaying and hiding the modal\n * @class Modal\n * @for ModalFactory\n * @returns {Modal}\n * @constructor\n */\n function Modal( selector )\n {\n\n var modal = this;\n modal.selector = selector;\n\n /**\n * The title of the modal\n * @attribute title\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.title = '';\n\n modal.cssClass = '';\n\n /**\n * The content of the modal\n * @attribute content\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.content = '';\n\n /**\n * The content of the dismiss-button\n * @attribute labelDismiss\n * @type {string}\n * @private\n * @default \"Abbrechen\"\n */\n modal.labelDismiss = pm.translate( \"Cancel\" );\n\n /**\n * the label of the confirmation button\n * @attribute labelConfirm\n * @type {string}\n * @private\n * @default \"Bestätigen\"\n */\n modal.labelConfirm = pm.translate( \"Confirm\" );\n\n /**\n * Callback when modal is confirmed by clicking confirmation button.\n * Modal will not be dismissed if callback returns false.\n * @attribute onConfirm\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onConfirm = function()\n {\n };\n\n /**\n * Callback when modal is dismissed by closing the modal\n * @attribute onDismiss\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onDismiss = function()\n {\n };\n\n /**\n * jQuery selector of the container element to display the modal in.\n * @attribute container\n * @type {string}\n * @private\n * @default \"body\"\n */\n modal.container = 'body';\n\n /**\n * Timeout to close the modal automatically. Set <0 to disable.\n * @attribute timeout\n * @type {number}\n * @private\n * @default -1\n */\n modal.timeout = -1;\n\n modal.hide = hide;\n modal.startTimeout = startTimeout;\n modal.stopTimeout = stopTimeout;\n modal.pauseTimeout = pauseTimeout;\n modal.continueTimeout = continueTimeout;\n\n var bsModal;\n var timeout, interval;\n var timeRemaining, timeStart;\n var paused = false;\n\n return {\n setTitle : setTitle,\n setClass : setClass,\n setContent : setContent,\n setContainer : setContainer,\n setLabelConfirm: setLabelConfirm,\n setLabelDismiss: setLabelDismiss,\n onConfirm : onConfirm,\n onDismiss : onDismiss,\n setTimeout : setTimeout,\n show : show,\n hide : hide\n };\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/title:attribute}}title{{/crossLink}} of the modal\n * @function setTitle\n * @param {string} title The title\n * @returns {Modal} Modal object for chaining methods\n */\n function setTitle( title )\n {\n modal.title = title;\n return this;\n }\n\n function setClass( cssClass )\n {\n modal.cssClass = cssClass;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/content:attribute}}content{{/crossLink}} of the modal\n * @function setContent\n * @param {string} content The content\n * @returns {Modal} Modal object for chaining methods\n */\n function setContent( content )\n {\n modal.content = content;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelConfirm:attribute}}label of the confirmation\n * button{{/crossLink}} of the modal\n * @function setLabelConfirm\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelConfirm( label )\n {\n modal.labelConfirm = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelDismiss:attribute}}label if the dismiss\n * button{{/crossLink}} of the modal\n * @function setLabelDismiss\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelDismiss( label )\n {\n modal.labelDismiss = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onConfirm:attribute}}confirmation callback{{/crossLink}} of the\n * modal\n * @function onConfirm\n * @param {function} callback The callback if modal is confirmed\n * @returns {Modal} Modal object for chaining methods\n */\n function onConfirm( callback )\n {\n modal.onConfirm = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onDismiss:attribute}}dismiss callback{{/crossLink}} of the modal\n * @function onDismiss\n * @param {function} callback The callback if modal is dismissed\n * @returns {Modal} Modal object for chaining methods\n */\n function onDismiss( callback )\n {\n modal.onDismiss = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/container:attribute}}container{{/crossLink}} of the modal\n * @function setContainer\n * @param {string} container The jQuery selector of the container to display the modal in\n * @returns {Modal} Modal object for chaining methods\n */\n function setContainer( container )\n {\n modal.container = container;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/timeout:attribute}}timeout{{/crossLink}} of the modal\n * @function setTimeout\n * @param {number} timeout The timeout to close the modal automatically. Set <0 to disable\n * @returns {Modal} Modal object for chaining methods\n */\n function setTimeout( timeout )\n {\n modal.timeout = timeout;\n return this;\n }\n\n /**\n * Inject modal data in default template if not template is given\n * and display the modal inside the configured container.
    \n * Start timer to hide the modal automatically if timeout is set.\n * @function show\n */\n function show()\n {\n if( !!modal.selector )\n {\n bsModal = $( modal.selector );\n }\n else\n {\n if ( isModal( modal.content ) )\n {\n bsModal = PlentyFramework.partials.Modal.getModal( modal.content );\n }\n else\n {\n bsModal = $( PlentyFramework.compileTemplate( 'modal/modal.html', modal ) );\n }\n\n $( modal.container ).append( bsModal );\n\n // append additional scripts executable\n var scripts = $( modal.content ).filter( 'script' );\n if ( scripts.length > 0 )\n {\n scripts.each( function( i, script )\n {\n var element = document.createElement( 'script' );\n element.type = 'text/javascript';\n element.innerHTML = $( script ).text();\n $( modal.container ).append( element );\n } );\n }\n }\n\n // bind callback functions\n PlentyFramework.partials.Modal.init( bsModal, modal );\n bsModal.find( '[data-plenty-modal=\"confirm\"]' ).click( function()\n {\n var close = modal.onConfirm();\n\n if ( typeof close == \"undefined\" )\n {\n close = true;\n }\n\n if ( close )\n {\n hide( true );\n }\n } );\n\n PlentyFramework.partials.Modal.show( bsModal );\n\n if ( modal.timeout > 0 )\n {\n startTimeout();\n }\n\n }\n\n /**\n * Hide the modal.\n * @function hide\n * @param {boolean} confirmed Flag indicating of modal is closed by confirmation button or dismissed\n */\n function hide( confirmed )\n {\n PlentyFramework.partials.Modal.hide( bsModal );\n\n if ( !confirmed )\n {\n modal.onDismiss();\n }\n }\n\n /**\n * Start the configured timeout initially\n * @function startTimeout\n * @private\n */\n function startTimeout()\n {\n timeRemaining = modal.timeout;\n timeStart = (new Date()).getTime();\n\n timeout = window.setTimeout( function()\n {\n window.clearInterval( interval );\n hide();\n }, modal.timeout );\n\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( timeRemaining / 1000 );\n interval = window.setInterval( function()\n {\n if ( !paused )\n {\n var secondsRemaining = timeRemaining - (new Date()).getTime() + timeStart;\n secondsRemaining = Math.round( secondsRemaining / 1000 );\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( secondsRemaining );\n }\n }, 1000 )\n }\n\n /**\n * Pause the timeout (e.g. on hover)\n * @function pauseTimeout\n * @private\n */\n function pauseTimeout()\n {\n paused = true;\n timeRemaining -= (new Date()).getTime() - timeStart;\n window.clearTimeout( timeout );\n }\n\n /**\n * Continue paused timeout\n * @function continueTimeout\n * @private\n */\n function continueTimeout()\n {\n paused = false;\n timeStart = (new Date()).getTime();\n timeout = window.setTimeout( function()\n {\n hide();\n window.clearInterval( interval );\n }, timeRemaining );\n }\n\n /**\n * Stop timeout. Stopped timeouts cannot be continued.\n * @function stopTimeout\n * @private\n */\n function stopTimeout()\n {\n window.clearTimeout( timeout );\n window.clearInterval( interval );\n }\n\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Displaying error messages and handling wait screen\n * @class UIFactory\n * @static\n */\n pm.factory( 'UIFactory', function()\n {\n /**\n * Increased/ decreased when showing/ hiding wait screen to avoid stacking\n * multiple instances of overlays.\n * @attribute waitScreenCount\n * @private\n * @type {number}\n * @default 0\n */\n var waitScreenCount = 0;\n var waitScreen;\n var errorPopup = null;\n\n return {\n throwError : throwError,\n printErrors : printErrors,\n showWaitScreen: showWaitScreen,\n hideWaitScreen: hideWaitScreen\n };\n\n /**\n * Display a single error message.\n * @function throwError\n * @param {number} code A code identifying this error\n * @param {string} msg The error message to display\n */\n function throwError( code, msg )\n {\n printErrors( [{code: code, message: msg}] );\n }\n\n /**\n * Wrap error messages in error popup, if popup doesn't already contain this error\n * If popup is already visible, append new errors to popup's inner HTML\n * otherwise create new popup\n * @function printErrors\n * @param {Array} errorMessages A list of errors to display\n */\n function printErrors( errorMessages )\n {\n\n // create error-popup if not exist\n if ( !errorPopup || $( 'body' ).has( errorPopup ).length <= 0 )\n {\n errorPopup = $( pm.compileTemplate( 'error/errorPopup.html' ) );\n $( 'body' ).append( errorPopup );\n pm.partials.Error.init( errorPopup );\n }\n\n $.each( errorMessages, function( key, error )\n {\n // add additional error, if not exist.\n pm.partials.Error.addError( errorPopup, $( pm.compileTemplate( 'error/errorMessage.html', error ) ) );\n } );\n\n pm.partials.Error.show( errorPopup );\n\n hideWaitScreen( true );\n }\n\n /**\n * Show wait screen if not visible and increase\n * {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * @function showWaitScreen\n */\n function showWaitScreen()\n {\n waitScreenCount = waitScreenCount || 0;\n\n // create wait-overlay if not exist\n if ( !waitScreen || $( 'body' ).has( waitScreen ).length <= 0 )\n {\n waitScreen = $( pm.compileTemplate( 'waitscreen/waitscreen.html' ) );\n $( 'body' ).append( waitScreen );\n }\n\n pm.partials.WaitScreen.show( waitScreen );\n\n // increase instance counter to avoid showing multiple overlays\n waitScreenCount++;\n return waitScreenCount;\n }\n\n /**\n * Decrease {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * and hide wait screen if waitScreenCount is 0\n * @function hideWaitScreen\n * @param {boolean} forceClose set true to hide wait screen independent from the value of waitScreenCount.\n */\n function hideWaitScreen( forceClose )\n {\n\n // decrease overlay count\n waitScreenCount--;\n\n // hide if all instances of overlays has been closed\n // or if closing is forced by user\n if ( waitScreenCount <= 0 || !!forceClose )\n {\n waitScreenCount = 0;\n pm.partials.WaitScreen.hide( waitScreen );\n }\n return waitScreenCount;\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Factories provide static functions and can be injected into\n * {{#crossLinkModule \"Services\"}}services{{/crossLinkModule}}.
    \n * Factories also can inject other factories. Compared to services,\n * factories are not visible in instances of {{#crossLinkModule \"PlentyFramework\"}}PlentyFramework{{/crossLinkModule}}.\n *\n * @module Factories\n * @main Factories\n */\nObject.equals = function( a, b )\n{\n if ( a === b )\n {\n return true;\n }\n if ( !(a instanceof Object) || !(b instanceof Object) )\n {\n return false;\n }\n if ( a.constructor !== b.constructor )\n {\n return false;\n }\n\n for ( var key in a )\n {\n if ( !a.hasOwnProperty( key ) )\n {\n continue;\n }\n if ( !b.hasOwnProperty( key ) )\n {\n return false;\n }\n if ( a[key] === b[key] )\n {\n continue;\n }\n if ( typeof( a[key] ) !== \"object\" )\n {\n return false;\n }\n if ( !Object.equals( a[key], b[key] ) )\n {\n return false;\n }\n }\n\n for ( var key in b )\n {\n if ( b.hasOwnProperty( key ) && !a.hasOwnProperty( key ) )\n {\n return false;\n }\n }\n\n return true;\n\n};\nPlentyFramework.cssClasses = {\n\n active: \"active\"\n\n};\n(function( $, pm )\n{\n\n pm.partials.Error = {\n\n /**\n * Will be called, after the error popup was created and injected in DOM.\n * @param {HTMLElement} popup The injected element of the popup\n */\n init: function( popup )\n {\n $( popup ).find( '.close' ).click( function()\n {\n pm.partials.Error.hideAll();\n } );\n },\n\n /**\n * Will be called for each thrown error. Has to be injected in DOM manually.\n * @param {HTMLElement} popup The error popup element\n * @param {HTMLElement} error The error message element\n */\n addError: function( popup, error )\n {\n var errorCode = $( error ).attr( 'data-plenty-error-code' );\n\n if ( $( popup ).find( '[data-plenty-error-code=\"' + errorCode + '\"]' ).length <= 0 )\n {\n $( popup ).find( '.plentyErrorBoxInner' ).append( error );\n }\n },\n\n /**\n * Will be called, after initialization and injection of all errors\n * @param {HTMLElement} popup The error popup element\n */\n show: function( popup )\n {\n $( popup ).show();\n },\n\n hideAll: function() {\n $( '#CheckoutErrorPane' ).hide();\n $( '#CheckoutErrorPane' ).find( '.plentyErrorBoxInner' ).html( '' );\n }\n\n }\n\n})( jQuery, PlentyFramework );\n(function( $, pm )\n{\n\n pm.partials.Modal = {\n\n /**\n * Will be called after a new modal was created and injected into DOM\n * @param {HTMLElement} element The injected modal element\n * @param {Modal} modal The instance of the current modal\n */\n init: function( element, modal )\n {\n element.on( 'hidden.bs.modal', function()\n {\n modal.hide();\n if( !modal.selector )\n {\n //Do not remove static modals\n element.remove();\n }\n } );\n\n if ( modal.timeout > 0 )\n {\n element.on( 'hide.bs.modal', modal.stopTimeout );\n element.find( '.modal-content' ).hover( function()\n {\n modal.pauseTimeout();\n }, function()\n {\n if ( element.is( '.in' ) )\n {\n modal.continueTimeout();\n }\n } );\n }\n },\n\n /**\n * Will be called if a Modal requests to show.\n * @param {HTMLElement} element The injected modal element\n */\n show: function( element )\n {\n element.modal( 'show' );\n },\n\n /**\n * Will be called if a Modal requests to hide.\n * @param {HTMLElement} element The injected modal element\n */\n hide: function( element )\n {\n element.modal( 'hide' );\n },\n\n /**\n * Detect if a given HTML string contains a modal\n * @param {HTMLElement} html the element to search a modal in.\n * @returns {boolean} true if a modal was found\n */\n isModal: function( html )\n {\n return $( html ).filter( '.modal' ).length + $( html ).find( '.modal' ).length > 0;\n },\n\n /**\n * Filter a modal from a given HTML string\n * @param {HTMLElement} html the element to get a modal from.\n * @returns {HTMLElement} the filtered modal element\n */\n getModal: function( html )\n {\n var modal = $( html );\n if ( modal.length > 1 )\n {\n modal = $( html ).filter( '.modal' ) || $( html ).find( '.modal' );\n }\n\n return modal;\n }\n\n };\n\n}( jQuery, PlentyFramework ));\n(function( $ )\n{\n\n $( document ).on( 'initPartials', function( e, root )\n {\n\n $( root ).find( '[data-toggle=\"tooltip\"]' ).tooltip( {\n container: 'body'\n } );\n\n } );\n\n})( jQuery );\n(function( $, pm )\n{\n\n pm.partials.WaitScreen = {\n\n /**\n * Will be called if the wait screen should be shown\n * @param {HTMLElement} element The wait screen element\n */\n show: function( element )\n {\n element.addClass( 'in' );\n },\n\n /**\n * Will be called if the wait screen should be hidden\n * @param {HTMLElement} element The wait screen element\n */\n hide: function( element )\n {\n element.removeClass( 'in' );\n }\n\n };\n\n})( jQuery, PlentyFramework );\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.service( 'AddressDoctorService', function( API )\n {\n return {\n validateAddress: validateAddress\n };\n\n function validateAddress( addressForms )\n {\n var addressIsValid = true;\n addressForms = addressForms || '[data-plenty-address-doctor]';\n $( addressForms ).filter( '[data-plenty-address-doctor]:visible' ).each( function( i, form )\n {\n var addressDoctor = new AddressDoctor( form );\n var requiredFields = $( form ).attr( 'data-plenty-address-doctor' ).replace( /\\s/g, '' ).split( ',' );\n if ( !addressDoctor.isValid( requiredFields ) )\n {\n addressIsValid = false;\n }\n\n } );\n\n return addressIsValid;\n }\n\n function AddressDoctor( form )\n {\n var $form = $( form );\n var $inputs = {\n Street : $form.find( 'input[name=\"Street\"]' ),\n ZIP : $form.find( 'input[name=\"ZIP\"]' ),\n City : $form.find( 'input[name=\"City\"]' ),\n HouseNo: $form.find( 'input[name=\"HouseNo\"]' )\n };\n var $suggestionContainer = {};\n\n var suggestions;\n var requiredFields;\n\n return {\n isValid: isValid\n };\n\n function isValid( fields )\n {\n\n if ( isPackstation() )\n {\n return true;\n }\n\n suggestions = new AddressList( $form.getFormValues() );\n requiredFields = fields;\n\n refreshView();\n\n return suggestions.getAddresses().length == 1;\n }\n\n function refreshView()\n {\n $( '.suggestion-list' ).remove();\n\n var suggestionListVisible = false;\n for ( var i = 0; i < requiredFields.length; i++ )\n {\n if ( !validateInput( requiredFields[i], suggestionListVisible ) )\n {\n $form.trigger( 'validationFailed' );\n suggestionListVisible = true;\n }\n }\n\n if ( suggestions.houseNoAllowed( $inputs.HouseNo.val() ) || suggestions.getAddresses().length == 1 )\n {\n $inputs.HouseNo.removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs.HouseNo.addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n }\n else\n {\n $inputs.HouseNo.removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs.HouseNo.addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n }\n }\n\n function validateInput( key, suggestionListVisible )\n {\n var valueList = suggestions.getList( key );\n\n if ( !!$suggestionContainer[key] )\n {\n $suggestionContainer[key].remove();\n }\n\n if ( !$inputs[key] )\n {\n return true;\n }\n\n if ( valueList.length == 1 )\n {\n $inputs[key].val( valueList[0] );\n\n $inputs[key].removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs[key].addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n return true;\n }\n else\n {\n $inputs[key].removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs[key].addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n\n if ( !suggestionListVisible )\n {\n buildSuggestionList( $inputs[key], valueList );\n }\n $inputs[key].off( 'focus' );\n $inputs[key].focus();\n return false;\n\n }\n }\n\n function positionSuggestionList( $parent, suggestionKey )\n {\n $suggestionContainer[suggestionKey].css( {\n 'width': $parent.outerWidth( true ),\n 'left' : $parent.position().left,\n 'top' : $parent.position().top + $parent.outerHeight( true )\n } );\n }\n\n function buildSuggestionList( $parent, values )\n {\n var suggestionKey = $parent.attr( 'name' );\n\n // render html content\n $suggestionContainer[suggestionKey] = $( pm.compileTemplate( 'addressSuggestions/addressDoctor.html', {values: values} ) );\n\n positionSuggestionList( $parent, suggestionKey );\n\n $( window ).on( 'sizeChange', function()\n {\n positionSuggestionList( $parent, suggestionKey );\n } );\n\n // bind click event to list elements\n $suggestionContainer[suggestionKey].find( '[data-address-value]' ).each( function( i, elem )\n {\n\n var $elem = $( elem );\n var value = $elem.attr( 'data-address-value' );\n\n $elem.click( function()\n {\n // insert clicked value in input\n $parent.val( value );\n\n // filter addresses and show remaining suggestions\n var filterAddress = {};\n filterAddress[$parent.attr( 'name' )] = value;\n suggestions.filter( filterAddress );\n\n // refresh suggestion lists\n refreshView();\n\n } );\n\n } );\n\n // inject html\n $parent.parent().append( $suggestionContainer[suggestionKey] );\n }\n\n function isPackstation()\n {\n return ( $inputs.Street.val().toUpperCase() == \"PACKSTATION\" || $inputs.Street.val().toUpperCase() == \"POSTFILIALE\" );\n }\n\n }\n\n function AddressList( addressInput )\n {\n var addresses = [];\n\n init();\n\n return {\n getAddresses : getAddresses,\n getList : getList,\n filter : filter,\n houseNoAllowed: houseNoAllowed\n };\n\n function init()\n {\n API.get( '/rest/checkout/addresssuggestionresultslist/', {\n suggestionType: \"addressdoctor\",\n street : addressInput.Street,\n ZIP : addressInput.ZIP,\n city : addressInput.City,\n houseNo : addressInput.HouseNo,\n country : addressInput.CountryID\n }, false, false, true ).done( function( response )\n {\n\n var responseLength = response.data.length;\n\n for ( var i = 0; i < responseLength; i++ )\n {\n var currentResponse = response.data[i];\n\n var address = getAddress( currentResponse )\n if ( !address )\n {\n currentResponse.HouseNo = [currentResponse.HouseNo];\n addresses.push( currentResponse );\n }\n else\n {\n address.HouseNo.push( currentResponse.HouseNo );\n }\n\n }\n\n } );\n }\n\n function getAddress( suggestion )\n {\n var addressCount = addresses.length;\n\n for ( var j = 0; j < addressCount; j++ )\n {\n if ( suggestion.Street == addresses[j].Street && addresses.ZIP == addresses[j].ZIP && suggestion.City == addresses[j].City )\n {\n return addresses[j];\n }\n }\n\n return null;\n\n }\n\n function getAddresses()\n {\n return addresses;\n }\n\n function getList( key )\n {\n var results = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( $.inArray( address[key], results ) < 0 )\n {\n results.push( address[key] );\n }\n }\n\n return results;\n }\n\n function filter( filterAddress )\n {\n var filteredAddresses = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( (!!filterAddress.Street && filterAddress.Street == address.Street)\n || (!!filterAddress.ZIP && filterAddress.ZIP == address.ZIP)\n || (!!filterAddress.City && filterAddress.City == address.City) )\n {\n filteredAddresses.push( address );\n }\n }\n\n addresses = filteredAddresses;\n }\n\n function houseNoAllowed( houseNo )\n {\n houseNo = parseInt( houseNo );\n\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n\n for ( var j = 0; j < address.HouseNo.length; j++ )\n {\n var range = address.HouseNo[j].split( '-' );\n if ( ( range.length == 1 && houseNo == range[0] )\n || range.length == 2 && houseNo >= range[0] && houseNo <= range[1] )\n {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for logging in and out and registering new customers.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    \n * @class AuthenticationService\n * @static\n */\n pm.service( 'AuthenticationService', function( API, Checkout, UI )\n {\n\n return {\n resetPassword : resetPassword,\n customerLogin : customerLogin,\n setInvoiceAddress: setInvoiceAddress,\n registerCustomer : registerCustomer\n };\n\n /**\n * Reading E-Mail from form marked with data-plenty-checkout=\"lostPasswordForm\"\n * and sends request to provide a new password to the entered E-Mail-Address.\n *\n * @function resetPasswort\n * @return {object} jQuery deferred\n * Object\n */\n function resetPassword()\n {\n\n var form = $( '[data-plenty-checkout=\"lostPasswordForm\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n var params = {\n Email: values.Email\n };\n\n return API.post( \"/rest/checkout/lostpassword/\", params )\n .done( function( response )\n {\n if ( response.data.IsMailSend == true )\n {\n $( '[data-plenty-checkout=\"lostPasswordTextContainer\"]' ).hide();\n $( '[data-plenty-checkout=\"lostPasswordSuccessMessage\"]' ).show();\n }\n } );\n\n }\n }\n\n /**\n * Try to login in with credentials read from given <form> - element.\n * On success redirect to forms 'action' attribute.\n *\n * @function customerLogin\n * @param {object} form The jQuery-wrapped form-element to read the credentials from\n * @return {object} jQuery deferred\n * Object\n */\n function customerLogin( form )\n {\n if ( form.validateForm() )\n {\n var values = form.getFormValues();\n\n var params = {\n Email : values.loginMail,\n Password: values.loginPassword\n };\n\n UI.showWaitScreen();\n return API.post( \"/rest/checkout/login/\", params )\n .done( function()\n {\n // successful login -> go to form's target referenced by action-attribute\n window.location.assign( form.attr( 'action' ) );\n\n } );\n }\n }\n\n /**\n * Setting the invoice address of a newly registered customer or a guest.\n *\n * @function setInvoiceAddress\n * @param {object} invoiceAddress containing address-data sent to server\n * @return {object} jQuery deferred\n * Object\n */\n function setInvoiceAddress( invoiceAddress )\n {\n\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n Checkout.getCheckout().CustomerInvoiceAddress = response.data;\n } );\n }\n\n /**\n * Prepare address-data to register new customer. Read the address-data from a <form> marked with\n * data-plenty-checkout-form=\"customerRegistration\"
    \n * On success, redirect to forms target referenced by action-attribute\n *\n * @function registerCustomer\n * @return {object} jQuery deferred\n * Object\n */\n function registerCustomer()\n {\n var form = $( '[data-plenty-checkout-form=\"customerRegistration\"]' );\n\n if ( form.validateForm() && pm.getInstance().AddressDoctorService.validateAddress() )\n {\n var values = form.getFormValues();\n values.LoginType = 2;\n\n if ( values.checkout\n && values.checkout.customerInvoiceAddress\n && values.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = values.checkout.customerInvoiceAddress.CustomerProperty;\n values.CustomerPropertiesList = values.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n values.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n return setInvoiceAddress( values )\n .done( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } );\n }\n }\n }, ['APIFactory', 'CheckoutFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for adding, editing or removing basket items and coupon codes
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class BasketService\n * @static\n */\n pm.service( 'BasketService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n addItem : addBasketItem,\n removeItem : removeBasketItem,\n getItem : getBasketItem,\n setItemQuantity : setItemQuantity,\n editItemAttributes: editItemAttributes,\n editOrderParams : editOrderParams,\n addCoupon : addCoupon,\n removeCoupon : removeCoupon\n };\n\n /**\n * Add item to basket. Will fail and show a popup if item has order params\n * @function addBasketItem\n * @param {Array} article Array containing the item to add\n * @param {boolean} [isUpdate=false] Indicating if item's OrderParams are updated\n * @return {object} jQuery deferred\n * Object\n */\n function addBasketItem( article )\n {\n\n if ( !!article )\n {\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/',\n {\n itemID : article[0].BasketItemItemID,\n quantity: article[0].BasketItemQuantity\n }, false, true ).done( function( resp )\n {\n // checking for order params!\n if ( resp.data[0].indexOf( \"form-group\" ) > 0 )\n {\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Select order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n addArticle( saveOrderParams( article ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n }\n else\n {\n addArticle( article );\n }\n } );\n }\n }\n\n /**\n * Read OrderParams from <form> marked with data-plenty-checkout-form=\"OrderParamsForm\" and inject\n * read values in 'addBasketList'. Update item by calling addBasketItem() again\n * @function saveOrderParams\n * @private\n * @param {Array} articleWithParams Containing the current item to add. Read OrderParams will be injected\n */\n function saveOrderParams( articleWithParams )\n {\n //TODO use $(\"[data-plenty-checkout-form='OrderParamsForm']\").serializeArray() to get order params\n var orderParamsForm = $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' );\n var $self = {};\n var attrType = \"\";\n var match;\n\n //Groups\n orderParamsForm.find( '[name^=\"ParamGroup\"]' ).each( function()\n {\n match = this.name.match( /^ParamGroup\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], $( this ).val(), $( this ).val() );\n } );\n\n //Values\n orderParamsForm.find( '[name^=\"ParamValue\"]' ).each( function()\n {\n $self = $( this );\n attrType = $self.attr( 'type' );\n\n if ( ((attrType == 'checkbox' && $self.is( ':checked' )) ||\n (attrType == 'radio' && $self.is( ':checked' )) ||\n (attrType != 'radio' && attrType != 'checkbox')) && attrType != 'file' && attrType != 'hidden' )\n {\n\n var match = $self[0].name.match( /^ParamValue\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], $self.val() );\n\n }\n else if ( attrType == 'file' )\n {\n if ( $self[0].files && $self[0].files.length > 0 )\n {\n articleWithParams = orderParamFileUpload( $self, articleWithParams );\n }\n else\n {\n var match = $self[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n var paramValue = $( 'input[type=\"hidden\"][name=\"ParamValue[' + match[1] + '][' + match[2] + ']\"]' ).val();\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], paramValue );\n }\n }\n } );\n\n return articleWithParams;\n }\n\n function addArticle( article )\n {\n API.post( '/rest/checkout/basketitemslist/', article, true )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.loadCheckout()\n .done( function()\n {\n var artAttr = $( \"[name^=ArticleAttribute]\" );\n var requestData = {ArticleID: article[0].BasketItemItemID};\n\n if ( artAttr )\n {\n $( \"[name^=ArticleAttribute]\" ).each( function( i, v )\n {\n requestData[$( v ).attr( \"name\" )] = $( v ).val();\n } );\n }\n\n refreshBasketPreview();\n\n // Show confirmation popup\n CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', requestData ).from( 'ItemView' )\n .done( function( response )\n {\n var timeout = pm.getGlobal( 'TimeoutItemToBasketOverlay', 5000 );\n var modal = Modal.prepare().setContent( response.data[0] );\n\n if ( timeout > 0 )\n {\n modal.setTimeout( timeout );\n }\n\n modal.show();\n } );\n } );\n } ).fail( function( jqXHR )\n {\n // some other error occured\n UI.printErrors( JSON.parse( jqXHR.responseText ).error.error_stack );\n } );\n }\n\n function updateArticle( article )\n {\n API.put( '/rest/checkout/basketitemslist/', article )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n } );\n } )\n }\n\n function orderParamFileUpload( $input, articleWithParams )\n {\n var key = $input[0].id;\n var orderParamUploadFiles = {};\n var orderParamFileIdStack = [];\n var formData;\n var fileData;\n var params = {\n type : 'POST',\n data : {},\n isFile : true,\n cache : false,\n dataType : 'json',\n processData: false,\n contentType: false\n };\n\n orderParamUploadFiles[key] = $input[0].files;\n\n // if input not pushed before.\n if ( orderParamFileIdStack.indexOf( key ) == -1 )\n {\n orderParamFileIdStack.push( key );\n }\n\n for ( var i = 0, length = orderParamFileIdStack.length; i < length; ++i )\n {\n formData = new FormData();\n fileData = orderParamUploadFiles[orderParamFileIdStack[i]];\n formData.append( \"0\", fileData[0], fileData[0].name );\n\n params.data = formData;\n\n API.post( \"/rest/checkout/orderparamfile/\", params );\n }\n\n var match = $input[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n\n return addOrderParamValue( articleWithParams, match[1], match[2], orderParamUploadFiles[key][0]['name'] );\n }\n\n /**\n * Inject an OrderParam.\n * @function addOrderParamValue\n * @private\n * @param {Array} basketList The target to inject the value in.\n * @param {number} position Position where to inject the value\n * @param {number} paramId The ID of the OrderParam to inject\n * @param {string|number} paramValue the value of the OrderParam to inject\n * @returns {Array} Containing the item and the injected OrderParam\n */\n function addOrderParamValue( basketList, position, paramId, paramValue )\n {\n if ( position > 0 && basketList[position] == undefined )\n {\n basketList[position] = $.extend( true, {}, basketList[0] );\n basketList[position].BasketItemOrderParamsList = [];\n }\n\n if ( basketList[position] != undefined )\n {\n basketList[position].BasketItemQuantity = 1;\n if ( basketList[position].BasketItemOrderParamsList == undefined )\n {\n basketList[position].BasketItemOrderParamsList = [];\n }\n if ( paramValue )\n {\n basketList[position].BasketItemOrderParamsList.push( {\n BasketItemOrderParamID : paramId,\n BasketItemOrderParamValue: paramValue\n } );\n }\n }\n\n return basketList;\n }\n\n function editItemAttributes( BasketItemID )\n {\n var modal = $( '[data-plenty-basket-item=\"' + BasketItemID + '\"]' );\n modal.modal( 'show' );\n modal.find( '[data-plenty-modal=\"confirm\"]' ).on( 'click', function()\n {\n var basketItem = getBasketItem( BasketItemID );\n var attributesList = [];\n\n // check for select or list of images\n modal.find( 'select, .PlentyFormContainer.AttrImage > input[type=\"hidden\"]' ).each( function( i, attributeSelect )\n {\n var match = attributeSelect.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( attributeSelect ).val()\n } );\n }\n\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItem.BasketItemAttributesList = attributesList;\n }\n //update basketItem and refresh previewLists\n updateArticle( [basketItem] );\n\n } );\n }\n\n function editOrderParams( BasketItemID )\n {\n\n var basketItem = getBasketItem( BasketItemID );\n // FIX: unset old order params\n\n basketItem.BasketItemOrderParamsList = [];\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/', {\n itemID : basketItem.BasketItemItemID,\n quantity : basketItem.BasketItemQuantity,\n basketItemID: BasketItemID\n } ).done( function( resp )\n {\n // checking for order params!\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Edit order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n updateArticle( saveOrderParams( [basketItem] ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n } );\n }\n\n function getBasketItem( BasketItemID )\n {\n var basketItems = Checkout.getCheckout().BasketItemsList;\n for ( var i = 0; i < basketItems.length; i++ )\n {\n if ( basketItems[i].BasketItemID == BasketItemID )\n {\n return basketItems[i];\n }\n }\n\n return null;\n }\n\n /**\n * Remove item from basket. Will show a confirmation popup at first.\n * @function removeBasketItem\n * @param {number} BasketItemID The ID of the basket item to remove\n * @param {boolean} [forceDelete=false] Set true to remove the basket item without showing a confirmation popup\n * @return Promise\n */\n function removeBasketItem( BasketItemID, forceDelete )\n {\n\n var deferred = $.Deferred();\n\n // get item name\n var itemName = getBasketItem( BasketItemID ).BasketItemNameMap[1];\n\n // calling the delete request\n function doDelete()\n {\n API.delete( '/rest/checkout/basketitemslist/?basketItemIdsList[0]=' + BasketItemID )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n //$( '[data-basket-item-id=\"' + BasketItemID + '\"]' ).remove();\n\n if ( !Checkout.getCheckout().BasketItemsList || Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n }\n else\n {\n // FALLBACK if design not support selector\n // [data-plenty-checkout-template=\"BasketItemsList\"]\n if ( $( '[data-plenty-checkout-template=\"BasketItemsList\"]' ).length >= 0 )\n {\n API.get( \"/rest/checkout/container_checkoutbasketitemslist/\" ).done( function( response )\n {\n var $oldBasketList = $( '[data-basket-item-id]' ).parents( \"ul\" );\n var $basketListContainer = $oldBasketList.parents( \".panel-body\" );\n $oldBasketList.fadeOut( function()\n {\n $( this ).siblings( \":not('[data-plenty-checkout-template]')\" ).remove();\n $( this ).remove();\n $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn( function()\n {\n pm.getInstance().bindDirectives( $basketListContainer );\n } );\n } );\n } );\n }\n else\n {\n Checkout.reloadContainer( 'BasketItemsList' );\n }\n Checkout.reloadContainer( 'Totals' );\n }\n\n refreshBasketPreview();\n\n deferred.resolve();\n } );\n } );\n }\n\n if ( !forceDelete )\n {\n // show confirmation popup\n Modal.prepare()\n .setTitle( pm.translate( 'Please confirm' ) )\n .setContent( '

    ' + pm.translate( \"Do you really want to remove \\\"{{item}}\\\" from your basket?\", {item: itemName} ) + '

    ' )\n .onDismiss( function()\n {\n //$('[data-basket-item-id=\"' + BasketItemID +\n // '\"]').find('[data-plenty=\"quantityInput\"]').val(originalItemQuantity);\n deferred.reject();\n } )\n .onConfirm( function()\n {\n doDelete();\n } )\n .setLabelConfirm( pm.translate( \"Delete\" ) )\n .show();\n }\n else\n {\n doDelete();\n }\n\n return deferred;\n }\n\n /**\n * Set a new quantity for the given BasketItem. If quantity is set to 0,\n * remove the item.\n * @function setItemQuantity\n * @param {number} BasketItemID The ID of the basket item to change the quantity of\n * @param {number} BasketItemQuantity The new quantity to set or 0 to remove the item\n */\n function setItemQuantity( BasketItemID, BasketItemQuantity )\n {\n // delete item if quantity is 0\n if ( BasketItemQuantity <= 0 )\n {\n return removeBasketItem( BasketItemID );\n }\n\n var deferred = $.Deferred();\n var params = Checkout.getCheckout().BasketItemsList;\n var basketItem;\n var basketItemIndex;\n\n for ( var i = 0; i < params.length; i++ )\n {\n if ( params[i].BasketItemID == BasketItemID )\n {\n basketItemIndex = i;\n basketItem = params[i];\n break;\n\n }\n }\n\n if ( !!basketItem && basketItem.BasketItemQuantity != BasketItemQuantity )\n {\n params[basketItemIndex].BasketItemQuantity = parseInt( BasketItemQuantity );\n\n API.post( \"/rest/checkout/basketitemslist/\", params )\n .done( function()\n {\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n refreshBasketPreview();\n deferred.resolve();\n } );\n } );\n }\n\n return deferred;\n }\n\n /**\n * Reload BasketPreview-Template and update basket totals\n * @function refreshBasketPreview\n * @private\n */\n function refreshBasketPreview()\n {\n\n Checkout.reloadItemContainer( 'BasketPreviewList' )\n .done( function()\n {\n\n $( '[data-plenty-basket-empty]' ).each( function( i, elem )\n {\n var toggleClass = $( elem ).attr( 'data-plenty-basket-empty' );\n if ( Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n $( elem ).addClass( toggleClass );\n }\n else\n {\n $( elem ).removeClass( toggleClass );\n }\n } );\n\n } );\n\n //update quantity\n var itemQuantityTotal = 0;\n $.each( Checkout.getCheckout().BasketItemsList, function( i, basketItem )\n {\n itemQuantityTotal += basketItem.BasketItemQuantity;\n } );\n\n $( '[data-plenty-basket-preview=\"itemQuantityTotal\"]' ).text( itemQuantityTotal );\n $( '[data-plenty-basket-preview=\"totalsItemSum\"]' ).text( Checkout.getCheckout().Totals.TotalsItemSum );\n }\n\n /**\n * Read the coupon code from an <input> element marked with data-plenty-checkout-form=\"couponCode\"\n * and try to add this coupon.\n * @function addCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function addCoupon()\n {\n var params = {\n CouponActiveCouponCode: $( '[data-plenty-checkout-form=\"couponCode\"]' ).val()\n };\n\n return API.post( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n\n updateContainer();\n } );\n } );\n }\n\n /**\n * Remove the currently added coupon\n * @function removeCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function removeCoupon()\n {\n var params = {\n CouponActiveCouponCode: Checkout.getCheckout().Coupon.CouponActiveCouponCode\n };\n\n return API.delete( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n delete Checkout.getCheckout().Coupon;\n\n updateContainer();\n } );\n } );\n }\n\n // update container\n function updateContainer()\n {\n Checkout.reloadContainer( 'Coupon' );\n // reload totals, if we are at basket\n if ( $( '[data-plenty-checkout-template=\"Totals\"]' ).length > 0 )\n {\n Checkout.reloadContainer( 'Totals' );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for checkout process like setting shipping & payment information and placing the order.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutService\n * @static\n */\n pm.service( 'CheckoutService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n init : init,\n setCustomerSignAndInfo: setCustomerSignAndInfo,\n registerGuest : registerGuest,\n setShippingProfile : setShippingProfile,\n saveShippingAddress : saveShippingAddress,\n loadAddressSuggestion : loadAddressSuggestion,\n preparePayment : preparePayment,\n setMethodOfPayment : setMethodOfPayment,\n confirmAtrigaPaymax : confirmAtrigaPaymax,\n editBankDetails : editBankDetails,\n editCreditCard : editCreditCard,\n placeOrder : placeOrder\n };\n\n /**\n * Load checkout data initially on page load\n * @function init\n */\n function init()\n {\n Checkout.loadCheckout( true );\n }\n\n /**\n * Read customer sign and order information text from <form> marked with\n * data-plenty-checkout-form=\"details\" and update checkout.\n * @function setCustomerSignAndInfo\n * @return {object} jQuery deferred\n * Object\n */\n function setCustomerSignAndInfo()\n {\n var form = $( '[data-plenty-checkout-form=\"details\"]' );\n var values = form.getFormValues();\n\n // initialize CustomerSign & InfoText to avoid updating empty values\n if ( !Checkout.getCheckout().CheckoutCustomerSign )\n {\n Checkout.getCheckout().CheckoutCustomerSign = \"\";\n }\n if ( !Checkout.getCheckout().CheckoutOrderInfoText )\n {\n Checkout.getCheckout().CheckoutOrderInfoText = \"\";\n }\n\n if ( ( Checkout.getCheckout().CheckoutCustomerSign !== values.CustomerSign && $( form ).find( '[name=\"CustomerSign\"]' ).length > 0 )\n || ( Checkout.getCheckout().CheckoutOrderInfoText !== values.OrderInfoText && $( form ).find( '[name=\"OrderInfoText\"]' ).length > 0 ) )\n {\n\n Checkout.getCheckout().CheckoutCustomerSign = values.CustomerSign;\n Checkout.getCheckout().CheckoutOrderInfoText = values.OrderInfoText;\n\n return Checkout.setCheckout();\n\n }\n else\n {\n // No changes detected -> Do nothing\n return API.idle();\n }\n }\n\n /**\n * Read address data from <form> marked with data-plenty-checkout-form=\"shippingAddress\".\n * Create new shipping address or update the shipping address ID.\n * @function saveShippingAddress\n * @param {boolean} [validateForm = false] validate form before processing requests\n * @return {object} jQuery deferred\n * Object\n */\n function saveShippingAddress( validateForm )\n {\n var form = $( '[data-plenty-checkout-form=\"shippingAddress\"]' );\n\n if ( !validateForm && !form.validateForm() )\n {\n return false;\n }\n\n if ( !validateForm && !pm.getInstance().AddressDoctorService.validateAddress( form ) )\n {\n return false;\n }\n\n var values = form.getFormValues();\n var shippingAddressID = $( '[name=\"shippingAddressID\"]:checked' ).val();\n\n if ( shippingAddressID < 0 )\n {\n // save separate\n var shippingAddress = values;\n\n if ( !addressesAreEqual( shippingAddress, Checkout.getCheckout().CustomerShippingAddress ) )\n {\n if ( shippingAddress.Street == \"PACKSTATION\" )\n {\n shippingAddress.IsPackstation = 1;\n shippingAddress.PackstationNo = shippingAddress.HouseNo;\n }\n else if ( shippingAddress.Street == \"POSTFILIALE\" )\n {\n shippingAddress.IsPostfiliale = 1;\n shippingAddress.PostfilialNo = shippingAddress.HouseNo;\n }\n\n // new shipping address\n return API.post( \"/rest/checkout/customershippingaddress/\", shippingAddress )\n .done( function( response )\n {\n\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = response.data.ID;\n Checkout.getCheckout().CheckoutShippingCountryID = response.data.CountryID;\n\n updatePaymentAndShippingDependencies();\n } );\n }\n else\n {\n // no changes detected\n return API.idle();\n }\n\n }\n else\n {\n if ( shippingAddressID != Checkout.getCheckout().CheckoutCustomerShippingAddressID )\n {\n // change shipping address id\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = shippingAddressID;\n\n updatePaymentAndShippingDependencies();\n }\n else\n {\n return API.idle();\n }\n }\n }\n\n function updatePaymentAndShippingDependencies()\n {\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n $( '#shippingAdressSelect' ).modal( 'hide' );\n\n // don't hit me. Ugly hack: this is to force quit/remove everything from modal.\n if ( $( \".modal-backdrop\" ) )\n {\n $( \".modal-backdrop\" ).remove();\n }\n } );\n }\n\n /**\n * Prepare address-data to register a guest. Reads the address-data from a <form> marked with\n * data-plenty-checkout-form=\"guestRegistration\"\n * @function registerGuest\n * @return {object} jQuery deferred\n * Object\n */\n function registerGuest()\n {\n var form = $( '[data-plenty-checkout-form=\"guestRegistration\"]' );\n\n var invoiceAddress = form.getFormValues();\n invoiceAddress.LoginType = 1;\n\n // add custom properties if necessary.\n if ( invoiceAddress.checkout\n && invoiceAddress.checkout.customerInvoiceAddress\n && invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty;\n invoiceAddress.CustomerPropertiesList = invoiceAddress.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n invoiceAddress.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n if ( !addressesAreEqual( invoiceAddress, Checkout.getCheckout().CustomerInvoiceAddress ) )\n {\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n saveShippingAddress().done( Checkout.loadCheckout );\n } );\n }\n else\n {\n return saveShippingAddress();\n }\n }\n\n /**\n * Check if values of addresses are equal\n * @function addressesAreEqual\n * @private\n * @param {object} address1\n * @param {object} address2\n * @returns {boolean}\n */\n function addressesAreEqual( address1, address2 )\n {\n for ( var key in address1 )\n {\n if ( address1[key] + '' !== address2[key] + '' && key !== 'EmailRepeat' )\n {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Set the shipping profile used for this order and update checkout. Selected shipping profile will be\n * read from <form> marked with data-plenty-checkout-form=\"shippingProfileSelect\"\n * @function setShippingProfile\n * @return {object} jQuery deferred\n * Object\n */\n function setShippingProfile()\n {\n\n var values = $( '[data-plenty-checkout-form=\"shippingProfileSelect\"]' ).getFormValues();\n\n Checkout.getCheckout().CheckoutShippingProfileID = values.ShippingProfileID;\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n\n }\n\n /**\n * Prepare method of payment to check if external checkout is used or addition content should be displayed\n * @function preparePayment\n * @return {object} jQuery deferred\n * Object\n */\n function preparePayment()\n {\n var paymentID = Checkout.getCheckout().CheckoutMethodOfPaymentID;\n var paymentData = $( 'input[type=\"radio\"][name=\"MethodOfPaymentID\"][value=\"' + paymentID + '\"]' ).parent().getFormValues();\n return API.post( \"/rest/checkout/preparepayment/\", paymentData, true )\n .done( function( response )\n {\n if ( response.data.CheckoutMethodOfPaymentRedirectURL != '' )\n {\n\n document.location.assign( response.data.CheckoutMethodOfPaymentRedirectURL );\n\n }\n else if ( !!response.data.CheckoutMethodOfPaymentAdditionalContent )\n {\n\n var isBankDetails = $( response.data.CheckoutMethodOfPaymentAdditionalContent ).find( '[data-plenty-checkout-form=\"bankDetails\"]' ).length > 0;\n Modal.prepare()\n .setContent( response.data.CheckoutMethodOfPaymentAdditionalContent )\n .onConfirm( function()\n {\n if ( isBankDetails )\n {\n return saveBankDetails();\n }\n else\n {\n return saveCreditCard();\n }\n } )\n .show();\n }\n } )\n .fail( function( jqXHR )\n {\n try\n {\n var response = $.parseJSON( jqXHR.responseText );\n\n var errorStack = [];\n for ( var i = 0; i < response.error.error_stack.length; i++ )\n {\n if ( response.error.error_stack[i].code == 651 )\n {\n // notify atriga validation errors\n Checkout.reloadContainer( 'MethodsOfPaymentList' ).done( function()\n {\n $( document ).trigger( 'plenty.AtrigaValidationFailed' );\n } );\n }\n else\n {\n errorStack.push( response.error.error_stack[i] );\n }\n }\n\n // display remaining errors\n if ( errorStack.length > 0 )\n {\n UI.printErrors( errorStack );\n }\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n } );\n\n }\n\n /**\n * Set the method of payment used for this order.\n * @function setMethodOfPayment\n * @param {number|undefined} paymentID ID of the method of payment to use. Read from <form> marked with\n * data-plenty-checkout-form=\"methodOfPayment\" if unset.\n * @return {object} jQuery deferred\n * Object\n */\n function setMethodOfPayment( paymentID )\n {\n /*\n var methodsOfPaymentList = Checkout.getCheckout().MethodsOfPaymentList;\n var methodOfPayment;\n for( var i = 0; i < methodsOfPaymentList.length; i++ )\n {\n if( methodsOfPaymentList[i].MethodOfPaymentID == paymentID )\n {\n methodOfPayment = methodsOfPaymentList[i];\n break;\n }\n }\n */\n\n if ( !paymentID )\n {\n // FIX for older callisto layouts (< 3.3): get payment id from input field\n paymentID = $( 'input[name=\"MethodOfPaymentID\"]:checked' ).val();\n }\n\n Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID;\n\n if ( !pm.getGlobal( 'Checkout.AtrigaRequireUserConfirmation' ) )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = true;\n }\n\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'ShippingProfilesList' );\n } );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxChecked )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = !!atrigaPaymaxChecked;\n return API.put( '/rest/checkout', {\n CheckoutAtrigapaymaxChecked: !!atrigaPaymaxChecked\n } );\n //return Checkout.setCheckout();\n }\n\n /**\n * Display the popup to enter or edit customers bank details\n * @function editBankDetails\n */\n function editBankDetails()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationBankDetails' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveBankDetails();\n } )\n .show();\n } );\n\n }\n\n /**\n * Read entered bank details from data-plenty-checkout-form=\"bankDetails\" and update checkout.\n * @function saveBankDetails\n * @private\n * @return {boolean} the result of form validation\n */\n function saveBankDetails()\n {\n var form = $( '[data-plenty-checkout-form=\"bankDetails\"]' );\n\n if ( form.validateForm() )\n {\n var values = form.getFormValues().checkout.customerBankDetails;\n\n var bankDetails = {\n CustomerBankName : values.bankName,\n CustomerBLZ : values.blz,\n CustomerAccountNumber: values.accountNo,\n CustomerAccountOwner : values.accountOwner,\n CustomerIBAN : values.iban,\n CustomerBIC : values.bic\n };\n\n API.post( \"/rest/checkout/paymentinformationbankdetails/\", bankDetails )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n setMethodOfPayment( 3 );\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing credit card form\n * @function editCreditCard\n */\n function editCreditCard()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationCreditCard' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveCreditCard();\n } )\n .show();\n } );\n }\n\n /**\n * Read values from <form> marked with data-plenty-checkout-form=\"creditCard\" and update checkout.\n * @function saveCreditCard\n * @private\n * @return {boolean} the result of form validation\n */\n function saveCreditCard()\n {\n var form = $( '[data-plenty-checkout-form=\"creditCard\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues().checkout.paymentInformationCC;\n\n var creditCard = {\n Owner : values.owner,\n Cvv2 : values.cvv2,\n Number : values.number,\n Year : values.year,\n Month : values.month,\n Provider: values.provider\n };\n\n API.post( '/rest/checkout/paymentinformationcreditcard/', creditCard )\n .done( function()\n {\n Checkout.loadCheckout();\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing address suggestions\n * @param {string} type\n */\n function loadAddressSuggestion( type )\n {\n\n //check login type\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n var values = $( '[data-plenty-checkout-form=\"shippingAddress\"]' ).getFormValues();\n }\n else\n {\n var values = $( '[data-plenty-checkout-form=\"guestRegistration\"]' ).getFormValues();\n }\n\n var params = {\n street : values.Street,\n houseNo : values.HouseNo,\n ZIP : values.ZIP,\n city : values.City,\n postnummer : values.Postnummer,\n suggestionType: 'postfinder'\n };\n\n CMS.getContainer( 'CheckoutAddressSuggestionResultsList', params ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .show();\n } );\n }\n\n /**\n * Place the order prepared before and finish the checkout process.
    \n * Validate required checkboxes in data-plenty-checkout-form=\"placeOrder\"\n * @function placeOrder\n * @return {object} jQuery deferred\n * Object\n */\n function placeOrder()\n {\n var form = $( '[data-plenty-checkout-form=\"placeOrder\"]' );\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n // if not shown in layout set default 1 for mandatory fields\n var params = {\n TermsAndConditionsCheck : values.termsAndConditionsCheck || 0,\n WithdrawalCheck : values.withdrawalCheck || 0,\n PrivacyPolicyCheck : values.privacyPolicyCheck || 0,\n AgeRestrictionCheck : values.ageRestrictionCheck || 0,\n NewsletterCheck : values.newsletterCheck || 0,\n KlarnaTermsAndConditionsCheck: values.klarnaTermsAndConditionsCheck || 0,\n PayoneDirectDebitMandateCheck: values.payoneDirectDebitMandateCheck || 0,\n PayoneInvoiceCheck : values.payoneInvoiceCheck || 0\n };\n\n return API.post( \"/rest/checkout/placeorder/\", params )\n .done( function( response )\n {\n if ( response.data.MethodOfPaymentRedirectURL != '' )\n {\n\n window.location.assign( response.data.MethodOfPaymentRedirectURL );\n\n }\n else if ( response.data.MethodOfPaymentAdditionalContent != '' )\n {\n\n Modal.prepare()\n .setContent( response.data.MethodOfPaymentAdditionalContent )\n .setLabelDismiss( '' )\n .onDismiss( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).onConfirm( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).show();\n\n }\n else\n {\n\n window.location.assign( form.attr( 'action' ) );\n\n }\n } );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n pm.service( 'FeedbackService', function( API )\n {\n\n return {\n getFeedbacks : getFeedbacks,\n addFeedback : addFeedback,\n ArticleTypes : articleTypes(),\n FeedbackTypes: feedbackTypes()\n };\n\n /*\n FeedbackService\n .getFeedbacks().between('2014-12-03', '2015-07-01')\n .for( FeedbackService.ArticleTypes.ITEM, 2732, FeedbackService.FeedbackTypes.COMMENTS_ONLY );\n */\n function getFeedbacks()\n {\n var feedbackInterval = {\n dateStart: null,\n dateEnd : null\n };\n\n return {\n between: setFeedbackInterval,\n for : listFeedbacks\n };\n\n function setFeedbackInterval( start, end )\n {\n feedbackInterval.dateStart = start;\n feedbackInterval.dateEnd = end;\n return this;\n }\n\n function listFeedbacks( articleType, referenceId, feedbackType )\n {\n\n var params = {\n ReferenceId : referenceId,\n FromDate : feedbackInterval.dateStart,\n ToDate : feedbackInterval.dateEnd,\n FeedbackType: feedbackType || feedbackTypes().COMMENTS_AND_RATINGS\n };\n return API.get( '/rest/feedback/' + articleType + '/', params );\n\n }\n }\n\n /*\n FeedbackService\n .addFeedback()\n .withRating( 5 )\n .withComment( 'Hallo' )\n .withAuthor( 'Felix', 'felix.dausch@plentymarkets.com', 123456 )\n .to( FeedbackService.ArticleTypes.ITEM, 2732 );\n */\n function addFeedback()\n {\n\n var params = {\n Rating : 1.0,\n Text : '',\n Author : '',\n Email : '',\n CustomerId: 0\n };\n\n return {\n withRating : withRating,\n withComment: withComment,\n withAuthor : withAuthor,\n to : sendFeedback\n };\n\n function withRating( rating )\n {\n params.Rating = rating;\n return this;\n }\n\n function withComment( comment )\n {\n params.Text = comment;\n return this;\n }\n\n function withAuthor( author, mail, customerID )\n {\n params.Author = author;\n if ( !!mail )\n {\n params.Email = mail;\n }\n if ( !!customerID )\n {\n params.CustomerId = customerID;\n }\n return this;\n }\n\n function sendFeedback( articleType, referenceId )\n {\n return API.post( '/rest/feedback/' + articleType + '/', params );\n\n }\n\n }\n\n function feedbackTypes()\n {\n return {\n COMMENTS_ONLY : 'comments_only',\n RATINGS_ONLY : 'ratings_only',\n COMMENTS_AND_RATINGS: 'comments_with_ratings'\n }\n }\n\n function articleTypes()\n {\n return {\n ITEM : 'item',\n CATEGORY: 'category',\n BLOG : 'blog'\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Listens to window's size and trigger 'sizeChange' event if the Bootstrap interval changes.\n * @class MediaSizeService\n * @static\n * @example\n * $(window).on('sizeChange', function(newValue, oldValue) {\n * console.log('The interval changed from ' + oldValue + ' to ' + newValue.');\n * });\n */\n pm.service( 'MediaSizeService', function()\n {\n\n var bsInterval;\n\n // recalculation of the current interval on window resize\n $( window ).resize( calculateMediaSize );\n\n // initially calculation of the interval\n $( document ).ready( calculateMediaSize );\n\n return {\n interval : getInterval,\n isInterval: isInterval\n };\n\n /**\n * Get the currently used Bootstrap interval\n * @function getInterval\n * @return {\"xs\"|\"sm\"|\"md\"|\"lg\"}\n */\n function getInterval()\n {\n if ( !!bsInterval )\n {\n calculateMediaSize();\n }\n\n return bsInterval;\n }\n\n /**\n * Calculate the currently used Bootstrap interval\n * @function calculateMediaSize\n * @private\n */\n function calculateMediaSize()\n {\n var size;\n if ( !!window.matchMedia )\n { // FIX IE support\n if ( window.matchMedia( '(min-width:1200px)' ).matches )\n {\n size = 'lg';\n }\n else if ( window.matchMedia( '(min-width:992px)' ).matches )\n {\n size = 'md';\n }\n else if ( window.matchMedia( '(min-width:768px)' ).matches )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n else\n {\n if ( $( window ).width() >= 1200 )\n {\n size = 'lg';\n }\n else if ( $( window ).width() >= 992 )\n {\n size = 'md';\n }\n else if ( $( window ).width() >= 768 )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n if ( size != bsInterval || size === 'xs' )\n {\n var oldValue = bsInterval;\n bsInterval = size;\n $( window ).trigger( 'sizeChange', [bsInterval, oldValue] );\n }\n }\n\n function isInterval( interval )\n {\n var intervalList = interval.replace( /\\s/g, '' ).split( ',' );\n for ( var i = 0; i < intervalList.length; i++ )\n {\n if ( intervalList[i] == bsInterval )\n {\n return true;\n }\n }\n return false;\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Handling navigation while checkout processes\n * @class NavigatorService\n * @static\n *\n */\n pm.service( 'NavigatorService', function( CMS, Checkout )\n {\n var navigation = [];\t\t// contains navigation list elements\n var container = [];\t\t// content containers\n var current = -1;\t\t// index of currently shown content container\n var buttonPrev = {};\t\t// navigation buttons\n var buttonNext = {};\n var interceptors = {\n beforeChange: [],\n afterChange : []\n };\n var checkoutStates = [];\n\n return {\n init : init,\n getCurrentContainer: getCurrentContainer,\n goTo : goTo,\n beforeChange : beforeChange,\n afterChange : afterChange,\n continueChange : continueChange,\n next : next,\n previous : previous,\n goToID : goToID,\n fillNavigation : fillNavigation\n };\n\n /**\n * Initialize checkout navigation. Shows first container.\n * @function init\n * @example\n * ```html\n * \n *
      \n *
    • Checkout Step 1
    • \n *
    • Checkout Step 2
    • \n *
    • ...
    • \n *
    \n * \n *\n *
    \n *
    \n * Checkout Step 1 Content\n *
    \n *
    \n * Checkout Step 2 Content\n *
    \n *
    ...
    \n *
    \n * ```\n */\n function init()\n {\n\n // get elements from DOM\n navigation = $( '[data-plenty-checkout=\"navigation\"] > li' );\n container = $( '[data-plenty-checkout=\"container\"] > div' );\n buttonNext = $( '[data-plenty-checkout=\"next\"]' );\n buttonPrev = $( '[data-plenty-checkout=\"prev\"]' );\n\n if ( navigation.length == container.length && container.length > 0 )\n {\n var checkout = Checkout.getCheckout();\n\n container.hide();\n\n // initialize navigation\n navigation.each( function( i, elem )\n {\n $( elem ).addClass( 'disabled' );\n // handle navigation click events\n $( elem ).click( function()\n {\n if ( !$( this ).is( '.disabled' ) )\n {\n goTo( i );\n }\n } );\n } );\n\n buttonNext.attr( \"disabled\", \"disabled\" );\n buttonNext.click( function()\n {\n next();\n } );\n\n buttonPrev.attr( \"disabled\", \"disabled\" );\n buttonPrev.click( function()\n {\n previous();\n } );\n\n window.addEventListener( 'hashchange', function()\n {\n if ( window.location.hash.length > 0 )\n {\n goToID( window.location.hash );\n }\n else\n {\n goTo( 0 );\n }\n }, false );\n\n // initialize GUI\n // check url param for jumping to tab\n $.urlParam = function( name )\n {\n var results = new RegExp( '[\\?&]' + name + '=([^&#]*)' ).exec( window.location.href );\n if ( results == null )\n {\n return null;\n }\n else\n {\n return results[1] || 0;\n }\n };\n\n var param = $.urlParam( 'gototab' );\n // jump to hash from url param 'gototab'\n if ( window.location.hash.length == 0 && !!param && $( '[data-plenty-checkout-id=\"' + param + '\"]' ).length > 0 )\n {\n window.location.hash = param;\n }\n // jump to hash\n else if ( !goToID( window.location.hash ) && current >= 0 )\n {\n goTo( current );\n }\n else\n {\n goTo( 0 );\n }\n\n fillNavigation();\n $( window ).on( 'sizeChange', fillNavigation );\n $( window ).resize( function()\n {\n if ( pm.getInstance().MediaSizeService.interval() == 'xs' )\n {\n fillNavigation();\n }\n } );\n\n }\n }\n\n /**\n * Get the currently active checkout container.\n * @function getCurrentContainer\n * @return {{id: string, index: number}}\n */\n function getCurrentContainer()\n {\n if ( current >= 0 )\n {\n return {\n id : $( container[current] ).attr( 'data-plenty-checkout-id' ),\n index: current\n };\n }\n else\n {\n return null;\n }\n }\n\n /**\n * Register an interceptor called before each tab change.\n * Tabchange will break if any interceptor returns false.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n * @example\n * plenty.NavigatorService.beforeChange( function(targetContainer) {\n * if( targetContainer.id === 'details' ) {\n * // stop tabchange if user tries to access checkout container with id \"details\"\n * return false;\n * }\n * return true;\n * });\n */\n function beforeChange( interceptor )\n {\n interceptors.beforeChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Register an interceptor called after each tab change.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n */\n function afterChange( interceptor )\n {\n interceptors.afterChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Call registered interceptors. Break if any interceptor returns false.\n * Do not call beforeChange-interceptors on initially tabchange\n * @function resolveInterceptors\n * @private\n * @param {\"beforeChange\"|\"afterChange\"} identifier Describe which interceptors should be called\n * @param {number} index the index of the target container\n * @returns {boolean} Conjunction of all interceptor return values\n */\n function resolveInterceptors( identifier, index )\n {\n var continueTabChange = true;\n\n if ( current >= 0 || identifier === 'afterChange' )\n {\n\n var currentContainer = getCurrentContainer();\n var targetContainer = {\n index: index,\n id : $( container[index] ).attr( 'data-plenty-checkout-id' )\n };\n\n $.each( interceptors[identifier], function( i, interceptor )\n {\n if ( interceptor( currentContainer, targetContainer ) === false )\n {\n continueTabChange = false;\n return false;\n }\n } );\n }\n\n return continueTabChange;\n }\n\n /**\n * Show checkout tab given by index\n * @function goTo\n * @param {number} index Index of target tab, starting at 0\n * @param {boolean} [ignoreInterceptors=false] Set true to not call registered interceptors and force changing\n * tab\n */\n function goTo( index, ignoreInterceptors )\n {\n\n var contentChanged = current !== index;\n\n if ( contentChanged && !ignoreInterceptors )\n {\n if ( !resolveInterceptors( \"beforeChange\", index ) )\n {\n return;\n }\n }\n\n current = index;\n\n if ( !Object.equals( checkoutStates[current], Checkout.getCheckout( true ) ) && contentChanged && !!$( container[current] ).attr( 'data-plenty-checkout-content' ) )\n {\n checkoutStates[current] = Checkout.getCheckout( true );\n // reload tab content\n CMS.getCategoryContent( $( container[current] ).attr( 'data-plenty-checkout-content' ) )\n .done( function( response )\n {\n $( container[current] ).html( response.data[0] );\n // continue tab change\n proceedTabChange( contentChanged );\n pm.getInstance().bindDirectives( container[current] );\n $( window ).trigger( 'contentChanged' );\n } );\n }\n else\n {\n // continue tab change without reloading tab content\n proceedTabChange( contentChanged );\n //pm.getInstance().bindDirectives();\n }\n\n }\n\n function proceedTabChange( contentChanged )\n {\n\n // hide content containers\n $( container ).hide();\n\n // refresh navigation elements\n var $elem;\n $( navigation ).each( function( i, elem )\n {\n $elem = $( elem );\n $elem.removeClass( 'disabled active' );\n\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'false' );\n\n if ( i < current )\n {\n // set current element as active\n $elem.addClass( 'visited' );\n }\n else\n {\n if ( i == current )\n {\n $elem.addClass( 'active visited' );\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'true' );\n }\n else\n {\n if ( i > current && !$elem.is( '.visited' ) )\n {\n // disable elements behind active\n $elem.addClass( 'disabled' );\n }\n }\n }\n } );\n fillNavigation();\n\n // hide \"previous\"-button if first content container is shown\n if ( current <= 0 )\n {\n buttonPrev.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonPrev.removeAttr( \"disabled\" );\n }\n\n // hide \"next\"-button if last content container is shown\n if ( current + 1 == navigation.length )\n {\n buttonNext.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonNext.removeAttr( \"disabled\" );\n }\n\n // show current content container\n $( container[current] ).show();\n\n // set location hash\n if ( current > 0 )\n {\n window.location.hash = $( container[current] ).attr( 'data-plenty-checkout-id' );\n }\n else\n {\n if ( window.location.hash.length > 0 )\n {\n window.location.hash = '';\n }\n }\n\n if ( contentChanged )\n {\n resolveInterceptors( \"afterChange\", current );\n }\n }\n\n /**\n * Continue interrupted tabchange. Shorthand for: goTo(targetContainer.index, true)\n * @function continueChange\n * @param targetContainer The tab-object received from an interceptor\n */\n function continueChange( targetContainer )\n {\n goTo( targetContainer.index, true );\n }\n\n /**\n * Show next checkout tab if available. Shorthand for\n * \n * if (current < navigation.length - 1) {\n * goTo(current + 1);\n * }\n * \n * @function next\n */\n function next()\n {\n if ( current < navigation.length - 1 )\n {\n goTo( current + 1 );\n }\n }\n\n /**\n * Show previous checkout tab if available\n * @function next\n */\n function previous()\n {\n if ( current > 0 )\n {\n goTo( current - 1 );\n }\n }\n\n /**\n * Show checkout tab given by ID\n * @function goToID\n * @param {string} containerID ID of tab to show. Target tab must be marked with\n * data-plenty-checkout-id=\"#...\"\n */\n function goToID( containerID )\n {\n if ( containerID == 'next' )\n {\n next();\n return true;\n }\n else if ( containerID == 'prev' )\n {\n previous();\n return true;\n }\n else\n {\n containerID = containerID.replace( '#', '' );\n $( container ).each( function( i, elem )\n {\n if ( $( elem ).attr( 'data-plenty-checkout-id' ) == containerID )\n {\n goTo( i );\n return true;\n }\n } );\n }\n\n return false;\n }\n\n /**\n * Calculate navigation's width to match its parent element\n * by increasing its items padding.\n * @function fillNavigation\n */\n function fillNavigation()\n {\n // break if manager has not been initialized\n var navigationCount = navigation.length;\n if ( navigationCount <= 0 )\n {\n return;\n }\n\n // reset inline styles\n $( navigation ).removeAttr( 'style' );\n $( navigation ).children( 'span' ).removeAttr( 'style' );\n $( buttonNext ).removeAttr( 'style' );\n $( buttonPrev ).removeAttr( 'style' );\n\n var buttonWidth = ($( buttonPrev ).outerWidth() < $( buttonNext ).outerWidth()) ? $( buttonNext ).outerWidth( true ) + 1 : $( buttonPrev ).outerWidth( true ) + 1;\n $( buttonNext ).css( {width: buttonWidth + 'px'} );\n $( buttonPrev ).css( {width: buttonWidth + 'px'} );\n\n // calculate width to fill\n var width = $( navigation ).parent().parent().outerWidth( true ) - ( 2 * buttonWidth);\n width -= parseInt( $( navigation ).parent().css( 'marginLeft' ) ) + parseInt( $( navigation ).parent().css( 'marginRight' ) );\n\n var padding = width;\n var tabWidth = [];\n\n $( navigation ).each( function( i, elem )\n {\n padding -= parseInt( $( elem ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).css( 'marginRight' ) );\n\n tabWidth[i] = $( elem ).children( 'span' ).width();\n padding -= tabWidth[i];\n\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginRight' ) );\n } );\n\n var paddingEachItem = parseInt( padding / navigationCount );\n\n var paddingLeft, paddingRight;\n if ( paddingEachItem % 2 == 1 )\n {\n paddingLeft = ( paddingEachItem / 2 ) + 0.5;\n paddingRight = ( paddingEachItem / 2 ) - 0.5;\n }\n else\n {\n paddingLeft = paddingEachItem / 2;\n paddingRight = paddingEachItem / 2;\n }\n\n var paddingLastItem = parseInt( padding - ( ( navigationCount - 1 ) * ( paddingLeft + paddingRight ) ) );\n var paddingLastLeft, paddingLastRight;\n if ( paddingLastItem % 2 == 1 )\n {\n paddingLastLeft = ( paddingLastItem / 2 ) + 0.5;\n paddingLastRight = ( paddingLastItem / 2) - 0.5;\n }\n else\n {\n paddingLastLeft = paddingLastItem / 2;\n paddingLastRight = paddingLastItem / 2;\n }\n\n var diff = width;\n $( navigation ).each( function( i, elem )\n {\n if ( i < navigationCount - 1 )\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLeft + 'px', 'paddingRight': paddingRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLeft + paddingRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n else\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLastLeft + 'px', 'paddingRight': paddingLastRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLastLeft + paddingLastRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n } );\n\n //$(navigation).parent().css('marginRight', 0);\n }\n\n }, ['CMSFactory', 'CheckoutFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Magnus Martin \n * =====================================================================================\n */\n\n\n(function( $, pm )\n{\n pm.service( 'PostfinderService', function( API, Modal, UIFactory )\n {\n var packstationID = '';\n var shippingFields = {};\n var numberOfResults = {};\n var result = {};\n\n return {\n openPostfinderModal: openPostfinderModal,\n isPackstation : isPackstation\n };\n\n function isPackstation()\n {\n var street = $( 'input[name=\"Street\"]' ).val();\n return ( street.toUpperCase() == \"PACKSTATION\" || street.toUpperCase() == \"POSTFILIALE\" );\n }\n\n function openPostfinderModal()\n {\n shippingFields = {\n PostfinderItemStreet : $( 'input[name=\"Street\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemZIP : $( 'input[name=\"ZIP\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemCity : $( 'input[name=\"City\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemHouseNo: $( 'input[name=\"HouseNo\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' )\n\n };\n\n shippingFields.PostfinderItemStreet.val( '' );\n\n if ( (shippingFields.PostfinderItemZIP.val().length > 2 || shippingFields.PostfinderItemCity.val().length > 2) )\n {\n\n API.get( '/rest/checkout/shippingaddresspostfinderlist/',\n {\n suggestionType: \"postfinder\",\n zip : shippingFields.PostfinderItemZIP.val(),\n city : shippingFields.PostfinderItemCity.val()\n } )\n\n .done( function( response )\n {\n result = response.data;\n numberOfResults = result.length;\n\n if ( numberOfResults == 0 )\n {\n showErrorMessage();\n }\n\n var params = {\n addresses: []\n };\n\n for ( var i = 0; i < numberOfResults; i++ )\n {\n var dimension = 'km';\n var distInMeters = result[i].PostfinderItemDistance;\n var distInKilometers = distInMeters / 1000;\n distInKilometers = ((Math.round( distInKilometers * 100 ) / 100).toFixed( 2 )).replace( '.', ',' );\n\n if ( distInMeters < 1000 )\n {\n distInKilometers = distInMeters;\n dimension = 'm';\n }\n\n params.addresses.push( {\n index : i,\n dimension: dimension,\n type : result[i].PostfinderItemIsPackstation ? 'Packstation' : 'Postfiliale',\n number : result[i].PostfinderItemIsPackstation ? result[i].PostfinderItemPackstationNo : result[i].PostfinderItemPostfilialNo,\n street : result[i].PostfinderItemStreet,\n houseNo : result[i].PostfinderItemHouseNo,\n zip : result[i].PostfinderItemZIP,\n city : result[i].PostfinderItemCity,\n district : result[i].PostfinderItemDistrict,\n distance : distInKilometers,\n remark : result[i].PostfinderItemRemark\n } );\n }\n\n var html = pm.compileTemplate( 'addressSuggestions/postFinder.html', params );\n\n Modal.prepare()\n .setTitle( pm.translate( 'Packstations and post offices in your area' ) )\n .setContent( html )\n .setClass( 'checkout' )\n .onConfirm( function()\n {\n shippingFields.PostfinderItemCity.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemStreet.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemStreet.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemHouseNo.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemHouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n packstationID = $( 'input[type=\"radio\"][name=\"postfinder\"]:checked' ).val();\n\n if ( result[packstationID].PostfinderItemIsPackstation )\n {\n $( shippingFields.PostfinderItemStreet ).val( 'PACKSTATION' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPackstationNo );\n }\n else\n {\n $( shippingFields.PostfinderItemStreet ).val( 'POSTFILIALE' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPostfilialNo );\n }\n $( shippingFields.PostfinderItemStreet ).trigger( 'change' );\n\n $( shippingFields.PostfinderItemCity ).val( result[packstationID].PostfinderItemCity );\n $( shippingFields.PostfinderItemZIP ).val( result[packstationID].PostfinderItemZIP );\n return true;\n } )\n .show()\n } );\n }\n else\n {\n showErrorMessage();\n }\n\n }\n\n function showErrorMessage()\n {\n UIFactory.throwError( 0, pm.translate( 'Please enter a ZIP code and/or a city.' ) );\n\n shippingFields.PostfinderItemCity.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemCity.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n\n shippingFields.PostfinderItemZIP.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n }\n }, ['APIFactory', 'ModalFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide templates for social share providers to inject them dynamically.\n * @class SocialShareService\n * @static\n */\n pm.service( 'SocialShareService', function()\n {\n\n //TODO: move to global variables\n if ( typeof(socialLangLocale) == 'undefined' )\n {\n socialLangLocale = 'en_US';\n }\n if ( typeof(socialLang) == 'undefined' )\n {\n socialLang = 'en';\n }\n\n return {\n getSocialService: getService\n };\n\n /**\n * Get the template for social media provider\n * @function getService\n * @param {string} identifier name of the social media provider to get the template for\n * @returns {string} the template to inject in DOM\n */\n function getService( identifier )\n {\n var services = {\n 'facebook-like': '',\n\n 'facebook-recommend': '',\n\n 'twitter': '',\n\n 'google-plus': '
    '\n + '',\n };\n\n return services[identifier];\n }\n\n /**\n * get the canonical URL if defined\n * @function getURL\n * @private\n * @return {string} The Canonical URL if defined or the current URI\n */\n function getURI()\n {\n var uri = document.location.href;\n var canonical = $( \"link[rel=canonical]\" ).attr( \"href\" );\n\n if ( canonical && canonical.length > 0 )\n {\n if ( canonical.indexOf( \"http\" ) < 0 )\n {\n canonical = document.location.protocol + \"//\" + document.location.host + canonical;\n }\n uri = canonical;\n }\n\n return uri;\n }\n\n /**\n * returns content of <meta name=\"\" content=\"\"> tags or '' if empty/non existant\n * @function getMeta\n * @private\n * @param {string} name The meta name to get the value of;\n */\n function getMeta( name )\n {\n var metaContent = $( 'meta[name=\"' + name + '\"]' ).attr( 'content' );\n return metaContent || '';\n }\n\n /**\n * create tweet text from content of <meta name=\"DC.title\"> and <meta name=\"DC.creator\">\n * fallback to content of <title> tag\n * @function getTweetText\n * @private\n */\n function getTweetText()\n {\n var title = getMeta( 'DC.title' );\n var creator = getMeta( 'DC.creator' );\n\n if ( title.length > 0 && creator.length > 0 )\n {\n title += ' - ' + creator;\n }\n else\n {\n title = $( 'title' ).text();\n }\n\n return encodeURIComponent( title );\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide methods for client-side form validation.\n * @class ValidationService\n * @static\n */\n pm.service( 'ValidationService', function()\n {\n\n return {\n validate: validate\n };\n\n /**\n * Check if element is a form element (input, select, textarea) or search for child form elements\n * @function getFormControl\n * @private\n * @param {object} element the element to get the form element from\n * @return {object} a valid form element (input, select, textarea)\n */\n function getFormControl( element )\n {\n element = $( element );\n if ( element.is( 'input' ) || element.is( 'select' ) || element.is( 'textarea' ) )\n {\n return element;\n }\n else\n {\n if ( element.find( 'input' ).length > 0 )\n {\n return element.find( 'input' );\n }\n\n else if ( element.find( 'select' ).length > 0 )\n {\n return element.find( 'select' );\n }\n\n else if ( element.find( 'textarea' ).length > 0 )\n {\n return element.find( 'textarea' );\n }\n\n else\n {\n return null;\n }\n }\n\n }\n\n /**\n * Check given element has any value\n * @function validateText\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateText( formControl )\n {\n // check if formControl is no checkbox or radio\n if ( formControl.is( 'input' ) || formControl.is( 'select' ) || formControl.is( 'textarea' ) )\n {\n // check if length of trimmed value is greater then zero\n return $.trim( formControl.val() ).length > 0;\n\n }\n else\n {\n console.error( 'Validation Error: Cannot validate Text for <' + formControl.prop( \"tagName\" ) + '>' );\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid email-address\n * @function validateMail\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateMail( formControl )\n {\n var mailRegExp = /[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n if ( validateText( formControl ) )\n {\n return mailRegExp.test( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid number\n * @function validateNumber\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateNumber( formControl )\n {\n if ( validateText( formControl ) )\n {\n return $.isNumeric( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is equal to a references value\n * @function validateValue\n * @private\n * @param {object} formControl the form element to validate\n * @param {string} reference the required value\n * @return {boolean}\n */\n function validateValue( formControl, reference )\n {\n if ( $( reference ).length > 0 )\n {\n return $.trim( formControl.val() ) == $.trim( $( reference ).val() );\n }\n else\n {\n return $.trim( formControl.val() ) == reference;\n }\n }\n\n function visibility( formControl )\n {\n return formControl.is( ':visible' );\n }\n\n function isEnabled( formControl )\n {\n return formControl.is( ':enabled' );\n }\n\n /**\n * Validate a form. Triggers event 'validationFailed' if any element has an invalid value\n * @function validate\n * @param {object} form The form element to validate\n * @returns {boolean}\n * @example\n * ```html\n * \n *
    \n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n *
    \n * \n * \n *
    \n *\n *
    \n * ```\n *\n * @example\n * $(form).on('validationFailed', function(missingFields) {\n * // handle missing fields\n * });\n */\n function validate( form, errorClass )\n {\n var formControl, formControls, validationKey, currentHasError, group, checked, checkedMin, checkedMax, attrValidate, validationKeys, formControlAttrType;\n var $form = $( form );\n errorClass = errorClass || 'has-error';\n var missingFields = [];\n var hasError = false;\n\n // check every required input inside form\n $form.find( '[data-plenty-validate], :required' ).each( function( i, elem )\n {\n attrValidate = $( elem ).attr( 'data-plenty-validate' );\n formControls = getFormControl( elem ); \n // validate text inputs\n validationKeys = !!attrValidate ? attrValidate : 'text';\n validationKeys = validationKeys.split( ',' );\n\n for ( var i = 0, length = formControls.length; i < length; i++ )\n {\n formControl = $( formControls[i] );\n formControlAttrType = formControl.attr( 'type' );\n\n if ( !visibility( formControl ) || !isEnabled( formControl ) )\n {\n return;\n }\n\n validationKey = validationKeys[i].trim() || validationKeys[0].trim();\n currentHasError = false;\n\n // formControl is textfield (text, mail, password) or textarea\n if ( (formControl.is( 'input' )\n && formControlAttrType != 'radio'\n && formControlAttrType != 'checkbox')\n || formControl.is( 'textarea' ) )\n {\n switch ( validationKey )\n {\n\n case 'text':\n currentHasError = !validateText( formControl );\n break;\n\n case 'mail':\n currentHasError = !validateMail( formControl );\n break;\n\n case 'number':\n currentHasError = !validateNumber( formControl );\n break;\n\n case 'value':\n currentHasError = !validateValue( formControl, $( elem ).attr( 'data-plenty-validation-value' ) );\n break;\n\n case 'none':\n // do not validate\n break;\n\n default:\n console.error( 'Form validation error: unknown validate property: \"' + attrValidate + '\"' );\n break;\n }\n }\n else if ( formControl.is( 'input' )\n && (formControlAttrType == 'radio'\n || formControlAttrType == 'checkbox') )\n {\n // validate radio buttons\n group = formControl.attr( 'name' );\n checked = $form.find( 'input[name=\"' + group + '\"]:checked' ).length;\n\n if ( formControlAttrType == 'radio' )\n {\n checkedMin = 1;\n checkedMax = 1;\n }\n else\n {\n var minMax = (new Function(\"return \" + attrValidate))() || {min: 1, max: 1};\n checkedMin = minMax.min;\n checkedMax = minMax.max;\n }\n\n currentHasError = ( checked < checkedMin || checked > checkedMax );\n\n }\n else if ( formControl.is( 'select' ) )\n {\n // validate selects\n currentHasError = ( formControl.val() == '' || formControl.val() == '-1' );\n }\n else\n {\n console.error( 'Form validation error: ' + $( elem ).prop( \"tagName\" ) + ' does not contain an form element' );\n return;\n }\n\n if ( currentHasError )\n {\n hasError = true;\n missingFields.push( formControl );\n\n if ( formControls.length > 1 )\n {\n formControl.addClass( errorClass );\n $form.find( 'label[for=\"' + formControl.attr( 'id' ) + '\"]' ).addClass( errorClass );\n }\n else\n {\n $( elem ).addClass( errorClass );\n }\n }\n }\n\n } );\n\n // scroll to element on 'validationFailed'\n $form.on( 'validationFailed', function()\n {\n var distanceTop = 50;\n var $error = $form.find( '.' + errorClass ).first();\n var errorOffset = $error.offset().top;\n var $scrollTarget = $( 'html, body' );\n\n // if form is inside of modal, scroll modal instead of body\n if ( $form.parents( '.modal' ).length > 0 )\n {\n $scrollTarget = $form.parents( '.modal' ).find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n\n }\n else if ( $form.is( '.modal' ) )\n {\n $scrollTarget = $form.find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n }\n\n // only scroll if error is outside of viewport\n if ( errorOffset - distanceTop < window.pageYOffset || errorOffset > (window.pageYOffset + window.innerHeight) )\n {\n $scrollTarget.animate( {\n scrollTop: errorOffset - distanceTop\n } );\n }\n } );\n\n if ( hasError )\n {\n // remove error class on focus\n $form.find( '.' + errorClass ).each( function( i, elem )\n {\n formControl = $( getFormControl( elem ) );\n formControl.on( 'focus click', function()\n {\n var $errorElement = $( elem );\n $errorElement.removeClass( errorClass );\n $form.find( 'label[for=\"' + $( this ).attr( 'id' ) + '\"]' ).removeClass( errorClass );\n } );\n } );\n\n $form.trigger( 'validationFailed', [missingFields] );\n }\n\n var callback = $form.attr( 'data-plenty-callback' );\n\n if ( !hasError && !!callback && callback != \"submit\" && typeof window[callback] == \"function\" )\n {\n\n var fields = {};\n $form.find( 'input, textarea, select' ).each( function()\n {\n if ( $( this ).attr( 'type' ) == 'checkbox' )\n {\n fields[$( this ).attr( 'name' )] = $( this ).is( ':checked' );\n }\n else\n {\n fields[$( this ).attr( 'name' )] = $( this ).val();\n }\n } );\n\n window[callback]( fields );\n return false;\n }\n else\n {\n return !hasError;\n }\n }\n } );\n\n /**\n * jQuery-Plugin to calling {{#crossLink \"ValidationService/validate\"}}ValidationService.validate{{/crossLink}}\n * on jQuery wrapped elements.\n * @return {boolean}\n */\n $.fn.validateForm = function()\n {\n return pm.getInstance().ValidationService.validate( this );\n };\n\n /**\n * jQuery-Plugin to get the values of contained form elements.\n * @return {object}\n */\n $.fn.getFormValues = function()\n {\n\n var form = this;\n var values = {};\n\n function inject( position, value )\n {\n var match = position.match( /^([^\\[]+)(.*)/ );\n\n if ( !!match[2] )\n {\n var exp = /\\[([^\\]]+)]/g;\n var child;\n var children = [];\n children[0] = match[1];\n while ( (child = exp.exec( match[2] )) !== null )\n {\n children.push( child[1] );\n }\n\n for ( var i = children.length - 1; i >= 0; i-- )\n {\n var val = {};\n val[children[i]] = value;\n value = val;\n }\n values = $.extend( true, values, value );\n }\n else\n {\n values[match[1]] = value;\n }\n }\n\n form.find( 'input, select, textarea' ).each( function( i, elem )\n {\n if ( !!$( elem ).attr( 'name' ) )\n {\n if ( $( elem ).attr( 'type' ) == \"checkbox\" )\n {\n // get checkbox group\n var groupValues = [];\n $( form ).find( '[name=\"' + $( elem ).attr( 'name' ) + '\"]:checked' ).each( function( j, checkbox )\n {\n groupValues.push( $( checkbox ).val() );\n } );\n inject( $( elem ).attr( 'name' ), groupValues );\n }\n else if ( $( elem ).attr( 'type' ) == 'radio' )\n {\n if ( $( elem ).is( ':checked' ) )\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n else\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n\n } );\n return values;\n }\n}( jQuery, PlentyFramework ));\n/**\n * Services provide functions to be called from the instanced PlentyFramework.
    \n * Services can inject Factories and can be injected into Directives. The are also\n * available from the global instance of PlentyFramework\n * @module Services\n * @main Services\n * @example\n * PlentyFramework.service('ServiceName', serviceFunctions() {\n * return {\n * functionInService: function() {}\n * }\n * });\n * //...\n * plenty.ServiceName.functionInService/();\n */\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\nPlentyFramework.compile();\n\n// Create global instance of PlentyFramework for usage in Webshop-Layouts\nvar plenty = PlentyFramework.getInstance();\n\n/*\n * initially bind all registered directives\n *\n * will not be tested. reasons:\n * http://stackoverflow.com/questions/29153733/how-to-unit-test-a-document-ready-function-using-jasmine\n */\njQuery( document ).ready( function()\n{\n plenty.bindDirectives();\n} );" ] } \ No newline at end of file diff --git a/src/directives/MobileDropdown.js b/src/directives/MobileDropdown.js index 6c02703..8b01a36 100644 --- a/src/directives/MobileDropdown.js +++ b/src/directives/MobileDropdown.js @@ -31,8 +31,11 @@ { $( window ).on( 'orientationchange sizeChange', function() { - resetDropdowns( dropdownElements ); - resetDropdowns( closableDropdownElements ); + if ( !$( "input" ).is( ":focus" ) ) + { + resetDropdowns( dropdownElements ); + resetDropdowns( closableDropdownElements ); + } } ); } @@ -45,9 +48,7 @@ if ( !!event ) { if ( $current.find( $( event.target ) ).length === 0 - && !$( "#LiveSearchParam" ).is( ":focus" ) - && !$( "#checkout-login-email" ).is( ":focus" ) - && !$( "#checkout-login-password" ).is( ":focus" ) ) + && !$( "input" ).is( ":focus" ) ) { $current.removeClass( 'open' ); $( 'html' ).unbind( "click touchstart", resetEvent ); @@ -55,10 +56,7 @@ } else { - if ( $current.find( $( event.target ) ).length === 0 - && !$( "#LiveSearchParam" ).is( ":focus" ) - && !$( "#checkout-login-email" ).is( ":focus" ) - && !$( "#checkout-login-password" ).is( ":focus" ) ) + if ( !$( "input" ).is( ":focus" ) ) { $current.removeClass( 'open' ); $( 'html' ).unbind( "click touchstart", resetEvent ); @@ -163,9 +161,11 @@ $elemParent.addClass( 'animating' ); $elem.siblings( 'ul' ).slideToggle( 400, function() { - if ( $elemParent.is( '.open' ) ) + if ( $elemParent.is( '.open' ) && !$( "input" ).is( ":focus" ) ) { $elemParent.removeClass( 'open' ); + $elem.siblings( 'ul' ).removeAttr( 'style' ); + $elemParent.removeClass( 'animating' ); } else { @@ -175,8 +175,6 @@ dropdownElements.push( $elemParent[0] ); } } - $elem.siblings( 'ul' ).removeAttr( 'style' ); - $elemParent.removeClass( 'animating' ); } ); } diff --git a/src/services/BasketService.js b/src/services/BasketService.js index c47f130..cf4b74d 100644 --- a/src/services/BasketService.js +++ b/src/services/BasketService.js @@ -157,9 +157,21 @@ Checkout.loadCheckout() .done( function() { + var artAttr = $( "[name^=ArticleAttribute]" ); + var requestData = {ArticleID: article[0].BasketItemItemID}; + + if ( artAttr ) + { + $( "[name^=ArticleAttribute]" ).each( function( i, v ) + { + requestData[$( v ).attr( "name" )] = $( v ).val(); + } ); + } + refreshBasketPreview(); + // Show confirmation popup - CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', {ArticleID: article[0].BasketItemItemID} ).from( 'ItemView' ) + CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', requestData ).from( 'ItemView' ) .done( function( response ) { var timeout = pm.getGlobal( 'TimeoutItemToBasketOverlay', 5000 ); @@ -402,9 +414,10 @@ { $( this ).siblings( ":not('[data-plenty-checkout-template]')" ).remove(); $( this ).remove(); - $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn(function() { + $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn( function() + { pm.getInstance().bindDirectives( $basketListContainer ); - }); + } ); } ); } ); } diff --git a/tools/CheckoutManager-migrate.js b/tools/CheckoutManager-migrate.js deleted file mode 100644 index bb503b3..0000000 --- a/tools/CheckoutManager-migrate.js +++ /dev/null @@ -1,18 +0,0 @@ -CheckoutManager = {}; - -(function( $, pm ) -{ - CheckoutManager.init = function() - { - pm.NavigatorService.init(); - }; - - CheckoutManager.Navigator = {}; - - CheckoutManager.Navigator.fillNavigation = function() - { - pm.NavigatorService.fillNavigation(); - }; - - -})( jQuery, PlentyFramework ); \ No newline at end of file diff --git a/tools/plenty-2.js b/tools/plenty-2.js new file mode 100644 index 0000000..ad63054 --- /dev/null +++ b/tools/plenty-2.js @@ -0,0 +1,232 @@ +/* plenty scripts */ +(function( $ ) +{ + /* + * Initialization + */ + $( document ).ready( function() + { + $( '.mainNavigation' ).on( 'scroll touchmove mousewheel', function( event ) + { + event.preventDefault(); + } ); + + // cancel login + $( '[data-plenty="cancelLogin"]' ).click( function() + { + $( this ).closest( '.dropdown' ).removeClass( 'open' ); + if ( plenty.MediaSizeService.interval() != 'xs' && plenty.MediaSizeService.interval() != 'sm' ) + { + $( this ).closest( '[data-plenty="loginFormContainer"]' ).hide( 1, function() + { + $( this ).css( {overflow: 'hidden'} ).animate( {height: 0}, 250, function() + { + $( this ).delay( 300 ).queue( function() + { + $( this ).dequeue().removeAttr( 'style' ); + } ); + } ); + } ); + } + } ); + + // mobile navigation / aside panel + $( window ).on( 'orientationchange sizeChange', function() + { + if ( $( 'body' ).is( '.navigation-visible' ) && !$( 'input' ).is( ':focus' ) ) + { + $( 'body.aside-visible' ).removeClass( 'aside-visible' ); + $( 'body.navigation-visible' ).removeClass( 'navigation-visible' ); + } + } ); + + // initialize touch functionality for mobile navigation / aside panel (requires jquery.touchSwipe.min.js) + $( '.touch body > .wrapper' ).swipe( { + swipeLeft : swipeLeft, + swipeRight : swipeRight, + allowPageScroll : 'auto', + excludedElements: 'form, input, button, select, .owl-item, .ui-slider-handle' + } ); + function swipeLeft( event, direction, distance, duration, fingerCount ) + { + if ( plenty.MediaSizeService.interval() == 'xs' || plenty.MediaSizeService.interval() == 'sm' ) + { + if ( $( 'body' ).is( '.navigation-visible' ) && !$( 'input' ).is( ':focus' ) ) + { + $( 'body' ).removeClass( 'navigation-visible' ); + } + else if ( !$( 'body' ).is( '.aside-visible' ) ) + { + $( 'body' ).addClass( 'aside-visible' ) + } + } + } + + function swipeRight( event, direction, distance, duration, fingerCount ) + { + if ( plenty.MediaSizeService.interval() == 'xs' || plenty.MediaSizeService.interval() == 'sm' ) + { + if ( !$( 'body' ).is( '.navigation-visible' ) && !$( 'body' ).is( '.aside-visible' ) ) + { + $( 'body' ).addClass( 'navigation-visible' ); + } + else if ( $( 'body' ).is( '.aside-visible' ) ) + { + $( 'body' ).removeClass( 'aside-visible' ); + } + } + } + + // inizialize cross selling slider (requires owl.carousel.js) + $( '.crossSellingSlider' ).owlCarousel( { + items : 4, + itemsDesktop : [1199, 3], + itemsDesktopSmall: [991, 4], + itemsTablet : [767, 2], + navigation : true, + navigationText : false, + rewindNav : false, + pagination : true, + mouseDrag : true, + afterMove : function( current ) + { + $( current ).find( 'img[data-plenty-lazyload]' ).trigger( 'appear' ); + } + } ); + + // inizialize preview image slider (requires owl.carousel.js) + $( '.previewImageSlider' ).owlCarousel( { + items : 1, + itemsDesktop : false, + itemsDesktopSmall: false, + itemsTablet : false, + itemsMobile : false, + navigation : true, + navigationText : false, + lazyLoad : true, + rewindNav : false, + pagination : true, + afterInit : function() + { + $( '.owl-controls' ).removeAttr( 'style' ); + }, + afterUpdate : function() + { + $( '.owl-controls' ).removeAttr( 'style' ); + }, + afterLazyLoad : function( owl ) + { + owl.find( 'img:visible' ).css( 'display', 'inline-block' ); + } + } ); + + } ); + + /* + * Display error modal for old browsers + */ + $( window ).load( function() + { + + // display errors for old browsers + if ( $( 'body' ).is( 'ielte7' ) ) + { + $( '[data-plenty="browserErrorModal"] .modal-title' ).append( 'Ihr Browser ist veraltet!' ); + $( '[data-plenty="browserErrorModal"] .modal-body' ).append( '

    Um die Funktionen dieser Seite nutzen zu können, benötigen Sie eine aktuelle Version Ihres Browsers.
    ' + + 'Bitte aktuallisieren Sie Ihren Browser, um Ihren Einkauf fortsetzen zu können.

    ' ); + + $( '[data-plenty="browserErrorModal"]' ).modal( { + show : true, + backdrop: 'static', + keyboard: false + } ); + } + + } ); + + /* + * jQuery plugin: auto-hide + * automatically hide or remove elements + * Usage: + * $(selector).autoHide(options); + */ + $.fn.autoHide = function( options ) + { + var defaults = { + hideAfter : 4000, // delay to hide or remove element, in milliseconds + pauseOnHover : true, // pause delay when element is hovered + removeFromDOM : false, // remove the element from the DOM instead of hiding it + overlaySelector : false, // jQuery selector of an overlay, if used. Will be hidden after delay + closeSelector : false, // jQuery selector of a child-element to hide/ delete the element manually + hideOnOverlayClick: true // hide/ delete the element by clicking the overlay + }; + var settings = $.extend( defaults, options ); + + this.each( function( i, element ) + { + /* hides/ removes the element. If overlay selector is set, hide it too */ + var doClose = function() + { + if ( !!settings.overlaySelector ) + { + $( settings.overlaySelector ).hide(); + } + // remove or hide after 'hideAfter' ms + if ( settings.removeFromDOM ) + { + $( element ).remove(); + } + else + { + $( element ).hide(); + } + }; + + /* start/ continue delay to close/ hide element */ + var startClosing = function( time ) + { + return setTimeout( function() + { + doClose(); + }, time ); + }; + + if ( settings.hideAfter > 0 ) + { + // START + var timeStart = (new Date).getTime(); + var timeout = startClosing( settings.hideAfter ); + + // PAUSE & CONTINUE + if ( settings.pauseOnHover ) + { + var timeRemaining = 0; + $( element ).hover( function() + { + // store remaining time + timeRemaining = (new Date).getTime() - timeStart; + // stop closing on mouse in + clearTimeout( timeout ); + }, function() + { + // continue closing in mouse out + if ( timeRemaining > 0 ) + { + timeout = startClosing( timeRemaining ); + } + } ); + } + } + + // STOP + if ( !!settings.closeSelector ) + { + $( element ).find( settings.closeSelector ).click( doClose ); + } + if ( settings.hideOnOverlayClick && !!settings.overlaySelector ) + { + $( settings.overlaySelector ).click( doClose ); + } + } ); + }; +}( jQuery )); \ No newline at end of file From 7ba519c44c391d47bb062c05d52b3d1b56a70449 Mon Sep 17 00:00:00 2001 From: Maximilian Lauterbach Date: Tue, 17 May 2016 18:13:53 +0200 Subject: [PATCH 5/6] increase version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ed9d7c1..7fc553d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "plentymarketsCMStools", "license": "AGPL-3.0", - "version": "1.0.8", + "version": "1.0.9", "repository": "https://github.com/plentymarkets/plenty-cms-library.git", "devDependencies": { "grunt": "^0.4.5", From 6a0bed1173ad1dcd14ad08665c1df05486da491f Mon Sep 17 00:00:00 2001 From: Maximilian Lauterbach Date: Tue, 17 May 2016 18:18:18 +0200 Subject: [PATCH 6/6] yay forgotten to built new script --- ....0.8.js => plentymarketsCMStools-1.0.9.js} | 783 +++++++++++++++--- ....js => plentymarketsCMStools-1.0.9.min.js} | 4 +- ...=> plentymarketsCMStools-1.0.9.min.js.map} | 6 +- ...> plentymarketsCMStools-libs-1.0.9.min.js} | 0 4 files changed, 672 insertions(+), 121 deletions(-) rename dist/{plentymarketsCMStools-1.0.8.js => plentymarketsCMStools-1.0.9.js} (91%) rename dist/{plentymarketsCMStools-1.0.8.min.js => plentymarketsCMStools-1.0.9.min.js} (99%) rename dist/{plentymarketsCMStools-1.0.8.min.js.map => plentymarketsCMStools-1.0.9.min.js.map} (99%) rename dist/{plentymarketsCMStools-libs-1.0.8.min.js => plentymarketsCMStools-libs-1.0.9.min.js} (100%) diff --git a/dist/plentymarketsCMStools-1.0.8.js b/dist/plentymarketsCMStools-1.0.9.js similarity index 91% rename from dist/plentymarketsCMStools-1.0.8.js rename to dist/plentymarketsCMStools-1.0.9.js index 2fa4a78..e1aabde 100644 --- a/dist/plentymarketsCMStools-1.0.8.js +++ b/dist/plentymarketsCMStools-1.0.9.js @@ -1,93 +1,640 @@ var TemplateCache = {}; TemplateCache["addressSuggestions/addressDoctor.html"] = ""; + " {{#values}}\n" + + "
  • \n" + + " \n" + + " {{.}}\n" + + " \n" + + "
  • \n" + + " {{/values}}\n" + + ""; TemplateCache["addressSuggestions/postFinder.html"] = "{{#addresses}}\n" + - "
    \n" + - "
    \n" + - " \n" + - "
    \n" + - "
    \n" + - "{{/addresses}}\n" + - ""; + "
    \n" + + "
    \n" + + " \n" + + "
    \n" + + "
    \n" + + "{{/addresses}}\n" + + ""; TemplateCache["error/errorMessage.html"] = "
    \n" + - " Code {{code}}:\n" + - " {{{message}}}\n" + - "
    \n" + - ""; + " Code {{code}}:\n" + + " {{{message}}}\n" + + "
    \n" + + ""; TemplateCache["error/errorPopup.html"] = "
    \n" + - " \n" + - "
    \n" + - "
    \n" + - "
    \n" + - ""; + " \n" + + "
    \n" + + "
    \n" + + "\n" + + ""; TemplateCache["modal/modal.html"] = "
    \n" + - "
    \n" + - "
    \n" + - "\n" + - " {{#title}}\n" + - "
    \n" + - " \n" + - "

    {{{title}}}

    \n" + - "
    \n" + - " {{/title}}\n" + - "\n" + - "
    {{{content}}}
    \n" + - "\n" + - "
    \n" + - "\n" + - " {{#labelDismiss}}\n" + - " \n" + - " {{/labelDismiss}}\n" + - "\n" + - " \n" + - "
    \n" + - "
    \n" + - "
    \n" + - "
    \n" + - ""; + "
    \n" + + "
    \n" + + "\n" + + " {{#title}}\n" + + "
    \n" + + " \n" + + "

    {{{title}}}

    \n" + + "
    \n" + + " {{/title}}\n" + + "\n" + + "
    {{{content}}}
    \n" + + "\n" + + "
    \n" + + "\n" + + " {{#labelDismiss}}\n" + + " \n" + + " {{/labelDismiss}}\n" + + "\n" + + " \n" + + "
    \n" + + "
    \n" + + "
    \n" + + "\n" + + ""; TemplateCache["waitscreen/waitscreen.html"] = "
    "; -(function defineMustache(global,factory){if(typeof exports==="object"&&exports&&typeof exports.nodeName!=="string"){factory(exports)}else if(typeof define==="function"&&define.amd){define(["exports"],factory)}else{global.Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)==="[object Array]"};function isFunction(object){return typeof object==="function"}function typeStr(obj){return isArray(obj)?"array":typeof obj}function escapeRegExp(string){return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function hasProperty(obj,propName){return obj!=null&&typeof obj==="object"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function escapeHtml(string){return String(string).replace(/[&<>"'\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile==="string")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error("Invalid tags: "+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===""};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){value=context.view;names=name.split(".");index=0;while(value!=null&&index")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol==="&")value=this.unescapedValue(token,context);else if(symbol==="name")value=this.escapedValue(token,context);else if(symbol==="text")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j": ">", '"': """, "'": "'", "/": "/"}; + + function escapeHtml( string ) + { + return String( string ).replace( /[&<>"'\/]/g, function fromEntityMap( s ) + { + return entityMap[s] + } ) + } + + var whiteRe = /\s*/; + var spaceRe = /\s+/; + var equalsRe = /\s*=/; + var curlyRe = /\s*\}/; + var tagRe = /#|\^|\/|>|\{|&|=|!/; + + function parseTemplate( template, tags ) + { + if ( !template ) + { + return []; + } + var sections = []; + var tokens = []; + var spaces = []; + var hasTag = false; + var nonSpace = false; + + function stripSpace() + { + if ( hasTag && !nonSpace ) + { + while ( spaces.length ) + { + delete tokens[spaces.pop()] + } + } + else + { + spaces = [] + } + hasTag = false; + nonSpace = false + } + + var openingTagRe, closingTagRe, closingCurlyRe; + + function compileTags( tagsToCompile ) + { + if ( typeof tagsToCompile === "string" ) + { + tagsToCompile = tagsToCompile.split( spaceRe, 2 ); + } + if ( !isArray( tagsToCompile ) || tagsToCompile.length !== 2 ) + { + throw new Error( "Invalid tags: " + tagsToCompile ); + } + openingTagRe = new RegExp( escapeRegExp( tagsToCompile[0] ) + "\\s*" ); + closingTagRe = new RegExp( "\\s*" + escapeRegExp( tagsToCompile[1] ) ); + closingCurlyRe = new RegExp( "\\s*" + escapeRegExp( "}" + tagsToCompile[1] ) ) + } + + compileTags( tags || mustache.tags ); + var scanner = new Scanner( template ); + var start, type, value, chr, token, openSection; + while ( !scanner.eos() ) + { + start = scanner.pos; + value = scanner.scanUntil( openingTagRe ); + if ( value ) + { + for ( var i = 0, valueLength = value.length; i < valueLength; ++i ) + { + chr = value.charAt( i ); + if ( isWhitespace( chr ) ) + { + spaces.push( tokens.length ) + } + else + { + nonSpace = true + } + tokens.push( ["text", chr, start, start + 1] ); + start += 1; + if ( chr === "\n" ) + { + stripSpace() + } + } + } + if ( !scanner.scan( openingTagRe ) ) + { + break; + } + hasTag = true; + type = scanner.scan( tagRe ) || "name"; + scanner.scan( whiteRe ); + if ( type === "=" ) + { + value = scanner.scanUntil( equalsRe ); + scanner.scan( equalsRe ); + scanner.scanUntil( closingTagRe ) + } + else if ( type === "{" ) + { + value = scanner.scanUntil( closingCurlyRe ); + scanner.scan( curlyRe ); + scanner.scanUntil( closingTagRe ); + type = "&" + } + else + { + value = scanner.scanUntil( closingTagRe ) + } + if ( !scanner.scan( closingTagRe ) ) + { + throw new Error( "Unclosed tag at " + scanner.pos ); + } + token = [type, value, start, scanner.pos]; + tokens.push( token ); + if ( type === "#" || type === "^" ) + { + sections.push( token ) + } + else if ( type === "/" ) + { + openSection = sections.pop(); + if ( !openSection ) + { + throw new Error( 'Unopened section "' + value + '" at ' + start ); + } + if ( openSection[1] !== value ) + { + throw new Error( 'Unclosed section "' + openSection[1] + '" at ' + start ) + } + } + else if ( type === "name" || type === "{" || type === "&" ) + { + nonSpace = true + } + else if ( type === "=" ) + { + compileTags( value ) + } + } + openSection = sections.pop(); + if ( openSection ) + { + throw new Error( 'Unclosed section "' + openSection[1] + '" at ' + scanner.pos ); + } + return nestTokens( squashTokens( tokens ) ) + } + + function squashTokens( tokens ) + { + var squashedTokens = []; + var token, lastToken; + for ( var i = 0, numTokens = tokens.length; i < numTokens; ++i ) + { + token = tokens[i]; + if ( token ) + { + if ( token[0] === "text" && lastToken && lastToken[0] === "text" ) + { + lastToken[1] += token[1]; + lastToken[3] = token[3] + } + else + { + squashedTokens.push( token ); + lastToken = token + } + } + } + return squashedTokens + } + + function nestTokens( tokens ) + { + var nestedTokens = []; + var collector = nestedTokens; + var sections = []; + var token, section; + for ( var i = 0, numTokens = tokens.length; i < numTokens; ++i ) + { + token = tokens[i]; + switch ( token[0] ) + { + case"#": + case"^": + collector.push( token ); + sections.push( token ); + collector = token[4] = []; + break; + case"/": + section = sections.pop(); + section[5] = token[2]; + collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens; + break; + default: + collector.push( token ) + } + } + return nestedTokens + } + + function Scanner( string ) + { + this.string = string; + this.tail = string; + this.pos = 0 + } + + Scanner.prototype.eos = function eos() + { + return this.tail === "" + }; + Scanner.prototype.scan = function scan( re ) + { + var match = this.tail.match( re ); + if ( !match || match.index !== 0 ) + { + return ""; + } + var string = match[0]; + this.tail = this.tail.substring( string.length ); + this.pos += string.length; + return string + }; + Scanner.prototype.scanUntil = function scanUntil( re ) + { + var index = this.tail.search( re ), match; + switch ( index ) + { + case-1: + match = this.tail; + this.tail = ""; + break; + case 0: + match = ""; + break; + default: + match = this.tail.substring( 0, index ); + this.tail = this.tail.substring( index ) + } + this.pos += match.length; + return match + }; + function Context( view, parentContext ) + { + this.view = view; + this.cache = {".": this.view}; + this.parent = parentContext + } + + Context.prototype.push = function push( view ) + { + return new Context( view, this ) + }; + Context.prototype.lookup = function lookup( name ) + { + var cache = this.cache; + var value; + if ( cache.hasOwnProperty( name ) ) + { + value = cache[name] + } + else + { + var context = this, names, index, lookupHit = false; + while ( context ) + { + if ( name.indexOf( "." ) > 0 ) + { + value = context.view; + names = name.split( "." ); + index = 0; + while ( value != null && index < names.length ) + { + if ( index === names.length - 1 ) + { + lookupHit = hasProperty( value, names[index] ); + } + value = value[names[index++]] + } + } + else + { + value = context.view[name]; + lookupHit = hasProperty( context.view, name ) + } + if ( lookupHit ) + { + break; + } + context = context.parent + } + cache[name] = value + } + if ( isFunction( value ) ) + { + value = value.call( this.view ); + } + return value + }; + function Writer() + { + this.cache = {} + } + + Writer.prototype.clearCache = function clearCache() + { + this.cache = {} + }; + Writer.prototype.parse = function parse( template, tags ) + { + var cache = this.cache; + var tokens = cache[template]; + if ( tokens == null ) + { + tokens = cache[template] = parseTemplate( template, tags ); + } + return tokens + }; + Writer.prototype.render = function render( template, view, partials ) + { + var tokens = this.parse( template ); + var context = view instanceof Context ? view : new Context( view ); + return this.renderTokens( tokens, context, partials, template ) + }; + Writer.prototype.renderTokens = function renderTokens( tokens, context, partials, originalTemplate ) + { + var buffer = ""; + var token, symbol, value; + for ( var i = 0, numTokens = tokens.length; i < numTokens; ++i ) + { + value = undefined; + token = tokens[i]; + symbol = token[0]; + if ( symbol === "#" ) + { + value = this.renderSection( token, context, partials, originalTemplate ); + } + else if ( symbol === "^" ) + { + value = this.renderInverted( token, context, partials, originalTemplate ); + } + else if ( symbol === ">" ) + { + value = this.renderPartial( token, context, partials, originalTemplate ); + } + else if ( symbol === "&" ) + { + value = this.unescapedValue( token, context ); + } + else if ( symbol === "name" ) + { + value = this.escapedValue( token, context ); + } + else if ( symbol === "text" ) + { + value = this.rawValue( token ); + } + if ( value !== undefined ) + { + buffer += value + } + } + return buffer + }; + Writer.prototype.renderSection = function renderSection( token, context, partials, originalTemplate ) + { + var self = this; + var buffer = ""; + var value = context.lookup( token[1] ); + + function subRender( template ) + { + return self.render( template, context, partials ) + } + + if ( !value ) + { + return; + } + if ( isArray( value ) ) + { + for ( var j = 0, valueLength = value.length; j < valueLength; ++j ) + { + buffer += this.renderTokens( token[4], context.push( value[j] ), partials, originalTemplate ) + } + } + else if ( typeof value === "object" || typeof value === "string" || typeof value === "number" ) + { + buffer += this.renderTokens( token[4], context.push( value ), partials, originalTemplate ) + } + else if ( isFunction( value ) ) + { + if ( typeof originalTemplate !== "string" ) + { + throw new Error( "Cannot use higher-order sections without the original template" ); + } + value = value.call( context.view, originalTemplate.slice( token[3], token[5] ), subRender ); + if ( value != null ) + { + buffer += value + } + } + else + { + buffer += this.renderTokens( token[4], context, partials, originalTemplate ) + } + return buffer + }; + Writer.prototype.renderInverted = function renderInverted( token, context, partials, originalTemplate ) + { + var value = context.lookup( token[1] ); + if ( !value || isArray( value ) && value.length === 0 ) + { + return this.renderTokens( token[4], context, partials, originalTemplate ) + } + }; + Writer.prototype.renderPartial = function renderPartial( token, context, partials ) + { + if ( !partials ) + { + return; + } + var value = isFunction( partials ) ? partials( token[1] ) : partials[token[1]]; + if ( value != null ) + { + return this.renderTokens( this.parse( value ), context, partials, value ) + } + }; + Writer.prototype.unescapedValue = function unescapedValue( token, context ) + { + var value = context.lookup( token[1] ); + if ( value != null ) + { + return value + } + }; + Writer.prototype.escapedValue = function escapedValue( token, context ) + { + var value = context.lookup( token[1] ); + if ( value != null ) + { + return mustache.escape( value ) + } + }; + Writer.prototype.rawValue = function rawValue( token ) + { + return token[1] + }; + mustache.name = "mustache.js"; + mustache.version = "2.1.3"; + mustache.tags = ["{{", "}}"]; + var defaultWriter = new Writer; + mustache.clearCache = function clearCache() + { + return defaultWriter.clearCache() + }; + mustache.parse = function parse( template, tags ) + { + return defaultWriter.parse( template, tags ) + }; + mustache.render = function render( template, view, partials ) + { + if ( typeof template !== "string" ) + { + throw new TypeError( 'Invalid template! Template should be a "string" ' + 'but "' + typeStr( template ) + '" was given as the first ' + "argument for mustache#render(template, view, partials)" ) + } + return defaultWriter.render( template, view, partials ) + }; + mustache.to_html = function to_html( template, view, partials, send ) + { + var result = mustache.render( template, view, partials ); + if ( isFunction( send ) ) + { + send( result ) + } + else + { + return result + } + }; + mustache.escape = escapeHtml; + mustache.Scanner = Scanner; + mustache.Context = Context; + mustache.Writer = Writer +} ); /** * Licensed under AGPL v3 @@ -104,7 +651,7 @@ TemplateCache["waitscreen/waitscreen.html"] = "
    parseInt(compareVersion[i]) ) + if ( parseInt( localVersion[i] ) > parseInt( compareVersion[i] ) ) { return 1; } @@ -221,7 +771,7 @@ TemplateCache["waitscreen/waitscreen.html"] = "
    = 0; i-- ) { + for ( var i = scripts.length - 1; i >= 0; i-- ) + { var path = scripts[i].src.match( /(.*)\/(.*)\.js(\?\S*)?$/ ); - if( !!path ) { + if ( !!path ) + { PlentyFramework.scriptPath = path[1]; break; } @@ -799,9 +1352,6 @@ TemplateCache["waitscreen/waitscreen.html"] = "
    0 ) + if ( typeof href === 'string' && href.indexOf( '/' ) == -1 && $( href ).length > 0 ) { window.location.assign( $( href ).attr( 'href' ) ); } @@ -2559,7 +3109,7 @@ TemplateCache["waitscreen/waitscreen.html"] = "
    * ===================================================================================== */ -var TemplateCache={};TemplateCache["addressSuggestions/addressDoctor.html"]='',TemplateCache["addressSuggestions/postFinder.html"]='{{#addresses}}\n
    \n
    \n \n
    \n
    \n{{/addresses}}\n',TemplateCache["error/errorMessage.html"]='
    \n Code {{code}}:\n {{{message}}}\n
    \n',TemplateCache["error/errorPopup.html"]='
    \n \n
    \n
    \n
    \n',TemplateCache["modal/modal.html"]='\n',TemplateCache["waitscreen/waitscreen.html"]='
    ',function(a,b){"object"==typeof exports&&exports&&"string"!=typeof exports.nodeName?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):(a.Mustache={},b(Mustache))}(this,function(a){function b(a){return"function"==typeof a}function c(a){return p(a)?"array":typeof a}function d(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function e(a,b){return null!=a&&"object"==typeof a&&b in a}function f(a,b){return q.call(a,b)}function g(a){return!f(r,a)}function h(a){return String(a).replace(/[&<>"'\/]/g,function(a){return s[a]})}function i(b,c){function e(){if(r&&!s)for(;q.length;)delete o[q.pop()];else q=[];r=!1,s=!1}function f(a){if("string"==typeof a&&(a=a.split(u,2)),!p(a)||2!==a.length)throw new Error("Invalid tags: "+a);h=new RegExp(d(a[0])+"\\s*"),i=new RegExp("\\s*"+d(a[1])),m=new RegExp("\\s*"+d("}"+a[1]))}if(!b)return[];var h,i,m,n=[],o=[],q=[],r=!1,s=!1;f(c||a.tags);for(var y,z,A,B,C,D,E=new l(b);!E.eos();){if(y=E.pos,A=E.scanUntil(h))for(var F=0,G=A.length;G>F;++F)B=A.charAt(F),g(B)?q.push(o.length):s=!0,o.push(["text",B,y,y+1]),y+=1,"\n"===B&&e();if(!E.scan(h))break;if(r=!0,z=E.scan(x)||"name",E.scan(t),"="===z?(A=E.scanUntil(v),E.scan(v),E.scanUntil(i)):"{"===z?(A=E.scanUntil(m),E.scan(w),E.scanUntil(i),z="&"):A=E.scanUntil(i),!E.scan(i))throw new Error("Unclosed tag at "+E.pos);if(C=[z,A,y,E.pos],o.push(C),"#"===z||"^"===z)n.push(C);else if("/"===z){if(D=n.pop(),!D)throw new Error('Unopened section "'+A+'" at '+y);if(D[1]!==A)throw new Error('Unclosed section "'+D[1]+'" at '+y)}else"name"===z||"{"===z||"&"===z?s=!0:"="===z&&f(A)}if(D=n.pop())throw new Error('Unclosed section "'+D[1]+'" at '+E.pos);return k(j(o))}function j(a){for(var b,c,d=[],e=0,f=a.length;f>e;++e)b=a[e],b&&("text"===b[0]&&c&&"text"===c[0]?(c[1]+=b[1],c[3]=b[3]):(d.push(b),c=b));return d}function k(a){for(var b,c,d=[],e=d,f=[],g=0,h=a.length;h>g;++g)switch(b=a[g],b[0]){case"#":case"^":e.push(b),f.push(b),e=b[4]=[];break;case"/":c=f.pop(),c[5]=b[2],e=f.length>0?f[f.length-1][4]:d;break;default:e.push(b)}return d}function l(a){this.string=a,this.tail=a,this.pos=0}function m(a,b){this.view=a,this.cache={".":this.view},this.parent=b}function n(){this.cache={}}var o=Object.prototype.toString,p=Array.isArray||function(a){return"[object Array]"===o.call(a)},q=RegExp.prototype.test,r=/\S/,s={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},t=/\s*/,u=/\s+/,v=/\s*=/,w=/\s*\}/,x=/#|\^|\/|>|\{|&|=|!/;l.prototype.eos=function(){return""===this.tail},l.prototype.scan=function(a){var b=this.tail.match(a);if(!b||0!==b.index)return"";var c=b[0];return this.tail=this.tail.substring(c.length),this.pos+=c.length,c},l.prototype.scanUntil=function(a){var b,c=this.tail.search(a);switch(c){case-1:b=this.tail,this.tail="";break;case 0:b="";break;default:b=this.tail.substring(0,c),this.tail=this.tail.substring(c)}return this.pos+=b.length,b},m.prototype.push=function(a){return new m(a,this)},m.prototype.lookup=function(a){var c,d=this.cache;if(d.hasOwnProperty(a))c=d[a];else{for(var f,g,h=this,i=!1;h;){if(a.indexOf(".")>0)for(c=h.view,f=a.split("."),g=0;null!=c&&gi;++i)g=void 0,e=a[i],f=e[0],"#"===f?g=this.renderSection(e,b,c,d):"^"===f?g=this.renderInverted(e,b,c,d):">"===f?g=this.renderPartial(e,b,c,d):"&"===f?g=this.unescapedValue(e,b):"name"===f?g=this.escapedValue(e,b):"text"===f&&(g=this.rawValue(e)),void 0!==g&&(h+=g);return h},n.prototype.renderSection=function(a,c,d,e){function f(a){return g.render(a,c,d)}var g=this,h="",i=c.lookup(a[1]);if(i){if(p(i))for(var j=0,k=i.length;k>j;++j)h+=this.renderTokens(a[4],c.push(i[j]),d,e);else if("object"==typeof i||"string"==typeof i||"number"==typeof i)h+=this.renderTokens(a[4],c.push(i),d,e);else if(b(i)){if("string"!=typeof e)throw new Error("Cannot use higher-order sections without the original template");i=i.call(c.view,e.slice(a[3],a[5]),f),null!=i&&(h+=i)}else h+=this.renderTokens(a[4],c,d,e);return h}},n.prototype.renderInverted=function(a,b,c,d){var e=b.lookup(a[1]);return!e||p(e)&&0===e.length?this.renderTokens(a[4],b,c,d):void 0},n.prototype.renderPartial=function(a,c,d){if(d){var e=b(d)?d(a[1]):d[a[1]];return null!=e?this.renderTokens(this.parse(e),c,d,e):void 0}},n.prototype.unescapedValue=function(a,b){var c=b.lookup(a[1]);return null!=c?c:void 0},n.prototype.escapedValue=function(b,c){var d=c.lookup(b[1]);return null!=d?a.escape(d):void 0},n.prototype.rawValue=function(a){return a[1]},a.name="mustache.js",a.version="2.1.3",a.tags=["{{","}}"];var y=new n;a.clearCache=function(){return y.clearCache()},a.parse=function(a,b){return y.parse(a,b)},a.render=function(a,b,d){if("string"!=typeof a)throw new TypeError('Invalid template! Template should be a "string" but "'+c(a)+'" was given as the first argument for mustache#render(template, view, partials)');return y.render(a,b,d)},a.to_html=function(c,d,e,f){var g=a.render(c,d,e);return b(f)?void f(g):g},a.escape=h,a.Scanner=l,a.Context=m,a.Writer=n}),function(a){function b(a,b,c,d){a.on(b,function(a){return i.push(a),c.apply(null,d)}),"complete"===document.readyState&&"ready"===b&&c.apply(null,d)}function c(b){var c=a(b);c.is('input[type="checkbox"]')&&c.on("change",function(){c.is(":checked")?c.trigger("check"):c.trigger("uncheck")}),c.is('input[type="radio"]')&&c.on("change",function(){var b=c.attr("name");a('input[type="radio"][name="'+b+'"]').each(function(b,c){var d=a(c);d.is(":checked")?d.trigger("check"):d.trigger("uncheck")})})}function d(a,b){for(var c=/^(([\w]+):)?([\w]+)\.([\w]+)(\((.*)\))?$/,d=a.split(";"),e=[],f=0;f0)for(var j=h[6].match(/(['][^']+['])|([\w-]+)|(["][^"]+["])/g),k=0;k=c&&g.services.hasOwnProperty(i)){PlentyFramework.prototype.hasOwnProperty(i)||e(g.services[i],2,d),f.push(PlentyFramework.prototype[i]);continue}if(1>=c&&g.directives.hasOwnProperty(i)){PlentyFramework.directives.hasOwnProperty(i)||e(g.directives[i],1,d),f.push(PlentyFramework.directives[i]);continue}console.error('Cannot inject dependency "'+i+'": Object not found.')}else console.error("Cyclic dependency injection: "+d.join(" -> ")+" -> "+i)}3==c?PlentyFramework.factories[b.name]=b.setup.apply(null,f):2==c?PlentyFramework.prototype[b.name]=b.setup.apply(null,f):1==c&&(PlentyFramework.directives[b.name]=b.setup.apply(null,f))}var f="1.0.8",g={factories:{},services:{},directives:{}};PlentyFramework=function(){};var h=null;PlentyFramework.getInstance=function(){return h=h||new PlentyFramework},PlentyFramework.version=function(){function a(a){for(var b=f.split("."),c=a.split("."),d=0;dparseInt(c[d]))return 1}return 0}return{get:function(){return f},equals:function(b){return 0==a(b)},compare:a}}(),PlentyFramework.partials={},PlentyFramework.globals={},PlentyFramework.setGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?(console.error('Global variable "'+a+'" already exists and cannot be overridden.'),null):(PlentyFramework.globals[a]=b,PlentyFramework.globals[a])},PlentyFramework.getGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?PlentyFramework.globals[a]:b},PlentyFramework.directives={},PlentyFramework.directive=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.directives[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.prototype.bindDirectives=function(e){e=e||"html",a(e).find("[data-plenty]").each(function(e,f){var g=d(a(f).attr("data-plenty"),a(f));if(!(g.length<=0)){c(f);for(var e=0;e=0;c--)if(a==i[c].type)return i[c];return null},PlentyFramework.pushEvent=function(a){i.push(a)},PlentyFramework.service=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.services[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.factories={},PlentyFramework.factory=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.factories[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.compileTemplate=function(a,b){return b=b||{},b.translate=function(){return function(a,b){return b(PlentyFramework.translate(a))}},Mustache.render(TemplateCache[a],b)},PlentyFramework.scriptPath="",PlentyFramework.Strings={},PlentyFramework.loadLanguageFile=function(b){a.ajax({url:PlentyFramework.scriptPath+b,dataType:"json"}).done(function(a){PlentyFramework.Strings=a})},PlentyFramework.translate=function(a,b){var c;return PlentyFramework.Strings.hasOwnProperty(a)?c=PlentyFramework.Strings[a]:(c=a,console.warn('No translation found for "'+c+'".')),b&&(c=Mustache.render(c,b)),c},PlentyFramework.compile=function(){for(var a in g.factories)PlentyFramework.factories.hasOwnProperty(a)||e(g.factories[a],3);for(var b in g.services)PlentyFramework.prototype.hasOwnProperty(b)||e(g.services[b],2);for(var c in g.directives)PlentyFramework.directives.hasOwnProperty(c)||e(g.directives[c],1);for(var d=document.getElementsByTagName("SCRIPT"),f=d.length-1;f>=0;f--){var h=d[f].src.match(/(.*)\/(.*)\.js(\?\S*)?$/);if(h){PlentyFramework.scriptPath=h[1];break}}}}(jQuery),function(a,b){b.directive("Authentication",function(c){function d(d){b.getRecentEvent().preventDefault(),c.customerLogin(a(d))}return{login:d}},["AuthenticationService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Basket",function(c){function d(d){b.getRecentEvent().preventDefault();var e={},f=a(d),g=f.parents("form");e.BasketItemItemID=g.find('[name="ArticleID"]').val(),e.BasketItemPriceID=g.find('[name="SYS_P_ID"]').val(),e.BasketItemQuantity=g.find('[name="ArticleQuantity"]').val(),e.BasketItemBranchID=g.find('[name="source_category"]').val();var h=g.find('[name^="ArticleAttribute"]'),i=[];a.each(h,function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&i.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=i.length&&(e.BasketItemAttributesList=i),c.addItem([e])}function e(b,c){var d=a(b),e=d.parent().find("input"),f=parseInt(e.attr("maxlength"))||5,g=parseInt(e.val())+c,h=d.parents("[data-basket-item-id]").length>0;if(h){(g+"").length<=f&&g>=0&&e.val(g);var i=d.data("timeout");i&&window.clearTimeout(i),i=window.setTimeout(function(){e.trigger("change")},1e3),d.data("timeout",i)}else(g+"").length<=f&&g>=1&&e.val(g)}function f(b,d){c.setItemQuantity(b,parseInt(a(d).val())).fail(function(){var e=c.getItem(b);a(d).val(e.BasketItemQuantity)})}return{addBasketItem:d,changeItemQuantity:e,setItemQuantity:f}},["BasketService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Checkout",function(a){function b(b){a.setMethodOfPayment(b)}function c(b){a.confirmAtrigaPaymax(b)}return{setMethodOfPayment:b,confirmAtrigaPaymax:c}},["CheckoutService"])}(jQuery,PlentyFramework),function(a,b){b.directive("MobileDropdown",function(c){function d(){a(window).on("orientationchange sizeChange",function(){a("input").is(":focus")||(e(k),e(l))})}function e(b,c){for(var d,e=0;e0?window.location.assign(a(c).attr("href")):window.location.assign(c))}function e(a){c.goToID(a)}return{to:d,toCheckoutTab:e}},["MediaSizeService","NavigatorService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Tab",function(c){function d(b){a(b).tab("show")}function e(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).addLabel(a)}function f(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).setContent(a)}function g(a,d,e){c.isInterval(e)&&(b.getRecentEvent().preventDefault(),j[d]&&j[d].getTab(a)&&j[d].showTab(a))}function h(){function b(a){return g[a]=new i(a),g[a]}function c(b){var c=0;if(f)c=parseInt(f.getContent().parent().css("zIndex")),f.hide(),f.getContent().parent().css("zIndex",c-1);else{for(var d in g)if(g[d].getContent()){var h=parseInt(g[d].getContent().parent().css("zIndex"));(0==c||c>h)&&(c=h),g[d].hide()}for(var d in g)g[d].getContent()&&g[d].getContent().parent().css("zIndex",c-1);a(window).on("sizeChange",e)}f=g[b],f.getContent().parent().css("zIndex",c),f.show()}function d(a){return g[a]}function e(){for(var a in g)g[a].getContent()&&g[a].show();f=null}var f,g={};return{addTab:b,showTab:c,getTab:d,resetTabs:e}}function i(a){function b(){return j}function c(a){return i.push(a),this}function d(a){return h=a,this}function e(){return h}function f(){for(var a=0;a0&&(a(document).scrollTop()>100?x(z,"addClass","visible"):x(z,"removeClass","visible"))})}function g(){e.showWaitscreen()}function h(a){e.hideWaitscreen(a)}function i(b){a(b).owlCarousel({navigation:!0,navigationText:!1,slideSpeed:1e3,paginationSpeed:1e3,singleItem:!0,autoPlay:6e3,stopOnHover:!0,afterMove:function(b){a(b).find('[data-plenty-rel="lazyload"]').trigger("appear")}})}function j(b,d,e){var f=a(b),g=0,h={},i=f.find('[data-plenty-rel="equal-target"]').length>0?f.find('[data-plenty-rel="equal-target"]'):f.children();e!==!0&&y.push(b);for(var j=i.length;j>=0;j--)h=a(i[j]),h.css("height",""),h.outerHeight(!0)>g&&(g=h.outerHeight(!0));(!d||c.isInterval(d))&&i.height(g)}function k(b){var c=a(b);c.click(function(){return a("html, body").animate({scrollTop:0},400),!1}),a.inArray(c,z)&&z.push(c)}function l(b,c){var d=a(b);d.lazyload({effect:c}),d.is("img")&&d.on("loaded",function(){d.css("display","inline-block")})}function m(b){console.log(b);var c=a(b),d=c.parent();d.addClass("animating"),c.siblings("ul").slideToggle(200,function(){d.is(".open")?d.removeClass("open"):d.addClass("open"),c.siblings("ul").removeAttr("style"),d.removeClass("animating")})}function n(b,c){var d=a(b),e=a(d.attr("data-plenty-rel"));if(d.is('input[type="radio"]')){var f=a('input[type="radio"][name="'+d.attr("name")+'"]'),g=!c||"checked"==c;f.change(function(){var b=a(this);e.parents('[data-plenty-rel="equal-target"]').css("height","auto"),b.is(":checked")&&b[0]===d[0]&&1==g?e.slideDown(400,function(){w()}):e.slideUp(400,function(){w()})})}else d.click(function(){d.addClass("animating"),e.slideToggle(400,function(){d.removeClass("animating"),d.toggleClass("active"),w()})})}function o(b,c){r(a(b),c,"slideDown")}function p(b,c){r(a(b),c,"slideUp")}function q(b,c){r(a(b),c,"slideToggle")}function r(a,b,c){b=b||400,a.parents('[data-plenty-rel="equal-target"]').css("height","auto"),a[c](b,function(){w()})}function s(b,c){var e=a(b),f=e.find('[data-plenty-rel="social-switch"]');e.append(''),f.is("off, on")||f.addClass("off"),f.on("click",function(){f.hasClass("off")&&("tooltip"==e.attr("data-toggle")&&e.tooltip("destroy"),f.removeClass("off").addClass("on"),e.find('[data-plenty-rel="social-placeholder"]').hide(),e.find(".social-container").append(d.getSocialService(c)))})}function t(d,e,f){var g=a(e);if(g.parents(".navbar-main").length>0){var h=g.children("span");return b.directives.MobileDropdown.slideDropdown(h),!0}if(e&&d&&(!f||c.isInterval(f))){var i=b.getRecentEvent();return i&&i.preventDefault(),g.toggleClass(d),!1}}function u(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).addClass(d),!1}}function v(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).removeClass(d),!1}}function w(){for(var a=y.length-1;a>=0;a--)j(y[a],"",!0)}function x(a,b,c){for(var d=a.length-1;d>=0;d--)a[d][b](c)}var y=[],z=[];return{initUIWindowEvents:f,showWaitscreen:g,hideWaitscreen:h,addContentPageSlider:i,equalHeight:j,initToTop:k,initLazyload:l,initSlideToggle:n,slideDown:o,slideUp:p,slideToggle:q,toggleHideShow:m,toggleSocialShare:s,toggleClass:t,addClass:u,removeClass:v}},["MediaSizeService","SocialShareService","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.directive("Validator",function(a){function b(b,c){return a.validate(b,c)}return{validate:b}},["ValidationService"])}(jQuery,PlentyFramework),function(a,b){b.factory("APIFactory",function(c,d){function e(){b.getGlobal("LoginSession")&&(l&&clearTimeout(l),l=setTimeout(function(){a(window).trigger("login-expired"),"Checkout"===b.getGlobal("PageDesign")&&d.prepare().setTitle(b.translate("Your session has expired.")).setContent(b.translate("Please log in again to continue shopping.")).setLabelDismiss(null).setLabelConfirm(b.translate("OK")).onConfirm(function(){window.location.assign("/")}).onDismiss(function(){window.location.assign("/")}).show()},b.getGlobal("LoginSessionExpiration")))}function f(b){try{var d=a.parseJSON(b.responseText);c.printErrors(d.error.error_stack)}catch(e){c.throwError(b.status,b.statusText)}}function g(b,d,g,h,i){return h||c.showWaitScreen(),a.ajax(b,{type:"GET",data:d,dataType:"json",async:!i,error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function h(b,d,g,h){var i={type:"POST",dataType:"json",error:function(a){g||f(a)}};return d&&d.isFile?(i.cache=d.cache,i.processData=d.processData,i.data=d.data,i.contentType=!1):(i.data=JSON.stringify(d),i.contentType="application/json"),h||c.showWaitScreen(),a.ajax(b,i).always(function(){h||c.hideWaitScreen(),e()})}function i(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"PUT",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function j(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"DELETE",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function k(){return a.Deferred().resolve()}var l=null;return a(document).ready(function(){e()}),{get:g,post:h,put:i,"delete":j,idle:k}},["UIFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a){a.factory("CMSFactory",function(a){function b(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/container_"+b.toLowerCase()+"/",c)}return{from:d}}function c(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/"+b.toLowerCase()+"/",c)}return{from:d}}function d(b){return a.get("/rest/categoryview/categorycontentbody/?categoryID="+b)}return{getContainer:b,getParams:c,getCategoryContent:d}},["APIFactory"])}(PlentyFramework),function(a){a.factory("CheckoutFactory",function(b,c,d){function e(){return l}function f(a){return m&&l||g(!0),a?$.extend(!0,{},l):m}function g(a){return b.get("/rest/checkout/",null,!1,!1,a).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function h(){return b.put("/rest/checkout",m).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function i(b){return c.getContainer("checkout"+b).from("checkout").done(function(c){$('[data-plenty-checkout-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function j(b){return c.getCategoryContent(b).done(function(c){$('[data-plenty-checkout-catcontent="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function k(b){return c.getContainer("itemview"+b).from("itemview").done(function(c){$('[data-plenty-itemview-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}var l,m;return{getCheckout:f,setCheckout:h,loadCheckout:g,reloadContainer:i,reloadCatContent:j,reloadItemContainer:k}},["APIFactory","CMSFactory","UIFactory"])}(PlentyFramework),function(a,b){b.factory("ModalFactory",function(){function c(a){return PlentyFramework.partials.Modal.isModal(a)}function d(a){return new e(a)}function e(d){function e(a){return t.title=a,this}function f(a){return t.cssClass=a,this}function g(a){return t.content=a,this}function h(a){return t.labelConfirm=a,this}function i(a){return t.labelDismiss=a,this}function j(a){return t.onConfirm=a,this}function k(a){return t.onDismiss=a,this}function l(a){return t.container=a,this}function m(a){return t.timeout=a,this}function n(){if(t.selector)u=a(t.selector);else{u=c(t.content)?PlentyFramework.partials.Modal.getModal(t.content):a(PlentyFramework.compileTemplate("modal/modal.html",t)),a(t.container).append(u);var b=a(t.content).filter("script");b.length>0&&b.each(function(b,c){var d=document.createElement("script");d.type="text/javascript",d.innerHTML=a(c).text(),a(t.container).append(d)})}PlentyFramework.partials.Modal.init(u,t),u.find('[data-plenty-modal="confirm"]').click(function(){var a=t.onConfirm();"undefined"==typeof a&&(a=!0),a&&o(!0)}),PlentyFramework.partials.Modal.show(u),t.timeout>0&&p()}function o(a){PlentyFramework.partials.Modal.hide(u),a||t.onDismiss()}function p(){x=t.timeout,y=(new Date).getTime(),v=window.setTimeout(function(){window.clearInterval(w),o()},t.timeout),u.find('[data-plenty-modal="timer"]').text(x/1e3),w=window.setInterval(function(){if(!z){var a=x-(new Date).getTime()+y;a=Math.round(a/1e3),u.find('[data-plenty-modal="timer"]').text(a)}},1e3)}function q(){z=!0,x-=(new Date).getTime()-y,window.clearTimeout(v)}function r(){z=!1,y=(new Date).getTime(),v=window.setTimeout(function(){o(),window.clearInterval(w)},x)}function s(){window.clearTimeout(v),window.clearInterval(w)}var t=this;t.selector=d,t.title="",t.cssClass="",t.content="",t.labelDismiss=b.translate("Cancel"),t.labelConfirm=b.translate("Confirm"),t.onConfirm=function(){},t.onDismiss=function(){},t.container="body",t.timeout=-1,t.hide=o,t.startTimeout=p,t.stopTimeout=s,t.pauseTimeout=q,t.continueTimeout=r;var u,v,w,x,y,z=!1;return{setTitle:e,setClass:f,setContent:g,setContainer:l,setLabelConfirm:h,setLabelDismiss:i,onConfirm:j,onDismiss:k,setTimeout:m,show:n,hide:o}}return{prepare:d,isModal:c}})}(jQuery,PlentyFramework),function(a,b){b.factory("UIFactory",function(){function c(a,b){d([{code:a,message:b}])}function d(c){(!i||a("body").has(i).length<=0)&&(i=a(b.compileTemplate("error/errorPopup.html")),a("body").append(i),b.partials.Error.init(i)),a.each(c,function(c,d){b.partials.Error.addError(i,a(b.compileTemplate("error/errorMessage.html",d)))}),b.partials.Error.show(i),f(!0)}function e(){return h=h||0,(!g||a("body").has(g).length<=0)&&(g=a(b.compileTemplate("waitscreen/waitscreen.html")),a("body").append(g)),b.partials.WaitScreen.show(g),h++,h}function f(a){return h--,(0>=h||a)&&(h=0,b.partials.WaitScreen.hide(g)),h}var g,h=0,i=null;return{throwError:c,printErrors:d,showWaitScreen:e,hideWaitScreen:f}})}(jQuery,PlentyFramework),Object.equals=function(a,b){if(a===b)return!0;if(!(a instanceof Object&&b instanceof Object))return!1;if(a.constructor!==b.constructor)return!1;for(var c in a)if(a.hasOwnProperty(c)){if(!b.hasOwnProperty(c))return!1;if(a[c]!==b[c]){if("object"!=typeof a[c])return!1;if(!Object.equals(a[c],b[c]))return!1}}for(var c in b)if(b.hasOwnProperty(c)&&!a.hasOwnProperty(c))return!1;return!0},PlentyFramework.cssClasses={active:"active"},function(a,b){b.partials.Error={init:function(c){a(c).find(".close").click(function(){b.partials.Error.hideAll()})},addError:function(b,c){var d=a(c).attr("data-plenty-error-code");a(b).find('[data-plenty-error-code="'+d+'"]').length<=0&&a(b).find(".plentyErrorBoxInner").append(c)},show:function(b){a(b).show()},hideAll:function(){a("#CheckoutErrorPane").hide(),a("#CheckoutErrorPane").find(".plentyErrorBoxInner").html("")}}}(jQuery,PlentyFramework),function(a,b){b.partials.Modal={init:function(a,b){a.on("hidden.bs.modal",function(){b.hide(),b.selector||a.remove()}),b.timeout>0&&(a.on("hide.bs.modal",b.stopTimeout),a.find(".modal-content").hover(function(){b.pauseTimeout()},function(){a.is(".in")&&b.continueTimeout()}))},show:function(a){a.modal("show")},hide:function(a){a.modal("hide")},isModal:function(b){return a(b).filter(".modal").length+a(b).find(".modal").length>0},getModal:function(b){var c=a(b);return c.length>1&&(c=a(b).filter(".modal")||a(b).find(".modal")),c}}}(jQuery,PlentyFramework),function(a){a(document).on("initPartials",function(b,c){a(c).find('[data-toggle="tooltip"]').tooltip({container:"body"})})}(jQuery),function(a,b){b.partials.WaitScreen={show:function(a){a.addClass("in")},hide:function(a){a.removeClass("in")}}}(jQuery,PlentyFramework),function(a,b){b.service("AddressDoctorService",function(c){function d(b){var c=!0;return b=b||"[data-plenty-address-doctor]",a(b).filter("[data-plenty-address-doctor]:visible").each(function(b,d){var f=new e(d),g=a(d).attr("data-plenty-address-doctor").replace(/\s/g,"").split(",");f.isValid(g)||(c=!1)}),c}function e(c){function d(a){return j()?!0:(k=new f(m.getFormValues()),l=a,e(),1==k.getAddresses().length)}function e(){a(".suggestion-list").remove();for(var b=!1,c=0;c\n {{#values}}\n
  • \n \n {{.}}\n \n
  • \n {{/values}}\n',TemplateCache["addressSuggestions/postFinder.html"]='{{#addresses}}\n
    \n
    \n \n
    \n
    \n{{/addresses}}\n',TemplateCache["error/errorMessage.html"]='
    \n Code {{code}}:\n {{{message}}}\n
    \n',TemplateCache["error/errorPopup.html"]='
    \n \n
    \n
    \n
    \n',TemplateCache["modal/modal.html"]='\n',TemplateCache["waitscreen/waitscreen.html"]='
    ',function(a,b){"object"==typeof exports&&exports&&"string"!=typeof exports.nodeName?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):(a.Mustache={},b(Mustache))}(this,function(a){function b(a){return"function"==typeof a}function c(a){return p(a)?"array":typeof a}function d(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function e(a,b){return null!=a&&"object"==typeof a&&b in a}function f(a,b){return q.call(a,b)}function g(a){return!f(r,a)}function h(a){return String(a).replace(/[&<>"'\/]/g,function(a){return s[a]})}function i(b,c){function e(){if(r&&!s)for(;q.length;)delete o[q.pop()];else q=[];r=!1,s=!1}function f(a){if("string"==typeof a&&(a=a.split(u,2)),!p(a)||2!==a.length)throw new Error("Invalid tags: "+a);h=new RegExp(d(a[0])+"\\s*"),i=new RegExp("\\s*"+d(a[1])),m=new RegExp("\\s*"+d("}"+a[1]))}if(!b)return[];var h,i,m,n=[],o=[],q=[],r=!1,s=!1;f(c||a.tags);for(var y,z,A,B,C,D,E=new l(b);!E.eos();){if(y=E.pos,A=E.scanUntil(h))for(var F=0,G=A.length;G>F;++F)B=A.charAt(F),g(B)?q.push(o.length):s=!0,o.push(["text",B,y,y+1]),y+=1,"\n"===B&&e();if(!E.scan(h))break;if(r=!0,z=E.scan(x)||"name",E.scan(t),"="===z?(A=E.scanUntil(v),E.scan(v),E.scanUntil(i)):"{"===z?(A=E.scanUntil(m),E.scan(w),E.scanUntil(i),z="&"):A=E.scanUntil(i),!E.scan(i))throw new Error("Unclosed tag at "+E.pos);if(C=[z,A,y,E.pos],o.push(C),"#"===z||"^"===z)n.push(C);else if("/"===z){if(D=n.pop(),!D)throw new Error('Unopened section "'+A+'" at '+y);if(D[1]!==A)throw new Error('Unclosed section "'+D[1]+'" at '+y)}else"name"===z||"{"===z||"&"===z?s=!0:"="===z&&f(A)}if(D=n.pop())throw new Error('Unclosed section "'+D[1]+'" at '+E.pos);return k(j(o))}function j(a){for(var b,c,d=[],e=0,f=a.length;f>e;++e)b=a[e],b&&("text"===b[0]&&c&&"text"===c[0]?(c[1]+=b[1],c[3]=b[3]):(d.push(b),c=b));return d}function k(a){for(var b,c,d=[],e=d,f=[],g=0,h=a.length;h>g;++g)switch(b=a[g],b[0]){case"#":case"^":e.push(b),f.push(b),e=b[4]=[];break;case"/":c=f.pop(),c[5]=b[2],e=f.length>0?f[f.length-1][4]:d;break;default:e.push(b)}return d}function l(a){this.string=a,this.tail=a,this.pos=0}function m(a,b){this.view=a,this.cache={".":this.view},this.parent=b}function n(){this.cache={}}var o=Object.prototype.toString,p=Array.isArray||function(a){return"[object Array]"===o.call(a)},q=RegExp.prototype.test,r=/\S/,s={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},t=/\s*/,u=/\s+/,v=/\s*=/,w=/\s*\}/,x=/#|\^|\/|>|\{|&|=|!/;l.prototype.eos=function(){return""===this.tail},l.prototype.scan=function(a){var b=this.tail.match(a);if(!b||0!==b.index)return"";var c=b[0];return this.tail=this.tail.substring(c.length),this.pos+=c.length,c},l.prototype.scanUntil=function(a){var b,c=this.tail.search(a);switch(c){case-1:b=this.tail,this.tail="";break;case 0:b="";break;default:b=this.tail.substring(0,c),this.tail=this.tail.substring(c)}return this.pos+=b.length,b},m.prototype.push=function(a){return new m(a,this)},m.prototype.lookup=function(a){var c,d=this.cache;if(d.hasOwnProperty(a))c=d[a];else{for(var f,g,h=this,i=!1;h;){if(a.indexOf(".")>0)for(c=h.view,f=a.split("."),g=0;null!=c&&gi;++i)g=void 0,e=a[i],f=e[0],"#"===f?g=this.renderSection(e,b,c,d):"^"===f?g=this.renderInverted(e,b,c,d):">"===f?g=this.renderPartial(e,b,c,d):"&"===f?g=this.unescapedValue(e,b):"name"===f?g=this.escapedValue(e,b):"text"===f&&(g=this.rawValue(e)),void 0!==g&&(h+=g);return h},n.prototype.renderSection=function(a,c,d,e){function f(a){return g.render(a,c,d)}var g=this,h="",i=c.lookup(a[1]);if(i){if(p(i))for(var j=0,k=i.length;k>j;++j)h+=this.renderTokens(a[4],c.push(i[j]),d,e);else if("object"==typeof i||"string"==typeof i||"number"==typeof i)h+=this.renderTokens(a[4],c.push(i),d,e);else if(b(i)){if("string"!=typeof e)throw new Error("Cannot use higher-order sections without the original template");i=i.call(c.view,e.slice(a[3],a[5]),f),null!=i&&(h+=i)}else h+=this.renderTokens(a[4],c,d,e);return h}},n.prototype.renderInverted=function(a,b,c,d){var e=b.lookup(a[1]);return!e||p(e)&&0===e.length?this.renderTokens(a[4],b,c,d):void 0},n.prototype.renderPartial=function(a,c,d){if(d){var e=b(d)?d(a[1]):d[a[1]];return null!=e?this.renderTokens(this.parse(e),c,d,e):void 0}},n.prototype.unescapedValue=function(a,b){var c=b.lookup(a[1]);return null!=c?c:void 0},n.prototype.escapedValue=function(b,c){var d=c.lookup(b[1]);return null!=d?a.escape(d):void 0},n.prototype.rawValue=function(a){return a[1]},a.name="mustache.js",a.version="2.1.3",a.tags=["{{","}}"];var y=new n;a.clearCache=function(){return y.clearCache()},a.parse=function(a,b){return y.parse(a,b)},a.render=function(a,b,d){if("string"!=typeof a)throw new TypeError('Invalid template! Template should be a "string" but "'+c(a)+'" was given as the first argument for mustache#render(template, view, partials)');return y.render(a,b,d)},a.to_html=function(c,d,e,f){var g=a.render(c,d,e);return b(f)?void f(g):g},a.escape=h,a.Scanner=l,a.Context=m,a.Writer=n}),function(a){function b(a,b,c,d){a.on(b,function(a){return i.push(a),c.apply(null,d)}),"complete"===document.readyState&&"ready"===b&&c.apply(null,d)}function c(b){var c=a(b);c.is('input[type="checkbox"]')&&c.on("change",function(){c.is(":checked")?c.trigger("check"):c.trigger("uncheck")}),c.is('input[type="radio"]')&&c.on("change",function(){var b=c.attr("name");a('input[type="radio"][name="'+b+'"]').each(function(b,c){var d=a(c);d.is(":checked")?d.trigger("check"):d.trigger("uncheck")})})}function d(a,b){for(var c=/^(([\w]+):)?([\w]+)\.([\w]+)(\((.*)\))?$/,d=a.split(";"),e=[],f=0;f0)for(var j=h[6].match(/(['][^']+['])|([\w-]+)|(["][^"]+["])/g),k=0;k=c&&g.services.hasOwnProperty(i)){PlentyFramework.prototype.hasOwnProperty(i)||e(g.services[i],2,d),f.push(PlentyFramework.prototype[i]);continue}if(1>=c&&g.directives.hasOwnProperty(i)){PlentyFramework.directives.hasOwnProperty(i)||e(g.directives[i],1,d),f.push(PlentyFramework.directives[i]);continue}console.error('Cannot inject dependency "'+i+'": Object not found.')}else console.error("Cyclic dependency injection: "+d.join(" -> ")+" -> "+i)}3==c?PlentyFramework.factories[b.name]=b.setup.apply(null,f):2==c?PlentyFramework.prototype[b.name]=b.setup.apply(null,f):1==c&&(PlentyFramework.directives[b.name]=b.setup.apply(null,f))}var f="1.0.9",g={factories:{},services:{},directives:{}};PlentyFramework=function(){};var h=null;PlentyFramework.getInstance=function(){return h=h||new PlentyFramework},PlentyFramework.version=function(){function a(a){for(var b=f.split("."),c=a.split("."),d=0;dparseInt(c[d]))return 1}return 0}return{get:function(){return f},equals:function(b){return 0==a(b)},compare:a}}(),PlentyFramework.partials={},PlentyFramework.globals={},PlentyFramework.setGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?(console.error('Global variable "'+a+'" already exists and cannot be overridden.'),null):(PlentyFramework.globals[a]=b,PlentyFramework.globals[a])},PlentyFramework.getGlobal=function(a,b){return PlentyFramework.globals.hasOwnProperty(a)?PlentyFramework.globals[a]:b},PlentyFramework.directives={},PlentyFramework.directive=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.directives[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.prototype.bindDirectives=function(e){e=e||"html",a(e).find("[data-plenty]").each(function(e,f){var g=d(a(f).attr("data-plenty"),a(f));if(!(g.length<=0)){c(f);for(var e=0;e=0;c--)if(a==i[c].type)return i[c];return null},PlentyFramework.pushEvent=function(a){i.push(a)},PlentyFramework.service=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.services[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.factories={},PlentyFramework.factory=function(a,b,c){return"string"!=typeof a?void console.error("Type mismatch: Expect first parameter to be a 'string', '"+typeof a+"' given."):"function"!=typeof b?void console.error("Type mismatch: Expect second parameter to be a 'function', '"+typeof b+"' given."):(c=c||[],void(g.factories[a]={name:a,dependencies:c,setup:b}))},PlentyFramework.compileTemplate=function(a,b){return b=b||{},b.translate=function(){return function(a,b){return b(PlentyFramework.translate(a))}},Mustache.render(TemplateCache[a],b)},PlentyFramework.scriptPath="",PlentyFramework.Strings={},PlentyFramework.loadLanguageFile=function(b){a.ajax({url:PlentyFramework.scriptPath+b,dataType:"json"}).done(function(a){PlentyFramework.Strings=a})},PlentyFramework.translate=function(a,b){var c;return PlentyFramework.Strings.hasOwnProperty(a)?c=PlentyFramework.Strings[a]:(c=a,console.warn('No translation found for "'+c+'".')),b&&(c=Mustache.render(c,b)),c},PlentyFramework.compile=function(){for(var a in g.factories)PlentyFramework.factories.hasOwnProperty(a)||e(g.factories[a],3);for(var b in g.services)PlentyFramework.prototype.hasOwnProperty(b)||e(g.services[b],2);for(var c in g.directives)PlentyFramework.directives.hasOwnProperty(c)||e(g.directives[c],1);for(var d=document.getElementsByTagName("SCRIPT"),f=d.length-1;f>=0;f--){var h=d[f].src.match(/(.*)\/(.*)\.js(\?\S*)?$/);if(h){PlentyFramework.scriptPath=h[1];break}}}}(jQuery),function(a,b){b.directive("Authentication",function(c){function d(d){b.getRecentEvent().preventDefault(),c.customerLogin(a(d))}return{login:d}},["AuthenticationService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Basket",function(c){function d(d){b.getRecentEvent().preventDefault();var e={},f=a(d),g=f.parents("form");e.BasketItemItemID=g.find('[name="ArticleID"]').val(),e.BasketItemPriceID=g.find('[name="SYS_P_ID"]').val(),e.BasketItemQuantity=g.find('[name="ArticleQuantity"]').val(),e.BasketItemBranchID=g.find('[name="source_category"]').val();var h=g.find('[name^="ArticleAttribute"]'),i=[];a.each(h,function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&i.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=i.length&&(e.BasketItemAttributesList=i),c.addItem([e])}function e(b,c){var d=a(b),e=d.parent().find("input"),f=parseInt(e.attr("maxlength"))||5,g=parseInt(e.val())+c,h=d.parents("[data-basket-item-id]").length>0;if(h){(g+"").length<=f&&g>=0&&e.val(g);var i=d.data("timeout");i&&window.clearTimeout(i),i=window.setTimeout(function(){e.trigger("change")},1e3),d.data("timeout",i)}else(g+"").length<=f&&g>=1&&e.val(g)}function f(b,d){c.setItemQuantity(b,parseInt(a(d).val())).fail(function(){var e=c.getItem(b);a(d).val(e.BasketItemQuantity)})}return{addBasketItem:d,changeItemQuantity:e,setItemQuantity:f}},["BasketService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Checkout",function(a){function b(b){a.setMethodOfPayment(b)}function c(b){a.confirmAtrigaPaymax(b)}return{setMethodOfPayment:b,confirmAtrigaPaymax:c}},["CheckoutService"])}(jQuery,PlentyFramework),function(a,b){b.directive("MobileDropdown",function(c){function d(){a(window).on("orientationchange sizeChange",function(){a("input").is(":focus")||(e(k),e(l))})}function e(b,c){for(var d,e=0;e0?window.location.assign(a(c).attr("href")):window.location.assign(c))}function e(a){c.goToID(a)}return{to:d,toCheckoutTab:e}},["MediaSizeService","NavigatorService"])}(jQuery,PlentyFramework),function(a,b){b.directive("Tab",function(c){function d(b){a(b).tab("show")}function e(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).addLabel(a)}function f(a,b,c){j[c]||(j[c]=new h),j[c].getTab(b)||j[c].addTab(b),j[c].getTab(b).setContent(a)}function g(a,d,e){c.isInterval(e)&&(b.getRecentEvent().preventDefault(),j[d]&&j[d].getTab(a)&&j[d].showTab(a))}function h(){function b(a){return g[a]=new i(a),g[a]}function c(b){var c=0;if(f)c=parseInt(f.getContent().parent().css("zIndex")),f.hide(),f.getContent().parent().css("zIndex",c-1);else{for(var d in g)if(g[d].getContent()){var h=parseInt(g[d].getContent().parent().css("zIndex"));(0==c||c>h)&&(c=h),g[d].hide()}for(var d in g)g[d].getContent()&&g[d].getContent().parent().css("zIndex",c-1);a(window).on("sizeChange",e)}f=g[b],f.getContent().parent().css("zIndex",c),f.show()}function d(a){return g[a]}function e(){for(var a in g)g[a].getContent()&&g[a].show();f=null}var f,g={};return{addTab:b,showTab:c,getTab:d,resetTabs:e}}function i(a){function b(){return j}function c(a){return i.push(a),this}function d(a){return h=a,this}function e(){return h}function f(){for(var a=0;a0&&(a(document).scrollTop()>100?x(z,"addClass","visible"):x(z,"removeClass","visible"))})}function g(){e.showWaitscreen()}function h(a){e.hideWaitscreen(a)}function i(b){a(b).owlCarousel({navigation:!0,navigationText:!1,slideSpeed:1e3,paginationSpeed:1e3,singleItem:!0,autoPlay:6e3,stopOnHover:!0,afterMove:function(b){a(b).find('[data-plenty-rel="lazyload"]').trigger("appear")}})}function j(b,d,e){var f=a(b),g=0,h={},i=f.find('[data-plenty-rel="equal-target"]').length>0?f.find('[data-plenty-rel="equal-target"]'):f.children();e!==!0&&y.push(b);for(var j=i.length;j>=0;j--)h=a(i[j]),h.css("height",""),h.outerHeight(!0)>g&&(g=h.outerHeight(!0));(!d||c.isInterval(d))&&i.height(g)}function k(b){var c=a(b);c.click(function(){return a("html, body").animate({scrollTop:0},400),!1}),a.inArray(c,z)&&z.push(c)}function l(b,c){var d=a(b);d.lazyload({effect:c}),d.is("img")&&d.on("loaded",function(){d.css("display","inline-block")})}function m(b){console.log(b);var c=a(b),d=c.parent();d.addClass("animating"),c.siblings("ul").slideToggle(200,function(){d.is(".open")?d.removeClass("open"):d.addClass("open"),c.siblings("ul").removeAttr("style"),d.removeClass("animating")})}function n(b,c){var d=a(b),e=a(d.attr("data-plenty-rel"));if(d.is('input[type="radio"]')){var f=a('input[type="radio"][name="'+d.attr("name")+'"]'),g=!c||"checked"==c;f.change(function(){var b=a(this);e.parents('[data-plenty-rel="equal-target"]').css("height","auto"),b.is(":checked")&&b[0]===d[0]&&1==g?e.slideDown(400,function(){w()}):e.slideUp(400,function(){w()})})}else d.click(function(){d.addClass("animating"),e.slideToggle(400,function(){d.removeClass("animating"),d.toggleClass("active"),w()})})}function o(b,c){r(a(b),c,"slideDown")}function p(b,c){r(a(b),c,"slideUp")}function q(b,c){r(a(b),c,"slideToggle")}function r(a,b,c){b=b||400,a.parents('[data-plenty-rel="equal-target"]').css("height","auto"),a[c](b,function(){w()})}function s(b,c){var e=a(b),f=e.find('[data-plenty-rel="social-switch"]');e.append(''),f.is("off, on")||f.addClass("off"),f.on("click",function(){f.hasClass("off")&&("tooltip"==e.attr("data-toggle")&&e.tooltip("destroy"),f.removeClass("off").addClass("on"),e.find('[data-plenty-rel="social-placeholder"]').hide(),e.find(".social-container").append(d.getSocialService(c)))})}function t(d,e,f){var g=a(e);if(g.parents(".navbar-main").length>0){var h=g.children("span");return b.directives.MobileDropdown.slideDropdown(h),!0}if(e&&d&&(!f||c.isInterval(f))){var i=b.getRecentEvent();return i&&i.preventDefault(),g.toggleClass(d),!1}}function u(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).addClass(d),!1}}function v(d,e,f){if(e&&d&&(!f||c.isInterval(f))){var g=b.getRecentEvent();return g&&g.preventDefault(),a(e).removeClass(d),!1}}function w(){for(var a=y.length-1;a>=0;a--)j(y[a],"",!0)}function x(a,b,c){for(var d=a.length-1;d>=0;d--)a[d][b](c)}var y=[],z=[];return{initUIWindowEvents:f,showWaitscreen:g,hideWaitscreen:h,addContentPageSlider:i,equalHeight:j,initToTop:k,initLazyload:l,initSlideToggle:n,slideDown:o,slideUp:p,slideToggle:q,toggleHideShow:m,toggleSocialShare:s,toggleClass:t,addClass:u,removeClass:v}},["MediaSizeService","SocialShareService","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.directive("Validator",function(a){function b(b,c){return a.validate(b,c)}return{validate:b}},["ValidationService"])}(jQuery,PlentyFramework),function(a,b){b.factory("APIFactory",function(c,d){function e(){b.getGlobal("LoginSession")&&(l&&clearTimeout(l),l=setTimeout(function(){a(window).trigger("login-expired"),"Checkout"===b.getGlobal("PageDesign")&&d.prepare().setTitle(b.translate("Your session has expired.")).setContent(b.translate("Please log in again to continue shopping.")).setLabelDismiss(null).setLabelConfirm(b.translate("OK")).onConfirm(function(){window.location.assign("/")}).onDismiss(function(){window.location.assign("/")}).show()},b.getGlobal("LoginSessionExpiration")))}function f(b){try{var d=a.parseJSON(b.responseText);c.printErrors(d.error.error_stack)}catch(e){c.throwError(b.status,b.statusText)}}function g(b,d,g,h,i){return h||c.showWaitScreen(),a.ajax(b,{type:"GET",data:d,dataType:"json",async:!i,error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function h(b,d,g,h){var i={type:"POST",dataType:"json",error:function(a){g||f(a)}};return d&&d.isFile?(i.cache=d.cache,i.processData=d.processData,i.data=d.data,i.contentType=!1):(i.data=JSON.stringify(d),i.contentType="application/json"),h||c.showWaitScreen(),a.ajax(b,i).always(function(){h||c.hideWaitScreen(),e()})}function i(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"PUT",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function j(b,d,g,h){return h||c.showWaitScreen(),a.ajax(b,{type:"DELETE",data:JSON.stringify(d),dataType:"json",contentType:"application/json",error:function(a){g||f(a)}}).always(function(){h||c.hideWaitScreen(),e()})}function k(){return a.Deferred().resolve()}var l=null;return a(document).ready(function(){e()}),{get:g,post:h,put:i,"delete":j,idle:k}},["UIFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a){a.factory("CMSFactory",function(a){function b(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/container_"+b.toLowerCase()+"/",c)}return{from:d}}function c(b,c){function d(d){return a.get("/rest/"+d.toLowerCase()+"/"+b.toLowerCase()+"/",c)}return{from:d}}function d(b){return a.get("/rest/categoryview/categorycontentbody/?categoryID="+b)}return{getContainer:b,getParams:c,getCategoryContent:d}},["APIFactory"])}(PlentyFramework),function(a){a.factory("CheckoutFactory",function(b,c,d){function e(){return l}function f(a){return m&&l||g(!0),a?$.extend(!0,{},l):m}function g(a){return b.get("/rest/checkout/",null,!1,!1,a).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function h(){return b.put("/rest/checkout",m).done(function(a){a?(l=a.data,m=new e):d.throwError(0,'Could not receive checkout data [GET "/rest/checkout/" receives null value]')})}function i(b){return c.getContainer("checkout"+b).from("checkout").done(function(c){$('[data-plenty-checkout-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function j(b){return c.getCategoryContent(b).done(function(c){$('[data-plenty-checkout-catcontent="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}function k(b){return c.getContainer("itemview"+b).from("itemview").done(function(c){$('[data-plenty-itemview-template="'+b+'"]').each(function(b,d){$(d).html(c.data[0]),a.getInstance().bindDirectives(d),$(window).trigger("contentChanged")})})}var l,m;return{getCheckout:f,setCheckout:h,loadCheckout:g,reloadContainer:i,reloadCatContent:j,reloadItemContainer:k}},["APIFactory","CMSFactory","UIFactory"])}(PlentyFramework),function(a,b){b.factory("ModalFactory",function(){function c(a){return PlentyFramework.partials.Modal.isModal(a)}function d(a){return new e(a)}function e(d){function e(a){return t.title=a,this}function f(a){return t.cssClass=a,this}function g(a){return t.content=a,this}function h(a){return t.labelConfirm=a,this}function i(a){return t.labelDismiss=a,this}function j(a){return t.onConfirm=a,this}function k(a){return t.onDismiss=a,this}function l(a){return t.container=a,this}function m(a){return t.timeout=a,this}function n(){if(t.selector)u=a(t.selector);else{u=c(t.content)?PlentyFramework.partials.Modal.getModal(t.content):a(PlentyFramework.compileTemplate("modal/modal.html",t)),a(t.container).append(u);var b=a(t.content).filter("script");b.length>0&&b.each(function(b,c){var d=document.createElement("script");d.type="text/javascript",d.innerHTML=a(c).text(),a(t.container).append(d)})}PlentyFramework.partials.Modal.init(u,t),u.find('[data-plenty-modal="confirm"]').click(function(){var a=t.onConfirm();"undefined"==typeof a&&(a=!0),a&&o(!0)}),PlentyFramework.partials.Modal.show(u),t.timeout>0&&p()}function o(a){PlentyFramework.partials.Modal.hide(u),a||t.onDismiss()}function p(){x=t.timeout,y=(new Date).getTime(),v=window.setTimeout(function(){window.clearInterval(w),o()},t.timeout),u.find('[data-plenty-modal="timer"]').text(x/1e3),w=window.setInterval(function(){if(!z){var a=x-(new Date).getTime()+y;a=Math.round(a/1e3),u.find('[data-plenty-modal="timer"]').text(a)}},1e3)}function q(){z=!0,x-=(new Date).getTime()-y,window.clearTimeout(v)}function r(){z=!1,y=(new Date).getTime(),v=window.setTimeout(function(){o(),window.clearInterval(w)},x)}function s(){window.clearTimeout(v),window.clearInterval(w)}var t=this;t.selector=d,t.title="",t.cssClass="",t.content="",t.labelDismiss=b.translate("Cancel"),t.labelConfirm=b.translate("Confirm"),t.onConfirm=function(){},t.onDismiss=function(){},t.container="body",t.timeout=-1,t.hide=o,t.startTimeout=p,t.stopTimeout=s,t.pauseTimeout=q,t.continueTimeout=r;var u,v,w,x,y,z=!1;return{setTitle:e,setClass:f,setContent:g,setContainer:l,setLabelConfirm:h,setLabelDismiss:i,onConfirm:j,onDismiss:k,setTimeout:m,show:n,hide:o}}return{prepare:d,isModal:c}})}(jQuery,PlentyFramework),function(a,b){b.factory("UIFactory",function(){function c(a,b){d([{code:a,message:b}])}function d(c){(!i||a("body").has(i).length<=0)&&(i=a(b.compileTemplate("error/errorPopup.html")),a("body").append(i),b.partials.Error.init(i)),a.each(c,function(c,d){b.partials.Error.addError(i,a(b.compileTemplate("error/errorMessage.html",d)))}),b.partials.Error.show(i),f(!0)}function e(){return h=h||0,(!g||a("body").has(g).length<=0)&&(g=a(b.compileTemplate("waitscreen/waitscreen.html")),a("body").append(g)),b.partials.WaitScreen.show(g),h++,h}function f(a){return h--,(0>=h||a)&&(h=0,b.partials.WaitScreen.hide(g)),h}var g,h=0,i=null;return{throwError:c,printErrors:d,showWaitScreen:e,hideWaitScreen:f}})}(jQuery,PlentyFramework),Object.equals=function(a,b){if(a===b)return!0;if(!(a instanceof Object&&b instanceof Object))return!1;if(a.constructor!==b.constructor)return!1;for(var c in a)if(a.hasOwnProperty(c)){if(!b.hasOwnProperty(c))return!1;if(a[c]!==b[c]){if("object"!=typeof a[c])return!1;if(!Object.equals(a[c],b[c]))return!1}}for(var c in b)if(b.hasOwnProperty(c)&&!a.hasOwnProperty(c))return!1;return!0},PlentyFramework.cssClasses={active:"active"},function(a,b){b.partials.Error={init:function(c){a(c).find(".close").click(function(){b.partials.Error.hideAll()})},addError:function(b,c){var d=a(c).attr("data-plenty-error-code");a(b).find('[data-plenty-error-code="'+d+'"]').length<=0&&a(b).find(".plentyErrorBoxInner").append(c)},show:function(b){a(b).show()},hideAll:function(){a("#CheckoutErrorPane").hide(),a("#CheckoutErrorPane").find(".plentyErrorBoxInner").html("")}}}(jQuery,PlentyFramework),function(a,b){b.partials.Modal={init:function(a,b){a.on("hidden.bs.modal",function(){b.hide(),b.selector||a.remove()}),b.timeout>0&&(a.on("hide.bs.modal",b.stopTimeout),a.find(".modal-content").hover(function(){b.pauseTimeout()},function(){a.is(".in")&&b.continueTimeout()}))},show:function(a){a.modal("show")},hide:function(a){a.modal("hide")},isModal:function(b){return a(b).filter(".modal").length+a(b).find(".modal").length>0},getModal:function(b){var c=a(b);return c.length>1&&(c=a(b).filter(".modal")||a(b).find(".modal")),c}}}(jQuery,PlentyFramework),function(a){a(document).on("initPartials",function(b,c){a(c).find('[data-toggle="tooltip"]').tooltip({container:"body"})})}(jQuery),function(a,b){b.partials.WaitScreen={show:function(a){a.addClass("in")},hide:function(a){a.removeClass("in")}}}(jQuery,PlentyFramework),function(a,b){b.service("AddressDoctorService",function(c){function d(b){var c=!0;return b=b||"[data-plenty-address-doctor]",a(b).filter("[data-plenty-address-doctor]:visible").each(function(b,d){var f=new e(d),g=a(d).attr("data-plenty-address-doctor").replace(/\s/g,"").split(",");f.isValid(g)||(c=!1)}),c}function e(c){function d(a){return j()?!0:(k=new f(m.getFormValues()),l=a,e(),1==k.getAddresses().length)}function e(){a(".suggestion-list").remove();for(var b=!1,c=0;cc;c++){var d=a.data[c],f=e(d);f?f.HouseNo.push(d.HouseNo):(d.HouseNo=[d.HouseNo],j.push(d))}})}function e(a){for(var b=j.length,c=0;b>c;c++)if(a.Street==j[c].Street&&j.ZIP==j[c].ZIP&&a.City==j[c].City)return j[c];return null}function f(){return j}function g(b){for(var c=[],d=j.length,e=0;d>e;e++){var f=j[e];a.inArray(f[b],c)<0&&c.push(f[b])}return c}function h(a){for(var b=[],c=j.length,d=0;c>d;d++){var e=j[d];(a.Street&&a.Street==e.Street||a.ZIP&&a.ZIP==e.ZIP||a.City&&a.City==e.City)&&b.push(e)}j=b}function i(a){a=parseInt(a);for(var b=j.length,c=0;b>c;c++)for(var d=j[c],e=0;e=f[0]&&a<=f[1])return!0}return!1}var j=[];return d(),{getAddresses:f,getList:g,filter:h,houseNoAllowed:i}}return{validateAddress:d}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("AuthenticationService",function(c,d,e){function f(){var b=a('[data-plenty-checkout="lostPasswordForm"]');if(b.validateForm()){var d=b.getFormValues(),e={Email:d.Email};return c.post("/rest/checkout/lostpassword/",e).done(function(b){1==b.data.IsMailSend&&(a('[data-plenty-checkout="lostPasswordTextContainer"]').hide(),a('[data-plenty-checkout="lostPasswordSuccessMessage"]').show())})}}function g(a){if(a.validateForm()){var b=a.getFormValues(),d={Email:b.loginMail,Password:b.loginPassword};return e.showWaitScreen(),c.post("/rest/checkout/login/",d).done(function(){window.location.assign(a.attr("action"))})}}function h(a){return c.post("/rest/checkout/customerinvoiceaddress/",a).done(function(a){d.getCheckout().CustomerInvoiceAddress=a.data})}function i(){var c=a('[data-plenty-checkout-form="customerRegistration"]');if(c.validateForm()&&b.getInstance().AddressDoctorService.validateAddress()){var d=c.getFormValues();if(d.LoginType=2,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var f in e)e[f]&&d.CustomerPropertiesList.push({PropertyID:f,PropertyValue:e[f]})}return h(d).done(function(){window.location.assign(c.attr("action"))})}}return{resetPassword:f,customerLogin:g,setInvoiceAddress:h,registerCustomer:i}},["APIFactory","CheckoutFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("BasketService",function(c,d,e,f,g){function h(d){d&&c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:d[0].BasketItemItemID,quantity:d[0].BasketItemQuantity},!1,!0).done(function(c){c.data[0].indexOf("form-group")>0?g.prepare().setContent(c.data[0]).setTitle(b.translate("Select order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(j(i(d)),!0):!1}).show():j(d)})}function i(b){var c,d=a('[data-plenty-checkout-form="OrderParamsForm"]'),e={},f="";return d.find('[name^="ParamGroup"]').each(function(){c=this.name.match(/^ParamGroup\[(\d+)]\[(\d+)]$/),b=m(b,c[1],a(this).val(),a(this).val())}),d.find('[name^="ParamValue"]').each(function(){if(e=a(this),f=e.attr("type"),("checkbox"==f&&e.is(":checked")||"radio"==f&&e.is(":checked")||"radio"!=f&&"checkbox"!=f)&&"file"!=f&&"hidden"!=f){var c=e[0].name.match(/^ParamValue\[(\d+)]\[(\d+)]$/);b=m(b,c[1],c[2],e.val())}else if("file"==f)if(e[0].files&&e[0].files.length>0)b=l(e,b);else{var c=e[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/),d=a('input[type="hidden"][name="ParamValue['+c[1]+"]["+c[2]+']"]').val();b=m(b,c[1],c[2],d)}}),b}function j(h){c.post("/rest/checkout/basketitemslist/",h,!0).done(function(){f.loadCheckout().done(function(){var c=a("[name^=ArticleAttribute]"),d={ArticleID:h[0].BasketItemItemID};c&&a("[name^=ArticleAttribute]").each(function(b,c){d[a(c).attr("name")]=a(c).val()}),s(),e.getContainer("ItemViewItemToBasketConfirmationOverlay",d).from("ItemView").done(function(a){var c=b.getGlobal("TimeoutItemToBasketOverlay",5e3),d=g.prepare().setContent(a.data[0]);c>0&&d.setTimeout(c),d.show()})})}).fail(function(a){d.printErrors(JSON.parse(a.responseText).error.error_stack)})}function k(a){c.put("/rest/checkout/basketitemslist/",a).done(function(){f.reloadCatContent(b.getGlobal("basketCatID")),f.loadCheckout().done(function(){s()})})}function l(a,b){var d,e,f=a[0].id,g={},h=[],i={type:"POST",data:{},isFile:!0,cache:!1,dataType:"json",processData:!1,contentType:!1};g[f]=a[0].files,-1==h.indexOf(f)&&h.push(f);for(var j=0,k=h.length;k>j;++j)d=new FormData,e=g[h[j]],d.append("0",e[0],e[0].name),i.data=d,c.post("/rest/checkout/orderparamfile/",i);var l=a[0].name.match(/^ParamValueFile\[(\d+)]\[(\d+)]$/);return m(b,l[1],l[2],g[f][0].name)}function m(b,c,d,e){return c>0&&void 0==b[c]&&(b[c]=a.extend(!0,{},b[0]),b[c].BasketItemOrderParamsList=[]),void 0!=b[c]&&(b[c].BasketItemQuantity=1,void 0==b[c].BasketItemOrderParamsList&&(b[c].BasketItemOrderParamsList=[]),e&&b[c].BasketItemOrderParamsList.push({BasketItemOrderParamID:d,BasketItemOrderParamValue:e})),b}function n(b){var c=a('[data-plenty-basket-item="'+b+'"]');c.modal("show"),c.find('[data-plenty-modal="confirm"]').on("click",function(){var d=p(b),e=[];c.find('select, .PlentyFormContainer.AttrImage > input[type="hidden"]').each(function(b,c){var d=c.name.match(/^ArticleAttribute\[\d+]\[\d+]\[(\d+)]$/);d&&d[1]&&e.push({BasketItemAttributeID:d[1],BasketItemAttributeValueID:a(c).val()})}),0!=e.length&&(d.BasketItemAttributesList=e),k([d])})}function o(d){var e=p(d);e.BasketItemOrderParamsList=[],c.get("/rest/checkout/container_"+"CheckoutOrderParamsList".toLowerCase()+"/",{itemID:e.BasketItemItemID,quantity:e.BasketItemQuantity,basketItemID:d}).done(function(c){g.prepare().setContent(c.data[0]).setTitle(b.translate("Edit order parameters")).setLabelConfirm(b.translate("Save")).onConfirm(function(){return a('[data-plenty-checkout-form="OrderParamsForm"]').validateForm()?(k(i([e])),!0):!1}).show()})}function p(a){for(var b=f.getCheckout().BasketItemsList,c=0;c=0?c.get("/rest/checkout/container_checkoutbasketitemslist/").done(function(c){var d=a("[data-basket-item-id]").parents("ul"),e=d.parents(".panel-body");d.fadeOut(function(){a(this).siblings(":not('[data-plenty-checkout-template]')").remove(),a(this).remove(),e.prepend(a(c.data[0])).hide().fadeIn(function(){b.getInstance().bindDirectives(e)})})}):f.reloadContainer("BasketItemsList"),f.reloadContainer("Totals")),s(),i.resolve()})})}var i=a.Deferred(),j=p(d).BasketItemNameMap[1];return e?h():g.prepare().setTitle(b.translate("Please confirm")).setContent("

    "+b.translate('Do you really want to remove "{{item}}" from your basket?',{item:j})+"

    ").onDismiss(function(){i.reject()}).onConfirm(function(){h()}).setLabelConfirm(b.translate("Delete")).show(),i}function r(d,e){if(0>=e)return q(d);for(var g,h,i=a.Deferred(),j=f.getCheckout().BasketItemsList,k=0;k0&&f.reloadContainer("Totals")}return{addItem:h,removeItem:q,getItem:p,setItemQuantity:r,editItemAttributes:n,editOrderParams:o,addCoupon:t,removeCoupon:u}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("CheckoutService",function(c,d,e,f,g){function h(){f.loadCheckout(!0)}function i(){var b=a('[data-plenty-checkout-form="details"]'),d=b.getFormValues();return f.getCheckout().CheckoutCustomerSign||(f.getCheckout().CheckoutCustomerSign=""),f.getCheckout().CheckoutOrderInfoText||(f.getCheckout().CheckoutOrderInfoText=""),f.getCheckout().CheckoutCustomerSign!==d.CustomerSign&&a(b).find('[name="CustomerSign"]').length>0||f.getCheckout().CheckoutOrderInfoText!==d.OrderInfoText&&a(b).find('[name="OrderInfoText"]').length>0?(f.getCheckout().CheckoutCustomerSign=d.CustomerSign,f.getCheckout().CheckoutOrderInfoText=d.OrderInfoText,f.setCheckout()):c.idle()}function j(d){var e=a('[data-plenty-checkout-form="shippingAddress"]');if(!d&&!e.validateForm())return!1;if(!d&&!b.getInstance().AddressDoctorService.validateAddress(e))return!1;var g=e.getFormValues(),h=a('[name="shippingAddressID"]:checked').val();if(0>h){var i=g;return m(i,f.getCheckout().CustomerShippingAddress)?c.idle():("PACKSTATION"==i.Street?(i.IsPackstation=1,i.PackstationNo=i.HouseNo):"POSTFILIALE"==i.Street&&(i.IsPostfiliale=1,i.PostfilialNo=i.HouseNo),c.post("/rest/checkout/customershippingaddress/",i).done(function(a){f.getCheckout().CheckoutCustomerShippingAddressID=a.data.ID,f.getCheckout().CheckoutShippingCountryID=a.data.CountryID,k()}))}return h==f.getCheckout().CheckoutCustomerShippingAddressID?c.idle():(f.getCheckout().CheckoutCustomerShippingAddressID=h,void k())}function k(){return delete f.getCheckout().CheckoutMethodOfPaymentID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList"),f.reloadContainer("ShippingProfilesList"),2==f.getCheckout().CustomerInvoiceAddress.LoginType&&f.reloadContainer("CustomerShippingAddress"),a("#shippingAdressSelect").modal("hide"),a(".modal-backdrop")&&a(".modal-backdrop").remove()})}function l(){var b=a('[data-plenty-checkout-form="guestRegistration"]'),d=b.getFormValues();if(d.LoginType=1,d.checkout&&d.checkout.customerInvoiceAddress&&d.checkout.customerInvoiceAddress.CustomerProperty){var e=d.checkout.customerInvoiceAddress.CustomerProperty;d.CustomerPropertiesList=d.CustomerPropertiesList||[];for(var g in e)e[g]&&d.CustomerPropertiesList.push({PropertyID:g,PropertyValue:e[g]})}return m(d,f.getCheckout().CustomerInvoiceAddress)?j():c.post("/rest/checkout/customerinvoiceaddress/",d).done(function(a){j().done(f.loadCheckout)})}function m(a,b){for(var c in a)if(a[c]+""!=b[c]+""&&"EmailRepeat"!==c)return!1;return!0}function n(){var b=a('[data-plenty-checkout-form="shippingProfileSelect"]').getFormValues();return f.getCheckout().CheckoutShippingProfileID=b.ShippingProfileID,delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutMethodOfPaymentID,f.setCheckout().done(function(){f.reloadContainer("MethodsOfPaymentList")})}function o(){var b=f.getCheckout().CheckoutMethodOfPaymentID,e=a('input[type="radio"][name="MethodOfPaymentID"][value="'+b+'"]').parent().getFormValues();return c.post("/rest/checkout/preparepayment/",e,!0).done(function(b){if(""!=b.data.CheckoutMethodOfPaymentRedirectURL)document.location.assign(b.data.CheckoutMethodOfPaymentRedirectURL);else if(b.data.CheckoutMethodOfPaymentAdditionalContent){var c=a(b.data.CheckoutMethodOfPaymentAdditionalContent).find('[data-plenty-checkout-form="bankDetails"]').length>0;g.prepare().setContent(b.data.CheckoutMethodOfPaymentAdditionalContent).onConfirm(function(){return c?s():u()}).show()}}).fail(function(b){try{for(var c=a.parseJSON(b.responseText),e=[],g=0;g0&&d.printErrors(e)}catch(h){d.throwError(b.status,b.statusText)}})}function p(c){return c||(c=a('input[name="MethodOfPaymentID"]:checked').val()),f.getCheckout().CheckoutMethodOfPaymentID=c,b.getGlobal("Checkout.AtrigaRequireUserConfirmation")||(f.getCheckout().CheckoutAtrigapaymaxChecked=!0),delete f.getCheckout().CheckoutCustomerShippingAddressID,delete f.getCheckout().CheckoutShippingProfileID,f.setCheckout().done(function(){f.reloadContainer("ShippingProfilesList")})}function q(a){return f.getCheckout().CheckoutAtrigapaymaxChecked=!!a,c.put("/rest/checkout",{CheckoutAtrigapaymaxChecked:!!a})}function r(){e.getContainer("CheckoutPaymentInformationBankDetails").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return s()}).show()})}function s(){var b=a('[data-plenty-checkout-form="bankDetails"]');if(b.validateForm()){var d=b.getFormValues().checkout.customerBankDetails,e={CustomerBankName:d.bankName,CustomerBLZ:d.blz,CustomerAccountNumber:d.accountNo,CustomerAccountOwner:d.accountOwner,CustomerIBAN:d.iban,CustomerBIC:d.bic};return c.post("/rest/checkout/paymentinformationbankdetails/",e).done(function(){f.loadCheckout().done(function(){p(3),f.reloadContainer("MethodsOfPaymentList")})}),!0}return!1}function t(){e.getContainer("CheckoutPaymentInformationCreditCard").from("Checkout").done(function(b){g.prepare().setContent(b.data[0]).onDismiss(function(){a('input[name="MethodOfPaymentID"]').each(function(b,c){a(c).val()==f.getCheckout().CheckoutMethodOfPaymentID?a(c).attr("checked","checked"):a(c).removeAttr("checked")})}).onConfirm(function(){return u()}).show()})}function u(){var b=a('[data-plenty-checkout-form="creditCard"]');if(b.validateForm()){var d=b.getFormValues().checkout.paymentInformationCC,e={Owner:d.owner,Cvv2:d.cvv2,Number:d.number,Year:d.year,Month:d.month,Provider:d.provider};return c.post("/rest/checkout/paymentinformationcreditcard/",e).done(function(){f.loadCheckout()}),!0}return!1}function v(b){if(2==f.getCheckout().CustomerInvoiceAddress.LoginType)var c=a('[data-plenty-checkout-form="shippingAddress"]').getFormValues();else var c=a('[data-plenty-checkout-form="guestRegistration"]').getFormValues();var d={street:c.Street,houseNo:c.HouseNo,ZIP:c.ZIP,city:c.City,postnummer:c.Postnummer,suggestionType:"postfinder"};e.getContainer("CheckoutAddressSuggestionResultsList",d).from("Checkout").done(function(a){g.prepare().setContent(a.data[0]).show()})}function w(){var b=a('[data-plenty-checkout-form="placeOrder"]');if(b.validateForm()){var d=b.getFormValues(),e={TermsAndConditionsCheck:d.termsAndConditionsCheck||0,WithdrawalCheck:d.withdrawalCheck||0,PrivacyPolicyCheck:d.privacyPolicyCheck||0,AgeRestrictionCheck:d.ageRestrictionCheck||0,NewsletterCheck:d.newsletterCheck||0,KlarnaTermsAndConditionsCheck:d.klarnaTermsAndConditionsCheck||0,PayoneDirectDebitMandateCheck:d.payoneDirectDebitMandateCheck||0,PayoneInvoiceCheck:d.payoneInvoiceCheck||0};return c.post("/rest/checkout/placeorder/",e).done(function(a){""!=a.data.MethodOfPaymentRedirectURL?window.location.assign(a.data.MethodOfPaymentRedirectURL):""!=a.data.MethodOfPaymentAdditionalContent?g.prepare().setContent(a.data.MethodOfPaymentAdditionalContent).setLabelDismiss("").onDismiss(function(){window.location.assign(b.attr("action"))}).onConfirm(function(){window.location.assign(b.attr("action"))}).show():window.location.assign(b.attr("action"))})}}return{init:h,setCustomerSignAndInfo:i,registerGuest:l,setShippingProfile:n,saveShippingAddress:j,loadAddressSuggestion:v,preparePayment:o,setMethodOfPayment:p,confirmAtrigaPaymax:q,editBankDetails:r,editCreditCard:t,placeOrder:w}},["APIFactory","UIFactory","CMSFactory","CheckoutFactory","ModalFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("FeedbackService",function(a){function b(){function b(a,b){return e.dateStart=a,e.dateEnd=b,this}function c(b,c,f){var g={ReferenceId:c,FromDate:e.dateStart,ToDate:e.dateEnd,FeedbackType:f||d().COMMENTS_AND_RATINGS};return a.get("/rest/feedback/"+b+"/",g)}var e={dateStart:null,dateEnd:null};return{between:b,"for":c}}function c(){function b(a){return f.Rating=a,this}function c(a){return f.Text=a,this}function d(a,b,c){return f.Author=a,b&&(f.Email=b),c&&(f.CustomerId=c),this}function e(b,c){return a.post("/rest/feedback/"+b+"/",f)}var f={Rating:1,Text:"",Author:"",Email:"",CustomerId:0};return{withRating:b,withComment:c,withAuthor:d,to:e}}function d(){return{COMMENTS_ONLY:"comments_only",RATINGS_ONLY:"ratings_only",COMMENTS_AND_RATINGS:"comments_with_ratings"}}function e(){return{ITEM:"item",CATEGORY:"category",BLOG:"blog"}}return{getFeedbacks:b,addFeedback:c,ArticleTypes:e(),FeedbackTypes:d()}},["APIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("MediaSizeService",function(){function b(){return e&&c(),e}function c(){var b;if(b=window.matchMedia?window.matchMedia("(min-width:1200px)").matches?"lg":window.matchMedia("(min-width:992px)").matches?"md":window.matchMedia("(min-width:768px)").matches?"sm":"xs":a(window).width()>=1200?"lg":a(window).width()>=992?"md":a(window).width()>=768?"sm":"xs",b!=e||"xs"===b){var c=e;e=b,a(window).trigger("sizeChange",[e,c])}}function d(a){for(var b=a.replace(/\s/g,"").split(","),c=0;c li'),r=a('[data-plenty-checkout="container"] > div'),u=a('[data-plenty-checkout="next"]'),t=a('[data-plenty-checkout="prev"]'),q.length==r.length&&r.length>0){d.getCheckout();r.hide(),q.each(function(b,c){a(c).addClass("disabled"),a(c).click(function(){a(this).is(".disabled")||j(b)})}),u.attr("disabled","disabled"),u.click(function(){m()}),t.attr("disabled","disabled"),t.click(function(){n()}),window.addEventListener("hashchange",function(){window.location.hash.length>0?o(window.location.hash):j(0)},!1),a.urlParam=function(a){var b=new RegExp("[?&]"+a+"=([^&#]*)").exec(window.location.href);return null==b?null:b[1]||0};var c=a.urlParam("gototab");0==window.location.hash.length&&c&&a('[data-plenty-checkout-id="'+c+'"]').length>0?window.location.hash=c:j(!o(window.location.hash)&&s>=0?s:0),p(),a(window).on("sizeChange",p),a(window).resize(function(){"xs"==b.getInstance().MediaSizeService.interval()&&p()})}}function f(){return s>=0?{id:a(r[s]).attr("data-plenty-checkout-id"),index:s}:null}function g(a){return v.beforeChange.push(a),b.getInstance().NavigatorService}function h(a){return v.afterChange.push(a),b.getInstance().NavigatorService}function i(b,c){var d=!0;if(s>=0||"afterChange"===b){var e=f(),g={index:c,id:a(r[c]).attr("data-plenty-checkout-id")};a.each(v[b],function(a,b){return b(e,g)===!1?(d=!1,!1):void 0})}return d}function j(e,f){var g=s!==e;(!g||f||i("beforeChange",e))&&(s=e,!Object.equals(w[s],d.getCheckout(!0))&&g&&a(r[s]).attr("data-plenty-checkout-content")?(w[s]=d.getCheckout(!0),c.getCategoryContent(a(r[s]).attr("data-plenty-checkout-content")).done(function(c){a(r[s]).html(c.data[0]),k(g),b.getInstance().bindDirectives(r[s]),a(window).trigger("contentChanged")})):k(g))}function k(b){a(r).hide();var c;a(q).each(function(b,d){c=a(d),c.removeClass("disabled active"),c.find('[role="tab"]').attr("aria-selected","false"),s>b?c.addClass("visited"):b==s?(c.addClass("active visited"),c.find('[role="tab"]').attr("aria-selected","true")):b>s&&!c.is(".visited")&&c.addClass("disabled")}),p(),0>=s?t.attr("disabled","disabled"):t.removeAttr("disabled"),s+1==q.length?u.attr("disabled","disabled"):u.removeAttr("disabled"),a(r[s]).show(),s>0?window.location.hash=a(r[s]).attr("data-plenty-checkout-id"):window.location.hash.length>0&&(window.location.hash=""),b&&i("afterChange",s)}function l(a){j(a.index,!0)}function m(){s0&&j(s-1)}function o(b){return"next"==b?(m(),!0):"prev"==b?(n(),!0):(b=b.replace("#",""),a(r).each(function(c,d){return a(d).attr("data-plenty-checkout-id")==b?(j(c),!0):void 0}),!1)}function p(){var b=q.length;if(!(0>=b)){a(q).removeAttr("style"),a(q).children("span").removeAttr("style"),a(u).removeAttr("style"),a(t).removeAttr("style");var c=a(t).outerWidth()c?a(d).children("span").css({paddingLeft:g+"px",paddingRight:h+"px"}):a(d).children("span").css({paddingLeft:j+"px",paddingRight:k+"px"})})}}var q=[],r=[],s=-1,t={},u={},v={beforeChange:[],afterChange:[]},w=[];return{init:e,getCurrentContainer:f,goTo:j,beforeChange:g,afterChange:h,continueChange:l,next:m,previous:n,goToID:o,fillNavigation:p}},["CMSFactory","CheckoutFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("PostfinderService",function(c,d,e){function f(){var b=a('input[name="Street"]').val();return"PACKSTATION"==b.toUpperCase()||"POSTFILIALE"==b.toUpperCase()}function g(){j={PostfinderItemStreet:a('input[name="Street"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemZIP:a('input[name="ZIP"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemCity:a('input[name="City"]','[data-plenty-checkout-form="shippingAddress"]'),PostfinderItemHouseNo:a('input[name="HouseNo"]','[data-plenty-checkout-form="shippingAddress"]')},j.PostfinderItemStreet.val(""),j.PostfinderItemZIP.val().length>2||j.PostfinderItemCity.val().length>2?c.get("/rest/checkout/shippingaddresspostfinderlist/",{suggestionType:"postfinder",zip:j.PostfinderItemZIP.val(),city:j.PostfinderItemCity.val()}).done(function(c){l=c.data,k=l.length,0==k&&h();for(var e={addresses:[]},f=0;k>f;f++){var g="km",m=l[f].PostfinderItemDistance,n=m/1e3;n=(Math.round(100*n)/100).toFixed(2).replace(".",","),1e3>m&&(n=m,g="m"),e.addresses.push({index:f,dimension:g,type:l[f].PostfinderItemIsPackstation?"Packstation":"Postfiliale",number:l[f].PostfinderItemIsPackstation?l[f].PostfinderItemPackstationNo:l[f].PostfinderItemPostfilialNo,street:l[f].PostfinderItemStreet,houseNo:l[f].PostfinderItemHouseNo,zip:l[f].PostfinderItemZIP,city:l[f].PostfinderItemCity,district:l[f].PostfinderItemDistrict,distance:n,remark:l[f].PostfinderItemRemark})}var o=b.compileTemplate("addressSuggestions/postFinder.html",e);d.prepare().setTitle(b.translate("Packstations and post offices in your area")).setContent(o).setClass("checkout").onConfirm(function(){return j.PostfinderItemCity.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemZIP.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemStreet.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemStreet.attr("id")+'"]').removeClass("has-error").addClass("has-success"),j.PostfinderItemHouseNo.removeClass("has-error").addClass("has-success"),a('label[for="'+j.PostfinderItemHouseNo.attr("id")+'"]').removeClass("has-error").addClass("has-success"),i=a('input[type="radio"][name="postfinder"]:checked').val(),l[i].PostfinderItemIsPackstation?(a(j.PostfinderItemStreet).val("PACKSTATION"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPackstationNo)):(a(j.PostfinderItemStreet).val("POSTFILIALE"),a(j.PostfinderItemHouseNo).val(l[i].PostfinderItemPostfilialNo)),a(j.PostfinderItemStreet).trigger("change"),a(j.PostfinderItemCity).val(l[i].PostfinderItemCity),a(j.PostfinderItemZIP).val(l[i].PostfinderItemZIP),!0}).show()}):h()}function h(){e.throwError(0,b.translate("Please enter a ZIP code and/or a city.")),j.PostfinderItemCity.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemCity.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemZIP.removeClass("has-success").addClass("has-error"),a('label[for="'+j.PostfinderItemZIP.attr("id")+'"]').removeClass("has-success").addClass("has-error"),j.PostfinderItemCity.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")}),j.PostfinderItemZIP.focus(function(){a(this).removeClass("has-error");var b=a(this).attr("id");a(this).closest(".form-group").find('[for="'+b+'"]').removeClass("has-error")})}var i="",j={},k={},l={};return{openPostfinderModal:g,isPackstation:f}},["APIFactory","ModalFactory","UIFactory"])}(jQuery,PlentyFramework),function(a,b){b.service("SocialShareService",function(){function b(a){var b={"facebook-like":'',"facebook-recommend":'',twitter:'',"google-plus":'
    '};return b[a]}function c(){var b=document.location.href,c=a("link[rel=canonical]").attr("href");return c&&c.length>0&&(c.indexOf("http")<0&&(c=document.location.protocol+"//"+document.location.host+c),b=c),b}function d(b){var c=a('meta[name="'+b+'"]').attr("content");return c||""}function e(){var b=d("DC.title"),c=d("DC.creator");return b.length>0&&c.length>0?b+=" - "+c:b=a("title").text(),encodeURIComponent(b)}return"undefined"==typeof socialLangLocale&&(socialLangLocale="en_US"),"undefined"==typeof socialLang&&(socialLang="en"),{getSocialService:b}})}(jQuery,PlentyFramework),function(a,b){b.service("ValidationService",function(){function b(b){return b=a(b),b.is("input")||b.is("select")||b.is("textarea")?b:b.find("input").length>0?b.find("input"):b.find("select").length>0?b.find("select"):b.find("textarea").length>0?b.find("textarea"):null}function c(b){return b.is("input")||b.is("select")||b.is("textarea")?a.trim(b.val()).length>0:(console.error("Validation Error: Cannot validate Text for <"+b.prop("tagName")+">"),!1)}function d(b){var d=/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;return c(b)?d.test(a.trim(b.val())):!1}function e(b){return c(b)?a.isNumeric(a.trim(b.val())):!1}function f(b,c){return a(c).length>0?a.trim(b.val())==a.trim(a(c).val()):a.trim(b.val())==c}function g(a){return a.is(":visible")}function h(a){return a.is(":enabled")}function i(i,j){var k,l,m,n,o,p,q,r,s,t,u,v=a(i);j=j||"has-error";var w=[],x=!1;v.find("[data-plenty-validate], :required").each(function(i,y){s=a(y).attr("data-plenty-validate"),l=b(y),t=s?s:"text",t=t.split(",");for(var i=0,z=l.length;z>i;i++){if(k=a(l[i]),u=k.attr("type"),!g(k)||!h(k))return;if(m=t[i].trim()||t[0].trim(),n=!1,k.is("input")&&"radio"!=u&&"checkbox"!=u||k.is("textarea"))switch(m){case"text":n=!c(k);break;case"mail":n=!d(k);break;case"number":n=!e(k);break;case"value":n=!f(k,a(y).attr("data-plenty-validation-value"));break;case"none":break;default:console.error('Form validation error: unknown validate property: "'+s+'"')}else if(!k.is("input")||"radio"!=u&&"checkbox"!=u){if(!k.is("select"))return void console.error("Form validation error: "+a(y).prop("tagName")+" does not contain an form element");n=""==k.val()||"-1"==k.val()}else{if(o=k.attr("name"),p=v.find('input[name="'+o+'"]:checked').length,"radio"==u)q=1,r=1;else{var A=new Function("return "+s)()||{min:1,max:1};q=A.min,r=A.max}n=q>p||p>r}n&&(x=!0,w.push(k),l.length>1?(k.addClass(j),v.find('label[for="'+k.attr("id")+'"]').addClass(j)):a(y).addClass(j))}}),v.on("validationFailed",function(){var b=50,c=v.find("."+j).first(),d=c.offset().top,e=a("html, body");v.parents(".modal").length>0?(e=v.parents(".modal").find(".modal-body"), d=e.scrollTop()-(e.offset().top-c.offset().top)):v.is(".modal")&&(e=v.find(".modal-body"),d=e.scrollTop()-(e.offset().top-c.offset().top)),(d-bwindow.pageYOffset+window.innerHeight)&&e.animate({scrollTop:d-b})}),x&&(v.find("."+j).each(function(c,d){k=a(b(d)),k.on("focus click",function(){var b=a(d);b.removeClass(j),v.find('label[for="'+a(this).attr("id")+'"]').removeClass(j)})}),v.trigger("validationFailed",[w]));var y=v.attr("data-plenty-callback");if(!x&&y&&"submit"!=y&&"function"==typeof window[y]){var z={};return v.find("input, textarea, select").each(function(){"checkbox"==a(this).attr("type")?z[a(this).attr("name")]=a(this).is(":checked"):z[a(this).attr("name")]=a(this).val()}),window[y](z),!1}return!x}return{validate:i}}),a.fn.validateForm=function(){return b.getInstance().ValidationService.validate(this)},a.fn.getFormValues=function(){function b(b,c){var e=b.match(/^([^\[]+)(.*)/);if(e[2]){var f,g=/\[([^\]]+)]/g,h=[];for(h[0]=e[1];null!==(f=g.exec(e[2]));)h.push(f[1]);for(var i=h.length-1;i>=0;i--){var j={};j[h[i]]=c,c=j}d=a.extend(!0,d,c)}else d[e[1]]=c}var c=this,d={};return c.find("input, select, textarea").each(function(d,e){if(a(e).attr("name"))if("checkbox"==a(e).attr("type")){var f=[];a(c).find('[name="'+a(e).attr("name")+'"]:checked').each(function(b,c){f.push(a(c).val())}),b(a(e).attr("name"),f)}else"radio"==a(e).attr("type")?a(e).is(":checked")&&b(a(e).attr("name"),a(e).val()):b(a(e).attr("name"),a(e).val())}),d}}(jQuery,PlentyFramework),PlentyFramework.compile();var plenty=PlentyFramework.getInstance();jQuery(document).ready(function(){plenty.bindDirectives()}); -//# sourceMappingURL=plentymarketsCMStools-1.0.8.min.js.map \ No newline at end of file +//# sourceMappingURL=plentymarketsCMStools-1.0.9.min.js.map \ No newline at end of file diff --git a/dist/plentymarketsCMStools-1.0.8.min.js.map b/dist/plentymarketsCMStools-1.0.9.min.js.map similarity index 99% rename from dist/plentymarketsCMStools-1.0.8.min.js.map rename to dist/plentymarketsCMStools-1.0.9.min.js.map index d8a4c62..4218f30 100644 --- a/dist/plentymarketsCMStools-1.0.8.min.js.map +++ b/dist/plentymarketsCMStools-1.0.9.min.js.map @@ -1,8 +1,8 @@ { "version": 3, - "file": "plentymarketsCMStools-1.0.8.min.js", + "file": "plentymarketsCMStools-1.0.9.min.js", "sources": [ - "plentymarketsCMStools-1.0.8.js" + "plentymarketsCMStools-1.0.9.js" ], "names": [ "TemplateCache", @@ -929,6 +929,6 @@ ], "mappings": ";;;;;;;;AAAA,GAAIA,iBAEJA,eAAc,yCAA2C,gMAUzDA,cAAc,sCAAwC,gsBA4BtDA,cAAc,2BAA6B,kMAM3CA,cAAc,yBAA2B,qRASzCA,cAAc,oBAAsB,qoCAgCpCA,cAAc,8BAAgC,iEAE9C,SAAyBC,EAAOC,GAA6B,gBAAVC,UAAoBA,SAAmC,gBAAnBA,SAAQC,SAAqBF,EAAQC,SAAiC,kBAATE,SAAqBA,OAAOC,IAAKD,QAAQ,WAAWH,IAAcD,EAAOM,YAAYL,EAAQK,YAAaC,KAAK,SAAyBC,GAA0K,QAASC,GAAWC,GAAQ,MAAuB,kBAATA,GAAoB,QAASC,GAAQC,GAAK,MAAOC,GAAQD,GAAK,cAAeA,GAAI,QAASE,GAAaC,GAAQ,MAAOA,GAAOC,QAAQ,8BAA8B,QAAQ,QAASC,GAAYL,EAAIM,GAAU,MAAY,OAALN,GAAwB,gBAANA,IAAgBM,IAAYN,GAAyC,QAASO,GAAWC,EAAGL,GAAQ,MAAOM,GAAWC,KAAKF,EAAGL,GAA4B,QAASQ,GAAaR,GAAQ,OAAOI,EAAWK,EAAWT,GAAgG,QAASU,GAAWV,GAAQ,MAAOW,QAAOX,GAAQC,QAAQ,aAAa,SAAuBW,GAAG,MAAOC,GAAUD,KAAgH,QAASE,GAAcC,EAASC,GAA4G,QAASC,KAAa,GAAGC,IAASC,EAAU,KAAMC,EAAOC,cAAcC,GAAOF,EAAOG,WAAYH,KAAUF,IAAO,EAAMC,GAAS,EAAmD,QAASK,GAAYC,GAA+F,GAAtD,gBAAhBA,KAAyBA,EAAcA,EAAcC,MAAMC,EAAQ,KAAO7B,EAAQ2B,IAAuC,IAAvBA,EAAcJ,OAAW,KAAM,IAAIO,OAAM,iBAAiBH,EAAeI,GAAa,GAAIC,QAAO/B,EAAa0B,EAAc,IAAI,QAAQM,EAAa,GAAID,QAAO,OAAO/B,EAAa0B,EAAc,KAAKO,EAAe,GAAIF,QAAO,OAAO/B,EAAa,IAAI0B,EAAc,KAAjrB,IAAIV,EAAS,QAAS,IAA2Nc,GAAaE,EAAaC,EAAjPC,KAAgBX,KAAcF,KAAcF,GAAO,EAAUC,GAAS,CAAslBK,GAAYR,GAAMvB,EAASuB,KAAmF,KAA7E,GAAsCkB,GAAMC,EAAKC,EAAMC,EAAIC,EAAMC,EAA7DC,EAAQ,GAAIC,GAAQ1B,IAA4DyB,EAAQE,OAAM,CAAyD,GAAxDR,EAAMM,EAAQG,IAAIP,EAAMI,EAAQI,UAAUf,GAAwB,IAAI,GAAIgB,GAAE,EAAEC,EAAYV,EAAMf,OAASyB,EAAFD,IAAgBA,EAAGR,EAAID,EAAMW,OAAOF,GAAMrC,EAAa6B,GAAMjB,EAAO4B,KAAK1B,EAAOD,QAAaF,GAAS,EAAKG,EAAO0B,MAAM,OAAOX,EAAIH,EAAMA,EAAM,IAAIA,GAAO,EAAW,OAANG,GAAWpB,GAAc,KAAIuB,EAAQS,KAAKpB,GAAc,KAAuV,IAAjVX,GAAO,EAAKiB,EAAKK,EAAQS,KAAKC,IAAQ,OAAOV,EAAQS,KAAKE,GAAmB,MAAPhB,GAAYC,EAAMI,EAAQI,UAAUQ,GAAUZ,EAAQS,KAAKG,GAAUZ,EAAQI,UAAUb,IAA6B,MAAPI,GAAYC,EAAMI,EAAQI,UAAUZ,GAAgBQ,EAAQS,KAAKI,GAASb,EAAQI,UAAUb,GAAcI,EAAK,KAASC,EAAMI,EAAQI,UAAUb,IAAkBS,EAAQS,KAAKlB,GAAc,KAAM,IAAIH,OAAM,mBAAmBY,EAAQG,IAA6D,IAAxDL,GAAOH,EAAKC,EAAMF,EAAMM,EAAQG,KAAKrB,EAAO0B,KAAKV,GAAiB,MAAPH,GAAmB,MAAPA,EAAYF,EAASe,KAAKV,OAAY,IAAU,MAAPH,EAAW,CAA4B,GAA3BI,EAAYN,EAASV,OAAUgB,EAAY,KAAM,IAAIX,OAAM,qBAAqBQ,EAAM,QAAQF,EAAO,IAAGK,EAAY,KAAKH,EAAM,KAAM,IAAIR,OAAM,qBAAqBW,EAAY,GAAG,QAAQL,OAAsB,SAAPC,GAAsB,MAAPA,GAAmB,MAAPA,EAAYhB,GAAS,EAAoB,MAAPgB,GAAYX,EAAYY,GAAmC,GAA3BG,EAAYN,EAASV,MAAqB,KAAM,IAAIK,OAAM,qBAAqBW,EAAY,GAAG,QAAQC,EAAQG,IAAK,OAAOW,GAAWC,EAAajC,IAAS,QAASiC,GAAajC,GAAkD,IAAI,GAApBgB,GAAMkB,EAA5BC,KAA8CZ,EAAE,EAAEa,EAAUpC,EAAOD,OAASqC,EAAFb,IAAcA,EAAGP,EAAMhB,EAAOuB,GAAMP,IAAqB,SAAXA,EAAM,IAAakB,GAA0B,SAAfA,EAAU,IAAaA,EAAU,IAAIlB,EAAM,GAAGkB,EAAU,GAAGlB,EAAM,KAAQmB,EAAeT,KAAKV,GAAOkB,EAAUlB,GAAQ,OAAOmB,GAAe,QAASH,GAAWhC,GAAyF,IAAI,GAAlBgB,GAAMqB,EAArEC,KAAoBC,EAAUD,EAAiB3B,KAAsCY,EAAE,EAAEa,EAAUpC,EAAOD,OAASqC,EAAFb,IAAcA,EAAmB,OAAhBP,EAAMhB,EAAOuB,GAAUP,EAAM,IAAI,IAAI,IAAI,IAAI,IAAIuB,EAAUb,KAAKV,GAAOL,EAASe,KAAKV,GAAOuB,EAAUvB,EAAM,KAAM,MAAM,KAAI,IAAIqB,EAAQ1B,EAASV,MAAMoC,EAAQ,GAAGrB,EAAM,GAAGuB,EAAU5B,EAASZ,OAAO,EAAEY,EAASA,EAASZ,OAAO,GAAG,GAAGuC,CAAa,MAAM,SAAQC,EAAUb,KAAKV,GAAQ,MAAOsB,GAAa,QAASnB,GAAQzC,GAAQR,KAAKQ,OAAOA,EAAOR,KAAKsE,KAAK9D,EAAOR,KAAKmD,IAAI,EAA4iB,QAASoB,GAAQC,EAAKC,GAAezE,KAAKwE,KAAKA,EAAKxE,KAAK0E,OAAOC,IAAI3E,KAAKwE,MAAMxE,KAAK4E,OAAOH,EAA2qB,QAASI,KAAS7E,KAAK0E,SAA3uK,GAAII,GAAeC,OAAOC,UAAUC,SAAa3E,EAAQ4E,MAAM5E,SAAS,SAAyBH,GAAQ,MAAqC,mBAA9B2E,EAAe/D,KAAKZ,IAAiVW,EAAWwB,OAAO0C,UAAUG,KAA0ElE,EAAW,KAA4EI,GAAW+D,IAAI,QAAQC,IAAI,OAAOC,IAAI,OAAOC,IAAI,SAASC,IAAI,QAAQC,IAAI,UAAqI9B,EAAQ,MAAUxB,EAAQ,MAAUyB,EAAS,OAAWC,EAAQ,QAAYH,EAAM,oBAAi/FT,GAAQ+B,UAAU9B,IAAI,WAAe,MAAmB,KAAZlD,KAAKsE,MAAWrB,EAAQ+B,UAAUvB,KAAK,SAAc5C,GAAI,GAAI6E,GAAM1F,KAAKsE,KAAKoB,MAAM7E,EAAI,KAAI6E,GAAqB,IAAdA,EAAMC,MAAU,MAAM,EAAG,IAAInF,GAAOkF,EAAM,EAAwE,OAArE1F,MAAKsE,KAAKtE,KAAKsE,KAAKsB,UAAUpF,EAAOqB,QAAQ7B,KAAKmD,KAAK3C,EAAOqB,OAAcrB,GAAQyC,EAAQ+B,UAAU5B,UAAU,SAAmBvC,GAAI,GAA+B6E,GAA3BC,EAAM3F,KAAKsE,KAAKuB,OAAOhF,EAAU,QAAO8E,GAAO,IAAI,GAAGD,EAAM1F,KAAKsE,KAAKtE,KAAKsE,KAAK,EAAG,MAAM,KAAK,GAAEoB,EAAM,EAAG,MAAM,SAAQA,EAAM1F,KAAKsE,KAAKsB,UAAU,EAAED,GAAO3F,KAAKsE,KAAKtE,KAAKsE,KAAKsB,UAAUD,GAA8B,MAAvB3F,MAAKmD,KAAKuC,EAAM7D,OAAc6D,GAAgHnB,EAAQS,UAAUxB,KAAK,SAAcgB,GAAM,MAAO,IAAID,GAAQC,EAAKxE,OAAOuE,EAAQS,UAAUc,OAAO,SAAgBC,GAAM,GAAyBnD,GAArB8B,EAAM1E,KAAK0E,KAAgB,IAAGA,EAAMsB,eAAeD,GAAOnD,EAAM8B,EAAMqB,OAAU,CAA8C,IAA7C,GAAiBE,GAAMN,EAAnBO,EAAQlG,KAAiBmG,GAAU,EAAYD,GAAQ,CAAC,GAAGH,EAAKK,QAAQ,KAAK,EAAoD,IAAjDxD,EAAMsD,EAAQ1B,KAAKyB,EAAMF,EAAK7D,MAAM,KAAKyD,EAAM,EAAe,MAAP/C,GAAa+C,EAAMM,EAAMpE,QAAW8D,IAAQM,EAAMpE,OAAO,IAAEsE,EAAUzF,EAAYkC,EAAMqD,EAAMN,KAAQ/C,EAAMA,EAAMqD,EAAMN,UAAgB/C,GAAMsD,EAAQ1B,KAAKuB,GAAMI,EAAUzF,EAAYwF,EAAQ1B,KAAKuB,EAAM,IAAGI,EAAU,KAAMD,GAAQA,EAAQtB,OAAOF,EAAMqB,GAAMnD,EAAuD,MAA9C1C,GAAW0C,KAAOA,EAAMA,EAAM7B,KAAKf,KAAKwE,OAAa5B,GAAuCiC,EAAOG,UAAUqB,WAAW,WAAsBrG,KAAK0E,UAAUG,EAAOG,UAAUsB,MAAM,SAAe/E,EAASC,GAAM,GAAIkD,GAAM1E,KAAK0E,MAAU5C,EAAO4C,EAAMnD,EAA8E,OAAzD,OAARO,IAAaA,EAAO4C,EAAMnD,GAAUD,EAAcC,EAASC,IAAaM,GAAQ+C,EAAOG,UAAUuB,OAAO,SAAgBhF,EAASiD,EAAKgC,GAAU,GAAI1E,GAAO9B,KAAKsG,MAAM/E,GAAc2E,EAAQ1B,YAAgBD,GAAQC,EAAK,GAAID,GAAQC,EAAM,OAAOxE,MAAKyG,aAAa3E,EAAOoE,EAAQM,EAASjF,IAAWsD,EAAOG,UAAUyB,aAAa,SAAsB3E,EAAOoE,EAAQM,EAASE,GAAuD,IAAI,GAAvB5D,GAAM6D,EAAO/D,EAA3BgE,EAAO,GAAkCvD,EAAE,EAAEa,EAAUpC,EAAOD,OAASqC,EAAFb,IAAcA,EAAGT,EAAMiE,OAAU/D,EAAMhB,EAAOuB,GAAGsD,EAAO7D,EAAM,GAAe,MAAT6D,EAAa/D,EAAM5C,KAAK8G,cAAchE,EAAMoD,EAAQM,EAASE,GAAmC,MAATC,EAAa/D,EAAM5C,KAAK+G,eAAejE,EAAMoD,EAAQM,EAASE,GAAmC,MAATC,EAAa/D,EAAM5C,KAAKgH,cAAclE,EAAMoD,EAAQM,EAASE,GAAmC,MAATC,EAAa/D,EAAM5C,KAAKiH,eAAenE,EAAMoD,GAA0B,SAATS,EAAgB/D,EAAM5C,KAAKkH,aAAapE,EAAMoD,GAA0B,SAATS,IAAgB/D,EAAM5C,KAAKmH,SAASrE,IAAkB+D,SAARjE,IAAkBgE,GAAQhE,EAAM,OAAOgE,IAAQ/B,EAAOG,UAAU8B,cAAc,SAAuBhE,EAAMoD,EAAQM,EAASE,GAAiF,QAASU,GAAU7F,GAAU,MAAO8F,GAAKd,OAAOhF,EAAS2E,EAAQM,GAAhI,GAAIa,GAAKrH,KAAS4G,EAAO,GAAOhE,EAAMsD,EAAQJ,OAAOhD,EAAM,GAA+E,IAAIF,EAAJ,CAAiB,GAAGtC,EAAQsC,GAAQ,IAAI,GAAI0E,GAAE,EAAEhE,EAAYV,EAAMf,OAASyB,EAAFgE,IAAgBA,EAAGV,GAAQ5G,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQ1C,KAAKZ,EAAM0E,IAAId,EAASE,OAAwB,IAAkB,gBAAR9D,IAAiC,gBAARA,IAAiC,gBAARA,GAAkBgE,GAAQ5G,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQ1C,KAAKZ,GAAO4D,EAASE,OAAuB,IAAGxG,EAAW0C,GAAO,CAAC,GAA6B,gBAAnB8D,GAA4B,KAAM,IAAItE,OAAM,iEAAkEQ,GAAMA,EAAM7B,KAAKmF,EAAQ1B,KAAKkC,EAAiBa,MAAMzE,EAAM,GAAGA,EAAM,IAAIsE,GAAqB,MAAPxE,IAAYgE,GAAQhE,OAAWgE,IAAQ5G,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQM,EAASE,EAAkB,OAAOE,KAAQ/B,EAAOG,UAAU+B,eAAe,SAAwBjE,EAAMoD,EAAQM,EAASE,GAAkB,GAAI9D,GAAMsD,EAAQJ,OAAOhD,EAAM,GAAI,QAAIF,GAAOtC,EAAQsC,IAAuB,IAAfA,EAAMf,OAAkB7B,KAAKyG,aAAa3D,EAAM,GAAGoD,EAAQM,EAASE,GAA/F,QAAkH7B,EAAOG,UAAUgC,cAAc,SAAuBlE,EAAMoD,EAAQM,GAAU,GAAIA,EAAJ,CAAoB,GAAI5D,GAAM1C,EAAWsG,GAAUA,EAAS1D,EAAM,IAAI0D,EAAS1D,EAAM,GAAI,OAAU,OAAPF,EAAmB5C,KAAKyG,aAAazG,KAAKsG,MAAM1D,GAAOsD,EAAQM,EAAS5D,GAA3E,SAAmFiC,EAAOG,UAAUiC,eAAe,SAAwBnE,EAAMoD,GAAS,GAAItD,GAAMsD,EAAQJ,OAAOhD,EAAM,GAAI,OAAU,OAAPF,EAAmBA,EAAtB,QAA6BiC,EAAOG,UAAUkC,aAAa,SAAsBpE,EAAMoD,GAAS,GAAItD,GAAMsD,EAAQJ,OAAOhD,EAAM,GAAI,OAAU,OAAPF,EAAmB3C,EAASuH,OAAO5E,GAAtC,QAA8CiC,EAAOG,UAAUmC,SAAS,SAAkBrE,GAAO,MAAOA,GAAM,IAAI7C,EAAS8F,KAAK,cAAc9F,EAASwH,QAAQ,QAAQxH,EAASuB,MAAM,KAAK,KAAM,IAAIkG,GAAc,GAAI7C,EAAO5E,GAASoG,WAAW,WAAsB,MAAOqB,GAAcrB,cAAcpG,EAASqG,MAAM,SAAe/E,EAASC,GAAM,MAAOkG,GAAcpB,MAAM/E,EAASC,IAAOvB,EAASsG,OAAO,SAAgBhF,EAASiD,EAAKgC,GAAU,GAAqB,gBAAXjF,GAAqB,KAAM,IAAIoG,WAAU,wDAA2DvH,EAAQmB,GAAU,kFAAsF,OAAOmG,GAAcnB,OAAOhF,EAASiD,EAAKgC,IAAWvG,EAAS2H,QAAQ,SAAiBrG,EAASiD,EAAKgC,EAASqB,GAAM,GAAIC,GAAO7H,EAASsG,OAAOhF,EAASiD,EAAKgC,EAAU,OAAGtG,GAAW2H,OAAOA,GAAKC,GAAoBA,GAAS7H,EAASuH,OAAOtG,EAAWjB,EAASgD,QAAQA,EAAQhD,EAASsE,QAAQA,EAAQtE,EAAS4E,OAAOA,IAc1vS,SAAUkD,GAiRP,QAASC,GAAmBC,EAAOC,EAAWC,EAAUC,GAEpDH,EAAMI,GAAIH,EAAW,SAAUI,GAG3B,MADAC,GAAW/E,KAAM8E,GACVH,EAASK,MAAO,KAAMJ,KAGL,aAAxBK,SAASC,YAA2C,UAAdR,GAGtCC,EAASK,MAAO,KAAMJ,GAI9B,QAASO,GAAiBC,GAGtB,GAAIX,GAAQF,EAAGa,EAEVX,GAAMY,GAAI,2BAEXZ,EAAMI,GAAI,SAAU,WAGXJ,EAAMY,GAAI,YAEXZ,EAAMa,QAAS,SAIfb,EAAMa,QAAS,aAKtBb,EAAMY,GAAI,wBAEXZ,EAAMI,GAAI,SAAU,WAGhB,GAAIU,GAAad,EAAMe,KAAM,OAE7BjB,GAAG,6BAA+BgB,EAAa,MAAOE,KAAM,SAAU5F,EAAG6F,GAErE,GAAIC,GAASpB,EAAGmB,EACXC,GAAON,GAAI,YAEZM,EAAOL,QAAS,SAIhBK,EAAOL,QAAS,eASpC,QAASM,GAAiBC,EAAOC,GAM7B,IAAM,GAJFC,GAAmB,2CACnBC,EAAmBH,EAAMnH,MAAO,KAChCuH,KAEMpG,EAAI,EAAGA,EAAImG,EAAY3H,OAAQwB,IACzC,CACI,GAAIqG,GAAaF,EAAYnG,GAAGsG,MAEhC,IAAMD,GAKAH,EAAiBpE,KAAMuE,GAA7B,CAMA,GAAIhE,GAAQgE,EAAWhE,MAAO6D,EAE9B,KAAM7D,EAAM,IAAMA,EAAM,GAAG7D,QAAU,EAEjC+H,QAAQC,MAAO,iBAAmBH,EAAa,8BAInD,KAAMhE,EAAM,IAAMA,EAAM,GAAG7D,QAAU,EAEjC+H,QAAQC,MAAO,iBAAmBH,EAAa,0BAFnD,CAMA,GAAII,IACAxB,MAAQ5C,EAAM,IAAM,QACpBqE,QAAQrE,EAAM,GACdsE,OAAQtE,EAAM,GACd0C,UAGJ,IAAO1C,EAAM,IAAMA,EAAM,GAAG7D,OAAS,EAGjC,IAAM,GADFuG,GAAS1C,EAAM,GAAGA,MAAO,yCACnB4B,EAAI,EAAGA,EAAIc,EAAOvG,OAAQyF,IACpC,CACI,GAAI2C,GAAQ7B,EAAOd,GAAGqC,MAChBO,OAAOC,WAAYF,IAIQ,QAAvBA,EAAMG,cAEZN,EAAU1B,OAAO5E,MAAM,GAEM,SAAvByG,EAAMG,cAEZN,EAAU1B,OAAO5E,MAAM,GAEM,QAAvByG,EAAMG,cAEZN,EAAU1B,OAAO5E,KAAM8F,GAIvBQ,EAAU1B,OAAO5E,KAAMyG,EAAMxJ,QAAS,eAAgB,KAhBtDqJ,EAAU1B,OAAO5E,KAAM2G,WAAYF,IAqB/CR,EAAWjG,KAAMsG,KAGrB,MAAOL,GAuNX,QAASY,GAAkBC,EAAWC,EAAgBC,GAElDA,EAAkBA,KAIlB,KAAM,GADFC,MACMpH,EAAI,EAAGA,EAAIiH,EAAUI,aAAa7I,OAAQwB,IACpD,CACI,GAAIsH,GAAaL,EAAUI,aAAarH,EACxC,IAAK0E,EAAE6C,QAASD,EAAYH,GAAoB,EAChD,CAII,GAFAA,EAAgBhH,KAAMmH,GAEjBE,EAAWC,UAAU9E,eAAgB2E,GAC1C,CAEUI,gBAAgBD,UAAU9E,eAAgB2E,IAG5CN,EAAkBQ,EAAWC,UAAUH,GAAa,EAAGH,GAE3DC,EAAqBjH,KAAMuH,gBAAgBD,UAAUH,GACrD,UAGJ,GAAuB,GAAlBJ,GAAuBM,EAAWG,SAAShF,eAAgB2E,GAChE,CAEUI,gBAAgB/F,UAAUgB,eAAgB2E,IAG5CN,EAAkBQ,EAAWG,SAASL,GAAa,EAAGH,GAE1DC,EAAqBjH,KAAMuH,gBAAgB/F,UAAU2F,GACrD,UAGJ,GAAuB,GAAlBJ,GAAuBM,EAAWpB,WAAWzD,eAAgB2E,GAClE,CAEUI,gBAAgBtB,WAAWzD,eAAgB2E,IAG7CN,EAAkBQ,EAAWpB,WAAWkB,GAAa,EAAGH,GAE5DC,EAAqBjH,KAAMuH,gBAAgBtB,WAAWkB,GACtD,UAGJf,QAAQC,MAAO,6BAA+Bc,EAAa,4BAI3Df,SAAQC,MAAO,gCAAkCW,EAAgBS,KAAM,QAAW,OAASN,GAK5E,GAAlBJ,EAEDQ,gBAAgBD,UAAUR,EAAUvE,MAAQuE,EAAUY,MAAM1C,MAAO,KAAMiC,GAEjD,GAAlBF,EAENQ,gBAAgB/F,UAAUsF,EAAUvE,MAAQuE,EAAUY,MAAM1C,MAAO,KAAMiC,GAEjD,GAAlBF,IAENQ,gBAAgBtB,WAAWa,EAAUvE,MAAQuE,EAAUY,MAAM1C,MAAO,KAAMiC,IAjrBlF,GAAIhD,GAAU,QASVoD,GACAC,aACAE,YACAvB,cAQJsB,iBAAkB,YAIlB,IAAII,GAA0B,IAC9BJ,iBAAgBK,YAAc,WAG1B,MADAD,GAAWA,GAAY,GAAIJ,kBAI/BA,gBAAgBtD,QAAU,WAYtB,QAAS4D,GAASA,GAKd,IAAK,GAHDC,GAAe7D,EAAQvF,MAAM,KAC7BqJ,EAAiBF,EAAQnJ,MAAM,KAE1BmB,EAAI,EAAGA,EAAIkI,EAAe1J,OAAQwB,IAEvC,GAAIiI,EAAajI,KAAOkI,EAAelI,IAA4B,MAAtBkI,EAAelI,GAA5D,CAKA,GAAImI,SAASF,EAAajI,IAAMmI,SAASD,EAAelI,IAEpD,MAAO,EAGX,IAAImI,SAASF,EAAajI,IAAMmI,SAASD,EAAelI,IAEpD,MAAO,GAGf,MAAO,GAhCX,OACIoI,IAAK,WACD,MAAOhE,IAEXiE,OAAQ,SAAUC,GACd,MAAqB,IAAdN,EAAQM,IAEnBN,QAASA,MAqCjBN,gBAAgBvE,YAQhBuE,gBAAgBa,WAUhBb,gBAAgBc,UAAY,SAAUC,EAAYlJ,GAE9C,MAAKmI,iBAAgBa,QAAQ5F,eAAgB8F,IAEzClC,QAAQC,MAAO,oBAAsBiC,EAAa,8CAC3C,OAGXf,gBAAgBa,QAAQE,GAAclJ,EAE/BmI,gBAAgBa,QAAQE,KAUnCf,gBAAgBgB,UAAY,SAAUD,EAAYE,GAE9C,MAAKjB,iBAAgBa,QAAQ5F,eAAgB8F,GAItCf,gBAAgBa,QAAQE,GAFpBE,GAUfjB,gBAAgBtB,cAYhBsB,gBAAgBjB,UAAY,SAAUmC,EAAeC,EAAoBxB,GAGrE,MAA8B,gBAAlBuB,OAERrC,SAAQC,MAAO,kEAAqEoC,GAAgB,YAKrE,kBAAvBC,OAERtC,SAAQC,MAAO,qEAAwEqC,GAAqB,aAIhHxB,EAAeA,WAEfG,EAAWpB,WAAWwC,IAClBlG,KAAckG,EACdvB,aAAcA,EACdQ,MAAcgB,MAStBnB,gBAAgB/F,UAAUmH,eAAiB,SAAUC,GAGjDA,EAAcA,GAAe,OAE7BrE,EAAGqE,GAAcC,KAAM,iBAAkBpD,KAAM,SAAU5F,EAAGuF,GAGxD,GAAIa,GAAaL,EAAiBrB,EAAGa,GAAUI,KAAM,eAAiBjB,EAAGa,GAEzE,MAAKa,EAAW5H,QAAU,GAA1B,CAMA8G,EAAiBC,EAEjB,KAAM,GAAIvF,GAAI,EAAGA,EAAIoG,EAAW5H,OAAQwB,IACxC,CACI,GAAIyG,GAAYL,EAAWpG,EAC3B,IAAO0H,gBAAgBtB,WAAWK,EAAAA,WAAoBiB,gBAAgBtB,WAAWzD,eAAgB8D,EAAAA,UACjG,CAEI,GAAI3B,GAAW4C,gBAAgBtB,WAAWK,EAAAA,UAAiBA,EAAUE,OAC9D7B,IAA+B,kBAAZA,GAGE,SAAnB2B,EAAUxB,MAEXH,EAASK,MAAO,KAAMsB,EAAU1B,QAIhCJ,EAAmBD,EAAGa,GAAWkB,EAAUxB,MAAOH,EAAU2B,EAAU1B,QAa1EwB,QAAQC,MAAO,qBAAuBC,EAAUE,OAAS,OAASF,EAAAA,cAMtEF,SAAQC,MAAO,wBAA0BC,EAAAA,cAKrD/B,EAAGU,UAAWK,QAAS,eAAgBsD,GAG3C,IAAI7D,KAEJwC,iBAAgBuB,eAAiB,SAAUpE,GAEvC,GAAIqE,GAAehE,EAAW1G,OAAS,CACvC,KAAMqG,EAEF,MAAOK,GAAWgE,EAIlB,KAAM,GAAIlJ,GAAIkJ,EAAclJ,GAAK,EAAGA,IAEhC,GAAK6E,GAAaK,EAAWlF,GAAGV,KAE5B,MAAO4F,GAAWlF,EAK9B,OAAO,OAIX0H,gBAAgByB,UAAY,SAAUlE,GAElCC,EAAW/E,KAAM8E,IAgKrByC,gBAAgB0B,QAAU,SAAUC,EAAaC,EAAkBjC,GAI/D,MAA4B,gBAAhBgC,OAER9C,SAAQC,MAAO,kEAAqE6C,GAAc,YAKrE,kBAArBC,OAER/C,SAAQC,MAAO,qEAAwE8C,GAAmB,aAI9GjC,EAAeA,WAEfG,EAAWG,SAAS0B,IAChB3G,KAAc2G,EACdhC,aAAcA,EACdQ,MAAcyB,MAWtB5B,gBAAgBD,aAUhBC,gBAAgBrL,QAAU,SAAUkN,EAAaC,EAAkBnC,GAI/D,MAA4B,gBAAhBkC,OAERhD,SAAQC,MAAO,kEAAqE+C,GAAc,YAKrE,kBAArBC,OAERjD,SAAQC,MAAO,qEAAwEgD,GAAmB,aAI9GnC,EAAoCA,WACpCG,EAAWC,UAAU8B,IACjB7G,KAAc6G,EACdlC,aAAcA,EACdQ,MAAc2B,MActB9B,gBAAgB+B,gBAAkB,SAAUvL,EAAUwL,GAUlD,MARAA,GAAiBA,MACjBA,EAAKC,UAAY,WAEb,MAAO,UAAUC,EAAM1G,GAEnB,MAAOA,GAAQwE,gBAAgBiC,UAAWC,MAG3ClN,SAASwG,OAAQ/G,cAAc+B,GAAWwL,IASrDhC,gBAAgBmC,WAAa,GAQ7BnC,gBAAgBoC,WAQhBpC,gBAAgBqC,iBAAmB,SAAUC,GAEzCtF,EAAEuF,MACEC,IAAMxC,gBAAgBmC,WAAaG,EACnCG,SAAU,SACXC,KAAM,SAAUC,GACf3C,gBAAgBoC,QAAUO,KAclC3C,gBAAgBiC,UAAY,SAAUxM,EAAQ4H,GAE1C,GAAIuF,EAgBJ,OAfK5C,iBAAgBoC,QAAQnH,eAAgBxF,GAEzCmN,EAAe5C,gBAAgBoC,QAAQ3M,IAIvCmN,EAAenN,EACfoJ,QAAQgE,KAAM,6BAA+BD,EAAe,OAGzDvF,IAEHuF,EAAe5N,SAASwG,OAAQoH,EAAcvF,IAG3CuF,GASX5C,gBAAgB8C,QAAU,WAGtB,IAAM,GAAInO,KAAWmL,GAAWC,UAEtBC,gBAAgBD,UAAU9E,eAAgBtG,IAG5C2K,EAAkBQ,EAAWC,UAAUpL,GAAU,EAIzD,KAAM,GAAI+M,KAAW5B,GAAWG,SAEtBD,gBAAgB/F,UAAUgB,eAAgByG,IAG5CpC,EAAkBQ,EAAWG,SAASyB,GAAU,EAIxD,KAAM,GAAI3C,KAAae,GAAWpB,WAExBsB,gBAAgBtB,WAAWzD,eAAgB8D,IAG7CO,EAAkBQ,EAAWpB,WAAWK,GAAY,EAK5D,KAAK,GADDgE,GAAUrF,SAASsF,qBAAsB,UACpC1K,EAAIyK,EAAQjM,OAAS,EAAGwB,GAAK,EAAGA,IAAM,CAC3C,GAAI2K,GAAOF,EAAQzK,GAAG4K,IAAIvI,MAAO,0BACjC,IAAMsI,EAAO,CACTjD,gBAAgBmC,WAAac,EAAK,EAClC,WAgFbE,QAcF,SAAUnG,EAAGoG,GAEVA,EAAGrE,UAAW,iBAAkB,SAAUsE,GAMtC,QAASC,GAAOC,GAEZH,EAAG7B,iBAAiBiC,iBACpBH,EAAsBI,cAAezG,EAAGuG,IAP5C,OACID,MAAOA,KAQX,2BAELH,OAAQnD,iBACV,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,SAAU,SAAU2E,GAS9B,QAASC,GAAeJ,GAEpBH,EAAG7B,iBAAiBiC,gBAEpB,IAAII,MACA1G,EAAkBF,EAAGuG,GACrBM,EAAkB3G,EAAM4G,QAAS,OAErCF,GAAgBG,iBAAqBF,EAAWvC,KAAM,sBAAuB0C,MAC7EJ,EAAgBK,kBAAqBJ,EAAWvC,KAAM,qBAAsB0C,MAC5EJ,EAAgBM,mBAAqBL,EAAWvC,KAAM,4BAA6B0C,MACnFJ,EAAgBO,mBAAqBN,EAAWvC,KAAM,4BAA6B0C,KAGnF,IAAII,GAAsBP,EAAWvC,KAAM,8BACvC+C,IAEJrH,GAAEkB,KAAMkG,EAAqB,SAAUE,EAAKf,GAExC,GAAI5I,GAAQ4I,EAAKvI,KAAKL,MAAO,yCACxBA,IAASA,EAAM,IAEhB0J,EAAe5L,MACX8L,sBAA4B5J,EAAM,GAClC6J,2BAA4BxH,EAAGuG,GAAOS,UAKpB,GAAzBK,EAAevN,SAEhB8M,EAAgBa,yBAA2BJ,GAI/CX,EAAcgB,SAAUd,IAI5B,QAASe,GAAoBpB,EAAMqB,GAE/B,GAAI1H,GAAiBF,EAAGuG,GACpBsB,EAAiB3H,EAAMrD,SAASyH,KAAM,SACtCwD,EAAiBrE,SAAUoE,EAAe5G,KAAM,eAAmB,EACnEpG,EAAiB4I,SAAUoE,EAAeb,OAAUY,EAEpDG,EAAe7H,EAAM4G,QAAS,yBAA0BhN,OAAS,CAErE,IAAKiO,EACL,EACUlN,EAAQ,IAAIf,QAAUgO,GAAajN,GAAS,GAE9CgN,EAAeb,IAAKnM,EAGxB,IAAImN,GAAU9H,EAAM8E,KAAM,UAEnBgD,IAEHC,OAAOC,aAAcF,GAGzBA,EAAUC,OAAOE,WAAY,WAEzBN,EAAe9G,QAAS,WACzB,KAEHb,EAAM8E,KAAM,UAAWgD,QAIjBnN,EAAQ,IAAIf,QAAUgO,GAAajN,GAAS,GAE9CgN,EAAeb,IAAKnM,GAKhC,QAASuN,GAAiBC,EAAc/G,GAEpCoF,EAAc0B,gBACVC,EACA5E,SAAUzD,EAAGsB,GAAQ0F,QACvBsB,KAAM,WAGJ,GAAIC,GAAa7B,EAAc8B,QAASH,EACxCrI,GAAGsB,GAAQ0F,IAAKuB,EAAWrB,sBA7FnC,OACIP,cAAoBA,EACpBgB,mBAAoBA,EACpBS,gBAAoBA,KA8FxB,mBACLjC,OAAQnD,iBACX,SAAWhD,EAAGoG,GAEVA,EAAGrE,UAAW,WAAY,SAAU0G,GAQhC,QAASC,GAAoBC,GAEzBF,EAAgBC,mBAAoBC,GAGxC,QAASC,GAAqBC,GAE1BJ,EAAgBG,oBAAqBC,GAZzC,OACIH,mBAAoBA,EACpBE,oBAAqBA,KAYzB,qBACJzC,OAAQnD,iBAcX,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,iBAAkB,SAAU+G,GActC,QAASC,KAEL/I,EAAGiI,QAAS3H,GAAI,+BAAgC,WAEtCN,EAAG,SAAUc,GAAI,YAEnBkI,EAAgBC,GAChBD,EAAgBE,MAK5B,QAASF,GAAgBG,EAAc5I,GAGnC,IAAM,GADF6I,GACM9N,EAAI,EAAGA,EAAI6N,EAAarP,OAAQwB,IAEtC8N,EAAWpJ,EAAGmJ,EAAa7N,IACpBiF,EAEgD,IAA9C6I,EAAS9E,KAAMtE,EAAGO,EAAM8I,SAAWvP,QAChCkG,EAAG,SAAUc,GAAI,YAErBsI,EAASE,YAAa,QACtBtJ,EAAG,QAASuJ,OAAQ,mBAAoBC,IAKtCxJ,EAAG,SAAUc,GAAI,YAEnBsI,EAASE,YAAa,QACtBtJ,EAAG,QAASuJ,OAAQ,mBAAoBC,IAOxD,QAASC,GAAclD,EAAMmD,GAEzB,GAAIxJ,GAAUF,EAAGuG,GACboD,EAAUzJ,EAAMrD,QAKb6M,KAAqBZ,EAAUc,WAAY,WAAgBC,UAAUC,OAAShB,EAAUc,WAAY,aAEjGD,EAAQ7I,GAAI,SAYRZ,EAAMe,KAAM,SAGd0I,EAAQL,YAAa,SAbzBS,EAAwB7J,EAAOyJ,GAGzBzJ,EAAMe,KAAM,SAEd+I,EAAgCL,EAAQM,IAAK/J,OAenDwJ,GAAqBG,UAAUC,OAAShB,EAAUc,WAAY,YAE1DD,EAAQ7I,GAAI,WAEdiJ,EAAwB7J,EAAOyJ,GAE/BK,EAAgCL,KAUxC3J,EAAG,QAASM,GAAI,mBAAoBkJ,GAGxC,QAASO,GAAwBxD,EAAM1J,GAEnC,GAAI8M,GAAU3J,EAAGnD,EAGjBmM,GAAgBE,EAA0B3C,GAGrCvG,EAAE6C,QAAS8G,EAAQ,GAAIT,GAA6B,GAErDA,EAAyBzN,KAAMkO,EAAQ,IAI3CA,EAAQO,SAAU,QAGtB,QAASF,GAAgCzD,GAErC,GAAIrG,GAAQF,EAAGuG,EAGfH,GAAG7B,iBAAiBiC,iBAGpBtG,EAAMiK,IAAK,SACXjK,EAAMI,GAAI,QAAS,SAAU8J,GAEzBA,EAAEC,oBAIV,QAASC,GAAe/D,GAEpB,GAAIrG,GAAcF,EAAGuG,GACjBgE,EAAcrK,EAAMrD,QAInBiM,GAAUc,WAAY,YAEvBW,EAAYL,SAAU,aACtBhK,EAAMsK,SAAU,MAAOC,YAAa,IAAK,WAEhCF,EAAYzJ,GAAI,WAAcd,EAAG,SAAUc,GAAI,WAEhDyJ,EAAYjB,YAAa,QACzBpJ,EAAMsK,SAAU,MAAOE,WAAY,SACnCH,EAAYjB,YAAa,eAIzBiB,EAAYL,SAAU,QACjBlK,EAAE6C,QAAS0H,EAAY,GAAItB,GAAqB,GAEjDA,EAAiBxN,KAAM8O,EAAY,QAOnDvK,EAAG,QAASM,GAAI,mBAAoBkJ,GAGxC,QAASA,GAAYjJ,GAEjByI,EAAgBE,EAA0B3I,GAxK9C,GAAI0I,MAGAC,IAEJ,QACIH,cAAeA,EACfU,aAAeA,EACfa,cAAeA,KAmKnB,sBACLnE,OAAQnD,iBACV,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,WAAY,SAAU4I,EAAkBC,GAQlD,QAASC,GAAIC,GAE2B,MAA/BH,EAAiBI,aAEG,gBAATD,IAA0C,IAArBA,EAAKzM,QAAQ,MAAc2B,EAAG8K,GAAOhR,OAAS,EAE3EmO,OAAO+C,SAASC,OAAQjL,EAAG8K,GAAO7J,KAAM,SAIxCgH,OAAO+C,SAASC,OAAQH,IAKpC,QAASI,GAAeC,GAEpBP,EAAiBQ,OAAQD,GAtB7B,OACIN,GAAeA,EACfK,cAAeA,KAuBnB,mBAAoB,sBACzB/E,OAAQnD,iBACX,SAAWhD,EAAGoG,GAEVA,EAAGrE,UAAW,MAAO,SAAU+G,GAY3B,QAASuC,GAASC,GAEdtL,EAAGsL,GAAcC,IAAK,QAG1B,QAASC,GAAiBtL,EAAOiL,EAAOM,GAE9BC,EAAUD,KAEZC,EAAUD,GAAW,GAAIE,IAGvBD,EAAUD,GAASG,OAAQT,IAE7BO,EAAUD,GAASI,OAAQV,GAG/BO,EAAUD,GAASG,OAAQT,GAAQW,SAAU5L,GAGjD,QAAS6L,GAAe7L,EAAOiL,EAAOM,GAE5BC,EAAUD,KAEZC,EAAUD,GAAW,GAAIE,IAGvBD,EAAUD,GAASG,OAAQT,IAE7BO,EAAUD,GAASI,OAAQV,GAG/BO,EAAUD,GAASG,OAAQT,GAAQa,WAAY9L,GAGnD,QAAS+L,GAAed,EAAOM,EAASV,GAE/BjC,EAAUc,WAAYmB,KAEvB3E,EAAG7B,iBAAiBiC,iBAEbkF,EAAUD,IAAcC,EAAUD,GAASG,OAAQT,IAEtDO,EAAUD,GAASJ,QAASF,IAMxC,QAASQ,KAYL,QAASE,GAAQV,GAGb,MADAe,GAAKf,GAAS,GAAIgB,GAAKhB,GAChBe,EAAKf,GAGhB,QAASE,GAASF,GAEd,GAAIiB,GAAS,CACb,IAAOC,EAGHD,EAAS3I,SAAU4I,EAAUC,aAAazP,SAAS0P,IAAK,WACxDF,EAAUG,OACVH,EAAUC,aAAazP,SAAS0P,IAAK,SAAUH,EAAS,OAG5D,CAEI,IAAM,GAAIb,KAAOW,GAEb,GAAOA,EAAKX,GAAKe,aACjB,CACI,GAAIG,GAAWhJ,SAAUyI,EAAKX,GAAKe,aAAazP,SAAS0P,IAAK,YAC/C,GAAVH,GAA0BA,EAAXK,KAEhBL,EAASK,GAEbP,EAAKX,GAAKiB,OAIlB,IAAM,GAAIjB,KAAOW,GAENA,EAAKX,GAAKe,cAEbJ,EAAKX,GAAKe,aAAazP,SAAS0P,IAAK,SAAUH,EAAS,EAIhEpM,GAAGiI,QAAS3H,GAAI,aAAcoM,GAGlCL,EAAYH,EAAKf,GACjBkB,EAAUC,aAAazP,SAAS0P,IAAK,SAAUH,GAC/CC,EAAUM,OAGd,QAASf,GAAQT,GAEb,MAAOe,GAAKf,GAGhB,QAASuB,KAEL,IAAM,GAAInB,KAAOW,GAENA,EAAKX,GAAKe,cAEbJ,EAAKX,GAAKoB,MAIlBN,GAAY,KAzEhB,GACIA,GADAH,IAGJ,QACIL,OAAWA,EACXR,QAAWA,EACXO,OAAWA,EACXc,UAAWA,GAsEnB,QAASP,GAAKS,GAeV,QAASC,KAEL,MAAO1B,GAGX,QAASW,GAAUgB,GAGf,MADAC,GAAQtR,KAAMqR,GACP7U,KAGX,QAAS+T,GAAYgB,GAGjB,MADAC,GAAWD,EACJ/U,KAGX,QAASqU,KAEL,MAAOW,GAGX,QAASN,KAEL,IAAM,GAAIrR,GAAI,EAAGA,EAAIyR,EAAQjT,OAAQwB,IAEjCyR,EAAQzR,GAAG4O,SAAU,SAGlB+C,IAEHA,EAASN,OAAOzC,SAAU,MAKlC,QAASsC,KAEL,IAAM,GAAIlR,GAAI,EAAGA,EAAIyR,EAAQjT,OAAQwB,IAEjCyR,EAAQzR,GAAGgO,YAAa,SAGrB2D,IAEHA,EAAST,OAAOlD,YAAa,MA1DrC,GAAI2D,GACAF,KACA5B,EAAUyB,CAEd,QACId,SAAYA,EACZE,WAAYA,EACZM,WAAYA,EACZO,MAAYA,EACZF,KAAYA,EACZH,KAAYA,GArJpB,GAAId,KAEJ,QACIL,QAAiBA,EACjBG,gBAAiBA,EACjBO,cAAiBA,EACjBE,cAAiBA,KAoMrB,sBACJ9F,OAAQnD,iBASX,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,KAAM,SAAU4I,EAAkBuC,EAAoBC,GAyBhE,QAASC,KAGLpN,EAAGiI,QAAS3H,GAAI,4BAA6B,WAEzC+M,MAGJrN,EAAGiI,QAAS3H,GAAI,gBAAiB,WAExBgN,EAAgBxT,OAAS,IAErBkG,EAAGU,UAAW6M,YAAc,IAE7BC,EAAmBF,EAAiB,WAAY,WAIhDE,EAAmBF,EAAiB,cAAe,cAUnE,QAASG,KAELN,EAAUM,iBAOd,QAASC,GAAgBC,GAErBR,EAAUO,eAAgBC,GAqB9B,QAASC,GAAsBrH,GAE3BvG,EAAGuG,GAAOsH,aACNC,YAAiB,EACjBC,gBAAiB,EACjBC,WAAiB,IACjBC,gBAAiB,IACjBC,YAAiB,EACjBC,SAAiB,IACjBC,aAAiB,EACjBC,UAAiB,SAAUC,GAEvBtO,EAAGsO,GAAUhK,KAAM,gCAAiCvD,QAAS,aAczE,QAASwN,GAAahI,EAAMiI,EAAYC,GAEpC,GAAIvO,GAAmBF,EAAGuG,GACtBmI,EAAmB,EACnBC,KACAC,EAAmB1O,EAAMoE,KAAM,oCAAqCxK,OAAS,EAAIoG,EAAMoE,KAAM,oCAAuCpE,EAAM2O,UAGzIJ,MAAkB,GAEnBK,EAAuBrT,KAAM8K,EAGjC,KAAM,GAAIjL,GAAIsT,EAAiB9U,OAAQwB,GAAK,EAAGA,IAE3CqT,EAAe3O,EAAG4O,EAAiBtT,IACnCqT,EAAapC,IAAK,SAAU,IAEvBoC,EAAaI,aAAa,GAASL,IAEpCA,EAAYC,EAAaI,aAAa,MAIxCP,GAAc7D,EAAiBf,WAAY4E,KAE7CI,EAAiBI,OAAQN,GAYjC,QAASO,GAAW1I,GAEhB,GAAIrG,GAAQF,EAAGuG,EAEfrG,GAAMgP,MAAO,WAKT,MAHAlP,GAAG,cAAemP,SACd5B,UAAW,GACZ,MACI,IAGJvN,EAAE6C,QAAS3C,EAAOoN,IAErBA,EAAgB7R,KAAMyE,GAW9B,QAASkP,GAAc7I,EAAM8I,GAEzB,GAAInP,GAAQF,EAAGuG,EAEfrG,GAAMoP,UACFD,OAAQA,IAEPnP,EAAMY,GAAI,QAEXZ,EAAMI,GAAI,SAAU,WAEhBJ,EAAMqM,IAAK,UAAW,kBAYlC,QAASgD,GAAgBhJ,GAGrB1E,QAAQ2N,IAAKjJ,EAEb,IAAIrG,GAAcF,EAAGuG,GACjBgE,EAAcrK,EAAMrD,QAExB0N,GAAYL,SAAU,aACtBhK,EAAMsK,SAAU,MAAOC,YAAa,IAAK,WAEhCF,EAAYzJ,GAAI,SAEjByJ,EAAYjB,YAAa,QAIzBiB,EAAYL,SAAU,QAE1BhK,EAAMsK,SAAU,MAAOE,WAAY,SACnCH,EAAYjB,YAAa,eAYjC,QAASmG,GAAiBlJ,EAAMmJ,GAE5B,GAAIxP,GAAiBF,EAAGuG,GACpBoJ,EAAiB3P,EAAGE,EAAMe,KAAM,mBAEpC,IAAKf,EAAMY,GAAI,uBACf,CAEI,GAAI8O,GAAmB5P,EAAG,6BAAiCE,EAAMe,KAAM,QAAa,MAChF4O,GAAoBH,GAAsB,WAAXA,CAEnCE,GAAgBE,OAAQ,WAEpB,GAAIC,GAAQ/P,EAAG/H,KACf0X,GAAe7I,QAAS,oCAAqCyF,IAAK,SAAU,QAEvEwD,EAAMjP,GAAI,aAAgBiP,EAAM,KAAO7P,EAAM,IAA0B,GAApB2P,EAGpDF,EAAeK,UAAW,IAAK,WAE3B3C,MAMJsC,EAAeM,QAAS,IAAK,WAEzB5C,YAQZnN,GAAMgP,MAAO,WAIThP,EAAMgK,SAAU,aAChByF,EAAelF,YAAa,IAAK,WAE7BvK,EAAMoJ,YAAa,aACnBpJ,EAAMgQ,YAAa,UACnB7C,QAMhB,QAAS2C,GAAW3G,EAAQ8G,GAExBC,EAAapQ,EAAGqJ,GAAU8G,EAAU,aAGxC,QAASF,GAAS5G,EAAQ8G,GAEtBC,EAAapQ,EAAGqJ,GAAU8G,EAAU,WAGxC,QAAS1F,GAAapB,EAAQ8G,GAE1BC,EAAapQ,EAAGqJ,GAAU8G,EAAU,eAGxC,QAASC,GAAaC,EAASF,EAAUG,GAErCH,EAAWA,GAAY,IACvBE,EAAQvJ,QAAS,oCAAqCyF,IAAK,SAAU,QACrE8D,EAAQC,GAAiBH,EAAU,WAE/B9C,MA8BR,QAASkD,GAAmBhK,EAAMiK,GAE9B,GAAItQ,GAAUF,EAAGuG,GACbkK,EAAUvQ,EAAMoE,KAAM,oCAG1BpE,GAAMwQ,OAAQ,wCAIRD,EAAQ3P,GAAI,YAEd2P,EAAQvG,SAAU,OAItBuG,EAAQnQ,GAAI,QAAS,WAEZmQ,EAAQE,SAAU,SAGiB,WAA/BzQ,EAAMe,KAAM,gBAEbf,EAAM0Q,QAAS,WAEnBH,EAAQnH,YAAa,OAAQY,SAAU,MAEvChK,EAAMoE,KAAM,0CAA2CkI,OAEvDtM,EAAMoE,KAAM,qBAAsBoM,OAAQxD,EAAmB2D,iBAAkBL,OAuB3F,QAASN,GAAaY,EAAUzH,EAAQ0B,GAEpC,GAAIsF,GAAUrQ,EAAGqJ,EAiBjB,IAAKgH,EAAQvJ,QAAS,gBAAiBhN,OAAS,EAChD,CACI,GAAIoG,GAAQmQ,EAAQxB,SAAU,OAE9B,OADAzI,GAAG1E,WAA2B,eAAE4I,cAAepK,IACxC,EAGX,GAAOmJ,GAAYyH,KAAe/F,GAAYJ,EAAiBf,WAAYmB,IAC3E,CACI,GAAIX,GAAIhE,EAAG7B,gBAOX,OANO6F,IAEHA,EAAE5D,iBAGN6J,EAAQH,YAAaY,IACd,GAIf,QAAS5G,GAAU4G,EAAUzH,EAAQ0B,GAEjC,GAAO1B,GAAYyH,KAAe/F,GAAYJ,EAAiBf,WAAYmB,IAC3E,CACI,GAAIX,GAAIhE,EAAG7B,gBAOX,OANO6F,IAEHA,EAAE5D,iBAGNxG,EAAGqJ,GAASa,SAAU4G,IACf,GAIf,QAASxH,GAAawH,EAAUzH,EAAQ0B,GAEpC,GAAO1B,GAAYyH,KAAe/F,GAAYJ,EAAiBf,WAAYmB,IAC3E,CACI,GAAIX,GAAIhE,EAAG7B,gBAOX,OANO6F,IAEHA,EAAE5D,iBAGNxG,EAAGqJ,GAASC,YAAawH,IAClB,GAQf,QAASzD,KAEL,IAAM,GAAI/R,GAAIwT,EAAuBhV,OAAS,EAAGwB,GAAK,EAAGA,IAErDiT,EAAaO,EAAuBxT,GAAI,IAAI,GAIpD,QAASkS,GAAmBuD,EAAOC,EAAM3Q,GAErC,IAAM,GAAI/E,GAAIyV,EAAMjX,OAAS,EAAGwB,GAAK,EAAGA,IAEpCyV,EAAMzV,GAAG0V,GAAO3Q,GAldxB,GAAIyO,MACAxB,IAEJ,QACIF,mBAAsBA,EACtBK,eAAsBA,EACtBC,eAAsBA,EACtBE,qBAAsBA,EACtBW,YAAsBA,EACtBU,UAAsBA,EACtBG,aAAsBA,EACtBK,gBAAsBA,EACtBO,UAAsBA,EACtBC,QAAsBA,EACtBxF,YAAsBA,EACtB8E,eAAsBA,EACtBgB,kBAAsBA,EACtBL,YAAsBA,EACtBhG,SAAsBA,EACtBZ,YAAsBA,KAmc1B,mBAAoB,qBAAsB,eAC/CnD,OAAQnD,iBACV,SAAUhD,EAAGoG,GAEVA,EAAGrE,UAAW,YAAa,SAAUkP,GAOjC,QAASC,GAAUC,EAAMC,GAErB,MAAOH,GAAkBC,SAAUC,EAAMC,GAN7C,OACIF,SAAUA,KAQd,uBACL/K,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAaVA,EAAGzO,QAAS,aAAc,SAAU0Z,EAAIC,GAiBpC,QAASC,KAECnL,EAAGpC,UAAW,kBAKbwN,GAEHtJ,aAAcsJ,GAGlBA,EAA2BrJ,WAAY,WAEnCnI,EAAGiI,QAASlH,QAAS,iBAEiB,aAAjCqF,EAAGpC,UAAW,eAEfsN,EAAMG,UACDC,SAAUtL,EAAGnB,UAAW,8BACxB+G,WAAY5F,EAAGnB,UAAW,8CAC1B0M,gBAAiB,MACjBC,gBAAiBxL,EAAGnB,UAAW,OAC/B4M,UAAW,WAER5J,OAAO+C,SAASC,OAAQ,OAE3B6G,UAAW,WAER7J,OAAO+C,SAASC,OAAQ,OAE3B0B,QAGVvG,EAAGpC,UAAW,4BAarB,QAAS+N,GAAaC,GAElB,IAEI,GAAIC,GAAejS,EAAEkS,UAAWF,EAAMC,aACtCZ,GAAGc,YAAaF,EAAanQ,MAAMsQ,aAEvC,MAAQhI,GAEJiH,EAAGgB,WAAYL,EAAMM,OAAQN,EAAMO,aAiB3C,QAASC,GAAMhN,EAAKnF,EAAQoS,EAAcC,EAAiBC,GAQvD,MALMD,IAEFrB,EAAGuB,iBAGA5S,EAAEuF,KACLC,GAEI5K,KAAU,MACVoK,KAAU3E,EACVoF,SAAU,OACVoN,OAAWF,EACX7Q,MAAU,SAAUkQ,GAEVS,GAEFV,EAAaC,MAI3Bc,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAkBR,QAASyB,GAAOxN,EAAKR,EAAMyN,EAAcC,GAGrC,GAAIrS,IACAzF,KAAU,OACV6K,SAAU,OACV3D,MAAU,SAAUkQ,GAEVS,GAEFV,EAAaC,IAuBzB,OAlBOhN,IAAQA,EAAKiO,QAEhB5S,EAAO1D,MAAcqI,EAAKrI,MAC1B0D,EAAO6S,YAAclO,EAAKkO,YAC1B7S,EAAO2E,KAAcA,EAAKA,KAC1B3E,EAAO8S,aAAc,IAIrB9S,EAAO2E,KAAcoO,KAAKC,UAAWrO,GACrC3E,EAAO8S,YAAc,oBAGnBT,GAEFrB,EAAGuB,iBAGA5S,EAAEuF,KACLC,EAAKnF,GACPyS,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAiBR,QAAS+B,GAAM9N,EAAKR,EAAMyN,EAAcC,GAQpC,MALMA,IAEFrB,EAAGuB,iBAGA5S,EAAEuF,KACLC,GAEI5K,KAAa,MACboK,KAAaoO,KAAKC,UAAWrO,GAC7BS,SAAa,OACb0N,YAAa,mBACbrR,MAAa,SAAUkQ,GAEbS,GAEFV,EAAaC,MAI3Bc,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAkBR,QAASgC,GAAS/N,EAAKR,EAAMyN,EAAcC,GAQvC,MALMA,IAEFrB,EAAGuB,iBAGA5S,EAAEuF,KACLC,GAEI5K,KAAa,SACboK,KAAaoO,KAAKC,UAAWrO,GAC7BS,SAAa,OACb0N,YAAa,mBACbrR,MAAa,SAAUkQ,GAEbS,GAEFV,EAAaC,MAI3Bc,OAAQ,WAEAJ,GAEFrB,EAAG0B,iBAEPxB,MAUR,QAASiC,KAEL,MAAOxT,GAAEyT,WAAWC,UAxRxB,GAAIlC,GAA2B,IAM/B,OALAxR,GAAGU,UAAWiT,MAAO,WAEjBpC,OAIA7N,IAAQ8O,EACRoB,KAAQZ,EACRa,IAAQP,EACRQ,SAAQP,EACRQ,KAAQP,KAgRZ,YAAa,kBAClBrN,OAAQnD,iBAaV,SAAUoD,GAaPA,EAAGzO,QAAS,aAAc,SAAUqc,GAwBhC,QAASC,GAAcC,EAAe7T,GAGlC,QAAS8T,GAAMC,GAEX,MAAOJ,GAAItQ,IAAK,SAAW0Q,EAAY/R,cAAgB,cAAgB6R,EAAc7R,cAAgB,IAAKhC,GAG9G,OACI8T,KAAMA,GAoBd,QAASE,GAAWH,EAAe7T,GAG/B,QAAS8T,GAAMC,GAEX,MAAOJ,GAAItQ,IAAK,SAAW0Q,EAAY/R,cAAgB,IAAM6R,EAAc7R,cAAgB,IAAKhC,GAGpG,OACI8T,KAAMA,GAWd,QAASG,GAAoBC,GAEzB,MAAOP,GAAItQ,IAAK,sDAAwD6Q,GAxE5E,OACIN,aAAoBA,EACpBI,UAAoBA,EACpBC,mBAAoBA,KAwExB,gBACLtR,iBAaF,SAAUoD,GAePA,EAAGzO,QAAS,kBAAmB,SAAUqc,EAAKQ,EAAKnD,GAkB/C,QAASoD,KAEL,MAAOC,GAQX,QAASC,GAAaC,GAOlB,MALMC,IAAaH,GAEfI,GAAc,GAGXF,EAEI5U,EAAE+U,QAAQ,KAAUL,GAExBG,EASX,QAASC,GAAcnC,GAGnB,MAAOqB,GAAItQ,IAAK,kBAAmB,MAAM,GAAO,EAAOiP,GAClDjN,KAAM,SAAUC,GAENA,GAEH+O,EAAe/O,EAASX,KACxB6P,EAAe,GAAIJ,IAInBpD,EAAGgB,WAAY,EAAG,iFAWlC,QAAS2C,KAGL,MAAOhB,GAAIH,IAAK,iBAAkBgB,GAC7BnP,KAAM,SAAUC,GAENA,GAEH+O,EAAe/O,EAASX,KACxB6P,EAAe,GAAIJ,IAInBpD,EAAGgB,WAAY,EAAG,iFAclC,QAAS4C,GAAiBC,GAGtB,MAAOV,GAAIP,aAAc,WAAaiB,GAAYf,KAAM,YACnDzO,KAAM,SAAUC,GAEb3F,EAAG,mCAAqCkV,EAAY,MAC/ChU,KAAM,SAAU5F,EAAGiL,GAEhBvG,EAAGuG,GAAO4O,KAAMxP,EAASX,KAAK,IAC9BoB,EAAG/C,cAAce,eAAgBmC,GACjCvG,EAAGiI,QAASlH,QAAS,sBAczC,QAASqU,GAAkBC,GAGvB,MAAOb,GAAIF,mBAAoBe,GAC1B3P,KAAM,SAAUC,GAEb3F,EAAG,qCAAuCqV,EAAQ,MAC7CnU,KAAM,SAAU5F,EAAGiL,GAEhBvG,EAAGuG,GAAO4O,KAAMxP,EAASX,KAAK,IAC9BoB,EAAG/C,cAAce,eAAgBmC,GACjCvG,EAAGiI,QAASlH,QAAS,sBAezC,QAASuU,GAAqBJ,GAG1B,MAAOV,GAAIP,aAAc,WAAaiB,GAAYf,KAAM,YACnDzO,KAAM,SAAUC,GAEb3F,EAAG,mCAAqCkV,EAAY,MAC/ChU,KAAM,SAAU5F,EAAGiL,GAEhBvG,EAAGuG,GAAO4O,KAAMxP,EAASX,KAAK,IAC9BoB,EAAG/C,cAAce,eAAgBmC,GACjCvG,EAAGiI,QAASlH,QAAS,sBA7JzC,GAAI2T,GAGAG,CAEJ,QACIF,YAAqBA,EACrBK,YAAqBA,EACrBF,aAAqBA,EACrBG,gBAAqBA,EACrBG,iBAAqBA,EACrBE,oBAAqBA,KAyJzB,aAAc,aAAc,eACjCtS,iBAaF,SAAUhD,EAAGoG,GAQVA,EAAGzO,QAAS,eAAgB,WAcxB,QAAS4d,GAASJ,GAEd,MAAOnS,iBAAgBvE,SAAS6S,MAAMiE,QAASJ,GAQnD,QAAS1D,GAAS+D,GAEd,MAAO,IAAIlE,GAAOkE,GAUtB,QAASlE,GAAOkE,GAoHZ,QAAS9D,GAAU+D,GAGf,MADAC,GAAMD,MAAQA,EACPxd,KAGX,QAAS0d,GAAU7E,GAGf,MADA4E,GAAM5E,SAAWA,EACV7Y,KASX,QAAS+T,GAAYgB,GAGjB,MADA0I,GAAM1I,QAAUA,EACT/U,KAUX,QAAS2Z,GAAiB9E,GAGtB,MADA4I,GAAME,aAAe9I,EACd7U,KAUX,QAAS0Z,GAAiB7E,GAGtB,MADA4I,GAAMG,aAAe/I,EACd7U,KAUX,QAAS4Z,GAAWzR,GAGhB,MADAsV,GAAM7D,UAAYzR,EACXnI,KASX,QAAS6Z,GAAW1R,GAGhB,MADAsV,GAAM5D,UAAY1R,EACXnI,KASX,QAAS6d,GAAcZ,GAGnB,MADAQ,GAAMR,UAAYA,EACXjd,KASX,QAASkQ,GAAYH,GAGjB,MADA0N,GAAM1N,QAAUA,EACT/P,KASX,QAAS0U,KAEL,GAAM+I,EAAMF,SAERO,EAAU/V,EAAG0V,EAAMF,cAGvB,CAGQO,EAFCR,EAASG,EAAM1I,SAENhK,gBAAgBvE,SAAS6S,MAAM0E,SAAUN,EAAM1I,SAI/ChN,EAAGgD,gBAAgB+B,gBAAiB,mBAAoB2Q,IAGtE1V,EAAG0V,EAAMR,WAAYxE,OAAQqF,EAG7B,IAAIhQ,GAAU/F,EAAG0V,EAAM1I,SAAUiJ,OAAQ,SACpClQ,GAAQjM,OAAS,GAElBiM,EAAQ7E,KAAM,SAAU5F,EAAG4a,GAEvB,GAAIrV,GAAgBH,SAASyV,cAAe,SAC5CtV,GAAQjG,KAAY,kBACpBiG,EAAQuV,UAAYpW,EAAGkW,GAAShR,OAChClF,EAAG0V,EAAMR,WAAYxE,OAAQ7P,KAMzCmC,gBAAgBvE,SAAS6S,MAAM+E,KAAMN,EAASL,GAC9CK,EAAQzR,KAAM,iCAAkC4K,MAAO,WAEnD,GAAIoH,GAAQZ,EAAM7D,WAEG,oBAATyE,KAERA,GAAQ,GAGPA,GAED9J,GAAM,KAIdxJ,gBAAgBvE,SAAS6S,MAAM3E,KAAMoJ,GAEhCL,EAAM1N,QAAU,GAEjBuO,IAUR,QAAS/J,GAAMgK,GAEXxT,gBAAgBvE,SAAS6S,MAAM9E,KAAMuJ,GAE/BS,GAEFd,EAAM5D,YASd,QAASyE,KAELE,EAAgBf,EAAM1N,QACtB0O,GAAgB,GAAKC,OAAQC,UAE7B5O,EAAUC,OAAOE,WAAY,WAEzBF,OAAO4O,cAAe9L,GACtByB,KACDkJ,EAAM1N,SAET+N,EAAQzR,KAAM,+BAAgCY,KAAMuR,EAAgB,KACpE1L,EAAW9C,OAAO6O,YAAa,WAE3B,IAAMC,EACN,CACI,GAAIC,GAAmBP,GAAgB,GAAKE,OAAQC,UAAYF,CAChEM,GAAuBC,KAAKC,MAAOF,EAAmB,KACtDjB,EAAQzR,KAAM,+BAAgCY,KAAM8R,KAEzD,KAQP,QAASG,KAELJ,GAAS,EACTN,IAAiB,GAAKE,OAAQC,UAAYF,EAC1CzO,OAAOC,aAAcF,GAQzB,QAASoP,KAELL,GAAY,EACZL,GAAY,GAAKC,OAAQC,UACzB5O,EAAYC,OAAOE,WAAY,WAE3BqE,IACAvE,OAAO4O,cAAe9L,IACvB0L,GAQP,QAASY,KAELpP,OAAOC,aAAcF,GACrBC,OAAO4O,cAAe9L,GApW1B,GAAI2K,GAAQzd,IACZyd,GAAMF,SAAWA,EASjBE,EAAMD,MAAQ,GAEdC,EAAM5E,SAAW,GASjB4E,EAAM1I,QAAU,GAShB0I,EAAMG,aAAezP,EAAGnB,UAAW,UASnCyQ,EAAME,aAAexP,EAAGnB,UAAW,WAUnCyQ,EAAM7D,UAAY,aAWlB6D,EAAM5D,UAAY,aAWlB4D,EAAMR,UAAY,OASlBQ,EAAM1N,QAAU,GAEhB0N,EAAMlJ,KAAkBA,EACxBkJ,EAAMa,aAAkBA,EACxBb,EAAM2B,YAAkBA,EACxB3B,EAAMyB,aAAkBA,EACxBzB,EAAM0B,gBAAkBA,CAExB,IAAIrB,GACA/N,EAAS+C,EACT0L,EAAeC,EACfK,GAAS,CAEb,QACIrF,SAAiBA,EACjBiE,SAAiBA,EACjB3J,WAAiBA,EACjB8J,aAAiBA,EACjBlE,gBAAiBA,EACjBD,gBAAiBA,EACjBE,UAAiBA,EACjBC,UAAiBA,EACjB3J,WAAiBA,EACjBwE,KAAiBA,EACjBH,KAAiBA,GA5IzB,OACIiF,QAASA,EACT8D,QAASA,MA4YlBpP,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAQVA,EAAGzO,QAAS,YAAa,WA2BrB,QAAS0a,GAAYiF,EAAMC,GAEvBpF,IAAemF,KAAMA,EAAME,QAASD,KAUxC,QAASpF,GAAasF,KAIZC,GAAc1X,EAAG,QAAS2X,IAAKD,GAAa5d,QAAU,KAExD4d,EAAa1X,EAAGoG,EAAGrB,gBAAiB,0BACpC/E,EAAG,QAAS0Q,OAAQgH,GACpBtR,EAAG3H,SAASpE,MAAMgc,KAAMqB,IAG5B1X,EAAEkB,KAAMuW,EAAe,SAAUG,EAAK9V,GAGlCsE,EAAG3H,SAASpE,MAAMwd,SAAUH,EAAY1X,EAAGoG,EAAGrB,gBAAiB,0BAA2BjD,OAG9FsE,EAAG3H,SAASpE,MAAMsS,KAAM+K,GAExB3E,GAAgB,GAQpB,QAASH,KAeL,MAbAkF,GAAkBA,GAAmB,IAG/BC,GAAc/X,EAAG,QAAS2X,IAAKI,GAAaje,QAAU,KAExDie,EAAa/X,EAAGoG,EAAGrB,gBAAiB,+BACpC/E,EAAG,QAAS0Q,OAAQqH,IAGxB3R,EAAG3H,SAASuZ,WAAWrL,KAAMoL,GAG7BD,IACOA,EASX,QAAS/E,GAAgBpF,GAarB,MATAmK,MAIwB,GAAnBA,GAA0BnK,KAE3BmK,EAAkB,EAClB1R,EAAG3H,SAASuZ,WAAWxL,KAAMuL,IAE1BD,EA7FX,GACIC,GADAD,EAAkB,EAElBJ,EAAkB,IAEtB,QACIrF,WAAgBA,EAChBF,YAAgBA,EAChBS,eAAgBA,EAChBG,eAAgBA,MAyFzB5M,OAAQnD,iBAUXhG,OAAO2G,OAAS,SAAUsU,EAAGC,GAEzB,GAAKD,IAAMC,EAEP,OAAO,CAEX,MAAOD,YAAajb,SAAakb,YAAalb,SAE1C,OAAO,CAEX,IAAKib,EAAEE,cAAgBD,EAAEC,YAErB,OAAO,CAGX,KAAM,GAAIP,KAAOK,GAEb,GAAMA,EAAEha,eAAgB2Z,GAAxB,CAIA,IAAMM,EAAEja,eAAgB2Z,GAEpB,OAAO,CAEX,IAAKK,EAAEL,KAASM,EAAEN,GAAlB,CAIA,GAA0B,gBAAbK,GAAEL,GAEX,OAAO,CAEX,KAAM5a,OAAO2G,OAAQsU,EAAEL,GAAMM,EAAEN,IAE3B,OAAO,GAIf,IAAM,GAAIA,KAAOM,GAEb,GAAKA,EAAEja,eAAgB2Z,KAAUK,EAAEha,eAAgB2Z,GAE/C,OAAO,CAIf,QAAO,GAGX5U,gBAAgBoV,YAEZC,OAAQ,UAGZ,SAAWrY,EAAGoG,GAGVA,EAAG3H,SAASpE,OAMRgc,KAAM,SAAUiC,GAEZtY,EAAGsY,GAAQhU,KAAM,UAAW4K,MAAO,WAE/B9I,EAAG3H,SAASpE,MAAMke,aAS1BV,SAAU,SAAUS,EAAOxW,GAEvB,GAAI0W,GAAYxY,EAAG8B,GAAQb,KAAM,yBAE5BjB,GAAGsY,GAAQhU,KAAM,4BAA8BkU,EAAY,MAAO1e,QAAU,GAE7EkG,EAAGsY,GAAQhU,KAAM,wBAAyBoM,OAAQ5O,IAQ1D6K,KAAM,SAAU2L,GAEZtY,EAAGsY,GAAQ3L,QAGf4L,QAAS,WACLvY,EAAG,sBAAuBwM,OAC1BxM,EAAG,sBAAuBsE,KAAM,wBAAyB6Q,KAAM,OAKvEhP,OAAQnD,iBACX,SAAUhD,EAAGoG,GAGVA,EAAG3H,SAAS6S,OAOR+E,KAAM,SAAUxV,EAAS6U,GAErB7U,EAAQP,GAAI,kBAAmB,WAE3BoV,EAAMlJ,OACDkJ,EAAMF,UAGP3U,EAAQ4X,WAIX/C,EAAM1N,QAAU,IAEjBnH,EAAQP,GAAI,gBAAiBoV,EAAM2B,aACnCxW,EAAQyD,KAAM,kBAAmBoU,MAAO,WAEpChD,EAAMyB,gBACP,WAEMtW,EAAQC,GAAI,QAEb4U,EAAM0B,sBAUtBzK,KAAM,SAAU9L,GAEZA,EAAQ6U,MAAO,SAOnBlJ,KAAM,SAAU3L,GAEZA,EAAQ6U,MAAO,SAQnBH,QAAS,SAAUJ,GAEf,MAAOnV,GAAGmV,GAAOc,OAAQ,UAAWnc,OAASkG,EAAGmV,GAAO7Q,KAAM,UAAWxK,OAAS,GAQrFkc,SAAU,SAAUb,GAEhB,GAAIO,GAAQ1V,EAAGmV,EAMf,OALKO,GAAM5b,OAAS,IAEhB4b,EAAQ1V,EAAGmV,GAAOc,OAAQ,WAAcjW,EAAGmV,GAAO7Q,KAAM,WAGrDoR,KAKhBvP,OAAQnD,iBACX,SAAWhD,GAGPA,EAAGU,UAAWJ,GAAI,eAAgB,SAAU8J,EAAGuO,GAG3C3Y,EAAG2Y,GAAOrU,KAAM,2BAA4BsM,SACxCsE,UAAW,YAKnB/O,QACJ,SAAWnG,EAAGoG,GAGVA,EAAG3H,SAASuZ,YAMRrL,KAAM,SAAU9L,GAEZA,EAAQqJ,SAAU,OAOtBsC,KAAM,SAAU3L,GAEZA,EAAQyI,YAAa,SAK7BnD,OAAQnD,iBAUX,SAAUhD,EAAGoG,GAEVA,EAAG1B,QAAS,uBAAwB,SAAUsP,GAM1C,QAAS4E,GAAiBC,GAEtB,GAAIC,IAAiB,CAarB,OAZAD,GAAqBA,GAAgB,+BACrC7Y,EAAG6Y,GAAe5C,OAAQ,wCAAyC/U,KAAM,SAAU5F,EAAG6V,GAElF,GAAI4H,GAAiB,GAAIC,GAAe7H,GACpC8H,EAAiBjZ,EAAGmR,GAAOlQ,KAAM,8BAA+BvI,QAAS,MAAO,IAAKyB,MAAO,IAC1F4e,GAAcG,QAASD,KAEzBH,GAAiB,KAKlBA,EAGX,QAASE,GAAe7H,GAkBpB,QAAS+H,GAASC,GAGd,MAAKC,MAEM,GAGXC,EAAiB,GAAIC,GAAaC,EAAMC,iBACxCP,EAAiBE,EAEjBM,IAE4C,GAArCJ,EAAYK,eAAe5f,QAGtC,QAAS2f,KAELzZ,EAAG,oBAAqByY,QAGxB,KAAM,GADFkB,IAAwB,EAClBre,EAAI,EAAGA,EAAI2d,EAAenf,OAAQwB,IAElCse,EAAeX,EAAe3d,GAAIqe,KAEpCJ,EAAMxY,QAAS,oBACf4Y,GAAwB,EAI3BN,GAAYQ,eAAgBC,EAAQC,QAAQ/S,QAAgD,GAArCqS,EAAYK,eAAe5f,QAEnFggB,EAAQC,QAAQzQ,YAAa,aAC7BiQ,EAAMjV,KAAM,cAAgBwV,EAAQC,QAAQ9Y,KAAM,MAAS,MAAOqI,YAAa,aAE/EwQ,EAAQC,QAAQ7P,SAAU;AAC1BqP,EAAMjV,KAAM,cAAgBwV,EAAQC,QAAQ9Y,KAAM,MAAS,MAAOiJ,SAAU,iBAI5E4P,EAAQC,QAAQzQ,YAAa,eAC7BiQ,EAAMjV,KAAM,cAAgBwV,EAAQC,QAAQ9Y,KAAM,MAAS,MAAOqI,YAAa,eAE/EwQ,EAAQC,QAAQ7P,SAAU,aAC1BqP,EAAMjV,KAAM,cAAgBwV,EAAQC,QAAQ9Y,KAAM,MAAS,MAAOiJ,SAAU,cAIpF,QAAS0P,GAAehC,EAAK+B,GAEzB,GAAIK,GAAYX,EAAYY,QAASrC,EAOrC,OALOsC,GAAqBtC,IAExBsC,EAAqBtC,GAAKa,SAGxBqB,EAAQlC,GAKW,GAApBoC,EAAUlgB,QAEXggB,EAAQlC,GAAK5Q,IAAKgT,EAAU,IAE5BF,EAAQlC,GAAKtO,YAAa,aAC1BiQ,EAAMjV,KAAM,cAAgBwV,EAAQlC,GAAK3W,KAAM,MAAS,MAAOqI,YAAa,aAE5EwQ,EAAQlC,GAAK1N,SAAU,eACvBqP,EAAMjV,KAAM,cAAgBwV,EAAQlC,GAAK3W,KAAM,MAAS,MAAOiJ,SAAU,gBAClE,IAIP4P,EAAQlC,GAAKtO,YAAa,eAC1BiQ,EAAMjV,KAAM,cAAgBwV,EAAQlC,GAAK3W,KAAM,MAAS,MAAOqI,YAAa,eAE5EwQ,EAAQlC,GAAK1N,SAAU,aACvBqP,EAAMjV,KAAM,cAAgBwV,EAAQlC,GAAK3W,KAAM,MAAS,MAAOiJ,SAAU,aAEnEyP,GAEFQ,EAAqBL,EAAQlC,GAAMoC,GAEvCF,EAAQlC,GAAKzN,IAAK,SAClB2P,EAAQlC,GAAKwC,SACN,IA5BA,EAiCf,QAASC,GAAwB1Q,EAAS2Q,GAEtCJ,EAAqBI,GAAe/N,KAChCgO,MAAS5Q,EAAQ6Q,YAAY,GAC7BC,KAAS9Q,EAAQ+Q,WAAWD,KAC5BE,IAAShR,EAAQ+Q,WAAWC,IAAMhR,EAAQoF,aAAa,KAI/D,QAASoL,GAAqBxQ,EAASiR,GAEnC,GAAIN,GAAgB3Q,EAAQ1I,KAAM,OAGlCiZ,GAAqBI,GAAiBta,EAAGoG,EAAGrB,gBAAiB,yCAA0C6V,OAAQA,KAE/GP,EAAwB1Q,EAAS2Q,GAEjCta,EAAGiI,QAAS3H,GAAI,aAAc,WAE1B+Z,EAAwB1Q,EAAS2Q,KAIrCJ,EAAqBI,GAAehW,KAAM,wBAAyBpD,KAAM,SAAU5F,EAAGiL,GAGlF,GAAIrG,GAAQF,EAAGuG,GACX1L,EAAQqF,EAAMe,KAAM,qBAExBf,GAAMgP,MAAO,WAGTvF,EAAQ3C,IAAKnM,EAGb,IAAIggB,KACJA,GAAclR,EAAQ1I,KAAM,SAAYpG,EACxCwe,EAAYpD,OAAQ4E,GAGpBpB,QAOR9P,EAAQ9M,SAAS6T,OAAQwJ,EAAqBI,IAGlD,QAASlB,KAEL,MAA+C,eAAtCU,EAAQgB,OAAO9T,MAAM+T,eAAwE,eAAtCjB,EAAQgB,OAAO9T,MAAM+T,cAjKzF,GASI1B,GACAJ,EAVAM,EAAuBvZ,EAAGmR,GAC1B2I,GACAgB,OAASvB,EAAMjV,KAAM,wBACrB0W,IAASzB,EAAMjV,KAAM,qBACrB2W,KAAS1B,EAAMjV,KAAM,sBACrByV,QAASR,EAAMjV,KAAM,0BAErB4V,IAKJ,QACIhB,QAASA,GAyJjB,QAASI,GAAa4B,GAalB,QAAS7E,KAELrC,EAAItQ,IAAK,gDACLyX,eAAgB,gBAChBC,OAAgBF,EAAaJ,OAC7BE,IAAgBE,EAAaF,IAC7BK,KAAgBH,EAAaD,KAC7BK,QAAgBJ,EAAanB,QAC7BwB,QAAgBL,EAAaM,YAC9B,GAAO,GAAO,GAAO9V,KAAM,SAAUC,GAKpC,IAAM,GAFF8V,GAAiB9V,EAASX,KAAKlL,OAEzBwB,EAAI,EAAOmgB,EAAJngB,EAAoBA,IACrC,CACI,GAAIogB,GAAkB/V,EAASX,KAAK1J,GAEhCqgB,EAAUC,EAAYF,EACpBC,GAOFA,EAAQ5B,QAAQte,KAAMigB,EAAgB3B,UALtC2B,EAAgB3B,SAAW2B,EAAgB3B,SAC3C8B,EAAUpgB,KAAMigB,OAYhC,QAASE,GAAYE,GAIjB,IAAM,GAFFC,GAAeF,EAAU/hB,OAEnByF,EAAI,EAAOwc,EAAJxc,EAAkBA,IAE/B,GAAKuc,EAAWhB,QAAUe,EAAUtc,GAAGub,QAAUe,EAAUb,KAAOa,EAAUtc,GAAGyb,KAAOc,EAAWb,MAAQY,EAAUtc,GAAG0b,KAElH,MAAOY,GAAUtc,EAIzB,OAAO,MAIX,QAASma,KAEL,MAAOmC,GAGX,QAAS5B,GAASrC,GAKd,IAAM,GAHFoE,MACAD,EAAeF,EAAU/hB,OAEnBwB,EAAI,EAAOygB,EAAJzgB,EAAkBA,IACnC,CACI,GAAIqgB,GAAUE,EAAUvgB,EACnB0E,GAAE6C,QAAS8Y,EAAQ/D,GAAMoE,GAAY,GAEtCA,EAAQvgB,KAAMkgB,EAAQ/D,IAI9B,MAAOoE,GAGX,QAAS/F,GAAQ4E,GAKb,IAAM,GAHFoB,MACAF,EAAoBF,EAAU/hB,OAExBwB,EAAI,EAAOygB,EAAJzgB,EAAkBA,IACnC,CACI,GAAIqgB,GAAUE,EAAUvgB,IAChBuf,EAAcC,QAAUD,EAAcC,QAAUa,EAAQb,QACtDD,EAAcG,KAAOH,EAAcG,KAAOW,EAAQX,KAClDH,EAAcI,MAAQJ,EAAcI,MAAQU,EAAQV,OAE1DgB,EAAkBxgB,KAAMkgB,GAIhCE,EAAYI,EAGhB,QAASpC,GAAgByB,GAErBA,EAAU7X,SAAU6X,EAIpB,KAAM,GAFFS,GAAeF,EAAU/hB,OAEnBwB,EAAI,EAAOygB,EAAJzgB,EAAkBA,IAI/B,IAAM,GAFFqgB,GAAUE,EAAUvgB,GAEdiE,EAAI,EAAGA,EAAIoc,EAAQ5B,QAAQjgB,OAAQyF,IAC7C,CACI,GAAI2c,GAAQP,EAAQ5B,QAAQxa,GAAGpF,MAAO,IACtC,IAAuB,GAAhB+hB,EAAMpiB,QAAewhB,GAAWY,EAAM,IACtB,GAAhBA,EAAMpiB,QAAewhB,GAAWY,EAAM,IAAMZ,GAAWY,EAAM,GAEhE,OAAO,EAKnB,OAAO,EA3HX,GAAIL,KAIJ,OAFAxF,MAGIqD,aAAgBA,EAChBO,QAAgBA,EAChBhE,OAAgBA,EAChB4D,eAAgBA,GAxMxB,OACIjB,gBAAiBA,KA8TrB,gBACLzS,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAaVA,EAAG1B,QAAS,wBAAyB,SAAUsP,EAAKS,EAAUpD,GAkB1D,QAAS8K,KAGL,GAAIhL,GAAOnR,EAAG,4CAEd,IAAKmR,EAAKiL,eACV,CAEI,GAAIxB,GAASzJ,EAAKqI,gBAEdnZ,GACAgc,MAAOzB,EAAOyB,MAGlB,OAAOrI,GAAIJ,KAAM,+BAAgCvT,GAC5CqF,KAAM,SAAUC,GAEoB,GAA5BA,EAASX,KAAKsX,aAEftc,EAAG,sDAAuDwM,OAC1DxM,EAAG,uDAAwD2M,WAgB/E,QAASlG,GAAe0K,GAEpB,GAAKA,EAAKiL,eACV,CACI,GAAIxB,GAASzJ,EAAKqI,gBAEdnZ,GACAgc,MAAUzB,EAAO2B,UACjBC,SAAU5B,EAAO6B,cAIrB,OADApL,GAAGuB,iBACIoB,EAAIJ,KAAM,wBAAyBvT,GACrCqF,KAAM,WAGHuC,OAAO+C,SAASC,OAAQkG,EAAKlQ,KAAM,cAcnD,QAASyb,GAAmBC,GAGxB,MAAO3I,GAAIJ,KAAM,yCAA0C+I,GACtDjX,KAAM,SAAUC,GAEb8O,EAASE,cAAciI,uBAAyBjX,EAASX,OAarE,QAAS6X,KAEL,GAAI1L,GAAOnR,EAAG,qDAEd,IAAKmR,EAAKiL,gBAAkBhW,EAAG/C,cAAcyZ,qBAAqBlE,kBAClE,CACI,GAAIgC,GAAezJ,EAAKqI,eAGxB,IAFAoB,EAAOmC,UAAY,EAEdnC,EAAO/F,UACL+F,EAAO/F,SAASmI,wBAChBpC,EAAO/F,SAASmI,uBAAuBC,iBAC9C,CACI,GAAIC,GAA4BtC,EAAO/F,SAASmI,uBAAuBC,gBACvErC,GAAOuC,uBAAyBvC,EAAOuC,0BAEvC,KAAM,GAAIC,KAAYF,GAEbA,EAAcE,IAEfxC,EAAOuC,uBAAuB1hB,MAC1B4hB,WAAeD,EACfE,cAAeJ,EAAcE,KAM7C,MAAOV,GAAmB9B,GACrBlV,KAAM,WAEHuC,OAAO+C,SAASC,OAAQkG,EAAKlQ,KAAM,cAnInD,OACIkb,cAAmBA,EACnB1V,cAAmBA,EACnBiW,kBAAmBA,EACnBG,iBAAmBA,KAmIvB,aAAc,kBAAmB,eAEtC1W,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAgBVA,EAAG1B,QAAS,gBAAiB,SAAUsP,EAAK3C,EAAImD,EAAKC,EAAUnD,GAsB3D,QAAS3K,GAAe4W,GAGbA,GAGHvJ,EAAItQ,IAAK,4BAA8B,0BAA0BrB,cAAgB,KAEzEmb,OAAUD,EAAQ,GAAGxW,iBACrB0W,SAAUF,EAAQ,GAAGrW,qBACtB,GAAO,GAAOxB,KAAM,SAAUgY,GAG5BA,EAAK1Y,KAAK,GAAG3G,QAAS,cAAiB,EAExCiT,EAAMG,UACDzF,WAAY0R,EAAK1Y,KAAK,IACtB0M,SAAUtL,EAAGnB,UAAW,4BACxB2M,gBAAiBxL,EAAGnB,UAAW,SAC/B4M,UAAW,WAGR,MAAK7R,GAAG,iDAAkDoc,gBAGtDuB,EAAYC,EAAiBL,KAGtB,IAIA,IAGd5Q,OAILgR,EAAYJ,KAa5B,QAASK,GAAiBC,GAGtB,GAGIlgB,GAHAmgB,EAAkB9d,EAAG,iDACrB+P,KACAgO,EAAkB,EAwCtB,OApCAD,GAAgBxZ,KAAM,wBAAyBpD,KAAM,WAEjDvD,EAAoB1F,KAAK+F,KAAKL,MAAO,gCACrCkgB,EAAoBG,EAAoBH,EAAmBlgB,EAAM,GAAIqC,EAAG/H,MAAO+O,MAAOhH,EAAG/H,MAAO+O,SAIpG8W,EAAgBxZ,KAAM,wBAAyBpD,KAAM,WAKjD,GAHA6O,EAAW/P,EAAG/H,MACd8lB,EAAWhO,EAAM9O,KAAM,SAEJ,YAAZ8c,GAA0BhO,EAAMjP,GAAI,aAC1B,SAAZid,GAAuBhO,EAAMjP,GAAI,aACrB,SAAZid,GAAmC,YAAZA,IAAwC,QAAZA,GAAkC,UAAZA,EAC9E,CAEI,GAAIpgB,GAAgBoS,EAAM,GAAG/R,KAAKL,MAAO,+BACzCkgB,GAAoBG,EAAoBH,EAAmBlgB,EAAM,GAAIA,EAAM,GAAIoS,EAAM/I,WAGpF,IAAiB,QAAZ+W,EAEN,GAAKhO,EAAM,GAAGkO,OAASlO,EAAM,GAAGkO,MAAMnkB,OAAS,EAE3C+jB,EAAoBK,EAAsBnO,EAAO8N,OAGrD,CACI,GAAIlgB,GAAgBoS,EAAM,GAAG/R,KAAKL,MAAO,oCACrCwgB,EAAgBne,EAAG,yCAA2CrC,EAAM,GAAK,KAAOA,EAAM,GAAK,OAAQqJ,KACvG6W,GAAoBG,EAAoBH,EAAmBlgB,EAAM,GAAIA,EAAM,GAAIwgB,MAKpFN,EAGX,QAASF,GAAYJ,GAEjBvJ,EAAIJ,KAAM,kCAAmC2J,GAAS,GACjD7X,KAAM,WAGH+O,EAASK,eACJpP,KAAM,WAEH,GAAI0Y,GAAcpe,EAAG,4BACjBqe,GAAeC,UAAWf,EAAQ,GAAGxW,iBAEpCqX,IAEDpe,EAAG,4BAA6BkB,KAAM,SAAU5F,EAAGsI,GAE/Cya,EAAYre,EAAG4D,GAAI3C,KAAM,SAAYjB,EAAG4D,GAAIoD,QAIpDuX,IAGA/J,EAAIP,aAAc,0CAA2CoK,GAAclK,KAAM,YAC5EzO,KAAM,SAAUC,GAEb,GAAIqC,GAAU5B,EAAGpC,UAAW,6BAA8B,KACtD0R,EAAUpE,EAAMG,UAAUzF,WAAYrG,EAASX,KAAK,GAEnDgD,GAAU,GAEX0N,EAAMvN,WAAYH,GAGtB0N,EAAM/I,aAGtBrE,KAAM,SAAU0J,GAGpBX,EAAGc,YAAaiB,KAAK7U,MAAOyT,EAAMC,cAAenQ,MAAMsQ,eAI/D,QAASoM,GAAejB,GAEpBvJ,EAAIH,IAAK,kCAAmC0J,GACvC7X,KAAM,WAGH+O,EAASW,iBAAkBhP,EAAGpC,UAAW,gBACzCyQ,EAASK,eACJpP,KAAM,WAEH6Y,QAKpB,QAASL,GAAsBO,EAAQZ,GAEnC,GAGIa,GACAC,EAJA/G,EAAwB6G,EAAO,GAAG7R,GAClCgS,KACAC,KAGAxe,GACAzF,KAAa,OACboK,QACAiO,QAAa,EACbtW,OAAa,EACb8I,SAAa,OACbyN,aAAa,EACbC,aAAa,EAGjByL,GAAsBhH,GAAO6G,EAAO,GAAGR,MAGM,IAAxCY,EAAsBxgB,QAASuZ,IAEhCiH,EAAsBpjB,KAAMmc,EAGhC,KAAM,GAAItc,GAAI,EAAGxB,EAAS+kB,EAAsB/kB,OAAYA,EAAJwB,IAAcA,EAElEojB,EAAW,GAAII,UACfH,EAAWC,EAAsBC,EAAsBvjB,IACvDojB,EAAShO,OAAQ,IAAKiO,EAAS,GAAIA,EAAS,GAAG3gB,MAE/CqC,EAAO2E,KAAO0Z,EAEd1K,EAAIJ,KAAM,iCAAkCvT,EAGhD,IAAI1C,GAAQ8gB,EAAO,GAAGzgB,KAAKL,MAAO,mCAElC,OAAOqgB,GAAoBH,EAAmBlgB,EAAM,GAAIA,EAAM,GAAIihB,EAAsBhH,GAAK,GAAS,MAa1G,QAASoG,GAAoBe,EAAYrE,EAAUsE,EAASb,GAwBxD,MAtBKzD,GAAW,GAA6B5b,QAAxBigB,EAAWrE,KAE5BqE,EAAWrE,GAAsC1a,EAAE+U,QAAQ,KAAUgK,EAAW,IAChFA,EAAWrE,GAAUuE,8BAGIngB,QAAxBigB,EAAWrE,KAEZqE,EAAWrE,GAAUxT,mBAAqB,EACapI,QAAlDigB,EAAWrE,GAAUuE,4BAEtBF,EAAWrE,GAAUuE,8BAEpBd,GAEDY,EAAWrE,GAAUuE,0BAA0BxjB,MAC3CyjB,uBAA2BF,EAC3BG,0BAA2BhB,KAKhCY,EAGX,QAASK,GAAoBC,GAEzB,GAAI3J,GAAQ1V,EAAG,6BAA+Bqf,EAAe,KAC7D3J,GAAMA,MAAO,QACbA,EAAMpR,KAAM,iCAAkChE,GAAI,QAAS,WAEvD,GAAIiI,GAAiB+W,EAAeD,GAChChY,IAGJqO,GAAMpR,KAAM,iEAAkEpD,KAAM,SAAU5F,EAAGikB,GAE7F,GAAI5hB,GAAQ4hB,EAAgBvhB,KAAKL,MAAO,yCACnCA,IAASA,EAAM,IAEhB0J,EAAe5L,MACX8L,sBAA4B5J,EAAM,GAClC6J,2BAA4BxH,EAAGuf,GAAkBvY,UAM/B,GAAzBK,EAAevN,SAEhByO,EAAWd,yBAA2BJ,GAG1CmX,GAAgBjW,MAKxB,QAASiX,GAAiBH,GAGtB,GAAI9W,GAAa+W,EAAeD,EAGhC9W,GAAW0W,6BAEXjL,EAAItQ,IAAK,4BAA8B,0BAA0BrB,cAAgB,KAC7Emb,OAAcjV,EAAWxB,iBACzB0W,SAAclV,EAAWrB,mBACzBmB,aAAcgX,IACd3Z,KAAM,SAAUgY,GAGhBpM,EAAMG,UACDzF,WAAY0R,EAAK1Y,KAAK,IACtB0M,SAAUtL,EAAGnB,UAAW,0BACxB2M,gBAAiBxL,EAAGnB,UAAW,SAC/B4M,UAAW,WAGR,MAAK7R,GAAG,iDAAkDoc,gBAGtDoC,EAAeZ,GAAkBrV,MAG1B,IAIA,IAGdoE,SAIb,QAAS2S,GAAeD,GAGpB,IAAM,GADFI,GAAchL,EAASE,cAAc+K,gBAC/BpkB,EAAI,EAAGA,EAAImkB,EAAY3lB,OAAQwB,IAErC,GAAKmkB,EAAYnkB,GAAG+jB,cAAgBA,EAEhC,MAAOI,GAAYnkB,EAI3B,OAAO,MAUX,QAASqkB,GAAkBN,EAAcO,GASrC,QAASC,KAEL7L,EAAAA,UAAY,wDAA0DqL,GACjE3Z,KAAM,WAEH+O,EAASK,eAAepP,KAAM,YAIpB+O,EAASE,cAAc+K,iBAAmBjL,EAASE,cAAc+K,gBAAgB5lB,QAAU,EAE7F2a,EAASW,iBAAkBhP,EAAGpC,UAAW,iBAMpChE,EAAG,qDAAsDlG,QAAU,EAEpEka,EAAItQ,IAAK,qDAAsDgC,KAAM,SAAUC,GAE3E,GAAIma,GAAuB9f,EAAG,yBAA0B8G,QAAS,MAC7DiZ,EAAuBD,EAAehZ,QAAS,cACnDgZ,GAAeE,QAAS,WAEpBhgB,EAAG/H,MAAOuS,SAAU,2CAA4CiO,SAChEzY,EAAG/H,MAAOwgB,SACVsH,EAAqBE,QAASjgB,EAAG2F,EAASX,KAAK,KAAOwH,OAAO0T,OAAQ,WAEjE9Z,EAAG/C,cAAce,eAAgB2b,SAO7CtL,EAASQ,gBAAiB,mBAE9BR,EAASQ,gBAAiB,WAG9BsJ,IAEA4B,EAASzM,cAjDzB,GAAIyM,GAAWngB,EAAEyT,WAGb2M,EAAWd,EAAeD,GAAegB,kBAAkB,EA2E/D,OAxBMT,GAqBFC,IAlBAvO,EAAMG,UACDC,SAAUtL,EAAGnB,UAAW,mBACxB+G,WAAY,MAAQ5F,EAAGnB,UAAW,6DAAgEqb,KAAMF,IAAc,QACtHtO,UAAW,WAIRqO,EAASI,WAEZ1O,UAAW,WAERgO,MAEHjO,gBAAiBxL,EAAGnB,UAAW,WAC/B0H,OAOFwT,EAUX,QAAS/X,GAAiBiX,EAAcnY,GAGpC,GAA2B,GAAtBA,EAED,MAAOyY,GAAkBN,EAQ7B,KAAM,GAHF9W,GACAiY,EAHAL,EAAWngB,EAAEyT,WACbpT,EAAWoU,EAASE,cAAc+K,gBAI5BpkB,EAAI,EAAGA,EAAI+E,EAAOvG,OAAQwB,IAEhC,GAAK+E,EAAO/E,GAAG+jB,cAAgBA,EAC/B,CACImB,EAAkBllB,EAClBiN,EAAkBlI,EAAO/E,EACzB,OAqBR,MAhBOiN,IAAcA,EAAWrB,oBAAsBA,IAElD7G,EAAOmgB,GAAiBtZ,mBAAqBzD,SAAUyD,GAEvD8M,EAAIJ,KAAM,kCAAmCvT,GACxCqF,KAAM,WAEH+O,EAASO,cAActP,KAAM,WAEzB+O,EAASW,iBAAkBhP,EAAGpC,UAAW,gBACzCua,IACA4B,EAASzM,eAKlByM,EAQX,QAAS5B,KAGL9J,EAASa,oBAAqB,qBACzB5P,KAAM,WAGH1F,EAAG,8BAA+BkB,KAAM,SAAU5F,EAAGiL,GAEjD,GAAI2J,GAAclQ,EAAGuG,GAAOtF,KAAM,2BAC7BwT,GAASE,cAAc+K,gBAAgB5lB,QAAU,EAElDkG,EAAGuG,GAAO2D,SAAUgG,GAIpBlQ,EAAGuG,GAAO+C,YAAa4G,MAOvC,IAAIuQ,GAAoB,CACxBzgB,GAAEkB,KAAMuT,EAASE,cAAc+K,gBAAiB,SAAUpkB,EAAGiN,GAEzDkY,GAAqBlY,EAAWrB,qBAGpClH,EAAG,oDAAqDkF,KAAMub,GAC9DzgB,EAAG,gDAAiDkF,KAAMuP,EAASE,cAAc+L,OAAOC,eAU5F,QAASC,KAEL,GAAIvgB,IACAwgB,uBAAwB7gB,EAAG,4CAA6CgH,MAG5E,OAAOgN,GAAIJ,KAAM,yBAA0BvT,GACtCqF,KAAM,WAEH+O,EAASO,cACJtP,KAAM,WAGHob,QAWpB,QAASC,KAEL,GAAI1gB,IACAwgB,uBAAwBpM,EAASE,cAAcqM,OAAOH,uBAG1D,OAAO7M,GAAAA,UAAY,yBAA0B3T,GACxCqF,KAAM,WAEH+O,EAASO,cACJtP,KAAM,iBAEI+O,GAASE,cAAcqM,OAE9BF,QAMpB,QAASA,KAELrM,EAASQ,gBAAiB,UAErBjV,EAAG,4CAA6ClG,OAAS,GAE1D2a,EAASQ,gBAAiB,UAlkBlC,OACIvN,QAAoBf,EACpBsa,WAAoBtB,EACpBnX,QAAoB8W,EACpBlX,gBAAoBA,EACpBgX,mBAAoBA,EACpBI,gBAAoBA,EACpBoB,UAAoBA,EACpBG,aAAoBA,KA8jBxB,aAAc,YAAa,aAAc,kBAAmB,kBACjE5a,OAAQnD,iBAcV,SAAUhD,EAAGoG,GAeVA,EAAG1B,QAAS,kBAAmB,SAAUsP,EAAK3C,EAAImD,EAAKC,EAAUnD,GAsB7D,QAAS+E,KAEL5B,EAASK,cAAc,GAU3B,QAASoM,KAEL,GAAI/P,GAASnR,EAAG,yCACZ4a,EAASzJ,EAAKqI,eAYlB,OATM/E,GAASE,cAAcwM,uBAEzB1M,EAASE,cAAcwM,qBAAuB,IAE5C1M,EAASE,cAAcyM,wBAEzB3M,EAASE,cAAcyM,sBAAwB,IAG5C3M,EAASE,cAAcwM,uBAAyBvG,EAAOyG,cAAgBrhB,EAAGmR,GAAO7M,KAAM,yBAA0BxK,OAAS,GACxH2a,EAASE,cAAcyM,wBAA0BxG,EAAO0G,eAAiBthB,EAAGmR,GAAO7M,KAAM,0BAA2BxK,OAAS,GAGlI2a,EAASE,cAAcwM,qBAAwBvG,EAAOyG,aACtD5M,EAASE,cAAcyM,sBAAwBxG,EAAO0G,cAE/C7M,EAASO,eAMThB,EAAID,OAYnB,QAASwN,GAAqBnF,GAE1B,GAAIjL,GAAOnR,EAAG,gDAEd,KAAMoc,IAAiBjL,EAAKiL,eAExB,OAAO,CAGX,KAAMA,IAAiBhW,EAAG/C,cAAcyZ,qBAAqBlE,gBAAiBzH,GAE1E,OAAO,CAGX,IAAIyJ,GAAoBzJ,EAAKqI,gBACzBgI,EAAoBxhB,EAAG,sCAAuCgH,KAElE,IAAyB,EAApBwa,EACL,CAEI,GAAIC,GAAkB7G,CAEtB,OAAM8G,GAAmBD,EAAiBhN,EAASE,cAAcgN,yBA2BtD3N,EAAID,QAzBoB,eAA1B0N,EAAgB3G,QAEjB2G,EAAgBG,cAAgB,EAChCH,EAAgBI,cAAgBJ,EAAgB1H,SAEhB,eAA1B0H,EAAgB3G,SAEtB2G,EAAgBK,cAAgB,EAChCL,EAAgBM,aAAgBN,EAAgB1H,SAI7C/F,EAAIJ,KAAM,0CAA2C6N,GACvD/b,KAAM,SAAUC,GAGb8O,EAASE,cAAcqN,kCAAoCrc,EAASX,KAAKid,GACzExN,EAASE,cAAcuN,0BAAoCvc,EAASX,KAAKwW,UAEzE2G,OAYZ,MAAKX,IAAqB/M,EAASE,cAAcqN,kCAStChO,EAAID,QANXU,EAASE,cAAcqN,kCAAoCR,MAE3DW,MASZ,QAASA,KAKL,aAHO1N,GAASE,cAAcyN,gCACvB3N,GAASE,cAAc0N,0BAEvB5N,EAASO,cAActP,KAAM,WAEhC+O,EAASQ,gBAAiB,wBAC1BR,EAASQ,gBAAiB,wBAEsC,GAA3DR,EAASE,cAAciI,uBAAuBG,WAE/CtI,EAASQ,gBAAiB,2BAE9BjV,EAAG,yBAA0B0V,MAAO,QAG/B1V,EAAG,oBAEJA,EAAG,mBAAoByY,WAYnC,QAAS6J,KAEL,GAAInR,GAAOnR,EAAG,mDAEV2c,EAAuBxL,EAAKqI,eAIhC,IAHAmD,EAAeI,UAAY,EAGtBJ,EAAe9H,UACb8H,EAAe9H,SAASmI,wBACxBL,EAAe9H,SAASmI,uBAAuBC,iBACtD,CACI,GAAIC,GAAoCP,EAAe9H,SAASmI,uBAAuBC,gBACvFN,GAAeQ,uBAAyBR,EAAeQ,0BAEvD,KAAM,GAAIC,KAAYF,GAEbA,EAAcE,IAEfT,EAAeQ,uBAAuB1hB,MAClC4hB,WAAeD,EACfE,cAAeJ,EAAcE,KAM7C,MAAMsE,GAAmB/E,EAAgBlI,EAASE,cAAciI,wBAUrD2E,IARAvN,EAAIJ,KAAM,yCAA0C+I,GACtDjX,KAAM,SAAUC,GAEb4b,IAAsB7b,KAAM+O,EAASK,gBAiBrD,QAAS4M,GAAmBa,EAAUC,GAElC,IAAM,GAAI5K,KAAO2K,GAEb,GAAKA,EAAS3K,GAAO,IAAO4K,EAAS5K,GAAO,IAAc,gBAARA,EAE9C,OAAO,CAGf,QAAO,EAUX,QAAS6K,KAGL,GAAI7H,GAAS5a,EAAG,uDAAwDwZ,eAMxE,OAJA/E,GAASE,cAAc0N,0BAA4BzH,EAAO8H,wBACnDjO,GAASE,cAAcqN,wCACvBvN,GAASE,cAAcyN,0BAEvB3N,EAASO,cACXtP,KAAM,WAEH+O,EAASQ,gBAAiB,0BAWtC,QAAS0N,KAEL,GAAIha,GAAc8L,EAASE,cAAcyN,0BACrCQ,EAAc5iB,EAAG,wDAA0D2I,EAAY,MAAO9L,SAAS2c,eAC3G,OAAOxF,GAAIJ,KAAM,iCAAkCgP,GAAa,GAC3Dld,KAAM,SAAUC,GAEb,GAAyD,IAApDA,EAASX,KAAK6d,mCAGfniB,SAASsK,SAASC,OAAQtF,EAASX,KAAK6d,wCAGvC,IAAOld,EAASX,KAAK8d,yCAC1B,CAEI,GAAIC,GAAgB/iB,EAAG2F,EAASX,KAAK8d,0CAA2Cxe,KAAM,6CAA8CxK,OAAS,CAC7IwX,GAAMG,UACDzF,WAAYrG,EAASX,KAAK8d,0CAC1BjR,UAAW,WAER,MAAKkR,GAEMC,IAIAC,MAGdtW,UAGZrE,KAAM,SAAU0J,GAEb,IAKI,IAAM,GAHFrM,GAAW3F,EAAEkS,UAAWF,EAAMC,cAE9BiR,KACM5nB,EAAI,EAAGA,EAAIqK,EAAS7D,MAAMsQ,YAAYtY,OAAQwB,IAET,KAAtCqK,EAAS7D,MAAMsQ,YAAY9W,GAAGgc,KAG/B7C,EAASQ,gBAAiB,wBAAyBvP,KAAM,WAErD1F,EAAGU,UAAWK,QAAS,mCAK3BmiB,EAAWznB,KAAMkK,EAAS7D,MAAMsQ,YAAY9W,GAK/C4nB,GAAWppB,OAAS,GAErBuX,EAAGc,YAAa+Q,GAGxB,MAAQ9Y,GAEJiH,EAAGgB,WAAYL,EAAMM,OAAQN,EAAMO,eAcnD,QAAS7J,GAAoBC,GA+BzB,MAhBMA,KAGFA,EAAY3I,EAAG,2CAA4CgH,OAG/DyN,EAASE,cAAcyN,0BAA4BzZ,EAE7CvC,EAAGpC,UAAW,4CAEhByQ,EAASE,cAAcwO,6BAA8B,SAGlD1O,GAASE,cAAcqN,wCACvBvN,GAASE,cAAc0N,0BAEvB5N,EAASO,cACXtP,KAAM,WAEH+O,EAASQ,gBAAiB,0BAItC,QAASrM,GAAqBwa,GAG1B,MADA3O,GAASE,cAAcwO,8BAAgCC,EAChDpP,EAAIH,IAAK,kBACZsP,8BAA+BC,IASvC,QAASC,KAGL7O,EAAIP,aAAc,yCAA0CE,KAAM,YAC7DzO,KAAM,SAAUC,GAEb2L,EAAMG,UACDzF,WAAYrG,EAASX,KAAK,IAC1B8M,UAAW,WAER9R,EAAG,mCAAoCkB,KAAM,SAAU5F,EAAG6F,GAEjDnB,EAAGmB,GAAQ6F,OAASyN,EAASE,cAAcyN,0BAE5CpiB,EAAGmB,GAAQF,KAAM,UAAW,WAI5BjB,EAAGmB,GAAQuJ,WAAY,eAG/BmH,UAAW,WAEX,MAAOmR,OAEVrW,SAWjB,QAASqW,KAEL,GAAI7R,GAAOnR,EAAG,4CAEd,IAAKmR,EAAKiL,eACV,CACI,GAAIxB,GAASzJ,EAAKqI,gBAAgB3E,SAASyO,oBAEvCC,GACAC,iBAAuB5I,EAAO6I,SAC9BC,YAAuB9I,EAAO+I,IAC9BC,sBAAuBhJ,EAAOiJ,UAC9BC,qBAAuBlJ,EAAOmJ,aAC9BC,aAAuBpJ,EAAOqJ,KAC9BC,YAAuBtJ,EAAOuJ,IAYlC,OATAnQ,GAAIJ,KAAM,gDAAiD2P,GACtD7d,KAAM,WAEH+O,EAASK,eAAepP,KAAM,WAE1BgD,EAAoB,GACpB+L,EAASQ,gBAAiB,6BAG/B,EAIP,OAAO,EAQf,QAASmP,KAGL5P,EAAIP,aAAc,wCAAyCE,KAAM,YAC5DzO,KAAM,SAAUC,GAEb2L,EAAMG,UACDzF,WAAYrG,EAASX,KAAK,IAC1B8M,UAAW,WAER9R,EAAG,mCAAoCkB,KAAM,SAAU5F,EAAG6F,GAEjDnB,EAAGmB,GAAQ6F,OAASyN,EAASE,cAAcyN,0BAE5CpiB,EAAGmB,GAAQF,KAAM,UAAW,WAI5BjB,EAAGmB,GAAQuJ,WAAY,eAG/BmH,UAAW,WAEX,MAAOoR,OAEVtW,SAUjB,QAASsW,KAEL,GAAI9R,GAAOnR,EAAG,2CAEd,IAAKmR,EAAKiL,eACV,CAEI,GAAIxB,GAASzJ,EAAKqI,gBAAgB3E,SAASwP,qBAEvCC,GACAC,MAAU3J,EAAO4J,MACjBC,KAAU7J,EAAO8J,KACjBC,OAAU/J,EAAOgK,OACjBC,KAAUjK,EAAOkK,KACjBC,MAAUnK,EAAOoK,MACjBC,SAAUrK,EAAOsK,SAQrB,OALAlR,GAAIJ,KAAM,+CAAgD0Q,GACrD5e,KAAM,WAEH+O,EAASK,kBAEV,EAIP,OAAO,EAQf,QAASqQ,GAAuBvqB,GAI5B,GAAgE,GAA3D6Z,EAASE,cAAciI,uBAAuBG,UAE/C,GAAInC,GAAS5a,EAAG,iDAAkDwZ,oBAIlE,IAAIoB,GAAS5a,EAAG,mDAAoDwZ,eAGxE,IAAInZ,IACA+a,OAAgBR,EAAOE,OACvBQ,QAAgBV,EAAOb,QACvBiB,IAAgBJ,EAAOI,IACvBK,KAAgBT,EAAOK,KACvBmK,WAAgBxK,EAAOyK,WACvBlK,eAAgB,aAGpB3G,GAAIP,aAAc,uCAAwC5T,GAAS8T,KAAM,YACpEzO,KAAM,SAAUC,GAEb2L,EAAMG,UACDzF,WAAYrG,EAASX,KAAK,IAC1B2H,SAWjB,QAAS2Y,KAEL,GAAInU,GAAOnR,EAAG,2CACd,IAAKmR,EAAKiL,eACV,CAEI,GAAIxB,GAASzJ,EAAKqI,gBAGdnZ,GACAklB,wBAA+B3K,EAAO4K,yBAA2B,EACjEC,gBAA+B7K,EAAO8K,iBAAmB,EACzDC,mBAA+B/K,EAAOgL,oBAAsB,EAC5DC,oBAA+BjL,EAAOkL,qBAAuB,EAC7DC,gBAA+BnL,EAAOoL,iBAAmB,EACzDC,8BAA+BrL,EAAOsL,+BAAiC,EACvEC,8BAA+BvL,EAAOwL,+BAAiC,EACvEC,mBAA+BzL,EAAO0L,oBAAsB,EAGhE,OAAOtS,GAAIJ,KAAM,6BAA8BvT,GAC1CqF,KAAM,SAAUC,GAEoC,IAA5CA,EAASX,KAAKuhB,2BAGfte,OAAO+C,SAASC,OAAQtF,EAASX,KAAKuhB,4BAGkB,IAAlD5gB,EAASX,KAAKwhB,iCAGpBlV,EAAMG,UACDzF,WAAYrG,EAASX,KAAKwhB,kCAC1B7U,gBAAiB,IACjBG,UAAW,WAER7J,OAAO+C,SAASC,OAAQkG,EAAKlQ,KAAM,aACnC4Q,UAAW,WAEf5J,OAAO+C,SAASC,OAAQkG,EAAKlQ,KAAM,aACnC0L,OAMJ1E,OAAO+C,SAASC,OAAQkG,EAAKlQ,KAAM,cA5mBvD,OACIoV,KAAwBA,EACxB6K,uBAAwBA,EACxBoB,cAAwBA,EACxBG,mBAAwBA,EACxBlB,oBAAwBA,EACxB4D,sBAAwBA,EACxBxC,eAAwBA,EACxBja,mBAAwBA,EACxBE,oBAAwBA,EACxBya,gBAAwBA,EACxBe,eAAwBA,EACxBkB,WAAwBA,KAumB5B,aAAc,YAAa,aAAc,kBAAmB,kBACjEnf,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAGVA,EAAG1B,QAAS,kBAAmB,SAAUsP,GAerC,QAASyS,KAYL,QAASC,GAAqB/rB,EAAOgsB,GAIjC,MAFAC,GAAiBC,UAAYlsB,EAC7BisB,EAAiBE,QAAYH,EACtB1uB,KAGX,QAAS8uB,GAAeC,EAAaC,EAAaC,GAG9C,GAAI7mB,IACA8mB,YAAcF,EACdG,SAAcR,EAAiBC,UAC/BQ,OAAcT,EAAiBE,QAC/BQ,aAAcJ,GAAgBK,IAAgBC,qBAElD,OAAOxT,GAAItQ,IAAK,kBAAoBsjB,EAAc,IAAK3mB,GA1B3D,GAAIumB,IACAC,UAAW,KACXC,QAAW,KAGf,QACIW,QAASf,EACTgB,MAASX,GAgCjB,QAASY,KAkBL,QAASC,GAAYC,GAGjB,MADAxnB,GAAOynB,OAASD,EACT5vB,KAGX,QAAS8vB,GAAaC,GAGlB,MADA3nB,GAAO4nB,KAAOD,EACP/vB,KAGX,QAASiwB,GAAYC,EAAQC,EAAMC,GAW/B,MATAhoB,GAAOioB,OAASH,EACTC,IAEH/nB,EAAOgc,MAAQ+L,GAEZC,IAEHhoB,EAAOkoB,WAAaF,GAEjBpwB,KAGX,QAASuwB,GAAcxB,EAAaC,GAEhC,MAAOjT,GAAIJ,KAAM,kBAAoBoT,EAAc,IAAK3mB,GA3C5D,GAAIA,IACAynB,OAAY,EACZG,KAAY,GACZK,OAAY,GACZjM,MAAY,GACZkM,WAAY,EAGhB,QACIX,WAAaA,EACbG,YAAaA,EACbG,WAAaA,EACbrd,GAAa2d,GAqCrB,QAASjB,KAEL,OACIkB,cAAsB,gBACtBC,aAAsB,eACtBlB,qBAAsB,yBAI9B,QAASmB,KAEL,OACIC,KAAU,OACVC,SAAU,WACVC,KAAU,QAvHlB,OACIrC,aAAeA,EACfkB,YAAeA,EACfoB,aAAeJ,IACfK,cAAezB,OAuHnB,gBACLphB,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAYVA,EAAG1B,QAAS,mBAAoB,WAqB5B,QAASukB,KAOL,MALOC,IAEHC,IAGGD,EAQX,QAASC,KAEL,GAAIC,EAuCJ,IAlCQA,EAJDnhB,OAAOohB,WAELphB,OAAOohB,WAAY,sBAAuBC,QAEpC,KAEDrhB,OAAOohB,WAAY,qBAAsBC,QAExC,KAEDrhB,OAAOohB,WAAY,qBAAsBC,QAExC,KAIA,KAKNtpB,EAAGiI,QAASsS,SAAW,KAEjB,KAEDva,EAAGiI,QAASsS,SAAW,IAEtB,KAEDva,EAAGiI,QAASsS,SAAW,IAEtB,KAIA,KAGV6O,GAAQF,GAAuB,OAATE,EAC3B,CACI,GAAIG,GAAWL,CACfA,GAAeE,EACfppB,EAAGiI,QAASlH,QAAS,cAAemoB,EAAYK,KAIxD,QAAS3f,GAAYmB,GAGjB,IAAM,GADFye,GAAeze,EAASrS,QAAS,MAAO,IAAKyB,MAAO,KAC9CmB,EAAI,EAAGA,EAAIkuB,EAAa1vB,OAAQwB,IAEtC,GAAKkuB,EAAaluB,IAAM4tB,EAEpB,OAAO,CAGf,QAAO,EA5FX,GAAIA,EAQJ,OALAlpB,GAAGiI,QAASwhB,OAAQN,GAGpBnpB,EAAGU,UAAWiT,MAAOwV,IAGjBpe,SAAYke,EACZrf,WAAYA,MAuFrBzD,OAAQnD,iBAaV,SAAUhD,EAAGoG,GASVA,EAAG1B,QAAS,mBAAoB,SAAU8P,EAAKC,GAkD3C,QAAS4B,KASL,GALAvI,EAAa9N,EAAG,4CAChBkV,EAAalV,EAAG,4CAChB0pB,EAAa1pB,EAAG,iCAChB2pB,EAAa3pB,EAAG,iCAEX8N,EAAWhU,QAAUob,EAAUpb,QAAUob,EAAUpb,OAAS,EACjE,CACmB2a,EAASE,aAExBO,GAAU1I,OAGVsB,EAAW5M,KAAM,SAAU5F,EAAGiL,GAE1BvG,EAAGuG,GAAO2D,SAAU,YAEpBlK,EAAGuG,GAAO2I,MAAO,WAEPlP,EAAG/H,MAAO6I,GAAI,cAEhB8oB,EAAMtuB,OAKlBouB,EAAWzoB,KAAM,WAAY,YAC7ByoB,EAAWxa,MAAO,WAEd2a,MAGJF,EAAW1oB,KAAM,WAAY,YAC7B0oB,EAAWza,MAAO,WAEd4a,MAGJ7hB,OAAO8hB,iBAAkB,aAAc,WAE9B9hB,OAAO+C,SAASgf,KAAKlwB,OAAS,EAE/BsR,EAAQnD,OAAO+C,SAASgf,MAIxBJ,EAAM,KAEX,GAIH5pB,EAAEiqB,SAAW,SAAUjsB,GAEnB,GAAIge,GAAU,GAAIzhB,QAAQ,OAAUyD,EAAO,aAAcksB,KAAMjiB,OAAO+C,SAASF,KAC/E,OAAgB,OAAXkR,EAEM,KAIAA,EAAQ,IAAM,EAI7B,IAAI9Z,GAAQlC,EAAEiqB,SAAU,UAEY,IAA/BhiB,OAAO+C,SAASgf,KAAKlwB,QAAiBoI,GAASlC,EAAG,6BAA+BkC,EAAQ,MAAOpI,OAAS,EAE1GmO,OAAO+C,SAASgf,KAAO9nB,EAKvB0nB,GAFOxe,EAAQnD,OAAO+C,SAASgf,OAAU1b,GAAW,EAE9CA,EAIA,GAGV6b,IACAnqB,EAAGiI,QAAS3H,GAAI,aAAc6pB,GAC9BnqB,EAAGiI,QAASwhB,OAAQ,WAEqC,MAAhDrjB,EAAG/C,cAAcsH,iBAAiBI,YAEnCof,OAYhB,QAASC,KAEL,MAAK9b,IAAW,GAGR1B,GAAO5M,EAAGkV,EAAU5G,IAAWrN,KAAM,2BACrCrD,MAAO0Q,GAKJ,KAmBf,QAAS+b,GAAcC,GAGnB,MADAC,GAAaF,aAAa5uB,KAAM6uB,GACzBlkB,EAAG/C,cAAcuH,iBAS5B,QAAS4f,GAAaF,GAGlB,MADAC,GAAaC,YAAY/uB,KAAM6uB,GACxBlkB,EAAG/C,cAAcuH,iBAY5B,QAAS6f,GAAqB1mB,EAAYnG,GAEtC,GAAI8sB,IAAoB,CAExB,IAAKpc,GAAW,GAAoB,gBAAfvK,EACrB,CAEI,GAAI4mB,GAAmBP,IACnBQ,GACAhtB,MAAOA,EACPgP,GAAO5M,EAAGkV,EAAUtX,IAASqD,KAAM,2BAGvCjB,GAAEkB,KAAMqpB,EAAaxmB,GAAa,SAAUzI,EAAGgvB,GAE3C,MAAKA,GAAaK,EAAkBC,MAAsB,GAEtDF,GAAoB,GACb,GAHX,SAQR,MAAOA,GAUX,QAASd,GAAMhsB,EAAOitB,GAGlB,GAAIC,GAAiBxc,IAAY1Q,IAE5BktB,GAAmBD,GAEdJ,EAAqB,eAAgB7sB,MAM/C0Q,EAAU1Q,GAEJZ,OAAO2G,OAAQonB,EAAezc,GAAUmG,EAASE,aAAa,KAAYmW,GAAoB9qB,EAAGkV,EAAU5G,IAAWrN,KAAM,iCAE9H8pB,EAAezc,GAAWmG,EAASE,aAAa,GAEhDH,EAAIF,mBAAoBtU,EAAGkV,EAAU5G,IAAWrN,KAAM,iCACjDyE,KAAM,SAAUC,GAEb3F,EAAGkV,EAAU5G,IAAW6G,KAAMxP,EAASX,KAAK,IAE5CgmB,EAAkBF,GAClB1kB,EAAG/C,cAAce,eAAgB8Q,EAAU5G,IAC3CtO,EAAGiI,QAASlH,QAAS,qBAM7BiqB,EAAkBF,IAM1B,QAASE,GAAkBF,GAIvB9qB,EAAGkV,GAAY1I,MAGf,IAAItM,EACJF,GAAG8N,GAAa5M,KAAM,SAAU5F,EAAGiL,GAE/BrG,EAAQF,EAAGuG,GACXrG,EAAMoJ,YAAa,mBAEnBpJ,EAAMoE,KAAM,gBAAiBrD,KAAM,gBAAiB,SAE3CqN,EAAJhT,EAGD4E,EAAMgK,SAAU,WAIX5O,GAAKgT,GAENpO,EAAMgK,SAAU,kBAChBhK,EAAMoE,KAAM,gBAAiBrD,KAAM,gBAAiB,SAI/C3F,EAAIgT,IAAYpO,EAAMY,GAAI,aAG3BZ,EAAMgK,SAAU,cAKhCigB,IAGgB,GAAX7b,EAEDqb,EAAW1oB,KAAM,WAAY,YAI7B0oB,EAAWjf,WAAY,YAItB4D,EAAU,GAAKR,EAAWhU,OAE3B4vB,EAAWzoB,KAAM,WAAY,YAI7ByoB,EAAWhf,WAAY,YAI3B1K,EAAGkV,EAAU5G,IAAW3B,OAGnB2B,EAAU,EAEXrG,OAAO+C,SAASgf,KAAOhqB,EAAGkV,EAAU5G,IAAWrN,KAAM,2BAIhDgH,OAAO+C,SAASgf,KAAKlwB,OAAS,IAE/BmO,OAAO+C,SAASgf,KAAO,IAI1Bc,GAEDL,EAAqB,cAAenc,GAS5C,QAAS2c,GAAgBL,GAErBhB,EAAMgB,EAAgBhtB,OAAO,GAYjC,QAASisB,KAEAvb,EAAUR,EAAWhU,OAAS,GAE/B8vB,EAAMtb,EAAU,GAQxB,QAASwb,KAEAxb,EAAU,GAEXsb,EAAMtb,EAAU,GAUxB,QAASlD,GAAQ8f,GAEb,MAAoB,QAAfA,GAEDrB,KACO,GAEc,QAAfqB,GAENpB,KACO,IAIPoB,EAAcA,EAAYxyB,QAAS,IAAK,IACxCsH,EAAGkV,GAAYhU,KAAM,SAAU5F,EAAGiL,GAE9B,MAAKvG,GAAGuG,GAAOtF,KAAM,4BAA+BiqB,GAEhDtB,EAAMtuB,IACC,GAHX,UAQD,GAQX,QAAS6uB,KAGL,GAAIgB,GAAkBrd,EAAWhU,MACjC,MAAwB,GAAnBqxB,GAAL,CAMAnrB,EAAG8N,GAAapD,WAAY,SAC5B1K,EAAG8N,GAAae,SAAU,QAASnE,WAAY,SAC/C1K,EAAG0pB,GAAahf,WAAY,SAC5B1K,EAAG2pB,GAAajf,WAAY,QAE5B,IAAI0gB,GAAeprB,EAAG2pB,GAAanP,aAAexa,EAAG0pB,GAAalP,aAAgBxa,EAAG0pB,GAAalP,YAAY,GAAS,EAAIxa,EAAG2pB,GAAanP,YAAY,GAAS,CAChKxa,GAAG0pB,GAAand,KAAMgO,MAAO6Q,EAAc,OAC3CprB,EAAG2pB,GAAapd,KAAMgO,MAAO6Q,EAAc,MAG3C,IAAI7Q,GAAQva,EAAG8N,GAAajR,SAASA,SAAS2d,YAAY,GAAW,EAAI4Q,CACzE7Q,IAAS9W,SAAUzD,EAAG8N,GAAajR,SAAS0P,IAAK,eAAmB9I,SAAUzD,EAAG8N,GAAajR,SAAS0P,IAAK,eAE5G,IAAI8e,GAAW9Q,EACX+Q,IAEJtrB,GAAG8N,GAAa5M,KAAM,SAAU5F,EAAGiL,GAE/B8kB,GAAW5nB,SAAUzD,EAAGuG,GAAOgG,IAAK,eACpC8e,GAAW5nB,SAAUzD,EAAGuG,GAAOgG,IAAK,gBAEpC+e,EAAShwB,GAAK0E,EAAGuG,GAAOsI,SAAU,QAAS0L,QAC3C8Q,GAAWC,EAAShwB,GAEpB+vB,GAAW5nB,SAAUzD,EAAGuG,GAAOsI,SAAU,QAAStC,IAAK,eACvD8e,GAAW5nB,SAAUzD,EAAGuG,GAAOsI,SAAU,QAAStC,IAAK,iBAG3D,IAEIgf,GAAaC,EAFbC,EAAkBhoB,SAAU4nB,EAAUF,EAGrCM,GAAkB,GAAK,GAExBF,EAAiBE,EAAkB,EAAM,GACzCD,EAAiBC,EAAkB,EAAM,KAIzCF,EAAeE,EAAkB,EACjCD,EAAeC,EAAkB,EAGrC,IACIC,GAAiBC,EADjBC,EAAkBnoB,SAAU4nB,GAAcF,EAAkB,IAAQI,EAAcC,GAEjFI,GAAkB,GAAK,GAExBF,EAAqBE,EAAkB,EAAM,GAC7CD,EAAqBC,EAAkB,EAAK,KAI5CF,EAAmBE,EAAkB,EACrCD,EAAmBC,EAAkB,EAIzC5rB,GAAG8N,GAAa5M,KAAM,SAAU5F,EAAGiL,GAEtB4kB,EAAkB,EAAtB7vB,EAED0E,EAAGuG,GAAOsI,SAAU,QAAStC,KAAMgf,YAAeA,EAAc,KAAMC,aAAgBA,EAAe,OAIrGxrB,EAAGuG,GAAOsI,SAAU,QAAStC,KAAMgf,YAAeG,EAAkB,KAAMF,aAAgBG,EAAmB,UA/fzH,GAAI7d,MACAoH,KACA5G,EAAU,GACVqb,KACAD,KACAa,GACAF,gBACAG,gBAEAO,IAEJ,QACI1U,KAAqBA,EACrB+T,oBAAqBA,EACrBR,KAAqBA,EACrBS,aAAqBA,EACrBG,YAAqBA,EACrBS,eAAqBA,EACrBpB,KAAqBA,EACrBC,SAAqBA,EACrB1e,OAAqBA,EACrB+e,eAAqBA,KAifzB,aAAc,qBAEnBhkB,OAAQnD,iBAWV,SAAUhD,EAAGoG,GAEVA,EAAG1B,QAAS,oBAAqB,SAAUsP,EAAK1C,EAAOnE,GAYnD,QAASiM,KAEL,GAAIgC,GAASpb,EAAG,wBAAyBgH,KACzC,OAAiC,eAAxBoU,EAAOL,eAA0D,eAAxBK,EAAOL,cAG7D,QAAS8Q,KAELC,GACIC,qBAAuB/rB,EAAG,uBAAwB,iDAClDgsB,kBAAuBhsB,EAAG,oBAAqB,iDAC/CisB,mBAAuBjsB,EAAG,qBAAsB,iDAChDksB,sBAAuBlsB,EAAG,wBAAyB,kDAIvD8rB,EAAeC,qBAAqB/kB,IAAK,IAEnC8kB,EAAeE,kBAAkBhlB,MAAMlN,OAAS,GAAKgyB,EAAeG,mBAAmBjlB,MAAMlN,OAAS,EAGxGka,EAAItQ,IAAK,iDAEDyX,eAAgB,aAChBgR,IAAgBL,EAAeE,kBAAkBhlB,MACjDqU,KAAgByQ,EAAeG,mBAAmBjlB,QAGrDtB,KAAM,SAAUC,GAEb5F,EAAkB4F,EAASX,KAC3BonB,EAAkBrsB,EAAOjG,OAED,GAAnBsyB,GAEDC,GAOJ,KAAM,GAJFhsB,IACAwb,cAGMvgB,EAAI,EAAO8wB,EAAJ9wB,EAAqBA,IACtC,CACI,GAAIgxB,GAAmB,KACnBC,EAAmBxsB,EAAOzE,GAAGkxB,uBAC7BC,EAAmBF,EAAe,GACtCE,IAAyBxV,KAAKC,MAA0B,IAAnBuV,GAA2B,KAAKC,QAAS,GAAKh0B,QAAS,IAAK,KAE7E,IAAf6zB,IAEDE,EAAmBF,EACnBD,EAAmB,KAGvBjsB,EAAOwb,UAAUpgB,MACbmC,MAAWtC,EACXgxB,UAAWA,EACX1xB,KAAWmF,EAAOzE,GAAGqxB,4BAA8B,cAAgB,cACnE/H,OAAW7kB,EAAOzE,GAAGqxB,4BAA8B5sB,EAAOzE,GAAGsxB,4BAA8B7sB,EAAOzE,GAAGuxB,2BACrGzR,OAAWrb,EAAOzE,GAAGywB,qBACrBzQ,QAAWvb,EAAOzE,GAAG4wB,sBACrBC,IAAWpsB,EAAOzE,GAAG0wB,kBACrB3Q,KAAWtb,EAAOzE,GAAG2wB,mBACrBa,SAAW/sB,EAAOzE,GAAGyxB,uBACrBC,SAAWP,EACXQ,OAAWltB,EAAOzE,GAAG4xB,uBAI7B,GAAI/X,GAAO/O,EAAGrB,gBAAiB,qCAAsC1E,EAErEiR,GAAMG,UACDC,SAAUtL,EAAGnB,UAAW,+CACxB+G,WAAYmJ,GACZQ,SAAU,YACV9D,UAAW,WA8BR,MA5BAia,GAAeG,mBAAmB3iB,YAAa,aAAcY,SAAU,eACvElK,EAAG,cAAgB8rB,EAAeG,mBAAmBhrB,KAAM,MAAS,MAAOqI,YAAa,aAAcY,SAAU,eAEhH4hB,EAAeE,kBAAkB1iB,YAAa,aAAcY,SAAU,eACtElK,EAAG,cAAgB8rB,EAAeE,kBAAkB/qB,KAAM,MAAS,MAAOqI,YAAa,aAAcY,SAAU,eAE/G4hB,EAAeC,qBAAqBziB,YAAa,aAAcY,SAAU,eACzElK,EAAG,cAAgB8rB,EAAeC,qBAAqB9qB,KAAM,MAAS,MAAOqI,YAAa,aAAcY,SAAU,eAElH4hB,EAAeI,sBAAsB5iB,YAAa,aAAcY,SAAU,eAC1ElK,EAAG,cAAgB8rB,EAAeI,sBAAsBjrB,KAAM,MAAS,MAAOqI,YAAa,aAAcY,SAAU,eAEnHijB,EAAgBntB,EAAG,kDAAmDgH,MAEjEjH,EAAOotB,GAAeR,6BAEvB3sB,EAAG8rB,EAAeC,sBAAuB/kB,IAAK,eAC9ChH,EAAG8rB,EAAeI,uBAAwBllB,IAAKjH,EAAOotB,GAAeP,+BAIrE5sB,EAAG8rB,EAAeC,sBAAuB/kB,IAAK,eAC9ChH,EAAG8rB,EAAeI,uBAAwBllB,IAAKjH,EAAOotB,GAAeN,6BAEzE7sB,EAAG8rB,EAAeC,sBAAuBhrB,QAAS,UAElDf,EAAG8rB,EAAeG,oBAAqBjlB,IAAKjH,EAAOotB,GAAelB,oBAClEjsB,EAAG8rB,EAAeE,mBAAoBhlB,IAAKjH,EAAOotB,GAAenB,oBAC1D,IAEVrf,SAKb0f,IAKR,QAASA,KAELlf,EAAUkF,WAAY,EAAGjM,EAAGnB,UAAW,2CAEvC6mB,EAAeG,mBAAmB3iB,YAAa,eAAgBY,SAAU,aACzElK,EAAG,cAAgB8rB,EAAeG,mBAAmBhrB,KAAM,MAAS,MAAOqI,YAAa,eAAgBY,SAAU,aAElH4hB,EAAeE,kBAAkB1iB,YAAa,eAAgBY,SAAU,aACxElK,EAAG,cAAgB8rB,EAAeE,kBAAkB/qB,KAAM,MAAS,MAAOqI,YAAa,eAAgBY,SAAU,aAEjH4hB,EAAeG,mBAAmB7R,MAAO,WAErCpa,EAAG/H,MAAOqR,YAAa,YACvB,IAAI8jB,GAAUptB,EAAG/H,MAAOgJ,KAAM,KAC9BjB,GAAG/H,MAAOo1B,QAAS,eAAgB/oB,KAAM,SAAW8oB,EAAU,MAAO9jB,YAAa,eAGtFwiB,EAAeE,kBAAkB5R,MAAO,WAEpCpa,EAAG/H,MAAOqR,YAAa,YACvB,IAAI8jB,GAAUptB,EAAG/H,MAAOgJ,KAAM,KAC9BjB,GAAG/H,MAAOo1B,QAAS,eAAgB/oB,KAAM,SAAW8oB,EAAU,MAAO9jB,YAAa,eArJ1F,GAAI6jB,GAAkB,GAClBrB,KACAM,KACArsB,IAEJ,QACI8rB,oBAAqBA,EACrBzS,cAAqBA,KAiJzB,aAAc,eAAgB,eAEnCjT,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAQVA,EAAG1B,QAAS,qBAAsB,WAuB9B,QAAS4oB,GAAYvpB,GAEjB,GAAId,IACAsqB,gBAAiB,2DACFC,iBACb,aAAeC,mBAAoBC,KACnC,qQAQFC,qBAAsB,2DACPH,iBACb,aAAeC,mBAAoBC,KACnC,0QAQFE,QAAW,qEACCH,mBAAoBC,KAC9B,aAAeG,IACf,2IAGFC,cAAe,wDAGGJ,IAAW,mEACkCK,WAAa,sQAGhF,OAAO9qB,GAASc,GASpB,QAAS2pB,KAEL,GAAIM,GAAYttB,SAASsK,SAASF,KAC9BmjB,EAAYjuB,EAAG,uBAAwBiB,KAAM,OAWjD,OATKgtB,IAAaA,EAAUn0B,OAAS,IAE5Bm0B,EAAU5vB,QAAS,QAAW,IAE/B4vB,EAAYvtB,SAASsK,SAASkjB,SAAW,KAAOxtB,SAASsK,SAASmjB,KAAOF,GAE7ED,EAAMC,GAGHD,EASX,QAASI,GAASpwB,GAEd,GAAIqwB,GAAcruB,EAAG,cAAgBhC,EAAO,MAAOiD,KAAM,UACzD,OAAOotB,IAAe,GAS1B,QAASR,KAEL,GAAIpY,GAAU2Y,EAAS,YACnBE,EAAUF,EAAS,aAWvB,OATK3Y,GAAM3b,OAAS,GAAKw0B,EAAQx0B,OAAS,EAEtC2b,GAAS,MAAQ6Y,EAIjB7Y,EAAQzV,EAAG,SAAUkF,OAGlBuoB,mBAAoBhY,GA1G/B,MATiC,mBAAtB,oBAEP+X,iBAAmB,SAEI,mBAAhB,cAEPO,WAAa,OAIbld,iBAAkByc,MA8G3BnnB,OAAQnD,iBAaV,SAAUhD,EAAGoG,GAQVA,EAAG1B,QAAS,oBAAqB,WAc7B,QAAS6pB,GAAgB1tB,GAGrB,MADAA,GAAUb,EAAGa,GACRA,EAAQC,GAAI,UAAaD,EAAQC,GAAI,WAAcD,EAAQC,GAAI,YAEzDD,EAIFA,EAAQyD,KAAM,SAAUxK,OAAS,EAE3B+G,EAAQyD,KAAM,SAGfzD,EAAQyD,KAAM,UAAWxK,OAAS,EAEjC+G,EAAQyD,KAAM,UAGfzD,EAAQyD,KAAM,YAAaxK,OAAS,EAEnC+G,EAAQyD,KAAM,YAKd,KAanB,QAASkqB,GAAcC,GAGnB,MAAKA,GAAY3tB,GAAI,UAAa2tB,EAAY3tB,GAAI,WAAc2tB,EAAY3tB,GAAI,YAGrEd,EAAE4B,KAAM6sB,EAAYznB,OAAQlN,OAAS,GAK5C+H,QAAQC,MAAO,+CAAiD2sB,EAAYC,KAAM,WAAc,MACzF,GAWf,QAASC,GAAcF,GAEnB,GAAIG,GAAa,yIACjB,OAAKJ,GAAcC,GAERG,EAAWxxB,KAAM4C,EAAE4B,KAAM6sB,EAAYznB,SAIrC,EAWf,QAAS6nB,GAAgBJ,GAErB,MAAKD,GAAcC,GAERzuB,EAAE8uB,UAAW9uB,EAAE4B,KAAM6sB,EAAYznB,SAIjC,EAYf,QAAS+nB,GAAeN,EAAaO,GAEjC,MAAKhvB,GAAGgvB,GAAYl1B,OAAS,EAElBkG,EAAE4B,KAAM6sB,EAAYznB,QAAWhH,EAAE4B,KAAM5B,EAAGgvB,GAAYhoB,OAItDhH,EAAE4B,KAAM6sB,EAAYznB,QAAWgoB,EAI9C,QAASC,GAAYR,GAEjB,MAAOA,GAAY3tB,GAAI,YAG3B,QAASouB,GAAWT,GAEhB,MAAOA,GAAY3tB,GAAI,YAoD3B,QAASoQ,GAAUC,EAAMC,GAErB,GAAIqd,GAAaU,EAAcC,EAAeC,EAAiBC,EAAO5f,EAAS6f,EAAYC,EAAYC,EAAcC,EAAgBC,EACjIpW,EAAgBvZ,EAAGmR,EACvBC,GAAoBA,GAAc,WAClC,IAAIwe,MACAC,GAAgB,CAGpBtW,GAAMjV,KAAM,qCAAsCpD,KAAM,SAAU5F,EAAGiL,GAEjEkpB,EAAiBzvB,EAAGuG,GAAOtF,KAAM,wBACjCkuB,EAAiBZ,EAAgBhoB,GAEjCmpB,EAAmBD,EAAeA,EAAe,OACjDC,EAAiBA,EAAev1B,MAAO,IAEvC,KAAM,GAAImB,GAAI,EAAGxB,EAASq1B,EAAar1B,OAAYA,EAAJwB,EAAYA,IAC3D,CAII,GAHAmzB,EAAsBzuB,EAAGmvB,EAAa7zB,IACtCq0B,EAAsBlB,EAAYxtB,KAAM,SAElCguB,EAAYR,KAAkBS,EAAWT,GAE3C,MAOJ,IAJAW,EAAkBM,EAAep0B,GAAGsG,QAAU8tB,EAAe,GAAG9tB,OAChEytB,GAAkB,EAGZZ,EAAY3tB,GAAI,UACQ,SAAvB6uB,GACuB,YAAvBA,GACAlB,EAAY3tB,GAAI,YAEnB,OAASsuB,GAGL,IAAK,OACDC,GAAmBb,EAAcC,EACjC,MAEJ,KAAK,OACDY,GAAmBV,EAAcF,EACjC,MAEJ,KAAK,SACDY,GAAmBR,EAAgBJ,EACnC,MAEJ,KAAK,QACDY,GAAmBN,EAAeN,EAAazuB,EAAGuG,GAAOtF,KAAM,gCAC/D,MAEJ,KAAK,OAED,KAEJ,SACIY,QAAQC,MAAO,sDAAwD2tB,EAAe,SAI7F,KAAKhB,EAAY3tB,GAAI,UACK,SAAvB6uB,GACsB,YAAvBA,EAqBF,CAAA,IAAKlB,EAAY3tB,GAAI,UAQtB,WADAe,SAAQC,MAAO,0BAA4B9B,EAAGuG,GAAOmoB,KAAM,WAAc,oCAJzEW,GAAyC,IAArBZ,EAAYznB,OAAoC,MAArBynB,EAAYznB,UAvB/D,CAKI,GAHAsoB,EAAUb,EAAYxtB,KAAM,QAC5ByO,EAAU6J,EAAMjV,KAAM,eAAiBgrB,EAAQ,cAAex1B,OAElC,SAAvB61B,EAEDJ,EAAa,EACbC,EAAa,MAGjB,CACI,GAAIM,GAAS,GAAKC,UAAS,UAAYN,OAAqBO,IAAK,EAAGC,IAAK,EACzEV,GAAaO,EAAOE,IACpBR,EAAaM,EAAOG,IAGxBZ,EAA8BE,EAAV7f,GAAwBA,EAAU8f,EAcrDH,IAEDQ,GAAW,EACXD,EAAcn0B,KAAMgzB,GAEfU,EAAar1B,OAAS,GAEvB20B,EAAYvkB,SAAUkH,GACtBmI,EAAMjV,KAAM,cAAgBmqB,EAAYxtB,KAAM,MAAS,MAAOiJ,SAAUkH,IAIxEpR,EAAGuG,GAAO2D,SAAUkH,OAQpCmI,EAAMjZ,GAAI,mBAAoB,WAE1B,GAAI4vB,GAAgB,GAChBC,EAAgB5W,EAAMjV,KAAM,IAAM8M,GAAagf,QAC/CC,EAAgBF,EAAOG,SAAS3V,IAChC4V,EAAgBvwB,EAAG,aAGlBuZ,GAAMzS,QAAS,UAAWhN,OAAS,GAEpCy2B,EAAgBhX,EAAMzS,QAAS,UAAWxC,KAAM;AAChD+rB,EAAgBE,EAAchjB,aAAgBgjB,EAAcD,SAAS3V,IAAMwV,EAAOG,SAAS3V,MAGrFpB,EAAMzY,GAAI,YAEhByvB,EAAgBhX,EAAMjV,KAAM,eAC5B+rB,EAAgBE,EAAchjB,aAAgBgjB,EAAcD,SAAS3V,IAAMwV,EAAOG,SAAS3V,OAI1F0V,EAAcH,EAAcjoB,OAAOuoB,aAAeH,EAAepoB,OAAOuoB,YAAcvoB,OAAOwoB,cAE9FF,EAAcphB,SACV5B,UAAW8iB,EAAcH,MAKhCL,IAGDtW,EAAMjV,KAAM,IAAM8M,GAAalQ,KAAM,SAAU5F,EAAGiL,GAE9CkoB,EAAczuB,EAAGuuB,EAAgBhoB,IACjCkoB,EAAYnuB,GAAI,cAAe,WAE3B,GAAIowB,GAAgB1wB,EAAGuG,EACvBmqB,GAAcpnB,YAAa8H,GAC3BmI,EAAMjV,KAAM,cAAgBtE,EAAG/H,MAAOgJ,KAAM,MAAS,MAAOqI,YAAa8H,OAIjFmI,EAAMxY,QAAS,oBAAqB6uB,IAGxC,IAAIxvB,GAAWmZ,EAAMtY,KAAM,uBAE3B,KAAM4uB,GAAczvB,GAAwB,UAAZA,GAAmD,kBAApB6H,QAAO7H,GACtE,CAEI,GAAI+Y,KAcJ,OAbAI,GAAMjV,KAAM,2BAA4BpD,KAAM,WAET,YAA5BlB,EAAG/H,MAAOgJ,KAAM,QAEjBkY,EAAOnZ,EAAG/H,MAAOgJ,KAAM,SAAYjB,EAAG/H,MAAO6I,GAAI,YAIjDqY,EAAOnZ,EAAG/H,MAAOgJ,KAAM,SAAYjB,EAAG/H,MAAO+O,QAIrDiB,OAAO7H,GAAW+Y,IACX,EAIP,OAAQ0W,EAnXhB,OACI3e,SAAUA,KA4XlBlR,EAAE2wB,GAAGvU,aAAe,WAEhB,MAAOhW,GAAG/C,cAAc4N,kBAAkBC,SAAUjZ,OAOxD+H,EAAE2wB,GAAGnX,cAAgB,WAMjB,QAASoX,GAAQlW,EAAU7f,GAEvB,GAAI8C,GAAQ+c,EAAS/c,MAAO,gBAE5B,IAAOA,EAAM,GACb,CACI,GACIkzB,GADAC,EAAW,eAEXjiB,IAEJ,KADAA,EAAS,GAAMlR,EAAM,GACsB,QAAlCkzB,EAAQC,EAAI5G,KAAMvsB,EAAM,MAE7BkR,EAASpT,KAAMo1B,EAAM,GAGzB,KAAM,GAAIv1B,GAAIuT,EAAS/U,OAAS,EAAGwB,GAAK,EAAGA,IAC3C,CACI,GAAI0L,KACJA,GAAI6H,EAASvT,IAAMT,EACnBA,EAAmBmM,EAEvB4T,EAAS5a,EAAE+U,QAAQ,EAAM6F,EAAQ/f,OAIjC+f,GAAOjd,EAAM,IAAM9C,EA5B3B,GAAIsW,GAASlZ,KACT2iB,IA2DJ,OA5BAzJ,GAAK7M,KAAM,2BAA4BpD,KAAM,SAAU5F,EAAGiL,GAEtD,GAAOvG,EAAGuG,GAAOtF,KAAM,QAEnB,GAAiC,YAA5BjB,EAAGuG,GAAOtF,KAAM,QACrB,CAEI,GAAI8vB,KACJ/wB,GAAGmR,GAAO7M,KAAM,UAAYtE,EAAGuG,GAAOtF,KAAM,QAAW,cAAeC,KAAM,SAAU3B,EAAGyxB,GAErFD,EAAYt1B,KAAMuE,EAAGgxB,GAAWhqB,SAEpC4pB,EAAQ5wB,EAAGuG,GAAOtF,KAAM,QAAU8vB,OAEA,SAA5B/wB,EAAGuG,GAAOtF,KAAM,QAEjBjB,EAAGuG,GAAOzF,GAAI,aAEf8vB,EAAQ5wB,EAAGuG,GAAOtF,KAAM,QAAUjB,EAAGuG,GAAOS,OAKhD4pB,EAAQ5wB,EAAGuG,GAAOtF,KAAM,QAAUjB,EAAGuG,GAAOS,SAKjD4T,IAEZzU,OAAQnD,iBAyBXA,gBAAgB8C,SAGhB,IAAImrB,QAASjuB,gBAAgBK,aAQ7B8C,QAAQzF,UAAWiT,MAAO,WAEtBsd,OAAO7sB", "sourcesContent": [ - "var TemplateCache = {};\n\nTemplateCache[\"addressSuggestions/addressDoctor.html\"] = \"\";\n\nTemplateCache[\"addressSuggestions/postFinder.html\"] = \"{{#addresses}}\\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"{{/addresses}}\\n\" +\n \"\";\n\nTemplateCache[\"error/errorMessage.html\"] = \"
    \\n\" +\n \" Code {{code}}:\\n\" +\n \" {{{message}}}\\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"error/errorPopup.html\"] = \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"modal/modal.html\"] = \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#title}}\\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"

    {{{title}}}

    \\n\" +\n \"
    \\n\" +\n \" {{/title}}\\n\" +\n \"\\n\" +\n \"
    {{{content}}}
    \\n\" +\n \"\\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#labelDismiss}}\\n\" +\n \" \\n\" +\n \" {{/labelDismiss}}\\n\" +\n \"\\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"waitscreen/waitscreen.html\"] = \"
    \";\n\n(function defineMustache(global,factory){if(typeof exports===\"object\"&&exports&&typeof exports.nodeName!==\"string\"){factory(exports)}else if(typeof define===\"function\"&&define.amd){define([\"exports\"],factory)}else{global.Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)===\"[object Array]\"};function isFunction(object){return typeof object===\"function\"}function typeStr(obj){return isArray(obj)?\"array\":typeof obj}function escapeRegExp(string){return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")}function hasProperty(obj,propName){return obj!=null&&typeof obj===\"object\"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"/\":\"/\"};function escapeHtml(string){return String(string).replace(/[&<>\"'\\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\\s*/;var spaceRe=/\\s+/;var equalsRe=/\\s*=/;var curlyRe=/\\s*\\}/;var tagRe=/#|\\^|\\/|>|\\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile===\"string\")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error(\"Invalid tags: \"+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+\"\\\\s*\");closingTagRe=new RegExp(\"\\\\s*\"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp(\"\\\\s*\"+escapeRegExp(\"}\"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===\"\"};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return\"\";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail=\"\";break;case 0:match=\"\";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={\".\":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(\".\")>0){value=context.view;names=name.split(\".\");index=0;while(value!=null&&index\")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol===\"&\")value=this.unescapedValue(token,context);else if(symbol===\"name\")value=this.escapedValue(token,context);else if(symbol===\"text\")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer=\"\";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j\n * =====================================================================================\n */\n\n/**\n * @module PlentyFramework\n */\n(function( $ )\n{\n // will be overridden by grunt\n var version = \"1.0.8\";\n\n /**\n * Collection of uncompiled registered factories & services.\n * See {{#crossLink \"PlentyFramework/compile:method\"}}.compile(){{/crossLink}}\n * @attribute components\n * @static\n * @type {{factories: {}, services: {}}}\n */\n var components = {\n factories : {},\n services : {},\n directives: {}\n };\n\n /**\n * Framework providing client functions for plentymarkets Webshops.\n * @class PlentyFramework\n * @constructor\n */\n PlentyFramework = function()\n {\n };\n\n var instance = null;\n PlentyFramework.getInstance = function()\n {\n instance = instance || new PlentyFramework();\n return instance;\n };\n\n PlentyFramework.version = (function() {\n\n return {\n get: function() {\n return version;\n },\n equals: function( v ) {\n return compare(v) == 0;\n },\n compare: compare\n };\n\n function compare( compare )\n {\n var localVersion = version.split(\".\");\n var compareVersion = compare.split(\".\");\n\n for( var i = 0; i < compareVersion.length; i++ )\n {\n if( localVersion[i] === compareVersion[i] || compareVersion[i] === \"*\" )\n {\n continue;\n }\n\n if( parseInt(localVersion[i]) < parseInt(compareVersion[i]) )\n {\n return -1;\n }\n\n if( parseInt(localVersion[i]) > parseInt(compareVersion[i]) )\n {\n return 1;\n }\n }\n return 0;\n }\n\n })();\n\n /**\n * Customizable controls for partials will be injected here.\n * (e.g. Modal)\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.partials = {};\n\n /**\n * Collection of registered global variables\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.globals = {};\n\n /**\n * Set a global variable.\n * @function setGlobal\n * @static\n * @param {string} identifier A unique identifier to reference this variable\n * @param {*} value The value to set\n * @return {*} The value\n */\n PlentyFramework.setGlobal = function( identifier, value )\n {\n if ( PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n console.error( 'Global variable \"' + identifier + '\" already exists and cannot be overridden.' );\n return null;\n }\n\n PlentyFramework.globals[identifier] = value;\n\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Get the value of a global variable or undefined if not exists\n * @function getGlobal\n * @static\n * @param identifier The identifier of the requested variable\n * @return {*} The value of the variable\n */\n PlentyFramework.getGlobal = function( identifier, fallbackValue )\n {\n if( !PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n return fallbackValue;\n }\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Collection of registered directives\n * @type {Array}\n * @static\n */\n PlentyFramework.directives = {};\n\n /**\n * Register directive. Directives can be bound to dynamically added nodes by calling pm.bindPlentyFunctions();\n * @function directive\n * @static\n * @param {string} selector jQuery selector of the DOM-elements to bind the directive to\n * @param {function} callback Function to add directives behaviour\n * @param {Array} dependencies List of required services. Services will be passed to callback function\n * @param {boolean} allowDuplicates Defines if a directive can be bound to the same element multiple times\n * @return {object} The created directive\n */\n PlentyFramework.directive = function( directiveName, directiveFunctions, dependencies )\n {\n // Catch type mismatching for 'directiveName'\n if ( typeof directiveName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof directiveName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof directiveFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof directiveFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.directives[directiveName] = {\n name : directiveName,\n dependencies: dependencies,\n setup : directiveFunctions\n };\n };\n\n /**\n * Bind registered directives.\n * @function bindDirectives\n * @param {string} [directiveSelector] restrict binding to elements matching this selector\n */\n PlentyFramework.prototype.bindDirectives = function( rootElement )\n {\n\n rootElement = rootElement || 'html';\n\n $( rootElement ).find( '[data-plenty]' ).each( function( i, element )\n {\n\n var directives = parseDirectives( $( element ).attr( 'data-plenty' ), $( element ) );\n\n if ( directives.length <= 0 )\n {\n // continue\n return;\n }\n\n addCustomEvents( element );\n\n for ( var i = 0; i < directives.length; i++ )\n {\n var directive = directives[i];\n if ( !!PlentyFramework.directives[directive.class] && PlentyFramework.directives.hasOwnProperty( directive.class ) )\n {\n\n var callback = PlentyFramework.directives[directive.class][directive.method];\n if ( !!callback && typeof callback == \"function\" )\n {\n\n if ( directive.event == \"ready\" )\n {\n callback.apply( null, directive.params );\n }\n else\n {\n bindEventCallback( $( element ), directive.event, callback, directive.params );\n /*\n $( element ).on( directive.event, function( e )\n {\n directive = injectEvent( directive, e );\n return callback.apply( null, directive.params );\n } );\n */\n }\n\n }\n else\n {\n console.error( \"Method not found: \" + directive.method + \" in \" + directive.class );\n }\n\n }\n else\n {\n console.error( \"Directive not found: \" + directive.class );\n }\n }\n } );\n\n $( document ).trigger( 'initPartials', rootElement );\n };\n\n var eventStack = [];\n\n PlentyFramework.getRecentEvent = function( eventType )\n {\n var lastEventIdx = eventStack.length - 1;\n if ( !eventType )\n {\n return eventStack[lastEventIdx];\n }\n else\n {\n for ( var i = lastEventIdx; i >= 0; i-- )\n {\n if ( eventType == eventStack[i].type )\n {\n return eventStack[i];\n }\n }\n }\n\n return null;\n\n };\n\n PlentyFramework.pushEvent = function( event )\n {\n eventStack.push( event );\n };\n\n /**\n * Bind event to element by eventType.\n * If cms says \"click:Foo.bar(this, event)\" eventType is \"click\".\n *\n * @param $elem - jQuery object on which event was triggered\n * @param eventType - type of event\n * @param callback - callback function of directive [example: \"bar(this, event)\"]\n * @param params - list of parameters for callback function.\n */\n function bindEventCallback( $elem, eventType, callback, params )\n {\n $elem.on( eventType, function( event )\n {\n eventStack.push( event );\n return callback.apply( null, params );\n } );\n\n if( document.readyState === \"complete\" && eventType === \"ready\" )\n {\n // execute 'ready' directives directly if document is already loaded\n callback.apply( null, params );\n }\n }\n\n function addCustomEvents( element )\n {\n\n var $elem = $( element );\n\n if ( $elem.is( 'input[type=\"checkbox\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n if ( $elem.is( ':checked' ) )\n {\n $elem.trigger( 'check' );\n }\n else\n {\n $elem.trigger( 'uncheck' );\n }\n } );\n }\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n var radioGroup = $elem.attr( 'name' );\n\n $( 'input[type=\"radio\"][name=\"' + radioGroup + '\"]' ).each( function( i, radio )\n {\n var $radio = $( radio );\n if ( $radio.is( ':checked' ) )\n {\n $radio.trigger( 'check' );\n }\n else\n {\n $radio.trigger( 'uncheck' );\n }\n\n } );\n\n } );\n }\n }\n\n function parseDirectives( input, thisValue )\n {\n var directivePattern = /^(([\\w]+):)?([\\w]+)\\.([\\w]+)(\\((.*)\\))?$/;\n var expressions = input.split( ';' );\n var directives = [];\n\n for ( var i = 0; i < expressions.length; i++ )\n {\n var expression = expressions[i].trim();\n\n if ( !expression )\n {\n continue;\n }\n\n if ( !directivePattern.test( expression ) )\n {\n // console.warn( \"Invalid directive: \" + expression );\n continue;\n }\n\n var match = expression.match( directivePattern );\n\n if ( !match[3] || match[3].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Class name not set.\" );\n continue;\n }\n\n if ( !match[4] || match[4].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Method not set.\" );\n continue;\n }\n\n var directive = {\n event : match[2] || 'ready',\n class : match[3],\n method: match[4],\n params: []\n };\n\n if ( !!match[6] && match[6].length > 0 )\n {\n var params = match[6].match( /(['][^']+['])|([\\w-]+)|([\"][^\"]+[\"])/g );\n for ( var j = 0; j < params.length; j++ )\n {\n var param = params[j].trim();\n if ( !isNaN( parseFloat( param ) ) )\n {\n directive.params.push( parseFloat( param ) );\n }\n else if ( param.toLowerCase() == 'true' )\n {\n directive.params.push( true );\n }\n else if ( param.toLowerCase() == 'false' )\n {\n directive.params.push( false );\n }\n else if ( param.toLowerCase() == 'this' )\n {\n directive.params.push( thisValue );\n }\n else\n {\n directive.params.push( param.replace( /^['\"]|['\"]$/g, '' ) );\n }\n }\n }\n\n directives.push( directive );\n\n }\n return directives;\n }\n\n /**\n * Register a new service\n * @function service\n * @static\n * @param {string} serviceName Unique identifier of the service to get/ create\n * @param {function} serviceFunctions Callback containing all public functions of this service.\n * @param {Array} [dependencies] Identifiers of required services to inject in serviceFunctions\n * @return {object} The object described in serviceFunctions(). Can be received via\n * PlentyFramework.[serviceName]\n */\n PlentyFramework.service = function( serviceName, serviceFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof serviceName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof serviceName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof serviceFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof serviceFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.services[serviceName] = {\n name : serviceName,\n dependencies: dependencies,\n setup : serviceFunctions\n };\n\n };\n\n /**\n * Collection of compiled factories\n * @attribute factories\n * @static\n * @type {object}\n */\n PlentyFramework.factories = {};\n\n /**\n * Register a new factory\n * @function factory\n * @static\n * @param {string} factoryName A unique name of the new factory\n * @param {function} factoryFunctions The function describing the factory\n * @param {Array} dependencies List of required factories to inject\n */\n PlentyFramework.factory = function( factoryName, factoryFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof factoryName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof factoryName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof factoryFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof factoryFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n components.factories[factoryName] = {\n name : factoryName,\n dependencies: dependencies,\n setup : factoryFunctions\n }\n\n };\n\n /**\n * Renders html template. Will provide given data to templates scope.\n * Uses Mustache syntax for data-binding.\n * @function compileTemplate\n * @static\n * @param {String} template relative path to partials template to load. Base path = '/src/partials/'\n * @param {Object} data data to privide to templates scope.\n * @returns {String} The rendered html string\n */\n PlentyFramework.compileTemplate = function( template, data )\n {\n data = data || {};\n data.translate = function()\n {\n return function( text, render )\n {\n return render( PlentyFramework.translate( text ) );\n };\n };\n return Mustache.render( TemplateCache[template], data );\n };\n\n /**\n * The path on the server where the script is located in.\n * @attribute\n * @static\n * @type {String}\n */\n PlentyFramework.scriptPath = '';\n\n /**\n * Collection of locale strings will be injected here after reading language file.\n * @attribute\n * @static\n * @type {Object}\n */\n PlentyFramework.Strings = {};\n\n /**\n * Load language file containing translations of locale strings.\n * @function loadLanguageFile\n * @static\n * @param fileName relative path to language file.\n */\n PlentyFramework.loadLanguageFile = function( fileName )\n {\n $.ajax({\n url: PlentyFramework.scriptPath + fileName,\n dataType: 'json'\n }).done( function( response ) {\n PlentyFramework.Strings = response;\n });\n };\n\n /**\n * Try to get locale translation of given string.\n * Render translated string using Mustache syntax\n * if additional parameters are given.\n * @function translate\n * @static\n * @param {String} string The string to translate\n * @param {Object} [params] additional data for rendering\n * @returns {String} The translation of the given string if found. Otherwise returns the original string.\n */\n PlentyFramework.translate = function( string, params )\n {\n var localeString;\n if ( PlentyFramework.Strings.hasOwnProperty( string ) )\n {\n localeString = PlentyFramework.Strings[string];\n }\n else\n {\n localeString = string;\n console.warn( 'No translation found for \"' + localeString + '\".' );\n }\n\n if ( !!params )\n {\n localeString = Mustache.render( localeString, params );\n }\n\n return localeString;\n\n };\n\n /**\n * Compile registered factories & services\n * @function compile\n * @static\n */\n PlentyFramework.compile = function()\n {\n\n for ( var factory in components.factories )\n {\n if ( !PlentyFramework.factories.hasOwnProperty( factory ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.factories[factory], 3 );\n }\n }\n\n for ( var service in components.services )\n {\n if ( !PlentyFramework.prototype.hasOwnProperty( service ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.services[service], 2 );\n }\n }\n\n for ( var directive in components.directives )\n {\n if ( !PlentyFramework.directives.hasOwnProperty( directive ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.directives[directive], 1 );\n }\n }\n\n var scripts = document.getElementsByTagName( 'SCRIPT' );\n for( var i = scripts.length - 1; i >= 0; i-- ) {\n var path = scripts[i].src.match( /(.*)\\/(.*)\\.js(\\?\\S*)?$/ );\n if( !!path ) {\n PlentyFramework.scriptPath = path[1];\n break;\n }\n }\n\n };\n\n // Level: 1 = directive, 2 = service, 3 = factory\n function compileComponent( component, componentLevel, dependencyStack )\n {\n dependencyStack = dependencyStack || [];\n\n // resolve dependencies\n var compiledDependencies = [];\n for ( var i = 0; i < component.dependencies.length; i++ )\n {\n var dependency = component.dependencies[i];\n if ( $.inArray( dependency, dependencyStack ) < 0 )\n {\n // add dependency to stack to avoid cyclic injection\n dependencyStack.push( dependency );\n\n if ( components.factories.hasOwnProperty( dependency ) )\n {\n // required dependency is a factory\n if ( !PlentyFramework.factories.hasOwnProperty( dependency ) )\n {\n // factory is not compiled yet\n compileComponent( components.factories[dependency], 3, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.factories[dependency] );\n continue;\n }\n\n if ( componentLevel <= 2 && components.services.hasOwnProperty( dependency ) )\n {\n // required dependency is a service\n if ( !PlentyFramework.prototype.hasOwnProperty( dependency ) )\n {\n // service is not compiled yet\n compileComponent( components.services[dependency], 2, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.prototype[dependency] );\n continue;\n }\n\n if ( componentLevel <= 1 && components.directives.hasOwnProperty( dependency ) )\n {\n // required dependency is a directive\n if ( !PlentyFramework.directives.hasOwnProperty( dependency ) )\n {\n // directive is not compiled yet\n compileComponent( components.directives[dependency], 1, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.directives[dependency] );\n continue;\n }\n\n console.error( 'Cannot inject dependency \"' + dependency + '\": Object not found.' );\n }\n else\n {\n console.error( 'Cyclic dependency injection: ' + dependencyStack.join( ' -> ' ) + ' -> ' + dependency );\n }\n }\n\n // compile component\n if ( componentLevel == 3 )\n {\n PlentyFramework.factories[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 2 )\n {\n PlentyFramework.prototype[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 1 )\n {\n PlentyFramework.directives[component.name] = component.setup.apply( null, compiledDependencies );\n }\n }\n\n}( jQuery ));\n\n\n\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.directive( 'Authentication', function( AuthenticationService )\n {\n return {\n login: login\n };\n\n function login( elem )\n {\n pm.getRecentEvent().preventDefault();\n AuthenticationService.customerLogin( $( elem ) );\n }\n }, [\"AuthenticationService\"] );\n\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Basket', function( BasketService )\n {\n\n return {\n addBasketItem : addBasketItem,\n changeItemQuantity: changeItemQuantity,\n setItemQuantity : setItemQuantity\n };\n\n function addBasketItem( elem )\n {\n pm.getRecentEvent().preventDefault();\n //init\n var basketItemsList = {};\n var $elem = $( elem );\n var parentForm = $elem.parents( 'form' );\n\n basketItemsList.BasketItemItemID = parentForm.find( '[name=\"ArticleID\"]' ).val();\n basketItemsList.BasketItemPriceID = parentForm.find( '[name=\"SYS_P_ID\"]' ).val();\n basketItemsList.BasketItemQuantity = parentForm.find( '[name=\"ArticleQuantity\"]' ).val();\n basketItemsList.BasketItemBranchID = parentForm.find( '[name=\"source_category\"]' ).val();\n\n //attributes\n var attributeInputsList = parentForm.find( '[name^=\"ArticleAttribute\"]' );\n var attributesList = [];\n\n $.each( attributeInputsList, function( idx, elem )\n {\n var match = elem.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( elem ).val()\n } );\n }\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItemsList.BasketItemAttributesList = attributesList;\n }\n\n //add basketItem and refresh previewLists\n BasketService.addItem( [basketItemsList] );\n\n }\n\n function changeItemQuantity( elem, increment )\n {\n var $elem = $( elem );\n var $quantityInput = $elem.parent().find( 'input' );\n var maxLength = parseInt( $quantityInput.attr( 'maxlength' ) ) || 5;\n var value = parseInt( $quantityInput.val() ) + increment;\n\n var isBasketView = $elem.parents( '[data-basket-item-id]' ).length > 0;\n\n if ( isBasketView )\n {\n if ( (value + '').length <= maxLength && value >= 0 )\n {\n $quantityInput.val( value );\n }\n\n var timeout = $elem.data( 'timeout' );\n\n if ( !!timeout )\n {\n window.clearTimeout( timeout );\n }\n\n timeout = window.setTimeout( function()\n {\n $quantityInput.trigger( 'change' );\n }, 1000 );\n\n $elem.data( 'timeout', timeout );\n }\n else\n {\n if ( (value + '').length <= maxLength && value >= 1 )\n {\n $quantityInput.val( value );\n }\n }\n }\n\n function setItemQuantity( basketItemID, input )\n {\n BasketService.setItemQuantity(\n basketItemID,\n parseInt( $( input ).val() )\n ).fail( function()\n {\n // reset input's value on cancel\n var basketItem = BasketService.getItem( basketItemID );\n $( input ).val( basketItem.BasketItemQuantity );\n } );\n }\n\n }, ['BasketService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Checkout', function( CheckoutService )\n {\n\n return {\n setMethodOfPayment: setMethodOfPayment,\n confirmAtrigaPaymax: confirmAtrigaPaymax\n };\n\n function setMethodOfPayment( paymentID )\n {\n CheckoutService.setMethodOfPayment( paymentID );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxConfirmed )\n {\n CheckoutService.confirmAtrigaPaymax( atrigaPaymaxConfirmed );\n }\n }, ['CheckoutService'] );\n})( jQuery, PlentyFramework );\n/**\n * Mobile dropdowns\n * Toggles dropdowns using css class 'open' instead of pseudo class :hover\n * Usage:\n *
  • \n * ...\n *
  • \n *\n * possible values for CONDITION\n * \"touch\" : use 'open'-class if device is touch-device AND media size is 'md' or 'lg'\n * \"toggle-xs-sm-or-touch\" : use 'open'-class if device is \"touch\" (as above) OR media size is 'xs' or 'sm'\n *\n */\n(function( $, pm )\n{\n pm.directive( 'MobileDropdown', function( MediaSize )\n {\n // store all dropdown elements\n var dropdownElements = [];\n\n // store dropdown elements which should be closed by clicking outside the element itself\n var closableDropdownElements = [];\n\n return {\n initDropdowns: initDropdowns,\n openDropdown : openDropdown,\n slideDropdown: slideDropdown\n };\n\n function initDropdowns()\n {\n $( window ).on( 'orientationchange sizeChange', function()\n {\n if ( !$( \"input\" ).is( \":focus\" ) )\n {\n resetDropdowns( dropdownElements );\n resetDropdowns( closableDropdownElements );\n }\n } );\n }\n\n function resetDropdowns( dropdownList, event )\n {\n var $current;\n for ( var i = 0; i < dropdownList.length; i++ )\n {\n $current = $( dropdownList[i] );\n if ( !!event )\n {\n if ( $current.find( $( event.target ) ).length === 0\n && !$( \"input\" ).is( \":focus\" ) )\n {\n $current.removeClass( 'open' );\n $( 'html' ).unbind( \"click touchstart\", resetEvent );\n }\n }\n else\n {\n if ( !$( \"input\" ).is( \":focus\" ) )\n {\n $current.removeClass( 'open' );\n $( 'html' ).unbind( \"click touchstart\", resetEvent );\n }\n }\n }\n\n }\n\n function openDropdown( elem, alwaysClickable )\n {\n var $elem = $( elem );\n var $parent = $elem.parent();\n\n // case 1: xs || sm || ( touch && ( md || lg ) ) -> open/close via click on small devices, open/close via\n // css-hover on desktop, open/close via click on touch-desktop (e.g. top navigation)\n\n if ( !!alwaysClickable && ( MediaSize.isInterval( 'xs, sm' ) || ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n // if href\n if ( !$elem.attr( 'href' ) )\n {\n avoidRedirectinStopPropagation( $parent.not( $elem ) );\n }\n }\n else\n {\n if ( !$elem.attr( 'href' ) )\n {\n // hide dropdown\n $parent.removeClass( 'open' );\n }\n }\n }\n\n // case 2: touch && ( md || lg ) -> open via 1st click on touch-desktop, return false (e.g. main navigation)\n\n if ( !alwaysClickable && ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n avoidRedirectinStopPropagation( $parent );\n }\n else\n {\n // redirect to href if dropdown is already open\n // do nothing\n }\n }\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", resetEvent );\n }\n\n function showDropdownHideOthers( elem, parent )\n {\n var $parent = $( parent );\n\n // hide other dropdowns\n resetDropdowns( closableDropdownElements, elem );\n\n // remember opened dropdown\n if ( $.inArray( $parent[0], closableDropdownElements ) < 0 )\n {\n closableDropdownElements.push( $parent[0] );\n }\n\n // show dropdown\n $parent.addClass( 'open' );\n }\n\n function avoidRedirectinStopPropagation( elem )\n {\n var $elem = $( elem );\n\n // avoid redirecting\n pm.getRecentEvent().preventDefault();\n\n // avoid closing popup by clicking itself\n $elem.off( 'click' );\n $elem.on( 'click', function( e )\n {\n e.stopPropagation();\n } );\n }\n\n function slideDropdown( elem )\n {\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n // size interval query is required since function is used on document ready to initial open active\n // navigation (on small devices)\n if ( MediaSize.isInterval( 'xs, sm' ) )\n {\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 400, function()\n {\n if ( $elemParent.is( '.open' ) && !$( \"input\" ).is( \":focus\" ) )\n {\n $elemParent.removeClass( 'open' );\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n if ( $.inArray( $elemParent[0], dropdownElements ) < 0 )\n {\n dropdownElements.push( $elemParent[0] );\n }\n }\n } );\n }\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", resetEvent );\n }\n\n function resetEvent( event )\n {\n resetDropdowns( closableDropdownElements, event );\n }\n\n }, ['MediaSizeService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Redirect', function( MediaSizeService, NavigatorService )\n {\n\n return {\n to : to,\n toCheckoutTab: toCheckoutTab\n };\n\n function to( href )\n {\n if ( MediaSizeService.interval() != 'xs' )\n {\n if ( typeof href === 'string' && href.indexOf('/') == -1 && $( href ).length > 0 )\n {\n window.location.assign( $( href ).attr( 'href' ) );\n }\n else\n {\n window.location.assign( href );\n }\n }\n }\n\n function toCheckoutTab( tabID )\n {\n NavigatorService.goToID( tabID );\n }\n\n }, ['MediaSizeService', 'NavigatorService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Tab', function( MediaSize )\n {\n\n var tabGroups = {};\n\n return {\n showTab : showTab,\n initRemoteLabel: initRemoteLabel,\n initRemoteTab : initRemoteTab,\n showRemoteTab : showRemoteTab\n };\n\n function showTab( tabSelector )\n {\n $( tabSelector ).tab( 'show' );\n }\n\n function initRemoteLabel( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).addLabel( $elem );\n }\n\n function initRemoteTab( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).setContent( $elem );\n }\n\n function showRemoteTab( tabID, groupID, interval )\n {\n if ( MediaSize.isInterval( interval ) )\n {\n pm.getRecentEvent().preventDefault();\n\n if ( !!tabGroups[groupID] && !!tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].showTab( tabID );\n }\n\n }\n }\n\n function TabGroup()\n {\n var tabs = {};\n var activeTab;\n\n return {\n addTab : addTab,\n showTab : showTab,\n getTab : getTab,\n resetTabs: resetTabs\n };\n\n function addTab( tabID )\n {\n tabs[tabID] = new Tab( tabID );\n return tabs[tabID];\n }\n\n function showTab( tabID )\n {\n var zIndex = 0;\n if ( !!activeTab )\n {\n // activeTab is set\n zIndex = parseInt( activeTab.getContent().parent().css( 'zIndex' ) );\n activeTab.hide();\n activeTab.getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n else\n {\n // activeTab not set before\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n var currentZ = parseInt( tabs[tab].getContent().parent().css( 'zIndex' ) );\n if ( zIndex == 0 || currentZ < zIndex )\n {\n zIndex = currentZ;\n }\n tabs[tab].hide();\n }\n }\n\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n }\n\n $( window ).on( 'sizeChange', resetTabs );\n }\n\n activeTab = tabs[tabID];\n activeTab.getContent().parent().css( 'zIndex', zIndex );\n activeTab.show();\n }\n\n function getTab( tabID )\n {\n return tabs[tabID];\n }\n\n function resetTabs()\n {\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].show();\n }\n }\n\n activeTab = null;\n }\n }\n\n function Tab( id )\n {\n var $content;\n var $labels = [];\n var tabID = id;\n\n return {\n addLabel : addLabel,\n setContent: setContent,\n getContent: getContent,\n getID : getID,\n show : show,\n hide : hide\n };\n\n function getID()\n {\n return tabID;\n }\n\n function addLabel( label )\n {\n $labels.push( label );\n return this;\n }\n\n function setContent( content )\n {\n $content = content;\n return this;\n }\n\n function getContent()\n {\n return $content;\n }\n\n function show()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].addClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.show().addClass( 'in' );\n }\n\n }\n\n function hide()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].removeClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.hide().removeClass( 'in' );\n }\n }\n }\n\n }, ['MediaSizeService'] );\n})( jQuery, PlentyFramework );\n/**\n * Add fancy ui modifications - the visual stuff - here.\n * Respond functionality like 'event':UI.myFunctionality(currentElement)\n *\n * Example:\n * \n *\n */\n(function( $, pm )\n{\n pm.directive( 'UI', function( MediaSizeService, SocialShareService, UIFactory )\n {\n // elements to calculate height.\n var equalHeightElementList = [];\n var toTopButtonList = [];\n\n return {\n initUIWindowEvents : initUIWindowEvents,\n showWaitscreen : showWaitscreen,\n hideWaitscreen : hideWaitscreen,\n addContentPageSlider: addContentPageSlider,\n equalHeight : equalHeight,\n initToTop : initToTop,\n initLazyload : initLazyload,\n initSlideToggle : initSlideToggle,\n slideDown : slideDown,\n slideUp : slideUp,\n slideToggle : slideToggle,\n toggleHideShow : toggleHideShow,\n toggleSocialShare : toggleSocialShare,\n toggleClass : toggleClass,\n addClass : addClass,\n removeClass : removeClass\n };\n\n function initUIWindowEvents()\n {\n // resize elements on window size change.\n $( window ).on( 'sizeChange contentChanged', function()\n {\n fireEqualHeight();\n } );\n\n $( window ).on( \"scroll resize\", function()\n {\n if ( toTopButtonList.length > 0 )\n {\n if ( $( document ).scrollTop() > 100 )\n {\n doToArrayElements( toTopButtonList, \"addClass\", \"visible\" );\n }\n else\n {\n doToArrayElements( toTopButtonList, \"removeClass\", \"visible\" );\n }\n }\n } );\n }\n\n /**\n * Display waitscreen on page e.g. for requests.\n * Use with care and don't forget to hide waitscreen, if your calls are done or broke!!\n */\n function showWaitscreen()\n {\n UIFactory.showWaitscreen();\n }\n\n /**\n * Just hide the waitscreen.\n * @param forceClose\n */\n function hideWaitscreen( forceClose )\n {\n UIFactory.hideWaitscreen( forceClose );\n }\n\n /**\n * Adds content page slider (owlCarousel)\n *\n * usage:\n *
    \n *
    \n * ...\n *
    \n *
    \n * ...\n *
    \n * ...\n *
    \n *\n * Legacy directive selector: data-plenty=\"contentpageSlider\"\n *\n * @param elem\n */\n function addContentPageSlider( elem )\n {\n $( elem ).owlCarousel( {\n navigation : true,\n navigationText : false,\n slideSpeed : 1000,\n paginationSpeed: 1000,\n singleItem : true,\n autoPlay : 6000,\n stopOnHover : true,\n afterMove : function( current )\n {\n $( current ).find( '[data-plenty-rel=\"lazyload\"]' ).trigger( 'appear' );\n }\n } );\n }\n\n /**\n * Equal Box height\n * Calculates equal box height for chosen elements.\n *\n * Legacy directive selector: data-plenty-equal\n *\n * @param elem\n * @param elementExists - default false\n */\n function equalHeight( elem, mediaSizes, elementExists )\n {\n var $elem = $( elem );\n var maxHeight = 0;\n var $equalTarget = {};\n var $equalTargetList = $elem.find( '[data-plenty-rel=\"equal-target\"]' ).length > 0 ? $elem.find( '[data-plenty-rel=\"equal-target\"]' ) : $elem.children();\n\n // if element wasn't pushed before.\n if ( elementExists !== true )\n {\n equalHeightElementList.push( elem );\n }\n\n for ( var i = $equalTargetList.length; i >= 0; i-- )\n {\n $equalTarget = $( $equalTargetList[i] );\n $equalTarget.css( 'height', '' );\n\n if ( $equalTarget.outerHeight( true ) > maxHeight )\n {\n maxHeight = $equalTarget.outerHeight( true );\n }\n }\n\n if ( !mediaSizes || MediaSizeService.isInterval( mediaSizes ) )\n {\n $equalTargetList.height( maxHeight );\n }\n }\n\n /**\n * Scroll page to top.\n * Just add without events.\n *\n * Legacy directive selector: data-plenty=\"toTop\"\n *\n * @param elem\n */\n function initToTop( elem )\n {\n var $elem = $( elem );\n\n $elem.click( function()\n {\n $( 'html, body' ).animate( {\n scrollTop: 0\n }, 400 );\n return false;\n } );\n\n if ( !!$.inArray( $elem, toTopButtonList ) )\n {\n toTopButtonList.push( $elem );\n }\n }\n\n /**\n * lazy load on ready.\n *\n * Legacy directive selector: img[data-plenty-lazyload]\n *\n * @param elem\n */\n function initLazyload( elem, effect )\n {\n var $elem = $( elem );\n\n $elem.lazyload( {\n effect: effect\n } );\n if ( $elem.is( 'img' ) )\n {\n $elem.on( 'loaded', function()\n {\n $elem.css( 'display', 'inline-block' );\n } );\n }\n }\n\n /**\n * Toggle show and hide animation.\n *\n * Legacy directive selector: data-plenty=\"openCloseToggle\"\n *\n * @param elem\n */\n function toggleHideShow( elem )\n {\n\n console.log( elem );\n\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 200, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n /**\n * Toggle target content on click.\n * Bind to checked-/ unchecked-property of radio buttons\n *\n * Legacy directive selector: data-plenty-slidetoggle\n *\n * @param elem\n */\n function initSlideToggle( elem, checked )\n {\n var $elem = $( elem );\n var $targetElement = $( $elem.attr( 'data-plenty-rel' ) );\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n // is radio button\n var $radioGroupList = $( 'input[type=\"radio\"][name=\"' + ( $elem.attr( 'name' ) ) + '\"]' );\n var visibleOnChecked = !checked || checked == 'checked';\n\n $radioGroupList.change( function()\n {\n var $self = $( this );\n $targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n if ( $self.is( ':checked' ) && $self[0] === $elem[0] && visibleOnChecked == true )\n {\n // checked\n $targetElement.slideDown( 400, function()\n {\n fireEqualHeight();\n } );\n }\n else\n {\n // unchecked (since other radio button has been checked)\n $targetElement.slideUp( 400, function()\n {\n fireEqualHeight();\n } );\n }\n } );\n }\n else\n {\n // is not radio button\n $elem.click( function()\n {\n //$targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n $elem.addClass( 'animating' );\n $targetElement.slideToggle( 400, function()\n {\n $elem.removeClass( 'animating' );\n $elem.toggleClass( 'active' );\n fireEqualHeight();\n } );\n } );\n }\n }\n\n function slideDown( target, duration )\n {\n slideAction( $( target ), duration, 'slideDown' );\n }\n\n function slideUp( target, duration )\n {\n slideAction( $( target ), duration, 'slideUp' );\n }\n\n function slideToggle( target, duration )\n {\n slideAction( $( target ), duration, 'slideToggle' );\n }\n\n function slideAction( $target, duration, callbackString )\n {\n duration = duration || 400;\n $target.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n $target[callbackString]( duration, function()\n {\n fireEqualHeight();\n } );\n }\n\n /**\n * TODO check comment\n * Social Share Activation\n * Activate and load share-buttons manually by clicking a separate button\n * Usage / data-attributes:\n *
    \n * Will be used to activate the service set in\n * data-plenty-social=\"\"\n * Will be replaced with loaded share button\n *
    \n *\n * possible values for data-plenty-social:\n * \"facebook-like\" : Load Facebooks \"Like\"-Button\n * \"facebook-recommend\" : Load Facebooks \"Recommend\"-Button\n * \"twitter\" : Load Twitter Button\n * \"google-plus\" : Load google \"+1\"-Button\n *\n * Additional Tooltips\n * You can extend the parent element with a (bootstrap) tooltip by adding data-toggle=\"tooltip\" and\n * title=\"TOOLTIP CONTENT\" Tooltip will be destroyed after activating a social service\n * (!) Requires bootstrap.js\n *\n * Legacy directive selector: data-plenty-social\n *\n * @param elem\n */\n function toggleSocialShare( elem, socialShareService )\n {\n var $elem = $( elem );\n var $toggle = $elem.find( '[data-plenty-rel=\"social-switch\"]' );\n\n // append container to put / delete service.html\n $elem.append( '
    ' );\n\n // add \"off\" class to switch, if neither \"off\" or \"on\" is set\n // replaced hasClass() with is() benchmark: http://jsperf.com/hasclasstest\n if ( !$toggle.is( 'off, on' ) )\n {\n $toggle.addClass( 'off' );\n }\n\n // toggle switch\n $toggle.on( 'click', function()\n {\n if ( $toggle.hasClass( 'off' ) )\n {\n // TODO remove bootstrap dependency\n if ( $elem.attr( \"data-toggle\" ) == \"tooltip\" )\n {\n $elem.tooltip( 'destroy' )\n }\n $toggle.removeClass( 'off' ).addClass( 'on' );\n // hide dummy button\n $elem.find( '[data-plenty-rel=\"social-placeholder\"]' ).hide();\n // load HTML defined in 'api'\n $elem.find( '.social-container' ).append( SocialShareService.getSocialService( socialShareService ) );\n }\n // do not disable social medias after activation\n } );\n }\n\n /**\n * Toggle Class\n * toggle style-classes on click\n * Usage / data-attribute:\n *
    \n * target : jQuery selector to toggle the class at.\n * class : class(es) to toggle at target element\n * media : only toggle class on given media sizes (optional)\n *\n * (!) using data-plenty-toggle on -elements will prevent redirecting to href=\"\"\n *\n * Legacy directive selector: data-plenty-toggle\n *\n * @param cssClass\n * @param target\n * @param interval\n */\n function toggleClass( cssClass, target, interval )\n {\n var $target = $( target );\n /* FIXME\n * Callisto 3.1 Design adaption:\n * NavigationCategoriesList\n * Line 8\n * BEFORE:\n *
  • \n * AFTER:\n *
  • \n *\n * Line 10\n * BEFORE:\n * \n * AFTER:\n * \n *\n * */\n if ( $target.parents( \".navbar-main\" ).length > 0 )\n {\n var $elem = $target.children( \"span\" );\n pm.directives[\"MobileDropdown\"].slideDropdown( $elem );\n return true;\n }\n\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $target.toggleClass( cssClass );\n return false;\n }\n }\n\n function addClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).addClass( cssClass );\n return false;\n }\n }\n\n function removeClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).removeClass( cssClass );\n return false;\n }\n }\n\n /*\n ##### PRIVATE FUNCTIONS ######\n */\n\n function fireEqualHeight()\n {\n for ( var i = equalHeightElementList.length - 1; i >= 0; i-- )\n {\n equalHeight( equalHeightElementList[i], '', true );\n }\n }\n\n function doToArrayElements( array, func, params )\n {\n for ( var i = array.length - 1; i >= 0; i-- )\n {\n array[i][func]( params );\n }\n }\n\n }, ['MediaSizeService', 'SocialShareService', 'UIFactory'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Validator', function( ValidationService )\n {\n\n return {\n validate: validate\n };\n\n function validate( form, errorClass )\n {\n return ValidationService.validate( form, errorClass );\n }\n\n }, ['ValidationService'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Handles requests to ReST API. Provides a {{#crossLink \"APIFactory/handleError:method\"}}default\n * error-handling{{/crossLink}}. Request parameters will be parsed to json internally
    \n * Requires:\n *
      \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class APIFactory\n * @static\n */\n pm.factory( 'APIFactory', function( UI, Modal )\n {\n\n var sessionExpirationTimeout = null;\n $( document ).ready( function()\n {\n renewLoginSession();\n } );\n\n return {\n get : _get,\n post : _post,\n put : _put,\n delete: _delete,\n idle : _idle\n };\n\n function renewLoginSession()\n {\n if ( !pm.getGlobal( 'LoginSession' ) )\n {\n return;\n }\n\n if ( !!sessionExpirationTimeout )\n {\n clearTimeout( sessionExpirationTimeout );\n }\n\n sessionExpirationTimeout = setTimeout( function()\n {\n $( window ).trigger( 'login-expired' );\n\n if ( pm.getGlobal( 'PageDesign' ) === \"Checkout\" )\n {\n Modal.prepare()\n .setTitle( pm.translate( 'Your session has expired.' ) )\n .setContent( pm.translate( 'Please log in again to continue shopping.' ) )\n .setLabelDismiss( null )\n .setLabelConfirm( pm.translate( 'OK' ) )\n .onConfirm( function()\n {\n window.location.assign( '/' );\n } )\n .onDismiss( function()\n {\n window.location.assign( '/' );\n } )\n .show();\n }\n\n }, pm.getGlobal( 'LoginSessionExpiration' ) );\n }\n\n /**\n * Is called by default if a request failed.
    \n * Can be prevented by setting the requests last parameter to false.\n *\n * @function handleError\n * @private\n *\n * @param {object} jqXHR
    jQuery\n * deferred Object\n */\n function handleError( jqXHR )\n {\n try\n {\n var responseText = $.parseJSON( jqXHR.responseText );\n UI.printErrors( responseText.error.error_stack );\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n }\n\n /**\n * Sends a GET request to ReST-API\n *\n * @function get\n *\n * @param {string} url The URL to send the request to\n * @param {object} params The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _get( url, params, ignoreErrors, runInBackground, sync )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'GET',\n data : params,\n dataType: 'json',\n async : !sync,\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a POST request to ReST-API\n *\n * @function post\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _post( url, data, ignoreErrors, runInBackground )\n {\n\n var params = {\n type : 'POST',\n dataType: 'json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n };\n\n if ( !!data && data.isFile )\n {\n params.cache = data.cache;\n params.processData = data.processData;\n params.data = data.data;\n params.contentType = false;\n }\n else\n {\n params.data = JSON.stringify( data );\n params.contentType = 'application/json';\n }\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url, params\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n }\n\n /**\n * Sends a PUT request to ReST-API\n *\n * @function put\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _put( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'PUT',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a DELETE request to ReST-API\n *\n * @function delete\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @returns {object} jQuery\n * deferred Object\n */\n function _delete( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'DELETE',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Get a idle request doing nothing for chaining methods\n * @returns {object} jQuery\n * deferred Object\n */\n function _idle()\n {\n return $.Deferred().resolve();\n }\n\n }, ['UIFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Provide methods for receiving layout containers, layout parameters\n * or category content from API
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    \n * @class CMSFactory\n * @static\n */\n pm.factory( 'CMSFactory', function( API )\n {\n\n return {\n getContainer : getContainer,\n getParams : getParams,\n getCategoryContent: getCategoryContent\n };\n\n /**\n * Prepare the request to receive HTML-Content from CMS\n * @function getContainer\n * @param {string} containerName The Layoutcontainer to receive.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the location in\n * the CMS\n * (e.g. 'Checkout')\n * @example\n * CMSFactory.getContainer( 'CheckoutTotals' ).from( 'Checkout' )\n * .done(function( response ) {\n * // container content\n * var html = response.data[0]\n * });\n */\n function getContainer( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/container_' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n\n }\n\n /**\n * Prepare the request to receive Layout parameters for a template\n * @function getParams\n * @param {string} containerName The Layoutcontainer to receive the parameteres of.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the\n * location in the CMS\n * (e.g. 'ItemView')\n * @example\n * CMSFactory.getParams( 'BasketItemsList' ).from( 'ItemView' )\n * .done(function( response ) {\n * // BasketItems\n * var items = response.data;\n * });\n */\n function getParams( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n }\n\n /**\n * Get the content of a category specified by its ID\n * @function getCategoryContent\n * @param {number} categoryID The ID of the category to get the content from\n * @returns {object} jQuery deferred\n * Object\n */\n function getCategoryContent( categoryID )\n {\n return API.get( '/rest/categoryview/categorycontentbody/?categoryID=' + categoryID );\n }\n\n }, ['APIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Holds checkout data for global access and provides methods\n * for reloading content dynamically-
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutFactory\n * @static\n */\n pm.factory( 'CheckoutFactory', function( API, CMS, UI )\n {\n\n // data received from ReST API\n var checkoutData;\n\n // instance wrapped checkout object for global access\n var checkout;\n\n return {\n getCheckout : getCheckout,\n setCheckout : setCheckout,\n loadCheckout : loadCheckout,\n reloadContainer : reloadContainer,\n reloadCatContent : reloadCatContent,\n reloadItemContainer: reloadItemContainer\n };\n\n function Checkout()\n {\n return checkoutData;\n }\n\n /**\n * Returns instance of wrapped checkout object\n * @function getCheckout\n * @returns {Checkout} Instance of checkout object\n */\n function getCheckout( copy )\n {\n if ( !checkout || !checkoutData )\n {\n loadCheckout( true );\n }\n\n if ( !!copy )\n {\n return $.extend( true, {}, checkoutData );\n }\n return checkout;\n }\n\n /**\n * Receive global checkout data from ReST-API\n * @function loadCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function loadCheckout( sync )\n {\n\n return API.get( '/rest/checkout/', null, false, false, sync )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n }\n\n /**\n * Update checkout data on server\n * @function setCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function setCheckout()\n {\n\n return API.put( '/rest/checkout', checkout )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-checkout-template=\"...\"\n * @function reloadContainer\n * @param {string} container Name of the template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadContainer( container )\n {\n\n return CMS.getContainer( \"checkout\" + container ).from( 'checkout' )\n .done( function( response )\n {\n $( '[data-plenty-checkout-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n } );\n } );\n }\n\n /**\n * Get category content from server and replace received HTML\n * in containers marked with data-plenty-checkout-catcontent=\"...\"\n * @function reloadCatContent\n * @param {number} catId ID of the category to load content (description 1) from server\n * @return {object} jQuery deferred\n * Object\n * @deprecated\n */\n function reloadCatContent( catId )\n {\n\n return CMS.getCategoryContent( catId )\n .done( function( response )\n {\n $( '[data-plenty-checkout-catcontent=\"' + catId + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-itemview-template=\"...\"\n * @function reloadItemContainer\n * @param {string} container Name of the (item view) template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadItemContainer( container )\n {\n\n return CMS.getContainer( 'itemview' + container ).from( 'itemview' )\n .done( function( response )\n {\n $( '[data-plenty-itemview-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n }, ['APIFactory', 'CMSFactory', 'UIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Provides methods for creating and displaying modal popups.\n * @class ModalFactory\n * @static\n */\n pm.factory( 'ModalFactory', function()\n {\n\n return {\n prepare: prepare,\n isModal: isModal\n };\n\n /**\n * Detect if given html contains a valid modal\n * @function isModal\n * @param {string} html\n * @returns {boolean}\n */\n function isModal( html )\n {\n return PlentyFramework.partials.Modal.isModal( html );\n }\n\n /**\n * Create a new Instance of {{#crossLink \"ModalFactory.Modal\"}}Modal{{/crossLink}}\n * @function prepare\n * @returns {Modal}\n */\n function prepare( selector )\n {\n return new Modal( selector );\n }\n\n /**\n * Holds configuration of a modal and provides methods for displaying and hiding the modal\n * @class Modal\n * @for ModalFactory\n * @returns {Modal}\n * @constructor\n */\n function Modal( selector )\n {\n\n var modal = this;\n modal.selector = selector;\n\n /**\n * The title of the modal\n * @attribute title\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.title = '';\n\n modal.cssClass = '';\n\n /**\n * The content of the modal\n * @attribute content\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.content = '';\n\n /**\n * The content of the dismiss-button\n * @attribute labelDismiss\n * @type {string}\n * @private\n * @default \"Abbrechen\"\n */\n modal.labelDismiss = pm.translate( \"Cancel\" );\n\n /**\n * the label of the confirmation button\n * @attribute labelConfirm\n * @type {string}\n * @private\n * @default \"Bestätigen\"\n */\n modal.labelConfirm = pm.translate( \"Confirm\" );\n\n /**\n * Callback when modal is confirmed by clicking confirmation button.\n * Modal will not be dismissed if callback returns false.\n * @attribute onConfirm\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onConfirm = function()\n {\n };\n\n /**\n * Callback when modal is dismissed by closing the modal\n * @attribute onDismiss\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onDismiss = function()\n {\n };\n\n /**\n * jQuery selector of the container element to display the modal in.\n * @attribute container\n * @type {string}\n * @private\n * @default \"body\"\n */\n modal.container = 'body';\n\n /**\n * Timeout to close the modal automatically. Set <0 to disable.\n * @attribute timeout\n * @type {number}\n * @private\n * @default -1\n */\n modal.timeout = -1;\n\n modal.hide = hide;\n modal.startTimeout = startTimeout;\n modal.stopTimeout = stopTimeout;\n modal.pauseTimeout = pauseTimeout;\n modal.continueTimeout = continueTimeout;\n\n var bsModal;\n var timeout, interval;\n var timeRemaining, timeStart;\n var paused = false;\n\n return {\n setTitle : setTitle,\n setClass : setClass,\n setContent : setContent,\n setContainer : setContainer,\n setLabelConfirm: setLabelConfirm,\n setLabelDismiss: setLabelDismiss,\n onConfirm : onConfirm,\n onDismiss : onDismiss,\n setTimeout : setTimeout,\n show : show,\n hide : hide\n };\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/title:attribute}}title{{/crossLink}} of the modal\n * @function setTitle\n * @param {string} title The title\n * @returns {Modal} Modal object for chaining methods\n */\n function setTitle( title )\n {\n modal.title = title;\n return this;\n }\n\n function setClass( cssClass )\n {\n modal.cssClass = cssClass;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/content:attribute}}content{{/crossLink}} of the modal\n * @function setContent\n * @param {string} content The content\n * @returns {Modal} Modal object for chaining methods\n */\n function setContent( content )\n {\n modal.content = content;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelConfirm:attribute}}label of the confirmation\n * button{{/crossLink}} of the modal\n * @function setLabelConfirm\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelConfirm( label )\n {\n modal.labelConfirm = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelDismiss:attribute}}label if the dismiss\n * button{{/crossLink}} of the modal\n * @function setLabelDismiss\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelDismiss( label )\n {\n modal.labelDismiss = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onConfirm:attribute}}confirmation callback{{/crossLink}} of the\n * modal\n * @function onConfirm\n * @param {function} callback The callback if modal is confirmed\n * @returns {Modal} Modal object for chaining methods\n */\n function onConfirm( callback )\n {\n modal.onConfirm = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onDismiss:attribute}}dismiss callback{{/crossLink}} of the modal\n * @function onDismiss\n * @param {function} callback The callback if modal is dismissed\n * @returns {Modal} Modal object for chaining methods\n */\n function onDismiss( callback )\n {\n modal.onDismiss = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/container:attribute}}container{{/crossLink}} of the modal\n * @function setContainer\n * @param {string} container The jQuery selector of the container to display the modal in\n * @returns {Modal} Modal object for chaining methods\n */\n function setContainer( container )\n {\n modal.container = container;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/timeout:attribute}}timeout{{/crossLink}} of the modal\n * @function setTimeout\n * @param {number} timeout The timeout to close the modal automatically. Set <0 to disable\n * @returns {Modal} Modal object for chaining methods\n */\n function setTimeout( timeout )\n {\n modal.timeout = timeout;\n return this;\n }\n\n /**\n * Inject modal data in default template if not template is given\n * and display the modal inside the configured container.
    \n * Start timer to hide the modal automatically if timeout is set.\n * @function show\n */\n function show()\n {\n if( !!modal.selector )\n {\n bsModal = $( modal.selector );\n }\n else\n {\n if ( isModal( modal.content ) )\n {\n bsModal = PlentyFramework.partials.Modal.getModal( modal.content );\n }\n else\n {\n bsModal = $( PlentyFramework.compileTemplate( 'modal/modal.html', modal ) );\n }\n\n $( modal.container ).append( bsModal );\n\n // append additional scripts executable\n var scripts = $( modal.content ).filter( 'script' );\n if ( scripts.length > 0 )\n {\n scripts.each( function( i, script )\n {\n var element = document.createElement( 'script' );\n element.type = 'text/javascript';\n element.innerHTML = $( script ).text();\n $( modal.container ).append( element );\n } );\n }\n }\n\n // bind callback functions\n PlentyFramework.partials.Modal.init( bsModal, modal );\n bsModal.find( '[data-plenty-modal=\"confirm\"]' ).click( function()\n {\n var close = modal.onConfirm();\n\n if ( typeof close == \"undefined\" )\n {\n close = true;\n }\n\n if ( close )\n {\n hide( true );\n }\n } );\n\n PlentyFramework.partials.Modal.show( bsModal );\n\n if ( modal.timeout > 0 )\n {\n startTimeout();\n }\n\n }\n\n /**\n * Hide the modal.\n * @function hide\n * @param {boolean} confirmed Flag indicating of modal is closed by confirmation button or dismissed\n */\n function hide( confirmed )\n {\n PlentyFramework.partials.Modal.hide( bsModal );\n\n if ( !confirmed )\n {\n modal.onDismiss();\n }\n }\n\n /**\n * Start the configured timeout initially\n * @function startTimeout\n * @private\n */\n function startTimeout()\n {\n timeRemaining = modal.timeout;\n timeStart = (new Date()).getTime();\n\n timeout = window.setTimeout( function()\n {\n window.clearInterval( interval );\n hide();\n }, modal.timeout );\n\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( timeRemaining / 1000 );\n interval = window.setInterval( function()\n {\n if ( !paused )\n {\n var secondsRemaining = timeRemaining - (new Date()).getTime() + timeStart;\n secondsRemaining = Math.round( secondsRemaining / 1000 );\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( secondsRemaining );\n }\n }, 1000 )\n }\n\n /**\n * Pause the timeout (e.g. on hover)\n * @function pauseTimeout\n * @private\n */\n function pauseTimeout()\n {\n paused = true;\n timeRemaining -= (new Date()).getTime() - timeStart;\n window.clearTimeout( timeout );\n }\n\n /**\n * Continue paused timeout\n * @function continueTimeout\n * @private\n */\n function continueTimeout()\n {\n paused = false;\n timeStart = (new Date()).getTime();\n timeout = window.setTimeout( function()\n {\n hide();\n window.clearInterval( interval );\n }, timeRemaining );\n }\n\n /**\n * Stop timeout. Stopped timeouts cannot be continued.\n * @function stopTimeout\n * @private\n */\n function stopTimeout()\n {\n window.clearTimeout( timeout );\n window.clearInterval( interval );\n }\n\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Displaying error messages and handling wait screen\n * @class UIFactory\n * @static\n */\n pm.factory( 'UIFactory', function()\n {\n /**\n * Increased/ decreased when showing/ hiding wait screen to avoid stacking\n * multiple instances of overlays.\n * @attribute waitScreenCount\n * @private\n * @type {number}\n * @default 0\n */\n var waitScreenCount = 0;\n var waitScreen;\n var errorPopup = null;\n\n return {\n throwError : throwError,\n printErrors : printErrors,\n showWaitScreen: showWaitScreen,\n hideWaitScreen: hideWaitScreen\n };\n\n /**\n * Display a single error message.\n * @function throwError\n * @param {number} code A code identifying this error\n * @param {string} msg The error message to display\n */\n function throwError( code, msg )\n {\n printErrors( [{code: code, message: msg}] );\n }\n\n /**\n * Wrap error messages in error popup, if popup doesn't already contain this error\n * If popup is already visible, append new errors to popup's inner HTML\n * otherwise create new popup\n * @function printErrors\n * @param {Array} errorMessages A list of errors to display\n */\n function printErrors( errorMessages )\n {\n\n // create error-popup if not exist\n if ( !errorPopup || $( 'body' ).has( errorPopup ).length <= 0 )\n {\n errorPopup = $( pm.compileTemplate( 'error/errorPopup.html' ) );\n $( 'body' ).append( errorPopup );\n pm.partials.Error.init( errorPopup );\n }\n\n $.each( errorMessages, function( key, error )\n {\n // add additional error, if not exist.\n pm.partials.Error.addError( errorPopup, $( pm.compileTemplate( 'error/errorMessage.html', error ) ) );\n } );\n\n pm.partials.Error.show( errorPopup );\n\n hideWaitScreen( true );\n }\n\n /**\n * Show wait screen if not visible and increase\n * {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * @function showWaitScreen\n */\n function showWaitScreen()\n {\n waitScreenCount = waitScreenCount || 0;\n\n // create wait-overlay if not exist\n if ( !waitScreen || $( 'body' ).has( waitScreen ).length <= 0 )\n {\n waitScreen = $( pm.compileTemplate( 'waitscreen/waitscreen.html' ) );\n $( 'body' ).append( waitScreen );\n }\n\n pm.partials.WaitScreen.show( waitScreen );\n\n // increase instance counter to avoid showing multiple overlays\n waitScreenCount++;\n return waitScreenCount;\n }\n\n /**\n * Decrease {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * and hide wait screen if waitScreenCount is 0\n * @function hideWaitScreen\n * @param {boolean} forceClose set true to hide wait screen independent from the value of waitScreenCount.\n */\n function hideWaitScreen( forceClose )\n {\n\n // decrease overlay count\n waitScreenCount--;\n\n // hide if all instances of overlays has been closed\n // or if closing is forced by user\n if ( waitScreenCount <= 0 || !!forceClose )\n {\n waitScreenCount = 0;\n pm.partials.WaitScreen.hide( waitScreen );\n }\n return waitScreenCount;\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Factories provide static functions and can be injected into\n * {{#crossLinkModule \"Services\"}}services{{/crossLinkModule}}.
    \n * Factories also can inject other factories. Compared to services,\n * factories are not visible in instances of {{#crossLinkModule \"PlentyFramework\"}}PlentyFramework{{/crossLinkModule}}.\n *\n * @module Factories\n * @main Factories\n */\nObject.equals = function( a, b )\n{\n if ( a === b )\n {\n return true;\n }\n if ( !(a instanceof Object) || !(b instanceof Object) )\n {\n return false;\n }\n if ( a.constructor !== b.constructor )\n {\n return false;\n }\n\n for ( var key in a )\n {\n if ( !a.hasOwnProperty( key ) )\n {\n continue;\n }\n if ( !b.hasOwnProperty( key ) )\n {\n return false;\n }\n if ( a[key] === b[key] )\n {\n continue;\n }\n if ( typeof( a[key] ) !== \"object\" )\n {\n return false;\n }\n if ( !Object.equals( a[key], b[key] ) )\n {\n return false;\n }\n }\n\n for ( var key in b )\n {\n if ( b.hasOwnProperty( key ) && !a.hasOwnProperty( key ) )\n {\n return false;\n }\n }\n\n return true;\n\n};\nPlentyFramework.cssClasses = {\n\n active: \"active\"\n\n};\n(function( $, pm )\n{\n\n pm.partials.Error = {\n\n /**\n * Will be called, after the error popup was created and injected in DOM.\n * @param {HTMLElement} popup The injected element of the popup\n */\n init: function( popup )\n {\n $( popup ).find( '.close' ).click( function()\n {\n pm.partials.Error.hideAll();\n } );\n },\n\n /**\n * Will be called for each thrown error. Has to be injected in DOM manually.\n * @param {HTMLElement} popup The error popup element\n * @param {HTMLElement} error The error message element\n */\n addError: function( popup, error )\n {\n var errorCode = $( error ).attr( 'data-plenty-error-code' );\n\n if ( $( popup ).find( '[data-plenty-error-code=\"' + errorCode + '\"]' ).length <= 0 )\n {\n $( popup ).find( '.plentyErrorBoxInner' ).append( error );\n }\n },\n\n /**\n * Will be called, after initialization and injection of all errors\n * @param {HTMLElement} popup The error popup element\n */\n show: function( popup )\n {\n $( popup ).show();\n },\n\n hideAll: function() {\n $( '#CheckoutErrorPane' ).hide();\n $( '#CheckoutErrorPane' ).find( '.plentyErrorBoxInner' ).html( '' );\n }\n\n }\n\n})( jQuery, PlentyFramework );\n(function( $, pm )\n{\n\n pm.partials.Modal = {\n\n /**\n * Will be called after a new modal was created and injected into DOM\n * @param {HTMLElement} element The injected modal element\n * @param {Modal} modal The instance of the current modal\n */\n init: function( element, modal )\n {\n element.on( 'hidden.bs.modal', function()\n {\n modal.hide();\n if( !modal.selector )\n {\n //Do not remove static modals\n element.remove();\n }\n } );\n\n if ( modal.timeout > 0 )\n {\n element.on( 'hide.bs.modal', modal.stopTimeout );\n element.find( '.modal-content' ).hover( function()\n {\n modal.pauseTimeout();\n }, function()\n {\n if ( element.is( '.in' ) )\n {\n modal.continueTimeout();\n }\n } );\n }\n },\n\n /**\n * Will be called if a Modal requests to show.\n * @param {HTMLElement} element The injected modal element\n */\n show: function( element )\n {\n element.modal( 'show' );\n },\n\n /**\n * Will be called if a Modal requests to hide.\n * @param {HTMLElement} element The injected modal element\n */\n hide: function( element )\n {\n element.modal( 'hide' );\n },\n\n /**\n * Detect if a given HTML string contains a modal\n * @param {HTMLElement} html the element to search a modal in.\n * @returns {boolean} true if a modal was found\n */\n isModal: function( html )\n {\n return $( html ).filter( '.modal' ).length + $( html ).find( '.modal' ).length > 0;\n },\n\n /**\n * Filter a modal from a given HTML string\n * @param {HTMLElement} html the element to get a modal from.\n * @returns {HTMLElement} the filtered modal element\n */\n getModal: function( html )\n {\n var modal = $( html );\n if ( modal.length > 1 )\n {\n modal = $( html ).filter( '.modal' ) || $( html ).find( '.modal' );\n }\n\n return modal;\n }\n\n };\n\n}( jQuery, PlentyFramework ));\n(function( $ )\n{\n\n $( document ).on( 'initPartials', function( e, root )\n {\n\n $( root ).find( '[data-toggle=\"tooltip\"]' ).tooltip( {\n container: 'body'\n } );\n\n } );\n\n})( jQuery );\n(function( $, pm )\n{\n\n pm.partials.WaitScreen = {\n\n /**\n * Will be called if the wait screen should be shown\n * @param {HTMLElement} element The wait screen element\n */\n show: function( element )\n {\n element.addClass( 'in' );\n },\n\n /**\n * Will be called if the wait screen should be hidden\n * @param {HTMLElement} element The wait screen element\n */\n hide: function( element )\n {\n element.removeClass( 'in' );\n }\n\n };\n\n})( jQuery, PlentyFramework );\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.service( 'AddressDoctorService', function( API )\n {\n return {\n validateAddress: validateAddress\n };\n\n function validateAddress( addressForms )\n {\n var addressIsValid = true;\n addressForms = addressForms || '[data-plenty-address-doctor]';\n $( addressForms ).filter( '[data-plenty-address-doctor]:visible' ).each( function( i, form )\n {\n var addressDoctor = new AddressDoctor( form );\n var requiredFields = $( form ).attr( 'data-plenty-address-doctor' ).replace( /\\s/g, '' ).split( ',' );\n if ( !addressDoctor.isValid( requiredFields ) )\n {\n addressIsValid = false;\n }\n\n } );\n\n return addressIsValid;\n }\n\n function AddressDoctor( form )\n {\n var $form = $( form );\n var $inputs = {\n Street : $form.find( 'input[name=\"Street\"]' ),\n ZIP : $form.find( 'input[name=\"ZIP\"]' ),\n City : $form.find( 'input[name=\"City\"]' ),\n HouseNo: $form.find( 'input[name=\"HouseNo\"]' )\n };\n var $suggestionContainer = {};\n\n var suggestions;\n var requiredFields;\n\n return {\n isValid: isValid\n };\n\n function isValid( fields )\n {\n\n if ( isPackstation() )\n {\n return true;\n }\n\n suggestions = new AddressList( $form.getFormValues() );\n requiredFields = fields;\n\n refreshView();\n\n return suggestions.getAddresses().length == 1;\n }\n\n function refreshView()\n {\n $( '.suggestion-list' ).remove();\n\n var suggestionListVisible = false;\n for ( var i = 0; i < requiredFields.length; i++ )\n {\n if ( !validateInput( requiredFields[i], suggestionListVisible ) )\n {\n $form.trigger( 'validationFailed' );\n suggestionListVisible = true;\n }\n }\n\n if ( suggestions.houseNoAllowed( $inputs.HouseNo.val() ) || suggestions.getAddresses().length == 1 )\n {\n $inputs.HouseNo.removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs.HouseNo.addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n }\n else\n {\n $inputs.HouseNo.removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs.HouseNo.addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n }\n }\n\n function validateInput( key, suggestionListVisible )\n {\n var valueList = suggestions.getList( key );\n\n if ( !!$suggestionContainer[key] )\n {\n $suggestionContainer[key].remove();\n }\n\n if ( !$inputs[key] )\n {\n return true;\n }\n\n if ( valueList.length == 1 )\n {\n $inputs[key].val( valueList[0] );\n\n $inputs[key].removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs[key].addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n return true;\n }\n else\n {\n $inputs[key].removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs[key].addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n\n if ( !suggestionListVisible )\n {\n buildSuggestionList( $inputs[key], valueList );\n }\n $inputs[key].off( 'focus' );\n $inputs[key].focus();\n return false;\n\n }\n }\n\n function positionSuggestionList( $parent, suggestionKey )\n {\n $suggestionContainer[suggestionKey].css( {\n 'width': $parent.outerWidth( true ),\n 'left' : $parent.position().left,\n 'top' : $parent.position().top + $parent.outerHeight( true )\n } );\n }\n\n function buildSuggestionList( $parent, values )\n {\n var suggestionKey = $parent.attr( 'name' );\n\n // render html content\n $suggestionContainer[suggestionKey] = $( pm.compileTemplate( 'addressSuggestions/addressDoctor.html', {values: values} ) );\n\n positionSuggestionList( $parent, suggestionKey );\n\n $( window ).on( 'sizeChange', function()\n {\n positionSuggestionList( $parent, suggestionKey );\n } );\n\n // bind click event to list elements\n $suggestionContainer[suggestionKey].find( '[data-address-value]' ).each( function( i, elem )\n {\n\n var $elem = $( elem );\n var value = $elem.attr( 'data-address-value' );\n\n $elem.click( function()\n {\n // insert clicked value in input\n $parent.val( value );\n\n // filter addresses and show remaining suggestions\n var filterAddress = {};\n filterAddress[$parent.attr( 'name' )] = value;\n suggestions.filter( filterAddress );\n\n // refresh suggestion lists\n refreshView();\n\n } );\n\n } );\n\n // inject html\n $parent.parent().append( $suggestionContainer[suggestionKey] );\n }\n\n function isPackstation()\n {\n return ( $inputs.Street.val().toUpperCase() == \"PACKSTATION\" || $inputs.Street.val().toUpperCase() == \"POSTFILIALE\" );\n }\n\n }\n\n function AddressList( addressInput )\n {\n var addresses = [];\n\n init();\n\n return {\n getAddresses : getAddresses,\n getList : getList,\n filter : filter,\n houseNoAllowed: houseNoAllowed\n };\n\n function init()\n {\n API.get( '/rest/checkout/addresssuggestionresultslist/', {\n suggestionType: \"addressdoctor\",\n street : addressInput.Street,\n ZIP : addressInput.ZIP,\n city : addressInput.City,\n houseNo : addressInput.HouseNo,\n country : addressInput.CountryID\n }, false, false, true ).done( function( response )\n {\n\n var responseLength = response.data.length;\n\n for ( var i = 0; i < responseLength; i++ )\n {\n var currentResponse = response.data[i];\n\n var address = getAddress( currentResponse )\n if ( !address )\n {\n currentResponse.HouseNo = [currentResponse.HouseNo];\n addresses.push( currentResponse );\n }\n else\n {\n address.HouseNo.push( currentResponse.HouseNo );\n }\n\n }\n\n } );\n }\n\n function getAddress( suggestion )\n {\n var addressCount = addresses.length;\n\n for ( var j = 0; j < addressCount; j++ )\n {\n if ( suggestion.Street == addresses[j].Street && addresses.ZIP == addresses[j].ZIP && suggestion.City == addresses[j].City )\n {\n return addresses[j];\n }\n }\n\n return null;\n\n }\n\n function getAddresses()\n {\n return addresses;\n }\n\n function getList( key )\n {\n var results = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( $.inArray( address[key], results ) < 0 )\n {\n results.push( address[key] );\n }\n }\n\n return results;\n }\n\n function filter( filterAddress )\n {\n var filteredAddresses = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( (!!filterAddress.Street && filterAddress.Street == address.Street)\n || (!!filterAddress.ZIP && filterAddress.ZIP == address.ZIP)\n || (!!filterAddress.City && filterAddress.City == address.City) )\n {\n filteredAddresses.push( address );\n }\n }\n\n addresses = filteredAddresses;\n }\n\n function houseNoAllowed( houseNo )\n {\n houseNo = parseInt( houseNo );\n\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n\n for ( var j = 0; j < address.HouseNo.length; j++ )\n {\n var range = address.HouseNo[j].split( '-' );\n if ( ( range.length == 1 && houseNo == range[0] )\n || range.length == 2 && houseNo >= range[0] && houseNo <= range[1] )\n {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for logging in and out and registering new customers.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    \n * @class AuthenticationService\n * @static\n */\n pm.service( 'AuthenticationService', function( API, Checkout, UI )\n {\n\n return {\n resetPassword : resetPassword,\n customerLogin : customerLogin,\n setInvoiceAddress: setInvoiceAddress,\n registerCustomer : registerCustomer\n };\n\n /**\n * Reading E-Mail from form marked with data-plenty-checkout=\"lostPasswordForm\"\n * and sends request to provide a new password to the entered E-Mail-Address.\n *\n * @function resetPasswort\n * @return {object} jQuery deferred\n * Object\n */\n function resetPassword()\n {\n\n var form = $( '[data-plenty-checkout=\"lostPasswordForm\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n var params = {\n Email: values.Email\n };\n\n return API.post( \"/rest/checkout/lostpassword/\", params )\n .done( function( response )\n {\n if ( response.data.IsMailSend == true )\n {\n $( '[data-plenty-checkout=\"lostPasswordTextContainer\"]' ).hide();\n $( '[data-plenty-checkout=\"lostPasswordSuccessMessage\"]' ).show();\n }\n } );\n\n }\n }\n\n /**\n * Try to login in with credentials read from given <form> - element.\n * On success redirect to forms 'action' attribute.\n *\n * @function customerLogin\n * @param {object} form The jQuery-wrapped form-element to read the credentials from\n * @return {object} jQuery deferred\n * Object\n */\n function customerLogin( form )\n {\n if ( form.validateForm() )\n {\n var values = form.getFormValues();\n\n var params = {\n Email : values.loginMail,\n Password: values.loginPassword\n };\n\n UI.showWaitScreen();\n return API.post( \"/rest/checkout/login/\", params )\n .done( function()\n {\n // successful login -> go to form's target referenced by action-attribute\n window.location.assign( form.attr( 'action' ) );\n\n } );\n }\n }\n\n /**\n * Setting the invoice address of a newly registered customer or a guest.\n *\n * @function setInvoiceAddress\n * @param {object} invoiceAddress containing address-data sent to server\n * @return {object} jQuery deferred\n * Object\n */\n function setInvoiceAddress( invoiceAddress )\n {\n\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n Checkout.getCheckout().CustomerInvoiceAddress = response.data;\n } );\n }\n\n /**\n * Prepare address-data to register new customer. Read the address-data from a <form> marked with\n * data-plenty-checkout-form=\"customerRegistration\"
    \n * On success, redirect to forms target referenced by action-attribute\n *\n * @function registerCustomer\n * @return {object} jQuery deferred\n * Object\n */\n function registerCustomer()\n {\n var form = $( '[data-plenty-checkout-form=\"customerRegistration\"]' );\n\n if ( form.validateForm() && pm.getInstance().AddressDoctorService.validateAddress() )\n {\n var values = form.getFormValues();\n values.LoginType = 2;\n\n if ( values.checkout\n && values.checkout.customerInvoiceAddress\n && values.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = values.checkout.customerInvoiceAddress.CustomerProperty;\n values.CustomerPropertiesList = values.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n values.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n return setInvoiceAddress( values )\n .done( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } );\n }\n }\n }, ['APIFactory', 'CheckoutFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for adding, editing or removing basket items and coupon codes
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class BasketService\n * @static\n */\n pm.service( 'BasketService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n addItem : addBasketItem,\n removeItem : removeBasketItem,\n getItem : getBasketItem,\n setItemQuantity : setItemQuantity,\n editItemAttributes: editItemAttributes,\n editOrderParams : editOrderParams,\n addCoupon : addCoupon,\n removeCoupon : removeCoupon\n };\n\n /**\n * Add item to basket. Will fail and show a popup if item has order params\n * @function addBasketItem\n * @param {Array} article Array containing the item to add\n * @param {boolean} [isUpdate=false] Indicating if item's OrderParams are updated\n * @return {object} jQuery deferred\n * Object\n */\n function addBasketItem( article )\n {\n\n if ( !!article )\n {\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/',\n {\n itemID : article[0].BasketItemItemID,\n quantity: article[0].BasketItemQuantity\n }, false, true ).done( function( resp )\n {\n // checking for order params!\n if ( resp.data[0].indexOf( \"form-group\" ) > 0 )\n {\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Select order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n addArticle( saveOrderParams( article ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n }\n else\n {\n addArticle( article );\n }\n } );\n }\n }\n\n /**\n * Read OrderParams from <form> marked with data-plenty-checkout-form=\"OrderParamsForm\" and inject\n * read values in 'addBasketList'. Update item by calling addBasketItem() again\n * @function saveOrderParams\n * @private\n * @param {Array} articleWithParams Containing the current item to add. Read OrderParams will be injected\n */\n function saveOrderParams( articleWithParams )\n {\n //TODO use $(\"[data-plenty-checkout-form='OrderParamsForm']\").serializeArray() to get order params\n var orderParamsForm = $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' );\n var $self = {};\n var attrType = \"\";\n var match;\n\n //Groups\n orderParamsForm.find( '[name^=\"ParamGroup\"]' ).each( function()\n {\n match = this.name.match( /^ParamGroup\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], $( this ).val(), $( this ).val() );\n } );\n\n //Values\n orderParamsForm.find( '[name^=\"ParamValue\"]' ).each( function()\n {\n $self = $( this );\n attrType = $self.attr( 'type' );\n\n if ( ((attrType == 'checkbox' && $self.is( ':checked' )) ||\n (attrType == 'radio' && $self.is( ':checked' )) ||\n (attrType != 'radio' && attrType != 'checkbox')) && attrType != 'file' && attrType != 'hidden' )\n {\n\n var match = $self[0].name.match( /^ParamValue\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], $self.val() );\n\n }\n else if ( attrType == 'file' )\n {\n if ( $self[0].files && $self[0].files.length > 0 )\n {\n articleWithParams = orderParamFileUpload( $self, articleWithParams );\n }\n else\n {\n var match = $self[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n var paramValue = $( 'input[type=\"hidden\"][name=\"ParamValue[' + match[1] + '][' + match[2] + ']\"]' ).val();\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], paramValue );\n }\n }\n } );\n\n return articleWithParams;\n }\n\n function addArticle( article )\n {\n API.post( '/rest/checkout/basketitemslist/', article, true )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.loadCheckout()\n .done( function()\n {\n var artAttr = $( \"[name^=ArticleAttribute]\" );\n var requestData = {ArticleID: article[0].BasketItemItemID};\n\n if ( artAttr )\n {\n $( \"[name^=ArticleAttribute]\" ).each( function( i, v )\n {\n requestData[$( v ).attr( \"name\" )] = $( v ).val();\n } );\n }\n\n refreshBasketPreview();\n\n // Show confirmation popup\n CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', requestData ).from( 'ItemView' )\n .done( function( response )\n {\n var timeout = pm.getGlobal( 'TimeoutItemToBasketOverlay', 5000 );\n var modal = Modal.prepare().setContent( response.data[0] );\n\n if ( timeout > 0 )\n {\n modal.setTimeout( timeout );\n }\n\n modal.show();\n } );\n } );\n } ).fail( function( jqXHR )\n {\n // some other error occured\n UI.printErrors( JSON.parse( jqXHR.responseText ).error.error_stack );\n } );\n }\n\n function updateArticle( article )\n {\n API.put( '/rest/checkout/basketitemslist/', article )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n } );\n } )\n }\n\n function orderParamFileUpload( $input, articleWithParams )\n {\n var key = $input[0].id;\n var orderParamUploadFiles = {};\n var orderParamFileIdStack = [];\n var formData;\n var fileData;\n var params = {\n type : 'POST',\n data : {},\n isFile : true,\n cache : false,\n dataType : 'json',\n processData: false,\n contentType: false\n };\n\n orderParamUploadFiles[key] = $input[0].files;\n\n // if input not pushed before.\n if ( orderParamFileIdStack.indexOf( key ) == -1 )\n {\n orderParamFileIdStack.push( key );\n }\n\n for ( var i = 0, length = orderParamFileIdStack.length; i < length; ++i )\n {\n formData = new FormData();\n fileData = orderParamUploadFiles[orderParamFileIdStack[i]];\n formData.append( \"0\", fileData[0], fileData[0].name );\n\n params.data = formData;\n\n API.post( \"/rest/checkout/orderparamfile/\", params );\n }\n\n var match = $input[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n\n return addOrderParamValue( articleWithParams, match[1], match[2], orderParamUploadFiles[key][0]['name'] );\n }\n\n /**\n * Inject an OrderParam.\n * @function addOrderParamValue\n * @private\n * @param {Array} basketList The target to inject the value in.\n * @param {number} position Position where to inject the value\n * @param {number} paramId The ID of the OrderParam to inject\n * @param {string|number} paramValue the value of the OrderParam to inject\n * @returns {Array} Containing the item and the injected OrderParam\n */\n function addOrderParamValue( basketList, position, paramId, paramValue )\n {\n if ( position > 0 && basketList[position] == undefined )\n {\n basketList[position] = $.extend( true, {}, basketList[0] );\n basketList[position].BasketItemOrderParamsList = [];\n }\n\n if ( basketList[position] != undefined )\n {\n basketList[position].BasketItemQuantity = 1;\n if ( basketList[position].BasketItemOrderParamsList == undefined )\n {\n basketList[position].BasketItemOrderParamsList = [];\n }\n if ( paramValue )\n {\n basketList[position].BasketItemOrderParamsList.push( {\n BasketItemOrderParamID : paramId,\n BasketItemOrderParamValue: paramValue\n } );\n }\n }\n\n return basketList;\n }\n\n function editItemAttributes( BasketItemID )\n {\n var modal = $( '[data-plenty-basket-item=\"' + BasketItemID + '\"]' );\n modal.modal( 'show' );\n modal.find( '[data-plenty-modal=\"confirm\"]' ).on( 'click', function()\n {\n var basketItem = getBasketItem( BasketItemID );\n var attributesList = [];\n\n // check for select or list of images\n modal.find( 'select, .PlentyFormContainer.AttrImage > input[type=\"hidden\"]' ).each( function( i, attributeSelect )\n {\n var match = attributeSelect.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( attributeSelect ).val()\n } );\n }\n\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItem.BasketItemAttributesList = attributesList;\n }\n //update basketItem and refresh previewLists\n updateArticle( [basketItem] );\n\n } );\n }\n\n function editOrderParams( BasketItemID )\n {\n\n var basketItem = getBasketItem( BasketItemID );\n // FIX: unset old order params\n\n basketItem.BasketItemOrderParamsList = [];\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/', {\n itemID : basketItem.BasketItemItemID,\n quantity : basketItem.BasketItemQuantity,\n basketItemID: BasketItemID\n } ).done( function( resp )\n {\n // checking for order params!\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Edit order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n updateArticle( saveOrderParams( [basketItem] ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n } );\n }\n\n function getBasketItem( BasketItemID )\n {\n var basketItems = Checkout.getCheckout().BasketItemsList;\n for ( var i = 0; i < basketItems.length; i++ )\n {\n if ( basketItems[i].BasketItemID == BasketItemID )\n {\n return basketItems[i];\n }\n }\n\n return null;\n }\n\n /**\n * Remove item from basket. Will show a confirmation popup at first.\n * @function removeBasketItem\n * @param {number} BasketItemID The ID of the basket item to remove\n * @param {boolean} [forceDelete=false] Set true to remove the basket item without showing a confirmation popup\n * @return Promise\n */\n function removeBasketItem( BasketItemID, forceDelete )\n {\n\n var deferred = $.Deferred();\n\n // get item name\n var itemName = getBasketItem( BasketItemID ).BasketItemNameMap[1];\n\n // calling the delete request\n function doDelete()\n {\n API.delete( '/rest/checkout/basketitemslist/?basketItemIdsList[0]=' + BasketItemID )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n //$( '[data-basket-item-id=\"' + BasketItemID + '\"]' ).remove();\n\n if ( !Checkout.getCheckout().BasketItemsList || Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n }\n else\n {\n // FALLBACK if design not support selector\n // [data-plenty-checkout-template=\"BasketItemsList\"]\n if ( $( '[data-plenty-checkout-template=\"BasketItemsList\"]' ).length >= 0 )\n {\n API.get( \"/rest/checkout/container_checkoutbasketitemslist/\" ).done( function( response )\n {\n var $oldBasketList = $( '[data-basket-item-id]' ).parents( \"ul\" );\n var $basketListContainer = $oldBasketList.parents( \".panel-body\" );\n $oldBasketList.fadeOut( function()\n {\n $( this ).siblings( \":not('[data-plenty-checkout-template]')\" ).remove();\n $( this ).remove();\n $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn( function()\n {\n pm.getInstance().bindDirectives( $basketListContainer );\n } );\n } );\n } );\n }\n else\n {\n Checkout.reloadContainer( 'BasketItemsList' );\n }\n Checkout.reloadContainer( 'Totals' );\n }\n\n refreshBasketPreview();\n\n deferred.resolve();\n } );\n } );\n }\n\n if ( !forceDelete )\n {\n // show confirmation popup\n Modal.prepare()\n .setTitle( pm.translate( 'Please confirm' ) )\n .setContent( '

    ' + pm.translate( \"Do you really want to remove \\\"{{item}}\\\" from your basket?\", {item: itemName} ) + '

    ' )\n .onDismiss( function()\n {\n //$('[data-basket-item-id=\"' + BasketItemID +\n // '\"]').find('[data-plenty=\"quantityInput\"]').val(originalItemQuantity);\n deferred.reject();\n } )\n .onConfirm( function()\n {\n doDelete();\n } )\n .setLabelConfirm( pm.translate( \"Delete\" ) )\n .show();\n }\n else\n {\n doDelete();\n }\n\n return deferred;\n }\n\n /**\n * Set a new quantity for the given BasketItem. If quantity is set to 0,\n * remove the item.\n * @function setItemQuantity\n * @param {number} BasketItemID The ID of the basket item to change the quantity of\n * @param {number} BasketItemQuantity The new quantity to set or 0 to remove the item\n */\n function setItemQuantity( BasketItemID, BasketItemQuantity )\n {\n // delete item if quantity is 0\n if ( BasketItemQuantity <= 0 )\n {\n return removeBasketItem( BasketItemID );\n }\n\n var deferred = $.Deferred();\n var params = Checkout.getCheckout().BasketItemsList;\n var basketItem;\n var basketItemIndex;\n\n for ( var i = 0; i < params.length; i++ )\n {\n if ( params[i].BasketItemID == BasketItemID )\n {\n basketItemIndex = i;\n basketItem = params[i];\n break;\n\n }\n }\n\n if ( !!basketItem && basketItem.BasketItemQuantity != BasketItemQuantity )\n {\n params[basketItemIndex].BasketItemQuantity = parseInt( BasketItemQuantity );\n\n API.post( \"/rest/checkout/basketitemslist/\", params )\n .done( function()\n {\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n refreshBasketPreview();\n deferred.resolve();\n } );\n } );\n }\n\n return deferred;\n }\n\n /**\n * Reload BasketPreview-Template and update basket totals\n * @function refreshBasketPreview\n * @private\n */\n function refreshBasketPreview()\n {\n\n Checkout.reloadItemContainer( 'BasketPreviewList' )\n .done( function()\n {\n\n $( '[data-plenty-basket-empty]' ).each( function( i, elem )\n {\n var toggleClass = $( elem ).attr( 'data-plenty-basket-empty' );\n if ( Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n $( elem ).addClass( toggleClass );\n }\n else\n {\n $( elem ).removeClass( toggleClass );\n }\n } );\n\n } );\n\n //update quantity\n var itemQuantityTotal = 0;\n $.each( Checkout.getCheckout().BasketItemsList, function( i, basketItem )\n {\n itemQuantityTotal += basketItem.BasketItemQuantity;\n } );\n\n $( '[data-plenty-basket-preview=\"itemQuantityTotal\"]' ).text( itemQuantityTotal );\n $( '[data-plenty-basket-preview=\"totalsItemSum\"]' ).text( Checkout.getCheckout().Totals.TotalsItemSum );\n }\n\n /**\n * Read the coupon code from an <input> element marked with data-plenty-checkout-form=\"couponCode\"\n * and try to add this coupon.\n * @function addCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function addCoupon()\n {\n var params = {\n CouponActiveCouponCode: $( '[data-plenty-checkout-form=\"couponCode\"]' ).val()\n };\n\n return API.post( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n\n updateContainer();\n } );\n } );\n }\n\n /**\n * Remove the currently added coupon\n * @function removeCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function removeCoupon()\n {\n var params = {\n CouponActiveCouponCode: Checkout.getCheckout().Coupon.CouponActiveCouponCode\n };\n\n return API.delete( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n delete Checkout.getCheckout().Coupon;\n\n updateContainer();\n } );\n } );\n }\n\n // update container\n function updateContainer()\n {\n Checkout.reloadContainer( 'Coupon' );\n // reload totals, if we are at basket\n if ( $( '[data-plenty-checkout-template=\"Totals\"]' ).length > 0 )\n {\n Checkout.reloadContainer( 'Totals' );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for checkout process like setting shipping & payment information and placing the order.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutService\n * @static\n */\n pm.service( 'CheckoutService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n init : init,\n setCustomerSignAndInfo: setCustomerSignAndInfo,\n registerGuest : registerGuest,\n setShippingProfile : setShippingProfile,\n saveShippingAddress : saveShippingAddress,\n loadAddressSuggestion : loadAddressSuggestion,\n preparePayment : preparePayment,\n setMethodOfPayment : setMethodOfPayment,\n confirmAtrigaPaymax : confirmAtrigaPaymax,\n editBankDetails : editBankDetails,\n editCreditCard : editCreditCard,\n placeOrder : placeOrder\n };\n\n /**\n * Load checkout data initially on page load\n * @function init\n */\n function init()\n {\n Checkout.loadCheckout( true );\n }\n\n /**\n * Read customer sign and order information text from <form> marked with\n * data-plenty-checkout-form=\"details\" and update checkout.\n * @function setCustomerSignAndInfo\n * @return {object} jQuery deferred\n * Object\n */\n function setCustomerSignAndInfo()\n {\n var form = $( '[data-plenty-checkout-form=\"details\"]' );\n var values = form.getFormValues();\n\n // initialize CustomerSign & InfoText to avoid updating empty values\n if ( !Checkout.getCheckout().CheckoutCustomerSign )\n {\n Checkout.getCheckout().CheckoutCustomerSign = \"\";\n }\n if ( !Checkout.getCheckout().CheckoutOrderInfoText )\n {\n Checkout.getCheckout().CheckoutOrderInfoText = \"\";\n }\n\n if ( ( Checkout.getCheckout().CheckoutCustomerSign !== values.CustomerSign && $( form ).find( '[name=\"CustomerSign\"]' ).length > 0 )\n || ( Checkout.getCheckout().CheckoutOrderInfoText !== values.OrderInfoText && $( form ).find( '[name=\"OrderInfoText\"]' ).length > 0 ) )\n {\n\n Checkout.getCheckout().CheckoutCustomerSign = values.CustomerSign;\n Checkout.getCheckout().CheckoutOrderInfoText = values.OrderInfoText;\n\n return Checkout.setCheckout();\n\n }\n else\n {\n // No changes detected -> Do nothing\n return API.idle();\n }\n }\n\n /**\n * Read address data from <form> marked with data-plenty-checkout-form=\"shippingAddress\".\n * Create new shipping address or update the shipping address ID.\n * @function saveShippingAddress\n * @param {boolean} [validateForm = false] validate form before processing requests\n * @return {object} jQuery deferred\n * Object\n */\n function saveShippingAddress( validateForm )\n {\n var form = $( '[data-plenty-checkout-form=\"shippingAddress\"]' );\n\n if ( !validateForm && !form.validateForm() )\n {\n return false;\n }\n\n if ( !validateForm && !pm.getInstance().AddressDoctorService.validateAddress( form ) )\n {\n return false;\n }\n\n var values = form.getFormValues();\n var shippingAddressID = $( '[name=\"shippingAddressID\"]:checked' ).val();\n\n if ( shippingAddressID < 0 )\n {\n // save separate\n var shippingAddress = values;\n\n if ( !addressesAreEqual( shippingAddress, Checkout.getCheckout().CustomerShippingAddress ) )\n {\n if ( shippingAddress.Street == \"PACKSTATION\" )\n {\n shippingAddress.IsPackstation = 1;\n shippingAddress.PackstationNo = shippingAddress.HouseNo;\n }\n else if ( shippingAddress.Street == \"POSTFILIALE\" )\n {\n shippingAddress.IsPostfiliale = 1;\n shippingAddress.PostfilialNo = shippingAddress.HouseNo;\n }\n\n // new shipping address\n return API.post( \"/rest/checkout/customershippingaddress/\", shippingAddress )\n .done( function( response )\n {\n\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = response.data.ID;\n Checkout.getCheckout().CheckoutShippingCountryID = response.data.CountryID;\n\n updatePaymentAndShippingDependencies();\n } );\n }\n else\n {\n // no changes detected\n return API.idle();\n }\n\n }\n else\n {\n if ( shippingAddressID != Checkout.getCheckout().CheckoutCustomerShippingAddressID )\n {\n // change shipping address id\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = shippingAddressID;\n\n updatePaymentAndShippingDependencies();\n }\n else\n {\n return API.idle();\n }\n }\n }\n\n function updatePaymentAndShippingDependencies()\n {\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n $( '#shippingAdressSelect' ).modal( 'hide' );\n\n // don't hit me. Ugly hack: this is to force quit/remove everything from modal.\n if ( $( \".modal-backdrop\" ) )\n {\n $( \".modal-backdrop\" ).remove();\n }\n } );\n }\n\n /**\n * Prepare address-data to register a guest. Reads the address-data from a <form> marked with\n * data-plenty-checkout-form=\"guestRegistration\"\n * @function registerGuest\n * @return {object} jQuery deferred\n * Object\n */\n function registerGuest()\n {\n var form = $( '[data-plenty-checkout-form=\"guestRegistration\"]' );\n\n var invoiceAddress = form.getFormValues();\n invoiceAddress.LoginType = 1;\n\n // add custom properties if necessary.\n if ( invoiceAddress.checkout\n && invoiceAddress.checkout.customerInvoiceAddress\n && invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty;\n invoiceAddress.CustomerPropertiesList = invoiceAddress.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n invoiceAddress.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n if ( !addressesAreEqual( invoiceAddress, Checkout.getCheckout().CustomerInvoiceAddress ) )\n {\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n saveShippingAddress().done( Checkout.loadCheckout );\n } );\n }\n else\n {\n return saveShippingAddress();\n }\n }\n\n /**\n * Check if values of addresses are equal\n * @function addressesAreEqual\n * @private\n * @param {object} address1\n * @param {object} address2\n * @returns {boolean}\n */\n function addressesAreEqual( address1, address2 )\n {\n for ( var key in address1 )\n {\n if ( address1[key] + '' !== address2[key] + '' && key !== 'EmailRepeat' )\n {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Set the shipping profile used for this order and update checkout. Selected shipping profile will be\n * read from <form> marked with data-plenty-checkout-form=\"shippingProfileSelect\"\n * @function setShippingProfile\n * @return {object} jQuery deferred\n * Object\n */\n function setShippingProfile()\n {\n\n var values = $( '[data-plenty-checkout-form=\"shippingProfileSelect\"]' ).getFormValues();\n\n Checkout.getCheckout().CheckoutShippingProfileID = values.ShippingProfileID;\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n\n }\n\n /**\n * Prepare method of payment to check if external checkout is used or addition content should be displayed\n * @function preparePayment\n * @return {object} jQuery deferred\n * Object\n */\n function preparePayment()\n {\n var paymentID = Checkout.getCheckout().CheckoutMethodOfPaymentID;\n var paymentData = $( 'input[type=\"radio\"][name=\"MethodOfPaymentID\"][value=\"' + paymentID + '\"]' ).parent().getFormValues();\n return API.post( \"/rest/checkout/preparepayment/\", paymentData, true )\n .done( function( response )\n {\n if ( response.data.CheckoutMethodOfPaymentRedirectURL != '' )\n {\n\n document.location.assign( response.data.CheckoutMethodOfPaymentRedirectURL );\n\n }\n else if ( !!response.data.CheckoutMethodOfPaymentAdditionalContent )\n {\n\n var isBankDetails = $( response.data.CheckoutMethodOfPaymentAdditionalContent ).find( '[data-plenty-checkout-form=\"bankDetails\"]' ).length > 0;\n Modal.prepare()\n .setContent( response.data.CheckoutMethodOfPaymentAdditionalContent )\n .onConfirm( function()\n {\n if ( isBankDetails )\n {\n return saveBankDetails();\n }\n else\n {\n return saveCreditCard();\n }\n } )\n .show();\n }\n } )\n .fail( function( jqXHR )\n {\n try\n {\n var response = $.parseJSON( jqXHR.responseText );\n\n var errorStack = [];\n for ( var i = 0; i < response.error.error_stack.length; i++ )\n {\n if ( response.error.error_stack[i].code == 651 )\n {\n // notify atriga validation errors\n Checkout.reloadContainer( 'MethodsOfPaymentList' ).done( function()\n {\n $( document ).trigger( 'plenty.AtrigaValidationFailed' );\n } );\n }\n else\n {\n errorStack.push( response.error.error_stack[i] );\n }\n }\n\n // display remaining errors\n if ( errorStack.length > 0 )\n {\n UI.printErrors( errorStack );\n }\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n } );\n\n }\n\n /**\n * Set the method of payment used for this order.\n * @function setMethodOfPayment\n * @param {number|undefined} paymentID ID of the method of payment to use. Read from <form> marked with\n * data-plenty-checkout-form=\"methodOfPayment\" if unset.\n * @return {object} jQuery deferred\n * Object\n */\n function setMethodOfPayment( paymentID )\n {\n /*\n var methodsOfPaymentList = Checkout.getCheckout().MethodsOfPaymentList;\n var methodOfPayment;\n for( var i = 0; i < methodsOfPaymentList.length; i++ )\n {\n if( methodsOfPaymentList[i].MethodOfPaymentID == paymentID )\n {\n methodOfPayment = methodsOfPaymentList[i];\n break;\n }\n }\n */\n\n if ( !paymentID )\n {\n // FIX for older callisto layouts (< 3.3): get payment id from input field\n paymentID = $( 'input[name=\"MethodOfPaymentID\"]:checked' ).val();\n }\n\n Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID;\n\n if ( !pm.getGlobal( 'Checkout.AtrigaRequireUserConfirmation' ) )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = true;\n }\n\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'ShippingProfilesList' );\n } );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxChecked )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = !!atrigaPaymaxChecked;\n return API.put( '/rest/checkout', {\n CheckoutAtrigapaymaxChecked: !!atrigaPaymaxChecked\n } );\n //return Checkout.setCheckout();\n }\n\n /**\n * Display the popup to enter or edit customers bank details\n * @function editBankDetails\n */\n function editBankDetails()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationBankDetails' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveBankDetails();\n } )\n .show();\n } );\n\n }\n\n /**\n * Read entered bank details from data-plenty-checkout-form=\"bankDetails\" and update checkout.\n * @function saveBankDetails\n * @private\n * @return {boolean} the result of form validation\n */\n function saveBankDetails()\n {\n var form = $( '[data-plenty-checkout-form=\"bankDetails\"]' );\n\n if ( form.validateForm() )\n {\n var values = form.getFormValues().checkout.customerBankDetails;\n\n var bankDetails = {\n CustomerBankName : values.bankName,\n CustomerBLZ : values.blz,\n CustomerAccountNumber: values.accountNo,\n CustomerAccountOwner : values.accountOwner,\n CustomerIBAN : values.iban,\n CustomerBIC : values.bic\n };\n\n API.post( \"/rest/checkout/paymentinformationbankdetails/\", bankDetails )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n setMethodOfPayment( 3 );\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing credit card form\n * @function editCreditCard\n */\n function editCreditCard()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationCreditCard' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveCreditCard();\n } )\n .show();\n } );\n }\n\n /**\n * Read values from <form> marked with data-plenty-checkout-form=\"creditCard\" and update checkout.\n * @function saveCreditCard\n * @private\n * @return {boolean} the result of form validation\n */\n function saveCreditCard()\n {\n var form = $( '[data-plenty-checkout-form=\"creditCard\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues().checkout.paymentInformationCC;\n\n var creditCard = {\n Owner : values.owner,\n Cvv2 : values.cvv2,\n Number : values.number,\n Year : values.year,\n Month : values.month,\n Provider: values.provider\n };\n\n API.post( '/rest/checkout/paymentinformationcreditcard/', creditCard )\n .done( function()\n {\n Checkout.loadCheckout();\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing address suggestions\n * @param {string} type\n */\n function loadAddressSuggestion( type )\n {\n\n //check login type\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n var values = $( '[data-plenty-checkout-form=\"shippingAddress\"]' ).getFormValues();\n }\n else\n {\n var values = $( '[data-plenty-checkout-form=\"guestRegistration\"]' ).getFormValues();\n }\n\n var params = {\n street : values.Street,\n houseNo : values.HouseNo,\n ZIP : values.ZIP,\n city : values.City,\n postnummer : values.Postnummer,\n suggestionType: 'postfinder'\n };\n\n CMS.getContainer( 'CheckoutAddressSuggestionResultsList', params ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .show();\n } );\n }\n\n /**\n * Place the order prepared before and finish the checkout process.
    \n * Validate required checkboxes in data-plenty-checkout-form=\"placeOrder\"\n * @function placeOrder\n * @return {object} jQuery deferred\n * Object\n */\n function placeOrder()\n {\n var form = $( '[data-plenty-checkout-form=\"placeOrder\"]' );\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n // if not shown in layout set default 1 for mandatory fields\n var params = {\n TermsAndConditionsCheck : values.termsAndConditionsCheck || 0,\n WithdrawalCheck : values.withdrawalCheck || 0,\n PrivacyPolicyCheck : values.privacyPolicyCheck || 0,\n AgeRestrictionCheck : values.ageRestrictionCheck || 0,\n NewsletterCheck : values.newsletterCheck || 0,\n KlarnaTermsAndConditionsCheck: values.klarnaTermsAndConditionsCheck || 0,\n PayoneDirectDebitMandateCheck: values.payoneDirectDebitMandateCheck || 0,\n PayoneInvoiceCheck : values.payoneInvoiceCheck || 0\n };\n\n return API.post( \"/rest/checkout/placeorder/\", params )\n .done( function( response )\n {\n if ( response.data.MethodOfPaymentRedirectURL != '' )\n {\n\n window.location.assign( response.data.MethodOfPaymentRedirectURL );\n\n }\n else if ( response.data.MethodOfPaymentAdditionalContent != '' )\n {\n\n Modal.prepare()\n .setContent( response.data.MethodOfPaymentAdditionalContent )\n .setLabelDismiss( '' )\n .onDismiss( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).onConfirm( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).show();\n\n }\n else\n {\n\n window.location.assign( form.attr( 'action' ) );\n\n }\n } );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n pm.service( 'FeedbackService', function( API )\n {\n\n return {\n getFeedbacks : getFeedbacks,\n addFeedback : addFeedback,\n ArticleTypes : articleTypes(),\n FeedbackTypes: feedbackTypes()\n };\n\n /*\n FeedbackService\n .getFeedbacks().between('2014-12-03', '2015-07-01')\n .for( FeedbackService.ArticleTypes.ITEM, 2732, FeedbackService.FeedbackTypes.COMMENTS_ONLY );\n */\n function getFeedbacks()\n {\n var feedbackInterval = {\n dateStart: null,\n dateEnd : null\n };\n\n return {\n between: setFeedbackInterval,\n for : listFeedbacks\n };\n\n function setFeedbackInterval( start, end )\n {\n feedbackInterval.dateStart = start;\n feedbackInterval.dateEnd = end;\n return this;\n }\n\n function listFeedbacks( articleType, referenceId, feedbackType )\n {\n\n var params = {\n ReferenceId : referenceId,\n FromDate : feedbackInterval.dateStart,\n ToDate : feedbackInterval.dateEnd,\n FeedbackType: feedbackType || feedbackTypes().COMMENTS_AND_RATINGS\n };\n return API.get( '/rest/feedback/' + articleType + '/', params );\n\n }\n }\n\n /*\n FeedbackService\n .addFeedback()\n .withRating( 5 )\n .withComment( 'Hallo' )\n .withAuthor( 'Felix', 'felix.dausch@plentymarkets.com', 123456 )\n .to( FeedbackService.ArticleTypes.ITEM, 2732 );\n */\n function addFeedback()\n {\n\n var params = {\n Rating : 1.0,\n Text : '',\n Author : '',\n Email : '',\n CustomerId: 0\n };\n\n return {\n withRating : withRating,\n withComment: withComment,\n withAuthor : withAuthor,\n to : sendFeedback\n };\n\n function withRating( rating )\n {\n params.Rating = rating;\n return this;\n }\n\n function withComment( comment )\n {\n params.Text = comment;\n return this;\n }\n\n function withAuthor( author, mail, customerID )\n {\n params.Author = author;\n if ( !!mail )\n {\n params.Email = mail;\n }\n if ( !!customerID )\n {\n params.CustomerId = customerID;\n }\n return this;\n }\n\n function sendFeedback( articleType, referenceId )\n {\n return API.post( '/rest/feedback/' + articleType + '/', params );\n\n }\n\n }\n\n function feedbackTypes()\n {\n return {\n COMMENTS_ONLY : 'comments_only',\n RATINGS_ONLY : 'ratings_only',\n COMMENTS_AND_RATINGS: 'comments_with_ratings'\n }\n }\n\n function articleTypes()\n {\n return {\n ITEM : 'item',\n CATEGORY: 'category',\n BLOG : 'blog'\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Listens to window's size and trigger 'sizeChange' event if the Bootstrap interval changes.\n * @class MediaSizeService\n * @static\n * @example\n * $(window).on('sizeChange', function(newValue, oldValue) {\n * console.log('The interval changed from ' + oldValue + ' to ' + newValue.');\n * });\n */\n pm.service( 'MediaSizeService', function()\n {\n\n var bsInterval;\n\n // recalculation of the current interval on window resize\n $( window ).resize( calculateMediaSize );\n\n // initially calculation of the interval\n $( document ).ready( calculateMediaSize );\n\n return {\n interval : getInterval,\n isInterval: isInterval\n };\n\n /**\n * Get the currently used Bootstrap interval\n * @function getInterval\n * @return {\"xs\"|\"sm\"|\"md\"|\"lg\"}\n */\n function getInterval()\n {\n if ( !!bsInterval )\n {\n calculateMediaSize();\n }\n\n return bsInterval;\n }\n\n /**\n * Calculate the currently used Bootstrap interval\n * @function calculateMediaSize\n * @private\n */\n function calculateMediaSize()\n {\n var size;\n if ( !!window.matchMedia )\n { // FIX IE support\n if ( window.matchMedia( '(min-width:1200px)' ).matches )\n {\n size = 'lg';\n }\n else if ( window.matchMedia( '(min-width:992px)' ).matches )\n {\n size = 'md';\n }\n else if ( window.matchMedia( '(min-width:768px)' ).matches )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n else\n {\n if ( $( window ).width() >= 1200 )\n {\n size = 'lg';\n }\n else if ( $( window ).width() >= 992 )\n {\n size = 'md';\n }\n else if ( $( window ).width() >= 768 )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n if ( size != bsInterval || size === 'xs' )\n {\n var oldValue = bsInterval;\n bsInterval = size;\n $( window ).trigger( 'sizeChange', [bsInterval, oldValue] );\n }\n }\n\n function isInterval( interval )\n {\n var intervalList = interval.replace( /\\s/g, '' ).split( ',' );\n for ( var i = 0; i < intervalList.length; i++ )\n {\n if ( intervalList[i] == bsInterval )\n {\n return true;\n }\n }\n return false;\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Handling navigation while checkout processes\n * @class NavigatorService\n * @static\n *\n */\n pm.service( 'NavigatorService', function( CMS, Checkout )\n {\n var navigation = [];\t\t// contains navigation list elements\n var container = [];\t\t// content containers\n var current = -1;\t\t// index of currently shown content container\n var buttonPrev = {};\t\t// navigation buttons\n var buttonNext = {};\n var interceptors = {\n beforeChange: [],\n afterChange : []\n };\n var checkoutStates = [];\n\n return {\n init : init,\n getCurrentContainer: getCurrentContainer,\n goTo : goTo,\n beforeChange : beforeChange,\n afterChange : afterChange,\n continueChange : continueChange,\n next : next,\n previous : previous,\n goToID : goToID,\n fillNavigation : fillNavigation\n };\n\n /**\n * Initialize checkout navigation. Shows first container.\n * @function init\n * @example\n * ```html\n * \n *
      \n *
    • Checkout Step 1
    • \n *
    • Checkout Step 2
    • \n *
    • ...
    • \n *
    \n * \n *\n *
    \n *
    \n * Checkout Step 1 Content\n *
    \n *
    \n * Checkout Step 2 Content\n *
    \n *
    ...
    \n *
    \n * ```\n */\n function init()\n {\n\n // get elements from DOM\n navigation = $( '[data-plenty-checkout=\"navigation\"] > li' );\n container = $( '[data-plenty-checkout=\"container\"] > div' );\n buttonNext = $( '[data-plenty-checkout=\"next\"]' );\n buttonPrev = $( '[data-plenty-checkout=\"prev\"]' );\n\n if ( navigation.length == container.length && container.length > 0 )\n {\n var checkout = Checkout.getCheckout();\n\n container.hide();\n\n // initialize navigation\n navigation.each( function( i, elem )\n {\n $( elem ).addClass( 'disabled' );\n // handle navigation click events\n $( elem ).click( function()\n {\n if ( !$( this ).is( '.disabled' ) )\n {\n goTo( i );\n }\n } );\n } );\n\n buttonNext.attr( \"disabled\", \"disabled\" );\n buttonNext.click( function()\n {\n next();\n } );\n\n buttonPrev.attr( \"disabled\", \"disabled\" );\n buttonPrev.click( function()\n {\n previous();\n } );\n\n window.addEventListener( 'hashchange', function()\n {\n if ( window.location.hash.length > 0 )\n {\n goToID( window.location.hash );\n }\n else\n {\n goTo( 0 );\n }\n }, false );\n\n // initialize GUI\n // check url param for jumping to tab\n $.urlParam = function( name )\n {\n var results = new RegExp( '[\\?&]' + name + '=([^&#]*)' ).exec( window.location.href );\n if ( results == null )\n {\n return null;\n }\n else\n {\n return results[1] || 0;\n }\n };\n\n var param = $.urlParam( 'gototab' );\n // jump to hash from url param 'gototab'\n if ( window.location.hash.length == 0 && !!param && $( '[data-plenty-checkout-id=\"' + param + '\"]' ).length > 0 )\n {\n window.location.hash = param;\n }\n // jump to hash\n else if ( !goToID( window.location.hash ) && current >= 0 )\n {\n goTo( current );\n }\n else\n {\n goTo( 0 );\n }\n\n fillNavigation();\n $( window ).on( 'sizeChange', fillNavigation );\n $( window ).resize( function()\n {\n if ( pm.getInstance().MediaSizeService.interval() == 'xs' )\n {\n fillNavigation();\n }\n } );\n\n }\n }\n\n /**\n * Get the currently active checkout container.\n * @function getCurrentContainer\n * @return {{id: string, index: number}}\n */\n function getCurrentContainer()\n {\n if ( current >= 0 )\n {\n return {\n id : $( container[current] ).attr( 'data-plenty-checkout-id' ),\n index: current\n };\n }\n else\n {\n return null;\n }\n }\n\n /**\n * Register an interceptor called before each tab change.\n * Tabchange will break if any interceptor returns false.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n * @example\n * plenty.NavigatorService.beforeChange( function(targetContainer) {\n * if( targetContainer.id === 'details' ) {\n * // stop tabchange if user tries to access checkout container with id \"details\"\n * return false;\n * }\n * return true;\n * });\n */\n function beforeChange( interceptor )\n {\n interceptors.beforeChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Register an interceptor called after each tab change.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n */\n function afterChange( interceptor )\n {\n interceptors.afterChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Call registered interceptors. Break if any interceptor returns false.\n * Do not call beforeChange-interceptors on initially tabchange\n * @function resolveInterceptors\n * @private\n * @param {\"beforeChange\"|\"afterChange\"} identifier Describe which interceptors should be called\n * @param {number} index the index of the target container\n * @returns {boolean} Conjunction of all interceptor return values\n */\n function resolveInterceptors( identifier, index )\n {\n var continueTabChange = true;\n\n if ( current >= 0 || identifier === 'afterChange' )\n {\n\n var currentContainer = getCurrentContainer();\n var targetContainer = {\n index: index,\n id : $( container[index] ).attr( 'data-plenty-checkout-id' )\n };\n\n $.each( interceptors[identifier], function( i, interceptor )\n {\n if ( interceptor( currentContainer, targetContainer ) === false )\n {\n continueTabChange = false;\n return false;\n }\n } );\n }\n\n return continueTabChange;\n }\n\n /**\n * Show checkout tab given by index\n * @function goTo\n * @param {number} index Index of target tab, starting at 0\n * @param {boolean} [ignoreInterceptors=false] Set true to not call registered interceptors and force changing\n * tab\n */\n function goTo( index, ignoreInterceptors )\n {\n\n var contentChanged = current !== index;\n\n if ( contentChanged && !ignoreInterceptors )\n {\n if ( !resolveInterceptors( \"beforeChange\", index ) )\n {\n return;\n }\n }\n\n current = index;\n\n if ( !Object.equals( checkoutStates[current], Checkout.getCheckout( true ) ) && contentChanged && !!$( container[current] ).attr( 'data-plenty-checkout-content' ) )\n {\n checkoutStates[current] = Checkout.getCheckout( true );\n // reload tab content\n CMS.getCategoryContent( $( container[current] ).attr( 'data-plenty-checkout-content' ) )\n .done( function( response )\n {\n $( container[current] ).html( response.data[0] );\n // continue tab change\n proceedTabChange( contentChanged );\n pm.getInstance().bindDirectives( container[current] );\n $( window ).trigger( 'contentChanged' );\n } );\n }\n else\n {\n // continue tab change without reloading tab content\n proceedTabChange( contentChanged );\n //pm.getInstance().bindDirectives();\n }\n\n }\n\n function proceedTabChange( contentChanged )\n {\n\n // hide content containers\n $( container ).hide();\n\n // refresh navigation elements\n var $elem;\n $( navigation ).each( function( i, elem )\n {\n $elem = $( elem );\n $elem.removeClass( 'disabled active' );\n\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'false' );\n\n if ( i < current )\n {\n // set current element as active\n $elem.addClass( 'visited' );\n }\n else\n {\n if ( i == current )\n {\n $elem.addClass( 'active visited' );\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'true' );\n }\n else\n {\n if ( i > current && !$elem.is( '.visited' ) )\n {\n // disable elements behind active\n $elem.addClass( 'disabled' );\n }\n }\n }\n } );\n fillNavigation();\n\n // hide \"previous\"-button if first content container is shown\n if ( current <= 0 )\n {\n buttonPrev.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonPrev.removeAttr( \"disabled\" );\n }\n\n // hide \"next\"-button if last content container is shown\n if ( current + 1 == navigation.length )\n {\n buttonNext.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonNext.removeAttr( \"disabled\" );\n }\n\n // show current content container\n $( container[current] ).show();\n\n // set location hash\n if ( current > 0 )\n {\n window.location.hash = $( container[current] ).attr( 'data-plenty-checkout-id' );\n }\n else\n {\n if ( window.location.hash.length > 0 )\n {\n window.location.hash = '';\n }\n }\n\n if ( contentChanged )\n {\n resolveInterceptors( \"afterChange\", current );\n }\n }\n\n /**\n * Continue interrupted tabchange. Shorthand for: goTo(targetContainer.index, true)\n * @function continueChange\n * @param targetContainer The tab-object received from an interceptor\n */\n function continueChange( targetContainer )\n {\n goTo( targetContainer.index, true );\n }\n\n /**\n * Show next checkout tab if available. Shorthand for\n * \n * if (current < navigation.length - 1) {\n * goTo(current + 1);\n * }\n * \n * @function next\n */\n function next()\n {\n if ( current < navigation.length - 1 )\n {\n goTo( current + 1 );\n }\n }\n\n /**\n * Show previous checkout tab if available\n * @function next\n */\n function previous()\n {\n if ( current > 0 )\n {\n goTo( current - 1 );\n }\n }\n\n /**\n * Show checkout tab given by ID\n * @function goToID\n * @param {string} containerID ID of tab to show. Target tab must be marked with\n * data-plenty-checkout-id=\"#...\"\n */\n function goToID( containerID )\n {\n if ( containerID == 'next' )\n {\n next();\n return true;\n }\n else if ( containerID == 'prev' )\n {\n previous();\n return true;\n }\n else\n {\n containerID = containerID.replace( '#', '' );\n $( container ).each( function( i, elem )\n {\n if ( $( elem ).attr( 'data-plenty-checkout-id' ) == containerID )\n {\n goTo( i );\n return true;\n }\n } );\n }\n\n return false;\n }\n\n /**\n * Calculate navigation's width to match its parent element\n * by increasing its items padding.\n * @function fillNavigation\n */\n function fillNavigation()\n {\n // break if manager has not been initialized\n var navigationCount = navigation.length;\n if ( navigationCount <= 0 )\n {\n return;\n }\n\n // reset inline styles\n $( navigation ).removeAttr( 'style' );\n $( navigation ).children( 'span' ).removeAttr( 'style' );\n $( buttonNext ).removeAttr( 'style' );\n $( buttonPrev ).removeAttr( 'style' );\n\n var buttonWidth = ($( buttonPrev ).outerWidth() < $( buttonNext ).outerWidth()) ? $( buttonNext ).outerWidth( true ) + 1 : $( buttonPrev ).outerWidth( true ) + 1;\n $( buttonNext ).css( {width: buttonWidth + 'px'} );\n $( buttonPrev ).css( {width: buttonWidth + 'px'} );\n\n // calculate width to fill\n var width = $( navigation ).parent().parent().outerWidth( true ) - ( 2 * buttonWidth);\n width -= parseInt( $( navigation ).parent().css( 'marginLeft' ) ) + parseInt( $( navigation ).parent().css( 'marginRight' ) );\n\n var padding = width;\n var tabWidth = [];\n\n $( navigation ).each( function( i, elem )\n {\n padding -= parseInt( $( elem ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).css( 'marginRight' ) );\n\n tabWidth[i] = $( elem ).children( 'span' ).width();\n padding -= tabWidth[i];\n\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginRight' ) );\n } );\n\n var paddingEachItem = parseInt( padding / navigationCount );\n\n var paddingLeft, paddingRight;\n if ( paddingEachItem % 2 == 1 )\n {\n paddingLeft = ( paddingEachItem / 2 ) + 0.5;\n paddingRight = ( paddingEachItem / 2 ) - 0.5;\n }\n else\n {\n paddingLeft = paddingEachItem / 2;\n paddingRight = paddingEachItem / 2;\n }\n\n var paddingLastItem = parseInt( padding - ( ( navigationCount - 1 ) * ( paddingLeft + paddingRight ) ) );\n var paddingLastLeft, paddingLastRight;\n if ( paddingLastItem % 2 == 1 )\n {\n paddingLastLeft = ( paddingLastItem / 2 ) + 0.5;\n paddingLastRight = ( paddingLastItem / 2) - 0.5;\n }\n else\n {\n paddingLastLeft = paddingLastItem / 2;\n paddingLastRight = paddingLastItem / 2;\n }\n\n var diff = width;\n $( navigation ).each( function( i, elem )\n {\n if ( i < navigationCount - 1 )\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLeft + 'px', 'paddingRight': paddingRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLeft + paddingRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n else\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLastLeft + 'px', 'paddingRight': paddingLastRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLastLeft + paddingLastRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n } );\n\n //$(navigation).parent().css('marginRight', 0);\n }\n\n }, ['CMSFactory', 'CheckoutFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Magnus Martin \n * =====================================================================================\n */\n\n\n(function( $, pm )\n{\n pm.service( 'PostfinderService', function( API, Modal, UIFactory )\n {\n var packstationID = '';\n var shippingFields = {};\n var numberOfResults = {};\n var result = {};\n\n return {\n openPostfinderModal: openPostfinderModal,\n isPackstation : isPackstation\n };\n\n function isPackstation()\n {\n var street = $( 'input[name=\"Street\"]' ).val();\n return ( street.toUpperCase() == \"PACKSTATION\" || street.toUpperCase() == \"POSTFILIALE\" );\n }\n\n function openPostfinderModal()\n {\n shippingFields = {\n PostfinderItemStreet : $( 'input[name=\"Street\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemZIP : $( 'input[name=\"ZIP\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemCity : $( 'input[name=\"City\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemHouseNo: $( 'input[name=\"HouseNo\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' )\n\n };\n\n shippingFields.PostfinderItemStreet.val( '' );\n\n if ( (shippingFields.PostfinderItemZIP.val().length > 2 || shippingFields.PostfinderItemCity.val().length > 2) )\n {\n\n API.get( '/rest/checkout/shippingaddresspostfinderlist/',\n {\n suggestionType: \"postfinder\",\n zip : shippingFields.PostfinderItemZIP.val(),\n city : shippingFields.PostfinderItemCity.val()\n } )\n\n .done( function( response )\n {\n result = response.data;\n numberOfResults = result.length;\n\n if ( numberOfResults == 0 )\n {\n showErrorMessage();\n }\n\n var params = {\n addresses: []\n };\n\n for ( var i = 0; i < numberOfResults; i++ )\n {\n var dimension = 'km';\n var distInMeters = result[i].PostfinderItemDistance;\n var distInKilometers = distInMeters / 1000;\n distInKilometers = ((Math.round( distInKilometers * 100 ) / 100).toFixed( 2 )).replace( '.', ',' );\n\n if ( distInMeters < 1000 )\n {\n distInKilometers = distInMeters;\n dimension = 'm';\n }\n\n params.addresses.push( {\n index : i,\n dimension: dimension,\n type : result[i].PostfinderItemIsPackstation ? 'Packstation' : 'Postfiliale',\n number : result[i].PostfinderItemIsPackstation ? result[i].PostfinderItemPackstationNo : result[i].PostfinderItemPostfilialNo,\n street : result[i].PostfinderItemStreet,\n houseNo : result[i].PostfinderItemHouseNo,\n zip : result[i].PostfinderItemZIP,\n city : result[i].PostfinderItemCity,\n district : result[i].PostfinderItemDistrict,\n distance : distInKilometers,\n remark : result[i].PostfinderItemRemark\n } );\n }\n\n var html = pm.compileTemplate( 'addressSuggestions/postFinder.html', params );\n\n Modal.prepare()\n .setTitle( pm.translate( 'Packstations and post offices in your area' ) )\n .setContent( html )\n .setClass( 'checkout' )\n .onConfirm( function()\n {\n shippingFields.PostfinderItemCity.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemStreet.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemStreet.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemHouseNo.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemHouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n packstationID = $( 'input[type=\"radio\"][name=\"postfinder\"]:checked' ).val();\n\n if ( result[packstationID].PostfinderItemIsPackstation )\n {\n $( shippingFields.PostfinderItemStreet ).val( 'PACKSTATION' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPackstationNo );\n }\n else\n {\n $( shippingFields.PostfinderItemStreet ).val( 'POSTFILIALE' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPostfilialNo );\n }\n $( shippingFields.PostfinderItemStreet ).trigger( 'change' );\n\n $( shippingFields.PostfinderItemCity ).val( result[packstationID].PostfinderItemCity );\n $( shippingFields.PostfinderItemZIP ).val( result[packstationID].PostfinderItemZIP );\n return true;\n } )\n .show()\n } );\n }\n else\n {\n showErrorMessage();\n }\n\n }\n\n function showErrorMessage()\n {\n UIFactory.throwError( 0, pm.translate( 'Please enter a ZIP code and/or a city.' ) );\n\n shippingFields.PostfinderItemCity.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemCity.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n\n shippingFields.PostfinderItemZIP.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n }\n }, ['APIFactory', 'ModalFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide templates for social share providers to inject them dynamically.\n * @class SocialShareService\n * @static\n */\n pm.service( 'SocialShareService', function()\n {\n\n //TODO: move to global variables\n if ( typeof(socialLangLocale) == 'undefined' )\n {\n socialLangLocale = 'en_US';\n }\n if ( typeof(socialLang) == 'undefined' )\n {\n socialLang = 'en';\n }\n\n return {\n getSocialService: getService\n };\n\n /**\n * Get the template for social media provider\n * @function getService\n * @param {string} identifier name of the social media provider to get the template for\n * @returns {string} the template to inject in DOM\n */\n function getService( identifier )\n {\n var services = {\n 'facebook-like': '',\n\n 'facebook-recommend': '',\n\n 'twitter': '',\n\n 'google-plus': '
    '\n + '',\n };\n\n return services[identifier];\n }\n\n /**\n * get the canonical URL if defined\n * @function getURL\n * @private\n * @return {string} The Canonical URL if defined or the current URI\n */\n function getURI()\n {\n var uri = document.location.href;\n var canonical = $( \"link[rel=canonical]\" ).attr( \"href\" );\n\n if ( canonical && canonical.length > 0 )\n {\n if ( canonical.indexOf( \"http\" ) < 0 )\n {\n canonical = document.location.protocol + \"//\" + document.location.host + canonical;\n }\n uri = canonical;\n }\n\n return uri;\n }\n\n /**\n * returns content of <meta name=\"\" content=\"\"> tags or '' if empty/non existant\n * @function getMeta\n * @private\n * @param {string} name The meta name to get the value of;\n */\n function getMeta( name )\n {\n var metaContent = $( 'meta[name=\"' + name + '\"]' ).attr( 'content' );\n return metaContent || '';\n }\n\n /**\n * create tweet text from content of <meta name=\"DC.title\"> and <meta name=\"DC.creator\">\n * fallback to content of <title> tag\n * @function getTweetText\n * @private\n */\n function getTweetText()\n {\n var title = getMeta( 'DC.title' );\n var creator = getMeta( 'DC.creator' );\n\n if ( title.length > 0 && creator.length > 0 )\n {\n title += ' - ' + creator;\n }\n else\n {\n title = $( 'title' ).text();\n }\n\n return encodeURIComponent( title );\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide methods for client-side form validation.\n * @class ValidationService\n * @static\n */\n pm.service( 'ValidationService', function()\n {\n\n return {\n validate: validate\n };\n\n /**\n * Check if element is a form element (input, select, textarea) or search for child form elements\n * @function getFormControl\n * @private\n * @param {object} element the element to get the form element from\n * @return {object} a valid form element (input, select, textarea)\n */\n function getFormControl( element )\n {\n element = $( element );\n if ( element.is( 'input' ) || element.is( 'select' ) || element.is( 'textarea' ) )\n {\n return element;\n }\n else\n {\n if ( element.find( 'input' ).length > 0 )\n {\n return element.find( 'input' );\n }\n\n else if ( element.find( 'select' ).length > 0 )\n {\n return element.find( 'select' );\n }\n\n else if ( element.find( 'textarea' ).length > 0 )\n {\n return element.find( 'textarea' );\n }\n\n else\n {\n return null;\n }\n }\n\n }\n\n /**\n * Check given element has any value\n * @function validateText\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateText( formControl )\n {\n // check if formControl is no checkbox or radio\n if ( formControl.is( 'input' ) || formControl.is( 'select' ) || formControl.is( 'textarea' ) )\n {\n // check if length of trimmed value is greater then zero\n return $.trim( formControl.val() ).length > 0;\n\n }\n else\n {\n console.error( 'Validation Error: Cannot validate Text for <' + formControl.prop( \"tagName\" ) + '>' );\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid email-address\n * @function validateMail\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateMail( formControl )\n {\n var mailRegExp = /[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n if ( validateText( formControl ) )\n {\n return mailRegExp.test( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid number\n * @function validateNumber\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateNumber( formControl )\n {\n if ( validateText( formControl ) )\n {\n return $.isNumeric( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is equal to a references value\n * @function validateValue\n * @private\n * @param {object} formControl the form element to validate\n * @param {string} reference the required value\n * @return {boolean}\n */\n function validateValue( formControl, reference )\n {\n if ( $( reference ).length > 0 )\n {\n return $.trim( formControl.val() ) == $.trim( $( reference ).val() );\n }\n else\n {\n return $.trim( formControl.val() ) == reference;\n }\n }\n\n function visibility( formControl )\n {\n return formControl.is( ':visible' );\n }\n\n function isEnabled( formControl )\n {\n return formControl.is( ':enabled' );\n }\n\n /**\n * Validate a form. Triggers event 'validationFailed' if any element has an invalid value\n * @function validate\n * @param {object} form The form element to validate\n * @returns {boolean}\n * @example\n * ```html\n * \n *
    \n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n *
    \n * \n * \n *
    \n *\n *
    \n * ```\n *\n * @example\n * $(form).on('validationFailed', function(missingFields) {\n * // handle missing fields\n * });\n */\n function validate( form, errorClass )\n {\n var formControl, formControls, validationKey, currentHasError, group, checked, checkedMin, checkedMax, attrValidate, validationKeys, formControlAttrType;\n var $form = $( form );\n errorClass = errorClass || 'has-error';\n var missingFields = [];\n var hasError = false;\n\n // check every required input inside form\n $form.find( '[data-plenty-validate], :required' ).each( function( i, elem )\n {\n attrValidate = $( elem ).attr( 'data-plenty-validate' );\n formControls = getFormControl( elem ); \n // validate text inputs\n validationKeys = !!attrValidate ? attrValidate : 'text';\n validationKeys = validationKeys.split( ',' );\n\n for ( var i = 0, length = formControls.length; i < length; i++ )\n {\n formControl = $( formControls[i] );\n formControlAttrType = formControl.attr( 'type' );\n\n if ( !visibility( formControl ) || !isEnabled( formControl ) )\n {\n return;\n }\n\n validationKey = validationKeys[i].trim() || validationKeys[0].trim();\n currentHasError = false;\n\n // formControl is textfield (text, mail, password) or textarea\n if ( (formControl.is( 'input' )\n && formControlAttrType != 'radio'\n && formControlAttrType != 'checkbox')\n || formControl.is( 'textarea' ) )\n {\n switch ( validationKey )\n {\n\n case 'text':\n currentHasError = !validateText( formControl );\n break;\n\n case 'mail':\n currentHasError = !validateMail( formControl );\n break;\n\n case 'number':\n currentHasError = !validateNumber( formControl );\n break;\n\n case 'value':\n currentHasError = !validateValue( formControl, $( elem ).attr( 'data-plenty-validation-value' ) );\n break;\n\n case 'none':\n // do not validate\n break;\n\n default:\n console.error( 'Form validation error: unknown validate property: \"' + attrValidate + '\"' );\n break;\n }\n }\n else if ( formControl.is( 'input' )\n && (formControlAttrType == 'radio'\n || formControlAttrType == 'checkbox') )\n {\n // validate radio buttons\n group = formControl.attr( 'name' );\n checked = $form.find( 'input[name=\"' + group + '\"]:checked' ).length;\n\n if ( formControlAttrType == 'radio' )\n {\n checkedMin = 1;\n checkedMax = 1;\n }\n else\n {\n var minMax = (new Function(\"return \" + attrValidate))() || {min: 1, max: 1};\n checkedMin = minMax.min;\n checkedMax = minMax.max;\n }\n\n currentHasError = ( checked < checkedMin || checked > checkedMax );\n\n }\n else if ( formControl.is( 'select' ) )\n {\n // validate selects\n currentHasError = ( formControl.val() == '' || formControl.val() == '-1' );\n }\n else\n {\n console.error( 'Form validation error: ' + $( elem ).prop( \"tagName\" ) + ' does not contain an form element' );\n return;\n }\n\n if ( currentHasError )\n {\n hasError = true;\n missingFields.push( formControl );\n\n if ( formControls.length > 1 )\n {\n formControl.addClass( errorClass );\n $form.find( 'label[for=\"' + formControl.attr( 'id' ) + '\"]' ).addClass( errorClass );\n }\n else\n {\n $( elem ).addClass( errorClass );\n }\n }\n }\n\n } );\n\n // scroll to element on 'validationFailed'\n $form.on( 'validationFailed', function()\n {\n var distanceTop = 50;\n var $error = $form.find( '.' + errorClass ).first();\n var errorOffset = $error.offset().top;\n var $scrollTarget = $( 'html, body' );\n\n // if form is inside of modal, scroll modal instead of body\n if ( $form.parents( '.modal' ).length > 0 )\n {\n $scrollTarget = $form.parents( '.modal' ).find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n\n }\n else if ( $form.is( '.modal' ) )\n {\n $scrollTarget = $form.find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n }\n\n // only scroll if error is outside of viewport\n if ( errorOffset - distanceTop < window.pageYOffset || errorOffset > (window.pageYOffset + window.innerHeight) )\n {\n $scrollTarget.animate( {\n scrollTop: errorOffset - distanceTop\n } );\n }\n } );\n\n if ( hasError )\n {\n // remove error class on focus\n $form.find( '.' + errorClass ).each( function( i, elem )\n {\n formControl = $( getFormControl( elem ) );\n formControl.on( 'focus click', function()\n {\n var $errorElement = $( elem );\n $errorElement.removeClass( errorClass );\n $form.find( 'label[for=\"' + $( this ).attr( 'id' ) + '\"]' ).removeClass( errorClass );\n } );\n } );\n\n $form.trigger( 'validationFailed', [missingFields] );\n }\n\n var callback = $form.attr( 'data-plenty-callback' );\n\n if ( !hasError && !!callback && callback != \"submit\" && typeof window[callback] == \"function\" )\n {\n\n var fields = {};\n $form.find( 'input, textarea, select' ).each( function()\n {\n if ( $( this ).attr( 'type' ) == 'checkbox' )\n {\n fields[$( this ).attr( 'name' )] = $( this ).is( ':checked' );\n }\n else\n {\n fields[$( this ).attr( 'name' )] = $( this ).val();\n }\n } );\n\n window[callback]( fields );\n return false;\n }\n else\n {\n return !hasError;\n }\n }\n } );\n\n /**\n * jQuery-Plugin to calling {{#crossLink \"ValidationService/validate\"}}ValidationService.validate{{/crossLink}}\n * on jQuery wrapped elements.\n * @return {boolean}\n */\n $.fn.validateForm = function()\n {\n return pm.getInstance().ValidationService.validate( this );\n };\n\n /**\n * jQuery-Plugin to get the values of contained form elements.\n * @return {object}\n */\n $.fn.getFormValues = function()\n {\n\n var form = this;\n var values = {};\n\n function inject( position, value )\n {\n var match = position.match( /^([^\\[]+)(.*)/ );\n\n if ( !!match[2] )\n {\n var exp = /\\[([^\\]]+)]/g;\n var child;\n var children = [];\n children[0] = match[1];\n while ( (child = exp.exec( match[2] )) !== null )\n {\n children.push( child[1] );\n }\n\n for ( var i = children.length - 1; i >= 0; i-- )\n {\n var val = {};\n val[children[i]] = value;\n value = val;\n }\n values = $.extend( true, values, value );\n }\n else\n {\n values[match[1]] = value;\n }\n }\n\n form.find( 'input, select, textarea' ).each( function( i, elem )\n {\n if ( !!$( elem ).attr( 'name' ) )\n {\n if ( $( elem ).attr( 'type' ) == \"checkbox\" )\n {\n // get checkbox group\n var groupValues = [];\n $( form ).find( '[name=\"' + $( elem ).attr( 'name' ) + '\"]:checked' ).each( function( j, checkbox )\n {\n groupValues.push( $( checkbox ).val() );\n } );\n inject( $( elem ).attr( 'name' ), groupValues );\n }\n else if ( $( elem ).attr( 'type' ) == 'radio' )\n {\n if ( $( elem ).is( ':checked' ) )\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n else\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n\n } );\n return values;\n }\n}( jQuery, PlentyFramework ));\n/**\n * Services provide functions to be called from the instanced PlentyFramework.
    \n * Services can inject Factories and can be injected into Directives. The are also\n * available from the global instance of PlentyFramework\n * @module Services\n * @main Services\n * @example\n * PlentyFramework.service('ServiceName', serviceFunctions() {\n * return {\n * functionInService: function() {}\n * }\n * });\n * //...\n * plenty.ServiceName.functionInService/();\n */\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\nPlentyFramework.compile();\n\n// Create global instance of PlentyFramework for usage in Webshop-Layouts\nvar plenty = PlentyFramework.getInstance();\n\n/*\n * initially bind all registered directives\n *\n * will not be tested. reasons:\n * http://stackoverflow.com/questions/29153733/how-to-unit-test-a-document-ready-function-using-jasmine\n */\njQuery( document ).ready( function()\n{\n plenty.bindDirectives();\n} );" + "var TemplateCache = {};\n\nTemplateCache[\"addressSuggestions/addressDoctor.html\"] = \"\";\n\nTemplateCache[\"addressSuggestions/postFinder.html\"] = \"{{#addresses}}\\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"{{/addresses}}\\n\" +\n \"\";\n\nTemplateCache[\"error/errorMessage.html\"] = \"
    \\n\" +\n \" Code {{code}}:\\n\" +\n \" {{{message}}}\\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"error/errorPopup.html\"] = \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"modal/modal.html\"] = \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#title}}\\n\" +\n \"
    \\n\" +\n \" \\n\" +\n \"

    {{{title}}}

    \\n\" +\n \"
    \\n\" +\n \" {{/title}}\\n\" +\n \"\\n\" +\n \"
    {{{content}}}
    \\n\" +\n \"\\n\" +\n \"
    \\n\" +\n \"\\n\" +\n \" {{#labelDismiss}}\\n\" +\n \" \\n\" +\n \" {{/labelDismiss}}\\n\" +\n \"\\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\";\n\nTemplateCache[\"waitscreen/waitscreen.html\"] = \"
    \";\n\n(function defineMustache(global,factory){if(typeof exports===\"object\"&&exports&&typeof exports.nodeName!==\"string\"){factory(exports)}else if(typeof define===\"function\"&&define.amd){define([\"exports\"],factory)}else{global.Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)===\"[object Array]\"};function isFunction(object){return typeof object===\"function\"}function typeStr(obj){return isArray(obj)?\"array\":typeof obj}function escapeRegExp(string){return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")}function hasProperty(obj,propName){return obj!=null&&typeof obj===\"object\"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"/\":\"/\"};function escapeHtml(string){return String(string).replace(/[&<>\"'\\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\\s*/;var spaceRe=/\\s+/;var equalsRe=/\\s*=/;var curlyRe=/\\s*\\}/;var tagRe=/#|\\^|\\/|>|\\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile===\"string\")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error(\"Invalid tags: \"+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+\"\\\\s*\");closingTagRe=new RegExp(\"\\\\s*\"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp(\"\\\\s*\"+escapeRegExp(\"}\"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===\"\"};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return\"\";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail=\"\";break;case 0:match=\"\";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={\".\":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(\".\")>0){value=context.view;names=name.split(\".\");index=0;while(value!=null&&index\")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol===\"&\")value=this.unescapedValue(token,context);else if(symbol===\"name\")value=this.escapedValue(token,context);else if(symbol===\"text\")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer=\"\";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j\n * =====================================================================================\n */\n\n/**\n * @module PlentyFramework\n */\n(function( $ )\n{\n // will be overridden by grunt\n var version = \"1.0.9\";\n\n /**\n * Collection of uncompiled registered factories & services.\n * See {{#crossLink \"PlentyFramework/compile:method\"}}.compile(){{/crossLink}}\n * @attribute components\n * @static\n * @type {{factories: {}, services: {}}}\n */\n var components = {\n factories : {},\n services : {},\n directives: {}\n };\n\n /**\n * Framework providing client functions for plentymarkets Webshops.\n * @class PlentyFramework\n * @constructor\n */\n PlentyFramework = function()\n {\n };\n\n var instance = null;\n PlentyFramework.getInstance = function()\n {\n instance = instance || new PlentyFramework();\n return instance;\n };\n\n PlentyFramework.version = (function() {\n\n return {\n get: function() {\n return version;\n },\n equals: function( v ) {\n return compare(v) == 0;\n },\n compare: compare\n };\n\n function compare( compare )\n {\n var localVersion = version.split(\".\");\n var compareVersion = compare.split(\".\");\n\n for( var i = 0; i < compareVersion.length; i++ )\n {\n if( localVersion[i] === compareVersion[i] || compareVersion[i] === \"*\" )\n {\n continue;\n }\n\n if( parseInt(localVersion[i]) < parseInt(compareVersion[i]) )\n {\n return -1;\n }\n\n if( parseInt(localVersion[i]) > parseInt(compareVersion[i]) )\n {\n return 1;\n }\n }\n return 0;\n }\n\n })();\n\n /**\n * Customizable controls for partials will be injected here.\n * (e.g. Modal)\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.partials = {};\n\n /**\n * Collection of registered global variables\n * @attribute\n * @static\n * @type {object}\n */\n PlentyFramework.globals = {};\n\n /**\n * Set a global variable.\n * @function setGlobal\n * @static\n * @param {string} identifier A unique identifier to reference this variable\n * @param {*} value The value to set\n * @return {*} The value\n */\n PlentyFramework.setGlobal = function( identifier, value )\n {\n if ( PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n console.error( 'Global variable \"' + identifier + '\" already exists and cannot be overridden.' );\n return null;\n }\n\n PlentyFramework.globals[identifier] = value;\n\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Get the value of a global variable or undefined if not exists\n * @function getGlobal\n * @static\n * @param identifier The identifier of the requested variable\n * @return {*} The value of the variable\n */\n PlentyFramework.getGlobal = function( identifier, fallbackValue )\n {\n if( !PlentyFramework.globals.hasOwnProperty( identifier ) )\n {\n return fallbackValue;\n }\n return PlentyFramework.globals[identifier];\n };\n\n /**\n * Collection of registered directives\n * @type {Array}\n * @static\n */\n PlentyFramework.directives = {};\n\n /**\n * Register directive. Directives can be bound to dynamically added nodes by calling pm.bindPlentyFunctions();\n * @function directive\n * @static\n * @param {string} selector jQuery selector of the DOM-elements to bind the directive to\n * @param {function} callback Function to add directives behaviour\n * @param {Array} dependencies List of required services. Services will be passed to callback function\n * @param {boolean} allowDuplicates Defines if a directive can be bound to the same element multiple times\n * @return {object} The created directive\n */\n PlentyFramework.directive = function( directiveName, directiveFunctions, dependencies )\n {\n // Catch type mismatching for 'directiveName'\n if ( typeof directiveName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof directiveName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof directiveFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof directiveFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.directives[directiveName] = {\n name : directiveName,\n dependencies: dependencies,\n setup : directiveFunctions\n };\n };\n\n /**\n * Bind registered directives.\n * @function bindDirectives\n * @param {string} [directiveSelector] restrict binding to elements matching this selector\n */\n PlentyFramework.prototype.bindDirectives = function( rootElement )\n {\n\n rootElement = rootElement || 'html';\n\n $( rootElement ).find( '[data-plenty]' ).each( function( i, element )\n {\n\n var directives = parseDirectives( $( element ).attr( 'data-plenty' ), $( element ) );\n\n if ( directives.length <= 0 )\n {\n // continue\n return;\n }\n\n addCustomEvents( element );\n\n for ( var i = 0; i < directives.length; i++ )\n {\n var directive = directives[i];\n if ( !!PlentyFramework.directives[directive.class] && PlentyFramework.directives.hasOwnProperty( directive.class ) )\n {\n\n var callback = PlentyFramework.directives[directive.class][directive.method];\n if ( !!callback && typeof callback == \"function\" )\n {\n\n if ( directive.event == \"ready\" )\n {\n callback.apply( null, directive.params );\n }\n else\n {\n bindEventCallback( $( element ), directive.event, callback, directive.params );\n /*\n $( element ).on( directive.event, function( e )\n {\n directive = injectEvent( directive, e );\n return callback.apply( null, directive.params );\n } );\n */\n }\n\n }\n else\n {\n console.error( \"Method not found: \" + directive.method + \" in \" + directive.class );\n }\n\n }\n else\n {\n console.error( \"Directive not found: \" + directive.class );\n }\n }\n } );\n\n $( document ).trigger( 'initPartials', rootElement );\n };\n\n var eventStack = [];\n\n PlentyFramework.getRecentEvent = function( eventType )\n {\n var lastEventIdx = eventStack.length - 1;\n if ( !eventType )\n {\n return eventStack[lastEventIdx];\n }\n else\n {\n for ( var i = lastEventIdx; i >= 0; i-- )\n {\n if ( eventType == eventStack[i].type )\n {\n return eventStack[i];\n }\n }\n }\n\n return null;\n\n };\n\n PlentyFramework.pushEvent = function( event )\n {\n eventStack.push( event );\n };\n\n /**\n * Bind event to element by eventType.\n * If cms says \"click:Foo.bar(this, event)\" eventType is \"click\".\n *\n * @param $elem - jQuery object on which event was triggered\n * @param eventType - type of event\n * @param callback - callback function of directive [example: \"bar(this, event)\"]\n * @param params - list of parameters for callback function.\n */\n function bindEventCallback( $elem, eventType, callback, params )\n {\n $elem.on( eventType, function( event )\n {\n eventStack.push( event );\n return callback.apply( null, params );\n } );\n\n if( document.readyState === \"complete\" && eventType === \"ready\" )\n {\n // execute 'ready' directives directly if document is already loaded\n callback.apply( null, params );\n }\n }\n\n function addCustomEvents( element )\n {\n\n var $elem = $( element );\n\n if ( $elem.is( 'input[type=\"checkbox\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n if ( $elem.is( ':checked' ) )\n {\n $elem.trigger( 'check' );\n }\n else\n {\n $elem.trigger( 'uncheck' );\n }\n } );\n }\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n $elem.on( 'change', function()\n {\n\n var radioGroup = $elem.attr( 'name' );\n\n $( 'input[type=\"radio\"][name=\"' + radioGroup + '\"]' ).each( function( i, radio )\n {\n var $radio = $( radio );\n if ( $radio.is( ':checked' ) )\n {\n $radio.trigger( 'check' );\n }\n else\n {\n $radio.trigger( 'uncheck' );\n }\n\n } );\n\n } );\n }\n }\n\n function parseDirectives( input, thisValue )\n {\n var directivePattern = /^(([\\w]+):)?([\\w]+)\\.([\\w]+)(\\((.*)\\))?$/;\n var expressions = input.split( ';' );\n var directives = [];\n\n for ( var i = 0; i < expressions.length; i++ )\n {\n var expression = expressions[i].trim();\n\n if ( !expression )\n {\n continue;\n }\n\n if ( !directivePattern.test( expression ) )\n {\n // console.warn( \"Invalid directive: \" + expression );\n continue;\n }\n\n var match = expression.match( directivePattern );\n\n if ( !match[3] || match[3].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Class name not set.\" );\n continue;\n }\n\n if ( !match[4] || match[4].length <= 0 )\n {\n console.error( \"Cannot parse '\" + expression + \"': Method not set.\" );\n continue;\n }\n\n var directive = {\n event : match[2] || 'ready',\n class : match[3],\n method: match[4],\n params: []\n };\n\n if ( !!match[6] && match[6].length > 0 )\n {\n var params = match[6].match( /(['][^']+['])|([\\w-]+)|([\"][^\"]+[\"])/g );\n for ( var j = 0; j < params.length; j++ )\n {\n var param = params[j].trim();\n if ( !isNaN( parseFloat( param ) ) )\n {\n directive.params.push( parseFloat( param ) );\n }\n else if ( param.toLowerCase() == 'true' )\n {\n directive.params.push( true );\n }\n else if ( param.toLowerCase() == 'false' )\n {\n directive.params.push( false );\n }\n else if ( param.toLowerCase() == 'this' )\n {\n directive.params.push( thisValue );\n }\n else\n {\n directive.params.push( param.replace( /^['\"]|['\"]$/g, '' ) );\n }\n }\n }\n\n directives.push( directive );\n\n }\n return directives;\n }\n\n /**\n * Register a new service\n * @function service\n * @static\n * @param {string} serviceName Unique identifier of the service to get/ create\n * @param {function} serviceFunctions Callback containing all public functions of this service.\n * @param {Array} [dependencies] Identifiers of required services to inject in serviceFunctions\n * @return {object} The object described in serviceFunctions(). Can be received via\n * PlentyFramework.[serviceName]\n */\n PlentyFramework.service = function( serviceName, serviceFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof serviceName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof serviceName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof serviceFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof serviceFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n\n components.services[serviceName] = {\n name : serviceName,\n dependencies: dependencies,\n setup : serviceFunctions\n };\n\n };\n\n /**\n * Collection of compiled factories\n * @attribute factories\n * @static\n * @type {object}\n */\n PlentyFramework.factories = {};\n\n /**\n * Register a new factory\n * @function factory\n * @static\n * @param {string} factoryName A unique name of the new factory\n * @param {function} factoryFunctions The function describing the factory\n * @param {Array} dependencies List of required factories to inject\n */\n PlentyFramework.factory = function( factoryName, factoryFunctions, dependencies )\n {\n\n // Catch type mismatching for 'serviceName'\n if ( typeof factoryName !== 'string' )\n {\n console.error( \"Type mismatch: Expect first parameter to be a 'string', '\" + typeof factoryName + \"' given.\" );\n return;\n }\n\n // Catch type mismatching for 'serviceFunctions'\n if ( typeof factoryFunctions !== 'function' )\n {\n console.error( \"Type mismatch: Expect second parameter to be a 'function', '\" + typeof factoryFunctions + \"' given.\" );\n return;\n }\n\n dependencies = dependencies || [];\n components.factories[factoryName] = {\n name : factoryName,\n dependencies: dependencies,\n setup : factoryFunctions\n }\n\n };\n\n /**\n * Renders html template. Will provide given data to templates scope.\n * Uses Mustache syntax for data-binding.\n * @function compileTemplate\n * @static\n * @param {String} template relative path to partials template to load. Base path = '/src/partials/'\n * @param {Object} data data to privide to templates scope.\n * @returns {String} The rendered html string\n */\n PlentyFramework.compileTemplate = function( template, data )\n {\n data = data || {};\n data.translate = function()\n {\n return function( text, render )\n {\n return render( PlentyFramework.translate( text ) );\n };\n };\n return Mustache.render( TemplateCache[template], data );\n };\n\n /**\n * The path on the server where the script is located in.\n * @attribute\n * @static\n * @type {String}\n */\n PlentyFramework.scriptPath = '';\n\n /**\n * Collection of locale strings will be injected here after reading language file.\n * @attribute\n * @static\n * @type {Object}\n */\n PlentyFramework.Strings = {};\n\n /**\n * Load language file containing translations of locale strings.\n * @function loadLanguageFile\n * @static\n * @param fileName relative path to language file.\n */\n PlentyFramework.loadLanguageFile = function( fileName )\n {\n $.ajax({\n url: PlentyFramework.scriptPath + fileName,\n dataType: 'json'\n }).done( function( response ) {\n PlentyFramework.Strings = response;\n });\n };\n\n /**\n * Try to get locale translation of given string.\n * Render translated string using Mustache syntax\n * if additional parameters are given.\n * @function translate\n * @static\n * @param {String} string The string to translate\n * @param {Object} [params] additional data for rendering\n * @returns {String} The translation of the given string if found. Otherwise returns the original string.\n */\n PlentyFramework.translate = function( string, params )\n {\n var localeString;\n if ( PlentyFramework.Strings.hasOwnProperty( string ) )\n {\n localeString = PlentyFramework.Strings[string];\n }\n else\n {\n localeString = string;\n console.warn( 'No translation found for \"' + localeString + '\".' );\n }\n\n if ( !!params )\n {\n localeString = Mustache.render( localeString, params );\n }\n\n return localeString;\n\n };\n\n /**\n * Compile registered factories & services\n * @function compile\n * @static\n */\n PlentyFramework.compile = function()\n {\n\n for ( var factory in components.factories )\n {\n if ( !PlentyFramework.factories.hasOwnProperty( factory ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.factories[factory], 3 );\n }\n }\n\n for ( var service in components.services )\n {\n if ( !PlentyFramework.prototype.hasOwnProperty( service ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.services[service], 2 );\n }\n }\n\n for ( var directive in components.directives )\n {\n if ( !PlentyFramework.directives.hasOwnProperty( directive ) )\n {\n //components.factories[factory].compile();\n compileComponent( components.directives[directive], 1 );\n }\n }\n\n var scripts = document.getElementsByTagName( 'SCRIPT' );\n for( var i = scripts.length - 1; i >= 0; i-- ) {\n var path = scripts[i].src.match( /(.*)\\/(.*)\\.js(\\?\\S*)?$/ );\n if( !!path ) {\n PlentyFramework.scriptPath = path[1];\n break;\n }\n }\n\n };\n\n // Level: 1 = directive, 2 = service, 3 = factory\n function compileComponent( component, componentLevel, dependencyStack )\n {\n dependencyStack = dependencyStack || [];\n\n // resolve dependencies\n var compiledDependencies = [];\n for ( var i = 0; i < component.dependencies.length; i++ )\n {\n var dependency = component.dependencies[i];\n if ( $.inArray( dependency, dependencyStack ) < 0 )\n {\n // add dependency to stack to avoid cyclic injection\n dependencyStack.push( dependency );\n\n if ( components.factories.hasOwnProperty( dependency ) )\n {\n // required dependency is a factory\n if ( !PlentyFramework.factories.hasOwnProperty( dependency ) )\n {\n // factory is not compiled yet\n compileComponent( components.factories[dependency], 3, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.factories[dependency] );\n continue;\n }\n\n if ( componentLevel <= 2 && components.services.hasOwnProperty( dependency ) )\n {\n // required dependency is a service\n if ( !PlentyFramework.prototype.hasOwnProperty( dependency ) )\n {\n // service is not compiled yet\n compileComponent( components.services[dependency], 2, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.prototype[dependency] );\n continue;\n }\n\n if ( componentLevel <= 1 && components.directives.hasOwnProperty( dependency ) )\n {\n // required dependency is a directive\n if ( !PlentyFramework.directives.hasOwnProperty( dependency ) )\n {\n // directive is not compiled yet\n compileComponent( components.directives[dependency], 1, dependencyStack );\n }\n compiledDependencies.push( PlentyFramework.directives[dependency] );\n continue;\n }\n\n console.error( 'Cannot inject dependency \"' + dependency + '\": Object not found.' );\n }\n else\n {\n console.error( 'Cyclic dependency injection: ' + dependencyStack.join( ' -> ' ) + ' -> ' + dependency );\n }\n }\n\n // compile component\n if ( componentLevel == 3 )\n {\n PlentyFramework.factories[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 2 )\n {\n PlentyFramework.prototype[component.name] = component.setup.apply( null, compiledDependencies );\n }\n else if ( componentLevel == 1 )\n {\n PlentyFramework.directives[component.name] = component.setup.apply( null, compiledDependencies );\n }\n }\n\n}( jQuery ));\n\n\n\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.directive( 'Authentication', function( AuthenticationService )\n {\n return {\n login: login\n };\n\n function login( elem )\n {\n pm.getRecentEvent().preventDefault();\n AuthenticationService.customerLogin( $( elem ) );\n }\n }, [\"AuthenticationService\"] );\n\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Basket', function( BasketService )\n {\n\n return {\n addBasketItem : addBasketItem,\n changeItemQuantity: changeItemQuantity,\n setItemQuantity : setItemQuantity\n };\n\n function addBasketItem( elem )\n {\n pm.getRecentEvent().preventDefault();\n //init\n var basketItemsList = {};\n var $elem = $( elem );\n var parentForm = $elem.parents( 'form' );\n\n basketItemsList.BasketItemItemID = parentForm.find( '[name=\"ArticleID\"]' ).val();\n basketItemsList.BasketItemPriceID = parentForm.find( '[name=\"SYS_P_ID\"]' ).val();\n basketItemsList.BasketItemQuantity = parentForm.find( '[name=\"ArticleQuantity\"]' ).val();\n basketItemsList.BasketItemBranchID = parentForm.find( '[name=\"source_category\"]' ).val();\n\n //attributes\n var attributeInputsList = parentForm.find( '[name^=\"ArticleAttribute\"]' );\n var attributesList = [];\n\n $.each( attributeInputsList, function( idx, elem )\n {\n var match = elem.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( elem ).val()\n } );\n }\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItemsList.BasketItemAttributesList = attributesList;\n }\n\n //add basketItem and refresh previewLists\n BasketService.addItem( [basketItemsList] );\n\n }\n\n function changeItemQuantity( elem, increment )\n {\n var $elem = $( elem );\n var $quantityInput = $elem.parent().find( 'input' );\n var maxLength = parseInt( $quantityInput.attr( 'maxlength' ) ) || 5;\n var value = parseInt( $quantityInput.val() ) + increment;\n\n var isBasketView = $elem.parents( '[data-basket-item-id]' ).length > 0;\n\n if ( isBasketView )\n {\n if ( (value + '').length <= maxLength && value >= 0 )\n {\n $quantityInput.val( value );\n }\n\n var timeout = $elem.data( 'timeout' );\n\n if ( !!timeout )\n {\n window.clearTimeout( timeout );\n }\n\n timeout = window.setTimeout( function()\n {\n $quantityInput.trigger( 'change' );\n }, 1000 );\n\n $elem.data( 'timeout', timeout );\n }\n else\n {\n if ( (value + '').length <= maxLength && value >= 1 )\n {\n $quantityInput.val( value );\n }\n }\n }\n\n function setItemQuantity( basketItemID, input )\n {\n BasketService.setItemQuantity(\n basketItemID,\n parseInt( $( input ).val() )\n ).fail( function()\n {\n // reset input's value on cancel\n var basketItem = BasketService.getItem( basketItemID );\n $( input ).val( basketItem.BasketItemQuantity );\n } );\n }\n\n }, ['BasketService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Checkout', function( CheckoutService )\n {\n\n return {\n setMethodOfPayment: setMethodOfPayment,\n confirmAtrigaPaymax: confirmAtrigaPaymax\n };\n\n function setMethodOfPayment( paymentID )\n {\n CheckoutService.setMethodOfPayment( paymentID );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxConfirmed )\n {\n CheckoutService.confirmAtrigaPaymax( atrigaPaymaxConfirmed );\n }\n }, ['CheckoutService'] );\n})( jQuery, PlentyFramework );\n/**\n * Mobile dropdowns\n * Toggles dropdowns using css class 'open' instead of pseudo class :hover\n * Usage:\n *
  • \n * ...\n *
  • \n *\n * possible values for CONDITION\n * \"touch\" : use 'open'-class if device is touch-device AND media size is 'md' or 'lg'\n * \"toggle-xs-sm-or-touch\" : use 'open'-class if device is \"touch\" (as above) OR media size is 'xs' or 'sm'\n *\n */\n(function( $, pm )\n{\n pm.directive( 'MobileDropdown', function( MediaSize )\n {\n // store all dropdown elements\n var dropdownElements = [];\n\n // store dropdown elements which should be closed by clicking outside the element itself\n var closableDropdownElements = [];\n\n return {\n initDropdowns: initDropdowns,\n openDropdown : openDropdown,\n slideDropdown: slideDropdown\n };\n\n function initDropdowns()\n {\n $( window ).on( 'orientationchange sizeChange', function()\n {\n if ( !$( \"input\" ).is( \":focus\" ) )\n {\n resetDropdowns( dropdownElements );\n resetDropdowns( closableDropdownElements );\n }\n } );\n }\n\n function resetDropdowns( dropdownList, event )\n {\n var $current;\n for ( var i = 0; i < dropdownList.length; i++ )\n {\n $current = $( dropdownList[i] );\n if ( !!event )\n {\n if ( $current.find( $( event.target ) ).length === 0\n && !$( \"input\" ).is( \":focus\" ) )\n {\n $current.removeClass( 'open' );\n $( 'html' ).unbind( \"click touchstart\", resetEvent );\n }\n }\n else\n {\n if ( !$( \"input\" ).is( \":focus\" ) )\n {\n $current.removeClass( 'open' );\n $( 'html' ).unbind( \"click touchstart\", resetEvent );\n }\n }\n }\n\n }\n\n function openDropdown( elem, alwaysClickable )\n {\n var $elem = $( elem );\n var $parent = $elem.parent();\n\n // case 1: xs || sm || ( touch && ( md || lg ) ) -> open/close via click on small devices, open/close via\n // css-hover on desktop, open/close via click on touch-desktop (e.g. top navigation)\n\n if ( !!alwaysClickable && ( MediaSize.isInterval( 'xs, sm' ) || ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n // if href\n if ( !$elem.attr( 'href' ) )\n {\n avoidRedirectinStopPropagation( $parent.not( $elem ) );\n }\n }\n else\n {\n if ( !$elem.attr( 'href' ) )\n {\n // hide dropdown\n $parent.removeClass( 'open' );\n }\n }\n }\n\n // case 2: touch && ( md || lg ) -> open via 1st click on touch-desktop, return false (e.g. main navigation)\n\n if ( !alwaysClickable && ( Modernizr.touch && MediaSize.isInterval( 'md, lg' ) ) )\n {\n if ( !$parent.is( '.open' ) )\n {\n showDropdownHideOthers( $elem, $parent );\n\n avoidRedirectinStopPropagation( $parent );\n }\n else\n {\n // redirect to href if dropdown is already open\n // do nothing\n }\n }\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", resetEvent );\n }\n\n function showDropdownHideOthers( elem, parent )\n {\n var $parent = $( parent );\n\n // hide other dropdowns\n resetDropdowns( closableDropdownElements, elem );\n\n // remember opened dropdown\n if ( $.inArray( $parent[0], closableDropdownElements ) < 0 )\n {\n closableDropdownElements.push( $parent[0] );\n }\n\n // show dropdown\n $parent.addClass( 'open' );\n }\n\n function avoidRedirectinStopPropagation( elem )\n {\n var $elem = $( elem );\n\n // avoid redirecting\n pm.getRecentEvent().preventDefault();\n\n // avoid closing popup by clicking itself\n $elem.off( 'click' );\n $elem.on( 'click', function( e )\n {\n e.stopPropagation();\n } );\n }\n\n function slideDropdown( elem )\n {\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n // size interval query is required since function is used on document ready to initial open active\n // navigation (on small devices)\n if ( MediaSize.isInterval( 'xs, sm' ) )\n {\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 400, function()\n {\n if ( $elemParent.is( '.open' ) && !$( \"input\" ).is( \":focus\" ) )\n {\n $elemParent.removeClass( 'open' );\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n if ( $.inArray( $elemParent[0], dropdownElements ) < 0 )\n {\n dropdownElements.push( $elemParent[0] );\n }\n }\n } );\n }\n\n // handle \"close menu on click outside\"\n $( 'html' ).on( \"click touchstart\", resetEvent );\n }\n\n function resetEvent( event )\n {\n resetDropdowns( closableDropdownElements, event );\n }\n\n }, ['MediaSizeService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Redirect', function( MediaSizeService, NavigatorService )\n {\n\n return {\n to : to,\n toCheckoutTab: toCheckoutTab\n };\n\n function to( href )\n {\n if ( MediaSizeService.interval() != 'xs' )\n {\n if ( typeof href === 'string' && href.indexOf('/') == -1 && $( href ).length > 0 )\n {\n window.location.assign( $( href ).attr( 'href' ) );\n }\n else\n {\n window.location.assign( href );\n }\n }\n }\n\n function toCheckoutTab( tabID )\n {\n NavigatorService.goToID( tabID );\n }\n\n }, ['MediaSizeService', 'NavigatorService'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Tab', function( MediaSize )\n {\n\n var tabGroups = {};\n\n return {\n showTab : showTab,\n initRemoteLabel: initRemoteLabel,\n initRemoteTab : initRemoteTab,\n showRemoteTab : showRemoteTab\n };\n\n function showTab( tabSelector )\n {\n $( tabSelector ).tab( 'show' );\n }\n\n function initRemoteLabel( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).addLabel( $elem );\n }\n\n function initRemoteTab( $elem, tabID, groupID )\n {\n if ( !tabGroups[groupID] )\n {\n tabGroups[groupID] = new TabGroup();\n }\n\n if ( !tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].addTab( tabID );\n }\n\n tabGroups[groupID].getTab( tabID ).setContent( $elem );\n }\n\n function showRemoteTab( tabID, groupID, interval )\n {\n if ( MediaSize.isInterval( interval ) )\n {\n pm.getRecentEvent().preventDefault();\n\n if ( !!tabGroups[groupID] && !!tabGroups[groupID].getTab( tabID ) )\n {\n tabGroups[groupID].showTab( tabID );\n }\n\n }\n }\n\n function TabGroup()\n {\n var tabs = {};\n var activeTab;\n\n return {\n addTab : addTab,\n showTab : showTab,\n getTab : getTab,\n resetTabs: resetTabs\n };\n\n function addTab( tabID )\n {\n tabs[tabID] = new Tab( tabID );\n return tabs[tabID];\n }\n\n function showTab( tabID )\n {\n var zIndex = 0;\n if ( !!activeTab )\n {\n // activeTab is set\n zIndex = parseInt( activeTab.getContent().parent().css( 'zIndex' ) );\n activeTab.hide();\n activeTab.getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n else\n {\n // activeTab not set before\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n var currentZ = parseInt( tabs[tab].getContent().parent().css( 'zIndex' ) );\n if ( zIndex == 0 || currentZ < zIndex )\n {\n zIndex = currentZ;\n }\n tabs[tab].hide();\n }\n }\n\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].getContent().parent().css( 'zIndex', zIndex - 1 );\n }\n }\n\n $( window ).on( 'sizeChange', resetTabs );\n }\n\n activeTab = tabs[tabID];\n activeTab.getContent().parent().css( 'zIndex', zIndex );\n activeTab.show();\n }\n\n function getTab( tabID )\n {\n return tabs[tabID];\n }\n\n function resetTabs()\n {\n for ( var tab in tabs )\n {\n if ( !!tabs[tab].getContent() )\n {\n tabs[tab].show();\n }\n }\n\n activeTab = null;\n }\n }\n\n function Tab( id )\n {\n var $content;\n var $labels = [];\n var tabID = id;\n\n return {\n addLabel : addLabel,\n setContent: setContent,\n getContent: getContent,\n getID : getID,\n show : show,\n hide : hide\n };\n\n function getID()\n {\n return tabID;\n }\n\n function addLabel( label )\n {\n $labels.push( label );\n return this;\n }\n\n function setContent( content )\n {\n $content = content;\n return this;\n }\n\n function getContent()\n {\n return $content;\n }\n\n function show()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].addClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.show().addClass( 'in' );\n }\n\n }\n\n function hide()\n {\n for ( var i = 0; i < $labels.length; i++ )\n {\n $labels[i].removeClass( 'active' );\n }\n\n if ( !!$content )\n {\n $content.hide().removeClass( 'in' );\n }\n }\n }\n\n }, ['MediaSizeService'] );\n})( jQuery, PlentyFramework );\n/**\n * Add fancy ui modifications - the visual stuff - here.\n * Respond functionality like 'event':UI.myFunctionality(currentElement)\n *\n * Example:\n * \n *\n */\n(function( $, pm )\n{\n pm.directive( 'UI', function( MediaSizeService, SocialShareService, UIFactory )\n {\n // elements to calculate height.\n var equalHeightElementList = [];\n var toTopButtonList = [];\n\n return {\n initUIWindowEvents : initUIWindowEvents,\n showWaitscreen : showWaitscreen,\n hideWaitscreen : hideWaitscreen,\n addContentPageSlider: addContentPageSlider,\n equalHeight : equalHeight,\n initToTop : initToTop,\n initLazyload : initLazyload,\n initSlideToggle : initSlideToggle,\n slideDown : slideDown,\n slideUp : slideUp,\n slideToggle : slideToggle,\n toggleHideShow : toggleHideShow,\n toggleSocialShare : toggleSocialShare,\n toggleClass : toggleClass,\n addClass : addClass,\n removeClass : removeClass\n };\n\n function initUIWindowEvents()\n {\n // resize elements on window size change.\n $( window ).on( 'sizeChange contentChanged', function()\n {\n fireEqualHeight();\n } );\n\n $( window ).on( \"scroll resize\", function()\n {\n if ( toTopButtonList.length > 0 )\n {\n if ( $( document ).scrollTop() > 100 )\n {\n doToArrayElements( toTopButtonList, \"addClass\", \"visible\" );\n }\n else\n {\n doToArrayElements( toTopButtonList, \"removeClass\", \"visible\" );\n }\n }\n } );\n }\n\n /**\n * Display waitscreen on page e.g. for requests.\n * Use with care and don't forget to hide waitscreen, if your calls are done or broke!!\n */\n function showWaitscreen()\n {\n UIFactory.showWaitscreen();\n }\n\n /**\n * Just hide the waitscreen.\n * @param forceClose\n */\n function hideWaitscreen( forceClose )\n {\n UIFactory.hideWaitscreen( forceClose );\n }\n\n /**\n * Adds content page slider (owlCarousel)\n *\n * usage:\n *
    \n *
    \n * ...\n *
    \n *
    \n * ...\n *
    \n * ...\n *
    \n *\n * Legacy directive selector: data-plenty=\"contentpageSlider\"\n *\n * @param elem\n */\n function addContentPageSlider( elem )\n {\n $( elem ).owlCarousel( {\n navigation : true,\n navigationText : false,\n slideSpeed : 1000,\n paginationSpeed: 1000,\n singleItem : true,\n autoPlay : 6000,\n stopOnHover : true,\n afterMove : function( current )\n {\n $( current ).find( '[data-plenty-rel=\"lazyload\"]' ).trigger( 'appear' );\n }\n } );\n }\n\n /**\n * Equal Box height\n * Calculates equal box height for chosen elements.\n *\n * Legacy directive selector: data-plenty-equal\n *\n * @param elem\n * @param elementExists - default false\n */\n function equalHeight( elem, mediaSizes, elementExists )\n {\n var $elem = $( elem );\n var maxHeight = 0;\n var $equalTarget = {};\n var $equalTargetList = $elem.find( '[data-plenty-rel=\"equal-target\"]' ).length > 0 ? $elem.find( '[data-plenty-rel=\"equal-target\"]' ) : $elem.children();\n\n // if element wasn't pushed before.\n if ( elementExists !== true )\n {\n equalHeightElementList.push( elem );\n }\n\n for ( var i = $equalTargetList.length; i >= 0; i-- )\n {\n $equalTarget = $( $equalTargetList[i] );\n $equalTarget.css( 'height', '' );\n\n if ( $equalTarget.outerHeight( true ) > maxHeight )\n {\n maxHeight = $equalTarget.outerHeight( true );\n }\n }\n\n if ( !mediaSizes || MediaSizeService.isInterval( mediaSizes ) )\n {\n $equalTargetList.height( maxHeight );\n }\n }\n\n /**\n * Scroll page to top.\n * Just add without events.\n *\n * Legacy directive selector: data-plenty=\"toTop\"\n *\n * @param elem\n */\n function initToTop( elem )\n {\n var $elem = $( elem );\n\n $elem.click( function()\n {\n $( 'html, body' ).animate( {\n scrollTop: 0\n }, 400 );\n return false;\n } );\n\n if ( !!$.inArray( $elem, toTopButtonList ) )\n {\n toTopButtonList.push( $elem );\n }\n }\n\n /**\n * lazy load on ready.\n *\n * Legacy directive selector: img[data-plenty-lazyload]\n *\n * @param elem\n */\n function initLazyload( elem, effect )\n {\n var $elem = $( elem );\n\n $elem.lazyload( {\n effect: effect\n } );\n if ( $elem.is( 'img' ) )\n {\n $elem.on( 'loaded', function()\n {\n $elem.css( 'display', 'inline-block' );\n } );\n }\n }\n\n /**\n * Toggle show and hide animation.\n *\n * Legacy directive selector: data-plenty=\"openCloseToggle\"\n *\n * @param elem\n */\n function toggleHideShow( elem )\n {\n\n console.log( elem );\n\n var $elem = $( elem );\n var $elemParent = $elem.parent();\n\n $elemParent.addClass( 'animating' );\n $elem.siblings( 'ul' ).slideToggle( 200, function()\n {\n if ( $elemParent.is( '.open' ) )\n {\n $elemParent.removeClass( 'open' );\n }\n else\n {\n $elemParent.addClass( 'open' );\n }\n $elem.siblings( 'ul' ).removeAttr( 'style' );\n $elemParent.removeClass( 'animating' );\n } );\n }\n\n /**\n * Toggle target content on click.\n * Bind to checked-/ unchecked-property of radio buttons\n *\n * Legacy directive selector: data-plenty-slidetoggle\n *\n * @param elem\n */\n function initSlideToggle( elem, checked )\n {\n var $elem = $( elem );\n var $targetElement = $( $elem.attr( 'data-plenty-rel' ) );\n\n if ( $elem.is( 'input[type=\"radio\"]' ) )\n {\n // is radio button\n var $radioGroupList = $( 'input[type=\"radio\"][name=\"' + ( $elem.attr( 'name' ) ) + '\"]' );\n var visibleOnChecked = !checked || checked == 'checked';\n\n $radioGroupList.change( function()\n {\n var $self = $( this );\n $targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n if ( $self.is( ':checked' ) && $self[0] === $elem[0] && visibleOnChecked == true )\n {\n // checked\n $targetElement.slideDown( 400, function()\n {\n fireEqualHeight();\n } );\n }\n else\n {\n // unchecked (since other radio button has been checked)\n $targetElement.slideUp( 400, function()\n {\n fireEqualHeight();\n } );\n }\n } );\n }\n else\n {\n // is not radio button\n $elem.click( function()\n {\n //$targetElement.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n\n $elem.addClass( 'animating' );\n $targetElement.slideToggle( 400, function()\n {\n $elem.removeClass( 'animating' );\n $elem.toggleClass( 'active' );\n fireEqualHeight();\n } );\n } );\n }\n }\n\n function slideDown( target, duration )\n {\n slideAction( $( target ), duration, 'slideDown' );\n }\n\n function slideUp( target, duration )\n {\n slideAction( $( target ), duration, 'slideUp' );\n }\n\n function slideToggle( target, duration )\n {\n slideAction( $( target ), duration, 'slideToggle' );\n }\n\n function slideAction( $target, duration, callbackString )\n {\n duration = duration || 400;\n $target.parents( '[data-plenty-rel=\"equal-target\"]' ).css( 'height', 'auto' );\n $target[callbackString]( duration, function()\n {\n fireEqualHeight();\n } );\n }\n\n /**\n * TODO check comment\n * Social Share Activation\n * Activate and load share-buttons manually by clicking a separate button\n * Usage / data-attributes:\n *
    \n * Will be used to activate the service set in\n * data-plenty-social=\"\"\n * Will be replaced with loaded share button\n *
    \n *\n * possible values for data-plenty-social:\n * \"facebook-like\" : Load Facebooks \"Like\"-Button\n * \"facebook-recommend\" : Load Facebooks \"Recommend\"-Button\n * \"twitter\" : Load Twitter Button\n * \"google-plus\" : Load google \"+1\"-Button\n *\n * Additional Tooltips\n * You can extend the parent element with a (bootstrap) tooltip by adding data-toggle=\"tooltip\" and\n * title=\"TOOLTIP CONTENT\" Tooltip will be destroyed after activating a social service\n * (!) Requires bootstrap.js\n *\n * Legacy directive selector: data-plenty-social\n *\n * @param elem\n */\n function toggleSocialShare( elem, socialShareService )\n {\n var $elem = $( elem );\n var $toggle = $elem.find( '[data-plenty-rel=\"social-switch\"]' );\n\n // append container to put / delete service.html\n $elem.append( '
    ' );\n\n // add \"off\" class to switch, if neither \"off\" or \"on\" is set\n // replaced hasClass() with is() benchmark: http://jsperf.com/hasclasstest\n if ( !$toggle.is( 'off, on' ) )\n {\n $toggle.addClass( 'off' );\n }\n\n // toggle switch\n $toggle.on( 'click', function()\n {\n if ( $toggle.hasClass( 'off' ) )\n {\n // TODO remove bootstrap dependency\n if ( $elem.attr( \"data-toggle\" ) == \"tooltip\" )\n {\n $elem.tooltip( 'destroy' )\n }\n $toggle.removeClass( 'off' ).addClass( 'on' );\n // hide dummy button\n $elem.find( '[data-plenty-rel=\"social-placeholder\"]' ).hide();\n // load HTML defined in 'api'\n $elem.find( '.social-container' ).append( SocialShareService.getSocialService( socialShareService ) );\n }\n // do not disable social medias after activation\n } );\n }\n\n /**\n * Toggle Class\n * toggle style-classes on click\n * Usage / data-attribute:\n *
    \n * target : jQuery selector to toggle the class at.\n * class : class(es) to toggle at target element\n * media : only toggle class on given media sizes (optional)\n *\n * (!) using data-plenty-toggle on -elements will prevent redirecting to href=\"\"\n *\n * Legacy directive selector: data-plenty-toggle\n *\n * @param cssClass\n * @param target\n * @param interval\n */\n function toggleClass( cssClass, target, interval )\n {\n var $target = $( target );\n /* FIXME\n * Callisto 3.1 Design adaption:\n * NavigationCategoriesList\n * Line 8\n * BEFORE:\n *
  • \n * AFTER:\n *
  • \n *\n * Line 10\n * BEFORE:\n * \n * AFTER:\n * \n *\n * */\n if ( $target.parents( \".navbar-main\" ).length > 0 )\n {\n var $elem = $target.children( \"span\" );\n pm.directives[\"MobileDropdown\"].slideDropdown( $elem );\n return true;\n }\n\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $target.toggleClass( cssClass );\n return false;\n }\n }\n\n function addClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).addClass( cssClass );\n return false;\n }\n }\n\n function removeClass( cssClass, target, interval )\n {\n if ( !!target && !!cssClass && ( !interval || MediaSizeService.isInterval( interval ) ) )\n {\n var e = pm.getRecentEvent();\n if ( !!e )\n {\n e.preventDefault();\n }\n\n $( target ).removeClass( cssClass );\n return false;\n }\n }\n\n /*\n ##### PRIVATE FUNCTIONS ######\n */\n\n function fireEqualHeight()\n {\n for ( var i = equalHeightElementList.length - 1; i >= 0; i-- )\n {\n equalHeight( equalHeightElementList[i], '', true );\n }\n }\n\n function doToArrayElements( array, func, params )\n {\n for ( var i = array.length - 1; i >= 0; i-- )\n {\n array[i][func]( params );\n }\n }\n\n }, ['MediaSizeService', 'SocialShareService', 'UIFactory'] );\n}( jQuery, PlentyFramework ));\n(function( $, pm )\n{\n pm.directive( 'Validator', function( ValidationService )\n {\n\n return {\n validate: validate\n };\n\n function validate( form, errorClass )\n {\n return ValidationService.validate( form, errorClass );\n }\n\n }, ['ValidationService'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Handles requests to ReST API. Provides a {{#crossLink \"APIFactory/handleError:method\"}}default\n * error-handling{{/crossLink}}. Request parameters will be parsed to json internally
    \n * Requires:\n *
      \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class APIFactory\n * @static\n */\n pm.factory( 'APIFactory', function( UI, Modal )\n {\n\n var sessionExpirationTimeout = null;\n $( document ).ready( function()\n {\n renewLoginSession();\n } );\n\n return {\n get : _get,\n post : _post,\n put : _put,\n delete: _delete,\n idle : _idle\n };\n\n function renewLoginSession()\n {\n if ( !pm.getGlobal( 'LoginSession' ) )\n {\n return;\n }\n\n if ( !!sessionExpirationTimeout )\n {\n clearTimeout( sessionExpirationTimeout );\n }\n\n sessionExpirationTimeout = setTimeout( function()\n {\n $( window ).trigger( 'login-expired' );\n\n if ( pm.getGlobal( 'PageDesign' ) === \"Checkout\" )\n {\n Modal.prepare()\n .setTitle( pm.translate( 'Your session has expired.' ) )\n .setContent( pm.translate( 'Please log in again to continue shopping.' ) )\n .setLabelDismiss( null )\n .setLabelConfirm( pm.translate( 'OK' ) )\n .onConfirm( function()\n {\n window.location.assign( '/' );\n } )\n .onDismiss( function()\n {\n window.location.assign( '/' );\n } )\n .show();\n }\n\n }, pm.getGlobal( 'LoginSessionExpiration' ) );\n }\n\n /**\n * Is called by default if a request failed.
    \n * Can be prevented by setting the requests last parameter to false.\n *\n * @function handleError\n * @private\n *\n * @param {object} jqXHR
    jQuery\n * deferred Object\n */\n function handleError( jqXHR )\n {\n try\n {\n var responseText = $.parseJSON( jqXHR.responseText );\n UI.printErrors( responseText.error.error_stack );\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n }\n\n /**\n * Sends a GET request to ReST-API\n *\n * @function get\n *\n * @param {string} url The URL to send the request to\n * @param {object} params The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _get( url, params, ignoreErrors, runInBackground, sync )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'GET',\n data : params,\n dataType: 'json',\n async : !sync,\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a POST request to ReST-API\n *\n * @function post\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _post( url, data, ignoreErrors, runInBackground )\n {\n\n var params = {\n type : 'POST',\n dataType: 'json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n };\n\n if ( !!data && data.isFile )\n {\n params.cache = data.cache;\n params.processData = data.processData;\n params.data = data.data;\n params.contentType = false;\n }\n else\n {\n params.data = JSON.stringify( data );\n params.contentType = 'application/json';\n }\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url, params\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n }\n\n /**\n * Sends a PUT request to ReST-API\n *\n * @function put\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @return {object} jQuery\n * deferred Object\n */\n function _put( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'PUT',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Sends a DELETE request to ReST-API\n *\n * @function delete\n *\n * @param {string} url The URL to send the request to\n * @param {object} data The data to append to requests body. Will be converted to JSON\n * internally\n * @param {boolean} [ignoreErrors=false] disable/ enable defaults error handling\n * @param {boolean} [runInBackground=false] show wait screen while request is in progress.\n * @returns {object} jQuery\n * deferred Object\n */\n function _delete( url, data, ignoreErrors, runInBackground )\n {\n\n if ( !runInBackground )\n {\n UI.showWaitScreen();\n }\n\n return $.ajax(\n url,\n {\n type : 'DELETE',\n data : JSON.stringify( data ),\n dataType : 'json',\n contentType: 'application/json',\n error : function( jqXHR )\n {\n if ( !ignoreErrors )\n {\n handleError( jqXHR )\n }\n }\n }\n ).always( function()\n {\n if ( !runInBackground )\n {\n UI.hideWaitScreen();\n }\n renewLoginSession();\n } );\n\n }\n\n /**\n * Get a idle request doing nothing for chaining methods\n * @returns {object} jQuery\n * deferred Object\n */\n function _idle()\n {\n return $.Deferred().resolve();\n }\n\n }, ['UIFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Provide methods for receiving layout containers, layout parameters\n * or category content from API
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    \n * @class CMSFactory\n * @static\n */\n pm.factory( 'CMSFactory', function( API )\n {\n\n return {\n getContainer : getContainer,\n getParams : getParams,\n getCategoryContent: getCategoryContent\n };\n\n /**\n * Prepare the request to receive HTML-Content from CMS\n * @function getContainer\n * @param {string} containerName The Layoutcontainer to receive.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the location in\n * the CMS\n * (e.g. 'Checkout')\n * @example\n * CMSFactory.getContainer( 'CheckoutTotals' ).from( 'Checkout' )\n * .done(function( response ) {\n * // container content\n * var html = response.data[0]\n * });\n */\n function getContainer( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/container_' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n\n }\n\n /**\n * Prepare the request to receive Layout parameters for a template\n * @function getParams\n * @param {string} containerName The Layoutcontainer to receive the parameteres of.\n * @param {object} params Additional GET-parameters.\n * @returns {object} The prepared request. Call .from( layoutGroup ) to specify the\n * location in the CMS\n * (e.g. 'ItemView')\n * @example\n * CMSFactory.getParams( 'BasketItemsList' ).from( 'ItemView' )\n * .done(function( response ) {\n * // BasketItems\n * var items = response.data;\n * });\n */\n function getParams( containerName, params )\n {\n\n function from( layoutGroup )\n {\n return API.get( '/rest/' + layoutGroup.toLowerCase() + '/' + containerName.toLowerCase() + '/', params );\n }\n\n return {\n from: from\n }\n }\n\n /**\n * Get the content of a category specified by its ID\n * @function getCategoryContent\n * @param {number} categoryID The ID of the category to get the content from\n * @returns {object} jQuery deferred\n * Object\n */\n function getCategoryContent( categoryID )\n {\n return API.get( '/rest/categoryview/categorycontentbody/?categoryID=' + categoryID );\n }\n\n }, ['APIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( pm )\n{\n\n /**\n * Holds checkout data for global access and provides methods\n * for reloading content dynamically-
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutFactory\n * @static\n */\n pm.factory( 'CheckoutFactory', function( API, CMS, UI )\n {\n\n // data received from ReST API\n var checkoutData;\n\n // instance wrapped checkout object for global access\n var checkout;\n\n return {\n getCheckout : getCheckout,\n setCheckout : setCheckout,\n loadCheckout : loadCheckout,\n reloadContainer : reloadContainer,\n reloadCatContent : reloadCatContent,\n reloadItemContainer: reloadItemContainer\n };\n\n function Checkout()\n {\n return checkoutData;\n }\n\n /**\n * Returns instance of wrapped checkout object\n * @function getCheckout\n * @returns {Checkout} Instance of checkout object\n */\n function getCheckout( copy )\n {\n if ( !checkout || !checkoutData )\n {\n loadCheckout( true );\n }\n\n if ( !!copy )\n {\n return $.extend( true, {}, checkoutData );\n }\n return checkout;\n }\n\n /**\n * Receive global checkout data from ReST-API\n * @function loadCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function loadCheckout( sync )\n {\n\n return API.get( '/rest/checkout/', null, false, false, sync )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n }\n\n /**\n * Update checkout data on server\n * @function setCheckout\n * @return {object} jQuery deferred\n * Object\n */\n function setCheckout()\n {\n\n return API.put( '/rest/checkout', checkout )\n .done( function( response )\n {\n if ( !!response )\n {\n checkoutData = response.data;\n checkout = new Checkout();\n }\n else\n {\n UI.throwError( 0, 'Could not receive checkout data [GET \"/rest/checkout/\" receives null value]' );\n }\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-checkout-template=\"...\"\n * @function reloadContainer\n * @param {string} container Name of the template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadContainer( container )\n {\n\n return CMS.getContainer( \"checkout\" + container ).from( 'checkout' )\n .done( function( response )\n {\n $( '[data-plenty-checkout-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n } );\n } );\n }\n\n /**\n * Get category content from server and replace received HTML\n * in containers marked with data-plenty-checkout-catcontent=\"...\"\n * @function reloadCatContent\n * @param {number} catId ID of the category to load content (description 1) from server\n * @return {object} jQuery deferred\n * Object\n * @deprecated\n */\n function reloadCatContent( catId )\n {\n\n return CMS.getCategoryContent( catId )\n .done( function( response )\n {\n $( '[data-plenty-checkout-catcontent=\"' + catId + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n /**\n * Get layout container from server and replace received HTML\n * in containers marked with data-plenty-itemview-template=\"...\"\n * @function reloadItemContainer\n * @param {string} container Name of the (item view) template to load from server\n * @return {object} jQuery deferred\n * Object\n */\n function reloadItemContainer( container )\n {\n\n return CMS.getContainer( 'itemview' + container ).from( 'itemview' )\n .done( function( response )\n {\n $( '[data-plenty-itemview-template=\"' + container + '\"]' )\n .each( function( i, elem )\n {\n $( elem ).html( response.data[0] );\n pm.getInstance().bindDirectives( elem );\n $( window ).trigger( 'contentChanged' );\n\n } );\n } );\n\n }\n\n }, ['APIFactory', 'CMSFactory', 'UIFactory'] );\n}( PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Provides methods for creating and displaying modal popups.\n * @class ModalFactory\n * @static\n */\n pm.factory( 'ModalFactory', function()\n {\n\n return {\n prepare: prepare,\n isModal: isModal\n };\n\n /**\n * Detect if given html contains a valid modal\n * @function isModal\n * @param {string} html\n * @returns {boolean}\n */\n function isModal( html )\n {\n return PlentyFramework.partials.Modal.isModal( html );\n }\n\n /**\n * Create a new Instance of {{#crossLink \"ModalFactory.Modal\"}}Modal{{/crossLink}}\n * @function prepare\n * @returns {Modal}\n */\n function prepare( selector )\n {\n return new Modal( selector );\n }\n\n /**\n * Holds configuration of a modal and provides methods for displaying and hiding the modal\n * @class Modal\n * @for ModalFactory\n * @returns {Modal}\n * @constructor\n */\n function Modal( selector )\n {\n\n var modal = this;\n modal.selector = selector;\n\n /**\n * The title of the modal\n * @attribute title\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.title = '';\n\n modal.cssClass = '';\n\n /**\n * The content of the modal\n * @attribute content\n * @type {string}\n * @private\n * @default \"\"\n */\n modal.content = '';\n\n /**\n * The content of the dismiss-button\n * @attribute labelDismiss\n * @type {string}\n * @private\n * @default \"Abbrechen\"\n */\n modal.labelDismiss = pm.translate( \"Cancel\" );\n\n /**\n * the label of the confirmation button\n * @attribute labelConfirm\n * @type {string}\n * @private\n * @default \"Bestätigen\"\n */\n modal.labelConfirm = pm.translate( \"Confirm\" );\n\n /**\n * Callback when modal is confirmed by clicking confirmation button.\n * Modal will not be dismissed if callback returns false.\n * @attribute onConfirm\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onConfirm = function()\n {\n };\n\n /**\n * Callback when modal is dismissed by closing the modal\n * @attribute onDismiss\n * @type {function}\n * @private\n * @default function() {}\n */\n modal.onDismiss = function()\n {\n };\n\n /**\n * jQuery selector of the container element to display the modal in.\n * @attribute container\n * @type {string}\n * @private\n * @default \"body\"\n */\n modal.container = 'body';\n\n /**\n * Timeout to close the modal automatically. Set <0 to disable.\n * @attribute timeout\n * @type {number}\n * @private\n * @default -1\n */\n modal.timeout = -1;\n\n modal.hide = hide;\n modal.startTimeout = startTimeout;\n modal.stopTimeout = stopTimeout;\n modal.pauseTimeout = pauseTimeout;\n modal.continueTimeout = continueTimeout;\n\n var bsModal;\n var timeout, interval;\n var timeRemaining, timeStart;\n var paused = false;\n\n return {\n setTitle : setTitle,\n setClass : setClass,\n setContent : setContent,\n setContainer : setContainer,\n setLabelConfirm: setLabelConfirm,\n setLabelDismiss: setLabelDismiss,\n onConfirm : onConfirm,\n onDismiss : onDismiss,\n setTimeout : setTimeout,\n show : show,\n hide : hide\n };\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/title:attribute}}title{{/crossLink}} of the modal\n * @function setTitle\n * @param {string} title The title\n * @returns {Modal} Modal object for chaining methods\n */\n function setTitle( title )\n {\n modal.title = title;\n return this;\n }\n\n function setClass( cssClass )\n {\n modal.cssClass = cssClass;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/content:attribute}}content{{/crossLink}} of the modal\n * @function setContent\n * @param {string} content The content\n * @returns {Modal} Modal object for chaining methods\n */\n function setContent( content )\n {\n modal.content = content;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelConfirm:attribute}}label of the confirmation\n * button{{/crossLink}} of the modal\n * @function setLabelConfirm\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelConfirm( label )\n {\n modal.labelConfirm = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/labelDismiss:attribute}}label if the dismiss\n * button{{/crossLink}} of the modal\n * @function setLabelDismiss\n * @param {string} label The label\n * @returns {Modal} Modal object for chaining methods\n */\n function setLabelDismiss( label )\n {\n modal.labelDismiss = label;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onConfirm:attribute}}confirmation callback{{/crossLink}} of the\n * modal\n * @function onConfirm\n * @param {function} callback The callback if modal is confirmed\n * @returns {Modal} Modal object for chaining methods\n */\n function onConfirm( callback )\n {\n modal.onConfirm = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/onDismiss:attribute}}dismiss callback{{/crossLink}} of the modal\n * @function onDismiss\n * @param {function} callback The callback if modal is dismissed\n * @returns {Modal} Modal object for chaining methods\n */\n function onDismiss( callback )\n {\n modal.onDismiss = callback;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/container:attribute}}container{{/crossLink}} of the modal\n * @function setContainer\n * @param {string} container The jQuery selector of the container to display the modal in\n * @returns {Modal} Modal object for chaining methods\n */\n function setContainer( container )\n {\n modal.container = container;\n return this;\n }\n\n /**\n * Set the {{#crossLink \"ModalFactory.Modal/timeout:attribute}}timeout{{/crossLink}} of the modal\n * @function setTimeout\n * @param {number} timeout The timeout to close the modal automatically. Set <0 to disable\n * @returns {Modal} Modal object for chaining methods\n */\n function setTimeout( timeout )\n {\n modal.timeout = timeout;\n return this;\n }\n\n /**\n * Inject modal data in default template if not template is given\n * and display the modal inside the configured container.
    \n * Start timer to hide the modal automatically if timeout is set.\n * @function show\n */\n function show()\n {\n if( !!modal.selector )\n {\n bsModal = $( modal.selector );\n }\n else\n {\n if ( isModal( modal.content ) )\n {\n bsModal = PlentyFramework.partials.Modal.getModal( modal.content );\n }\n else\n {\n bsModal = $( PlentyFramework.compileTemplate( 'modal/modal.html', modal ) );\n }\n\n $( modal.container ).append( bsModal );\n\n // append additional scripts executable\n var scripts = $( modal.content ).filter( 'script' );\n if ( scripts.length > 0 )\n {\n scripts.each( function( i, script )\n {\n var element = document.createElement( 'script' );\n element.type = 'text/javascript';\n element.innerHTML = $( script ).text();\n $( modal.container ).append( element );\n } );\n }\n }\n\n // bind callback functions\n PlentyFramework.partials.Modal.init( bsModal, modal );\n bsModal.find( '[data-plenty-modal=\"confirm\"]' ).click( function()\n {\n var close = modal.onConfirm();\n\n if ( typeof close == \"undefined\" )\n {\n close = true;\n }\n\n if ( close )\n {\n hide( true );\n }\n } );\n\n PlentyFramework.partials.Modal.show( bsModal );\n\n if ( modal.timeout > 0 )\n {\n startTimeout();\n }\n\n }\n\n /**\n * Hide the modal.\n * @function hide\n * @param {boolean} confirmed Flag indicating of modal is closed by confirmation button or dismissed\n */\n function hide( confirmed )\n {\n PlentyFramework.partials.Modal.hide( bsModal );\n\n if ( !confirmed )\n {\n modal.onDismiss();\n }\n }\n\n /**\n * Start the configured timeout initially\n * @function startTimeout\n * @private\n */\n function startTimeout()\n {\n timeRemaining = modal.timeout;\n timeStart = (new Date()).getTime();\n\n timeout = window.setTimeout( function()\n {\n window.clearInterval( interval );\n hide();\n }, modal.timeout );\n\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( timeRemaining / 1000 );\n interval = window.setInterval( function()\n {\n if ( !paused )\n {\n var secondsRemaining = timeRemaining - (new Date()).getTime() + timeStart;\n secondsRemaining = Math.round( secondsRemaining / 1000 );\n bsModal.find( '[data-plenty-modal=\"timer\"]' ).text( secondsRemaining );\n }\n }, 1000 )\n }\n\n /**\n * Pause the timeout (e.g. on hover)\n * @function pauseTimeout\n * @private\n */\n function pauseTimeout()\n {\n paused = true;\n timeRemaining -= (new Date()).getTime() - timeStart;\n window.clearTimeout( timeout );\n }\n\n /**\n * Continue paused timeout\n * @function continueTimeout\n * @private\n */\n function continueTimeout()\n {\n paused = false;\n timeStart = (new Date()).getTime();\n timeout = window.setTimeout( function()\n {\n hide();\n window.clearInterval( interval );\n }, timeRemaining );\n }\n\n /**\n * Stop timeout. Stopped timeouts cannot be continued.\n * @function stopTimeout\n * @private\n */\n function stopTimeout()\n {\n window.clearTimeout( timeout );\n window.clearInterval( interval );\n }\n\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Factories\n */\n(function( $, pm )\n{\n\n /**\n * Displaying error messages and handling wait screen\n * @class UIFactory\n * @static\n */\n pm.factory( 'UIFactory', function()\n {\n /**\n * Increased/ decreased when showing/ hiding wait screen to avoid stacking\n * multiple instances of overlays.\n * @attribute waitScreenCount\n * @private\n * @type {number}\n * @default 0\n */\n var waitScreenCount = 0;\n var waitScreen;\n var errorPopup = null;\n\n return {\n throwError : throwError,\n printErrors : printErrors,\n showWaitScreen: showWaitScreen,\n hideWaitScreen: hideWaitScreen\n };\n\n /**\n * Display a single error message.\n * @function throwError\n * @param {number} code A code identifying this error\n * @param {string} msg The error message to display\n */\n function throwError( code, msg )\n {\n printErrors( [{code: code, message: msg}] );\n }\n\n /**\n * Wrap error messages in error popup, if popup doesn't already contain this error\n * If popup is already visible, append new errors to popup's inner HTML\n * otherwise create new popup\n * @function printErrors\n * @param {Array} errorMessages A list of errors to display\n */\n function printErrors( errorMessages )\n {\n\n // create error-popup if not exist\n if ( !errorPopup || $( 'body' ).has( errorPopup ).length <= 0 )\n {\n errorPopup = $( pm.compileTemplate( 'error/errorPopup.html' ) );\n $( 'body' ).append( errorPopup );\n pm.partials.Error.init( errorPopup );\n }\n\n $.each( errorMessages, function( key, error )\n {\n // add additional error, if not exist.\n pm.partials.Error.addError( errorPopup, $( pm.compileTemplate( 'error/errorMessage.html', error ) ) );\n } );\n\n pm.partials.Error.show( errorPopup );\n\n hideWaitScreen( true );\n }\n\n /**\n * Show wait screen if not visible and increase\n * {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * @function showWaitScreen\n */\n function showWaitScreen()\n {\n waitScreenCount = waitScreenCount || 0;\n\n // create wait-overlay if not exist\n if ( !waitScreen || $( 'body' ).has( waitScreen ).length <= 0 )\n {\n waitScreen = $( pm.compileTemplate( 'waitscreen/waitscreen.html' ) );\n $( 'body' ).append( waitScreen );\n }\n\n pm.partials.WaitScreen.show( waitScreen );\n\n // increase instance counter to avoid showing multiple overlays\n waitScreenCount++;\n return waitScreenCount;\n }\n\n /**\n * Decrease {{#crossLink \"UIFactory/waitScreenCount:attribute\"}}waitScreenCount{{/crossLink}}\n * and hide wait screen if waitScreenCount is 0\n * @function hideWaitScreen\n * @param {boolean} forceClose set true to hide wait screen independent from the value of waitScreenCount.\n */\n function hideWaitScreen( forceClose )\n {\n\n // decrease overlay count\n waitScreenCount--;\n\n // hide if all instances of overlays has been closed\n // or if closing is forced by user\n if ( waitScreenCount <= 0 || !!forceClose )\n {\n waitScreenCount = 0;\n pm.partials.WaitScreen.hide( waitScreen );\n }\n return waitScreenCount;\n }\n\n } );\n}( jQuery, PlentyFramework ));\n/**\n * Factories provide static functions and can be injected into\n * {{#crossLinkModule \"Services\"}}services{{/crossLinkModule}}.
    \n * Factories also can inject other factories. Compared to services,\n * factories are not visible in instances of {{#crossLinkModule \"PlentyFramework\"}}PlentyFramework{{/crossLinkModule}}.\n *\n * @module Factories\n * @main Factories\n */\nObject.equals = function( a, b )\n{\n if ( a === b )\n {\n return true;\n }\n if ( !(a instanceof Object) || !(b instanceof Object) )\n {\n return false;\n }\n if ( a.constructor !== b.constructor )\n {\n return false;\n }\n\n for ( var key in a )\n {\n if ( !a.hasOwnProperty( key ) )\n {\n continue;\n }\n if ( !b.hasOwnProperty( key ) )\n {\n return false;\n }\n if ( a[key] === b[key] )\n {\n continue;\n }\n if ( typeof( a[key] ) !== \"object\" )\n {\n return false;\n }\n if ( !Object.equals( a[key], b[key] ) )\n {\n return false;\n }\n }\n\n for ( var key in b )\n {\n if ( b.hasOwnProperty( key ) && !a.hasOwnProperty( key ) )\n {\n return false;\n }\n }\n\n return true;\n\n};\nPlentyFramework.cssClasses = {\n\n active: \"active\"\n\n};\n(function( $, pm )\n{\n\n pm.partials.Error = {\n\n /**\n * Will be called, after the error popup was created and injected in DOM.\n * @param {HTMLElement} popup The injected element of the popup\n */\n init: function( popup )\n {\n $( popup ).find( '.close' ).click( function()\n {\n pm.partials.Error.hideAll();\n } );\n },\n\n /**\n * Will be called for each thrown error. Has to be injected in DOM manually.\n * @param {HTMLElement} popup The error popup element\n * @param {HTMLElement} error The error message element\n */\n addError: function( popup, error )\n {\n var errorCode = $( error ).attr( 'data-plenty-error-code' );\n\n if ( $( popup ).find( '[data-plenty-error-code=\"' + errorCode + '\"]' ).length <= 0 )\n {\n $( popup ).find( '.plentyErrorBoxInner' ).append( error );\n }\n },\n\n /**\n * Will be called, after initialization and injection of all errors\n * @param {HTMLElement} popup The error popup element\n */\n show: function( popup )\n {\n $( popup ).show();\n },\n\n hideAll: function() {\n $( '#CheckoutErrorPane' ).hide();\n $( '#CheckoutErrorPane' ).find( '.plentyErrorBoxInner' ).html( '' );\n }\n\n }\n\n})( jQuery, PlentyFramework );\n(function( $, pm )\n{\n\n pm.partials.Modal = {\n\n /**\n * Will be called after a new modal was created and injected into DOM\n * @param {HTMLElement} element The injected modal element\n * @param {Modal} modal The instance of the current modal\n */\n init: function( element, modal )\n {\n element.on( 'hidden.bs.modal', function()\n {\n modal.hide();\n if( !modal.selector )\n {\n //Do not remove static modals\n element.remove();\n }\n } );\n\n if ( modal.timeout > 0 )\n {\n element.on( 'hide.bs.modal', modal.stopTimeout );\n element.find( '.modal-content' ).hover( function()\n {\n modal.pauseTimeout();\n }, function()\n {\n if ( element.is( '.in' ) )\n {\n modal.continueTimeout();\n }\n } );\n }\n },\n\n /**\n * Will be called if a Modal requests to show.\n * @param {HTMLElement} element The injected modal element\n */\n show: function( element )\n {\n element.modal( 'show' );\n },\n\n /**\n * Will be called if a Modal requests to hide.\n * @param {HTMLElement} element The injected modal element\n */\n hide: function( element )\n {\n element.modal( 'hide' );\n },\n\n /**\n * Detect if a given HTML string contains a modal\n * @param {HTMLElement} html the element to search a modal in.\n * @returns {boolean} true if a modal was found\n */\n isModal: function( html )\n {\n return $( html ).filter( '.modal' ).length + $( html ).find( '.modal' ).length > 0;\n },\n\n /**\n * Filter a modal from a given HTML string\n * @param {HTMLElement} html the element to get a modal from.\n * @returns {HTMLElement} the filtered modal element\n */\n getModal: function( html )\n {\n var modal = $( html );\n if ( modal.length > 1 )\n {\n modal = $( html ).filter( '.modal' ) || $( html ).find( '.modal' );\n }\n\n return modal;\n }\n\n };\n\n}( jQuery, PlentyFramework ));\n(function( $ )\n{\n\n $( document ).on( 'initPartials', function( e, root )\n {\n\n $( root ).find( '[data-toggle=\"tooltip\"]' ).tooltip( {\n container: 'body'\n } );\n\n } );\n\n})( jQuery );\n(function( $, pm )\n{\n\n pm.partials.WaitScreen = {\n\n /**\n * Will be called if the wait screen should be shown\n * @param {HTMLElement} element The wait screen element\n */\n show: function( element )\n {\n element.addClass( 'in' );\n },\n\n /**\n * Will be called if the wait screen should be hidden\n * @param {HTMLElement} element The wait screen element\n */\n hide: function( element )\n {\n element.removeClass( 'in' );\n }\n\n };\n\n})( jQuery, PlentyFramework );\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n(function( $, pm )\n{\n pm.service( 'AddressDoctorService', function( API )\n {\n return {\n validateAddress: validateAddress\n };\n\n function validateAddress( addressForms )\n {\n var addressIsValid = true;\n addressForms = addressForms || '[data-plenty-address-doctor]';\n $( addressForms ).filter( '[data-plenty-address-doctor]:visible' ).each( function( i, form )\n {\n var addressDoctor = new AddressDoctor( form );\n var requiredFields = $( form ).attr( 'data-plenty-address-doctor' ).replace( /\\s/g, '' ).split( ',' );\n if ( !addressDoctor.isValid( requiredFields ) )\n {\n addressIsValid = false;\n }\n\n } );\n\n return addressIsValid;\n }\n\n function AddressDoctor( form )\n {\n var $form = $( form );\n var $inputs = {\n Street : $form.find( 'input[name=\"Street\"]' ),\n ZIP : $form.find( 'input[name=\"ZIP\"]' ),\n City : $form.find( 'input[name=\"City\"]' ),\n HouseNo: $form.find( 'input[name=\"HouseNo\"]' )\n };\n var $suggestionContainer = {};\n\n var suggestions;\n var requiredFields;\n\n return {\n isValid: isValid\n };\n\n function isValid( fields )\n {\n\n if ( isPackstation() )\n {\n return true;\n }\n\n suggestions = new AddressList( $form.getFormValues() );\n requiredFields = fields;\n\n refreshView();\n\n return suggestions.getAddresses().length == 1;\n }\n\n function refreshView()\n {\n $( '.suggestion-list' ).remove();\n\n var suggestionListVisible = false;\n for ( var i = 0; i < requiredFields.length; i++ )\n {\n if ( !validateInput( requiredFields[i], suggestionListVisible ) )\n {\n $form.trigger( 'validationFailed' );\n suggestionListVisible = true;\n }\n }\n\n if ( suggestions.houseNoAllowed( $inputs.HouseNo.val() ) || suggestions.getAddresses().length == 1 )\n {\n $inputs.HouseNo.removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs.HouseNo.addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n }\n else\n {\n $inputs.HouseNo.removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs.HouseNo.addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs.HouseNo.attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n }\n }\n\n function validateInput( key, suggestionListVisible )\n {\n var valueList = suggestions.getList( key );\n\n if ( !!$suggestionContainer[key] )\n {\n $suggestionContainer[key].remove();\n }\n\n if ( !$inputs[key] )\n {\n return true;\n }\n\n if ( valueList.length == 1 )\n {\n $inputs[key].val( valueList[0] );\n\n $inputs[key].removeClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-error' );\n\n $inputs[key].addClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-success' );\n return true;\n }\n else\n {\n $inputs[key].removeClass( 'has-success' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).removeClass( 'has-success' );\n\n $inputs[key].addClass( 'has-error' );\n $form.find( 'label[for=\"' + $inputs[key].attr( 'id' ) + '\"]' ).addClass( 'has-error' );\n\n if ( !suggestionListVisible )\n {\n buildSuggestionList( $inputs[key], valueList );\n }\n $inputs[key].off( 'focus' );\n $inputs[key].focus();\n return false;\n\n }\n }\n\n function positionSuggestionList( $parent, suggestionKey )\n {\n $suggestionContainer[suggestionKey].css( {\n 'width': $parent.outerWidth( true ),\n 'left' : $parent.position().left,\n 'top' : $parent.position().top + $parent.outerHeight( true )\n } );\n }\n\n function buildSuggestionList( $parent, values )\n {\n var suggestionKey = $parent.attr( 'name' );\n\n // render html content\n $suggestionContainer[suggestionKey] = $( pm.compileTemplate( 'addressSuggestions/addressDoctor.html', {values: values} ) );\n\n positionSuggestionList( $parent, suggestionKey );\n\n $( window ).on( 'sizeChange', function()\n {\n positionSuggestionList( $parent, suggestionKey );\n } );\n\n // bind click event to list elements\n $suggestionContainer[suggestionKey].find( '[data-address-value]' ).each( function( i, elem )\n {\n\n var $elem = $( elem );\n var value = $elem.attr( 'data-address-value' );\n\n $elem.click( function()\n {\n // insert clicked value in input\n $parent.val( value );\n\n // filter addresses and show remaining suggestions\n var filterAddress = {};\n filterAddress[$parent.attr( 'name' )] = value;\n suggestions.filter( filterAddress );\n\n // refresh suggestion lists\n refreshView();\n\n } );\n\n } );\n\n // inject html\n $parent.parent().append( $suggestionContainer[suggestionKey] );\n }\n\n function isPackstation()\n {\n return ( $inputs.Street.val().toUpperCase() == \"PACKSTATION\" || $inputs.Street.val().toUpperCase() == \"POSTFILIALE\" );\n }\n\n }\n\n function AddressList( addressInput )\n {\n var addresses = [];\n\n init();\n\n return {\n getAddresses : getAddresses,\n getList : getList,\n filter : filter,\n houseNoAllowed: houseNoAllowed\n };\n\n function init()\n {\n API.get( '/rest/checkout/addresssuggestionresultslist/', {\n suggestionType: \"addressdoctor\",\n street : addressInput.Street,\n ZIP : addressInput.ZIP,\n city : addressInput.City,\n houseNo : addressInput.HouseNo,\n country : addressInput.CountryID\n }, false, false, true ).done( function( response )\n {\n\n var responseLength = response.data.length;\n\n for ( var i = 0; i < responseLength; i++ )\n {\n var currentResponse = response.data[i];\n\n var address = getAddress( currentResponse )\n if ( !address )\n {\n currentResponse.HouseNo = [currentResponse.HouseNo];\n addresses.push( currentResponse );\n }\n else\n {\n address.HouseNo.push( currentResponse.HouseNo );\n }\n\n }\n\n } );\n }\n\n function getAddress( suggestion )\n {\n var addressCount = addresses.length;\n\n for ( var j = 0; j < addressCount; j++ )\n {\n if ( suggestion.Street == addresses[j].Street && addresses.ZIP == addresses[j].ZIP && suggestion.City == addresses[j].City )\n {\n return addresses[j];\n }\n }\n\n return null;\n\n }\n\n function getAddresses()\n {\n return addresses;\n }\n\n function getList( key )\n {\n var results = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( $.inArray( address[key], results ) < 0 )\n {\n results.push( address[key] );\n }\n }\n\n return results;\n }\n\n function filter( filterAddress )\n {\n var filteredAddresses = [];\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n if ( (!!filterAddress.Street && filterAddress.Street == address.Street)\n || (!!filterAddress.ZIP && filterAddress.ZIP == address.ZIP)\n || (!!filterAddress.City && filterAddress.City == address.City) )\n {\n filteredAddresses.push( address );\n }\n }\n\n addresses = filteredAddresses;\n }\n\n function houseNoAllowed( houseNo )\n {\n houseNo = parseInt( houseNo );\n\n var addressCount = addresses.length;\n\n for ( var i = 0; i < addressCount; i++ )\n {\n var address = addresses[i];\n\n for ( var j = 0; j < address.HouseNo.length; j++ )\n {\n var range = address.HouseNo[j].split( '-' );\n if ( ( range.length == 1 && houseNo == range[0] )\n || range.length == 2 && houseNo >= range[0] && houseNo <= range[1] )\n {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for logging in and out and registering new customers.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    \n * @class AuthenticationService\n * @static\n */\n pm.service( 'AuthenticationService', function( API, Checkout, UI )\n {\n\n return {\n resetPassword : resetPassword,\n customerLogin : customerLogin,\n setInvoiceAddress: setInvoiceAddress,\n registerCustomer : registerCustomer\n };\n\n /**\n * Reading E-Mail from form marked with data-plenty-checkout=\"lostPasswordForm\"\n * and sends request to provide a new password to the entered E-Mail-Address.\n *\n * @function resetPasswort\n * @return {object} jQuery deferred\n * Object\n */\n function resetPassword()\n {\n\n var form = $( '[data-plenty-checkout=\"lostPasswordForm\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n var params = {\n Email: values.Email\n };\n\n return API.post( \"/rest/checkout/lostpassword/\", params )\n .done( function( response )\n {\n if ( response.data.IsMailSend == true )\n {\n $( '[data-plenty-checkout=\"lostPasswordTextContainer\"]' ).hide();\n $( '[data-plenty-checkout=\"lostPasswordSuccessMessage\"]' ).show();\n }\n } );\n\n }\n }\n\n /**\n * Try to login in with credentials read from given <form> - element.\n * On success redirect to forms 'action' attribute.\n *\n * @function customerLogin\n * @param {object} form The jQuery-wrapped form-element to read the credentials from\n * @return {object} jQuery deferred\n * Object\n */\n function customerLogin( form )\n {\n if ( form.validateForm() )\n {\n var values = form.getFormValues();\n\n var params = {\n Email : values.loginMail,\n Password: values.loginPassword\n };\n\n UI.showWaitScreen();\n return API.post( \"/rest/checkout/login/\", params )\n .done( function()\n {\n // successful login -> go to form's target referenced by action-attribute\n window.location.assign( form.attr( 'action' ) );\n\n } );\n }\n }\n\n /**\n * Setting the invoice address of a newly registered customer or a guest.\n *\n * @function setInvoiceAddress\n * @param {object} invoiceAddress containing address-data sent to server\n * @return {object} jQuery deferred\n * Object\n */\n function setInvoiceAddress( invoiceAddress )\n {\n\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n Checkout.getCheckout().CustomerInvoiceAddress = response.data;\n } );\n }\n\n /**\n * Prepare address-data to register new customer. Read the address-data from a <form> marked with\n * data-plenty-checkout-form=\"customerRegistration\"
    \n * On success, redirect to forms target referenced by action-attribute\n *\n * @function registerCustomer\n * @return {object} jQuery deferred\n * Object\n */\n function registerCustomer()\n {\n var form = $( '[data-plenty-checkout-form=\"customerRegistration\"]' );\n\n if ( form.validateForm() && pm.getInstance().AddressDoctorService.validateAddress() )\n {\n var values = form.getFormValues();\n values.LoginType = 2;\n\n if ( values.checkout\n && values.checkout.customerInvoiceAddress\n && values.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = values.checkout.customerInvoiceAddress.CustomerProperty;\n values.CustomerPropertiesList = values.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n values.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n return setInvoiceAddress( values )\n .done( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } );\n }\n }\n }, ['APIFactory', 'CheckoutFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for adding, editing or removing basket items and coupon codes
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"UIFactory\"}}UIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class BasketService\n * @static\n */\n pm.service( 'BasketService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n addItem : addBasketItem,\n removeItem : removeBasketItem,\n getItem : getBasketItem,\n setItemQuantity : setItemQuantity,\n editItemAttributes: editItemAttributes,\n editOrderParams : editOrderParams,\n addCoupon : addCoupon,\n removeCoupon : removeCoupon\n };\n\n /**\n * Add item to basket. Will fail and show a popup if item has order params\n * @function addBasketItem\n * @param {Array} article Array containing the item to add\n * @param {boolean} [isUpdate=false] Indicating if item's OrderParams are updated\n * @return {object} jQuery deferred\n * Object\n */\n function addBasketItem( article )\n {\n\n if ( !!article )\n {\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/',\n {\n itemID : article[0].BasketItemItemID,\n quantity: article[0].BasketItemQuantity\n }, false, true ).done( function( resp )\n {\n // checking for order params!\n if ( resp.data[0].indexOf( \"form-group\" ) > 0 )\n {\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Select order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n addArticle( saveOrderParams( article ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n }\n else\n {\n addArticle( article );\n }\n } );\n }\n }\n\n /**\n * Read OrderParams from <form> marked with data-plenty-checkout-form=\"OrderParamsForm\" and inject\n * read values in 'addBasketList'. Update item by calling addBasketItem() again\n * @function saveOrderParams\n * @private\n * @param {Array} articleWithParams Containing the current item to add. Read OrderParams will be injected\n */\n function saveOrderParams( articleWithParams )\n {\n //TODO use $(\"[data-plenty-checkout-form='OrderParamsForm']\").serializeArray() to get order params\n var orderParamsForm = $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' );\n var $self = {};\n var attrType = \"\";\n var match;\n\n //Groups\n orderParamsForm.find( '[name^=\"ParamGroup\"]' ).each( function()\n {\n match = this.name.match( /^ParamGroup\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], $( this ).val(), $( this ).val() );\n } );\n\n //Values\n orderParamsForm.find( '[name^=\"ParamValue\"]' ).each( function()\n {\n $self = $( this );\n attrType = $self.attr( 'type' );\n\n if ( ((attrType == 'checkbox' && $self.is( ':checked' )) ||\n (attrType == 'radio' && $self.is( ':checked' )) ||\n (attrType != 'radio' && attrType != 'checkbox')) && attrType != 'file' && attrType != 'hidden' )\n {\n\n var match = $self[0].name.match( /^ParamValue\\[(\\d+)]\\[(\\d+)]$/ );\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], $self.val() );\n\n }\n else if ( attrType == 'file' )\n {\n if ( $self[0].files && $self[0].files.length > 0 )\n {\n articleWithParams = orderParamFileUpload( $self, articleWithParams );\n }\n else\n {\n var match = $self[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n var paramValue = $( 'input[type=\"hidden\"][name=\"ParamValue[' + match[1] + '][' + match[2] + ']\"]' ).val();\n articleWithParams = addOrderParamValue( articleWithParams, match[1], match[2], paramValue );\n }\n }\n } );\n\n return articleWithParams;\n }\n\n function addArticle( article )\n {\n API.post( '/rest/checkout/basketitemslist/', article, true )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.loadCheckout()\n .done( function()\n {\n var artAttr = $( \"[name^=ArticleAttribute]\" );\n var requestData = {ArticleID: article[0].BasketItemItemID};\n\n if ( artAttr )\n {\n $( \"[name^=ArticleAttribute]\" ).each( function( i, v )\n {\n requestData[$( v ).attr( \"name\" )] = $( v ).val();\n } );\n }\n\n refreshBasketPreview();\n\n // Show confirmation popup\n CMS.getContainer( 'ItemViewItemToBasketConfirmationOverlay', requestData ).from( 'ItemView' )\n .done( function( response )\n {\n var timeout = pm.getGlobal( 'TimeoutItemToBasketOverlay', 5000 );\n var modal = Modal.prepare().setContent( response.data[0] );\n\n if ( timeout > 0 )\n {\n modal.setTimeout( timeout );\n }\n\n modal.show();\n } );\n } );\n } ).fail( function( jqXHR )\n {\n // some other error occured\n UI.printErrors( JSON.parse( jqXHR.responseText ).error.error_stack );\n } );\n }\n\n function updateArticle( article )\n {\n API.put( '/rest/checkout/basketitemslist/', article )\n .done( function()\n {\n // Item has no OrderParams -> Refresh Checkout & BasketPreview\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n Checkout.loadCheckout()\n .done( function()\n {\n refreshBasketPreview();\n } );\n } )\n }\n\n function orderParamFileUpload( $input, articleWithParams )\n {\n var key = $input[0].id;\n var orderParamUploadFiles = {};\n var orderParamFileIdStack = [];\n var formData;\n var fileData;\n var params = {\n type : 'POST',\n data : {},\n isFile : true,\n cache : false,\n dataType : 'json',\n processData: false,\n contentType: false\n };\n\n orderParamUploadFiles[key] = $input[0].files;\n\n // if input not pushed before.\n if ( orderParamFileIdStack.indexOf( key ) == -1 )\n {\n orderParamFileIdStack.push( key );\n }\n\n for ( var i = 0, length = orderParamFileIdStack.length; i < length; ++i )\n {\n formData = new FormData();\n fileData = orderParamUploadFiles[orderParamFileIdStack[i]];\n formData.append( \"0\", fileData[0], fileData[0].name );\n\n params.data = formData;\n\n API.post( \"/rest/checkout/orderparamfile/\", params );\n }\n\n var match = $input[0].name.match( /^ParamValueFile\\[(\\d+)]\\[(\\d+)]$/ );\n\n return addOrderParamValue( articleWithParams, match[1], match[2], orderParamUploadFiles[key][0]['name'] );\n }\n\n /**\n * Inject an OrderParam.\n * @function addOrderParamValue\n * @private\n * @param {Array} basketList The target to inject the value in.\n * @param {number} position Position where to inject the value\n * @param {number} paramId The ID of the OrderParam to inject\n * @param {string|number} paramValue the value of the OrderParam to inject\n * @returns {Array} Containing the item and the injected OrderParam\n */\n function addOrderParamValue( basketList, position, paramId, paramValue )\n {\n if ( position > 0 && basketList[position] == undefined )\n {\n basketList[position] = $.extend( true, {}, basketList[0] );\n basketList[position].BasketItemOrderParamsList = [];\n }\n\n if ( basketList[position] != undefined )\n {\n basketList[position].BasketItemQuantity = 1;\n if ( basketList[position].BasketItemOrderParamsList == undefined )\n {\n basketList[position].BasketItemOrderParamsList = [];\n }\n if ( paramValue )\n {\n basketList[position].BasketItemOrderParamsList.push( {\n BasketItemOrderParamID : paramId,\n BasketItemOrderParamValue: paramValue\n } );\n }\n }\n\n return basketList;\n }\n\n function editItemAttributes( BasketItemID )\n {\n var modal = $( '[data-plenty-basket-item=\"' + BasketItemID + '\"]' );\n modal.modal( 'show' );\n modal.find( '[data-plenty-modal=\"confirm\"]' ).on( 'click', function()\n {\n var basketItem = getBasketItem( BasketItemID );\n var attributesList = [];\n\n // check for select or list of images\n modal.find( 'select, .PlentyFormContainer.AttrImage > input[type=\"hidden\"]' ).each( function( i, attributeSelect )\n {\n var match = attributeSelect.name.match( /^ArticleAttribute\\[\\d+]\\[\\d+]\\[(\\d+)]$/ );\n if ( match && match[1] )\n {\n attributesList.push( {\n BasketItemAttributeID : match[1],\n BasketItemAttributeValueID: $( attributeSelect ).val()\n } );\n }\n\n } );\n\n if ( attributesList.length != 0 )\n {\n basketItem.BasketItemAttributesList = attributesList;\n }\n //update basketItem and refresh previewLists\n updateArticle( [basketItem] );\n\n } );\n }\n\n function editOrderParams( BasketItemID )\n {\n\n var basketItem = getBasketItem( BasketItemID );\n // FIX: unset old order params\n\n basketItem.BasketItemOrderParamsList = [];\n\n API.get( '/rest/checkout/container_' + 'CheckoutOrderParamsList'.toLowerCase() + '/', {\n itemID : basketItem.BasketItemItemID,\n quantity : basketItem.BasketItemQuantity,\n basketItemID: BasketItemID\n } ).done( function( resp )\n {\n // checking for order params!\n Modal.prepare()\n .setContent( resp.data[0] )\n .setTitle( pm.translate( \"Edit order parameters\" ) )\n .setLabelConfirm( pm.translate( \"Save\" ) )\n .onConfirm( function()\n {\n // validate form\n if ( $( '[data-plenty-checkout-form=\"OrderParamsForm\"]' ).validateForm() )\n {\n // save order params\n updateArticle( saveOrderParams( [basketItem] ) );\n\n // close modal after saving order params\n return true;\n }\n else\n {\n return false;\n }\n } )\n .show();\n } );\n }\n\n function getBasketItem( BasketItemID )\n {\n var basketItems = Checkout.getCheckout().BasketItemsList;\n for ( var i = 0; i < basketItems.length; i++ )\n {\n if ( basketItems[i].BasketItemID == BasketItemID )\n {\n return basketItems[i];\n }\n }\n\n return null;\n }\n\n /**\n * Remove item from basket. Will show a confirmation popup at first.\n * @function removeBasketItem\n * @param {number} BasketItemID The ID of the basket item to remove\n * @param {boolean} [forceDelete=false] Set true to remove the basket item without showing a confirmation popup\n * @return Promise\n */\n function removeBasketItem( BasketItemID, forceDelete )\n {\n\n var deferred = $.Deferred();\n\n // get item name\n var itemName = getBasketItem( BasketItemID ).BasketItemNameMap[1];\n\n // calling the delete request\n function doDelete()\n {\n API.delete( '/rest/checkout/basketitemslist/?basketItemIdsList[0]=' + BasketItemID )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n //$( '[data-basket-item-id=\"' + BasketItemID + '\"]' ).remove();\n\n if ( !Checkout.getCheckout().BasketItemsList || Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n }\n else\n {\n // FALLBACK if design not support selector\n // [data-plenty-checkout-template=\"BasketItemsList\"]\n if ( $( '[data-plenty-checkout-template=\"BasketItemsList\"]' ).length >= 0 )\n {\n API.get( \"/rest/checkout/container_checkoutbasketitemslist/\" ).done( function( response )\n {\n var $oldBasketList = $( '[data-basket-item-id]' ).parents( \"ul\" );\n var $basketListContainer = $oldBasketList.parents( \".panel-body\" );\n $oldBasketList.fadeOut( function()\n {\n $( this ).siblings( \":not('[data-plenty-checkout-template]')\" ).remove();\n $( this ).remove();\n $basketListContainer.prepend( $( response.data[0] ) ).hide().fadeIn( function()\n {\n pm.getInstance().bindDirectives( $basketListContainer );\n } );\n } );\n } );\n }\n else\n {\n Checkout.reloadContainer( 'BasketItemsList' );\n }\n Checkout.reloadContainer( 'Totals' );\n }\n\n refreshBasketPreview();\n\n deferred.resolve();\n } );\n } );\n }\n\n if ( !forceDelete )\n {\n // show confirmation popup\n Modal.prepare()\n .setTitle( pm.translate( 'Please confirm' ) )\n .setContent( '

    ' + pm.translate( \"Do you really want to remove \\\"{{item}}\\\" from your basket?\", {item: itemName} ) + '

    ' )\n .onDismiss( function()\n {\n //$('[data-basket-item-id=\"' + BasketItemID +\n // '\"]').find('[data-plenty=\"quantityInput\"]').val(originalItemQuantity);\n deferred.reject();\n } )\n .onConfirm( function()\n {\n doDelete();\n } )\n .setLabelConfirm( pm.translate( \"Delete\" ) )\n .show();\n }\n else\n {\n doDelete();\n }\n\n return deferred;\n }\n\n /**\n * Set a new quantity for the given BasketItem. If quantity is set to 0,\n * remove the item.\n * @function setItemQuantity\n * @param {number} BasketItemID The ID of the basket item to change the quantity of\n * @param {number} BasketItemQuantity The new quantity to set or 0 to remove the item\n */\n function setItemQuantity( BasketItemID, BasketItemQuantity )\n {\n // delete item if quantity is 0\n if ( BasketItemQuantity <= 0 )\n {\n return removeBasketItem( BasketItemID );\n }\n\n var deferred = $.Deferred();\n var params = Checkout.getCheckout().BasketItemsList;\n var basketItem;\n var basketItemIndex;\n\n for ( var i = 0; i < params.length; i++ )\n {\n if ( params[i].BasketItemID == BasketItemID )\n {\n basketItemIndex = i;\n basketItem = params[i];\n break;\n\n }\n }\n\n if ( !!basketItem && basketItem.BasketItemQuantity != BasketItemQuantity )\n {\n params[basketItemIndex].BasketItemQuantity = parseInt( BasketItemQuantity );\n\n API.post( \"/rest/checkout/basketitemslist/\", params )\n .done( function()\n {\n Checkout.setCheckout().done( function()\n {\n Checkout.reloadCatContent( pm.getGlobal( 'basketCatID' ) );\n refreshBasketPreview();\n deferred.resolve();\n } );\n } );\n }\n\n return deferred;\n }\n\n /**\n * Reload BasketPreview-Template and update basket totals\n * @function refreshBasketPreview\n * @private\n */\n function refreshBasketPreview()\n {\n\n Checkout.reloadItemContainer( 'BasketPreviewList' )\n .done( function()\n {\n\n $( '[data-plenty-basket-empty]' ).each( function( i, elem )\n {\n var toggleClass = $( elem ).attr( 'data-plenty-basket-empty' );\n if ( Checkout.getCheckout().BasketItemsList.length <= 0 )\n {\n $( elem ).addClass( toggleClass );\n }\n else\n {\n $( elem ).removeClass( toggleClass );\n }\n } );\n\n } );\n\n //update quantity\n var itemQuantityTotal = 0;\n $.each( Checkout.getCheckout().BasketItemsList, function( i, basketItem )\n {\n itemQuantityTotal += basketItem.BasketItemQuantity;\n } );\n\n $( '[data-plenty-basket-preview=\"itemQuantityTotal\"]' ).text( itemQuantityTotal );\n $( '[data-plenty-basket-preview=\"totalsItemSum\"]' ).text( Checkout.getCheckout().Totals.TotalsItemSum );\n }\n\n /**\n * Read the coupon code from an <input> element marked with data-plenty-checkout-form=\"couponCode\"\n * and try to add this coupon.\n * @function addCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function addCoupon()\n {\n var params = {\n CouponActiveCouponCode: $( '[data-plenty-checkout-form=\"couponCode\"]' ).val()\n };\n\n return API.post( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n\n updateContainer();\n } );\n } );\n }\n\n /**\n * Remove the currently added coupon\n * @function removeCoupon\n * @return {object} jQuery deferred\n * Object\n */\n function removeCoupon()\n {\n var params = {\n CouponActiveCouponCode: Checkout.getCheckout().Coupon.CouponActiveCouponCode\n };\n\n return API.delete( \"/rest/checkout/coupon/\", params )\n .done( function()\n {\n Checkout.setCheckout()\n .done( function()\n {\n delete Checkout.getCheckout().Coupon;\n\n updateContainer();\n } );\n } );\n }\n\n // update container\n function updateContainer()\n {\n Checkout.reloadContainer( 'Coupon' );\n // reload totals, if we are at basket\n if ( $( '[data-plenty-checkout-template=\"Totals\"]' ).length > 0 )\n {\n Checkout.reloadContainer( 'Totals' );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Providing methods for checkout process like setting shipping & payment information and placing the order.
    \n * Requires:\n *
      \n *
    • {{#crossLink \"APIFactory\"}}APIFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CMSFactory\"}}CMSFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"CheckoutFactory\"}}CheckoutFactory{{/crossLink}}
    • \n *
    • {{#crossLink \"ModalFactory\"}}ModalFactory{{/crossLink}}
    • \n *
    \n * @class CheckoutService\n * @static\n */\n pm.service( 'CheckoutService', function( API, UI, CMS, Checkout, Modal )\n {\n\n return {\n init : init,\n setCustomerSignAndInfo: setCustomerSignAndInfo,\n registerGuest : registerGuest,\n setShippingProfile : setShippingProfile,\n saveShippingAddress : saveShippingAddress,\n loadAddressSuggestion : loadAddressSuggestion,\n preparePayment : preparePayment,\n setMethodOfPayment : setMethodOfPayment,\n confirmAtrigaPaymax : confirmAtrigaPaymax,\n editBankDetails : editBankDetails,\n editCreditCard : editCreditCard,\n placeOrder : placeOrder\n };\n\n /**\n * Load checkout data initially on page load\n * @function init\n */\n function init()\n {\n Checkout.loadCheckout( true );\n }\n\n /**\n * Read customer sign and order information text from <form> marked with\n * data-plenty-checkout-form=\"details\" and update checkout.\n * @function setCustomerSignAndInfo\n * @return {object} jQuery deferred\n * Object\n */\n function setCustomerSignAndInfo()\n {\n var form = $( '[data-plenty-checkout-form=\"details\"]' );\n var values = form.getFormValues();\n\n // initialize CustomerSign & InfoText to avoid updating empty values\n if ( !Checkout.getCheckout().CheckoutCustomerSign )\n {\n Checkout.getCheckout().CheckoutCustomerSign = \"\";\n }\n if ( !Checkout.getCheckout().CheckoutOrderInfoText )\n {\n Checkout.getCheckout().CheckoutOrderInfoText = \"\";\n }\n\n if ( ( Checkout.getCheckout().CheckoutCustomerSign !== values.CustomerSign && $( form ).find( '[name=\"CustomerSign\"]' ).length > 0 )\n || ( Checkout.getCheckout().CheckoutOrderInfoText !== values.OrderInfoText && $( form ).find( '[name=\"OrderInfoText\"]' ).length > 0 ) )\n {\n\n Checkout.getCheckout().CheckoutCustomerSign = values.CustomerSign;\n Checkout.getCheckout().CheckoutOrderInfoText = values.OrderInfoText;\n\n return Checkout.setCheckout();\n\n }\n else\n {\n // No changes detected -> Do nothing\n return API.idle();\n }\n }\n\n /**\n * Read address data from <form> marked with data-plenty-checkout-form=\"shippingAddress\".\n * Create new shipping address or update the shipping address ID.\n * @function saveShippingAddress\n * @param {boolean} [validateForm = false] validate form before processing requests\n * @return {object} jQuery deferred\n * Object\n */\n function saveShippingAddress( validateForm )\n {\n var form = $( '[data-plenty-checkout-form=\"shippingAddress\"]' );\n\n if ( !validateForm && !form.validateForm() )\n {\n return false;\n }\n\n if ( !validateForm && !pm.getInstance().AddressDoctorService.validateAddress( form ) )\n {\n return false;\n }\n\n var values = form.getFormValues();\n var shippingAddressID = $( '[name=\"shippingAddressID\"]:checked' ).val();\n\n if ( shippingAddressID < 0 )\n {\n // save separate\n var shippingAddress = values;\n\n if ( !addressesAreEqual( shippingAddress, Checkout.getCheckout().CustomerShippingAddress ) )\n {\n if ( shippingAddress.Street == \"PACKSTATION\" )\n {\n shippingAddress.IsPackstation = 1;\n shippingAddress.PackstationNo = shippingAddress.HouseNo;\n }\n else if ( shippingAddress.Street == \"POSTFILIALE\" )\n {\n shippingAddress.IsPostfiliale = 1;\n shippingAddress.PostfilialNo = shippingAddress.HouseNo;\n }\n\n // new shipping address\n return API.post( \"/rest/checkout/customershippingaddress/\", shippingAddress )\n .done( function( response )\n {\n\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = response.data.ID;\n Checkout.getCheckout().CheckoutShippingCountryID = response.data.CountryID;\n\n updatePaymentAndShippingDependencies();\n } );\n }\n else\n {\n // no changes detected\n return API.idle();\n }\n\n }\n else\n {\n if ( shippingAddressID != Checkout.getCheckout().CheckoutCustomerShippingAddressID )\n {\n // change shipping address id\n Checkout.getCheckout().CheckoutCustomerShippingAddressID = shippingAddressID;\n\n updatePaymentAndShippingDependencies();\n }\n else\n {\n return API.idle();\n }\n }\n }\n\n function updatePaymentAndShippingDependencies()\n {\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout().done( function()\n {\n Checkout.reloadContainer( \"MethodsOfPaymentList\" );\n Checkout.reloadContainer( \"ShippingProfilesList\" );\n\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n Checkout.reloadContainer( 'CustomerShippingAddress' );\n }\n $( '#shippingAdressSelect' ).modal( 'hide' );\n\n // don't hit me. Ugly hack: this is to force quit/remove everything from modal.\n if ( $( \".modal-backdrop\" ) )\n {\n $( \".modal-backdrop\" ).remove();\n }\n } );\n }\n\n /**\n * Prepare address-data to register a guest. Reads the address-data from a <form> marked with\n * data-plenty-checkout-form=\"guestRegistration\"\n * @function registerGuest\n * @return {object} jQuery deferred\n * Object\n */\n function registerGuest()\n {\n var form = $( '[data-plenty-checkout-form=\"guestRegistration\"]' );\n\n var invoiceAddress = form.getFormValues();\n invoiceAddress.LoginType = 1;\n\n // add custom properties if necessary.\n if ( invoiceAddress.checkout\n && invoiceAddress.checkout.customerInvoiceAddress\n && invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty )\n {\n var tmpProperties = invoiceAddress.checkout.customerInvoiceAddress.CustomerProperty;\n invoiceAddress.CustomerPropertiesList = invoiceAddress.CustomerPropertiesList || [];\n\n for ( var property in tmpProperties )\n {\n if ( tmpProperties[property] )\n {\n invoiceAddress.CustomerPropertiesList.push( {\n PropertyID : property,\n PropertyValue: tmpProperties[property]\n } );\n }\n }\n }\n\n if ( !addressesAreEqual( invoiceAddress, Checkout.getCheckout().CustomerInvoiceAddress ) )\n {\n return API.post( \"/rest/checkout/customerinvoiceaddress/\", invoiceAddress )\n .done( function( response )\n {\n saveShippingAddress().done( Checkout.loadCheckout );\n } );\n }\n else\n {\n return saveShippingAddress();\n }\n }\n\n /**\n * Check if values of addresses are equal\n * @function addressesAreEqual\n * @private\n * @param {object} address1\n * @param {object} address2\n * @returns {boolean}\n */\n function addressesAreEqual( address1, address2 )\n {\n for ( var key in address1 )\n {\n if ( address1[key] + '' !== address2[key] + '' && key !== 'EmailRepeat' )\n {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Set the shipping profile used for this order and update checkout. Selected shipping profile will be\n * read from <form> marked with data-plenty-checkout-form=\"shippingProfileSelect\"\n * @function setShippingProfile\n * @return {object} jQuery deferred\n * Object\n */\n function setShippingProfile()\n {\n\n var values = $( '[data-plenty-checkout-form=\"shippingProfileSelect\"]' ).getFormValues();\n\n Checkout.getCheckout().CheckoutShippingProfileID = values.ShippingProfileID;\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutMethodOfPaymentID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n\n }\n\n /**\n * Prepare method of payment to check if external checkout is used or addition content should be displayed\n * @function preparePayment\n * @return {object} jQuery deferred\n * Object\n */\n function preparePayment()\n {\n var paymentID = Checkout.getCheckout().CheckoutMethodOfPaymentID;\n var paymentData = $( 'input[type=\"radio\"][name=\"MethodOfPaymentID\"][value=\"' + paymentID + '\"]' ).parent().getFormValues();\n return API.post( \"/rest/checkout/preparepayment/\", paymentData, true )\n .done( function( response )\n {\n if ( response.data.CheckoutMethodOfPaymentRedirectURL != '' )\n {\n\n document.location.assign( response.data.CheckoutMethodOfPaymentRedirectURL );\n\n }\n else if ( !!response.data.CheckoutMethodOfPaymentAdditionalContent )\n {\n\n var isBankDetails = $( response.data.CheckoutMethodOfPaymentAdditionalContent ).find( '[data-plenty-checkout-form=\"bankDetails\"]' ).length > 0;\n Modal.prepare()\n .setContent( response.data.CheckoutMethodOfPaymentAdditionalContent )\n .onConfirm( function()\n {\n if ( isBankDetails )\n {\n return saveBankDetails();\n }\n else\n {\n return saveCreditCard();\n }\n } )\n .show();\n }\n } )\n .fail( function( jqXHR )\n {\n try\n {\n var response = $.parseJSON( jqXHR.responseText );\n\n var errorStack = [];\n for ( var i = 0; i < response.error.error_stack.length; i++ )\n {\n if ( response.error.error_stack[i].code == 651 )\n {\n // notify atriga validation errors\n Checkout.reloadContainer( 'MethodsOfPaymentList' ).done( function()\n {\n $( document ).trigger( 'plenty.AtrigaValidationFailed' );\n } );\n }\n else\n {\n errorStack.push( response.error.error_stack[i] );\n }\n }\n\n // display remaining errors\n if ( errorStack.length > 0 )\n {\n UI.printErrors( errorStack );\n }\n }\n catch ( e )\n {\n UI.throwError( jqXHR.status, jqXHR.statusText );\n }\n } );\n\n }\n\n /**\n * Set the method of payment used for this order.\n * @function setMethodOfPayment\n * @param {number|undefined} paymentID ID of the method of payment to use. Read from <form> marked with\n * data-plenty-checkout-form=\"methodOfPayment\" if unset.\n * @return {object} jQuery deferred\n * Object\n */\n function setMethodOfPayment( paymentID )\n {\n /*\n var methodsOfPaymentList = Checkout.getCheckout().MethodsOfPaymentList;\n var methodOfPayment;\n for( var i = 0; i < methodsOfPaymentList.length; i++ )\n {\n if( methodsOfPaymentList[i].MethodOfPaymentID == paymentID )\n {\n methodOfPayment = methodsOfPaymentList[i];\n break;\n }\n }\n */\n\n if ( !paymentID )\n {\n // FIX for older callisto layouts (< 3.3): get payment id from input field\n paymentID = $( 'input[name=\"MethodOfPaymentID\"]:checked' ).val();\n }\n\n Checkout.getCheckout().CheckoutMethodOfPaymentID = paymentID;\n\n if ( !pm.getGlobal( 'Checkout.AtrigaRequireUserConfirmation' ) )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = true;\n }\n\n delete Checkout.getCheckout().CheckoutCustomerShippingAddressID;\n delete Checkout.getCheckout().CheckoutShippingProfileID;\n\n return Checkout.setCheckout()\n .done( function()\n {\n Checkout.reloadContainer( 'ShippingProfilesList' );\n } );\n }\n\n function confirmAtrigaPaymax( atrigaPaymaxChecked )\n {\n Checkout.getCheckout().CheckoutAtrigapaymaxChecked = !!atrigaPaymaxChecked;\n return API.put( '/rest/checkout', {\n CheckoutAtrigapaymaxChecked: !!atrigaPaymaxChecked\n } );\n //return Checkout.setCheckout();\n }\n\n /**\n * Display the popup to enter or edit customers bank details\n * @function editBankDetails\n */\n function editBankDetails()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationBankDetails' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveBankDetails();\n } )\n .show();\n } );\n\n }\n\n /**\n * Read entered bank details from data-plenty-checkout-form=\"bankDetails\" and update checkout.\n * @function saveBankDetails\n * @private\n * @return {boolean} the result of form validation\n */\n function saveBankDetails()\n {\n var form = $( '[data-plenty-checkout-form=\"bankDetails\"]' );\n\n if ( form.validateForm() )\n {\n var values = form.getFormValues().checkout.customerBankDetails;\n\n var bankDetails = {\n CustomerBankName : values.bankName,\n CustomerBLZ : values.blz,\n CustomerAccountNumber: values.accountNo,\n CustomerAccountOwner : values.accountOwner,\n CustomerIBAN : values.iban,\n CustomerBIC : values.bic\n };\n\n API.post( \"/rest/checkout/paymentinformationbankdetails/\", bankDetails )\n .done( function()\n {\n Checkout.loadCheckout().done( function()\n {\n setMethodOfPayment( 3 );\n Checkout.reloadContainer( 'MethodsOfPaymentList' );\n } );\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing credit card form\n * @function editCreditCard\n */\n function editCreditCard()\n {\n\n CMS.getContainer( 'CheckoutPaymentInformationCreditCard' ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .onDismiss( function()\n {\n $( 'input[name=\"MethodOfPaymentID\"]' ).each( function( i, radio )\n {\n if ( $( radio ).val() == Checkout.getCheckout().CheckoutMethodOfPaymentID )\n {\n $( radio ).attr( 'checked', 'checked' );\n }\n else\n {\n $( radio ).removeAttr( 'checked' );\n }\n } );\n } ).onConfirm( function()\n {\n return saveCreditCard();\n } )\n .show();\n } );\n }\n\n /**\n * Read values from <form> marked with data-plenty-checkout-form=\"creditCard\" and update checkout.\n * @function saveCreditCard\n * @private\n * @return {boolean} the result of form validation\n */\n function saveCreditCard()\n {\n var form = $( '[data-plenty-checkout-form=\"creditCard\"]' );\n\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues().checkout.paymentInformationCC;\n\n var creditCard = {\n Owner : values.owner,\n Cvv2 : values.cvv2,\n Number : values.number,\n Year : values.year,\n Month : values.month,\n Provider: values.provider\n };\n\n API.post( '/rest/checkout/paymentinformationcreditcard/', creditCard )\n .done( function()\n {\n Checkout.loadCheckout();\n } );\n return true;\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Display a popup containing address suggestions\n * @param {string} type\n */\n function loadAddressSuggestion( type )\n {\n\n //check login type\n if ( Checkout.getCheckout().CustomerInvoiceAddress.LoginType == 2 )\n {\n var values = $( '[data-plenty-checkout-form=\"shippingAddress\"]' ).getFormValues();\n }\n else\n {\n var values = $( '[data-plenty-checkout-form=\"guestRegistration\"]' ).getFormValues();\n }\n\n var params = {\n street : values.Street,\n houseNo : values.HouseNo,\n ZIP : values.ZIP,\n city : values.City,\n postnummer : values.Postnummer,\n suggestionType: 'postfinder'\n };\n\n CMS.getContainer( 'CheckoutAddressSuggestionResultsList', params ).from( 'Checkout' )\n .done( function( response )\n {\n Modal.prepare()\n .setContent( response.data[0] )\n .show();\n } );\n }\n\n /**\n * Place the order prepared before and finish the checkout process.
    \n * Validate required checkboxes in data-plenty-checkout-form=\"placeOrder\"\n * @function placeOrder\n * @return {object} jQuery deferred\n * Object\n */\n function placeOrder()\n {\n var form = $( '[data-plenty-checkout-form=\"placeOrder\"]' );\n if ( form.validateForm() )\n {\n\n var values = form.getFormValues();\n\n // if not shown in layout set default 1 for mandatory fields\n var params = {\n TermsAndConditionsCheck : values.termsAndConditionsCheck || 0,\n WithdrawalCheck : values.withdrawalCheck || 0,\n PrivacyPolicyCheck : values.privacyPolicyCheck || 0,\n AgeRestrictionCheck : values.ageRestrictionCheck || 0,\n NewsletterCheck : values.newsletterCheck || 0,\n KlarnaTermsAndConditionsCheck: values.klarnaTermsAndConditionsCheck || 0,\n PayoneDirectDebitMandateCheck: values.payoneDirectDebitMandateCheck || 0,\n PayoneInvoiceCheck : values.payoneInvoiceCheck || 0\n };\n\n return API.post( \"/rest/checkout/placeorder/\", params )\n .done( function( response )\n {\n if ( response.data.MethodOfPaymentRedirectURL != '' )\n {\n\n window.location.assign( response.data.MethodOfPaymentRedirectURL );\n\n }\n else if ( response.data.MethodOfPaymentAdditionalContent != '' )\n {\n\n Modal.prepare()\n .setContent( response.data.MethodOfPaymentAdditionalContent )\n .setLabelDismiss( '' )\n .onDismiss( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).onConfirm( function()\n {\n window.location.assign( form.attr( 'action' ) );\n } ).show();\n\n }\n else\n {\n\n window.location.assign( form.attr( 'action' ) );\n\n }\n } );\n }\n }\n\n }, ['APIFactory', 'UIFactory', 'CMSFactory', 'CheckoutFactory', 'ModalFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n pm.service( 'FeedbackService', function( API )\n {\n\n return {\n getFeedbacks : getFeedbacks,\n addFeedback : addFeedback,\n ArticleTypes : articleTypes(),\n FeedbackTypes: feedbackTypes()\n };\n\n /*\n FeedbackService\n .getFeedbacks().between('2014-12-03', '2015-07-01')\n .for( FeedbackService.ArticleTypes.ITEM, 2732, FeedbackService.FeedbackTypes.COMMENTS_ONLY );\n */\n function getFeedbacks()\n {\n var feedbackInterval = {\n dateStart: null,\n dateEnd : null\n };\n\n return {\n between: setFeedbackInterval,\n for : listFeedbacks\n };\n\n function setFeedbackInterval( start, end )\n {\n feedbackInterval.dateStart = start;\n feedbackInterval.dateEnd = end;\n return this;\n }\n\n function listFeedbacks( articleType, referenceId, feedbackType )\n {\n\n var params = {\n ReferenceId : referenceId,\n FromDate : feedbackInterval.dateStart,\n ToDate : feedbackInterval.dateEnd,\n FeedbackType: feedbackType || feedbackTypes().COMMENTS_AND_RATINGS\n };\n return API.get( '/rest/feedback/' + articleType + '/', params );\n\n }\n }\n\n /*\n FeedbackService\n .addFeedback()\n .withRating( 5 )\n .withComment( 'Hallo' )\n .withAuthor( 'Felix', 'felix.dausch@plentymarkets.com', 123456 )\n .to( FeedbackService.ArticleTypes.ITEM, 2732 );\n */\n function addFeedback()\n {\n\n var params = {\n Rating : 1.0,\n Text : '',\n Author : '',\n Email : '',\n CustomerId: 0\n };\n\n return {\n withRating : withRating,\n withComment: withComment,\n withAuthor : withAuthor,\n to : sendFeedback\n };\n\n function withRating( rating )\n {\n params.Rating = rating;\n return this;\n }\n\n function withComment( comment )\n {\n params.Text = comment;\n return this;\n }\n\n function withAuthor( author, mail, customerID )\n {\n params.Author = author;\n if ( !!mail )\n {\n params.Email = mail;\n }\n if ( !!customerID )\n {\n params.CustomerId = customerID;\n }\n return this;\n }\n\n function sendFeedback( articleType, referenceId )\n {\n return API.post( '/rest/feedback/' + articleType + '/', params );\n\n }\n\n }\n\n function feedbackTypes()\n {\n return {\n COMMENTS_ONLY : 'comments_only',\n RATINGS_ONLY : 'ratings_only',\n COMMENTS_AND_RATINGS: 'comments_with_ratings'\n }\n }\n\n function articleTypes()\n {\n return {\n ITEM : 'item',\n CATEGORY: 'category',\n BLOG : 'blog'\n }\n }\n\n }, ['APIFactory'] );\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Listens to window's size and trigger 'sizeChange' event if the Bootstrap interval changes.\n * @class MediaSizeService\n * @static\n * @example\n * $(window).on('sizeChange', function(newValue, oldValue) {\n * console.log('The interval changed from ' + oldValue + ' to ' + newValue.');\n * });\n */\n pm.service( 'MediaSizeService', function()\n {\n\n var bsInterval;\n\n // recalculation of the current interval on window resize\n $( window ).resize( calculateMediaSize );\n\n // initially calculation of the interval\n $( document ).ready( calculateMediaSize );\n\n return {\n interval : getInterval,\n isInterval: isInterval\n };\n\n /**\n * Get the currently used Bootstrap interval\n * @function getInterval\n * @return {\"xs\"|\"sm\"|\"md\"|\"lg\"}\n */\n function getInterval()\n {\n if ( !!bsInterval )\n {\n calculateMediaSize();\n }\n\n return bsInterval;\n }\n\n /**\n * Calculate the currently used Bootstrap interval\n * @function calculateMediaSize\n * @private\n */\n function calculateMediaSize()\n {\n var size;\n if ( !!window.matchMedia )\n { // FIX IE support\n if ( window.matchMedia( '(min-width:1200px)' ).matches )\n {\n size = 'lg';\n }\n else if ( window.matchMedia( '(min-width:992px)' ).matches )\n {\n size = 'md';\n }\n else if ( window.matchMedia( '(min-width:768px)' ).matches )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n else\n {\n if ( $( window ).width() >= 1200 )\n {\n size = 'lg';\n }\n else if ( $( window ).width() >= 992 )\n {\n size = 'md';\n }\n else if ( $( window ).width() >= 768 )\n {\n size = 'sm';\n }\n else\n {\n size = 'xs';\n }\n }\n if ( size != bsInterval || size === 'xs' )\n {\n var oldValue = bsInterval;\n bsInterval = size;\n $( window ).trigger( 'sizeChange', [bsInterval, oldValue] );\n }\n }\n\n function isInterval( interval )\n {\n var intervalList = interval.replace( /\\s/g, '' ).split( ',' );\n for ( var i = 0; i < intervalList.length; i++ )\n {\n if ( intervalList[i] == bsInterval )\n {\n return true;\n }\n }\n return false;\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Handling navigation while checkout processes\n * @class NavigatorService\n * @static\n *\n */\n pm.service( 'NavigatorService', function( CMS, Checkout )\n {\n var navigation = [];\t\t// contains navigation list elements\n var container = [];\t\t// content containers\n var current = -1;\t\t// index of currently shown content container\n var buttonPrev = {};\t\t// navigation buttons\n var buttonNext = {};\n var interceptors = {\n beforeChange: [],\n afterChange : []\n };\n var checkoutStates = [];\n\n return {\n init : init,\n getCurrentContainer: getCurrentContainer,\n goTo : goTo,\n beforeChange : beforeChange,\n afterChange : afterChange,\n continueChange : continueChange,\n next : next,\n previous : previous,\n goToID : goToID,\n fillNavigation : fillNavigation\n };\n\n /**\n * Initialize checkout navigation. Shows first container.\n * @function init\n * @example\n * ```html\n * \n *
      \n *
    • Checkout Step 1
    • \n *
    • Checkout Step 2
    • \n *
    • ...
    • \n *
    \n * \n *\n *
    \n *
    \n * Checkout Step 1 Content\n *
    \n *
    \n * Checkout Step 2 Content\n *
    \n *
    ...
    \n *
    \n * ```\n */\n function init()\n {\n\n // get elements from DOM\n navigation = $( '[data-plenty-checkout=\"navigation\"] > li' );\n container = $( '[data-plenty-checkout=\"container\"] > div' );\n buttonNext = $( '[data-plenty-checkout=\"next\"]' );\n buttonPrev = $( '[data-plenty-checkout=\"prev\"]' );\n\n if ( navigation.length == container.length && container.length > 0 )\n {\n var checkout = Checkout.getCheckout();\n\n container.hide();\n\n // initialize navigation\n navigation.each( function( i, elem )\n {\n $( elem ).addClass( 'disabled' );\n // handle navigation click events\n $( elem ).click( function()\n {\n if ( !$( this ).is( '.disabled' ) )\n {\n goTo( i );\n }\n } );\n } );\n\n buttonNext.attr( \"disabled\", \"disabled\" );\n buttonNext.click( function()\n {\n next();\n } );\n\n buttonPrev.attr( \"disabled\", \"disabled\" );\n buttonPrev.click( function()\n {\n previous();\n } );\n\n window.addEventListener( 'hashchange', function()\n {\n if ( window.location.hash.length > 0 )\n {\n goToID( window.location.hash );\n }\n else\n {\n goTo( 0 );\n }\n }, false );\n\n // initialize GUI\n // check url param for jumping to tab\n $.urlParam = function( name )\n {\n var results = new RegExp( '[\\?&]' + name + '=([^&#]*)' ).exec( window.location.href );\n if ( results == null )\n {\n return null;\n }\n else\n {\n return results[1] || 0;\n }\n };\n\n var param = $.urlParam( 'gototab' );\n // jump to hash from url param 'gototab'\n if ( window.location.hash.length == 0 && !!param && $( '[data-plenty-checkout-id=\"' + param + '\"]' ).length > 0 )\n {\n window.location.hash = param;\n }\n // jump to hash\n else if ( !goToID( window.location.hash ) && current >= 0 )\n {\n goTo( current );\n }\n else\n {\n goTo( 0 );\n }\n\n fillNavigation();\n $( window ).on( 'sizeChange', fillNavigation );\n $( window ).resize( function()\n {\n if ( pm.getInstance().MediaSizeService.interval() == 'xs' )\n {\n fillNavigation();\n }\n } );\n\n }\n }\n\n /**\n * Get the currently active checkout container.\n * @function getCurrentContainer\n * @return {{id: string, index: number}}\n */\n function getCurrentContainer()\n {\n if ( current >= 0 )\n {\n return {\n id : $( container[current] ).attr( 'data-plenty-checkout-id' ),\n index: current\n };\n }\n else\n {\n return null;\n }\n }\n\n /**\n * Register an interceptor called before each tab change.\n * Tabchange will break if any interceptor returns false.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n * @example\n * plenty.NavigatorService.beforeChange( function(targetContainer) {\n * if( targetContainer.id === 'details' ) {\n * // stop tabchange if user tries to access checkout container with id \"details\"\n * return false;\n * }\n * return true;\n * });\n */\n function beforeChange( interceptor )\n {\n interceptors.beforeChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Register an interceptor called after each tab change.\n * @param {function} interceptor The interceptor callback to register\n * @chainable\n * @returns {NavigatorService}\n */\n function afterChange( interceptor )\n {\n interceptors.afterChange.push( interceptor );\n return pm.getInstance().NavigatorService;\n }\n\n /**\n * Call registered interceptors. Break if any interceptor returns false.\n * Do not call beforeChange-interceptors on initially tabchange\n * @function resolveInterceptors\n * @private\n * @param {\"beforeChange\"|\"afterChange\"} identifier Describe which interceptors should be called\n * @param {number} index the index of the target container\n * @returns {boolean} Conjunction of all interceptor return values\n */\n function resolveInterceptors( identifier, index )\n {\n var continueTabChange = true;\n\n if ( current >= 0 || identifier === 'afterChange' )\n {\n\n var currentContainer = getCurrentContainer();\n var targetContainer = {\n index: index,\n id : $( container[index] ).attr( 'data-plenty-checkout-id' )\n };\n\n $.each( interceptors[identifier], function( i, interceptor )\n {\n if ( interceptor( currentContainer, targetContainer ) === false )\n {\n continueTabChange = false;\n return false;\n }\n } );\n }\n\n return continueTabChange;\n }\n\n /**\n * Show checkout tab given by index\n * @function goTo\n * @param {number} index Index of target tab, starting at 0\n * @param {boolean} [ignoreInterceptors=false] Set true to not call registered interceptors and force changing\n * tab\n */\n function goTo( index, ignoreInterceptors )\n {\n\n var contentChanged = current !== index;\n\n if ( contentChanged && !ignoreInterceptors )\n {\n if ( !resolveInterceptors( \"beforeChange\", index ) )\n {\n return;\n }\n }\n\n current = index;\n\n if ( !Object.equals( checkoutStates[current], Checkout.getCheckout( true ) ) && contentChanged && !!$( container[current] ).attr( 'data-plenty-checkout-content' ) )\n {\n checkoutStates[current] = Checkout.getCheckout( true );\n // reload tab content\n CMS.getCategoryContent( $( container[current] ).attr( 'data-plenty-checkout-content' ) )\n .done( function( response )\n {\n $( container[current] ).html( response.data[0] );\n // continue tab change\n proceedTabChange( contentChanged );\n pm.getInstance().bindDirectives( container[current] );\n $( window ).trigger( 'contentChanged' );\n } );\n }\n else\n {\n // continue tab change without reloading tab content\n proceedTabChange( contentChanged );\n //pm.getInstance().bindDirectives();\n }\n\n }\n\n function proceedTabChange( contentChanged )\n {\n\n // hide content containers\n $( container ).hide();\n\n // refresh navigation elements\n var $elem;\n $( navigation ).each( function( i, elem )\n {\n $elem = $( elem );\n $elem.removeClass( 'disabled active' );\n\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'false' );\n\n if ( i < current )\n {\n // set current element as active\n $elem.addClass( 'visited' );\n }\n else\n {\n if ( i == current )\n {\n $elem.addClass( 'active visited' );\n $elem.find( '[role=\"tab\"]' ).attr( 'aria-selected', 'true' );\n }\n else\n {\n if ( i > current && !$elem.is( '.visited' ) )\n {\n // disable elements behind active\n $elem.addClass( 'disabled' );\n }\n }\n }\n } );\n fillNavigation();\n\n // hide \"previous\"-button if first content container is shown\n if ( current <= 0 )\n {\n buttonPrev.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonPrev.removeAttr( \"disabled\" );\n }\n\n // hide \"next\"-button if last content container is shown\n if ( current + 1 == navigation.length )\n {\n buttonNext.attr( \"disabled\", \"disabled\" );\n }\n else\n {\n buttonNext.removeAttr( \"disabled\" );\n }\n\n // show current content container\n $( container[current] ).show();\n\n // set location hash\n if ( current > 0 )\n {\n window.location.hash = $( container[current] ).attr( 'data-plenty-checkout-id' );\n }\n else\n {\n if ( window.location.hash.length > 0 )\n {\n window.location.hash = '';\n }\n }\n\n if ( contentChanged )\n {\n resolveInterceptors( \"afterChange\", current );\n }\n }\n\n /**\n * Continue interrupted tabchange. Shorthand for: goTo(targetContainer.index, true)\n * @function continueChange\n * @param targetContainer The tab-object received from an interceptor\n */\n function continueChange( targetContainer )\n {\n goTo( targetContainer.index, true );\n }\n\n /**\n * Show next checkout tab if available. Shorthand for\n * \n * if (current < navigation.length - 1) {\n * goTo(current + 1);\n * }\n * \n * @function next\n */\n function next()\n {\n if ( current < navigation.length - 1 )\n {\n goTo( current + 1 );\n }\n }\n\n /**\n * Show previous checkout tab if available\n * @function next\n */\n function previous()\n {\n if ( current > 0 )\n {\n goTo( current - 1 );\n }\n }\n\n /**\n * Show checkout tab given by ID\n * @function goToID\n * @param {string} containerID ID of tab to show. Target tab must be marked with\n * data-plenty-checkout-id=\"#...\"\n */\n function goToID( containerID )\n {\n if ( containerID == 'next' )\n {\n next();\n return true;\n }\n else if ( containerID == 'prev' )\n {\n previous();\n return true;\n }\n else\n {\n containerID = containerID.replace( '#', '' );\n $( container ).each( function( i, elem )\n {\n if ( $( elem ).attr( 'data-plenty-checkout-id' ) == containerID )\n {\n goTo( i );\n return true;\n }\n } );\n }\n\n return false;\n }\n\n /**\n * Calculate navigation's width to match its parent element\n * by increasing its items padding.\n * @function fillNavigation\n */\n function fillNavigation()\n {\n // break if manager has not been initialized\n var navigationCount = navigation.length;\n if ( navigationCount <= 0 )\n {\n return;\n }\n\n // reset inline styles\n $( navigation ).removeAttr( 'style' );\n $( navigation ).children( 'span' ).removeAttr( 'style' );\n $( buttonNext ).removeAttr( 'style' );\n $( buttonPrev ).removeAttr( 'style' );\n\n var buttonWidth = ($( buttonPrev ).outerWidth() < $( buttonNext ).outerWidth()) ? $( buttonNext ).outerWidth( true ) + 1 : $( buttonPrev ).outerWidth( true ) + 1;\n $( buttonNext ).css( {width: buttonWidth + 'px'} );\n $( buttonPrev ).css( {width: buttonWidth + 'px'} );\n\n // calculate width to fill\n var width = $( navigation ).parent().parent().outerWidth( true ) - ( 2 * buttonWidth);\n width -= parseInt( $( navigation ).parent().css( 'marginLeft' ) ) + parseInt( $( navigation ).parent().css( 'marginRight' ) );\n\n var padding = width;\n var tabWidth = [];\n\n $( navigation ).each( function( i, elem )\n {\n padding -= parseInt( $( elem ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).css( 'marginRight' ) );\n\n tabWidth[i] = $( elem ).children( 'span' ).width();\n padding -= tabWidth[i];\n\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginLeft' ) );\n padding -= parseInt( $( elem ).children( 'span' ).css( 'marginRight' ) );\n } );\n\n var paddingEachItem = parseInt( padding / navigationCount );\n\n var paddingLeft, paddingRight;\n if ( paddingEachItem % 2 == 1 )\n {\n paddingLeft = ( paddingEachItem / 2 ) + 0.5;\n paddingRight = ( paddingEachItem / 2 ) - 0.5;\n }\n else\n {\n paddingLeft = paddingEachItem / 2;\n paddingRight = paddingEachItem / 2;\n }\n\n var paddingLastItem = parseInt( padding - ( ( navigationCount - 1 ) * ( paddingLeft + paddingRight ) ) );\n var paddingLastLeft, paddingLastRight;\n if ( paddingLastItem % 2 == 1 )\n {\n paddingLastLeft = ( paddingLastItem / 2 ) + 0.5;\n paddingLastRight = ( paddingLastItem / 2) - 0.5;\n }\n else\n {\n paddingLastLeft = paddingLastItem / 2;\n paddingLastRight = paddingLastItem / 2;\n }\n\n var diff = width;\n $( navigation ).each( function( i, elem )\n {\n if ( i < navigationCount - 1 )\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLeft + 'px', 'paddingRight': paddingRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLeft + paddingRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n else\n {\n $( elem ).children( 'span' ).css( {'paddingLeft': paddingLastLeft + 'px', 'paddingRight': paddingLastRight + 'px'} ); //.parent().css({ width: ( tabWidth[i] + paddingLastLeft + paddingLastRight + parseInt( $(elem).children('span').css('marginLeft') ) + parseInt( $(elem).children('span').css('marginRight') ) )+'px' });\n }\n } );\n\n //$(navigation).parent().css('marginRight', 0);\n }\n\n }, ['CMSFactory', 'CheckoutFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Magnus Martin \n * =====================================================================================\n */\n\n\n(function( $, pm )\n{\n pm.service( 'PostfinderService', function( API, Modal, UIFactory )\n {\n var packstationID = '';\n var shippingFields = {};\n var numberOfResults = {};\n var result = {};\n\n return {\n openPostfinderModal: openPostfinderModal,\n isPackstation : isPackstation\n };\n\n function isPackstation()\n {\n var street = $( 'input[name=\"Street\"]' ).val();\n return ( street.toUpperCase() == \"PACKSTATION\" || street.toUpperCase() == \"POSTFILIALE\" );\n }\n\n function openPostfinderModal()\n {\n shippingFields = {\n PostfinderItemStreet : $( 'input[name=\"Street\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemZIP : $( 'input[name=\"ZIP\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemCity : $( 'input[name=\"City\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' ),\n PostfinderItemHouseNo: $( 'input[name=\"HouseNo\"]', '[data-plenty-checkout-form=\"shippingAddress\"]' )\n\n };\n\n shippingFields.PostfinderItemStreet.val( '' );\n\n if ( (shippingFields.PostfinderItemZIP.val().length > 2 || shippingFields.PostfinderItemCity.val().length > 2) )\n {\n\n API.get( '/rest/checkout/shippingaddresspostfinderlist/',\n {\n suggestionType: \"postfinder\",\n zip : shippingFields.PostfinderItemZIP.val(),\n city : shippingFields.PostfinderItemCity.val()\n } )\n\n .done( function( response )\n {\n result = response.data;\n numberOfResults = result.length;\n\n if ( numberOfResults == 0 )\n {\n showErrorMessage();\n }\n\n var params = {\n addresses: []\n };\n\n for ( var i = 0; i < numberOfResults; i++ )\n {\n var dimension = 'km';\n var distInMeters = result[i].PostfinderItemDistance;\n var distInKilometers = distInMeters / 1000;\n distInKilometers = ((Math.round( distInKilometers * 100 ) / 100).toFixed( 2 )).replace( '.', ',' );\n\n if ( distInMeters < 1000 )\n {\n distInKilometers = distInMeters;\n dimension = 'm';\n }\n\n params.addresses.push( {\n index : i,\n dimension: dimension,\n type : result[i].PostfinderItemIsPackstation ? 'Packstation' : 'Postfiliale',\n number : result[i].PostfinderItemIsPackstation ? result[i].PostfinderItemPackstationNo : result[i].PostfinderItemPostfilialNo,\n street : result[i].PostfinderItemStreet,\n houseNo : result[i].PostfinderItemHouseNo,\n zip : result[i].PostfinderItemZIP,\n city : result[i].PostfinderItemCity,\n district : result[i].PostfinderItemDistrict,\n distance : distInKilometers,\n remark : result[i].PostfinderItemRemark\n } );\n }\n\n var html = pm.compileTemplate( 'addressSuggestions/postFinder.html', params );\n\n Modal.prepare()\n .setTitle( pm.translate( 'Packstations and post offices in your area' ) )\n .setContent( html )\n .setClass( 'checkout' )\n .onConfirm( function()\n {\n shippingFields.PostfinderItemCity.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemStreet.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemStreet.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n shippingFields.PostfinderItemHouseNo.removeClass( 'has-error' ).addClass( 'has-success' );\n $( 'label[for=\"' + shippingFields.PostfinderItemHouseNo.attr( 'id' ) + '\"]' ).removeClass( 'has-error' ).addClass( 'has-success' );\n\n packstationID = $( 'input[type=\"radio\"][name=\"postfinder\"]:checked' ).val();\n\n if ( result[packstationID].PostfinderItemIsPackstation )\n {\n $( shippingFields.PostfinderItemStreet ).val( 'PACKSTATION' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPackstationNo );\n }\n else\n {\n $( shippingFields.PostfinderItemStreet ).val( 'POSTFILIALE' );\n $( shippingFields.PostfinderItemHouseNo ).val( result[packstationID].PostfinderItemPostfilialNo );\n }\n $( shippingFields.PostfinderItemStreet ).trigger( 'change' );\n\n $( shippingFields.PostfinderItemCity ).val( result[packstationID].PostfinderItemCity );\n $( shippingFields.PostfinderItemZIP ).val( result[packstationID].PostfinderItemZIP );\n return true;\n } )\n .show()\n } );\n }\n else\n {\n showErrorMessage();\n }\n\n }\n\n function showErrorMessage()\n {\n UIFactory.throwError( 0, pm.translate( 'Please enter a ZIP code and/or a city.' ) );\n\n shippingFields.PostfinderItemCity.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemCity.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemZIP.removeClass( 'has-success' ).addClass( 'has-error' );\n $( 'label[for=\"' + shippingFields.PostfinderItemZIP.attr( 'id' ) + '\"]' ).removeClass( 'has-success' ).addClass( 'has-error' );\n\n shippingFields.PostfinderItemCity.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n\n shippingFields.PostfinderItemZIP.focus( function()\n {\n $( this ).removeClass( 'has-error' );\n var inputId = $( this ).attr( 'id' );\n $( this ).closest( '.form-group' ).find( '[for=\"' + inputId + '\"]' ).removeClass( 'has-error' );\n } );\n }\n }, ['APIFactory', 'ModalFactory', 'UIFactory'] );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide templates for social share providers to inject them dynamically.\n * @class SocialShareService\n * @static\n */\n pm.service( 'SocialShareService', function()\n {\n\n //TODO: move to global variables\n if ( typeof(socialLangLocale) == 'undefined' )\n {\n socialLangLocale = 'en_US';\n }\n if ( typeof(socialLang) == 'undefined' )\n {\n socialLang = 'en';\n }\n\n return {\n getSocialService: getService\n };\n\n /**\n * Get the template for social media provider\n * @function getService\n * @param {string} identifier name of the social media provider to get the template for\n * @returns {string} the template to inject in DOM\n */\n function getService( identifier )\n {\n var services = {\n 'facebook-like': '',\n\n 'facebook-recommend': '',\n\n 'twitter': '',\n\n 'google-plus': '
    '\n + '',\n };\n\n return services[identifier];\n }\n\n /**\n * get the canonical URL if defined\n * @function getURL\n * @private\n * @return {string} The Canonical URL if defined or the current URI\n */\n function getURI()\n {\n var uri = document.location.href;\n var canonical = $( \"link[rel=canonical]\" ).attr( \"href\" );\n\n if ( canonical && canonical.length > 0 )\n {\n if ( canonical.indexOf( \"http\" ) < 0 )\n {\n canonical = document.location.protocol + \"//\" + document.location.host + canonical;\n }\n uri = canonical;\n }\n\n return uri;\n }\n\n /**\n * returns content of <meta name=\"\" content=\"\"> tags or '' if empty/non existant\n * @function getMeta\n * @private\n * @param {string} name The meta name to get the value of;\n */\n function getMeta( name )\n {\n var metaContent = $( 'meta[name=\"' + name + '\"]' ).attr( 'content' );\n return metaContent || '';\n }\n\n /**\n * create tweet text from content of <meta name=\"DC.title\"> and <meta name=\"DC.creator\">\n * fallback to content of <title> tag\n * @function getTweetText\n * @private\n */\n function getTweetText()\n {\n var title = getMeta( 'DC.title' );\n var creator = getMeta( 'DC.creator' );\n\n if ( title.length > 0 && creator.length > 0 )\n {\n title += ' - ' + creator;\n }\n else\n {\n title = $( 'title' ).text();\n }\n\n return encodeURIComponent( title );\n }\n\n } );\n\n}( jQuery, PlentyFramework ));\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\n/**\n * @module Services\n */\n(function( $, pm )\n{\n\n /**\n * Provide methods for client-side form validation.\n * @class ValidationService\n * @static\n */\n pm.service( 'ValidationService', function()\n {\n\n return {\n validate: validate\n };\n\n /**\n * Check if element is a form element (input, select, textarea) or search for child form elements\n * @function getFormControl\n * @private\n * @param {object} element the element to get the form element from\n * @return {object} a valid form element (input, select, textarea)\n */\n function getFormControl( element )\n {\n element = $( element );\n if ( element.is( 'input' ) || element.is( 'select' ) || element.is( 'textarea' ) )\n {\n return element;\n }\n else\n {\n if ( element.find( 'input' ).length > 0 )\n {\n return element.find( 'input' );\n }\n\n else if ( element.find( 'select' ).length > 0 )\n {\n return element.find( 'select' );\n }\n\n else if ( element.find( 'textarea' ).length > 0 )\n {\n return element.find( 'textarea' );\n }\n\n else\n {\n return null;\n }\n }\n\n }\n\n /**\n * Check given element has any value\n * @function validateText\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateText( formControl )\n {\n // check if formControl is no checkbox or radio\n if ( formControl.is( 'input' ) || formControl.is( 'select' ) || formControl.is( 'textarea' ) )\n {\n // check if length of trimmed value is greater then zero\n return $.trim( formControl.val() ).length > 0;\n\n }\n else\n {\n console.error( 'Validation Error: Cannot validate Text for <' + formControl.prop( \"tagName\" ) + '>' );\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid email-address\n * @function validateMail\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateMail( formControl )\n {\n var mailRegExp = /[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n if ( validateText( formControl ) )\n {\n return mailRegExp.test( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is a valid number\n * @function validateNumber\n * @private\n * @param {object} formControl the form element to validate\n * @return {boolean}\n */\n function validateNumber( formControl )\n {\n if ( validateText( formControl ) )\n {\n return $.isNumeric( $.trim( formControl.val() ) );\n }\n else\n {\n return false;\n }\n }\n\n /**\n * Check given element's value is equal to a references value\n * @function validateValue\n * @private\n * @param {object} formControl the form element to validate\n * @param {string} reference the required value\n * @return {boolean}\n */\n function validateValue( formControl, reference )\n {\n if ( $( reference ).length > 0 )\n {\n return $.trim( formControl.val() ) == $.trim( $( reference ).val() );\n }\n else\n {\n return $.trim( formControl.val() ) == reference;\n }\n }\n\n function visibility( formControl )\n {\n return formControl.is( ':visible' );\n }\n\n function isEnabled( formControl )\n {\n return formControl.is( ':enabled' );\n }\n\n /**\n * Validate a form. Triggers event 'validationFailed' if any element has an invalid value\n * @function validate\n * @param {object} form The form element to validate\n * @returns {boolean}\n * @example\n * ```html\n * \n *
    \n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n *\n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n * \n * \n * \n *\n * \n *
    \n * \n * \n *
    \n *\n *
    \n * ```\n *\n * @example\n * $(form).on('validationFailed', function(missingFields) {\n * // handle missing fields\n * });\n */\n function validate( form, errorClass )\n {\n var formControl, formControls, validationKey, currentHasError, group, checked, checkedMin, checkedMax, attrValidate, validationKeys, formControlAttrType;\n var $form = $( form );\n errorClass = errorClass || 'has-error';\n var missingFields = [];\n var hasError = false;\n\n // check every required input inside form\n $form.find( '[data-plenty-validate], :required' ).each( function( i, elem )\n {\n attrValidate = $( elem ).attr( 'data-plenty-validate' );\n formControls = getFormControl( elem ); \n // validate text inputs\n validationKeys = !!attrValidate ? attrValidate : 'text';\n validationKeys = validationKeys.split( ',' );\n\n for ( var i = 0, length = formControls.length; i < length; i++ )\n {\n formControl = $( formControls[i] );\n formControlAttrType = formControl.attr( 'type' );\n\n if ( !visibility( formControl ) || !isEnabled( formControl ) )\n {\n return;\n }\n\n validationKey = validationKeys[i].trim() || validationKeys[0].trim();\n currentHasError = false;\n\n // formControl is textfield (text, mail, password) or textarea\n if ( (formControl.is( 'input' )\n && formControlAttrType != 'radio'\n && formControlAttrType != 'checkbox')\n || formControl.is( 'textarea' ) )\n {\n switch ( validationKey )\n {\n\n case 'text':\n currentHasError = !validateText( formControl );\n break;\n\n case 'mail':\n currentHasError = !validateMail( formControl );\n break;\n\n case 'number':\n currentHasError = !validateNumber( formControl );\n break;\n\n case 'value':\n currentHasError = !validateValue( formControl, $( elem ).attr( 'data-plenty-validation-value' ) );\n break;\n\n case 'none':\n // do not validate\n break;\n\n default:\n console.error( 'Form validation error: unknown validate property: \"' + attrValidate + '\"' );\n break;\n }\n }\n else if ( formControl.is( 'input' )\n && (formControlAttrType == 'radio'\n || formControlAttrType == 'checkbox') )\n {\n // validate radio buttons\n group = formControl.attr( 'name' );\n checked = $form.find( 'input[name=\"' + group + '\"]:checked' ).length;\n\n if ( formControlAttrType == 'radio' )\n {\n checkedMin = 1;\n checkedMax = 1;\n }\n else\n {\n var minMax = (new Function(\"return \" + attrValidate))() || {min: 1, max: 1};\n checkedMin = minMax.min;\n checkedMax = minMax.max;\n }\n\n currentHasError = ( checked < checkedMin || checked > checkedMax );\n\n }\n else if ( formControl.is( 'select' ) )\n {\n // validate selects\n currentHasError = ( formControl.val() == '' || formControl.val() == '-1' );\n }\n else\n {\n console.error( 'Form validation error: ' + $( elem ).prop( \"tagName\" ) + ' does not contain an form element' );\n return;\n }\n\n if ( currentHasError )\n {\n hasError = true;\n missingFields.push( formControl );\n\n if ( formControls.length > 1 )\n {\n formControl.addClass( errorClass );\n $form.find( 'label[for=\"' + formControl.attr( 'id' ) + '\"]' ).addClass( errorClass );\n }\n else\n {\n $( elem ).addClass( errorClass );\n }\n }\n }\n\n } );\n\n // scroll to element on 'validationFailed'\n $form.on( 'validationFailed', function()\n {\n var distanceTop = 50;\n var $error = $form.find( '.' + errorClass ).first();\n var errorOffset = $error.offset().top;\n var $scrollTarget = $( 'html, body' );\n\n // if form is inside of modal, scroll modal instead of body\n if ( $form.parents( '.modal' ).length > 0 )\n {\n $scrollTarget = $form.parents( '.modal' ).find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n\n }\n else if ( $form.is( '.modal' ) )\n {\n $scrollTarget = $form.find( '.modal-body' );\n errorOffset = $scrollTarget.scrollTop() - ( $scrollTarget.offset().top - $error.offset().top );\n }\n\n // only scroll if error is outside of viewport\n if ( errorOffset - distanceTop < window.pageYOffset || errorOffset > (window.pageYOffset + window.innerHeight) )\n {\n $scrollTarget.animate( {\n scrollTop: errorOffset - distanceTop\n } );\n }\n } );\n\n if ( hasError )\n {\n // remove error class on focus\n $form.find( '.' + errorClass ).each( function( i, elem )\n {\n formControl = $( getFormControl( elem ) );\n formControl.on( 'focus click', function()\n {\n var $errorElement = $( elem );\n $errorElement.removeClass( errorClass );\n $form.find( 'label[for=\"' + $( this ).attr( 'id' ) + '\"]' ).removeClass( errorClass );\n } );\n } );\n\n $form.trigger( 'validationFailed', [missingFields] );\n }\n\n var callback = $form.attr( 'data-plenty-callback' );\n\n if ( !hasError && !!callback && callback != \"submit\" && typeof window[callback] == \"function\" )\n {\n\n var fields = {};\n $form.find( 'input, textarea, select' ).each( function()\n {\n if ( $( this ).attr( 'type' ) == 'checkbox' )\n {\n fields[$( this ).attr( 'name' )] = $( this ).is( ':checked' );\n }\n else\n {\n fields[$( this ).attr( 'name' )] = $( this ).val();\n }\n } );\n\n window[callback]( fields );\n return false;\n }\n else\n {\n return !hasError;\n }\n }\n } );\n\n /**\n * jQuery-Plugin to calling {{#crossLink \"ValidationService/validate\"}}ValidationService.validate{{/crossLink}}\n * on jQuery wrapped elements.\n * @return {boolean}\n */\n $.fn.validateForm = function()\n {\n return pm.getInstance().ValidationService.validate( this );\n };\n\n /**\n * jQuery-Plugin to get the values of contained form elements.\n * @return {object}\n */\n $.fn.getFormValues = function()\n {\n\n var form = this;\n var values = {};\n\n function inject( position, value )\n {\n var match = position.match( /^([^\\[]+)(.*)/ );\n\n if ( !!match[2] )\n {\n var exp = /\\[([^\\]]+)]/g;\n var child;\n var children = [];\n children[0] = match[1];\n while ( (child = exp.exec( match[2] )) !== null )\n {\n children.push( child[1] );\n }\n\n for ( var i = children.length - 1; i >= 0; i-- )\n {\n var val = {};\n val[children[i]] = value;\n value = val;\n }\n values = $.extend( true, values, value );\n }\n else\n {\n values[match[1]] = value;\n }\n }\n\n form.find( 'input, select, textarea' ).each( function( i, elem )\n {\n if ( !!$( elem ).attr( 'name' ) )\n {\n if ( $( elem ).attr( 'type' ) == \"checkbox\" )\n {\n // get checkbox group\n var groupValues = [];\n $( form ).find( '[name=\"' + $( elem ).attr( 'name' ) + '\"]:checked' ).each( function( j, checkbox )\n {\n groupValues.push( $( checkbox ).val() );\n } );\n inject( $( elem ).attr( 'name' ), groupValues );\n }\n else if ( $( elem ).attr( 'type' ) == 'radio' )\n {\n if ( $( elem ).is( ':checked' ) )\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n else\n {\n inject( $( elem ).attr( 'name' ), $( elem ).val() );\n }\n }\n\n } );\n return values;\n }\n}( jQuery, PlentyFramework ));\n/**\n * Services provide functions to be called from the instanced PlentyFramework.
    \n * Services can inject Factories and can be injected into Directives. The are also\n * available from the global instance of PlentyFramework\n * @module Services\n * @main Services\n * @example\n * PlentyFramework.service('ServiceName', serviceFunctions() {\n * return {\n * functionInService: function() {}\n * }\n * });\n * //...\n * plenty.ServiceName.functionInService/();\n */\n/**\n * Licensed under AGPL v3\n * (https://github.com/plentymarkets/plenty-cms-library/blob/master/LICENSE)\n * =====================================================================================\n * @copyright Copyright (c) 2015, plentymarkets GmbH (http://www.plentymarkets.com)\n * @author Felix Dausch \n * =====================================================================================\n */\n\nPlentyFramework.compile();\n\n// Create global instance of PlentyFramework for usage in Webshop-Layouts\nvar plenty = PlentyFramework.getInstance();\n\n/*\n * initially bind all registered directives\n *\n * will not be tested. reasons:\n * http://stackoverflow.com/questions/29153733/how-to-unit-test-a-document-ready-function-using-jasmine\n */\njQuery( document ).ready( function()\n{\n plenty.bindDirectives();\n} );" ] } \ No newline at end of file diff --git a/dist/plentymarketsCMStools-libs-1.0.8.min.js b/dist/plentymarketsCMStools-libs-1.0.9.min.js similarity index 100% rename from dist/plentymarketsCMStools-libs-1.0.8.min.js rename to dist/plentymarketsCMStools-libs-1.0.9.min.js