/* ＵＴＦー８ */

/*
usage sample 1:

 */

/*
 * Searcher constructor
 */
function Searcher() {
}

/*
 * initialize
 */
function _Searcher() {
	Searcher.prototype.search = search;
	Searcher.prototype.addCatno = addCatno;

	function addCatno(catno) {
		catnos[catnos.length] = catno;
	}
	var catnos = [];
	
	var cond;
	
	function search() {
		createList();
		cond = {};
		cond.searchTarget = $('searchTarget').value;
		if (cond.searchTarget == 'recordingdate') {
			var fromdate = new Date(parseInt($('fromyear').value), parseInt($('frommonth').value), 1);
			var todate = new Date(parseInt($('toyear').value), parseInt($('tomonth').value) + 1, 1);
			cond.datebegin = fromdate.getTime() + (fromdate.getTimezoneOffset() * 60000);
			cond.dateend = todate.getTime() + (todate.getTimezoneOffset() * 60000);
			//alert(cond.datebegin + '-' + cond.dateend);
		} else {
			var searchText = $('searchText').value;
			if (!searchText) {
				$('searchText').focus();
				return;
			}
			cond.searchText = searchText;
		}
		for (var i = 0; i < catnos.length; i++) {
			getAlbum(catnos[i]);
		}
	}
	
	function match(str, searchText) {
		//KanaTable
		if (contains(str, searchText)) {
			return true;
		}
		str = KanaTable[str];
		return contains(str, searchText);
	}

	function contains(str, searchText) {
		if (!str || !searchText) {
			return false;
		}
		str = unescapeHtml(str);
		return (str && str.toLowerCase().indexOf(searchText) > -1);
	}

	function unescapeHtml(str) {
		if (!str) {
			return '';
		}
		var pos = str.indexOf('&amp;');
		if (pos > -1) {
			return unescapeHtml(str.substring(0, pos)) + '&' + unescapeHtml(str.substring(pos + 5));
		}
		pos = str.indexOf('&gt;');
		if (pos > -1) {
			return unescapeHtml(str.substring(0, pos)) + '>' + unescapeHtml(str.substring(pos + 5));
		}
		pos = str.indexOf('&lt;');
		if (pos > -1) {
			return unescapeHtml(str.substring(0, pos)) + '<' + unescapeHtml(str.substring(pos + 5));
		}
		pos = str.indexOf('&quot;');
		if (pos > -1) {
			return unescapeHtml(str.substring(0, pos)) + '"' + unescapeHtml(str.substring(pos + 5));
		}
		return str;
	}

	function filter(cond, obj) {
		if (cond.searchTarget == 'recordingdate') {
			var begin = cond.datebegin;
			var end = cond.dateend;
			var list = obj['recording-dates'];
			if (!list) {
				return '';
			}
			//alert(obj['recording-on']);
			for (var i = 0; i < list.length; i++) {
			//alert(list[i]);
				if (begin <= list[i] && list[i] < end) {
					return obj['recording-on'];
				}
			}
			return '';
		}
		var searchText = cond.searchText.toLowerCase();
		if (cond.searchTarget == 'artist') {
			if (match(obj['artist'], searchText)) {
				return obj['artist'];
			}
			if (match(obj['artist-name'], searchText)) {
				return obj['artist-name'];
			}
			var personnel = obj['personnel'];
			for (var i = 0; i < personnel.length; i++) {
			if (match(personnel[i]['player'], searchText)) {
					return personnel[i]['player'];
			}
			if (match(personnel[i]['player-name'], searchText)) {
					return personnel[i]['player-name'];
			}
			}
		} else if (cond.searchTarget == 'albumtitle') {
			if (match(obj['title'], searchText)) {
				return obj['title'];
			}
			if (match(obj['title-name'], searchText)) {
				return obj['title-name'];
			}
		} else if (cond.searchTarget == 'tracktitle') {
			var trackGroups = obj['trackGroups'];
			if (trackGroups) {
				for (var j = 0; j < trackGroups.length; j++) {
					var tracks = trackGroups[j]['tracks'];
					for (var i = 0; i < tracks.length; i++) {
						if (match(tracks[i]['track'], searchText)) {
							return tracks[i]['track'];
						}
						if (match(tracks[i]['track-title'], searchText)) {
							return tracks[i]['track-title'];
						}
					}
				}
			} else {
				var tracks = obj['tracks'];
				for (var i = 0; i < tracks.length; i++) {
					if (match(tracks[i]['track'], searchText)) {
						return tracks[i]['track'];
					}
					if (match(tracks[i]['track-title'], searchText)) {
						return tracks[i]['track-title'];
					}
				}
			}
		} else if (cond.searchTarget == 'catno') {
			if (contains(obj['catno'], searchText)) {
				return obj['catno'];
			}
		} else {
			alert(cond.searchTarget);
		}
		return '';
	}

	function createList() {
		$('searchResult').innerHTML = '<ul id="searchResultList"></ul>';
	}

	function addResult(obj, matchText) {
		var img = '<img src="/v2/' + obj['imagePrefix'] + '_74px' + obj['imageSuffix'] + '" alt="' + obj['catno'] + '"/>';
		if (matchText == obj['catno'] || matchText == obj['title-name'] || matchText == obj['artist-name']) {
			matchText = '';
		} else {
			matchText = ' <span>[' + matchText + ']</span>';
		}
		var li = '<li><a href="/v2/release/' + obj['catno'] + '.html">' + img + '<p><span>' + obj['catno'] + '</span><span style="font-weight: bold;">'
				+ obj['title-name'] + '</span>-<span>'
				+ obj['artist-name'] + '</span>'
				+ matchText + '</p></a></li>';
		$('searchResultList').innerHTML += li;
	}
	var albums = {};

	function getAlbum(id) {
		//var url = 'http://www.venusrecord.com/v2/json/' + id + '.json';
		var url = '/v2/json/' + id + '.json';
		
		if (albums[url]) {
			var matchText = filter(cond, albums[url]);
			if (matchText) {
				addResult(albums[url], matchText);
			}
			return;
		}
		var json = new Json(url);
		json.onreceive = function (obj) {
			albums[url] = obj;
			var matchText = filter(cond, albums[url]);
			if (matchText) {
				addResult(albums[url], matchText);
			}
		};
		json.onerror = function () {
			//onAlbumError(this.url);
			//alert("onAlbumError");
		};
		json.send();
	}
}

_Searcher();
