/*
 * Play Blog Parts for Engekilife
 * Blog Parts Kit + Engekilife
 * $Id$
 */
//window.onerror = function () { alert(arguments[0] + arguments[1] + "\nLine: " + arguments[2]); };

if (!window.EngekilifePlayBlogParts) {
    (function() {
        var BABlogPartsKit = {
            /**
            * ブログパーツキットの初期化
            */
            initialize: function() {
                this.EJS = EJS;
                this.Environment = new BAEnvironment();
                this.getElementsBySelector = getElementsBySelector;
                this.sharedAsyncWorker = new BAAsyncWorker();
                this.scriptElement = (function(e) { if (e.nodeName.toLowerCase() == 'script') return e; return arguments.callee(e.lastChild) })(document);
                this.onloadEvents = [];
                this.sharedWatchWorker = new BAAsyncWorker(50);

                this.addEventListener(window, 'load', function() {
                    BABlogPartsKit.contentLoaded = true;
                    for (var i = 0; i < BABlogPartsKit.onloadEvents.length; i++) {
                        BABlogPartsKit.onloadEvents[i]();
                    }
                }, false);
            }

            /**
            * ブログパーツをページに登録し初期化します。
            */
            , register: function(blogPartsName, templates, initializer) {
                var ua = this.Environment.ua;
                // 特定のWinIE 6以上, Gecko, Safari 3以上, Opera 8以降
                if ((ua.isWinIE && ua.revision >= 6) || (ua.isGecko) || (ua.isSafari && ua.revision >= 400) || (ua.isOpera && ua.revision >= 8)) {
                    if (!window[blogPartsName]) {
                        window[blogPartsName] = new BABlogPartsKit.PartsBase(blogPartsName, templates, initializer);
                        window[blogPartsName].initialize();
                    }
                }
                return window[blogPartsName];
            }

            /**
            * セレクタを指定して要素を取得します。
            */
            , getElementsBySelector: getElementsBySelector

            , addEventListener: function(e, eventName, func, capture) {
                if (e.addEventListener)
                    e.addEventListener(eventName, func, capture);
                else
                    e.attachEvent('on' + eventName, func);
            }

            , isContentLoaded: function() {
                if (this.Environment.ua.isIE) {
                    return this.contentLoaded;
                } else if (document.body.readyState) {
                    return document.body.readyState == 'complete';
                } else {
                    return true;
                }
            }
            , contentLoaded: false

            , registerOnLoadEvent: function(f) {
                this.onloadEvents.push(f);
            }
        };

        /**
        * ブログパーツのベースとなるオブジェクト
        */
        BABlogPartsKit.PartsBase = function(blogPartsName, templates, initializer) {
            this.templates = templates;
            this.blogPartsName = blogPartsName;
            this.initializer = initializer;
            this.alternateClassName = 'blogparts-' + this.blogPartsName + '-alternate';
            this.BlogPartsKit = BABlogPartsKit;
        };
        BABlogPartsKit.PartsBase.prototype = {
            templates: []
            , compiledTemplates: {}
            , callbacks: []
            , blogPartsName: ''
            , callbackParamName: 'callback'
            , initializer: null
            , alternateClassName: null
            , callJSONPQueue: []

            , initialize: function() {
                this.compiledTemplates = {};
                for (var i = 0; i < this.templates.length; i++) {
                    var tmpl = this.templates[i];
                    tmpl.compiled = new EJS(tmpl.source, { useWith: true });
                    this.compiledTemplates[tmpl.name] = tmpl;
                }

                var self = this;
                BABlogPartsKit.registerOnLoadEvent(function() {
                    for (var i = 0; i < self.callJSONPQueue.length; i++) {
                        var item = self.callJSONPQueue[i];
                        self.callJSONPWithTemplate(item[0][0], item[0][1], item[0][2], item[0][3], item[0][4], item[1]);
                    }
                }, false);

                if (this.initializer)
                    this.initializer();
            }

            , getPlaceholderId: function(callbackId) {
                return 'blogpartskit-placeholder-' + this.blogPartsName + '-' + callbackId;
            }

            , getCallbackName: function(callbackId) {
                return [this.blogPartsName, '.callbacks[', callbackId, ']'].join('');
            }

            , setTemplate: function(name, template) {
                if (typeof (template) == 'string') {
                    var newTmpl = this.compiledTemplates[name] || {};
                    newTmpl.name = name;
                    newTmpl.source = template;
                    newTmpl.compiled = new BABlogPartsKit.EJS(template, { useWith: true });
                    this.compiledTemplates[name] = newTmpl;
                } else {
                    template.name = name;
                    template.compiled = new BABlogPartsKit.EJS(template.template, { useWith: true });
                    this.compiledTemplates[name] = template;
                }
            }

            , hideAlternateElements: function(callbackId) {
                var nextSibE = document.getElementById(this.getPlaceholderId(callbackId));
                if (nextSibE != null) {
                    while (nextSibE = nextSibE.nextSibling) {
                        if (nextSibE.className == this.alternateClassName) {
                            nextSibE.parentNode.removeChild(nextSibE);
                            break;
                        }
                    }
                }
            }

            , registerCallback: function(callbackId, templateName, callbackBefore, callbackAfter, callbackFixup) {
                var self = this;
                this.callbacks[callbackId] = function(data) {
                    var e = document.getElementById(self.getPlaceholderId(callbackId));
                    if (callbackBefore != null) {
                        if (!callbackBefore.apply(self, [data, callbackId, templateName]))
                            return;
                    }

                    var body = self.compiledTemplates[templateName].compiled.run(data);

                    if (callbackAfter != null) {
                        var retVal = callbackAfter.apply(self, [data, callbackId, templateName, body]);
                        if (retVal)
                            body = retVal;
                    }

                    // 代替表示を隠す
                    if (self.alternateClassName)
                        self.hideAlternateElements(callbackId);

                    // IEでinnerHTMLが読み取り専用となり未知のエラーが発生するのを回避する
                    var e2 = document.createElement('div');
                    e2.innerHTML = body;
                    e.appendChild(e2);

                    // イベントをくっつける
                    if (self.compiledTemplates[templateName].events instanceof Array) {
                        for (var i = 0, n = self.compiledTemplates[templateName].events.length; i < n; i++) {
                            var eventDecl = self.compiledTemplates[templateName].events[i];
                            var selectors = (eventDecl.selector instanceof Array ? eventDecl.selector : [eventDecl.selector]);
                            for (var j = 0; j < selectors.length; j++) {
                                var elements = BABlogPartsKit.getElementsBySelector(selectors[j], e);
                                for (var k = 0, m = elements.length; k < m; k++) {
                                    var e2 = elements[k];
                                    var f = function(eventDeclC, e, e2) { return function(event) { eventDeclC.handler(e, e2, event); } };
                                    BABlogPartsKit.addEventListener(e2, eventDecl.eventName, f(eventDecl, e, e2), false);
                                }
                            }
                        }
                    }

                    e.style.display = 'block';

                    if (self.compiledTemplates[templateName].onElementGenerated != null) {
                        self.compiledTemplates[templateName].onElementGenerated(data, callbackId, templateName, e);
                    }
                    if (callbackFixup != null) {
                        var retVal = callbackFixup.apply(self, [data, callbackId, templateName, e]);
                    }
                };
            }

            /**
            * リクエストが完了した際に表示されるテンプレートを指定してJSONPのリクエストを発行し、
            * 必要であればコールバックを登録します。
            */
            , callJSONPWithTemplate: function(url, templateName, callbackBefore, callbackAfter, callbackFixup, scriptE) {
                if (scriptE == null)
                    scriptE = (function(e) { if (e.nodeName.toLowerCase() == 'script') return e; return arguments.callee(e.lastChild) })(document);

                if (!BABlogPartsKit.isContentLoaded()) {
                    this.callJSONPQueue.push([arguments, scriptE]);
                    return;
                }

                var callbackId = this.callbacks.length;
                var container = (scriptE.parentNode.tagName == 'HEAD' ? document.body : scriptE.parentNode);
                var placeholderE = document.createElement('div');
                placeholderE.style.border = '0 none transparent';
                placeholderE.style.display = 'none';
                placeholderE.style.margin = '0';
                placeholderE.style.padding = '0';
                placeholderE.id = this.getPlaceholderId(callbackId);
                container.insertBefore(placeholderE, scriptE);

                this.registerCallback(callbackId, templateName, callbackBefore, callbackAfter, callbackFixup);
                this.requestJSONP(url, this.callbackParamName, this.getCallbackName(callbackId));
            }

            /**
            * 指定されたコールバック名でJSONPリクエストを実行します。
            */
            , requestJSONP: function(url, callbackParamName, callbackName) {
                BABlogPartsKit.sharedAsyncWorker.callAsync([url, (url.indexOf('?') > 0 ? '&' : '?'), callbackParamName, '=', callbackName, '&dummyDate=', (new Date()).toString()].join(''));
            }
        };

        BAAsyncWorker = function(interval, maxExecTime, execCount) {
            /// <summary>非同期処理を行なうクラス</summary>
            /// <param name="interval">処理のインターバル(ms)</param>
            /// <param name="maxExecTime">一度あたりの処理の最大時間(ms)</param>
            /// <param name="execCount">一度あたりの最大処理数(ms)</param>
            if (interval)
                this.interval = interval;
            if (maxExecTime)
                this.maxExecutionTime = maxExecTime;
            if (execCount)
                this.executeCount = execCount;

            this.requestQueue = [];
        };
        BAAsyncWorker.prototype = {
            // 処理のインターバル
            interval: 200

            // 一度あたりの処理の最大時間
            // この値を超えた場合には次のリクエストは次回タイマー呼び出し時まで先送りされます。
            , maxExecutionTime: 10

            /// 一度あたりの最大処理数
            /// この値を超えた場合には次のリクエストは次回タイマー呼び出し時まで先送りされます。
            , executeCount: 5

            , debugMode: (window.BA ? BA.debugMode : false)

            , timerId: null
            , requestQueue: null
            , requestProc: function() {
                var count = 0;
                var urlOrFuncWithStateObj;
                var fragment = document.createDocumentFragment();
                var startAt = new Date();

                while ((this.requestQueue.length != 0) && (urlOrFuncWithStateObj = this.requestQueue.shift())) {
                    var urlOrFunc = urlOrFuncWithStateObj[0];
                    var status = {
                        continueLater: false,
                        contiuneAgain: false,
                        cancel: false,
                        worker: this,
                        startAt: startAt,
                        stateObject: urlOrFuncWithStateObj[1]
                    };

                    if (this.debugMode && window.console) console.log('AsyncWorker[' + this.timerId + ']: ' + urlOrFunc);
                    if (urlOrFunc instanceof Function) {
                        urlOrFunc(status);
                        if (status.continueAgain)
                            this.requestQueue.unshift(urlOrFuncWithStateObj);
                        if (status.continueLater)
                            this.requestQueue.push(urlOrFuncWithStateObj);
                    } else {
                        var e = document.createElement("script");
                        e.src = urlOrFunc;
                        e.type = "text/javascript";
                        fragment.appendChild(e);
                    }

                    if (status.cancel) {
                        if (this.debugMode && window.console) console.log('AsyncWorker[' + this.timerId + ']: Cancel');
                        this.requestQueue = [];
                        break;
                    }
                    var execTime = (new Date() - startAt);
                    if (++count == this.executeCount || status.continueAgain || execTime > this.maxExecutionTime) {
                        if (this.debugMode && window.console) console.log('AsyncWorker[' + this.timerId + ']: Next (' + count + '/' + this.executeCount + ', ' + execTime + 'ms)');
                        break;
                    }
                }

                if (fragment.childNodes.length > 0)
                    document.getElementsByTagName('head')[0].appendChild(fragment);

                if (this.requestQueue.length == 0) {
                    if (this.debugMode && window.console) console.log('AsyncWorker[' + this.timerId + ']: Worker Shutdown.');
                    clearInterval(this.timerId);
                    this.timerId = null;
                }
            }

            , callAsync: function(urlOrFunc, self, stateObj, interrupt) {
                /// <summary>非同期にJSONPリクエストまたは関数を実行するためにキューに追加します。</summary>
                /// <param name="urlOrFunc">JSONP URL または関数オブジェクト</param>
                /// <param name="self">実行時にthisとなるオブジェクト</param>
                /// <param name="stateObj">処理中に利用するためのオブジェクト</param>
                /// <param name="interrupt">処理の順番を割り込んですぐに実行するかどうかを指定</param>
                /// <returns type="BAAsyncWorker" />
                var aThisObject = self;
                var f = (urlOrFunc instanceof Function && self) ? function() { urlOrFunc.apply(aThisObject, arguments); } : urlOrFunc;
                if (interrupt)
                    this.requestQueue.unshift([f, stateObj]);
                else
                    this.requestQueue.push([f, stateObj]);

                if (this.debugMode && window.console) console.log('AsyncWorker[' + this.timerId + ']: Queue (' + urlOrFunc + ')' + (interrupt ? ' [INTERRUPT]' : ''));
                if (this.timerId == null) {
                    var self = this;
                    this.timerId = setInterval(function() { self.requestProc(); }, this.interval);
                    if (this.debugMode && window.console) console.log('AsyncWorker[' + this.timerId + ']: Worker Started.');
                }

                return this;
            }

            , wait: function(delay) {
                /// <summary>後続する処理を全てキャンセルします。</summary>
                /// <param name="delay">待ち時間(ms)</param>
                /// <returns type="BAAsyncWorker" />
                var start = null;
                return this.callAsync(function(e) {
                    if (start == null)
                        start = new Date();
                    if ((new Date().getTime() - start.getTime()) < delay)
                        e.continueAgain = true;
                });
            }

            , cancel: function() {
                /// <summary>後続する処理を全てキャンセルします。</summary>
                /// <returns type="BAAsyncWorker" />
                return this.callAsync(function(e) { e.cancel = true; }, this, true);
            }
        };


        BABlogPartsKit.Effect = function() {
        };
        BABlogPartsKit.Effect.prototype = {
            animationWorker: new BAAsyncWorker(10, 50, 5)
            , slide: function(e, duration, sizeFrom, sizeTo, completeCallback) {
                this.animationWorker.callAsync(function(s) {
                    var elapsed = Math.min((new Date().getTime() - s.stateObject.startTime), duration);
                    var size = BABlogPartsKit.Effect.easing(elapsed, sizeFrom, sizeTo - sizeFrom, duration);
                    e.style.height = size + 'px';

                    // のび終わったか時間が過ぎたら終わり
                    if (!(s.continueLater = (size != sizeTo || duration > elapsed))) {
                        // 終わり
                        //e.style.height = 'auto';
                        if (completeCallback) completeCallback(e);
                    }
                }, this, { startTime: new Date().getTime() });
            }
            , fade: function(e, duration, opacityFrom, opacityTo, completeCallback) {
                this.animationWorker.callAsync(function(s) {
                    var elapsed = Math.min((new Date().getTime() - s.stateObject.startTime), duration);
                    var opacity = BABlogPartsKit.Effect.easing(elapsed, opacityFrom, opacityTo - opacityFrom, duration);
                    BABlogPartsKit.Effect.setOpacity(e, opacity);

                    // 透過し終わったか時間が過ぎたら終わり
                    if (!(s.continueLater = (opacity != opacityTo || duration > elapsed))) {
                        // 終わり
                        BABlogPartsKit.Effect.setOpacity(e, opacityTo);
                        if (completeCallback) completeCallback(e);
                    }
                }, this, { startTime: new Date().getTime() });
            }
            , setOpacity: function(e, opacity) {
                e.style.opacity = String(opacity / 100);
                if (e.runtimeStyle) {
                    e.runtimeStyle.filter = 'Alpha(opacity=' + opacity + ')';
                }
            }
            , easing: function(t, b, c, d) {
                // cubic easing in/out - acceleration until halfway, then deceleration
                if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;
                return c / 2 * ((t -= 2) * t * t + 2) + b;
            }
        };
        BABlogPartsKit.Effect = new BABlogPartsKit.Effect();

        // EJS by cho45 + modified (Public Domain)
        // http://svn.coderepos.org/share/lang/javascript/blosxom.rhino/
        function EJS(template, opts) { return (this instanceof EJS) ? this.initialize(template, opts) : new EJS(template, opts) };
        EJS.prototype = {
            initialize: function(template, opts) {
                this.template = template;
                this.generator = this.compile(template, opts || {});
                this.processor = this.generator();
                // print(this.processor);
            },

            run: function(stash) {
                return this.processor(stash);
            },

            escapeCode: function(s) {
                return '"'
                       + (s.toString()
                               .replace(/\\/g, "\\\\")
                               .replace(/"/g, "\\\"")
                               .replace(/\n/g, "\\n")
                               .replace(/\r/g, "\\r")
                         )
                       + '"';
            },

            compile: function(s, opts) {
                s = String(s);
                ret = [
                    'var ret = [];',
                    'ret.push(""'
                ];

                var m, c, flag;
                while (m = s.match(/<%(=*)/)) {
                    flag = m[1];
                    ret.push(',', this.escapeCode(s.slice(0, m.index)));
                    s = s.slice(m.index + m[0].length);
                    m = s.match(/((?:\s|.)*?)%>/);
                    s = s.slice(m.index + m[0].length);
                    c = m[1];
                    switch (flag) {
                        case "=":
                        case "==":
                            ret.push(', h(String(', c, '))');
                            break;
                        case "===":
                            ret.push(', String(', c, ')');
                            break;
                        default:
                            ret.push(");", c, "\nret.push(''");
                            break;
                    }
                }
                ret.push(
                    ',', this.escapeCode(s), ');',
                    'return ret.join("");'
                );
                if (opts.useWith) {
                    ret.unshift("with (s) {");
                    ret.push("}");
                }
                ret.unshift(
                    'h = function (s) { return s.replace(/&/, "&amp;").replace(/</, "&lt;").replace(/>/, "&gt;").replace(/"/, "&quot;"); };',
                    "return function (s) {"
                );
                ret.push("}");

                return new Function(ret.join(''));
            }
        };

        function BAEnvironment() {
            /** document
            @type Document @const @private */
            var d = document;
            /** navigator.userAgent
            @type String @const @private */
            var ua = navigator.userAgent;

            /** associative array of browser distinction results.
            @type Object @const  */
            this.ua = {};
            this.ua.isGecko = /Gecko\//.test(ua);
            this.ua.isSafari = /AppleWebKit/.test(ua);
            this.ua.isOpera = Boolean(window.opera);
            this.ua.isIE = (d.all && !this.ua.isGecko && !this.ua.isSafari && !this.ua.isOpera);
            this.ua.isMac = /Mac/.test(ua);
            this.ua.isWin = /Win/.test(ua);
            this.ua.isWinIE = (this.ua.isWin && this.ua.isIE);
            this.ua.isMacIE = (this.ua.isMac && this.ua.isIE);
            this.ua.revision = (this.ua.isIE) ? parseFloat(ua.match(/MSIE ([\d\.]+)/)[1]) :
                           (this.ua.isGecko) ? parseFloat(ua.match(/; rv:([\d\.]+)/)[1]) :
                           (this.ua.isSafari) ? parseFloat(ua.match(/AppleWebKit\/([\d\.]+)/)[1]) :
                           (this.ua.isOpera) ? parseFloat(ua.match(/Opera.([\d\.]+)/)[1]) :
                                                0;
        }

        /*
        * getElementsBySelector (Original version by Simon Willison)
        * http://simonwillison.net/2003/Mar/25/getElementsBySelector/
        */
        function getElementsBySelector(selector, root) {
            // Attempt to fail gracefully in lesser browsers
            if (!document.getElementsByTagName) {
                return new Array();
            }
            // Split selector in to tokens
            var tokens = selector.split(' ');
            var currentContext = new Array(root || document);
            for (var i = 0; i < tokens.length; i++) {
                token = tokens[i].replace(/^\s+/, '').replace(/\s+$/, ''); ;
                if (token.indexOf('#') > -1) {
                    // Token is an ID selector
                    var bits = token.split('#');
                    var tagName = bits[0];
                    var id = bits[1];
                    var element = document.getElementById(id);
                    if (tagName && element.nodeName.toLowerCase() != tagName) {
                        // tag with that ID not found, return false
                        return new Array();
                    }
                    // Set currentContext to contain just this element
                    currentContext = new Array(element);
                    continue; // Skip to next token
                }
                if (token.indexOf('.') > -1) {
                    // Token contains a class selector
                    var bits = token.split('.');
                    var tagName = bits[0];
                    var className = bits[1];
                    if (!tagName) {
                        tagName = '*';
                    }
                    // Get elements matching tag, filter them for class selector
                    var found = new Array;
                    var foundCount = 0;
                    for (var h = 0; h < currentContext.length; h++) {
                        var elements;
                        if (tagName == '*') {
                            elements = currentContext[h].childNodes;
                        } else {
                            elements = currentContext[h].getElementsByTagName(tagName);
                        }
                        for (var j = 0; j < elements.length; j++) {
                            found[foundCount++] = elements[j];
                        }
                    }
                    currentContext = new Array;
                    var currentContextIndex = 0;
                    for (var k = 0; k < found.length; k++) {
                        if (found[k].className && found[k].className.match(new RegExp('\\b' + className + '\\b'))) {
                            currentContext[currentContextIndex++] = found[k];
                        }
                    }
                    continue; // Skip to next token
                }
                // Code to deal with attribute selectors
                if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
                    var tagName = RegExp.$1;
                    var attrName = RegExp.$2;
                    var attrOperator = RegExp.$3;
                    var attrValue = RegExp.$4;
                    if (!tagName) {
                        tagName = '*';
                    }
                    // Grab all of the tagName elements within current context
                    var found = new Array;
                    var foundCount = 0;
                    for (var h = 0; h < currentContext.length; h++) {
                        var elements;
                        if (tagName == '*') {
                            elements = currentContext[h].childNodes;
                        } else {
                            elements = currentContext[h].getElementsByTagName(tagName);
                        }
                        for (var j = 0; j < elements.length; j++) {
                            found[foundCount++] = elements[j];
                        }
                    }
                    currentContext = new Array;
                    var currentContextIndex = 0;
                    var checkFunction; // This function will be used to filter the elements
                    switch (attrOperator) {
                        case '=': // Equality
                            checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
                            break;
                        case '~': // Match one of space seperated words 
                            checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b' + attrValue + '\\b'))); };
                            break;
                        case '|': // Match start with value followed by optional hyphen
                            checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^' + attrValue + '-?'))); };
                            break;
                        case '^': // Match starts with value
                            checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
                            break;
                        case '$': // Match ends with value - fails with "Warning" in Opera 7
                            checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
                            break;
                        case '*': // Match ends with value
                            checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
                            break;
                        default:
                            // Just test for existence of attribute
                            checkFunction = function(e) { return e.getAttribute(attrName); };
                    }
                    currentContext = new Array;
                    var currentContextIndex = 0;
                    for (var k = 0; k < found.length; k++) {
                        if (checkFunction(found[k])) {
                            currentContext[currentContextIndex++] = found[k];
                        }
                    }
                    // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
                    continue; // Skip to next token
                }
                // If we get here, token is JUST an element (not a class or ID selector)
                tagName = token;
                var found = new Array;
                var foundCount = 0;
                for (var h = 0; h < currentContext.length; h++) {
                    var elements = currentContext[h].getElementsByTagName(tagName);
                    for (var j = 0; j < elements.length; j++) {
                        found[foundCount++] = elements[j];
                    }
                }
                currentContext = found;
            }
            return currentContext;
        }

        BABlogPartsKit.initialize();

        // ----------------------------------------------------------------------------

        //
        // ここにブログパーツの設定を書く
        //
        BABlogPartsKit.register("EngekilifePlayBlogParts",
        [
            {
                name: "play",
                source: "<%\nhasTicket = false;\nfor (var i = 0; i < play.play_places.length; i++ ) { var play_place = play.play_places[i]; if (play_place.playguide_tickets && play_place.playguide_tickets.length > 0) { hasTicket = true } }\n%>\n<div class=\"engekilife-blogentry-play\" style=\"zoom:1;margin:0;padding:0;color:#000;background:#fff;border:#cacaca solid 1px;font-size:100%;\">\n<p style=\"margin:12px 12px 0 12px;padding:0 0 2px 0;border-style:none none solid none;border-color:#e1dbd5;border-width:1px;color:#000;background:#fff;font-weight:bold;font-size:135%;text-align:left;position:static;width:auto;\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/blogparts/icon_blogparts01.gif\" width=\"22\" height=\"22\" alt=\"\" style=\"border:none;margin:0;float:none;vertical-align:bottom;\"><a href=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/play/<%= play.id %>?efec2=blog_info\" style=\"color:#000;background:#fff;text-decoration:none;border:none;\"><%= play.title %></a></p>\n<% if (play.company) { %><p style=\"margin:0.2em 0 0 1em;padding:0;font-size:100%;text-indent:0;text-align:left;\">(<a href=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/company/<%= play.company.id %>?efec2=blog_info\" style=\"color:#000;background:#fff;text-decoration:none;border:none;\"><%= play.company.name %></a>)</p><% } %>\n\n<div class=\"tab\" style=\"text-align:left;zoom:1;background:#f0eeeb;color:#000;margin:1em 0 0 0;padding:0 0 5px 0;height:26px;\">\n<p style=\"text-align:left;zoom:1;background:#fff url(<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/blogparts/bg_blogparts01.gif) bottom repeat-x;margin:0;padding:0 0 0 11px;text-indent:0;height:26px;\"><a class=\"show-detail\" href=\"javascript:void(0)\"style=\"text-decoration:none;border:none;margin:0;padding:0;\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/blogparts/tab_blogparts03_s.gif\" width=\"63\" height=\"26\" alt=\"\u516c\u6f14\u8aac\u660e\" style=\"zoom:1;border:none;margin:0 2px 0 0;padding:0;\"></a><a class=\"show-play-place\" href=\"javascript:void(0);\" style=\"zoom:1;text-decoration:none;border:none;margin:0;padding:0;\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/blogparts/tab_blogparts04.gif\" width=\"91\" height=\"23\" alt=\"\u4f1a\u5834\uff0f\u516c\u6f14\u671f\u9593\" style=\"zoom:1;border:none;margin:0 2px 0 0;padding:0;position:relative;top:-1px;\"></a><a class=\"show-credit\" href=\"javascript:void(0);\" style=\"zoom:1;text-decoration:none;border:none;margin:0;padding:0;\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/blogparts/tab_blogparts05.gif\" width=\"49\" height=\"23\" alt=\"\u51fa\u6f14\u8005\" style=\"zoom:1;border:none;margin:0 2px 0 0;padding:0;position:relative;top:-1px;\"></a><a class=\"show-ticket\" href=\"javascript:void(0);\" style=\"zoom:1;text-decoration:none;border:none;margin:0;padding:0;<% if (!hasTicket) { %>display:none;<% } %>\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/blogparts/tab_blogparts06.gif\" width=\"54\" height=\"23\" alt=\"\u30c1\u30b1\u30c3\u30c8\" style=\"zoom:1;border:none;margin:0 2px 0 0;padding:0;position:relative;top:-1px;\"></a></p>\n<!--/tab--></div>\n\n<div class=\"panel detail\" style=\"text-align:left;border:none;margin:0;padding:0;\">\n<div class=\"body\" style=\"text-align:left;border:none;margin:0;padding:1em;\">\n<% if (play.play_flyer_image) { %>\n<div class=\"image\" style=\"border:#d9d9d9 solid 1px;padding:2px;margin:0 0 1em 1em;width:134px;text-align:center;float:right;\">\n<a href=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/play/<%= play.id %>?efec2=blog_info\" style=\"color:#000;background:#fff;text-decoration:none;border:none;\">\n<img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %><%= play.play_flyer_image.icon_134 %>\" width=\"134\" height=\"134\" alt=\"\" style=\"vertical-align:middle;border:none;margin:0;padding:0;\">\n</a>\n<!--/image--></div>\n<% } %>\n\n<% if (play.description) { %><p style=\"text-align:left;margin:0;padding:0;\"><%= play.description %></p><% } %>\n<br clear=\"all\"  style=\"margin:0;padding:0;border:none;line-height:1px;\"/>\n<% if (play.related_urls && play.related_urls.length > 0) { %>\n<% for (var i = 0, n = play.related_urls.length; i < n; i++) { %>\n<a href=\"<%= play.related_urls[i].url %>\" style=\"color:#b34fa2;border:none;text-decoration:none;margin-right:0.5em;\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/common/img/icn_link_01.gif\" width=\"3\" height=\"5\" alt=\"\" style=\"vertical-align:middle;margin:0 3px 0 0;border:none;\"><%= play.related_urls[i].label %></a><br />\n<% } %>\n<% } %>\n<!--/body--></div>\n<!--/detail--></div>\n\n<div class=\"panel play-place\" style=\"text-align:left;border:none;margin:0;padding:0;display:none;\">\n<div class=\"body\" style=\"text-align:left;border:none;margin:0;padding:1em;\">\n<% if (play.play_places) { %>\n<% for (var i = 0; i < play.play_places.length; i++ ) { var play_place = play.play_places[i]; %>\n<dl style=\"text-align:left;margin:0 0 0em 0;padding:0;border-style:solid none <%= (play.play_places.length == (i+1)) ? \"solid\" : \"none\" %> none;border-color:#e1dbd5;border-width:1px;color:#000;background:#fff;font-size:100%;text-align:left;\">\n<dt style=\"text-align:left;margin:0;padding:0.8em 0 0 0.5em;border:none;color:#000;background:#fff;font-size:100%;text-align:left;\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/common/img/icn_link_01.gif\" width=\"3\" height=\"5\" alt=\"\" style=\"vertical-align:middle;margin:0 3px 0 0;border:none;\"><a href=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/play/<%= play.id %>/schedule#p<%= play_place.id %>\" style=\"color:#b34fa2;border:none;text-decoration:none;\"><%= play_place.display_name %></a></dt>\n<dd style=\"text-align:left;margin:0;padding:0.2em 0.5em;border:none;color:#000;background:#fff;font-size:100%;text-align:left;\">\n<%= EngekilifePlayBlogParts.formatDate(new Date(play_place.start_at)) %>\uff5e<% if (play.is_longrun) { %>\u30ed\u30f3\u30b0\u30e9\u30f3\u516c\u6f14<% } else { %><%= EngekilifePlayBlogParts.formatDate(new Date(play_place.end_at)) %><% } %>\n<% switch (play_place.running_status()) {\ncase EngekilifePlayBlogParts.PlayPlaceStatuses.Unknown: %><span style=\"border:1px #838383 sold;background:#838383;color:#fff;padding:0 1px;font-size:90%;\">\u4e0d\u660e</span><% break;\ncase EngekilifePlayBlogParts.PlayPlaceStatuses.NotStart: %><span style=\"border:1px #81acce sold;background:#81acce;color:#fff;padding:0 1px;font-size:90%;\">\u516c\u6f14\u524d</span><% break;\ncase EngekilifePlayBlogParts.PlayPlaceStatuses.Running: %><span style=\"border:1px #e06666 sold;background:#e0ffff;color:#fff;padding:0 1px;font-size:90%;\">\u516c\u6f14\u4e2d</span><% break;\ncase EngekilifePlayBlogParts.PlayPlaceStatuses.Ended: %><% if (play_place.is_longrun && play.play_places[play.play_places.length-1] == play_place) { %><span style=\"border:1px #e06666 sold;background:#e0ffff;color:#fff;padding:0 1px;font-size:90%;\">\u516c\u6f14\u4e2d</span><% } else { %><span style=\"border:1px #838383 sold;background:#838383;color:#fff;padding:0 1px;font-size:90%;\">\u516c\u6f14\u7d42\u4e86</span><% } %><% break;\n} %>\n</dd>\n</dl>\n<% } %>\n<% } %>\n<!--/body--></div>\n<!--/play-place--></div>\n\n<div class=\"panel credit\" style=\"text-align:left;border:none;margin:0;padding:0;display:none;\">\n<div class=\"body\" style=\"text-align:left;border:none;margin:0;padding:1em;\">\n<% if (play.play_credits.length == 0) { %>\n\u307e\u3060\u767b\u9332\u304c\u3042\u308a\u307e\u305b\u3093(<a href=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/play/<%= play.id %>/edit?efec2=blog_info\"style=\"color:#b34fa2;border:none;text-decoration:none;\">\u767b\u9332\u3059\u308b</a>)\n<% } else { %>\n<%\nroles = {};\nrole_ids = [];\nfor (var i = 0, n = play.play_credits.length; i < n; i++) {\n  if (roles[play.play_credits[i].play_role.id] == null) {\n    roles[play.play_credits[i].play_role.id] = [];\n    role_ids.push(play.play_credits[i].play_role.id);\n  }\n  roles[play.play_credits[i].play_role.id].push(play.play_credits[i]);\n}\n%>\n<% if (EngekilifePlayBlogParts.BlogPartsKit.Environment.ua.isIE && EngekilifePlayBlogParts.BlogPartsKit.Environment.ua.revision < 7) { %>\n<table style=\"zoom:1;font-size:100%;border-style:solid none none none;border-color:#e1dbd5;border-width:1px;width:auto;margin:1em 0;padding:0;\" cellspacing=\"5\">\n<% } else { %>\n<table style=\"zoom:1;font-size:100%;border-style:solid none none none;border-color:#e1dbd5;border-width:1px;width:100%;margin:1em 0;padding:0;\" cellspacing=\"5\">\n<% } %>\n<col width=\"10%\"><col width=\"90%\">\n<tbody>\n<% for (var i = 0, n = role_ids.length; i < n; i++) { %>\n<% if (roles[role_ids[i]] != null) { %>\n<tr>\n<th style=\"text-align:left;zoom:1;font-size:90%;padding:0.2em 0.5em;text-align:left;border-style:none none solid none;border-color:#e1dbd5;border-width:1px;vertical-align:top;background:#fff\"><%= roles[role_ids[i]][0].play_role.label %></th>\n<td style=\"text-align:left;zoom:1;padding:0.2em 0.5em;text-align:left;border-style:none none solid none;border-color:#f0eeeb;border-width:1px;background:#fff\">\n<% for (var j = 0, m = roles[role_ids[i]].length; j < m; j++) { %>\n<a href=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/people/<%= roles[role_ids[i]][j].person.id %>?efec2=blog_info\" style=\"color:#b34fa2;border:none;text-decoration:none;margin-right:0.5em;\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/common/img/icn_link_01.gif\" width=\"3\" height=\"5\" alt=\"\" style=\"vertical-align:middle;margin:0 3px 0 0;border:none;\"><%= roles[role_ids[i]][j].person.screen_name %><br />\n<% } %>\n</td>\n</tr>\n<% } %>\n<% } %>\n</tbody>\n</table>\n<% } %>\n<!--/body--></div>\n<!--/credit--></div>\n\n<div class=\"panel ticket\" style=\"text-align:left;border:none;margin:0;padding:0;display:none;\">\n<div class=\"body\" style=\"text-align:left;border:none;margin:0;padding:1em;\">\n<% if (play.play_places) { %>\n<% for (var i = 0; i < play.play_places.length; i++ ) { var play_place = play.play_places[i]; %>\n<% if (play_place.playguide_tickets && play_place.playguide_tickets.length > 0) { %>\n<dl style=\"text-align:left;margin:0 0 0em 0;padding:0;border-style:solid none <%= (play.play_places.length == (i+1)) ? \"solid\" : \"none\" %> none;border-color:#e1dbd5;border-width:1px;color:#000;background:#fff;font-size:100%;text-align:left;\">\n<dt style=\"text-align:left;margin:0;padding:0.8em 0 0 0.5em;border:none;color:#000;background:#fff;font-size:100%;text-align:left;\"><%= EngekilifePlayBlogParts.formatDate(new Date(play_place.start_at)) %>\uff5e<% if (play.is_longrun) { %>\u30ed\u30f3\u30b0\u30e9\u30f3\u516c\u6f14<% } else { %><%= EngekilifePlayBlogParts.formatDate(new Date(play_place.end_at)) %><% } %> (<a href=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/play/<%= play.id %>/schedule#p<%= play_place.id %>\" style=\"color:#b34fa2;border:none;text-decoration:none;\"><%= play_place.display_name %></a>)</dt>\n<dd style=\"text-align:left;margin:0;padding:0.2em 0.5em;border:none;color:#000;background:#fff;font-size:100%;text-align:left;\">\n<a href=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/play/<%= play.id %>/ticket#p<%= play_place.id %>\" style=\"color:#b34fa2;border:none;text-decoration:none;margin-right:0.5em;\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/common/img/icn_link_01.gif\" width=\"3\" height=\"5\" alt=\"\" style=\"vertical-align:middle;margin:0 3px 0 0;border:none;\">\u3053\u306e\u516c\u6f14\u306e\u30c1\u30b1\u30c3\u30c8\u3092\u8cfc\u5165\u3059\u308b</a>\n</dd>\n</dl>\n<% } %>\n<% } %>\n<% } %>\n<!--/body--></div>\n<!--/ticket--></div>\n\n<div class=\"more\" style=\"padding:0.3em 1em;margin:0;background:#f7f6f4;text-align:right;\">\n<a href=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/play/<%= play.id %>?efec2=blog_info\" style=\"color:#b34fa2;border:none;text-decoration:none;\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/common/img/icn_link_01.gif\" width=\"3\" height=\"5\" alt=\"\" style=\"vertical-align:middle;margin:0 3px 0 0;border:none;\">\u516c\u6f14\u306e\u8a73\u7d30\u60c5\u5831\u3092\u8868\u793a\u3059\u308b</a>\n<!--/more--></div>\n\n<p style=\"background:url(<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/blogparts/bg_blogparts02.gif) top repeat-x;border-style:solid none none none;border-color:#cacaca;border-width:1px;margin:0;padding:9px;text-indent:0;text-align:center;\"><a href=\"http://engekilife.com/?efec2=blog_info\" style=\"border:none;\"><img src=\"<%= EngekilifePlayBlogParts.ApiBaseUri.site %>/blogparts/logo_blogparts01.gif\" width=\"140\" height=\"32\" alt=\"\u6f14\u5287\u30e9\u30a4\u30d5\" style=\"border:none;\"></a></p>\n<!--/engekilife-blogentry-play--></div>",
                onElementGenerated: function(data, callbackId, templateName, e) {
                    // pre-load
                    if (!EngekilifePlayBlogParts.isPreloaded) {
                        var imgs = [
                            'bg_blogparts01.gif', 'bg_blogparts02.gif',
                            'tab_blogparts03.gif', 'tab_blogparts03_o.gif', 'tab_blogparts03_s.gif',
                            'tab_blogparts04.gif', 'tab_blogparts04_o.gif', 'tab_blogparts04_s.gif',
                            'txt_blogparts01.gif'
                        ];
                        var imgName;
                        var preloadBox = document.createElement('span');
                        preloadBox.style.position = 'absolute';
                        preloadBox.style.visibility = 'hidden';
                        for (var i = 0; i < imgs.length; i++) {
                            imgName = imgs[i];
                            var img = document.createElement('img');
                            img.src = EngekilifePlayBlogParts.ApiBaseUri.site + '/blogparts/' + imgName;
                            preloadBox.appendChild(img);
                        }
                        EngekilifePlayBlogParts.isPreloaded = true;
                    }
                },
                events: [
                    {
                        selector: 'div.tab p a.show-detail'
                        , eventName: 'click'
                        , handler: function(baseE, senderE) { EngekilifePlayBlogParts.switchTabPanel('detail', baseE, senderE); }
                    },
                    {
                        selector: 'div.tab p a.show-play-place'
                        , eventName: 'click'
                        , handler: function(baseE, senderE) { EngekilifePlayBlogParts.switchTabPanel('play-place', baseE, senderE); }
                    },
                    {
                        selector: 'div.tab p a.show-schedule'
                        , eventName: 'click'
                        , handler: function(baseE, senderE) { EngekilifePlayBlogParts.switchTabPanel('schedule', baseE, senderE); }
                    },
                    {
                        selector: 'div.tab p a.show-credit'
                        , eventName: 'click'
                        , handler: function(baseE, senderE) { EngekilifePlayBlogParts.switchTabPanel('credit', baseE, senderE); }
                    },
                    {
                        selector: 'div.tab p a.show-ticket'
                        , eventName: 'click'
                        , handler: function(baseE, senderE) { EngekilifePlayBlogParts.switchTabPanel('ticket', baseE, senderE); }
                    },
                    {
                        selector: 'div.tab p a img'
                        , eventName: 'mouseover'
                        , handler: function(baseE, senderE) {
                            if (!senderE.src.match(/_s\./))
                                EngekilifePlayBlogParts.switchHoverImage(true, senderE);
                        }
                    },
                    {
                        selector: 'div.tab p a img'
                        , eventName: 'mouseout'
                        , handler: function(baseE, senderE) {
                            if (!senderE.src.match(/_s\./))
                                EngekilifePlayBlogParts.switchHoverImage(false, senderE);
                        }
                    },

                    //
                    // a:hover
                    //
                    {
                        selector: ['div.body a', 'div.more a']
                        , eventName: 'mouseout'
                        , handler: function(baseE, senderE) {
                            if (senderE.parentNode.tagName == 'H1')
                                return;
                            senderE.style.color = '#b34fa2';
                            senderE.style.textDecoration = 'none';
                            var img = BABlogPartsKit.getElementsBySelector('img', senderE);
                            for (var i = 0; i < img.length; i++) {
                                if (img[i].src.match(/icn_link_/)) {
                                    EngekilifePlayBlogParts.switchHoverImage(false, img[i]);
                                }
                            }
                        }
                    },
                    {
                        selector: ['div.body a', 'div.more a']
                        , eventName: 'mouseover'
                        , handler: function(baseE, senderE) {
                            if (senderE.parentNode.tagName == 'H1')
                                return;
                            senderE.style.color = '#8f3f82';
                            senderE.style.textDecoration = 'underline';
                            var img = BABlogPartsKit.getElementsBySelector('img', senderE);
                            for (var i = 0; i < img.length; i++) {
                                if (img[i].src.match(/icn_link_/)) {
                                    EngekilifePlayBlogParts.switchHoverImage(true, img[i]);
                                }
                            }
                        }
                    }
                ]
            }
        ],
        function() {
            var siteBaseUriMatch = BABlogPartsKit.scriptElement.src.match(/^https?:\/\/[^\/]+/);
            var siteBaseUri = siteBaseUriMatch ? siteBaseUriMatch[0] : 'http://engekilife.com';
            this.ApiBaseUri = {
                site: siteBaseUri
                , play: siteBaseUri + '/api/play/'
            };

            function _replacement(s) {
                // Safari 2 では $& を使えないので $0 にする
                if (BABlogPartsKit.Environment.ua.isSafari && (BABlogPartsKit.Environment.ua.revision <= 500)) {
                    return s.replace('$&', '$0');
                }
                return s;
            }

            this.switchStayImage = function(isStayed, imgE, width, height) {
                var fileName = imgE.src.replace(/_[sod]\./, '.');
                if (isStayed) {
                    imgE.src = fileName.replace(/\.[^.]+$/, _replacement('_s$&'));
                } else {
                    imgE.src = fileName;
                }
                imgE.width = width;
                imgE.height = height;
            };

            this.switchHoverImage = function(isStayed, imgE) {
                var fileName = imgE.src.replace(/_[sod]\./, '.');
                if (isStayed) {
                    imgE.src = fileName.replace(/\.[^.]+$/, _replacement('_o$&'));
                } else {
                    imgE.src = fileName;
                }
            };

            this.formatDate = function(date) {
                return (date.getYear() > 1000 ? date.getYear() : date.getYear() + 1900) 
                       + "/" + 
                       (date.getMonth() + 1)
                       + "/" +
                       date.getDate()
                       + " (" +
                       (["\u65e5","\u6708","\u706b","\u6c34","\u6728","\u91d1","\u571f"][date.getDay()])
                       + ")";
            };
            
            // タブのセット
            this.tab = [
                {name:'detail',     size:[63, 23]},
                {name:'play-place', size:[91, 23]},
                {name:'credit',     size:[49, 23]},
                {name:'ticket',     size:[54, 23]}
            ];
            this.switchTabPanel = function(tabPanelName, baseE, senderE) {
                var panels = BABlogPartsKit.getElementsBySelector('div.panel', baseE);
                for (var i = 0, n = panels.length; i < n; i++)
                    panels[i].style.display = 'none';
                BABlogPartsKit.getElementsBySelector('div.'+tabPanelName, baseE)[0].style.display = 'block';
                
                var selectedTabSize = null;
                // すべて非選択状態に
                var imgNotSelected = BABlogPartsKit.getElementsBySelector('div.tab p a img', baseE);
                for (var i = 0, n = imgNotSelected.length; i < n; i++) {
                    imgNotSelected[i].style.position = imgNotSelected[i].style.position = 'relative';
                    imgNotSelected[i].style.top = '-1px';
                    imgNotSelected[i].style.marginRight = '2px';
                    this.switchStayImage(false, imgNotSelected[i], this.tab[i].size[0], this.tab[i].size[1]);
                    if (this.tab[i].name == tabPanelName)
                       selectedTabSize = this.tab[i].size;
                }

                var imgSelected = BABlogPartsKit.getElementsBySelector('div.tab p a.show-'+tabPanelName+' img', baseE)[0];
                imgSelected.style.position = imgSelected.style.position = 'relative';
                imgSelected.style.top = '0';
                imgSelected.style.marginLeft = '0px';
                
                this.switchStayImage(true, imgSelected, selectedTabSize[0], selectedTabSize[1]+3);
            };

            // ----

            this.Play = function(playId) {
                this.callJSONPWithTemplate(this.ApiBaseUri.play + 'show.json?p=' + playId, 'play',
                // Callback Before / function(data, callbackId, templateName) {}
                    function(data, callbackId, templateName) {
                        if (!data.error) {
                            for (var i = 0, n = data.play.play_places.length; i < n; i++)
                                this.attachMethodPlayPlace(data.play.play_places[i]);
                            data.play.created_at = new Date(data.play.created_at);
                        }
                        this.data =data;
                        return true;
                    },
                // Callback After / function(data, callbackId, templateName, body) {}
                    null,
                // Callback Fixup / function(data, callbackId, templateName, blockE) {}
                    null
                );
            };
            
            this.attachMethodPlayPlace = function(play_place_data) {
                play_place_data.running_status = function (t) {
                    if (t == null) t = new Date();
                  
                    if (this.start_at != null && t < this.start_at)
                        return EngekilifePlayBlogParts.PlayPlaceStatuses.NotStart;
                    if (this.end_at != null && t > this.end_at)
                        return EngekilifePlayBlogParts.PlayPlaceStatuses.Ended;
                    if (this.start_at != null && t >= this.start_at && (this.end_at != null && t <= this.end_at))
                        return EngekilifePlayBlogParts.PlayPlaceStatuses.NotStart;
                    return EngekilifePlayBlogParts.PlayPlaceStatuses.Unknown;
                };
            };
            
            this.PlayPlaceStatuses = { Unknown:0, NotStart:1, Running:2, Ended:3 };

        });

    })();
}
