//https://github.com/inexorabletash/polyfill/blob/master/web.js if (!document.querySelectorAll) { document.querySelectorAll = function (selectors) { var style = document.createElement('style'), elements = [], element; document.documentElement.firstChild.appendChild(style); document._qsa = []; style.styleSheet.cssText = selectors + '{x-qsa:expression(document._qsa && document._qsa.push(this))}'; window.scrollBy(0, 0); style.parentNode.removeChild(style); while (document._qsa.length) { element = document._qsa.shift(); element.style.removeAttribute('x-qsa'); elements.push(element); } document._qsa = null; return elements; }; } if (!document.querySelector) { document.querySelector = function (selectors) { var elements = document.querySelectorAll(selectors); return (elements.length) ? elements[0] : null; }; } if (!document.getElementsByClassName) { document.getElementsByClassName = function (classNames) { classNames = String(classNames).replace(/^|\s+/g, '.'); return document.querySelectorAll(classNames); }; } //https://github.com/inexorabletash/polyfill // ES5 15.2.3.14 Object.keys ( O ) // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys if (!Object.keys) { Object.keys = function (o) { if (o !== Object(o)) { throw TypeError('Object.keys called on non-object'); } var ret = [], p; for (p in o) { if (Object.prototype.hasOwnProperty.call(o, p)) { ret.push(p); } } return ret; }; } //https://github.com/inexorabletash/polyfill/blob/master/web.js (function (global) { var B64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; global.atob = global.atob || function (input) { input = String(input); var position = 0, output = [], buffer = 0, bits = 0, n; input = input.replace(/\s/g, ''); if ((input.length % 4) === 0) { input = input.replace(/=+$/, ''); } if ((input.length % 4) === 1) { throw Error("InvalidCharacterError"); } if (/[^+/0-9A-Za-z]/.test(input)) { throw Error("InvalidCharacterError"); } while (position < input.length) { n = B64_ALPHABET.indexOf(input.charAt(position)); buffer = (buffer << 6) | n; bits += 6; if (bits === 24) { output.push(String.fromCharCode((buffer >> 16) & 0xFF)); output.push(String.fromCharCode((buffer >> 8) & 0xFF)); output.push(String.fromCharCode(buffer & 0xFF)); bits = 0; buffer = 0; } position += 1; } if (bits === 12) { buffer = buffer >> 4; output.push(String.fromCharCode(buffer & 0xFF)); } else if (bits === 18) { buffer = buffer >> 2; output.push(String.fromCharCode((buffer >> 8) & 0xFF)); output.push(String.fromCharCode(buffer & 0xFF)); } return output.join(''); }; global.btoa = global.btoa || function (input) { input = String(input); var position = 0, out = [], o1, o2, o3, e1, e2, e3, e4; if (/[^\x00-\xFF]/.test(input)) { throw Error("InvalidCharacterError"); } while (position < input.length) { o1 = input.charCodeAt(position++); o2 = input.charCodeAt(position++); o3 = input.charCodeAt(position++); // 111111 112222 222233 333333 e1 = o1 >> 2; e2 = ((o1 & 0x3) << 4) | (o2 >> 4); e3 = ((o2 & 0xf) << 2) | (o3 >> 6); e4 = o3 & 0x3f; if (position === input.length + 2) { e3 = 64; e4 = 64; } else if (position === input.length + 1) { e4 = 64; } out.push(B64_ALPHABET.charAt(e1), B64_ALPHABET.charAt(e2), B64_ALPHABET.charAt(e3), B64_ALPHABET.charAt(e4)); } return out.join(''); }; }(this)); //https://github.com/jonathantneal/polyfill/blob/master/source/Window.prototype.getComputedStyle.ie8.js (function () { if(window.getComputedStyle) return; //Add an exit if already defined function getComputedStylePixel(element, property, fontSize) { element.document; // Internet Explorer sometimes struggles to read currentStyle until the element's document is accessed. var value = element.currentStyle[property].match(/([\d\.]+)(%|cm|em|in|mm|pc|pt|)/) || [0, 0, ''], size = value[1], suffix = value[2], rootSize; fontSize = !fontSize ? fontSize : /%|em/.test(suffix) && element.parentElement ? getComputedStylePixel(element.parentElement, 'fontSize', null) : 16; rootSize = property == 'fontSize' ? fontSize : /width/i.test(property) ? element.clientWidth : element.clientHeight; return suffix == '%' ? size / 100 * rootSize : suffix == 'cm' ? size * 0.3937 * 96 : suffix == 'em' ? size * fontSize : suffix == 'in' ? size * 96 : suffix == 'mm' ? size * 0.3937 * 96 / 10 : suffix == 'pc' ? size * 12 * 96 / 72 : suffix == 'pt' ? size * 96 / 72 : size; } function setShortStyleProperty(style, property) { var borderSuffix = property == 'border' ? 'Width' : '', t = property + 'Top' + borderSuffix, r = property + 'Right' + borderSuffix, b = property + 'Bottom' + borderSuffix, l = property + 'Left' + borderSuffix; style[property] = (style[t] == style[r] && style[t] == style[b] && style[t] == style[l] ? [ style[t] ] : style[t] == style[b] && style[l] == style[r] ? [ style[t], style[r] ] : style[l] == style[r] ? [ style[t], style[r], style[b] ] : [ style[t], style[r], style[b], style[l] ]).join(' '); } // function CSSStyleDeclaration(element) { var style = this, currentStyle = element.currentStyle, fontSize = getComputedStylePixel(element, 'fontSize'), unCamelCase = function (match) { return '-' + match.toLowerCase(); }, property; for (property in currentStyle) { Array.prototype.push.call(style, property == 'styleFloat' ? 'float' : property.replace(/[A-Z]/, unCamelCase)); if (property == 'width') { style[property] = element.offsetWidth + 'px'; } else if (property == 'height') { style[property] = element.offsetHeight + 'px'; } else if (property == 'styleFloat') { style.float = currentStyle[property]; } else if (/margin.|padding.|border.+W/.test(property) && style[property] != 'auto') { style[property] = Math.round(getComputedStylePixel(element, property, fontSize)) + 'px'; } else if (/^outline/.test(property)) { // errors on checking outline try { style[property] = currentStyle[property]; } catch (error) { style.outlineColor = currentStyle.color; style.outlineStyle = style.outlineStyle || 'none'; style.outlineWidth = style.outlineWidth || '0px'; style.outline = [style.outlineColor, style.outlineWidth, style.outlineStyle].join(' '); } } else { style[property] = currentStyle[property]; } } setShortStyleProperty(style, 'margin'); setShortStyleProperty(style, 'padding'); setShortStyleProperty(style, 'border'); style.fontSize = Math.round(fontSize) + 'px'; } CSSStyleDeclaration.prototype = { constructor: CSSStyleDeclaration, // .getPropertyPriority getPropertyPriority: function () { throw new Error('NotSupportedError: DOM Exception 9'); }, // .getPropertyValue getPropertyValue: function(property) { var lookup = property.replace(/-([a-z])/g, function(match) { match = match.charAt ? match.split('') : match; return match[1].toUpperCase(); }); var ret = this[lookup]; return ret; }, // .item item: function (index) { return this[index]; }, // .removeProperty removeProperty: function () { throw new Error('NoModificationAllowedError: DOM Exception 7'); }, // .setProperty setProperty: function () { throw new Error('NoModificationAllowedError: DOM Exception 7'); }, // .getPropertyCSSValue getPropertyCSSValue: function () { throw new Error('NotSupportedError: DOM Exception 9'); } }; // .getComputedStyle window.getComputedStyle = function (element) { return new CSSStyleDeclaration(element); }; })(); //https://gist.github.com/jimeh/332357 if (!Object.prototype.hasOwnProperty){ /*jshint -W001, -W103 */ Object.prototype.hasOwnProperty = function(prop) { var proto = this.__proto__ || this.constructor.prototype; return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]); } /*jshint +W001, +W103 */ }