
var UNIQUE_KEY = "id";
var HDJDLR_CD = "hdjdlr_cd";
var HDJDLR_PW = "hdjdlr_pw";
var LOGIN_OK = "login_ok";
var LOGIN_ERR = "login_err";
var SERVER_HOST = "http://testapi.vrod.jp/";

// class initialize declarations

var RequestParamHandler = function() {
	this.initialize();
}

var JsonSearch = function(formHtmlId) {
	this.initialize(formHtmlId);
}

var JsonList = function(tableName, pageArray, keyArray, curPageCount, defaultSearchFlag, searchQuery, optionParam) {
	this.initialize(tableName, pageArray, keyArray, curPageCount, defaultSearchFlag, searchQuery, optionParam);
}

var JsonDetail = function(tableName, pageArray) {
	this.initialize(tableName, pageArray);
}


// class implementation

RequestParamHandler.prototype = {

	activeValue : 'active',
	qsParm : new Array(),

	initialize: function() {
		var query = window.location.search.substring(1);
		var parms = query.split('&');
		for (var i=0; i<parms.length; i++) {
			var pos = parms[i].indexOf('=');
			if (pos > 0) {
				var key = parms[i].substring(0,pos);
				var val = parms[i].substring(pos+1);
				this.qsParm[key] = decodeURI(val);
			}
		}
	},
	retrieveGETqs: function() {
		return this.qsParm;
	},
	generateParamStringExclude: function(excludeParamName) {
		var params = "";
		for(var parmKey in this.qsParm) {
			if(excludeParamName != null && parmKey == excludeParamName) {
				continue;
			}
			if(typeof(this.qsParm[parmKey]) != 'function') {
				params += "&" + parmKey + "=" + encodeURI(this.qsParm[parmKey]);
			}
		}
		return params;
	},
	generateParamString: function() {
		return this.generateParamStringExclude(null);
	},
	generateCertificateParam: function() {
		var param = '';
		if(document.getElementById(HDJDLR_CD) == null) {
			return param;
		}
		param += ('&' + HDJDLR_CD + '=' + document.getElementById(HDJDLR_CD).innerHTML);
		param += ('&' + HDJDLR_PW + '=' + document.getElementById(HDJDLR_PW).innerHTML);
		return param;
	},
	getParam: function(key) {
		return this.qsParm[key];
	},
	exchangeParamString: function(paramMap) {
		var queryString = '';
		for(var key in paramMap) {
			if(paramMap[key] == this.activeValue) {
				queryString = queryString + '&' + key + '=' + this.getParam('id');
			} else {
				queryString = queryString + '&' + key + '=' + paramMap[key];
			}
		}
		return queryString;
	}
}

JsonList.prototype = {
	tableName: null,
	curPageCount: null,
	keyArray: null,
	searchHtmlPage: null,
	listHtmlPage: null,
	detailHtmlPage: null,
	searchQuery: '',

	defaultSearchFlag: false,
	listitemHtmlId: "item",
	page: 0,
	maxPage: 0,
	pagingKey: "page",
	linkKey: "link",
	reqHandler: null,

	detailHtmlLabel: "詳細",
	firstColCount: 0,

	initialize: function(tableName, pageArray, keyArray, curPageCount, defaultSearchFlag, searchQuery, optionParam) {
		this.tableName = tableName;
		this.searchHtmlPage = pageArray[0];
		this.listHtmlPage = pageArray[1];
		this.detailHtmlPage = pageArray[2];
		this.keyArray = keyArray;
		this.curPageCount = curPageCount;
		this.reqHandler = new RequestParamHandler();
		if(defaultSearchFlag != null) {
			this.defaultSearchFlag = defaultSearchFlag;
		}
		if(this.searchQuery != null && searchQuery != null) {
			this.searchQuery = this.reqHandler.exchangeParamString(searchQuery);
		}
		if(optionParam != null) {
			if(optionParam['detailHtmlLabel'] != null) {
				this.detailHtmlLabel = optionParam['detailHtmlLabel'];
			}
			if(optionParam['firstColCount'] != null) {
				this.firstColCount = optionParam['firstColCount'];
			}
		}
	},

	removeListResult: function() {
		for(var idx=0; idx<this.curPageCount; idx++) {
			var listitemObj = document.getElementById(this.tableName + this.listitemHtmlId + idx);
			if(listitemObj == null) {
				break;
			}
			document.getElementById(this.tableName).removeChild(listitemObj);
		}
	},

	showListResult: function(data) {
		var div;
		if(data['0']['login']) {
			div = document.getElementById(LOGIN_ERR);
		} else {
			div = document.getElementById(LOGIN_OK);
		}
		if(div != null) {
			div.parentNode.removeChild(div);
		}
		delete data['0'];

		var prevIdArray = new Array(this.tableName + "_prev", this.tableName + "_prev_upper", this.tableName + "_prev_under");
		var nextIdArray = new Array(this.tableName + "_next", this.tableName + "_next_upper", this.tableName + "_next_under");

		if(data == '') {
			for(var i=0; i<prevIdArray.length; i++) {
				this.hideObj(prevIdArray[i]);
			}
			for(var i=0; i<nextIdArray.length; i++) {
				this.hideObj(nextIdArray[i]);
			}
			return;
		}

		this.removeListResult();

		var recCount = this.appendChildTag(data);

		this.maxPage = this.calcMaxPage(recCount, this.curPageCount);

		if(this.maxPage == this.page+1) {
			for(var i=0; i<nextIdArray.length; i++) {
				this.hideObj(nextIdArray[i]);
			}
		}
		if(this.page == 0) {
			for(var i=0; i<prevIdArray.length; i++) {
				this.hideObj(prevIdArray[i]);
			}
		}

		this.displayPagingMenu(recCount);
	},

	hideObj: function(id) {
		var elem = document.getElementById(id);
		if(elem == null) {
			return;
		}
		elem.style.visibility = 'hidden';
	},

	displayPagingMenu: function(recCount) {
		var listCountObj = document.getElementById(this.tableName + "_listcount");
		if(listCountObj == null) {
			return;
		}
		var startPage = this.page * this.curPageCount + 1;
		var endPage = (this.page+1) * this.curPageCount;
		if(recCount < endPage) {
			endPage = recCount;
		}
		if(this.curPageCount == 0) {
			listCountObj.innerHTML = '全' + recCount + '件';
		} else {
			listCountObj.innerHTML = startPage + '〜' + endPage + '件／全' + recCount + '件';
		}
	},

	calcMaxPage: function(recCount, curPageCount) {
		var maxPage = 0;
		if(curPageCount != 0 && recCount != 0) {
			maxPage = Math.floor(recCount / curPageCount);
			if(recCount % curPageCount != 0) {
				maxPage = maxPage + 1;
			}
		}
		return maxPage;
	},

	getChildTagName: function(parentTag) {
		var childTagName;
		if(parentTag.tagName == 'TBODY') {
			childTagName = "tr";
		} else if (parentTag.tagName == 'DIV') {
			childTagName = "div";
		}
		return childTagName;
	},

	getGrandChildTagName: function(parentTag) {
		var grandChildTagName;
		if(parentTag.tagName == 'TBODY') {
			grandChildTagName = "th";
		} else if (parentTag.tagName == 'DIV') {
			grandChildTagName = "div";
		}
		return grandChildTagName;
	},

	appendChildTag: function(data) {
		var recCount = 0;
		var rowCount = 0;
		var parentTag = document.getElementById(this.tableName + "_list");
		var childTag;

		if(parentTag == null || (parentTag.tagName != 'TBODY' && parentTag.tagName != 'DIV')) {
			alert('一覧出力するタグにidが指定されていません。対応しているタグはTBODYとDIVタグのみです。');
			return;
		}

		for(var key in data) {
			if(this.curPageCount > 0) {
				if((this.page * this.curPageCount) > recCount || recCount >= ((this.page+1) * this.curPageCount)) {
					recCount++;
					rowCount++;
					continue;
				}
			}
			if(this.firstColCount == 0) {
				childTag = this.generateChildTag(parentTag, key, data, 0, this.keyArray.length);
				childTag.id = this.tableName + this.listitemHtmlId + (recCount - this.page * this.curPageCount);
				parentTag.appendChild(childTag);
				rowCount++;
			} else {
				childTag = this.generateChildTag(parentTag, key, data, 0, this.firstColCount);
				childTag.id = this.tableName + this.listitemHtmlId + (recCount - this.page * this.curPageCount);
				parentTag.appendChild(childTag);

				childTag = this.generateChildTag(parentTag, key, data, this.firstColCount, this.keyArray.length);
				childTag.id = this.tableName + this.listitemHtmlId + (recCount - this.page * this.curPageCount);
				parentTag.appendChild(childTag);
			}
			recCount++;
		}

		return recCount;
	},

	generateChildTag: function(parentTag, key, data, offset, len) {
		var childTagName = this.getChildTagName(parentTag);
		var grandChildTagName = this.getGrandChildTagName(parentTag);

		if(childTagName == null) {
			alert("一覧表示時にサポートされていないタグです。TBODYかDIVにidを指定してください");
			return;
		}

		var childTag = document.createElement(childTagName);

		for(var i=offset; i<len; i++) {
			var grandChildTag = document.createElement(grandChildTagName);
			var content;
			if(this.keyArray[i] == this.linkKey) {
				url  = this.detailHtmlPage;
				url += '?' + UNIQUE_KEY + '=' +  data[key][UNIQUE_KEY];
				url += this.reqHandler.generateParamStringExclude(UNIQUE_KEY);
				content  = '<a href="' + url  + '">';
				content += this.detailHtmlLabel;
				content += '</a>';
			} else if(this.keyArray[i].substring(0, 4) == this.linkKey) {
				keyStr = this.keyArray[i].substring(5);
				url  = data[key][keyStr];
				if(url != null) {
					url += '?' + UNIQUE_KEY + '=' +  data[key][UNIQUE_KEY];
					url += this.reqHandler.generateParamStringExclude(UNIQUE_KEY);
					content  = '<a href="' + url  + '">';
					content += this.detailHtmlLabel;
					content += '</a>';
				}
			} else {
				content = data[key][this.keyArray[i]];
			}
			if(content == null || content == '') {
				grandChildTag.innerHTML = '&nbsp;';
			} else {
				grandChildTag.innerHTML = content;
			}
			grandChildTag.className = this.tableName + '_' + this.keyArray[i];
			childTag.appendChild(grandChildTag);
		}

		return childTag;
	},

	back: function() {
		if(this.page == 0) {
			return;
		}
		var url = this.listHtmlPage + this.reqHandler.generateParamStringExclude(this.pagingKey).replace("&", "?");
		self.location.href=url + "&" + this.pagingKey + "=" + (this.page-1);
	},

	next: function() {
		if(this.maxPage == this.page+1) {
			return;
		}
		var url = this.listHtmlPage + this.reqHandler.generateParamStringExclude(this.pagingKey).replace("&", "?");
		self.location.href=url + "&" + this.pagingKey + "=" + (this.page+1);
	},

	loadList: function(instanceName) {
		var qsParm = this.reqHandler.retrieveGETqs();
		if(!this.defaultSearchFlag) {
			if(qsParm[this.pagingKey] != null) {
				this.page = parseInt(qsParm[this.pagingKey]);
			}
			this.searchQuery = this.reqHandler.generateParamString(); 
		}
		var url = SERVER_HOST
		 + this.tableName 
		 + "/list"
		 + "?callback=" + instanceName + ".showListResult"
		 + this.reqHandler.generateCertificateParam()
		 + this.searchQuery;
		this.callRemoteImpl(url);
	},

	callRemoteImpl: function(url) {
		var tag = document.createElement("script");
		tag.setAttribute("type", "text/javascript");
		tag.setAttribute("charset", "utf-8");
		tag.setAttribute("src", url);
		document.getElementsByTagName("head").item(0).appendChild(tag);
	},

	toSearch: function() {
		self.location.href = this.searchHtmlPage + this.reqHandler.generateParamString().replace("&", "?");
	}
}

JsonDetail.prototype = {
	tableName: null,
	searchHtmlPage: null,
	listHtmlPage: null,
	detailHtmlPage: null,
	reqHandler: null,
	defaultSearchFlag: false,
	searchQuery: '',
	bannerType: null,
	googleMapKey: 'googlemap',

	initialize: function(tableName, pageArray) {
		this.tableName = tableName;
		this.reqHandler = new RequestParamHandler();
		if(pageArray != null) {
			this.searchHtmlPage = pageArray[0];
			this.listHtmlPage = pageArray[1];
			this.detailHtmlPage = pageArray[2];
		}
	},

	loadBanner: function(instanceName, agencyCode, bannerType) {
		if(bannerType != null) {
			this.bannerType = bannerType.toLowerCase();
		}
		var qsParm = this.reqHandler.retrieveGETqs();
		var url = SERVER_HOST
		 + this.tableName 
		 + "/detail"
		 + "?callback=" + instanceName + ".showDetailResult"
		 + '&' + UNIQUE_KEY + "=" + agencyCode + this.bannerType;
		this.callRemoteImpl(url);
	},

	loadDetail: function(instanceName, searchQuery) {
		var qsParm = this.reqHandler.retrieveGETqs();
		var url = SERVER_HOST
		 + this.tableName 
		 + "/detail"
		 + "?callback=" + instanceName + ".showDetailResult"
		 + this.reqHandler.generateCertificateParam();
		if(searchQuery == null) {
			 url = url + '&' + UNIQUE_KEY + "=" + qsParm[UNIQUE_KEY];
		} else {
			 url = url + this.reqHandler.exchangeParamString(searchQuery);
		}
		this.callRemoteImpl(url);
	},

	showDetailResult: function(data) {
		var div;
		if(data['0']['login']) {
			div = document.getElementById(LOGIN_ERR);
		} else {
			div = document.getElementById(LOGIN_OK);
		}
		if(div != null) {
			div.parentNode.removeChild(div);
		}
		delete data['0'];

		for(var key in data) {
			for(var itemkey in data[key]) {
				var elem;
				if(this.bannerType == null) {
					elem = document.getElementById(this.tableName + '_' + itemkey);
				} else {
					elem = document.getElementById(this.tableName + '_' + this.bannerType + '_' + itemkey);
				}
				if(elem == null) {
					this.loadGoogleMap(itemkey, data[key][itemkey]);
					continue;
				}
				if(elem.tagName == 'IMG' || elem.tagName == 'IFRAME') {
					elem.src = data[key][itemkey];
				} else if(elem.tagName == 'A') {
					elem.href = data[key][itemkey];
				} else {
					if(data[key][itemkey] == null) {
						elem.innerHTML = '';
					} else {
						elem.innerHTML = data[key][itemkey];
					}
				}
			}
		}
	},
 
	loadGoogleMap: function(itemkey, data) {
		var elem = document.getElementById(this.tableName + '_' + this.googleMapKey + '_' + itemkey);
		if (elem == null || !GBrowserIsCompatible() || data.indexOf(',') == -1) {
			return;
		}

		var x = data.substring(0, data.indexOf(','));
		var y = data.substring(data.indexOf(',')+1);

		var map = new GMap2(elem);
		var point = new GLatLng(x, y);
		map.setCenter(point, 13);
		map.addControl(new GSmallMapControl());
		var marker = new GMarker(point);
		map.addOverlay(marker);
	},

	callRemoteImpl: function(url) {
		var tag = document.createElement("script");
		tag.setAttribute("type", "text/javascript");
		tag.setAttribute("charset", "utf-8");
		tag.setAttribute("src", url);
		document.getElementsByTagName("head").item(0).appendChild(tag);
	},

	toList: function() {
		self.location.href=this.listHtmlPage + this.reqHandler.generateParamStringExclude(UNIQUE_KEY).replace("&", "?");
	}
}

JsonSearch.prototype = {
	detailHtmlPage: null,
	searchFormHtmlId: "search_form",
	reqHandler: null,

	initialize: function(formHtmlId) {
		this.reqHandler = new RequestParamHandler();
		if(formHtmlId != null) {
			this.searchFormHtmlId = formHtmlId;
		}
	},

	loadSearch: function() {
		var qsParm = this.reqHandler.retrieveGETqs();
		var formObj = document.getElementById(this.searchFormHtmlId);
		for(var idx=0; idx<formObj.elements.length; idx++) {
			for(var parmKey in qsParm) {
				if(formObj.elements[idx].name == parmKey) {
					if(formObj.elements[idx].type == 'radio' || formObj.elements[idx].type == 'checkbox') {
						if(formObj.elements[idx].value == qsParm[parmKey]) {
							formObj.elements[idx].checked = true;
						} else {
							formObj.elements[idx].checked = false;
						}
					} else {
						formObj.elements[idx].value = qsParm[parmKey];
					}
				}
			}
		}
	},

	toList: function() {
		var params = '';
		var formObj = document.getElementById(this.searchFormHtmlId);
		for(var idx=0; idx<formObj.elements.length; idx++) {
			var elem = formObj.elements[idx];
			if(elem.type == 'button' || elem.type == 'submit') {
				continue;
			}
			if(elem.type == 'radio' && !elem.checked) {
				continue;
			}
			if(elem.type == 'checkbox' && !elem.checked) {
				continue;
			}
			params += "&" + elem.name + "=" + encodeURI(elem.value);
		}
		self.location.href = formObj.action + params.replace("&", "?");
	}
}

