﻿/********************************
 *	Minimal Javascript			*
 *				by IkemenHaizin	*
 ********************************/
var MJ = {
	extend : function(target, source) {
		target = MJ.isFunction(target) ? target.prototype : target;
		source = MJ.isFunction(source) ? source.prototype : source;
		for (var i in source) {
			if (source.hasOwnProperty(i)) {
				target[i] = source[i];
			}
		}
	},
	
	isFunction : function(obj) {
		return typeof obj == 'function';
	},
	
	isString : function(obj) {
		return typeof obj == 'string';
	},
	
	isNumber : function(obj) {
		return typeof obj == 'number';
	},
	
	isNull : function(obj) {
		return obj === null;
	},
	
	isUndefined : function(obj) {
		return obj === undefined;
	}
};

/********************************
 *	Util						*
 ********************************/
MJ.Util = {
	getKeys : function(arr) {
		var keys = [];
		for (var i in arr) {
			keys.push(i);
		}
		return keys;
	},
	
	getRandam : function(arr) {
		var keys = MJ.Util.getKeys(arr);
		var r = Math.floor(Math.random() * keys.length);
		return arr[keys[r]];
	},
	
	isExistKey : function(arr, key) {
		for (var i in arr) {
			if (key == i) {
				return true;
			}
		}
		return false;
	},
	
	isExistValue : function(arr, value) {
		for (var i in arr) {
			if (arr[i] == value) {
				return true;
			}
		}
		return false;
	},
	
	sortByKey : function(hash) {
		var arr = [];
		for (var key in hash) {
			arr.push(key);
		}
		arr.sort(
			function (a, b) {
				if (a > b) {
					return 1;
				}
				if (a < b) {
					return -1;
				}
				return 0;
			}
		);
		for (var i = 0; i < arr.length; i++) {
			var val = hash[arr[i]];
			delete hash[arr[i]];
			hash[arr[i]] = val;
		}
		return hash;
	},
	
	deleteByValue : function(arr, value) {
		for (var i in arr) {
			if ((arr[i] === value) && arr.hasOwnProperty(i)) {
				return delete arr[i];
			}
		}
		return false;
	},
	
	clearArray : function(arr) {
		for (var i in arr) {
			delete arr[i];
		}
	},
	
	ceil : function(number, n) {
		var r = 0;
		if (n > 0) {
			var p = Math.pow(10, n);
			r = Math.ceil(number * p) / p;
		} else {
			r = Math.ceil(number);
		}
		return MJ.Util.addZero(r, null, n);
	},
	
	floor : function(number, n) {
		var r = 0;
		if (n > 0) {
			var p = Math.pow(10, n);
			r = Math.floor(number * p) / p;
		} else {
			r = Math.floor(number);
		}
		return MJ.Util.addZero(r, null, n);
	},
	
	round : function(number, n) {
		var r = 0;
		if (n > 0) {
			var p = Math.pow(10, n);
			r = Math.round(number * p) / p;
		} else {
			r = Math.round(number);
		}
		return MJ.Util.addZero(r, null, n);
	},
	
	addZero : function(number, fn, bn) {
		var arr = String(number).split('.');
		if (fn > 0) {
			while (arr[0].length < fn) {
				arr[0] = '0' + arr[0];
			}
		}
		if (bn > 0) {
			if (!arr[1]) {
				arr[1] = '';
			}
			while (arr[1].length < bn) {
				arr[1] += '0';
			}
		} else {
			return arr[0];
		}
		return arr.join('.');
	},
	
	sleep : function(time) {
		var current = new Date().getTime();
		var last = current + time;
		while (current < last) {
			current = new Date().getTime();
		}
	},
	
	dateToString : function(date) {
		var y = date.getYear();
		y = (y < 2000) ? y + 1900 : y;
		var m = MJ.Util.addZero(date.getMonth() + 1, 2);
		var d = MJ.Util.addZero(date.getDate(), 2);
		return y + '.' + m + '.' + d;
	},
	
	parseCSV : function(text) {
		var tokenizer = new RegExp(',|\r?\n|[^,"\r\n][^,\r\n]*|"(?:[^"]|"")*"', 'g');
		var record = 0, field = 0, data = [['']], qq = /""/g;
		text.replace(/\r?\n$/, '').replace(tokenizer, function(token) {
			switch (token) {
				case ',': 
					data[record][++field] = '';
					break;
				case '\n': case '\r\n':
					data[++record] = [''];
					field = 0;
					break;
				default:
					data[record][field] = (token.charAt(0) != '"') ? token : token.slice(1, -1).replace(qq, '"');
			}
		});
		return data;
	}
};

/*--------------------------- Url ---------------------------*/
MJ.Util.Url = function(url) {
	if (!url) {
		url = '';
	}
	if (url.match(/^\#/)) {
		this.link = url.slice(1);
		return;
	}
	if (url.match(/\#$/)) {
		url = url.slice(-1);
	}
	if (url.match(/\#/)) {
		var arr = url.split('#');
		url = arr.shift();
		this.link = arr.shift();
	}
	var qsp_arr = url.split('?');
	this.url = qsp_arr.shift();
	this.option_hash = [];
	if (qsp_arr[0]) {
		var asp_arr = qsp_arr[0].split('&');
		for (var i in asp_arr) {
			var esp_arr = asp_arr[i].split('=');
			this.option_hash[esp_arr[0]] = esp_arr[1];
		}
	}
};
MJ.Util.Url.prototype = {
	getOption : function(name) {
		return this.option_hash[name];
	},
	
	getLink : function() {
		return this.link;
	},
	
	addOptionByHash : function(hash) {
		for (var i in hash) {
			this.addOption(i, hash[i]);
		}
	},
	
	addOption: function(name, value) {
		this.option_hash[name] = value;
	},
	
	removeOption : function(name) {
		delete this.option_hash[name];
	},
	
	toString : function() {
		var rtn = this.url;
		var arr = [];
		for (var i in this.option_hash) {
			arr.push(i + '=' + this.option_hash[i]);
		}
		if (arr.length > 0) {
			rtn += '?' + arr.join('&');
		}
		if (this.link) {
			rtn += '#' + this.link;
		}
		return rtn;
	}
};

/*-------------------------- Form ---------------------------*/
MJ.Util.Form = function() {
	this.value_hash	= [];
};
MJ.Util.Form.prototype = {
	getValues : function(hash) {
		var rtn_hash = [];
		for (var i in this.value_hash) {
			if (hash && MJ.Util.isExistKey(hash, i)) {
				if (!MJ.isNull(hash[i]) && !MJ.isUndefined(hash[i])) {
					rtn_hash[i] = hash[i];
				}
			} else {
				rtn_hash[i] = this.value_hash[i][0];
			}
		}
		return rtn_hash;
	}
};
MJ.Util.Form.extractForm = function(doc) {
	var rtn_arr = [];
	var form_nl = doc.getElementsByTagName('form');
	for (var i = 0; i < form_nl.length; i++) {
		var form = new MJ.Util.Form();
		form.name		= form_nl.item(i).getAttribute('name');
		form.action		= form_nl.item(i).getAttribute('action');
		form.method		= form_nl.item(i).getAttribute('method');
		form.enctype	= form_nl.item(i).getAttribute('enctype');
		
		var input_nl = form_nl.item(i).getElementsByTagName('input');
		for (var j = 0; j < input_nl.length; j++) {
			var name = input_nl.item(j).getAttribute('name');
			if (!name) {
				name = input_nl.item(j).getAttribute('type');
			}
			if (!form.value_hash[name]) {
				form.value_hash[name] = [];
			}
			form.value_hash[name].push(input_nl.item(j).getAttribute('value'));
		}
		
		var textarea_nl = form_nl.item(i).getElementsByTagName('textarea');
		for (var j = 0; j < textarea_nl.length; j++) {
			var name = textarea_nl.item(j).getAttribute('name');
			if (!name) {
				name = 'textarea';
			}
			if (!form.value_hash[name]) {
				form.value_hash[name] = [];
			}
			form.value_hash[name].push(textarea_nl.item(j).getAttribute('value'));
		}
		
		var select_nl = form_nl.item(i).getElementsByTagName('select');
		for (var j = 0; j < select_nl.length; j++) {
			var name = select_nl.item(j).getAttribute('name');
			if (!name) {
				name = 'select';
			}
			if (!form.value_hash[name]) {
				form.value_hash[name] = [];
			}
			var option_nl = select_nl.item(j).getElementsByTagName('option');
			for (var k = 0; k < option_nl.length; k++) {
				form.value_hash[name].push(option_nl.item(k).getAttribute('value'));
			}
		}
		
		rtn_arr.push(form);
	}
	return rtn_arr;
};

/********************************
 *	Event						*
 ********************************/
MJ.Evnt = {
	addListener : function(elm, type, func, cap) {
		try {
			elm.addEventListener(type, func, cap);
			return true;
		} catch(e) {}
		try {
			elm.attachEvent('on' + type, func);
			return true;
		} catch(e) {}
		return false;
	}
};

/*----------------------- CustomEvent -----------------------*/
MJ.Evnt.CustomEvent = function() {};
MJ.extend(MJ.Evnt.CustomEvent.prototype, {
	addListener : function(obj, func_name) {
		if (!obj || !func_name) {
			return false;
		}
		if ((this.listeners === null) || (this.listeners === undefined)) {
			this.listeners = [];
		}
		if ((this.listeners[func_name] === null) || (this.listeners[func_name] === undefined)) {
			this.listeners[func_name] = [];
		}
		if (!MJ.Util.isExistValue(this.listeners[func_name], obj)) {
			this.listeners[func_name].push(obj);
		}
		return true;
	},
	
	removeListener : function(obj, func_name) {
		if (obj && func_name && this.listeners && this.listeners[func_name]) {
			return MJ.Util.deleteByValue(this.listeners[func_name], obj);
		}
		return false;
	},
	
	dispatch : function(func_name) {
		if (this.listeners && this.listeners[func_name]) {
			for (var i in this.listeners[func_name]) {
				if (MJ.isFunction(this.listeners[func_name][i][func_name])) {
					this.listeners[func_name][i][func_name](this);
				}
			}
		}			
	}
});

/********************************
 *	Ajax						*
 ********************************/
MJ.Ajax = {
	create : function() {
		try {
			return new XMLHttpRequest();
		} catch(e) {}
		try {
			return new ActiveXObject('MXSML2.XMLHTTP');
		} catch(e) {}
		try {
			return new ActiveXObject('Microsoft.XMLHTTP');
		} catch(e) {}
		return null;
	}
};

/*------------------------- ExAjax --------------------------*/
MJ.Ajax.ExAjax = function() {
	if (!this.initialize()) {
		return null;
	}
};
MJ.extend(MJ.Ajax.ExAjax, MJ.Evnt.CustomEvent);
MJ.extend(MJ.Ajax.ExAjax.prototype, {
	initialize : function() {
		if (this.ajax = MJ.Ajax.create()) {
			var exAjax	= this;	//	onreadystatechangeメソッド↓でexAjaxを参照するための変数宣言
			this.ajax.onreadystatechange = function() {
				if (exAjax.ajax.readyState == 4) {
					if (exAjax.ajax.status == 200) {
						exAjax.dispatch('successRequest');
					} else {
						exAjax.dispatch('failureRequest');
					}
					exAjax.dispatch('completeRequest');
				}
			};
			return true;
		} else {
			return false;
		}
	},
	
	getResponseText : function() {
		return this.ajax.responseText;
	},
	
	getResponseXML : function() {
		return this.ajax.responseXML;
	},
	
	getReadyState : function() {
		return this.ajax.readyState;
	},
	
	getStatus : function() {
		return this.ajax.status;
	},
	
	getStatusText : function() {
		return this.ajax.StatusText;
	},
	
	request : function(url, method, sync) {
		if (!url) {
			return false;
		}
		if (!method) {
			method = 'GET';
		}
		this.ajax.open(method, url, sync);
		this.ajax.send(null);
		this.dispatch('startRequest');
	},
	
	requestCS : function(curl_path, sync, url_str, method, type, cookie, referer) {
		var url = new MJ.Util.Url(curl_path);
		url.addOption('url', escape(url_str));
		if (method) {
			url.addOption('method', method);
		}
		if (type) {
			url.addOption('type', type);
		}
		if (cookie) {
			url.addOption('cookie', escape(cookie));
		}
		if (referer) {
			url.addOption('referer', escape(referer));
		}
		this.request(url.toString(), 'GET', sync);
	}
});

/********************************
 *	Element						*
 ********************************/
MJ.Elem = {
	create : function(tag, attribute_hash, text) {
		if (!tag) {
			return document.createTextNode(text);
		}
		var ele = document.createElement(tag);
		MJ.extend(ele, MJ.Elem.Ex);
		if (attribute_hash) {
			for (var i in attribute_hash) {
				MJ.Elem.setAttr(ele, i, attribute_hash[i]);
			}
		}
		if ((text !== null) && (text !== undefined)) {
			ele.appendChild(document.createTextNode(text));
		}
		return ele;
	},
	
	setAttr : function(ele, name, value) {
		switch (name) {
			case 'class':
				ele.className = value;
				break;
			case 'id':
				ele.id = value;
				break;
			default:
				ele.setAttribute(name, value);
		}
	},
	
	getAttr : function(ele, name) {
		switch (name) {
			case 'class':
				return ele.className;
				break;
			case 'id':
				return ele.id;
				break;
			default:
				ele.getAttribute(name);
		}
	},
	
	getTextContent : function(ele) {
		return (ele.textContent) ? ele.textContent : ele.innerText;
	},
	
	getElementsByClass : function(ele, class_name) {
		var rtn = [];
		for (var i = 0; i < ele.childNodes.length; i++) {
			if (ele.childNodes.item(i).tagName) {
				var cn = ele.childNodes.item(i).className;
				cn = (cn) ? cn : ele.childNodes.item(i).getAttribute('class');
				if (cn == class_name) {
					rtn.push(ele.childNodes.item(i));
				}
				rtn = rtn.concat(MJ.Elem.getElementsByClass(ele.childNodes.item(i), class_name));
			}
		}
		return rtn;
	},
	
	changeDisplay : function(ele, disp_1, disp_2) {
		if (ele.style.display == disp_1) {
			ele.style.display = disp_2;
		} else {
			ele.style.display = disp_1;
		}
	}
};