(function($){
  $.fn.ssplauncher=function(config){
    /**
     * @brief 起動パラメータ
     */
    var defaults={
      prevPageId:'',    // 前ページへのID
      nextPageId:'',    // 次ページへのID
      pagesId:'',       // ページナビゲータのID
      iconViewFlg:true, // 新着・オススメiconを表示するか否か(true:表示、false:表示しない)
      itemWidth: 180,   // itemの幅
      viewItems: 5,      // 表示するアイテムの数
      num: 0
    }
    var options=$.extend(defaults, config);
    var datas={
      page:0,
      launcherXml:'',
      carouselindex:0,
      lastlndex:0,
      parentUL:''
    }

    function appendItem(data, num) {

      if ( datas.launcherXml.length <= datas.lastlindex ) {
        return;
      }
      var objLi = $("#item-"+defaults.num+"-"+num);
      var objLink = $(document.createElement('A'));
      var objItem = $(document.createElement('DIV'));

      objLink.attr({
          'class':'carousel_items'
      });
      if ( $(">url", data).text() ) {
        objLink.attr({
            'href':$(">url", data).text()
        });
      }

      if ( $(">name", data).text() ) {
        objItem.attr({
            'style':
                'background:url('+$(">launcher_image", data).text()+') no-repeat;'+
                'width:150px;'+
                'height:130px;'+
                'behavior:url('+settings.common_path()+'js/iepngfix.htc);'
            ,
            'class':'png',
            'title':'<h5>'+$(">name", data).text()+'</h5>'+
                    '<div class="body">'+$(">description", data).text().truncate(50, '...')+'</div>'+
                    '<div class="kind"><img src="'+settings.common_path()+'images/'+$(">category>url_name", data).text()+'.gif" alt="'+$(">category>name", data).text()+'"></div>'+
                    '<div class="link"><a href="'+$(">url", data).text()+'">\u8A73\u3057\u304F\u306F\u3053\u3061\u3089</a></div>' // 詳しくはこちら
        });

        // ツールチップを割り当て
        objItem.tooltip(settings.launcher_style);//.dynamic({bottom: {direction: 'down', bounce: true}});

        if (!$.browser.msie) {
          // 通常状態の透明度をoff
          objItem.css('opacity', 1.0);

          // マウスオーバーでハイライト表示(IE除く)
          objItem.mouseover(function(){
            $(this).css('opacity', 0.7);
          });
          objItem.mouseout(function(){
            $(this).css('opacity', 1.0);
          });
        }

        if ( defaults.iconViewFlg ) {
          var objIcon = $(document.createElement('IMG'));
          var appendFlg = false;
/*
          if ( $(">new_icon", data).text() == '1' ) {
            objIcon.attr({
                'src':settings.new_icon(),
                'width':150,
                'alt':'\u65B0\u7740'  // 新着
            });
            objIcon.css(settings.new_icon_style);
            appendFlg = true;
          } else if ( $(">renewal_icon", data).text() == '1' ) {
            objIcon.attr({
                'src':settings.renew_icon(),
                'width':150,
                'alt':'\u304A\u3059\u3059\u3081'  // おすすめ
            });
            objIcon.css(settings.renew_icon_style);
            appendFlg = true;
          }
*/

          // 何も設定してないイメージをappendするとIEでおかしくなったのでフラグがtrueなら追加
          if ( appendFlg ) {
            objItem.empty();
            // IEでイメージを透過させる為にhtcをビヘイビアで設定
            objIcon.css({
              'behavior':'url('+settings.common_path()+'js/iepngfix.htc)'
            });
            objItem.append(objIcon);
          }
        }

      } else {
        if ($(">launcher_image", data).text()) {
          objItem.attr({
              'style':
                  'background:url('+$(">launcher_image", data).text()+') no-repeat;'+
                  'width:150px;'+
                  'height:130px;'+
                  'behavior:url('+settings.common_path()+'js/iepngfix.htc);'
              ,
              'class':'png',
              'title':''
          });
        } else {
          objItem.attr({
              'style':
                  'background:url('+settings.common_path()+'images/blank.gif) no-repeat;'+
                  'width:150px;'+
                  'height:130px;'+
                  'behavior:url('+settings.common_path()+'js/iepngfix.htc);'
              ,
              'class':'png',
              'title':''
          });
        }
        objItem.html('&nbsp;');
      }

      objLink.append(objItem);
      objLi.append(objLink);

      datas.lastlndex++;
    }

    function disabledCheck(length) {

      // 次ページ・前ページの有無を判定
      $(defaults.nextPageId).removeClass('disabled');
      $(defaults.prevPageId).removeClass('disabled');
      if ( datas.carouselindex >= ( length - defaults.viewItems ) ) {// || length <= defaults.viewItems ) {
        $(defaults.nextPageId).addClass('disabled');
      }
      if ( datas.carouselindex == 0 ) {
        $(defaults.prevPageId).addClass('disabled');
      }

      // 現在ページの判定
      if ( datas.carouselindex == 0 ) {
        datas.page = 0;
      } else {
        datas.page = datas.carouselindex / defaults.viewItems;
      }

      // ページナビゲーションを現在のページにあわせる
      $(defaults.pagesId).find('SPAN').each(function(){
          $(this).removeClass('enable');
          $(this).removeClass('disable');
          if ( $(this).attr('class') == 'page'+datas.page ) {
            $(this).addClass('enable');
          } else {
            $(this).addClass('disable');
          }
      });
    }

    datas.launcherXml = new Array();

    this.each(function(){
      var element = this;
      var iconLength = 0;
      for (var i in defaults.icons) {
        iconLength++;
      }
      var length = settings.availItems[defaults.num].length+iconLength;

      // 表示件数で割りきれるかどうかをチェック
      var mod = length % defaults.viewItems;
      if ( mod != 0 ) {
        // 割り切れない場合、足りない分を空白アイテムで埋める
        for (i=mod; i<defaults.viewItems; i++) {
          datas.launcherXml[length] = new Object();
          length++;
        }
      }
      initialize(element, length);

      $.each(settings.availItems[defaults.num], function(i) {
//        datas.launcherXml = new Array(length);
      	var item_path =this;
        var max = defaults.viewItems + 3;

        if ( item_path.match(/^icon-/) ) {
          // XMLの間にアイコンを差し込む
          var _xml = $(document.createElement("product"));
          _xml.append($(document.createElement("launcher_image")));
          _xml.find('launcher_image').append(settings.get_icon(item_path+""));

          datas.launcherXml[$.inArray(item_path+"", settings.availItems[defaults.num])] = $(_xml);
          if ($.inArray(item_path+"", settings.availItems[defaults.num]) <= defaults.viewItems + 3) {
            appendItem($(_xml), $.inArray(item_path+"", settings.availItems[defaults.num]));
          }
        } else {
          $.ajax({
            url: settings.product_shelf_xml_path()+this+'/index.xml',
            async: true,
            cache: false,
            dataType:"xml",
            success: function(xml){

		      $(xml).find("product").each(function() {
                datas.launcherXml[$.inArray(item_path+"", settings.availItems[defaults.num])] = this;
                if ($.inArray(item_path+"", settings.availItems[defaults.num]) >= 0 && $.inArray(item_path+"", settings.availItems[defaults.num]) <= defaults.viewItems + 3) {
                  appendItem(this, $.inArray(item_path+"", settings.availItems[defaults.num]));
                }
              });

            }
          });
        }
      });

      function initialize(element, length) {
        
        datas.parentUL = $(element).find('ul');
        $(datas.parentUL).css({
          'visibility':'visible',
          'overflow':'hidden',
          'position':'relative',
          'z-index':'1000',
          'left':'0px'
        });

        // ULの長さをアイテム幅×アイテム数に調整しておく
        $(datas.parentUL).css('width', defaults.itemWidth * length);

        // itemのリストを生成
        for (i=0; i<length; i++) {
          var objLi = $(document.createElement('LI'));
          objLi.attr('id', "item-"+defaults.num+"-"+i);
          objLi.css({
            'overflow':'hidden',
            'float':'left',
            'width':'150px',
            'height':'133px'
          });
          $(datas.parentUL).append(objLi);
        }

        // ページング初期処理
        if ( defaults.pagesId != '' && length > 0 ) {
          var maxpage = length / defaults.viewItems;
          for (i=0; i<maxpage; i++) {
            var objImg = $(document.createElement('IMG'));
            objImg.attr({
                'src' : settings.common_path()+'images/blank.gif',
                'width' : '10',
                'height' : '10'
            });

            var objSpan = $(document.createElement('SPAN'));
            objSpan.addClass('page'+i);
            if ( i == 0 ) 	objSpan.addClass('enable');
            else	objSpan.addClass('disable');

            objSpan.append(objImg);
            $(defaults.pagesId).append(objSpan);
          }
        }
        // common.jsのページスクローラーの部分が衝突するので後からhrefを追加
        if ( defaults.prevPageId != '' ) {
          $(defaults.prevPageId).attr('href', '#');
        }
        if ( defaults.nextPageId != '' ) {
          $(defaults.nextPageId).attr('href', '#');
        }
  
        // 次のページへのクリックイベント
        if ( defaults.nextPageId != '' ) {
          $(defaults.nextPageId).click(function(){

            if ( datas.carouselindex >= ( length - defaults.viewItems ) ) {
              return false;
            }
            datas.carouselindex = datas.carouselindex + defaults.viewItems;

            if ( datas.carouselindex + defaults.viewItems > length ) {
              datas.carouselindex = length - defaults.viewItems;
            }

            // 不足してる分のアイテムを追加
            for(var n=1; n<=defaults.viewItems; n++){
              if (datas.carouselindex+n < datas.lastlndex) {
                var data = $(datas.launcherXml).get(datas.carouselindex+n);
                appendItem(data, datas.carouselindex+n);
              }
            }

            var left = datas.carouselindex * (-1 * defaults.itemWidth);
            $(datas.parentUL).animate({"left": left+'px'}, "slow");

            disabledCheck(length);
            return false;
          });
        }
  
        // 前ページへのクリックイベント
        if ( defaults.prevPageId != '' ) {
          $(defaults.prevPageId).click(function(){
  
              if ( datas.carouselindex == 0 ) {
                return false;
              }
  
              datas.carouselindex = datas.carouselindex - defaults.viewItems;
              if ( datas.carouselindex < 0 ) {
                datas.carouselindex = 0;
              }
              var left = datas.carouselindex * (-1 * defaults.itemWidth);
              $(datas.parentUL).animate({"left": left+'px'}, "slow");
              disabledCheck(length);
              return false;
          });
        }
        disabledCheck(length);
      }

    });
  };
})(jQuery);

