// JavaScript Document

var jsonlib	= new function(){
	/*プロパティ定義*/
	this.version= '0.9.5';
	this.data	= new Object();	
	this.importArray	= new Array();

	/*メソッド定義*/
	this.createJSON	=(function(){
		return function(_name,_json){
			this[_name] = new json(_json);
		}
	})();
	
	this.checkJSON = (function(){
		var _return;
		return function(_obj){
			_return	= new String();
			_chkJson(_obj,'');
			return _return;
		}
		function _chkJson(_obj,_name){
			var __name	=(_name)? _name:'';
			for(var _i in _obj){
				var _name_	=__name+'/'+_i;
				if(typeof(_obj[_i])=='string'||typeof(_obj[_i])=='number'||typeof(_obj[_i])=='boolean'||_obj[_i]==null){
					_return	+= _name_+'/:'+_obj[_i]+'\n';
				}else if(_obj[_i][0]){
					_return	+=_name_+'[配列構造]\n';
					_chkJson(_obj[_i],_name_);
				}else{
					_chkJson(_obj[_i],_name_);
				}
			}
		}
	})();

	this.setJSON_repeat=(function(){
		var _return;
		var _num;
		// WHERE{'X = Y,X >= Y,X <= Y,X > Y,X < Y,X like Y'};
		// ORDER{'X',ASC};ORDER{'X',DESC};
		// LIMIT{0,30};
		return function(_obj,_query){
			var _WHERE=(_query.WHERE)? _query.WHERE:false;
			var _ORDER=(_query.ORDER)? _query.ORDER:false;
			var _LIMIT=(_query.LIMIT)? _query.LIMIT:false;
//			alert('_WHERE='+_WHERE+'\n_ORDER='+_ORDER+'\n_LIMIT='+_LIMIT);
			var	_temp	= Q_WHERE(_obj,_WHERE);
				_temp	= Q_ORDER(_temp,_ORDER);
				_temp	= Q_LIMIT(_temp,_LIMIT);
			
			return	_temp;
		}
	})();
	function Q_ORDER(_obj,_ORDER){
		if(_ORDER[1]){
			var	_temp	=new Array();
			for(var _i in _obj){
				_temp.push(_obj[_i]);
			}
			var	path	= '.'+_ORDER[0].toString().replace(/\//ig,'.');
			if(_ORDER[1]=='ASC'){
				_temp.sort (
					function(b1, b2){
						var	_b1	= (isNaN(eval('b1'+path)))? eval('b1'+path):eval('b1'+path)*1;
						var	_b2	= (isNaN(eval('b2'+path)))? eval('b2'+path):eval('b2'+path)*1;
						return _b1 > _b2 ? 1 : -1;
					}
				);
			}else if(_ORDER[1]=='DESC'){
				_temp.sort (
					function(b1, b2){
						var	_b1	= (isNaN(eval('b1'+path)))? eval('b1'+path):eval('b1'+path)*1;
						var	_b2	= (isNaN(eval('b2'+path)))? eval('b2'+path):eval('b2'+path)*1;
						return _b1 < _b2 ? 1 : -1;
					}
				);
			}
			var	__temp	= new Object()
			for(var _i in _temp){
				__temp[_temp[_i].CODE.MASTER]	= _temp[_i];
			}
			return __temp;
		}else{
			return _obj;
		}
	}
	function asort(b1, b2){
		return b1[key] > b2[key] ? 1 : -1;
	}
	function Q_LIMIT(_obj,_LIMIT){
		var	_num	= new Number();
		var	_temp	= new Object();
		if(_LIMIT){
			for(var _i in _obj){
				if(_num >= _LIMIT[0]&&_num <= _LIMIT[1]){
					_temp[_i]	= _obj[_i];
				}
				_num++;
			}
		}else{
			for(var _i in _obj){
				_temp[_i]	= _obj[_i];
			}
		}
		return _temp;
	}
	function Q_WHERE(_obj,_WHERE){
		var	_tempObj	= _obj;
		if(_WHERE){
			for(var _i=0; _WHERE.length>_i; _i++){
				var	__tempObj	= new Object();
				if(_WHERE[_i].match(/ like /ig)){
					var	__WHERE	= _WHERE[_i].split(' like ');
					var	_re		= (__WHERE[1].match(/^%(.+?)%$/))? '^'+RegExp.$1+'$':(__WHERE[1].match(/^%(.+?)$/))? '^'+RegExp.$1:(__WHERE[1].match(/^(.+?)%$/))? RegExp.$1+'$':__WHERE[1];
					var	re		= new RegExp(_re,"ig");
					var	path	= '.'+__WHERE[0].toString().replace(/\//ig,'.');
					for(var _j in _tempObj){
						if(eval('_tempObj["'+_j+'"]'+path)){
							try{
								if(eval('_tempObj["'+_j+'"]'+path).match(re)){
									__tempObj[_j]	= _tempObj[_j];
								}
							}catch( e ){
								alert('_tempObj["'+_j+'"]'+path);
							//エラー時の処理
							}
						}
					}
				}
				if(_WHERE[_i].match(/ = /ig)){
					var	__WHERE	= _WHERE[_i].split(' = ');
					var	re		= __WHERE[1];
					var	path	= '.'+__WHERE[0].toString().replace(/\//ig,'.');
					for(var _j in _tempObj){
						if(eval('_tempObj["'+_j+'"]'+path)==re){
							__tempObj[_j]	= _tempObj[_j];
						}
					}
				}
				if(_WHERE[_i].match(/ >= /ig)){
					var	__WHERE	= _WHERE[_i].split(' >= ');
					var	re		= __WHERE[1];
					var	path	= '.'+__WHERE[0].toString().replace(/\//ig,'.');
					for(var _j in _tempObj){
						if(eval('_tempObj["'+_j+'"]'+path) >= re){
							__tempObj[_j]	= _tempObj[_j];
						}
					}
				}
				if(_WHERE[_i].match(/ > /ig)){
					var	__WHERE	= _WHERE[_i].split(' > ');
					var	re		= __WHERE[1];
					var	path	= '.'+__WHERE[0].toString().replace(/\//ig,'.');
					for(var _j in _tempObj){
						if(eval('_tempObj["'+_j+'"]'+path) > re){
							__tempObj[_j]	= _tempObj[_j];
						}
					}
				}
				if(_WHERE[_i].match(/ <= /ig)){
					var	__WHERE	= _WHERE[_i].split(' <= ');
					var	re		= __WHERE[1];
					var	path	= '.'+__WHERE[0].toString().replace(/\//ig,'.');
					for(var _j in _tempObj){
						if(eval('_tempObj["'+_j+'"]'+path) <= re){
							__tempObj[_j]	= _tempObj[_j];
						}
					}
				}
				if(_WHERE[_i].match(/ < /ig)){
					var	__WHERE	= _WHERE[_i].split(' < ');
					var	re		= __WHERE[1];
					var	path	= '.'+__WHERE[0].toString().replace(/\//ig,'.');
					for(var _j in _tempObj){
						if(eval('_tempObj["'+_j+'"]'+path) < re){
							__tempObj[_j]	= _tempObj[_j];
						}
					}
				}
				_tempObj	= __tempObj;
			}
		}else{
		}
		return _tempObj;
	}

	this.sortJSON	= (function(){
		function func(a,b){
			return (b - a);
		}
		return function(_obj,_index,_keyfield,_keyword,_type){

			/*
			_obj	JSON
			_index	ソート情報
			_keyfield	検索対象項目
			_keyword	検索キーワード
			_type		出力形式
			*/
			_num	= new Number();

			if(_index){
				if(typeof(_index)=='object'){
					var	_key	= _index.INDEX.split('/').join('.');
					var	_sort	= (_index.SORT.match(/-/))? 'reverse':'sort';
					var	_length	= (_index.LENGTH)? _index.LENGTH:'all';
				}else if(typeof(_index)=='string'){
					var	_key	=_index.split('/').join('.');
					var	_sort	= 'sort';
					var	_length	= 'all';
				}
				var	_temp	= new Array();
				var	_n	= new Number();
				var _INDEX	= new Object();
				var	__INDEX	= new Object();
				for(var _i in _obj){
					var _num	= 1000000+_n
					_temp[_n++] = eval('_obj["'+_i+'"].'+_key)+_num;
					__INDEX[eval('_obj["'+_i+'"].'+_key)+_num]=[_i]
				}
				if(_sort=='sort'){
					if(isNaN(_temp[0])){
						_temp.sort();
					}else{
						_temp.sort(func);
					}
				}else{
					if(isNaN(_temp[0])){
						_temp.sort();
						_temp.reverse();
					}else{
						_temp.sort(func);
						_temp.reverse(func);
					}
				}
				
				for(var _i=0; _temp.length>_i; _i++){
					if(_i==_length) break;
					var _id_	= __INDEX[_temp[_i]];
					_INDEX[_id_]=_obj[_id_];
				}
			}else{
				var	_INDEX	= _obj;
			}

			if(_keyfield&&_keyword){
				var	_key	= _keyfield.split('/').join('.');
				for(var _i in _INDEX){
					var	_word	= eval('_obj["'+_i+'"].'+_key);
					if(!_word.toString().match(_keyword)){
						delete _INDEX[_i];
					}
				}
			}
			return _INDEX;
		}
	})();

	this.setJSON_repet	=(function(){
		var _return;
		var _num;
		return function(_obj,_template,_index,_keyfield,_keyword,_type){
			if(_index){
				var _obj	= jsonlib.sortJSON(_obj,_index,_keyfield,_keyword,_type);
			}
			
			_num	= new Number();

			_return	= new Array();
			for(var _i in _obj){
				_return[_num++]	= jsonlib.setJSON(_obj[_i],_template);
			}

			if(_type){
				if(_type.match(/array/g)){
					return _return;
				}else{
					return _return.join(_type);
				}
			}else{
				return _return.join('');
			}
		};
	})();

	this.setJSON2=	(function(){
		var _return;
		var _JSONarray;
		var _test;
		var _Conversion;
		return function(_obj,_template,_conv){
			_Conversion	= (_conv)? true:false;
			_test		= new String();
			_JSONarray	= new Object();
			_return		= _template.replace(/\r/g,'').replace(/\n/g,'≪BR≫');
			return _return.replace(/≪BR≫/g,'\n');
		}
		function exJSON(_obj,_template){
			_template.match(/@@.+?@@/);
			
		}
	})();


	this.setJSON = (function(){
		var _return;
		var _JSONarray;
		var _test;
		var _Conversion;

		return function(_obj,_template,_conv){
			_Conversion	= (_conv)? true:false;
			_test	= new String();
			_JSONarray	= new Object();
			_return		= _template.replace(/\r/g,'').replace(/\n/g,'≪BR≫');
//			_return		= _return.replace(/\[\[.+?\{\{.+?\}\}.+?\]\]/g,'-');
			_chkJsonArray(_obj,'',_Conversion);
			_chkJson(_obj,'');
			_return	= _return.replace(/if\(@@.*?@@\,{{.*?}}\)/g,'');
			_return	= _return.replace(/if\(@@.*?@@\,{{.*?}}{{(.*?)}}\)/g,'$1');

			var	_match	= new Array();
			var _temp	= _return.match(/\[\[.+?\]\]/g);
			if(_temp){
				for(var _i=0; _temp.length>_i; _i++){
					_d = new Date();
					_temp[_i].match(/\[\[(.+?)\]\]/);
					this.importArray.push({'tag':_temp[_i],'file':RegExp.$1,'ID':'import_'+_d.getUTCSeconds()+_d.getUTCMilliseconds()+_i});

					var regex	= this.importArray[this.importArray.length-1].tag;
					var word	= '<div style="margin:0;padding:0;border:0; background-color:none; color:none;" ID="'+this.importArray[this.importArray.length-1].ID+'"></div>';
					_return	= _return.replace(regex, word);
				}
			}
			if(this.importArray){
				id	= new Array();
				for(var i in this.importArray){
					var _file	= this.importArray[i].file;
					var	_ID		= this.importArray[i].ID;
					id[i] = setTimeout("importFile('"+_file+"','"+_ID+"')", 250);
				}
			}
			return _return.replace(/≪BR≫/g,'\n');
		}
		function _chkJsonArray(_obj,_name,_realName){
			var __name		=(_name)? _name:'';
			var __realName	=(_realName)? _realName:'';
			for(var _i in _obj){
				var	_name_		= __name+'/'+_i;
				var	_realName	= __realName+'/'+_i;
					_name_		= _name_.replace(/\/\d+$/g,'');
				if(typeof(_obj[_i])=='string'||typeof(_obj[_i])=='number'||typeof(_obj[_i])=='boolean'||_obj[_i]==null){
				}else{
					if(_obj[_i][0]){
						_test+=_name_+'：'+_obj[_i].length+'\n';
						var	_regex	= new RegExp('\\[\\['+_name_+'\\/{{(.+?)}}'+_name_+'\\/\\]\\]');
						var	_temp	= _return.match(_regex);
						var	_word	= new Array();
						for(var _j=0; _obj[_i].length>_j; _j++){
							_word[_j]	= RegExp.$1.replaceAll(_name_+'/**num**',_name_+'/'+_j);
							_word[_j]	= _word[_j].replaceAll(_realName+'/**num**',_realName+'/'+_j);
						}
						_return	= _return.replace(_regex,_word.join('≪BR≫'));
					}
					_chkJsonArray(_obj[_i],_name_,_realName);
				}
			}
		}
		function _chkJson(_obj,_name){
			var __name	=(_name)? _name:'';
			for(var _i in _obj){
				var _name_	= __name+'/'+_i;
				if(typeof(_obj[_i])=='string'||typeof(_obj[_i])=='number'||typeof(_obj[_i])=='boolean'||_obj[_i]==null){
					
					var	_word	= (_obj[_i]==='0')? '0':(_obj[_i]===0)? 0:(_obj[_i])? _obj[_i]:'';
					
					_JSONarray[_name_]	= _word;
					var	_regex_String	= new RegExp('@@'+_name_+'/@@','g');
					var	_regex_HTML		= new RegExp('@＜'+_name_+'/＞@','g');
					var	_regex_kome		= new RegExp('@※'+_name_+'/※@','g');
					var	_regex_Price	= new RegExp('@,'+_name_+'/,@','g');

					var	_regex_IF		= new RegExp('if\\(@@'+_name_+'/@@,{{(.+?)}}{{(.+?)}}\\)','i');
					var	_temp_IF		= _return.match(_regex_IF);
					while(_temp_IF){
						_regex_IF		= new RegExp('if\\(@@'+_name_+'/@@,{{(.+?)}}{{(.+?)}}\\)','i');
						_temp_IF		= _return.match(_regex_IF);
						_word	= (_word=='')? false:(_word=='false')?false:_word;
						_return	= (_temp_IF&&_word)? _return.replace(_regex_IF,RegExp.$1):_return.replace(_regex_IF,RegExp.$2);
					}
		
					var	_regex_IF		= new RegExp('if\\(@@'+_name_+'/@@,{{(.+?)}}\\)','i');
					var	_temp_IF		= _return.match(_regex_IF);
					while(_temp_IF){
						_regex_IF		= new RegExp('if\\(@@'+_name_+'/@@,{{(.+?)}}\\)','i');
						_temp_IF		= _return.match(_regex_IF);
						_word	= (_word=='')? false:(_word=='false')?false:_word;
						_return	= (_temp_IF&&_word)? _return.replace(_regex_IF,RegExp.$1):_return.replace(_regex_IF,'');
					}
					if(_Conversion){
						_return	= _return.replace(_regex_String,_word);
					}else{
						_return	= _return.replace(_regex_String,_word.toString().replace(/\|/ig,'<br />'));
					}
					_return	= _return.replace(_regex_HTML,_word.toString().unescapeJson().convertHTML());
//					_return	= _return.replace(_regex_HTML,_word.toString().unescapeJson().convertHTML());
					_return	= _return.replace(_regex_Price,ketatori(_word));
					_return	= _return.replace(_regex_kome,makeAtP(_word));
				}else{
					_chkJson(_obj[_i],_name_);
				}
			}
		}
	})();

	/*ローカル関数系*/
	function json(_json){
		this.data	= _json;
	}
}


