amStockを使ってみる

amStockチャートというライブラリがあります。Flash系で、商用ですがフリーで使えます。フリー版では、チャートの左上隅にamCharts.comへのリンクが出ます。

とりあえず、サンプルのHTMLをレンダリングするsnippetを作ってみました。サンプルのamstockフォルダは、webapp/js/amstock に配置してあります。

package com.unyaunya.hoge.snippet

import _root_.scala.xml.NodeSeq
import _root_.net.liftweb.http.js.JsCmds._

class Chart {
  def render(in: NodeSeq): NodeSeq = {
    <div>
      <script type="text/javascript" src="/js/amstock/swfobject.js"></script>
      <div id="flashcontent">
        <strong>You need to upgrade your Flash Player</strong>
      </div>
        {Script(Run("""
        var so = new SWFObject("/js/amstock/amstock.swf", "amstock", "800", "500", "8", "#FFFFFF");
        so.addVariable("path", "/js/amstock/");
        so.addVariable("settings_file", encodeURIComponent("/js/amstock/amstock_settings.xml"));
        so.addVariable("preloader_color", "#999999");
        //  so.addVariable("chart_settings", "");
        //  so.addVariable("additional_chart_settings", "");
        //  so.addVariable("loading_settings", "Loading settings");		
        so.write("flashcontent");
        """))}
    </div>
  }
}

これで動くかと思ったら、FireFox3で次のようなエラーが発生しました。
IE8では問題なく動作します。

エラー: uncaught exception: [Exception... "Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER) [nsIDOMNSHTMLElement.innerHTML]"  nsresult: "0x80004003 (NS_ERROR_INVALID_POINTER)"  location: "JS frame :: http://localhost:8080/js/amstock/swfobject.js :: anonymous :: line 67"  data: no]

LiftのMLを検索してみると、このスレッドの現象があたってそうです。

ということで、Boot.scalaに次のコードを付け加えたら、FireFox3でも動くようになりました。どういう副作用があるのかとか、時間がある時に調べないといけません。

class Boot {

  def boot {
    ・・・
    LiftRules.useXhtmlMimeType = false
    ・・・