たぼさんの部屋

いちょぼとのんびり

main_2.js:ほぼ完成版

これを使います。

  1. Main_2.js
  2. iframe.js

Main_2.js

/*jslint nomen: true*/
( function() {"use strict";
        var host = document.location.host;
        //host : "php.efolab.com"という形式。
        var protocol = document.location.protocol;
        //protocol : "http:"という形式
        var baseuri = protocol + "//" + host + "/";
        // baseuri : http://php.efolab.com/ という形式。
        var targetDomain = ["vino-form.com", "vino-form.efolab.com"];

        var pagePath = baseuri + "EFOLAB/_server/_pages";
        //submenu , footerのa要素に付与しているclass名です。
        var menuClassName = "menu";

        //origin : "http://php.efolab.com"形式
        //var origin = document.location.origin;   //androidブラウザでは取得できないため利用停止。

        //コンテナ・要素類の定義
        var _outerContainer;
        var _pageContaner;
        var _subContainer;
        var _footerContainer;
        var _inquiryAssyContainer;
        var _mainContainer;
        var _contentsContainer;
        var _menuAnchor;
        var _iframe;
        var _topContainer;

        /*
        * Class
        */
        //class定義
        var SlideController;
        var LoadingLayerController;
        var AutoFontSpan;
        var IframeController;
        var ContainerController;
        var LinkController;
        var MenuAnchorEventHandler;
        var FlickEventHandler;
        //instance定義
        var slideController;
        var loadingLayerController;
        var iframeController;
        var containerController;
        var subContainerLinkController;
        var footerContainerLinkController;
        var inquiryAssyContainerLinkController;
        var iframeLinkController;
        var menuAnchorEventHandler;
        var flickEventHandler;

        //------------------------------------------------------------------//
        //  IframeControler   start
        //
        //------------------------------------------------------------------//

        /**
         *@constructor
         */
        IframeController = function() {
        };
        IframeController.prototype = {
            initialSetting : function() {

                //初期に(container.cssにて)hiddenにしてあるのをvisibleに
                _iframe.style.visibility = "visible";
                //コンテナ全体の高さをセット
                containerController.setContainerHeight();

                //ローディングレイヤーを消します。
                loadingLayerController.off();

                //ifrmaeContainerについてコンテナの開閉時に行うメソッドを追加します。
                slideController.setOnOpenFunction(function() {
                    console.log("hoge");
                    iframeLinkController.setDisable();
                    console.log(iframeLinkController.enable);
                });
                slideController.setOnCloseFunction(function() {
                    iframeLinkController.setEnable();
                });

                //00の位置へスクロールします。
                window.scrollTo(0, 0);

                //----------------------------------------------------------------
                //リンクコントローラをセット
                //----------------------------------------------------------------
                try {
                    //他ドメインのcontentDocumentにはアクセスできないためリンクコントローラのセットできない。
                    if (_iframe.contentDocument) {
                        iframeLinkController.set(_iframe.contentDocument.body);
                    }

                } catch(e) {
                    console.log(e.stack);
                }
            },
            /*
             * postMessageを受信
             */
            handleEvent : function(event) {
                console.log(event.type);
                var json = JSON.parse(event.data);
                if (json.height) {
                    //iframeページのロード時
                    _iframe.style.height = json.height + "px";

                    this.initialSetting();

                } else if (json.flick) {
                    //iframeのdocumentをフリックした時
                    console.log(json.flick);

                    slideController.slideMenu(json.flick);
                }
            }
        };
        /**
         *@constructor
         */
        ContainerController = function() {

        };
        ContainerController.prototype = {
            initialSetting : function() {
                //全体のフォント調節をセットします。(iframe内のフォント調節はiframe.jsで実行しています。)
                var elms = document.body.getElementsByTagName('span');
                for (var i = 0; i < elms.length; i++) {
                    if (elms[i].getAttribute('size')) {
                        new AutoFontSpan(elms[i], elms[i].getAttribute('size'));
                    }
                }
                //footerContainerのリンクについてコンテナの開閉時に行うメソッドを追加します。
                slideController.setOnOpenFunction(function() {
                    footerContainerLinkController.setDisable();
                });
                slideController.setOnCloseFunction(function() {
                    footerContainerLinkController.setEnable();
                });
                //----------------------------------------------------------------
                //リンクコントローラをセット
                //----------------------------------------------------------------
                subContainerLinkController.set(_subContainer);
                footerContainerLinkController.set(_footerContainer);
                inquiryAssyContainerLinkController.set(_inquiryAssyContainer);

                //フリックコントローラをセット
                slideController.setFlickListener(_mainContainer);
            },
            setContainerHeight : function() {
                //初期化:clientHeightを取得できるように。
                _subContainer.style.height = 'auto';
                _mainContainer.style.height = 'auto';

                var subHeight = _subContainer.clientHeight;
                var mainHeight = _mainContainer.clientHeight;

                //subContainer , mainContainer の高さの長い方をcontenteContainerのheightに設定します。
                var currentHeight = (subHeight > mainHeight) ? subHeight : mainHeight;
                _contentsContainer.style.height = currentHeight + 'px';

                //親要素:contentsContainerにセットしたheightを強制的に継承するようにinheritを設定します。
                _subContainer.style.height = 'inherit';
                _mainContainer.style.height = 'inherit';
            },
            handleEvent : function(event) {
                console.log(event.type);
                if (event.type === "load") {
                    this.initialSetting();
                }
            }
        };
        /**
         * @constructor
         */
        MenuAnchorEventHandler = function(sourceAnchor) {
            this.sourceAnchor = sourceAnchor;
            this.initialize();
        };
        MenuAnchorEventHandler.prototype = {
            initialize : function() {

                if ("ontouchstart" in window) {
                    this.sourceAnchor.addEventListener('touchstart', this, false);
                    this.sourceAnchor.addEventListener('touchend', this, false);

                } else {
                    this.sourceAnchor.addEventListener('click', this, false);
                }
            },
            handleEvent : function(event) {
                //疑似要素のタッチの場合も補足するためにparentNodeも調査します。
                //menuタッチ時の処理
                switch(event.type) {
                    case "touchstart":
                        //--------------style set---------------------
                        this.sourceAnchor.style.backgroundColor = "rgb(255,248,248)";
                        //ティッカーを非表示にするためクラス名を削除します。
                        document.getElementById('menuTicker').style.display = "none";
                        break;

                    case "touchend":
                        //------------style--------------------------
                        this.sourceAnchor.style.backgroundColor = "white";
                        //スライドメニューを開閉します。
                        slideController.slideMenu();

                        break;
                }
            }
        };

        /**
         * @constructor
         */
        FlickEventHandler = function(sourceContainer) {
            this.container = sourceContainer;

            this.initialize();
        };
        FlickEventHandler.prototype = {
            initialize : function() {
                this.container.addEventListener('touchstart', this, false);
                this.container.addEventListener('touchend', this, false);
            },
            handleEvent : function(event) {
                console.log("FlickEventHandler");
                console.log(event.type);
                console.log(event.target);

                switch(event.type) {
                    case "touchstart":
                        this.start = {
                            pageX : event.touches[0].pageX,
                            pageY : event.touches[0].pageY,
                            time : Number(new Date())
                        };
                        break;

                    case "touchend":
                        var deltaX = event.changedTouches[0].pageX - this.start.pageX;
                        var deltaY = event.changedTouches[0].pageY - this.start.pageY;
                        var deltaTime = Number(new Date()) - this.start.time;

                        //縦よりも横に変化しているときにFlick判定を行います。
                        if (Math.abs(deltaX) > Math.abs(deltaY)) {
                            if ( (deltaTime < 300) && (Math.abs(deltaX) > 30 )) {
                                console.log("Flick");

                                //スライドメニュー操作
                                if (deltaX > 0) {
                                    slideController.slideMenu("open");
                                } else {
                                    slideController.slideMenu("close");
                                }
                            }
                        }
                        break;
                }
            }
        };

        /**
         * AutoFontSpan
         * @constructor
         */
        AutoFontSpan = function(target, size) {
            //sizeは1が普通サイズ
            this.target = target;
            this.size = size;

            var self = this;
            window.addEventListener('resize', function() {
                self.setSize.call(self);
            }, false);

            this.setSize();
        };
        AutoFontSpan.prototype = {
            BASE_RATIO : 1 / 360,

            setSize : function() {
                try {
                    this.target.style.fontSize = Math.round(document.documentElement.clientWidth * this.BASE_RATIO * this.size * 100) + '%';
                } catch(e) {
                    alert(e);
                }
            }
        };
        /**
         * LnkController
         * @constructor
         * @param container {Container}
         * @param callback {function}
         */
        var LinkController = function() {
            this.container = undefined;
            this.enable = true;
            this.serial = Number(new Date());
        };
        LinkController.prototype = {
            initialize : function() {

            },
            set : function(targetContainer) {
                this.container = targetContainer;

                var links = this.container.getElementsByTagName('a');
                for (var i = 0; i < links.length; i++) {
                    var link = links[i];
                    if ("ontouchstart" in window) {
                        //タッチイベントに対応しているとき
                        link.addEventListener('touchstart', this, false);
                        link.addEventListener('touchend', this, false);
                    } else {
                        link.addEventListener('click', this, false);
                    }
                }
            },
            setEnable : function() {
                this.enable = true;
            },
            setDisable : function() {
                this.enable = false;
            },
            /*
             * ページ遷移
             * アンカー要素のイベントを受け取り処理します。
             */
            handleEvent : function(event) {
                console.log("ページ遷移::event.type=" + event.type);
                console.log(this);
                //img要素を下位に持っているアンカー要素の場合にa要素を取得する関数。
                var getAnchor = function(target) {
                    var anchor = undefined;
                    if (target.href) {
                        anchor = target;
                    } else {
                        anchor = getAnchor(target.parentNode);
                    };
                    return anchor;
                };

                /*
                 * スクロール・スライド判定開始
                 * スクロールおよびスライド時にはタッチイベントとして認識させません。
                 */
                if (event.type === "touchstart") {
                    this.start = {
                        pageX : event.touches[0].pageX,
                        pageY : event.touches[0].pageY,
                        time : Number(new Date())
                    };
                }
                if (event.type === "touchend") {
                    //event touchendの時はtouches[0].pageY ではなく changeTouches[0].pageYで取得します。
                    var deltaX = event.changedTouches[0].pageX - this.start.pageX;
                    var deltaY = event.changedTouches[0].pageY - this.start.pageY;
                    if (deltaY !== 0 || deltaX !== 0) {
                        console.log("scroll or flick");
                        //スクロールまたはスライドしているのでタッチイベント処理中止。
                        return;
                    }

                    console.log("スクロールでもflickでもない");

                    console.log("this.enable=" + this.enable);
                    if (!this.enable) {
                        //リンクイベントを動作させません。
                        console.log('link disable');
                        // slideController.closeSlide();
                        console.log(event.target);
                        console.log(event.target.parentNode);
                        event.preventDefault();
                        // event.stopPropagation();

                        return false;
                    }
                    /*
                    * スクロールではなく、タッチのとき
                    */
                    //スライドメニューを閉じます。
                    slideController.closeSlide();

                    var isTel = function(anchor) {
                        console.log("---protocol振り分け:anchor.protocol === 'tel: ---'" + (anchor.protocol === "tel:"));
                        console.log("anchor.protocol=" + anchor.protocol);

                        return anchor.protocol === "tel:";
                    };
                    var isMenuLink = function(anchor) {
                        console.log("---menuからのリンク判定 : anchor.className===menuClassName ---" + (anchor.className === menuClassName));
                        console.log("className=" + anchor.className);
                        console.log("menuClassName=" + menuClassName);

                        return anchor.className === menuClassName;
                    };
                    var isDomain = function(anchor) {
                        console.log("--- 内部サイトかどうかの判別:anchor.host === host ---" + (anchor.host === host));
                        console.log("anchor.host =" + anchor.host);
                        console.log("host=" + host);

                        return anchor.host === host;

                    };
                    var isTargetDomain = function(anchor) {
                        var isTarget = false;
                        for (var i = 0; i < targetDomain.length; i++) {
                            console.log("--- 対象の他ドメインかどうかの判別:anchor.host === targetDomain[" + i + "] ---" + (anchor.host === targetDomain[i]));
                            console.log("anchor.host =" + anchor.host);
                            console.log("targetDomain[" + i + "]=" + targetDomain[i]);
                            if (anchor.host === targetDomain[i]) {
                                isTarget = true;
                            }
                        }
                        return isTarget;
                    };

                    /*
                    * 内部サイトか、対象の他ドメインか、対象外の他ドメインかによって
                    * 処理を分岐します。
                    */

                    //event.targetからアンカー要素を抽出します。
                    var anchor = getAnchor(event.target);

                    //style
                    anchor.style.color = "red";
                    // anchor.className = "checkMark";
                    console.log("----リンクの判別開始----");

                    if (isTel(anchor)) {
                        //電話プロトコルのとき。preventDefaultせずに通常動作させます。
                        return;
                    }

                    //preventDefault実行
                    event.preventDefault();

                    if (isDomain(anchor)) {
                        //内部サイトの場合
                        /*
                         * iframe内のリンクかどうかの判別を行います。
                         * submenu,fotterのmenuからのリンクの場合はanchor.className ="menu"です。
                         */

                        if (isMenuLink(anchor)) {
                            //submenu,footerからのリンクです。
                            //画面遷移します。
                            console.log("内部サイト:menuからのリンク:遷移先=" + pagePath + anchor.pathname);

                            //pagePath:_server/_pages/ディレクトリのファイルを開きます。
                            _iframe.src = pagePath + anchor.pathname;

                        } else {
                            //iframeからのリンクです。
                            //画面遷移します。
                            console.log("内部サイト:iframeからのリンク:遷移先=" + anchor.href);
                            _iframe.src = anchor.href;
                        }
                        //ifrrameの高さを初期化します。
                        _iframe.style.height = window.screen.height;
                        //読み込み中レイヤーを表示します。
                        loadingLayerController.on();

                    } else {
                        /*
                         * 他のドメインです。
                         * 対象の他ドメインか対象外の他ドメインかの判別を行います。
                         * あらかじめ記述してあるtargetDomain配列とリンク先のhost名が同一かどうかを調査します。
                         */

                        if (isTargetDomain(anchor)) {
                            //対象の他ドメインの場合
                            console.log("対象の他ドメイン");

                            //読み込み中レイヤーを表示します。
                            loadingLayerController.on();
                            //ifrrameの高さを初期化します。
                            _iframe.style.height = window.screen.height;

                            //画面遷移します。
                            var targetFile = anchor.getAttribute('href');
                            try {
                                _iframe.src = targetFile;

                            } catch(e) {
                                console.log(e.stack);
                            }

                        } else {
                            try {
                                //対象外の他ドメインの場合
                                console.log("対象外の他ドメイン:" + anchor.href);
                                //androidブラウザで動作しないため、同一のタブで開きます。
                                // window.open(anchor.href, '_blank');
                                location.href = anchor.href;

                            } catch(e) {
                                alert(e.stack);
                            }
                        }
                    }

                    //onclick属性があれば、それを実行します。
                    if (anchor.onclick) {
                        console.log('onclickの属性を実行しました。');
                        anchor.onclick();
                    }
                    //style 済みの色に変更。
                    anchor.style.color = "gray";
                    // anchor.className = "checkMark";
                }
            },
        };
        var LoadingLayerController = function(wrapperContainer) {
            this.wrapperContainer = wrapperContainer;
            this.layer = undefined;

            this.initialize();
        };
        LoadingLayerController.prototype = {
            initialize : function() {
                var screenHeight = window.screen.height;

                //iframeの上に新しいレイヤーをセットします。
                var layer = document.createElement('div');
                var innerDiv = document.createElement('div');
                var img = document.createElement('img');
                img.src = baseuri + "EFOLAB/_script/img/loading.gif";
                var p = document.createElement('p');
                p.textContent = "読み込み中...";
                innerDiv.appendChild(img);
                innerDiv.appendChild(p);
                layer.appendChild(innerDiv);

                innerDiv.style.textAlign = "center";
                innerDiv.style.position = "fixed";
                innerDiv.style.width = "100%";
                innerDiv.style.top = (screenHeight) / 2;
                layer.setAttribute("style", "position:absolute;z-index:30;width:100%;");
                layer.style.backgroundColor = 'rgba(255,255,255,0.9)';
                var wrapperContainerHeight = this.wrapperContainer.style.height;
                layer.style.height = wrapperContainerHeight;
                layer.style.display = "none";

                this.wrapperContainer.appendChild(layer);
                this.layer = layer;

            },
            on : function() {
                //高さを再取得して表示
                var wrapperContainerHeight = this.wrapperContainer.style.height;
                this.layer.style.height = wrapperContainerHeight;
                this.layer.style.display = "block";
            },
            off : function() {
                //隠す
                this.layer.style.display = "none";
            }
        };

        /**
         *@constructor
         * @param {DOMObject} slideContainer
         * @param {DOMObject} wrapperContainer
         */
        var SlideController = function(slideContainer, wrapperContainer) {
            //スライドさせるエレメントです。
            this.slideContainer = slideContainer;
            //スライドの座標基準となるコンテナエレメントです。
            this.wrapperContainer = wrapperContainer;
            this.wrapperContainer.width = undefined;
            //引数オプションのmaxSlideRatio:スライドさせる比率。初期値0.5であればcontainerの50%のスライドです。
            this.maxSlideRatio = 0.35;
            //上記のmaxSlideRatioをもとにしたスライドさせる最大左座標です。
            this.maxSlideLeftPercent = this.maxSlideRatio * 100 + '%';
            //閉じた状態の際の左座標です。初期値は0%:これはコンテナのposition:relative設定の連携座標です。
            this.minSlideLeftPercent = '0%';

            //menuAnchorです。this.setMenuListenerの引数targetでセットします。
            this.menuElement = undefined;
            this.onCloseFunctions = [];
            this.onOpenFunctions = [];

            this.initialize();
        };
        SlideController.prototype = {
            initialize : function() {

                //スタイル設定の初期値を与えます。閉じた座標位置であるminSlideLeftです。
                this.slideContainer.style.left = this.minSlideLeftPercent;
                //コンテナの幅をセットします。
                this.wrapperContainer.width = this.wrapperContainer.getBoundingClientRect().width;
            },

            setFlickListener : function(target) {
                target.addEventListener('touchstart', this, false);
                target.addEventListener('touchend', this, false);
            },
            setOnOpenFunction : function(func) {
                this.onOpenFunctions.push(func);
            },
            setOnCloseFunction : function(func) {
                this.onCloseFunctions.push(func);
            },
            /*
             * 与えられたpercent表記のテキストを数値にして返却します。
             */
            toNumberFromPercent : function(percentText) {
                try {
                    return parseFloat(percentText.split("%").join(""));

                } catch(e) {
                    console.log(percentText + e);
                }
            },
            /**
             * @param order {String}
             */
            slideMenu : function(order) {
                switch (order) {
                    //  from FlickEventHandler
                    case "open":
                        this.openSlide();
                        break;
                    case "close":
                        this.closeSlide();
                        break;
                    //  from MenuAnchorHandler
                    default:
                        if (this.slideContainer.style.left === this.minSlideLeftPercent) {
                            //開く
                            this.openSlide();
                        } else if (this.slideContainer.style.left === this.maxSlideLeftPercent) {
                            //閉じる
                            this.closeSlide();
                        }
                }
            },
            openSlide : function() {
                //スライドメニューを開きます。
                this.slideContainer.style.left = this.maxSlideLeftPercent;
                //open時の追加ファンクションを実行します。
                var funcs = this.onOpenFunctions;
                for (var i = 0; i < funcs.length; i++) {
                    console.log("onOpenFunctions=" + funcs[i]);
                    funcs[i]();
                }
            },
            closeSlide : function() {
                //スライドメニューを閉じます
                this.slideContainer.style.left = this.minSlideLeftPercent;
                //close時の追加ファンクションを実行します。
                var funcs = this.onCloseFunctions;
                for (var i = 0; i < funcs.length; i++) {
                    console.log("onCloseFunctions=" + funcs[i]);
                    funcs[i]();
                }
            }
        };

        function boot() {
            console.log('DOMContentLoaded');

            //
            //  DOM要素の取得部
            //
            _outerContainer = document.getElementById('outerContainer');
            _pageContaner = document.getElementById('pageContainer');
            _subContainer = document.getElementById('subContainer');
            _footerContainer = document.getElementById('footerContainer');
            _inquiryAssyContainer = document.getElementById('inquiryAssyContainer');
            _mainContainer = document.getElementById('mainContainer');
            _contentsContainer = document.getElementById('contentsContainer');
            _menuAnchor = document.getElementById('menuAnchor');
            _topContainer = document.getElementById('topContainer');
            _iframe = document.getElementById('iframe');

            //
            //  インスタンス生成部
            //

            //-------------------------------------------
            //  ContainerController インスタンス生成
            //-------------------------------------------
            containerController = new ContainerController();

            //-------------------------------------------
            //  IframaController インスタンス生成
            //-------------------------------------------
            iframeController = new IframeController();

            //-------------------------------------------
            //  SlideController インスタンス生成
            //-------------------------------------------
            slideController = new SlideController(_mainContainer, _contentsContainer);

            //--------------------------------------------
            //  LinkController インスタンス生成
            //--------------------------------------------
            subContainerLinkController = new LinkController();
            footerContainerLinkController = new LinkController();
            inquiryAssyContainerLinkController = new LinkController();
            iframeLinkController = new LinkController();

            //-------------------------------------------
            //  LoadingLayerController インスタンス生成
            //-------------------------------------------
            loadingLayerController = new LoadingLayerController(_contentsContainer);

            //-------------------------------------------
            //  MenuAnchorEventHandler インスタンス生成
            //-------------------------------------------
            menuAnchorEventHandler = new MenuAnchorEventHandler(_menuAnchor);

            //-------------------------------------------
            //  FlickEventHandler インスタンス生成
            //-------------------------------------------
            flickEventHandler = new FlickEventHandler(_outerContainer);

            //
            //  イベントリスナの登録部
            //

            //------------------------------------------
            //  containerController
            //  window load時
            //------------------------------------------
            window.addEventListener('load', containerController, false);

            //------------------------------------------
            //  iframeController
            //  postMessage 受信時
            //------------------------------------------
            window.addEventListener('message', iframeController, false);

            loadingLayerController.on();

        }

        try {
            if (document.body) {
                boot();
            } else {
                document.addEventListener('DOMContentLoaded', boot, false);
            }

        } catch(e) {
            var retry = function() {
                document.addEventListener('DOMContentLoaded', boot, false);
            };
            retry();
        }
    }());

iframe.js

( function() {"use strict";
        var webMessaging = ( function() {
                var target = parent.postMessage ? parent : (parent.document.postMessage ? parent.document : undefined);
                return {
                    send : function(message) {
                        //jsonオブジェクトで記述しました。
                        var jsonMessage = JSON.stringify(message);
                        //json形式に変換
                        target.postMessage(jsonMessage, "*");
                    }
                };
            }());

        /**
         * @constructor
         */
        var FlickEventHandler = function(sourceContainer) {
            this.container = sourceContainer;

            this.initialize();
        };
        FlickEventHandler.prototype = {
            initialize : function() {
                this.container.addEventListener('touchstart', this, false);
                this.container.addEventListener('touchend', this, false);
            },
            handleEvent : function(event) {
                console.log(event.type);

                switch(event.type) {
                    case "touchstart":
                        this.start = {
                            pageX : event.touches[0].pageX,
                            pageY : event.touches[0].pageY,
                            time : Number(new Date())
                        };
                        break;

                    case "touchend":
                        var deltaX = event.changedTouches[0].pageX - this.start.pageX;
                        var deltaY = event.changedTouches[0].pageY - this.start.pageY;
                        var deltaTime = Number(new Date()) - this.start.time;

                        //縦よりも横に変化しているときにFlick判定を行います。
                        if (Math.abs(deltaX) > Math.abs(deltaY)) {
                            if ( (deltaTime < 300) && (Math.abs(deltaX) > 30 )) {
                                console.log("Flick from iframe");
                                
                                var message = {};
                                //スライドメニュー操作
                                if (deltaX > 0) {
                                    //開く
                                    message = {"flick":"open"};
                                    
                                } else {
                                    //閉じる
                                    message = {"flick":"close"};
                                }
                                //postMessageを送信
                                webMessaging.send(message);
                            }
                        }
                        break;
                }
            }
        };

 
        /**
         * AutoFontSpan
         */
        var AutoFontSpan = function(target, size) {
            //sizeは1が普通サイズ
            this.target = target;
            this.size = size;

            var self = this;
            window.addEventListener('resize', function() {
                self.resize.call(self);
            }, false);

            this.setSize();
        };
        AutoFontSpan.prototype = {
            BASE_RATIO : 1 / 360,

            setSize : function() {
                try {
                    this.target.style.fontSize = Math.round(document.documentElement.clientWidth * this.BASE_RATIO * this.size * 100) + '%';
                } catch(e) {
                    alert(e);
                }
            },
            resize : function(event) {
                this.setSize();
            }
        };

        function init() {

            //フォント調節をセットします.
            var elms = document.getElementsByTagName('span');
            for (var i = 0; i < elms.length; i++) {
                if (elms[i].getAttribute('size')) {
                    new AutoFontSpan(elms[i], elms[i].getAttribute('size'));
                }
            }
            
            //Flick event
            new FlickEventHandler(document.body);

            /*
            * postMessage
            * !!修正:4/18 json形式に修正しました。(iframeのdocumentにflickイベントを設定するため)
            */
            // iframe.bodyの高scrollHeightさをpostMessageで送信します。
            var message = {
                "height" : document.body.scrollHeight
            };
            webMessaging.send(message);

        }


        window.addEventListener('load', init, false);
        
   

        //parentからの受信用
        window.addEventListener('message', function(event) {
             //未使用
        }, false);

    }());