/* * advanced ads functions to be used directly within ad codes */ advads = { /** * check if localstorage is supported/enabled by client */ supports_localstorage: function() { "use strict"; try { if (!window || window.localStorage === undefined) { return false; } // storage might be full or disabled window.localStorage.setItem("x", "x"); window.localStorage.removeItem("x"); return true; } catch(e) { return false; } }, /** * check if the ad is displayed more than {max} times per session * every check increases the counter * * @param {string} name (no id needed, just any id-formated string) * @param {type} max number of maximum times the ad can be displayed within the period * @returns {bool} true if limit is reached */ max_per_session: function(name, max){ var num = 1; if(max === undefined || parseInt( max ) === 0) { max = 1; } // check if cookie exists and get the value if(this.cookie_exists( name )){ if(this.get_cookie( name ) >= max) { return true; } num = num + parseInt( this.get_cookie( name ) ); } this.set_cookie( name, num ); return false; }, /** * increase a cookie with an integer value by 1 * * @param {str} name of the cookie * @param {int} exdays days until cookie expires */ count_up: function( name, exdays ){ var num = 1; // check if cookie exists and get the value if(this.cookie_exists( name )){ num = num + parseInt( this.get_cookie( name ) ); } this.set_cookie( name, num ); }, /** * return true, if cookie exists * return false, if not * if not exists, create it * use case: to check if something already happened in this page impression * * @param {type} name * @returns {unresolved} */ set_cookie_exists: function( name ){ if( get_cookie(name) ){ return true; } set_cookie( name, '', 0 ); return false; }, /** * get a cookie value * * @param {str} name of the cookie */ get_cookie: function (name) { var i, x, y, ADVcookies = document.cookie.split( ";" ); for (i = 0; i < ADVcookies.length; i++) { x = ADVcookies[i].substr( 0, ADVcookies[i].indexOf( "=" ) ); y = ADVcookies[i].substr( ADVcookies[i].indexOf( "=" ) + 1 ); x = x.replace( /^\s+|\s+$/g, "" ); if (x === name) { return unescape( y ); } } }, /** * set a cookie value * * @param {str} name of the cookie * @param {str} value of the cookie * @param {int} exdays days until cookie expires * set 0 to expire cookie immidiatelly * set null to expire cookie in the current session */ set_cookie: function (name, value, exdays, path, domain, secure) { // days in seconds var expiry = ( exdays == null ) ? null : exdays * 24 * 60 * 60; this.set_cookie_sec( name, value, expiry, path, domain, secure ); }, /** * set a cookie with expiry given in seconds * * @param {str} name of the cookie * @param {str} value of the cookie * @param {int} expiry seconds until cookie expires * set 0 to expire cookie immidiatelly * set null to expire cookie in the current session */ set_cookie_sec: function (name, value, expiry, path, domain, secure) { var exdate = new Date(); exdate.setSeconds( exdate.getSeconds() + parseInt( expiry ) ); document.cookie = name + "=" + escape( value ) + ((expiry == null) ? "" : "; expires=" + exdate.toUTCString()) + ((path == null) ? "; path=/" : "; path=" + path) + ((domain == null) ? "" : "; domain=" + domain) + ((secure == null) ? "" : "; secure"); }, /** * check if a cookie is set and contains a value * * @param {str} name of the cookie * @returns {bool} true, if cookie is set */ cookie_exists: function (name) { var c_value = this.get_cookie( name ); if (c_value !== null && c_value !== "" && c_value !== undefined) { return true; } return false; }, /** * move one element into another * * @param {str} element selector of the element that should be moved * @param {str} target selector of the element where to move * @param {arr} options */ move: function( element, target, options ) { var el = jQuery(element); var target_string = target; if( typeof options === 'undefined' ){ options = {}; } if( typeof options.css === 'undefined' ){ options.css = {}; } if( typeof options.method === 'undefined' ){ options.method = 'prependTo'; } // search for abstract target element if( target === '' && typeof options.target !== 'undefined' ){ switch( options.target ){ case 'wrapper' : // wrapper var offset = 'left'; if( typeof options.offset !== 'undefined' ){ offset = options.offset; } target = this.find_wrapper( element, offset ); break; } } // use only visible elements if( typeof options.moveintohidden === 'undefined' ){ target = jQuery( target ).filter(':visible'); } // print warning in console if the element appears multiple times if( target.length > 1 ){ console.log( "Advanced Ads: element '" + target_string + "' found " + target.length + " times." ); } // switch insert method switch( options.method ){ case 'insertBefore' : el.insertBefore(target); break; case 'insertAfter' : el.insertAfter(target); break; case 'appendTo' : el.appendTo(target); break; case 'prependTo' : el.prependTo(target); break; default : el.prependTo(target); } }, /** * Set 'relative' position for a parent element. * * @param {str} element selector */ set_parent_relative: function( element, options ) { var options = typeof options !== 'undefined' ? options: {}; var el = jQuery(element); // give "position" style to parent element, if missing var parent = el.parent(); if ( options.use_grandparent ) { parent = parent.parent(); } if(parent.css('position') === 'static' || parent.css('position') === ''){ parent.css('position', 'relative'); } }, /** * make an absolute position element fixed at the current position * hint: use only after DOM is fully loaded in order to fix a wrong position * * @param {str} element selector * @param {obj} options */ fix_element: function( element, options ){ var options = typeof options !== 'undefined' ? options: {}; var el = jQuery(element); if ( options.use_grandparent ) { this.set_parent_relative( el.parent() ); } else { this.set_parent_relative( el ); } // fix element at current position // get position for hidden elements by showing them for a very short time if ( options.is_invisible ) { el.show(); } var topoffset = parseInt(el.offset().top); var leftoffset = parseInt(el.offset().left); if ( options.is_invisible ) { el.hide(); } if ( 'left' === options.offset ) { // Allow to scale the nested image down when it has `max-width: 100%` and touches the left edge of the viewport. var rightoffset = jQuery( window ).width() - leftoffset - el.outerWidth(); el.css( 'position', 'fixed' ).css( 'top', topoffset + 'px' ).css( 'right', rightoffset + 'px' ).css( 'left', '' ); } else { // reset "right" to prevent conflicts el.css('position', 'fixed').css('top', topoffset + 'px').css('left', leftoffset + 'px').css('right', ''); } }, /** * find the main wrapper * either id or first of its class * * @param {str} element selector * @param {str} offset which position of the offset to check (left or right) * @return {str} selector */ find_wrapper: function( element, offset ){ // first margin: auto element after body var returnValue; jQuery('body').children().each(function(key, value){ // exclude current element // TODO exclude