|
|
(37 intermediate revisions not shown) |
Line 1: |
Line 1: |
| <html> | | <html> |
| | | |
- | <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script> | + | <!-- MathJax (LaTeX for the web) --> |
| + | <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> |
| + | |
| | | |
| <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script> | | <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script> |
- |
| |
- |
| |
- | <script>
| |
- | (function() {
| |
- | var supports = (function() {
| |
- | var supports = {};
| |
- |
| |
- | var html;
| |
- | var work = this.document.createElement('div');
| |
- |
| |
- | html = "<P><I></P></I>";
| |
- | work.innerHTML = html;
| |
- | supports.tagSoup = work.innerHTML !== html;
| |
- |
| |
- | work.innerHTML = "<P><i><P></P></i></P>";
| |
- | supports.selfClose = work.childNodes.length === 2;
| |
- |
| |
- | return supports;
| |
- | })();
| |
- |
| |
- |
| |
- |
| |
- | // Regular Expressions for parsing tags and attributes
| |
- | var startTag = /^<([\-A-Za-z0-9_]+)((?:\s+[\w\-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
| |
- | var endTag = /^<\/([\-A-Za-z0-9_]+)[^>]*>/;
| |
- | var attr = /([\-A-Za-z0-9_]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
| |
- | var fillAttr = /^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noresize|noshade|nowrap|readonly|selected)$/i;
| |
- |
| |
- | var DEBUG = false;
| |
- |
| |
- | function htmlParser(stream, options) {
| |
- | stream = stream || '';
| |
- |
| |
- | // Options
| |
- | options = options || {};
| |
- |
| |
- | for(var key in supports) {
| |
- | if(supports.hasOwnProperty(key)) {
| |
- | if(options.autoFix) {
| |
- | options['fix_'+key] = true;//!supports[key];
| |
- | }
| |
- | options.fix = options.fix || options['fix_'+key];
| |
- | }
| |
- | }
| |
- |
| |
- | var stack = [];
| |
- |
| |
- | var append = function(str) {
| |
- | stream += str;
| |
- | };
| |
- |
| |
- | var prepend = function(str) {
| |
- | stream = str + stream;
| |
- | };
| |
- |
| |
- | // Order of detection matters: detection of one can only
| |
- | // succeed if detection of previous didn't
| |
- | var detect = {
| |
- | comment: /^<!--/,
| |
- | endTag: /^<\//,
| |
- | atomicTag: /^<\s*(script|style|noscript|iframe|textarea)[\s>]/i,
| |
- | startTag: /^</,
| |
- | chars: /^[^<]/
| |
- | };
| |
- |
| |
- | // Detection has already happened when a reader is called.
| |
- | var reader = {
| |
- |
| |
- | comment: function() {
| |
- | var index = stream.indexOf("-->");
| |
- | if ( index >= 0 ) {
| |
- | return {
| |
- | content: stream.substr(4, index),
| |
- | length: index + 3
| |
- | };
| |
- | }
| |
- | },
| |
- |
| |
- | endTag: function() {
| |
- | var match = stream.match( endTag );
| |
- |
| |
- | if ( match ) {
| |
- | return {
| |
- | tagName: match[1],
| |
- | length: match[0].length
| |
- | };
| |
- | }
| |
- | },
| |
- |
| |
- | atomicTag: function() {
| |
- | var start = reader.startTag();
| |
- | if(start) {
| |
- | var rest = stream.slice(start.length);
| |
- | // for optimization, we check first just for the end tag
| |
- | if(rest.match(new RegExp("<\/\\s*" + start.tagName + "\\s*>", "i"))) {
| |
- | // capturing the content is inefficient, so we do it inside the if
| |
- | var match = rest.match(new RegExp("([\\s\\S]*?)<\/\\s*" + start.tagName + "\\s*>", "i"));
| |
- | if(match) {
| |
- | // good to go
| |
- | return {
| |
- | tagName: start.tagName,
| |
- | attrs: start.attrs,
| |
- | content: match[1],
| |
- | length: match[0].length + start.length
| |
- | };
| |
- | }
| |
- | }
| |
- | }
| |
- | },
| |
- |
| |
- | startTag: function() {
| |
- | var match = stream.match( startTag );
| |
- |
| |
- | if ( match ) {
| |
- | var attrs = {};
| |
- |
| |
- | match[2].replace(attr, function(match, name) {
| |
- | var value = arguments[2] || arguments[3] || arguments[4] ||
| |
- | fillAttr.test(name) && name || null;
| |
- |
| |
- | attrs[name] = value;
| |
- | });
| |
- |
| |
- | return {
| |
- | tagName: match[1],
| |
- | attrs: attrs,
| |
- | unary: !!match[3],
| |
- | length: match[0].length
| |
- | };
| |
- | }
| |
- | },
| |
- |
| |
- | chars: function() {
| |
- | var index = stream.indexOf("<");
| |
- | return {
| |
- | length: index >= 0 ? index : stream.length
| |
- | };
| |
- | }
| |
- | };
| |
- |
| |
- | var readToken = function() {
| |
- |
| |
- | // Enumerate detects in order
| |
- | for (var type in detect) {
| |
- |
| |
- | if(detect[type].test(stream)) {
| |
- | if(DEBUG) { console.log('suspected ' + type); }
| |
- |
| |
- | var token = reader[type]();
| |
- | if(token) {
| |
- | if(DEBUG) { console.log('parsed ' + type, token); }
| |
- | // Type
| |
- | token.type = token.type || type;
| |
- | // Entire text
| |
- | token.text = stream.substr(0, token.length);
| |
- | // Update the stream
| |
- | stream = stream.slice(token.length);
| |
- |
| |
- | return token;
| |
- | }
| |
- | return null;
| |
- | }
| |
- | }
| |
- | };
| |
- |
| |
- | var readTokens = function(handlers) {
| |
- | var tok;
| |
- | while(tok = readToken()) {
| |
- | // continue until we get an explicit "false" return
| |
- | if(handlers[tok.type] && handlers[tok.type](tok) === false) {
| |
- | return;
| |
- | }
| |
- | }
| |
- | };
| |
- |
| |
- | var clear = function() {
| |
- | var rest = stream;
| |
- | stream = '';
| |
- | return rest;
| |
- | };
| |
- |
| |
- | var rest = function() {
| |
- | return stream;
| |
- | };
| |
- |
| |
- | if(options.fix) {
| |
- | (function() {
| |
- | // Empty Elements - HTML 4.01
| |
- | var EMPTY = /^(AREA|BASE|BASEFONT|BR|COL|FRAME|HR|IMG|INPUT|ISINDEX|LINK|META|PARAM|EMBED)$/i;
| |
- |
| |
- | // Elements that you can| intentionally| leave open
| |
- | // (and which close themselves)
| |
- | var CLOSESELF = /^(COLGROUP|DD|DT|LI|OPTIONS|P|TD|TFOOT|TH|THEAD|TR)$/i;
| |
- |
| |
- |
| |
- | var stack = [];
| |
- | stack.last = function() {
| |
- | return this[this.length - 1];
| |
- | };
| |
- | stack.lastTagNameEq = function(tagName) {
| |
- | var last = this.last();
| |
- | return last && last.tagName &&
| |
- | last.tagName.toUpperCase() === tagName.toUpperCase();
| |
- | };
| |
- |
| |
- | stack.containsTagName = function(tagName) {
| |
- | for(var i = 0, tok; tok = this[i]; i++) {
| |
- | if(tok.tagName === tagName) {
| |
- | return true;
| |
- | }
| |
- | }
| |
- | return false;
| |
- | };
| |
- |
| |
- | var correct = function(tok) {
| |
- | if(tok && tok.type === 'startTag') {
| |
- | // unary
| |
- | tok.unary = EMPTY.test(tok.tagName) || tok.unary;
| |
- | }
| |
- | return tok;
| |
- | };
| |
- |
| |
- | var readTokenImpl = readToken;
| |
- |
| |
- | var peekToken = function() {
| |
- | var tmp = stream;
| |
- | var tok = correct(readTokenImpl());
| |
- | stream = tmp;
| |
- | return tok;
| |
- | };
| |
- |
| |
- | var closeLast = function() {
| |
- | var tok = stack.pop();
| |
- |
| |
- | // prepend close tag to stream.
| |
- | prepend('</'+tok.tagName+'>');
| |
- | };
| |
- |
| |
- | var handlers = {
| |
- | startTag: function(tok) {
| |
- | var tagName = tok.tagName;
| |
- | // Fix tbody
| |
- | if(tagName.toUpperCase() === 'TR' && stack.lastTagNameEq('TABLE')) {
| |
- | prepend('<TBODY>');
| |
- | prepareNextToken();
| |
- | } else if(options.fix_selfClose &&
| |
- | CLOSESELF.test(tagName) &&
| |
- | stack.containsTagName(tagName)) {
| |
- | if(stack.lastTagNameEq(tagName)) {
| |
- | closeLast();
| |
- | } else {
| |
- | prepend('</'+tok.tagName+'>');
| |
- | prepareNextToken();
| |
- | }
| |
- | } else if (!tok.unary) {
| |
- | stack.push(tok);
| |
- | }
| |
- | },
| |
- |
| |
- | endTag: function(tok) {
| |
- | var last = stack.last();
| |
- | if(last) {
| |
- | if(options.fix_tagSoup && !stack.lastTagNameEq(tok.tagName)) {
| |
- | // cleanup tag soup
| |
- | closeLast();
| |
- | } else {
| |
- | stack.pop();
| |
- | }
| |
- | } else if (options.fix_tagSoup) {
| |
- | // cleanup tag soup part 2: skip this token
| |
- | skipToken();
| |
- | }
| |
- | }
| |
- | };
| |
- |
| |
- | var skipToken = function() {
| |
- | // shift the next token
| |
- | readTokenImpl();
| |
- |
| |
- | prepareNextToken();
| |
- | };
| |
- |
| |
- | var prepareNextToken = function() {
| |
- | var tok = peekToken();
| |
- | if(tok && handlers[tok.type]) {
| |
- | handlers[tok.type](tok);
| |
- | }
| |
- | };
| |
- |
| |
- | // redefine readToken
| |
- | readToken = function() {
| |
- | prepareNextToken();
| |
- | return correct(readTokenImpl());
| |
- | };
| |
- | })();
| |
- | }
| |
- |
| |
- | return {
| |
- | append: append,
| |
- | readToken: readToken,
| |
- | readTokens: readTokens,
| |
- | clear: clear,
| |
- | rest: rest,
| |
- | stack: stack
| |
- | };
| |
- |
| |
- | }
| |
- |
| |
- | htmlParser.supports = supports;
| |
- |
| |
- | htmlParser.tokenToString = function(tok) {
| |
- | var handler = {
| |
- | comment: function(tok) {
| |
- | return '<--' + tok.content + '-->';
| |
- | },
| |
- | endTag: function(tok) {
| |
- | return '</'+tok.tagName+'>';
| |
- | },
| |
- | atomicTag: function(tok) {
| |
- | console.log(tok);
| |
- | return handler.startTag(tok) +
| |
- | tok.content +
| |
- | handler.endTag(tok);
| |
- | },
| |
- | startTag: function(tok) {
| |
- | var str = '<'+tok.tagName;
| |
- | for (var key in tok.attrs) {
| |
- | var val = tok.attrs[key];
| |
- | // escape quotes
| |
- | str += ' '+key+'="'+(val ? val.replace(/(^|[^\\])"/g, '$1\\\"') : '')+'"';
| |
- | }
| |
- | return str + (tok.unary ? '/>' : '>');
| |
- | },
| |
- | chars: function(tok) {
| |
- | return tok.text;
| |
- | }
| |
- | };
| |
- | return handler[tok.type](tok);
| |
- | };
| |
- |
| |
- | htmlParser.escapeAttributes = function(attrs) {
| |
- | var escapedAttrs = {};
| |
- | // escape double-quotes for writing html as a string
| |
- |
| |
- | for(var name in attrs) {
| |
- | var value = attrs[name];
| |
- | escapedAttrs[name] = value && value.replace(/(^|[^\\])"/g, '$1\\\"');
| |
- | }
| |
- | return escapedAttrs;
| |
- | };
| |
- |
| |
- | for(var key in supports) {
| |
- | htmlParser.browserHasFlaw = htmlParser.browserHasFlaw || (!supports[key]) && key;
| |
- | }
| |
- |
| |
- | this.htmlParser = htmlParser;
| |
- | })();
| |
| </script> | | </script> |
| | | |
- | | + | <script src="http://lokeshdhakar.com/projects/lightbox2/js/jquery-1.11.0.min.js"></script> |
- | | + | <script src="http://lokeshdhakar.com/projects/lightbox2/js/lightbox.js"></script> |
- | <script> | + | |
- | | + | |
- | // postscribe.js 1.1.2
| + | |
- | // (c) Copyright 2012 to the present, Krux
| + | |
- | // postscribe is freely distributable under the MIT license.
| + | |
- | // For all details and documentation:
| + | |
- | // http://krux.github.com/postscribe
| + | |
- | | + | |
- | | + | |
- | (function() {
| + | |
- | | + | |
- | var global = this;
| + | |
- | | + | |
- | if(global.postscribe) {
| + | |
- | return;
| + | |
- | }
| + | |
- | | + | |
- | // Debug write tasks.
| + | |
- | var DEBUG = true;
| + | |
- | | + | |
- | // Turn on to debug how each chunk affected the DOM.
| + | |
- | var DEBUG_CHUNK = false;
| + | |
- | | + | |
- | // # Helper Functions
| + | |
- | | + | |
- | var slice = Array.prototype.slice;
| + | |
- | | + | |
- | // A function that intentionally does nothing.
| + | |
- | function doNothing() {}
| + | |
- | | + | |
- | | + | |
- | // Is this a function?
| + | |
- | function isFunction(x) {
| + | |
- | return "function" === typeof x;
| + | |
- | }
| + | |
- | | + | |
- | // Loop over each item in an array-like value.
| + | |
- | function each(arr, fn, _this) {
| + | |
- | var i, len = (arr && arr.length) || 0;
| + | |
- | for(i = 0; i < len; i++) {
| + | |
- | fn.call(_this, arr[i], i);
| + | |
- | }
| + | |
- | }
| + | |
- | | + | |
- | // Loop over each key/value pair in a hash.
| + | |
- | function eachKey(obj, fn, _this) {
| + | |
- | var key;
| + | |
- | for(key in obj) {
| + | |
- | if(obj.hasOwnProperty(key)) {
| + | |
- | fn.call(_this, key, obj[key]);
| + | |
- | }
| + | |
- | }
| + | |
- | }
| + | |
- | | + | |
- | // Set properties on an object.
| + | |
- | function set(obj, props) {
| + | |
- | eachKey(props, function(key, value) {
| + | |
- | obj[key] = value;
| + | |
- | });
| + | |
- | return obj;
| + | |
- | }
| + | |
- | | + | |
- | // Set default options where some option was not specified.
| + | |
- | function defaults(options, _defaults) {
| + | |
- | options = options || {};
| + | |
- | eachKey(_defaults, function(key, val) {
| + | |
- | if(options[key] == null) {
| + | |
- | options[key] = val;
| + | |
- | }
| + | |
- | });
| + | |
- | return options;
| + | |
- | }
| + | |
- | | + | |
- | // Convert value (e.g., a NodeList) to an array.
| + | |
- | function toArray(obj) {
| + | |
- | try {
| + | |
- | return slice.call(obj);
| + | |
- | } catch(e) {
| + | |
- | var ret = [];
| + | |
- | each(obj, function(val) {
| + | |
- | ret.push(val);
| + | |
- | });
| + | |
- | return ret;
| + | |
- | }
| + | |
- | }
| + | |
- | | + | |
- | // Test if token is a script tag.
| + | |
- | function isScript(tok) {
| + | |
- | return (/^script$/i).test(tok.tagName);
| + | |
- | }
| + | |
- | | + | |
- | // # Class WriteStream
| + | |
- | | + | |
- | // Stream static html to an element, where "static html" denotes "html without scripts".
| + | |
- | | + | |
- | // This class maintains a *history of writes devoid of any attributes* or "proxy history".
| + | |
- | // Injecting the proxy history into a temporary div has no side-effects,
| + | |
- | // other than to create proxy elements for previously written elements.
| + | |
- | | + | |
- | // Given the `staticHtml` of a new write, a `tempDiv`'s innerHTML is set to `proxy_history + staticHtml`.
| + | |
- | // The *structure* of `tempDiv`'s contents, (i.e., the placement of new nodes beside or inside of proxy elements),
| + | |
- | // reflects the DOM structure that would have resulted if all writes had been squashed into a single write.
| + | |
- | | + | |
- | // For each descendent `node` of `tempDiv` whose parentNode is a *proxy*, `node` is appended to the corresponding *real* element within the DOM.
| + | |
- | | + | |
- | // Proxy elements are mapped to *actual* elements in the DOM by injecting a data-id attribute into each start tag in `staticHtml`.
| + | |
- | var WriteStream = (function(){
| + | |
- | | + | |
- | // Prefix for data attributes on DOM elements.
| + | |
- | var BASEATTR = 'data-ps-';
| + | |
- | | + | |
- | // get / set data attributes
| + | |
- | function data(el, name, value) {
| + | |
- | var attr = BASEATTR + name;
| + | |
- | | + | |
- | if(arguments.length === 2) {
| + | |
- | // Get
| + | |
- | var val = el.getAttribute(attr);
| + | |
- | | + | |
- | // IE 8 returns a number if it's a number
| + | |
- | return val == null ? val : String(val);
| + | |
- | | + | |
- | } else if( value != null && value !== '') {
| + | |
- | // Set
| + | |
- | el.setAttribute(attr, value);
| + | |
- | | + | |
- | } else {
| + | |
- | // Remove
| + | |
- | el.removeAttribute(attr);
| + | |
- | }
| + | |
- | }
| + | |
- | | + | |
- | function WriteStream(root, options) {
| + | |
- | var doc = root.ownerDocument;
| + | |
- | | + | |
- | set(this, {
| + | |
- | root: root,
| + | |
- | | + | |
- | options: options,
| + | |
- | | + | |
- | win: doc.defaultView || doc.parentWindow,
| + | |
- | | + | |
- | doc: doc,
| + | |
- | | + | |
- | parser: global.htmlParser('', { autoFix: true }),
| + | |
- | | + | |
- | // Actual elements by id.
| + | |
- | actuals: [root],
| + | |
- | | + | |
- | // Embodies the "structure" of what's been written so far, devoid of attributes.
| + | |
- | proxyHistory: '',
| + | |
- | | + | |
- | // Create a proxy of the root element.
| + | |
- | proxyRoot: doc.createElement(root.nodeName),
| + | |
- | | + | |
- | scriptStack: [],
| + | |
- | | + | |
- | writeQueue: []
| + | |
- | });
| + | |
- | | + | |
- | data(this.proxyRoot, 'proxyof', 0);
| + | |
- | | + | |
- | }
| + | |
- | | + | |
- | | + | |
- | WriteStream.prototype.write = function() {
| + | |
- | [].push.apply(this.writeQueue, arguments);
| + | |
- | // Process writes
| + | |
- | // When new script gets pushed or pending this will stop
| + | |
- | // because new writeQueue gets pushed
| + | |
- | var arg;
| + | |
- | while(!this.deferredRemote &&
| + | |
- | this.writeQueue.length) {
| + | |
- | arg = this.writeQueue.shift();
| + | |
- | | + | |
- | if(isFunction(arg)) {
| + | |
- | this.callFunction(arg);
| + | |
- | } else {
| + | |
- | this.writeImpl(arg);
| + | |
- | }
| + | |
- | }
| + | |
- | };
| + | |
- | | + | |
- | WriteStream.prototype.callFunction = function(fn) {
| + | |
- | var tok = { type: "function", value: fn.name || fn.toString() };
| + | |
- | this.onScriptStart(tok);
| + | |
- | fn.call(this.win, this.doc);
| + | |
- | this.onScriptDone(tok);
| + | |
- | };
| + | |
- | | + | |
- | WriteStream.prototype.writeImpl = function(html) {
| + | |
- | this.parser.append(html);
| + | |
- | | + | |
- | var tok, tokens = [];
| + | |
- | | + | |
- | // stop if we see a script token
| + | |
- | while((tok = this.parser.readToken()) && !isScript(tok)) {
| + | |
- | tokens.push(tok);
| + | |
- | }
| + | |
- | | + | |
- | this.writeStaticTokens(tokens);
| + | |
- | | + | |
- | if(tok) {
| + | |
- | this.handleScriptToken(tok);
| + | |
- | }
| + | |
- | };
| + | |
- | | + | |
- | | + | |
- | // ## Contiguous non-script tokens (a chunk)
| + | |
- | WriteStream.prototype.writeStaticTokens = function(tokens) {
| + | |
- | | + | |
- | var chunk = this.buildChunk(tokens);
| + | |
- | | + | |
- | if(!chunk.actual) {
| + | |
- | // e.g., no tokens, or a noscript that got ignored
| + | |
- | return;
| + | |
- | }
| + | |
- | chunk.html = this.proxyHistory + chunk.actual;
| + | |
- | this.proxyHistory += chunk.proxy;
| + | |
- | | + | |
- | this.proxyRoot.innerHTML = chunk.html;
| + | |
- | | + | |
- | if(DEBUG_CHUNK) {
| + | |
- | chunk.proxyInnerHTML = this.proxyRoot.innerHTML;
| + | |
- | }
| + | |
- | | + | |
- | this.walkChunk();
| + | |
- | | + | |
- | if(DEBUG_CHUNK) {
| + | |
- | chunk.actualInnerHTML = this.root.innerHTML; //root
| + | |
- | }
| + | |
- | | + | |
- | return chunk;
| + | |
- | };
| + | |
- | | + | |
- | | + | |
- | WriteStream.prototype.buildChunk = function (tokens) {
| + | |
- | var nextId = this.actuals.length,
| + | |
- | | + | |
- | // The raw html of this chunk.
| + | |
- | raw = [],
| + | |
- | | + | |
- | // The html to create the nodes in the tokens (with id's injected).
| + | |
- | actual = [],
| + | |
- | | + | |
- | // Html that can later be used to proxy the nodes in the tokens.
| + | |
- | proxy = [];
| + | |
- | | + | |
- | each(tokens, function(tok) {
| + | |
- | | + | |
- | raw.push(tok.text);
| + | |
- | | + | |
- | if(tok.attrs) { // tok.attrs <==> startTag or atomicTag or cursor
| + | |
- | // Ignore noscript tags. They are atomic, so we don't have to worry about children.
| + | |
- | if(!(/^noscript$/i).test(tok.tagName)) {
| + | |
- | var id = nextId++;
| + | |
- | | + | |
- | // Actual: inject id attribute: replace '>' at end of start tag with id attribute + '>'
| + | |
- | actual.push(
| + | |
- | tok.text.replace(/(\/?>)/, ' '+BASEATTR+'id='+id+' $1')
| + | |
- | );
| + | |
- | | + | |
- | // Don't proxy scripts: they have no bearing on DOM structure.
| + | |
- | if(tok.attrs.id !== "ps-script") {
| + | |
- | // Proxy: strip all attributes and inject proxyof attribute
| + | |
- | proxy.push(
| + | |
- | // ignore atomic tags (e.g., style): they have no "structural" effect
| + | |
- | tok.type === 'atomicTag' ? '' :
| + | |
- | '<'+tok.tagName+' '+BASEATTR+'proxyof='+id+(tok.unary ? '/>' : '>')
| + | |
- | );
| + | |
- | }
| + | |
- | }
| + | |
- | | + | |
- | } else {
| + | |
- | // Visit any other type of token
| + | |
- | // Actual: append.
| + | |
- | actual.push(tok.text);
| + | |
- | // Proxy: append endTags. Ignore everything else.
| + | |
- | proxy.push(tok.type === 'endTag' ? tok.text : '');
| + | |
- | }
| + | |
- | });
| + | |
- | | + | |
- | return {
| + | |
- | tokens: tokens,
| + | |
- | raw: raw.join(''),
| + | |
- | actual: actual.join(''),
| + | |
- | proxy: proxy.join('')
| + | |
- | };
| + | |
- | };
| + | |
- | | + | |
- | WriteStream.prototype.walkChunk = function() {
| + | |
- | var node, stack = [this.proxyRoot];
| + | |
- | | + | |
- | // use shift/unshift so that children are walked in document order
| + | |
- | | + | |
- | while((node = stack.shift()) != null) {
| + | |
- | | + | |
- | var isElement = node.nodeType === 1;
| + | |
- | var isProxy = isElement && data(node, 'proxyof');
| + | |
- | | + | |
- | // Ignore proxies
| + | |
- | if(!isProxy) {
| + | |
- | | + | |
- | if(isElement) {
| + | |
- | // New actual element: register it and remove the the id attr.
| + | |
- | this.actuals[data(node, 'id')] = node;
| + | |
- | data(node, 'id', null);
| + | |
- | }
| + | |
- | | + | |
- | // Is node's parent a proxy?
| + | |
- | var parentIsProxyOf = node.parentNode && data(node.parentNode, 'proxyof');
| + | |
- | if(parentIsProxyOf) {
| + | |
- | // Move node under actual parent.
| + | |
- | this.actuals[parentIsProxyOf].appendChild(node);
| + | |
- | }
| + | |
- | }
| + | |
- | // prepend childNodes to stack
| + | |
- | stack.unshift.apply(stack, toArray(node.childNodes));
| + | |
- | }
| + | |
- | };
| + | |
- | | + | |
- | // ### Script tokens
| + | |
- | | + | |
- | WriteStream.prototype.handleScriptToken = function(tok) {
| + | |
- | var remainder = this.parser.clear();
| + | |
- | | + | |
- | if(remainder) {
| + | |
- | // Write remainder immediately behind this script.
| + | |
- | this.writeQueue.unshift(remainder);
| + | |
- | }
| + | |
- | | + | |
- | tok.src = tok.attrs.src || tok.attrs.SRC;
| + | |
- | | + | |
- | if(tok.src && this.scriptStack.length) {
| + | |
- | // Defer this script until scriptStack is empty.
| + | |
- | // Assumption 1: This script will not start executing until
| + | |
- | // scriptStack is empty.
| + | |
- | this.deferredRemote = tok;
| + | |
- | } else {
| + | |
- | this.onScriptStart(tok);
| + | |
- | }
| + | |
- | | + | |
- | // Put the script node in the DOM.
| + | |
- | var _this = this;
| + | |
- | this.writeScriptToken(tok, function() {
| + | |
- | _this.onScriptDone(tok);
| + | |
- | });
| + | |
- | | + | |
- | };
| + | |
- | | + | |
- | WriteStream.prototype.onScriptStart = function(tok) {
| + | |
- | tok.outerWrites = this.writeQueue;
| + | |
- | this.writeQueue = [];
| + | |
- | this.scriptStack.unshift(tok);
| + | |
- | };
| + | |
- | | + | |
- | WriteStream.prototype.onScriptDone = function(tok) {
| + | |
- | // Pop script and check nesting.
| + | |
- | if(tok !== this.scriptStack[0]) {
| + | |
- | this.options.error({ message: "Bad script nesting or script finished twice" });
| + | |
- | return;
| + | |
- | }
| + | |
- | this.scriptStack.shift();
| + | |
- | | + | |
- | // Append outer writes to queue and process them.
| + | |
- | this.write.apply(this, tok.outerWrites);
| + | |
- | | + | |
- | // Check for pending remote
| + | |
- | | + | |
- | // Assumption 2: if remote_script1 writes remote_script2 then
| + | |
- | // the we notice remote_script1 finishes before remote_script2 starts.
| + | |
- | // I think this is equivalent to assumption 1
| + | |
- | if(!this.scriptStack.length && this.deferredRemote) {
| + | |
- | this.onScriptStart(this.deferredRemote);
| + | |
- | this.deferredRemote = null;
| + | |
- | }
| + | |
- | };
| + | |
- | | + | |
- | // Build a script and insert it into the DOM.
| + | |
- | // Done is called once script has executed.
| + | |
- | WriteStream.prototype.writeScriptToken = function(tok, done) {
| + | |
- | var el = this.buildScript(tok);
| + | |
- | | + | |
- | if(tok.src) {
| + | |
- | // Fix for attribute "SRC" (capitalized). IE does not recognize it.
| + | |
- | el.src = tok.src;
| + | |
- | this.scriptLoadHandler(el, done);
| + | |
- | }
| + | |
- | | + | |
- | try {
| + | |
- | this.insertScript(el);
| + | |
- | if(!tok.src) {
| + | |
- | done();
| + | |
- | }
| + | |
- | } catch(e) {
| + | |
- | this.options.error(e);
| + | |
- | done();
| + | |
- | }
| + | |
- | };
| + | |
- | | + | |
- | // Build a script element from an atomic script token.
| + | |
- | WriteStream.prototype.buildScript = function(tok) {
| + | |
- | var el = this.doc.createElement(tok.tagName);
| + | |
- | | + | |
- | // Set attributes
| + | |
- | eachKey(tok.attrs, function(name, value) {
| + | |
- | el.setAttribute(name, value);
| + | |
- | });
| + | |
- | | + | |
- | // Set content
| + | |
- | if(tok.content) {
| + | |
- | el.text = tok.content;
| + | |
- | }
| + | |
- | | + | |
- | return el;
| + | |
- | };
| + | |
- | | + | |
- | | + | |
- | // Insert script into DOM where it would naturally be written.
| + | |
- | WriteStream.prototype.insertScript = function(el) {
| + | |
- | // Append a span to the stream. That span will act as a cursor
| + | |
- | // (i.e. insertion point) for the script.
| + | |
- | this.writeImpl('<span id="ps-script"/>');
| + | |
- | | + | |
- | // Grab that span from the DOM.
| + | |
- | var cursor = this.doc.getElementById("ps-script");
| + | |
- | | + | |
- | // Replace cursor with script.
| + | |
- | cursor.parentNode.replaceChild(el, cursor);
| + | |
- | };
| + | |
- | | + | |
- | | + | |
- | WriteStream.prototype.scriptLoadHandler = function(el, done) {
| + | |
- | function cleanup() {
| + | |
- | el = el.onload = el.onreadystatechange = el.onerror = null;
| + | |
- | done();
| + | |
- | }
| + | |
- | | + | |
- | // Error handler
| + | |
- | var error = this.options.error;
| + | |
- | | + | |
- | // Set handlers
| + | |
- | set(el, {
| + | |
- | onload: function() { cleanup(); },
| + | |
- | | + | |
- | onreadystatechange: function() {
| + | |
- | if(/^(loaded|complete)$/.test( el.readyState )) {
| + | |
- | cleanup();
| + | |
- | }
| + | |
- | },
| + | |
- | | + | |
- | onerror: function() {
| + | |
- | error({ message: 'remote script failed ' + el.src });
| + | |
- | cleanup();
| + | |
- | }
| + | |
- | });
| + | |
- | };
| + | |
- | | + | |
- | return WriteStream;
| + | |
- | | + | |
- | }());
| + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | // Public-facing interface and queuing
| + | |
- | var postscribe = (function() {
| + | |
- | var nextId = 0;
| + | |
- | | + | |
- | var queue = [];
| + | |
- | | + | |
- | var active = null;
| + | |
- | | + | |
- | function nextStream() {
| + | |
- | var args = queue.shift();
| + | |
- | if(args) {
| + | |
- | args.stream = runStream.apply(null, args);
| + | |
- | }
| + | |
- | }
| + | |
- | | + | |
- | | + | |
- | function runStream(el, html, options) {
| + | |
- | active = new WriteStream(el, options);
| + | |
- | | + | |
- | // Identify this stream.
| + | |
- | active.id = nextId++;
| + | |
- | active.name = options.name || active.id;
| + | |
- | postscribe.streams[active.name] = active;
| + | |
- | | + | |
- | // Override document.write.
| + | |
- | var doc = el.ownerDocument;
| + | |
- | | + | |
- | var stash = { write: doc.write, writeln: doc.writeln };
| + | |
- | | + | |
- | function write(str) {
| + | |
- | str = options.beforeWrite(str);
| + | |
- | active.write(str);
| + | |
- | options.afterWrite(str);
| + | |
- | }
| + | |
- | | + | |
- | set(doc, { write: write, writeln: function(str) { write(str + '\n'); } });
| + | |
- | | + | |
- | // Override window.onerror
| + | |
- | var oldOnError = active.win.onerror || doNothing;
| + | |
- | | + | |
- | // This works together with the try/catch around WriteStream::insertScript
| + | |
- | // In modern browsers, exceptions in tag scripts go directly to top level
| + | |
- | active.win.onerror = function(msg, url, line) {
| + | |
- | options.error({ msg: msg + ' - ' + url + ':' + line });
| + | |
- | oldOnError.apply(active.win, arguments);
| + | |
- | };
| + | |
- | | + | |
- | // Write to the stream
| + | |
- | active.write(html, function streamDone() {
| + | |
- | // restore document.write
| + | |
- | set(doc, stash);
| + | |
- | | + | |
- | // restore window.onerror
| + | |
- | active.win.onerror = oldOnError;
| + | |
- | | + | |
- | options.done();
| + | |
- | active = null;
| + | |
- | nextStream();
| + | |
- | });
| + | |
- | | + | |
- | return active;
| + | |
- | }
| + | |
- | | + | |
- | | + | |
- | function postscribe(el, html, options) {
| + | |
- | if(isFunction(options)) {
| + | |
- | options = { done: options };
| + | |
- | }
| + | |
- | options = defaults(options, {
| + | |
- | done: doNothing,
| + | |
- | error: function(e) { throw e; },
| + | |
- | beforeWrite: function(str) { return str; },
| + | |
- | afterWrite: doNothing
| + | |
- | });
| + | |
- | | + | |
- | el =
| + | |
- | // id selector
| + | |
- | (/^#/).test(el) ? global.document.getElementById(el.substr(1)) :
| + | |
- | // jquery object. TODO: loop over all elements.
| + | |
- | el.jquery ? el[0] : el;
| + | |
- | | + | |
- | | + | |
- | var args = [el, html, options];
| + | |
- | | + | |
- | el.postscribe = {
| + | |
- | cancel: function() {
| + | |
- | if(args.stream) {
| + | |
- | // TODO: implement this
| + | |
- | args.stream.abort();
| + | |
- | } else {
| + | |
- | args[1] = doNothing;
| + | |
- | }
| + | |
- | }
| + | |
- | };
| + | |
- | | + | |
- | queue.push(args);
| + | |
- | if(!active) {
| + | |
- | nextStream();
| + | |
- | }
| + | |
- | | + | |
- | return el.postscribe;
| + | |
- | }
| + | |
- | | + | |
- | return set(postscribe, {
| + | |
- | // Streams by name.
| + | |
- | streams: {},
| + | |
- | // Queue of streams.
| + | |
- | queue: queue,
| + | |
- | // Expose internal classes.
| + | |
- | WriteStream: WriteStream
| + | |
- | });
| + | |
- | | + | |
- | }());
| + | |
- | | + | |
- | // export postscribe
| + | |
- | global.postscribe = postscribe;
| + | |
- | | + | |
- | }());
| + | |
- | | + | |
- | </script>
| + | |
- | | + | |
- | <script>
| + | |
- | | + | |
- | /**
| + | |
- | * AJAX Banner placement
| + | |
- | *
| + | |
- | * @param {int} uid
| + | |
- | * @param {int} lang
| + | |
- | * @param {int} typeNum
| + | |
- | * @param {string} startingPoint
| + | |
- | * @param {string} categories
| + | |
- | * @param {string} displayMode
| + | |
- | * @param {string} position
| + | |
- | * @param {string} hmac
| + | |
- | * @constructor
| + | |
- | */
| + | |
- | var BannerPlacement = function (uid, lang, typeNum, startingPoint, categories, displayMode, position, hmac) {
| + | |
- | var url = 'index.php?id=' + uid;
| + | |
- | url += '&L=' + lang;
| + | |
- | url += '&type=' + typeNum;
| + | |
- | url += '&tx_sfbanners_pi1[action]=getBanners';
| + | |
- | url += '&tx_sfbanners_pi1[currentPageUid]=' + uid;
| + | |
- | url += '&tx_sfbanners_pi1[hmac]=' + hmac;
| + | |
- | | + | |
- | if (typeof startingPoint !== 'undefined' && startingPoint !== '') {
| + | |
- | url += '&tx_sfbanners_pi1[startingPoint]=' + startingPoint;
| + | |
- | }
| + | |
- | | + | |
- | if (typeof categories !== 'undefined' && categories !== '') {
| + | |
- | url += '&tx_sfbanners_pi1[categories]=' + categories;
| + | |
- | }
| + | |
- | | + | |
- | if (typeof displayMode !== 'undefined' && displayMode !== '') {
| + | |
- | url += '&tx_sfbanners_pi1[displayMode]=' + displayMode;
| + | |
- | }
| + | |
- | | + | |
- | $.get(url, function(data) {
| + | |
- | postscribe('#' + position, data);
| + | |
- | });
| + | |
- | }
| + | |
- | | + | |
- | </script>
| + | |
- | | + | |
- | <script>
| + | |
- | /*
| + | |
- | * jQuery FlexSlider v2.1
| + | |
- | * Copyright 2012 WooThemes
| + | |
- | * Contributing Author: Tyler Smith
| + | |
- | */
| + | |
- | ; (function(d){d.flexslider=function(i,k){var a=d(i),c=d.extend({},d.flexslider.defaults,k),e=c.namespace,r="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch,s=r?"touchend":"click",l="vertical"===c.direction,m=c.reverse,h=0<c.itemWidth,q="fade"===c.animation,p=""!==c.asNavFor,f={};d.data(i,"flexslider",a);f={init:function(){a.animating=!1;a.currentSlide=c.startAt;a.animatingTo=a.currentSlide;a.atEnd=0===a.currentSlide||a.currentSlide===a.last;a.containerSelector=c.selector.substr(0,
| + | |
- | c.selector.search(" "));a.slides=d(c.selector,a);a.container=d(a.containerSelector,a);a.count=a.slides.length;a.syncExists=0<d(c.sync).length;"slide"===c.animation&&(c.animation="swing");a.prop=l?"top":"marginLeft";a.args={};a.manualPause=!1;var b=a,g;if(g=!c.video)if(g=!q)if(g=c.useCSS)a:{g=document.createElement("div");var n=["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"],e;for(e in n)if(void 0!==g.style[n[e]]){a.pfx=n[e].replace("Perspective","").toLowerCase();
| + | |
- | a.prop="-"+a.pfx+"-transform";g=!0;break a}g=!1}b.transitions=g;""!==c.controlsContainer&&(a.controlsContainer=0<d(c.controlsContainer).length&&d(c.controlsContainer));""!==c.manualControls&&(a.manualControls=0<d(c.manualControls).length&&d(c.manualControls));c.randomize&&(a.slides.sort(function(){return Math.round(Math.random())-0.5}),a.container.empty().append(a.slides));a.doMath();p&&f.asNav.setup();a.setup("init");c.controlNav&&f.controlNav.setup();c.directionNav&&f.directionNav.setup();c.keyboard&&
| + | |
- | (1===d(a.containerSelector).length||c.multipleKeyboard)&&d(document).bind("keyup",function(b){b=b.keyCode;if(!a.animating&&(b===39||b===37)){b=b===39?a.getTarget("next"):b===37?a.getTarget("prev"):false;a.flexAnimate(b,c.pauseOnAction)}});c.mousewheel&&a.bind("mousewheel",function(b,g){b.preventDefault();var d=g<0?a.getTarget("next"):a.getTarget("prev");a.flexAnimate(d,c.pauseOnAction)});c.pausePlay&&f.pausePlay.setup();c.slideshow&&(c.pauseOnHover&&a.hover(function(){!a.manualPlay&&!a.manualPause&&
| + | |
- | a.pause()},function(){!a.manualPause&&!a.manualPlay&&a.play()}),0<c.initDelay?setTimeout(a.play,c.initDelay):a.play());r&&c.touch&&f.touch();(!q||q&&c.smoothHeight)&&d(window).bind("resize focus",f.resize);setTimeout(function(){c.start(a)},200)},asNav:{setup:function(){a.asNav=!0;a.animatingTo=Math.floor(a.currentSlide/a.move);a.currentItem=a.currentSlide;a.slides.removeClass(e+"active-slide").eq(a.currentItem).addClass(e+"active-slide");a.slides.click(function(b){b.preventDefault();var b=d(this),
| + | |
- | g=b.index();!d(c.asNavFor).data("flexslider").animating&&!b.hasClass("active")&&(a.direction=a.currentItem<g?"next":"prev",a.flexAnimate(g,c.pauseOnAction,!1,!0,!0))})}},controlNav:{setup:function(){a.manualControls?f.controlNav.setupManual():f.controlNav.setupPaging()},setupPaging:function(){var b=1,g;a.controlNavScaffold=d('<ol class="'+e+"control-nav "+e+("thumbnails"===c.controlNav?"control-thumbs":"control-paging")+'"></ol>');if(1<a.pagingCount)for(var n=0;n<a.pagingCount;n++)g="thumbnails"===
| + | |
- | c.controlNav?'<img src="'+a.slides.eq(n).attr("data-thumb")+'"/>':"<a>"+b+"</a>",a.controlNavScaffold.append("<li>"+g+"</li>"),b++;a.controlsContainer?d(a.controlsContainer).append(a.controlNavScaffold):a.append(a.controlNavScaffold);f.controlNav.set();f.controlNav.active();a.controlNavScaffold.delegate("a, img",s,function(b){b.preventDefault();var b=d(this),g=a.controlNav.index(b);b.hasClass(e+"active")||(a.direction=g>a.currentSlide?"next":"prev",a.flexAnimate(g,c.pauseOnAction))});r&&a.controlNavScaffold.delegate("a",
| + | |
- | "click touchstart",function(a){a.preventDefault()})},setupManual:function(){a.controlNav=a.manualControls;f.controlNav.active();a.controlNav.live(s,function(b){b.preventDefault();var b=d(this),g=a.controlNav.index(b);b.hasClass(e+"active")||(g>a.currentSlide?a.direction="next":a.direction="prev",a.flexAnimate(g,c.pauseOnAction))});r&&a.controlNav.live("click touchstart",function(a){a.preventDefault()})},set:function(){a.controlNav=d("."+e+"control-nav li "+("thumbnails"===c.controlNav?"img":"a"),
| + | |
- | a.controlsContainer?a.controlsContainer:a)},active:function(){a.controlNav.removeClass(e+"active").eq(a.animatingTo).addClass(e+"active")},update:function(b,c){1<a.pagingCount&&"add"===b?a.controlNavScaffold.append(d("<li><a>"+a.count+"</a></li>")):1===a.pagingCount?a.controlNavScaffold.find("li").remove():a.controlNav.eq(c).closest("li").remove();f.controlNav.set();1<a.pagingCount&&a.pagingCount!==a.controlNav.length?a.update(c,b):f.controlNav.active()}},directionNav:{setup:function(){var b=d('<ul class="'+
| + | |
- | e+'direction-nav"><li><a class="'+e+'prev" href="#">'+c.prevText+'</a></li><li><a class="'+e+'next" href="#">'+c.nextText+"</a></li></ul>");a.controlsContainer?(d(a.controlsContainer).append(b),a.directionNav=d("."+e+"direction-nav li a",a.controlsContainer)):(a.append(b),a.directionNav=d("."+e+"direction-nav li a",a));f.directionNav.update();a.directionNav.bind(s,function(b){b.preventDefault();b=d(this).hasClass(e+"next")?a.getTarget("next"):a.getTarget("prev");a.flexAnimate(b,c.pauseOnAction)});
| + | |
- | r&&a.directionNav.bind("click touchstart",function(a){a.preventDefault()})},update:function(){var b=e+"disabled";1===a.pagingCount?a.directionNav.addClass(b):c.animationLoop?a.directionNav.removeClass(b):0===a.animatingTo?a.directionNav.removeClass(b).filter("."+e+"prev").addClass(b):a.animatingTo===a.last?a.directionNav.removeClass(b).filter("."+e+"next").addClass(b):a.directionNav.removeClass(b)}},pausePlay:{setup:function(){var b=d('<div class="'+e+'pauseplay"><a></a></div>');a.controlsContainer?
| + | |
- | (a.controlsContainer.append(b),a.pausePlay=d("."+e+"pauseplay a",a.controlsContainer)):(a.append(b),a.pausePlay=d("."+e+"pauseplay a",a));f.pausePlay.update(c.slideshow?e+"pause":e+"play");a.pausePlay.bind(s,function(b){b.preventDefault();if(d(this).hasClass(e+"pause")){a.manualPause=true;a.manualPlay=false;a.pause()}else{a.manualPause=false;a.manualPlay=true;a.play()}});r&&a.pausePlay.bind("click touchstart",function(a){a.preventDefault()})},update:function(b){"play"===b?a.pausePlay.removeClass(e+
| + | |
- | "pause").addClass(e+"play").text(c.playText):a.pausePlay.removeClass(e+"play").addClass(e+"pause").text(c.pauseText)}},touch:function(){function b(b){j=l?d-b.touches[0].pageY:d-b.touches[0].pageX;p=l?Math.abs(j)<Math.abs(b.touches[0].pageX-e):Math.abs(j)<Math.abs(b.touches[0].pageY-e);if(!p||500<Number(new Date)-k)b.preventDefault(),!q&&a.transitions&&(c.animationLoop||(j/=0===a.currentSlide&&0>j||a.currentSlide===a.last&&0<j?Math.abs(j)/o+2:1),a.setProps(f+j,"setTouch"))}function g(){if(a.animatingTo===
| + | |
- | a.currentSlide&&!p&&null!==j){var h=m?-j:j,l=0<h?a.getTarget("next"):a.getTarget("prev");a.canAdvance(l)&&(550>Number(new Date)-k&&50<Math.abs(h)||Math.abs(h)>o/2)?a.flexAnimate(l,c.pauseOnAction):a.flexAnimate(a.currentSlide,c.pauseOnAction,!0)}i.removeEventListener("touchmove",b,!1);i.removeEventListener("touchend",g,!1);f=j=e=d=null}var d,e,f,o,j,k,p=!1;i.addEventListener("touchstart",function(j){a.animating?j.preventDefault():1===j.touches.length&&(a.pause(),o=l?a.h:a.w,k=Number(new Date),f=h&&
| + | |
- | m&&a.animatingTo===a.last?0:h&&m?a.limit-(a.itemW+c.itemMargin)*a.move*a.animatingTo:h&&a.currentSlide===a.last?a.limit:h?(a.itemW+c.itemMargin)*a.move*a.currentSlide:m?(a.last-a.currentSlide+a.cloneOffset)*o:(a.currentSlide+a.cloneOffset)*o,d=l?j.touches[0].pageY:j.touches[0].pageX,e=l?j.touches[0].pageX:j.touches[0].pageY,i.addEventListener("touchmove",b,!1),i.addEventListener("touchend",g,!1))},!1)},resize:function(){!a.animating&&a.is(":visible")&&(h||a.doMath(),q?f.smoothHeight():h?(a.slides.width(a.computedW),
| + | |
- | a.update(a.pagingCount),a.setProps()):l?(a.viewport.height(a.h),a.setProps(a.h,"setTotal")):(c.smoothHeight&&f.smoothHeight(),a.newSlides.width(a.computedW),a.setProps(a.computedW,"setTotal")))},smoothHeight:function(b){if(!l||q){var c=q?a:a.viewport;b?c.animate({height:a.slides.eq(a.animatingTo).height()},b):c.height(a.slides.eq(a.animatingTo).height())}},sync:function(b){var g=d(c.sync).data("flexslider"),e=a.animatingTo;switch(b){case "animate":g.flexAnimate(e,c.pauseOnAction,!1,!0);break;case "play":!g.playing&&
| + | |
- | !g.asNav&&g.play();break;case "pause":g.pause()}}};a.flexAnimate=function(b,g,n,i,k){p&&1===a.pagingCount&&(a.direction=a.currentItem<b?"next":"prev");if(!a.animating&&(a.canAdvance(b,k)||n)&&a.is(":visible")){if(p&&i)if(n=d(c.asNavFor).data("flexslider"),a.atEnd=0===b||b===a.count-1,n.flexAnimate(b,!0,!1,!0,k),a.direction=a.currentItem<b?"next":"prev",n.direction=a.direction,Math.ceil((b+1)/a.visible)-1!==a.currentSlide&&0!==b)a.currentItem=b,a.slides.removeClass(e+"active-slide").eq(b).addClass(e+
| + | |
- | "active-slide"),b=Math.floor(b/a.visible);else return a.currentItem=b,a.slides.removeClass(e+"active-slide").eq(b).addClass(e+"active-slide"),!1;a.animating=!0;a.animatingTo=b;c.before(a);g&&a.pause();a.syncExists&&!k&&f.sync("animate");c.controlNav&&f.controlNav.active();h||a.slides.removeClass(e+"active-slide").eq(b).addClass(e+"active-slide");a.atEnd=0===b||b===a.last;c.directionNav&&f.directionNav.update();b===a.last&&(c.end(a),c.animationLoop||a.pause());if(q)a.slides.eq(a.currentSlide).fadeOut(c.animationSpeed,
| + | |
- | c.easing),a.slides.eq(b).fadeIn(c.animationSpeed,c.easing,a.wrapup);else{var o=l?a.slides.filter(":first").height():a.computedW;h?(b=c.itemWidth>a.w?2*c.itemMargin:c.itemMargin,b=(a.itemW+b)*a.move*a.animatingTo,b=b>a.limit&&1!==a.visible?a.limit:b):b=0===a.currentSlide&&b===a.count-1&&c.animationLoop&&"next"!==a.direction?m?(a.count+a.cloneOffset)*o:0:a.currentSlide===a.last&&0===b&&c.animationLoop&&"prev"!==a.direction?m?0:(a.count+1)*o:m?(a.count-1-b+a.cloneOffset)*o:(b+a.cloneOffset)*o;a.setProps(b,
| + | |
- | "",c.animationSpeed);if(a.transitions){if(!c.animationLoop||!a.atEnd)a.animating=!1,a.currentSlide=a.animatingTo;a.container.unbind("webkitTransitionEnd transitionend");a.container.bind("webkitTransitionEnd transitionend",function(){a.wrapup(o)})}else a.container.animate(a.args,c.animationSpeed,c.easing,function(){a.wrapup(o)})}c.smoothHeight&&f.smoothHeight(c.animationSpeed)}};a.wrapup=function(b){!q&&!h&&(0===a.currentSlide&&a.animatingTo===a.last&&c.animationLoop?a.setProps(b,"jumpEnd"):a.currentSlide===
| + | |
- | a.last&&(0===a.animatingTo&&c.animationLoop)&&a.setProps(b,"jumpStart"));a.animating=!1;a.currentSlide=a.animatingTo;c.after(a)};a.animateSlides=function(){a.animating||a.flexAnimate(a.getTarget("next"))};a.pause=function(){clearInterval(a.animatedSlides);a.playing=!1;c.pausePlay&&f.pausePlay.update("play");a.syncExists&&f.sync("pause")};a.play=function(){a.animatedSlides=setInterval(a.animateSlides,c.slideshowSpeed);a.playing=!0;c.pausePlay&&f.pausePlay.update("pause");a.syncExists&&f.sync("play")};
| + | |
- | a.canAdvance=function(b,g){var d=p?a.pagingCount-1:a.last;return g?!0:p&&a.currentItem===a.count-1&&0===b&&"prev"===a.direction?!0:p&&0===a.currentItem&&b===a.pagingCount-1&&"next"!==a.direction?!1:b===a.currentSlide&&!p?!1:c.animationLoop?!0:a.atEnd&&0===a.currentSlide&&b===d&&"next"!==a.direction?!1:a.atEnd&&a.currentSlide===d&&0===b&&"next"===a.direction?!1:!0};a.getTarget=function(b){a.direction=b;return"next"===b?a.currentSlide===a.last?0:a.currentSlide+1:0===a.currentSlide?a.last:a.currentSlide-
| + | |
- | 1};a.setProps=function(b,g,d){var e,f=b?b:(a.itemW+c.itemMargin)*a.move*a.animatingTo;e=-1*function(){if(h)return"setTouch"===g?b:m&&a.animatingTo===a.last?0:m?a.limit-(a.itemW+c.itemMargin)*a.move*a.animatingTo:a.animatingTo===a.last?a.limit:f;switch(g){case "setTotal":return m?(a.count-1-a.currentSlide+a.cloneOffset)*b:(a.currentSlide+a.cloneOffset)*b;case "setTouch":return b;case "jumpEnd":return m?b:a.count*b;case "jumpStart":return m?a.count*b:b;default:return b}}()+"px";a.transitions&&(e=l?
| + | |
- | "translate3d(0,"+e+",0)":"translate3d("+e+",0,0)",d=void 0!==d?d/1E3+"s":"0s",a.container.css("-"+a.pfx+"-transition-duration",d));a.args[a.prop]=e;(a.transitions||void 0===d)&&a.container.css(a.args)};a.setup=function(b){if(q)a.slides.css({width:"100%","float":"left",marginRight:"-100%",position:"relative"}),"init"===b&&a.slides.eq(a.currentSlide).fadeIn(c.animationSpeed,c.easing),c.smoothHeight&&f.smoothHeight();else{var g,n;"init"===b&&(a.viewport=d('<div class="'+e+'viewport"></div>').css({overflow:"hidden",
| + | |
- | position:"relative"}).appendTo(a).append(a.container),a.cloneCount=0,a.cloneOffset=0,m&&(n=d.makeArray(a.slides).reverse(),a.slides=d(n),a.container.empty().append(a.slides)));c.animationLoop&&!h&&(a.cloneCount=2,a.cloneOffset=1,"init"!==b&&a.container.find(".clone").remove(),a.container.append(a.slides.first().clone().addClass("clone")).prepend(a.slides.last().clone().addClass("clone")));a.newSlides=d(c.selector,a);g=m?a.count-1-a.currentSlide+a.cloneOffset:a.currentSlide+a.cloneOffset;l&&!h?(a.container.height(200*
| + | |
- | (a.count+a.cloneCount)+"%").css("position","absolute").width("100%"),setTimeout(function(){a.newSlides.css({display:"block"});a.doMath();a.viewport.height(a.h);a.setProps(g*a.h,"init")},"init"===b?100:0)):(a.container.width(200*(a.count+a.cloneCount)+"%"),a.setProps(g*a.computedW,"init"),setTimeout(function(){a.doMath();a.newSlides.css({width:a.computedW,"float":"left",display:"block"});c.smoothHeight&&f.smoothHeight()},"init"===b?100:0))}h||a.slides.removeClass(e+"active-slide").eq(a.currentSlide).addClass(e+
| + | |
- | "active-slide")};a.doMath=function(){var b=a.slides.first(),d=c.itemMargin,e=c.minItems,f=c.maxItems;a.w=a.width();a.h=b.height();a.boxPadding=b.outerWidth()-b.width();h?(a.itemT=c.itemWidth+d,a.minW=e?e*a.itemT:a.w,a.maxW=f?f*a.itemT:a.w,a.itemW=a.minW>a.w?(a.w-d*e)/e:a.maxW<a.w?(a.w-d*f)/f:c.itemWidth>a.w?a.w:c.itemWidth,a.visible=Math.floor(a.w/(a.itemW+d)),a.move=0<c.move&&c.move<a.visible?c.move:a.visible,a.pagingCount=Math.ceil((a.count-a.visible)/a.move+1),a.last=a.pagingCount-1,a.limit=1===
| + | |
- | a.pagingCount?0:c.itemWidth>a.w?(a.itemW+2*d)*a.count-a.w-d:(a.itemW+d)*a.count-a.w-d):(a.itemW=a.w,a.pagingCount=a.count,a.last=a.count-1);a.computedW=a.itemW-a.boxPadding};a.update=function(b,d){a.doMath();h||(b<a.currentSlide?a.currentSlide+=1:b<=a.currentSlide&&0!==b&&(a.currentSlide-=1),a.animatingTo=a.currentSlide);if(c.controlNav&&!a.manualControls)if("add"===d&&!h||a.pagingCount>a.controlNav.length)f.controlNav.update("add");else if("remove"===d&&!h||a.pagingCount<a.controlNav.length)h&&a.currentSlide>
| + | |
- | a.last&&(a.currentSlide-=1,a.animatingTo-=1),f.controlNav.update("remove",a.last);c.directionNav&&f.directionNav.update()};a.addSlide=function(b,e){var f=d(b);a.count+=1;a.last=a.count-1;l&&m?void 0!==e?a.slides.eq(a.count-e).after(f):a.container.prepend(f):void 0!==e?a.slides.eq(e).before(f):a.container.append(f);a.update(e,"add");a.slides=d(c.selector+":not(.clone)",a);a.setup();c.added(a)};a.removeSlide=function(b){var e=isNaN(b)?a.slides.index(d(b)):b;a.count-=1;a.last=a.count-1;isNaN(b)?d(b,
| + | |
- | a.slides).remove():l&&m?a.slides.eq(a.last).remove():a.slides.eq(b).remove();a.doMath();a.update(e,"remove");a.slides=d(c.selector+":not(.clone)",a);a.setup();c.removed(a)};f.init()};d.flexslider.defaults={namespace:"flex-",selector:".slides > li",animation:"fade",easing:"swing",direction:"horizontal",reverse:!1,animationLoop:!0,smoothHeight:!1,startAt:0,slideshow:!0,slideshowSpeed:7E3,animationSpeed:600,initDelay:0,randomize:!1,pauseOnAction:!0,pauseOnHover:!1,useCSS:!0,touch:!0,video:!1,controlNav:!0,
| + | |
- | directionNav:!0,prevText:"Previous",nextText:"Next",keyboard:!0,multipleKeyboard:!1,mousewheel:!1,pausePlay:!1,pauseText:"Pause",playText:"Play",controlsContainer:"",manualControls:"",sync:"",asNavFor:"",itemWidth:0,itemMargin:0,minItems:0,maxItems:0,move:0,start:function(){},before:function(){},after:function(){},end:function(){},added:function(){},removed:function(){}};d.fn.flexslider=function(i){void 0===i&&(i={});if("object"===typeof i)return this.each(function(){var a=d(this),c=a.find(i.selector?
| + | |
- | i.selector:".slides > li");1===c.length?(c.fadeIn(400),i.start&&i.start(a)):void 0===a.data("flexslider")&&new d.flexslider(this,i)});var k=d(this).data("flexslider");switch(i){case "play":k.play();break;case "pause":k.pause();break;case "next":k.flexAnimate(k.getTarget("next"),!0);break;case "prev":case "previous":k.flexAnimate(k.getTarget("prev"),!0);break;default:"number"===typeof i&&k.flexAnimate(i,!0)}}})(jQuery);
| + | |
- | | + | |
- | </script> | + | |
- | | + | |
- | | + | |
- | <script>
| + | |
- | // Can also be used with $(document).ready()
| + | |
- | jQuery(window).load(function() {
| + | |
- | jQuery('#slider').flexslider({
| + | |
- | animation: "slide"
| + | |
- | });
| + | |
- | jQuery('#slider img').removeAttr('width').removeAttr('height');
| + | |
- | });
| + | |
- | </script>
| + | |
- | | + | |
- | <script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script> | + | |
- | | + | |
- | <script>
| + | |
- | | + | |
- | // decrypt helper function
| + | |
- | function decryptCharcode(n,start,end,offset) {
| + | |
- | n = n + offset;
| + | |
- | if (offset > 0 && n > end) {
| + | |
- | n = start + (n - end - 1);
| + | |
- | } else if (offset < 0 && n < start) {
| + | |
- | n = end - (start - n - 1);
| + | |
- | }
| + | |
- | return String.fromCharCode(n);
| + | |
- | }
| + | |
- | // decrypt string
| + | |
- | function decryptString(enc,offset) {
| + | |
- | var dec = "";
| + | |
- | var len = enc.length;
| + | |
- | for(var i=0; i < len; i++) {
| + | |
- | var n = enc.charCodeAt(i);
| + | |
- | if (n >= 0x2B && n <= 0x3A) {
| + | |
- | dec += decryptCharcode(n,0x2B,0x3A,offset); // 0-9 . , - + / :
| + | |
- | } else if (n >= 0x40 && n <= 0x5A) {
| + | |
- | dec += decryptCharcode(n,0x40,0x5A,offset); // A-Z @
| + | |
- | } else if (n >= 0x61 && n <= 0x7A) {
| + | |
- | dec += decryptCharcode(n,0x61,0x7A,offset); // a-z
| + | |
- | } else {
| + | |
- | dec += enc.charAt(i);
| + | |
- | }
| + | |
- | }
| + | |
- | return dec;
| + | |
- | }
| + | |
- | // decrypt spam-protected emails
| + | |
- | function linkTo_UnCryptMailto(s) {
| + | |
- | location.href = decryptString(s,-2);
| + | |
- | }
| + | |
- |
| + | |
- | </script> | + | |
| | | |
| </html> | | </html> |