$(function(){

	// ----------------
	// 初期化処理
	// ----------------

	var operatable = false;

	var ie6Flag = isIE6();
	var ie7Flag = isIE7();

	var confRootDir    = readArgs('confRootDir');
	var argEncQuery    = readArgs('argEncQuery');
	var argMD5Query    = readArgs('argMD5Query');
	var argAddPageList = readArgs('argAddPageCSV').split(',');

	var NOTICE_CLASS_NAME     = 'notice';
	var NOTICE_COUNT          = 3;
	var NOTICE_INTERVAL_TIME  = 500;
	var CLODE_UL_SLIDE_TIME   = 500;
	var ADD_UL_ANIMATE_TIME   = 250;
	var ADD_UL_ANIMATE_EASING = 'swing'
	var ADD_NEW_LI_FADE_TIME  = 500;
	var ADD_INTERVAL_TIME     = 50;
	var VAL_LOADING           = '<img src="' + confRootDir + 'static/img/loading.gif" width="16" height="16" alt="ロード中" />';
	var FVAL_NUMBER_SPAN      = ' 件表示中';

	var defLevel         = 0;
	var newResultsLiFlag = false;
	var searchID         = 'result-' + argMD5Query;
	var searchPage       = 1;

	var jqBody                             = $('body');
	var jqSearch                           = $('#search');
	var jqSearchQueryForm                  = new Form($('#query'));
	var jqSearchButton                     = $('#search button');
	var jqResults                          = $('#results');
	var jqResultsCloseButtonList           = []
	    jqResultsCloseButtonList[defLevel] = $('p.close button');
	var jqResultsAddButtonList             = []
	    jqResultsAddButtonList[defLevel]   = $('p.add button');
	var jqResultsLiList                    = $('#results>li');
	var jqResultsLiListLen                 = jqResultsLiList.length;

	var closeFlagList = [];
	var addPageList   = [];
	var allLinkList   = [];

	for(var j = 0; j < jqResultsLiListLen; j++){

		var id = $(jqResultsLiList[j]).attr('id');

		closeFlagList[id] = false;
		addPageList[id]   = parseInt(argAddPageList[j]);
		allLinkList[id]   = [];

		var jqUlChildren    = $('#' + id + ' ul').children();
		var jqUlChildrenLen = jqUlChildren.length;

		for(var i = 0; i < jqUlChildrenLen; i++){
			allLinkList[id].push($(jqUlChildren[i]).children(':first').children(':first').attr('href'));
		}

	}

	jqSearchButton.removeAttr('disabled');
	jqResultsAddButtonList[defLevel].removeAttr('disabled');

	defEvent();

	operatable = true;

	// ----------------
	// 関数定義
	// ----------------

	function jqUlChildrenSort(jqUl){

		sortElement(jqUl, -1, function(child){
			return parseInt(child.children(':last').html().replace(/-/g, ''));
		});

	}

	function notice(jqAnyButton){

		if(ie6Flag){

			alert('問題が発生したため、トップページに戻ります');

			location.href = confRootDir;

		}else{

			jqAnyButton.html('エラー！');

			var jqNotice         = $(document.createElement('div')).attr('id', 'notice');
			var jqNoticeMessageP = $(document.createElement('p')).html('問題が発生したため、トップページに戻ります');
			var jqNoticeButtonP  = $(document.createElement('p'));
			var jqNoticeButton   = $(document.createElement('button')).html('OK');

			jqNoticeButtonP.append(jqNoticeButton);
			jqNotice.append(jqNoticeMessageP).append(jqNoticeButtonP);
			jqBody.append(jqNotice);

			jqNoticeButton.click(function(){
				location.href = confRootDir;
			});

			$('a').click(function(){
				return false;
			});

		}

	}

	function appendResultListItems(resultListItems, callback){

		var id = 'result-' + resultListItems['md5Artist'];

		var jqUl = $('#' + id + ' ul');

		if(jqUl.size() == 0){

			// ----------------
			// jqUL が存在しない場合、作成する
			// ----------------

			newResultsLiFlag = true;

			var jqResultsLi   = $(document.createElement('li')).attr('id', id);
			var jqArtistH2    = $(document.createElement('h2'));
			var jqArtistA     = $(document.createElement('a')).attr('href', confRootDir + 'search/' + resultListItems['encArtist']).attr('title', resultListItems['escArtist']).html(resultListItems['escArtist']);
			var jqCloseP      = $(document.createElement('p')).attr('class', 'close');
			var jqCloseButton = $(document.createElement('button')).attr('class', 'new').html('閉じる');
			var jqNumberP     = $(document.createElement('p')).attr('class', 'number');
			var jqNumberSpan  = $(document.createElement('span')).html('0' + FVAL_NUMBER_SPAN);
			var jqAddP        = $(document.createElement('p')).attr('class', 'add');
			var jqAddButton   = $(document.createElement('button')).attr('class', 'new').html('もっと！');

			jqUl = $(document.createElement('ul'));

			jqArtistH2.append(jqArtistA);
			jqCloseP.append(jqCloseButton);
			jqNumberP.append(jqNumberSpan);
			jqAddP.append(jqAddButton);
			jqResultsLi.append(jqArtistH2).append(jqCloseP).append(jqUl).append(jqNumberP).append(jqAddP);
			jqResults.append(jqResultsLi);

			closeFlagList[id] = false;
			addPageList[id]   = 0;
			allLinkList[id]   = [];

			// ----------------

		}else{

			var jqNumberSpan = $('#' + id + ' p.number span');

		}

		var resultListLen = resultListItems['resultListLen'];
		var resultList    = resultListItems['resultList'];

		var jqNewLiList = [];

		if(!ie6Flag && !ie7Flag && !closeFlagList[id]){
			jqUl.css('overflow', 'hidden').css('height', jqUl.height() + 'px');
		}

		// ----------------
		// hidden 状態で HTML に結果を構築する
		// ----------------

		for(var i = 0; i < resultListLen; i++){

			var title        = resultList[i]['title'];
			var imageURL     = resultList[i]['imageURL'];
			var size         = resultList[i]['size'];
			var salesDate    = resultList[i]['salesDate'];
			var affiliateURL = resultList[i]['affiliateURL'];

			if(inArray(affiliateURL, allLinkList[id])){
				continue;
			}

			var jqNewLi       = $(document.createElement('li'));
			var jqNewImageP   = $(document.createElement('p'));
			var jqNewImageA   = $(document.createElement('a')).attr('href', affiliateURL).attr('title', title);
			var jqNewImageImg = $(document.createElement('img')).attr('src', imageURL).attr('alt', title);
			var jqNewTitleH3  = $(document.createElement('h3')).html(title);
			var jqNewSizeP    = $(document.createElement('p')).html(size);
			var jqNewDateP    = $(document.createElement('p')).html(salesDate);

			if(!closeFlagList[id]){
				if(ie6Flag || ie7Flag){
					jqNewLi.css('display', 'none');
				}else{
					jqNewLi.css('visibility', 'hidden');
				}
			}

			jqNewImageA.append(jqNewImageImg);
			jqNewImageP.append(jqNewImageA);
			jqNewLi.append(jqNewImageP).append(jqNewTitleH3).append(jqNewSizeP).append(jqNewDateP);
			jqUl.append(jqNewLi);

			allLinkList[id].push(affiliateURL);

			jqNewLiList.push(jqNewLi);

		}

		// ----------------
		// アニメーションで表示
		// ----------------

		if(jqNewLiList.length == 0){

			if(!ie6Flag && !ie7Flag && !closeFlagList[id]){
				jqUl.removeAttr('style');
			}

			callback();

		}else{

			var valNumber = jqUl.children().size() + FVAL_NUMBER_SPAN;

			if(closeFlagList[id]){

				jqUlChildrenSort(jqUl);

				jqNumberSpan.html(valNumber);

				callback();

			}else{

				var jqLastLi = jqUl.children(':last');

				if(ie6Flag || ie7Flag){

					jqUlChildrenSort(jqUl);

					var interval = setInterval(function(){

						var jqNewLi = jqNewLiList.shift();

						jqNewLi.removeAttr('style');

						if(jqNewLiList.length == 0){

							jqNumberSpan.html(valNumber);

							callback();

						}

						if(jqNewLiList.length == 0){
							clearInterval(interval);
						}

					}, ADD_INTERVAL_TIME);

				}else{

					jqUl.animate({height: (jqLastLi.offset().top + jqLastLi.height() - (jqUl.offset().top)) + 'px'}, ADD_UL_ANIMATE_TIME, ADD_UL_ANIMATE_EASING, function(){

						for(var jqNewLiListKey in jqNewLiList){
							jqNewLiList[jqNewLiListKey].css('display', 'none').css('visibility', '');
						}

						jqUlChildrenSort(jqUl);

						var interval = setInterval(function(){

							var jqNewLi = jqNewLiList.shift();

							jqNewLi.fadeIn(ADD_NEW_LI_FADE_TIME, function(){

								jqNewLi.removeAttr('style');

								if(jqNewLiList.length == 0){

									jqUl.removeAttr('style');
									jqNumberSpan.html(valNumber);

									callback();

								}

							});

							if(jqNewLiList.length == 0){
								clearInterval(interval);
							}

						}, ADD_INTERVAL_TIME);

					});

				}

			}

		}

		// ----------------

	}

	// ----------------
	// イベント定義
	// ----------------

	function defEvent(){

		jqResultsCloseButtonList[defLevel].click(function(){ if(operatable){

			operatable = false;

			jqSearchQueryForm.stopNotice();

			var jqCloseButton = $(this);
			var jqCloseP      = jqCloseButton.parent();
			var jqUl          = jqCloseP.next();

			var id = jqCloseP.parent().attr('id');

			if(ie6Flag || ie7Flag){

				if(closeFlagList[id]){

					jqUl.removeAttr('style');

					closeFlagList[id] = false;

					jqCloseButton.html('閉じる');

				}else{

					jqUl.css('display', 'none');

					closeFlagList[id] = true;

					jqCloseButton.html('開く');

				}

				operatable = true;

			}else{

				jqUl.slideToggle(CLODE_UL_SLIDE_TIME, function(){

					if(closeFlagList[id]){

						closeFlagList[id] = false;

						jqCloseButton.html('閉じる');

						jqUl.removeAttr('style');

					}else{

						closeFlagList[id] = true;

						jqCloseButton.html('開く');

					}

					operatable = true;

				});

			}

		}});

		jqResultsAddButtonList[defLevel].click(function(){ if(operatable){

			operatable = false;

			jqSearchQueryForm.stopNotice();

			var jqAddButton = $(this);
			var jqAddP      = jqAddButton.parent();
			var jqResultsLi = jqAddP.parent();

			jqAddButton.html(VAL_LOADING);

			var valPartEncArtist = getFooterStr('/', jqResultsLi.children(':first').children(':first').attr('href'));
			var page             = ++addPageList[jqResultsLi.attr('id')];

			$.ajax({

				type: 'GET',
				url:  confRootDir + 'etc/add/' + valPartEncArtist + '/' + page,

				error: function(){
					notice(jqAddButton);
				},

				success: function(json){

					if(json == ''){

						jqAddButton.attr('disabled', 'disabled').html('なかった');
						jqResultsLi.attr('class', 'finish');

						operatable = true;

					}else{

						var resultListItems = eval('(' + json + ')');

						appendResultListItems(resultListItems, function(){

							jqAddButton.html('もっと！');

							operatable = true;

						});

					}

				}

			});

		}});

	}

	jqSearch.submit(function(){ if(operatable){

		if(jqSearchQueryForm.trim() == ''){
			return jqSearchQueryForm.startNotice(NOTICE_CLASS_NAME, NOTICE_COUNT, NOTICE_INTERVAL_TIME, true, '');
		}

	}else{
		return false;
	}});

	jqSearchButton.click(function(){ if(operatable){

		operatable = false;

		jqSearchQueryForm.stopNotice();

		var jqSearchButton = $(this);

		if(addPageList[searchID] != null){
			if(addPageList[searchID] == searchPage){
				addPageList[searchID]++;
			}
		}

		var page = ++searchPage;

		jqSearchButton.html(VAL_LOADING);

		$.ajax({

			type: 'GET',
			url:  confRootDir + 'etc/search/' + argEncQuery + '/' + page,

			error: function(){
				notice(jqSearchButton);
			},

			success: function(json){

				if(json == ''){

					jqSearchButton.attr('class', 'finish').attr('disabled', 'disabled').html('もうなかった');

					if(addPageList[searchID] != null){

						var jqResultsLi = $('#' + searchID);
						var jqAddButton = jqResultsLi.children('p.add').children(':first');

						jqAddButton.attr('disabled', 'disabled').html('ないよ');
						jqResultsLi.attr('class', 'finish');

					}

					operatable = true;

				}else{

					var all = eval('(' + json + ')');

					var allResultList = all['allResultList'];
					var artistList    = all['artistList'];
					var artistListLen = artistList.length;

					for(var i = 0; i < artistListLen - 1; i++){

						appendResultListItems(allResultList[artistList[i]], function(){
						});

					}

					appendResultListItems(allResultList[artistList[i]], function(){

						if(newResultsLiFlag){

							defLevel++;

							newResultsLiFlag = false;

							jqResultsCloseButtonList[defLevel] = $('p.close button.new');
							jqResultsAddButtonList[defLevel]   = $('p.add button.new');
							jqResultsLiList                    = $('#results>li');
							jqResultsLiListLen                 = jqResultsLiList.length;

							jqResultsCloseButtonList[defLevel].removeAttr('class');
							jqResultsAddButtonList[defLevel].removeAttr('class');

							defEvent();

						}

						jqSearchButton.html('もっと検索!?');

						operatable = true;

					});

				}

			}

		});

	}
		return false;
	});

	// ----------------

});