Trying to Get Pregnant

Computer virus alert

Google chrome is giving me a warning that there is a virus when I click on certain pages on this board tonight, for example the 2nd page of Strbuckss' BFP announcement or the anyone know me thread. The warning says that it contains content from the site www.magical kingdoms.com and that that page is sending viruses. Here is the warning I get: 


Warning: Visiting this site may harm your computer!The website at community.thebump.com contains elements from the site www.magicalkingdoms.com, which appears to host malware ? software that can hurt your computer or otherwise operate without your consent. Just visiting a site that contains malware can infect your computer.For detailed information about the problems with these elements, visit the Google <a href="https://community.thebump.com/cs/ks/forums/data:text/html;charset=utf-8,<!DOCTYPE html> <html id="template_root" i18n-values="dir:textdirection"> <head> <title i18n-content="title"></title> <style> body { background-color:#500; font-family:Helvetica,Arial,sans-serif; margin:0px; } .background { position:absolute; width:100%; height:100%; } .cell { padding:40px; } .box { width:80%; background-color:white; color:black; font-size:10pt; line-height:16pt; text-align:left; padding:20px; position:relative; -webkit-box-shadow:3px 3px 8px #200; -webkit-border-radius:5px; } html[dir='rtl'] .box { text-align:right; } .icon { position:absolute; } .title { margin:0px 87px 0px; font-size:18pt; line-height: 140%; margin-bottom:6pt; font-weight:bold; color:#660000; } .main { margin:0px 90px 0px; } .submission { margin:15px 5px 15px 0px; padding:0px; } input { margin:0px; } .proceedbutton { } .helpbutton { float:right; } .example { margin: 30px 90px 0px; border-top:1px solid #ccc; padding-top:6px; } .moreinfotitle { margin-left:5px; margin-right:5px; } </style> <script> function sendCommand(cmd) { window.domAutomationController.setAutomationId(1); window.domAutomationController.send(cmd); } function agreed(form) { form.continue_button.disabled = !form.continue_button.disabled; } </script> </head> <body oncontextmenu="return false;"> <div class="background"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAJFCAIAAACTIQqNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAARFJREFUeNq8VUESgzAIBMdzv9D/9tPbBEg0UwWibQ+ZqAF2Fzbt8no8FyIKFuvOWLg8A/qdmRK5zqr5sL3hSO2Cwyw7Kk7D/8vigg3RyOUdpDw61x5D1gfYs+ZR2Wufap7kW8zWr6pxV6/oRK0B7nEYsP64+iwaf4zzgXKlu/xEf/URzFu4WEt5do6YqyPeGvSp32ZrCH8EOmBzpXaHkJ4JKKcPbYaJGQ2xGZ2GzV2zx1fvb6RR7gbjlOcMx47l6AbB9615IYrDzn+xP5A4O/cOEji4yUPrsxPjn8u8A19EOnLnnzH6/7D9Xh1wWB3tq+WvCHkdzwgJzl5v4p7Nn/0qF4n7j4uY9OUeRTmOjrcAAwA2pq7tEQdVlgAAAABJRU5ErkJggg==" width="100%" height="100%" alt="background" onmousedown="return false;"/></div> <table width="100%" cellspacing="0" cellpadding="0"> <td class="cell" valign="middle" align="center"> <div class="box"> <div class="icon"><img src="data:image/png;base64,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" alt="Malware Icon" onmousedown="return false;"/></div> <div class="title" i18n-content="headLine"></div> <div class="main" i18n-values=".innerHTML:description1"></div> <div class="main" i18n-values=".innerHTML:description2"></div> <div class="main"><a href="" i18n-content="description3" onclick="sendCommand('learnMore'); return false;" onmousedown="return false;"></a></div> <div class="main"> <form class="submission"> <input name="checky" id="checky" type="checkbox" onclick="agreed(this.form)">&amp;nbsp;<label for="checky" i18n-content="confirm_text"></label> <input type="button" name="continue_button" i18n-values="value:continue_button" disabled="true" onclick="sendCommand('proceed')"><br> <input type="button" name="back_button" i18n-values="value:back_button" onclick="sendCommand('takeMeBack')"> </form> </div> </div> </td> </table> </body> </html> <script>/** * @fileoverview This is a simple template engine inspired by JsTemplates * optimized for i18n. * * It currently supports two handlers: * * * i18n-content which sets the textContent of the element * * <span i18n-content="myContent"></span> * i18nTemplate.process(element, {'myContent': 'Content'}); * * * i18n-values is a list of attribute-value or property-value pairs. * Properties are prefixed with a '.' and can contain nested properties. * * <span i18n-values="title:myTitle;.style.fontSize:fontSize"></span> * i18nTemplate.process(element, { * 'myTitle': 'Title', * 'fontSize': '13px' * }); */ var i18nTemplate = (function() { /** * This provides the handlers for the templating engine. The key is used as * the attribute name and the value is the function that gets called for every * single node that has this attribute. * @type {Object} */ var handlers = { /** * This handler sets the textContent of the element. */ 'i18n-content': function(element, attributeValue, obj) { element.textContent = obj[attributeValue]; }, /** * This is used to set HTML attributes and DOM properties,. The syntax is: * attributename:key; * .domProperty:key; * .nested.dom.property:key */ 'i18n-values': function(element, attributeValue, obj) { var parts = attributeValue.replace(/\s/g, '').split(/;/); for (var j = 0; j < parts.length; j++) { var a = parts[j].match(/^([^:]+):(.+)$/); if (a) { var propName = a[1]; var propExpr = a[2]; / Ignore missing properties if (propExpr in obj) { var value = obj[propExpr]; if (propName.charAt(0) == '.') { var path = propName.slice(1).split('.'); var object = element; while (object &amp;&amp; path.length > 1) { object = object[path.shift()]; } if (object) { object[path] = value; / In case we set innerHTML (ignoring others) we need to / recursively check the content if (path == 'innerHTML') { process(element, obj); } } } else { element.setAttribute(propName, value); } } else { console.warn('i18n-values: Missing value for "' + propExpr + '"'); } } } } }; var attributeNames = []; for (var key in handlers) { attributeNames.push(key); } var selector = '[' + attributeNames.join('],[') + ']'; /** * Processes a DOM tree with the {@code obj} map. */ function process(node, obj) { var elements = node.querySelectorAll(selector); for (var element, i = 0; element = elements[i]; i++) { for (var j = 0; j < attributeNames.length; j++) { var name = attributeNames[j]; var att = element.getAttribute(name); if (att != null) { handlers[name](element, att, obj); } } } } return { process: process }; })(); </script><script>(function(){ /** * @fileoverview Miscellaneous constants and functions referenced in * the main source files. */ function log(msg) {} /** @const */ var STRING_empty = ''; /** @const */ var CSS_display = 'display'; /** @const */ var CSS_position = 'position'; var TYPE_boolean = 'boolean'; var TYPE_number = 'number'; var TYPE_object = 'object'; var TYPE_string = 'string'; var TYPE_function = 'function'; var TYPE_undefined = 'undefined'; /** * Wrapper for the eval() builtin function to evaluate expressions and * obtain their value. It wraps the expression in parentheses such * that object literals are really evaluated to objects. Without the * wrapping, they are evaluated as block, and create syntax * errors. Also protects against other syntax errors in the eval()ed * code and returns null if the eval throws an exception. * * @param {string} expr * @return {Object|null} */ function jsEval(expr) { try { return eval('[' + expr + '][0]'); } catch (e) { log('EVAL FAILED ' + expr + ': ' + e); return null; } } function jsLength(obj) { return obj.length; } function assert(obj) {} /** * Copies all properties from second object to the first. Modifies to. * * @param {Object} to The target object. * @param {Object} from The source object. */ function copyProperties(to, from) { for (var p in from) { to[p] = from[p]; } } /** * @param {Object|null|undefined} value The possible value to use. * @param {Object} defaultValue The default if the value is not set. * @return {Object} The value, if it is * defined and not null; otherwise the default */ function getDefaultObject(value, defaultValue) { if (typeof value != TYPE_undefined &amp;&amp; value != null) { return /** @type Object */(value); } else { return defaultValue; } } /** * Detect if an object looks like an Array. * Note that instanceof Array is not robust; for example an Array * created in another iframe fails instanceof Array. * @param {Object|null} value Object to interrogate * @return {boolean} Is the object an array? */ function isArray(value) { return value != null &amp;&amp; typeof value == TYPE_object &amp;&amp; typeof value.length == TYPE_number; } /** * Finds a slice of an array. * * @param {Array} array Array to be sliced. * @param {number} start The start of the slice. * @param {number} opt_end The end of the slice (optional). * @return {Array} array The slice of the array from start to end. */ function arraySlice(array, start, opt_end) { return Function.prototype.call.apply(Array.prototype.slice, arguments); } /** * Jscompiler wrapper for parseInt() with base 10. * * @param {string} s string repersentation of a number. * * @return {number} The integer contained in s, converted on base 10. */ function parseInt10(s) { return parseInt(s, 10); } /** * Clears the array by setting the length property to 0. This usually * works, and if it should turn out not to work everywhere, here would * be the place to implement the browser specific workaround. * * @param {Array} array Array to be cleared. */ function arrayClear(array) { array.length = 0; } /** * Prebinds "this" within the given method to an object, but ignores all * arguments passed to the resulting function. * I.e. var_args are all the arguments that method is invoked with when * invoking the bound function. * * @param {Object|null} object The object that the method call targets. * @param {Function} method The target method. * @return {Function} Method with the target object bound to it and curried by * the provided arguments. */ function bindFully(object, method, var_args) { var args = arraySlice(arguments, 2); return function() { return method.apply(object, args); } } var DOM_ELEMENT_NODE = 1; var DOM_ATTRIBUTE_NODE = 2; var DOM_TEXT_NODE = 3; var DOM_CDATA_SECTION_NODE = 4; var DOM_ENTITY_REFERENCE_NODE = 5; var DOM_ENTITY_NODE = 6; var DOM_PROCESSING_INSTRUCTION_NODE = 7; var DOM_COMMENT_NODE = 8; var DOM_DOCUMENT_NODE = 9; var DOM_DOCUMENT_TYPE_NODE = 10; var DOM_DOCUMENT_FRAGMENT_NODE = 11; var DOM_NOTATION_NODE = 12; function domGetElementById(document, id) { return document.getElementById(id); } /** * Creates a new node in the given document * * @param {Document} doc Target document. * @param {string} name Name of new element (i.e. the tag name).. * @return {Element} Newly constructed element. */ function domCreateElement(doc, name) { return doc.createElement(name); } /** * Traverses the element nodes in the DOM section underneath the given * node and invokes the given callback as a method on every element * node encountered. * * @param {Element} node Parent element of the subtree to traverse. * @param {Function} callback Called on each node in the traversal. */ function domTraverseElements(node, callback) { var traverser = new DomTraverser(callback); traverser.run(node); } /** * A class to hold state for a dom traversal. * @param {Function} callback Called on each node in the traversal. * @constructor * @class */ function DomTraverser(callback) { this.callback_ = callback; } /** * Processes the dom tree in breadth-first order. * @param {Element} root The root node of the traversal. */ DomTraverser.prototype.run = function(root) { var me = this; me.queue_ = [ root ]; while (jsLength(me.queue_)) { me.process_(me.queue_.shift()); } } /** * Processes a single node. * @param {Element} node The current node of the traversal. */ DomTraverser.prototype.process_ = function(node) { var me = this; me.callback_(node); for (var c = node.firstChild; c; c = c.nextSibling) { if (c.nodeType == DOM_ELEMENT_NODE) { me.queue_.push(c); } } } /** * Get an attribute from the DOM. Simple redirect, exists to compress code. * * @param {Element} node Element to interrogate. * @param {string} name Name of parameter to extract. * @return {string|null} Resulting attribute. */ function domGetAttribute(node, name) { return node.getAttribute(name); } /** * Set an attribute in the DOM. Simple redirect to compress code. * * @param {Element} node Element to interrogate. * @param {string} name Name of parameter to set. * @param {string|number} value Set attribute to this value. */ function domSetAttribute(node, name, value) { node.setAttribute(name, value); } /** * Remove an attribute from the DOM. Simple redirect to compress code. * * @param {Element} node Element to interrogate. * @param {string} name Name of parameter to remove. */ function domRemoveAttribute(node, name) { node.removeAttribute(name); } /** * Clone a node in the DOM. * * @param {Node} node Node to clone. * @return {Node} Cloned node. */ function domCloneNode(node) { return node.cloneNode(true); } /** * Clone a element in the DOM. * * @param {Element} element Element to clone. * @return {Element} Cloned element. */ function domCloneElement(element) { return /** @type {Element} */(domCloneNode(element)); } /** * Returns the document owner of the given element. In particular, * returns window.document if node is null or the browser does not * support ownerDocument. If the node is a document itself, returns * itself. * * @param {Node|null|undefined} node The node whose ownerDocument is required. * @returns {Document} The owner document or window.document if unsupported. */ function ownerDocument(node) { if (!node) { return document; } else if (node.nodeType == DOM_DOCUMENT_NODE) { return /** @type Document */(node); } else { return node.ownerDocument || document; } } /** * Creates a new text node in the given document. * * @param {Document} doc Target document. * @param {string} text Text composing new text node. * @return {Text} Newly constructed text node. */ function domCreateTextNode(doc, text) { return doc.createTextNode(text); } /** * Appends a new child to the specified (parent) node. * * @param {Element} node Parent element. * @param {Node} child Child node to append. * @return {Node} Newly appended node. */ function domAppendChild(node, child) { return node.appendChild(child); } /** * Sets display to default. * * @param {Element} node The dom element to manipulate. */ function displayDefault(node) { node.style[CSS_display] = ''; } /** * Sets display to none. Doing this as a function saves a few bytes for * the 'style.display' property and the 'none' literal. * * @param {Element} node The dom element to manipulate. */ function displayNone(node) { node.style[CSS_display] = 'none'; } /** * Sets position style attribute to absolute. * * @param {Element} node The dom element to manipulate. */ function positionAbsolute(node) { node.style[CSS_position] = 'absolute'; } /** * Inserts a new child before a given sibling. * * @param {Node} newChild Node to insert. * @param {Node} oldChild Sibling node. * @return {Node} Reference to new child. */ function domInsertBefore(newChild, oldChild) { return oldChild.parentNode.insertBefore(newChild, oldChild); } /** * Replaces an old child node with a new child node. * * @param {Node} newChild New child to append. * @param {Node} oldChild Old child to remove. * @return {Node} Replaced node. */ function domReplaceChild(newChild, oldChild) { return oldChild.parentNode.replaceChild(newChild, oldChild); } /** * Removes a node from the DOM. * * @param {Node} node The node to remove. * @return {Node} The removed node. */ function domRemoveNode(node) { return domRemoveChild(node.parentNode, node); } /** * Remove a child from the specified (parent) node. * * @param {Element} node Parent element. * @param {Node} child Child node to remove. * @return {Node} Removed node. */ function domRemoveChild(node, child) { return node.removeChild(child); } /** * Trim whitespace from begin and end of string. * * @see testStringTrim(); * * @param {string} str Input string. * @return {string} Trimmed string. */ function stringTrim(str) { return stringTrimRight(stringTrimLeft(str)); } /** * Trim whitespace from beginning of string. * * @see testStringTrimLeft(); * * @param {string} str Input string. * @return {string} Trimmed string. */ function stringTrimLeft(str) { return str.replace(/^\s+/, ""); } /** * Trim whitespace from end of string. * * @see testStringTrimRight(); * * @param {string} str Input string. * @return {string} Trimmed string. */ function stringTrimRight(str) { return str.replace(/\s+$/, ""); } /** * Author: Steffen Meschkat <mesch@google.com> * * @fileoverview This class is used to evaluate expressions in a local * context. Used by JstProcessor. */ /** * Names of special variables defined by the jstemplate evaluation * context. These can be used in js expression in jstemplate * attributes. */ var VAR_index = '$index'; var VAR_count = '$count'; var VAR_this = '$this'; var VAR_context = '$context'; var VAR_top = '$top'; /** * The name of the global variable which holds the value to be returned if * context evaluation results in an error. * Use JsEvalContext.setGlobal(GLOB_default, value) to set this. */ var GLOB_default = '$default'; /** * Un-inlined literals, to avoid object creation in IE6. TODO(mesch): * So far, these are only used here, but we could use them thoughout * the code and thus move them to constants.js. */ var CHAR_colon = ':'; var REGEXP_semicolon = /\s*;\s*/; /** * See constructor_() * @param {Object|null} opt_data * @param {Object} opt_parent * @constructor */ function JsEvalContext(opt_data, opt_parent) { this.constructor_.apply(this, arguments); } /** * Context for processing a jstemplate. The context contains a context * object, whose properties can be referred to in jstemplate * expressions, and it holds the locally defined variables. * * @param {Object|null} opt_data The context object. Null if no context. * * @param {Object} opt_parent The parent context, from which local * variables are inherited. Normally the context object of the parent * context is the object whose property the parent object is. Null for the * context of the root object. */ JsEvalContext.prototype.constructor_ = function(opt_data, opt_parent) { var me = this; /** * The context for variable definitions in which the jstemplate * expressions are evaluated. Other than for the local context, * which replaces the parent context, variable definitions of the * parent are inherited. The special variable $this points to data_. * * If this instance is recycled from the cache, then the property is * already initialized. * * @type {Object} */ if (!me.vars_) { me.vars_ = {}; } if (opt_parent) { copyProperties(me.vars_, opt_parent.vars_); } else { copyProperties(me.vars_, JsEvalContext.globals_); } /** * The current context object is assigned to the special variable * $this so it is possible to use it in expressions. * @type Object */ me.vars_[VAR_this] = opt_data; /** * The entire context structure is exposed as a variable so it can be * passed to javascript invocations through jseval. */ me.vars_[VAR_context] = me; /** * The local context of the input data in which the jstemplate * expressions are evaluated. Notice that this is usually an Object, * but it can also be a scalar value (and then still the expression * $this can be used to refer to it). Notice this can even be value, * undefined or null. Hence, we have to protect jsexec() from using * undefined or null, yet we want $this to reflect the true value of * the current context. Thus we assign the original value to $this, * above, but for the expression context we replace null and * undefined by the empty string. * * @type {Object|null} */ me.data_ = getDefaultObject(opt_data, STRING_empty); if (!opt_parent) { me.vars_[VAR_top] = me.data_; } }; /** * A map of globally defined symbols. Every instance of JsExprContext * inherits them in its vars_. * @type Object */ JsEvalContext.globals_ = {} /** * Sets a global symbol. It will be available like a variable in every * JsEvalContext instance. This is intended mainly to register * immutable global objects, such as functions, at load time, and not * to add global data at runtime. I.e. the same objections as to * global variables in general apply also here. (Hence the name * "global", and not "global var".) * @param {string} name * @param {Object|null} value */ JsEvalContext.setGlobal = function(name, value) { JsEvalContext.globals_[name] = value; }; /** * Set the default value to be returned if context evaluation results in an * error. (This can occur if a non-existent value was requested). */ JsEvalContext.setGlobal(GLOB_default, null); /** * A cache to reuse JsEvalContext instances. (IE6 perf) * * @type Array.<JsEvalContext> */ JsEvalContext.recycledInstances_ = []; /** * A factory to create a JsEvalContext instance, possibly reusing * one from recycledInstances_. (IE6 perf) * * @param {Object} opt_data * @param {JsEvalContext} opt_parent * @return {JsEvalContext} */ JsEvalContext.create = function(opt_data, opt_parent) { if (jsLength(JsEvalContext.recycledInstances_) > 0) { var instance = JsEvalContext.recycledInstances_.pop(); JsEvalContext.call(instance, opt_data, opt_parent); return instance; } else { return new JsEvalContext(opt_data, opt_parent); } }; /** * Recycle a used JsEvalContext instance, so we can avoid creating one * the next time we need one. (IE6 perf) * * @param {JsEvalContext} instance */ JsEvalContext.recycle = function(instance) { for (var i in instance.vars_) { delete instance.vars_[i]; } instance.data_ = null; JsEvalContext.recycledInstances_.push(instance); }; /** * Executes a function created using jsEvalToFunction() in the context * of vars, data, and template. * * @param {Function} exprFunction A javascript function created from * a jstemplate attribute value. * * @param {Element} template DOM node of the template. * * @return {Object|null} The value of the expression from which * exprFunction was created in the current js expression context and * the context of template. */ JsEvalContext.prototype.jsexec = function(exprFunction, template) { try { return exprFunction.call(template, this.vars_, this.data_); } catch (e) { log('jsexec EXCEPTION: ' + e + ' at ' + template + ' with ' + exprFunction); return JsEvalContext.globals_[GLOB_default]; } }; /** * Clones the current context for a new context object. The cloned * context has the data object as its context object and the current * context as its parent context. It also sets the $index variable to * the given value. This value usually is the position of the data * object in a list for which a template is instantiated multiply. * * @param {Object} data The new context object. * * @param {number} index Position of the new context when multiply * instantiated. (See implementation of jstSelect().) * * @param {number} count The total number of contexts that were multiply * instantiated. (See implementation of jstSelect().) * * @return {JsEvalContext} */ JsEvalContext.prototype.clone = function(data, index, count) { var ret = JsEvalContext.create(data, this); ret.setVariable(VAR_index, index); ret.setVariable(VAR_count, count); return ret; }; /** * Binds a local variable to the given value. If set from jstemplate * jsvalue expressions, variable names must start with $, but in the * API they only have to be valid javascript identifier. * * @param {string} name * * @param {Object?} value */ JsEvalContext.prototype.setVariable = function(name, value) { this.vars_[name] = value; }; /** * Returns the value bound to the local variable of the given name, or * undefined if it wasn't set. There is no way to distinguish a * variable that wasn't set from a variable that was set to * undefined. Used mostly for testing. * * @param {string} name * * @return {Object?} value */ JsEvalContext.prototype.getVariable = function(name) { return this.vars_[name]; }; /** * Evaluates a string expression within the scope of this context * and returns the result. * * @param {string} expr A javascript expression * @param {Element} opt_template An optional node to serve as "this" * * @return {Object?} value */ JsEvalContext.prototype.evalExpression = function(expr, opt_template) { var exprFunction = jsEvalToFunction(expr); return this.jsexec(exprFunction, opt_template); }; /** * Uninlined string literals for jsEvalToFunction() (IE6 perf). */ var STRING_a = 'a_'; var STRING_b = 'b_'; var STRING_with = 'with (a_) with (b_) return '; /** * Cache for jsEvalToFunction results. * @type Object */ JsEvalContext.evalToFunctionCache_ = {}; /** * Evaluates the given expression as the body of a function that takes * vars and data as arguments. Since the resulting function depends * only on expr, we cache the result so we save some Function * invocations, and some object creations in IE6. * * @param {string} expr A javascript expression. * * @return {Function} A function that returns the value of expr in the * context of vars and data. */ function jsEvalToFunction(expr) { if (!JsEvalContext.evalToFunctionCache_[expr]) { try { JsEvalContext.evalToFunctionCache_[expr] = new Function(STRING_a, STRING_b, STRING_with + expr); } catch (e) { log('jsEvalToFunction (' + expr + ') EXCEPTION ' + e); } } return JsEvalContext.evalToFunctionCache_[expr]; } /** * Evaluates the given expression to itself. This is meant to pass * through string attribute values. * * @param {string} expr * * @return {string} */ function jsEvalToSelf(expr) { return expr; } /** * Parses the value of the jsvalues attribute in jstemplates: splits * it up into a map of labels and expressions, and creates functions * from the expressions that are suitable for execution by * JsEvalContext.jsexec(). All that is returned as a flattened array * of pairs of a String and a Function. * * @param {string} expr * * @return {Array} */ function jsEvalToValues(expr) { var ret = []; var values = expr.split(REGEXP_semicolon); for (var i = 0, I = jsLength(values); i < I; ++i) { var colon = values[i].indexOf(CHAR_colon); if (colon < 0) { continue; } var label = stringTrim(values[i].substr(0, colon)); var value = jsEvalToFunction(values[i].substr(colon + 1)); ret.push(label, value); } return ret; } /** * Parses the value of the jseval attribute of jstemplates: splits it * up into a list of expressions, and creates functions from the * expressions that are suitable for execution by * JsEvalContext.jsexec(). All that is returned as an Array of * Function. * * @param {string} expr * * @return {Array.<Function>} */ function jsEvalToExpressions(expr) { var ret = []; var values = expr.split(REGEXP_semicolon); for (var i = 0, I = jsLength(values); i < I; ++i) { if (values[i]) { var value = jsEvalToFunction(values[i]); ret.push(value); } } return ret; } /** * Author: Steffen Meschkat <mesch@google.com> * * @fileoverview A simple formatter to project JavaScript data into * HTML templates. The template is edited in place. I.e. in order to * instantiate a template, clone it from the DOM first, and then * process the cloned template. This allows for updating of templates: * If the templates is processed again, changed values are merely * updated. * * NOTE(mesch): IE DOM doesn't have importNode(). * * NOTE(mesch): The property name "length" must not be used in input * data, see comment in jstSelect_(). */ /** * Names of jstemplate attributes. These attributes are attached to * normal HTML elements and bind expression context data to the HTML * fragment that is used as template. */ var ATT_select = 'jsselect'; var ATT_instance = 'jsinstance'; var ATT_display = 'jsdisplay'; var ATT_values = 'jsvalues'; var ATT_vars = 'jsvars'; var ATT_eval = 'jseval'; var ATT_transclude = 'transclude'; var ATT_content = 'jscontent'; var ATT_skip = 'jsskip'; /** * Name of the attribute that caches a reference to the parsed * template processing attribute values on a template node. */ var ATT_jstcache = 'jstcache'; /** * Name of the property that caches the parsed template processing * attribute values on a template node. */ var PROP_jstcache = '__jstcache'; /** * ID of the element that contains dynamically loaded jstemplates. */ var STRING_jsts = 'jsts'; /** * Un-inlined string literals, to avoid object creation in * IE6. */ var CHAR_asterisk = '*'; var CHAR_dollar = '$'; var CHAR_period = '.'; var CHAR_ampersand = '&amp;'; var STRING_div = 'div'; var STRING_id = 'id'; var STRING_asteriskzero = '*0'; var STRING_zero = '0'; /** * HTML template processor. Data values are bound to HTML templates * using the attributes transclude, jsselect, jsdisplay, jscontent, * jsvalues. The template is modifed in place. The values of those * attributes are JavaScript expressions that are evaluated in the * context of the data object fragment. * * @param {JsEvalContext} context Context created from the input data * object. * * @param {Element} template DOM node of the template. This will be * processed in place. After processing, it will still be a valid * template that, if processed again with the same data, will remain * unchanged. * * @param {boolean} opt_debugging Optional flag to collect debugging * information while processing the template. Only takes effect * in MAPS_DEBUG. */ function jstProcess(context, template, opt_debugging) { var processor = new JstProcessor; JstProcessor.prepareTemplate_(template); /** * Caches the document of the template node, so we don't have to * access it through ownerDocument. * @type Document */ processor.document_ = ownerDocument(template); processor.run_(bindFully(processor, processor.jstProcessOuter_, context, template)); } /** * Internal class used by jstemplates to maintain context. This is * necessary to process deep templates in Safari which has a * relatively shallow maximum recursion depth of 100. * @class * @constructor */ function JstProcessor() { } /** * Counter to generate node ids. These ids will be stored in * ATT_jstcache and be used to lookup the preprocessed js attributes * from the jstcache_. The id is stored in an attribute so it * suvives cloneNode() and thus cloned template nodes can share the * same cache entry. * @type number */ JstProcessor.jstid_ = 0; /** * Map from jstid to processed js attributes. * @type Object */ JstProcessor.jstcache_ = {}; /** * The neutral cache entry. Used for all nodes that don't have any * jst attributes. We still set the jsid attribute on those nodes so * we can avoid to look again for all the other jst attributes that * aren't there. Remember: not only the processing of the js * attribute values is expensive and we thus want to cache it. The * access to the attributes on the Node in the first place is * expensive too. */ JstProcessor.jstcache_[0] = {}; /** * Map from concatenated attribute string to jstid. * The key is the concatenation of all jst atributes found on a node * formatted as "name1=value1&amp;name2=value2&amp;...", in the order defined by * JST_ATTRIBUTES. The value is the id of the jstcache_ entry that can * be used for this node. This allows the reuse of cache entries in cases * when a cached entry already exists for a given combination of attribute * values. (For example when two different nodes in a template share the same * JST attributes.) * @type Object */ JstProcessor.jstcacheattributes_ = {}; /** * Map for storing temporary attribute values in prepareNode_() so they don't * have to be retrieved twice. (IE6 perf) * @type Object */ JstProcessor.attributeValues_ = {}; /** * A list for storing non-empty attributes found on a node in prepareNode_(). * The array is global since it can be reused - this way there is no need to * construct a new array object for each invocation. (IE6 perf) * @type Array */ JstProcessor.attributeList_ = []; /** * Prepares the template: preprocesses all jstemplate attributes. * * @param {Element} template */ JstProcessor.prepareTemplate_ = function(template) { if (!template[PROP_jstcache]) { domTraverseElements(template, function(node) { JstProcessor.prepareNode_(node); }); } }; /** * A list of attributes we use to specify jst processing instructions, * and the functions used to parse their values. * * @type Array.<Array> */ var JST_ATTRIBUTES = [ [ ATT_select, jsEvalToFunction ], [ ATT_display, jsEvalToFunction ], [ ATT_values, jsEvalToValues ], [ ATT_vars, jsEvalToValues ], [ ATT_eval, jsEvalToExpressions ], [ ATT_transclude, jsEvalToSelf ], [ ATT_content, jsEvalToFunction ], [ ATT_skip, jsEvalToFunction ] ]; /** * Prepares a single node: preprocesses all template attributes of the * node, and if there are any, assigns a jsid attribute and stores the * preprocessed attributes under the jsid in the jstcache. * * @param {Element} node * * @return {Object} The jstcache entry. The processed jst attributes * are properties of this object. If the node has no jst attributes, * returns an object with no properties (the jscache_[0] entry). */ JstProcessor.prepareNode_ = function(node) { if (node[PROP_jstcache]) { return node[PROP_jstcache]; } var jstid = domGetAttribute(node, ATT_jstcache); if (jstid != null) { return node[PROP_jstcache] = JstProcessor.jstcache_[jstid]; } var attributeValues = JstProcessor.attributeValues_; var attributeList = JstProcessor.attributeList_; attributeList.length = 0; for (var i = 0, I = jsLength(JST_ATTRIBUTES); i < I; ++i) { var name = JST_ATTRIBUTES[i][0]; var value = domGetAttribute(node, name); attributeValues[name] = value; if (value != null) { attributeList.push(name + "=" + value); } } if (attributeList.length == 0) { domSetAttribute(node, ATT_jstcache, STRING_zero); return node[PROP_jstcache] = JstProcessor.jstcache_[0]; } var attstring = attributeList.join(CHAR_ampersand); if (jstid = JstProcessor.jstcacheattributes_[attstring]) { domSetAttribute(node, ATT_jstcache, jstid); return node[PROP_jstcache] = JstProcessor.jstcache_[jstid]; } var jstcache = {}; for (var i = 0, I = jsLength(JST_ATTRIBUTES); i < I; ++i) { var att = JST_ATTRIBUTES[i]; var name = att[0]; var parse = att[1]; var value = attributeValues[name]; if (value != null) { jstcache[name] = parse(value); } } jstid = STRING_empty + ++JstProcessor.jstid_; domSetAttribute(node, ATT_jstcache, jstid); JstProcessor.jstcache_[jstid] = jstcache; JstProcessor.jstcacheattributes_[attstring] = jstid; return node[PROP_jstcache] = jstcache; }; /** * Runs the given function in our state machine. * * It's informative to view the set of all function calls as a tree: * - nodes are states * - edges are state transitions, implemented as calls to the pending * functions in the stack. * - pre-order function calls are downward edges (recursion into call). * - post-order function calls are upward edges (return from call). * - leaves are nodes which do not recurse. * We represent the call tree as an array of array of calls, indexed as * stack[depth][index]. Here [depth] indexes into the call stack, and * [index] indexes into the call queue at that depth. We require a call * queue so that a node may branch to more than one child * (which will be called serially), typically due to a loop structure. * * @param {Function} f The first function to run. */ JstProcessor.prototype.run_ = function(f) { var me = this; /** * A stack of queues of pre-order calls. * The inner arrays (constituent queues) are structured as * [ arg2, arg1, method, arg2, arg1, method, ...] * ie. a flattened array of methods with 2 arguments, in reverse order * for efficient push/pop. * * The outer array is a stack of such queues. * * @type Array.<Array> */ var calls = me.calls_ = []; /** * The index into the queue for each depth. NOTE: Alternative would * be to maintain the queues in reverse order (popping off of the * end) but the repeated calls to .pop() consumed 90% of this * function's execution time. * @type Array.<number> */ var queueIndices = me.queueIndices_ = []; /** * A pool of empty arrays. Minimizes object allocation for IE6's benefit. * @type Array.<Array> */ var arrayPool = me.arrayPool_ = []; f(); var queue, queueIndex; var method, arg1, arg2; var temp; while (calls.length) { queue = calls[calls.length - 1]; queueIndex = queueIndices[queueIndices.length - 1]; if (queueIndex >= queue.length) { me.recycleArray_(calls.pop()); queueIndices.pop(); continue; } method = queue[queueIndex++]; arg1 = queue[queueIndex++]; arg2 = queue[queueIndex++]; queueIndices[queueIndices.length - 1] = queueIndex; method.call(me, arg1, arg2); } }; /** * Pushes one or more functions onto the stack. These will be run in sequence, * interspersed with any recursive calls that they make. * * This method takes ownership of the given array! * * @param {Array} args Array of method calls structured as * [ method, arg1, arg2, method, arg1, arg2, ... ] */ JstProcessor.prototype.push_ = function(args) { this.calls_.push(args); this.queueIndices_.push(0); }; /** * Enable/disable debugging. * @param {boolean} debugging New state */ JstProcessor.prototype.setDebugging = function(debugging) { }; JstProcessor.prototype.createArray_ = function() { if (this.arrayPool_.length) { return this.arrayPool_.pop(); } else { return []; } }; JstProcessor.prototype.recycleArray_ = function(array) { arrayClear(array); this.arrayPool_.push(array); }; /** * Implements internals of jstProcess. This processes the two * attributes transclude and jsselect, which replace or multiply * elements, hence the name "outer". The remainder of the attributes * is processed in jstProcessInner_(), below. That function * jsProcessInner_() only processes attributes that affect an existing * node, but doesn't create or destroy nodes, hence the name * "inner". jstProcessInner_() is called through jstSelect_() if there * is a jsselect attribute (possibly for newly created clones of the * current template node), or directly from here if there is none. * * @param {JsEvalContext} context * * @param {Element} template */ JstProcessor.prototype.jstProcessOuter_ = function(context, template) { var me = this; var jstAttributes = me.jstAttributes_(template); var transclude = jstAttributes[ATT_transclude]; if (transclude) { var tr = jstGetTemplate(transclude); if (tr) { domReplaceChild(tr, template); var call = me.createArray_(); call.push(me.jstProcessOuter_, context, tr); me.push_(call); } else { %
DS born 12/2011
DD born 03/2014

Re: Computer virus alert

  • I get that too, but I am pretty sure it's safe.
    Our IVF Miracles! Lilypie Premature Baby tickers
  • Loading the player...
  • I Googled "magicalkingdoms" and it looks like you can get tickers for Disney vacations.  I doubt it's harmful. :)
  • Someone has a Disney-themed ticker, maybe that's it??
    Warning No formatter is installed for the format bbhtml
  • The disney themed ticker from that website is not a virus.

    I have had it in my own siggy and my computer is hyper protected thanks to Mr Techie.

    Warning No formatter is installed for the format bbhtml
  • I have a magical kingdoms ticker. So you think its ok?? Mari and Lina have one too I think.

    I hope they are ok.

    New to 3T? Check out this website first:
    TroubleTTC

    image
    Every new beginning comes from some other beginning's end --Semisonic

    **TTC since 04/09, C/P 02/02/10; 4 weeks, 3 days**
    **Dx: Anovulation, Hypothryroidism, Mild Endo, Pituitary Adenoma (prolactin issues), PAI-1, MFI **

    **7/10: Clomid + TI= BFN**
    **3/2/11: 1st RE appointment**
    **DH= Morph= 2%, Motility= 30%**
    **HSG= All clear!!**
    **3/11: Femara + Pregnyl + TI= BFN**
    **5/17/11: Laparoscopy / hysteroscopy = mild endo**
    **7/11: Novarel + IUI #1= BFN (7mil, 75% motility, 2% morph)**
    **8/11: Femara + Novarel + IUI #2= BFN (11mil, 35% motility, 1% morph)**
    **11/11: Femara + Novarel + IUI #3= BFN (9mil, 2% morph)**
    **Jan 2012: Follistim (75ius) + IUI #4= CANCELLED due to cyst -put on bcp**
    **Feb 2012: Follistim (75ius) + Novarel + IUI #4.2= BFFN (2.5mil, 13% motility, 1% morph)**
    **Mar 2012: Follistim (100ius) + IUI #5= CANCELLED due to 35mm & 14mm cysts**
    **On med break indefinitely...IF Sucks!**

    **Jan 2013: Follistim (100ius) + IUI #5.2= CANCELLED due to high prolactin level, MRI scheduled, pituitary adenoma found, put on Dostinex**
    **Mar 2013: Follistim (100ius) + IUI #5.3= CANCELLED due to uterine polyp, surgery scheduled for polypectomy and D&C**
    **03/22/13: Hysteroscopy, polypectomy and D&C**
    **May 2013: Finally got to start a cycle!!! Follistim (100ius) + IUI #5.4 = BFFN (6mil, 74% motility, 2% morph)** 

    **Jun 2013: Decide to start IVF**
    IVF w/ICSI #1 (Long Lupron Protocol)
    06/26/13: Start BCPs
    07/02/13: HSG #2= all clear
    07/15/13: Start Lupron 10 ius
    07/25/13: Suppression check
    07/28/13: Start stims (225IUs Follistim + 75IUs Menopur) drop to 5 IUs Lupron
    08/01/13: Monitoring: 12 follicles all about 10mm, E2- 313
    08/04/13: Monitoring: 18 follicles (15mm, 13mm, a few 11mm, rest 10mm or below) E2- 1,505
    Start Augmentin- antibiotic prep
    08/06/13: Monitoring: 13 follicles (18mm, 17mm, rest b/w 15mm-16mm!) Ready to trigger!! E2- 2,248
    08/08/13: ER-- 14R, 13M, 10F 
    08/11/13: One fertilized late, we now have 11 embryos!
    08/13/13: 5dt-- 2 blasts (Sheldon and Penny) 3AA and 3BB, none to freeze
    8/23/13: BFFN... Sheldon and Penny didn't stick**

    **8/29/13: Follow up... bad fragmentation issues. Changing protocol to Antagonist for round #2 coming soon! Also started on 81mg Aspirin after getting blood panel done and found out I have PAI-1**

    **Oct 2013: After large cysts, finally starting IVF #2**
    IVF w/ICSI #2 (Antagonist Protocol)
    BCPs started back in Sept due to cysts
    10/27/13: Start stims (225 IUs Gonal-F + 75 IUs Menopur)
    11/03/13 - 11/05/13: Add Ganirelix to the mix
    11/06/13: 3 follicles at 18mm-- Ready to trigger!
    11/08/13: ER-- 17R, 13M, 8F
    11/13/13: 5dt-- 2 blasts (Luke and Leia) 5AB and 4AB, 1 frostie
    11/20/13- 11/23/13: light positives on FRERs and Wondofos
    11/22/13: BFN per RE office (under HCG of 10)
    11/27/13: CP ::sigh::

    *12/03/13: Follow up...great response and quality this time, was given 50% chance of it working, just didn't stick. Great plan for 2014! 

    **Jan 2014: Last IVF of our SRP**
    IVF w/ICSI, freeze all, then FET
    12/27/13: Start BCPs
    01/19/14: Stims (375 IUs Gonal-F + 75 IUs Menopur)

    Congratulations Cutebride!! --TWINS!! Congratulations, Luvie, on your sweet boy! Congrats, Jess! So happy for you ladies! <3<3  
    ~~Also best of luck to Kati, illinigal, and youngin!~~

    *S/PAIFW*

    image
  • Yes, they are ok.

    I just had Mr Techie run the securities and registration on the site. He says it's good.

    Warning No formatter is installed for the format bbhtml
This discussion has been closed.
Choose Another Board
Search Boards
"
"