~ wonderfl名鑑 ~

by Hakuhin
♥17 | Line 859 | Modified 2010-05-20 02:18:36 | MIT License
play

ActionScript3 source code

/**
 * Copyright Hakuhin ( http://wonderfl.net/user/Hakuhin )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/fCTr
 */

<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init();"><mx:Script><![CDATA[public function init():void{
// -------------------------------------------------
// ~ wonderfl名鑑 ~
// 
// wonderfl API を使ってユーザー情報とコード情報を
// ぶっこ抜いてデータグリッドに表示します。
// 
// 『USER:』に任意の「ユーザー名」を追加するか
// 『CODE:』に任意の「コードID」を追加すると
// その情報を種にして検索を行います。
//
// forks 数が多いほど効率よくヒットします。
// アイテムをダブルクリックするとURLジャンプします。
//
// forks が無いユーザーやコードが古い場合
// 検出できない事があります。
//
// ユーザー情報の「コードヒット数、総forked数、
// 総favorite数、総コード文字数」は、
// コードヒット時にリアルタイムで加算されます。
//
// ┌┐
// │↓
// │ユーザー情報
// │↓
// │コードID(最新20件)
// │↓
// │コード情報
// │↓
// │forksユーザー(最新50件)
// │↓
// └┘
//
// -------------------------------------------------



// -------------------------------------------------
// インポート
// -------------------------------------------------
import mx.core.*;
import mx.containers.*;
import mx.controls.*;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.collections.*;
import mx.containers.*;
import mx.events.*;


// -------------------------------------------------
// Flash 設定
// -------------------------------------------------

// フレームレート
stage.frameRate = 60;

// 100% 表示
stage.scaleMode = StageScaleMode.NO_SCALE;

// 左上
stage.align = StageAlign.TOP_LEFT;
stage.align = "TL";



// -------------------------------------------------
// Flex 設定
// -------------------------------------------------

// パディングなし
setStyle("paddingTop",0);
setStyle("paddingBottom",0);
setStyle("paddingLeft",0);
setStyle("paddingRight",0);

// 背景透過
setStyle("backgroundAlpha",0);

// 左上
setStyle("horizontalAlign","left");
setStyle("verticalAlign","top");

// キャンバス作成
var canvas:Canvas = new Canvas();
addChild(canvas);



// -------------------------------------------------
// Flex コンポーネント作成
// -------------------------------------------------
var text:Text;

text = new Text();
text.x = 5;
text.y = 7;
text.width = 50;
text.text = "USER:";
text.setStyle("textAlign","center");
canvas.addChild(text);

var text_input_user:TextInput = new TextInput();
text_input_user.x = 50;
text_input_user.y = 5;
text_input_user.width = 100;
canvas.addChild(text_input_user);

var button_user:Button = new Button();
button_user.x = 150;
button_user.y = 5;
button_user.width = 50;
button_user.height = 23;
button_user.label = "追加";
canvas.addChild(button_user);
button_user.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
	UserRegistQueue(text_input_user.text);
});

text = new Text();
text.x = 200;
text.y = 7;
text.width = 50;
text.text = "CODE:";
text.setStyle("textAlign","right");
canvas.addChild(text);

var text_input_code:TextInput = new TextInput();
text_input_code.x = 250;
text_input_code.y = 5;
text_input_code.width = 100;
canvas.addChild(text_input_code);

var button_code:Button = new Button();
button_code.x = 300;
button_code.y = 5;
button_code.width = 50;
button_code.height = 23;
button_code.label = "追加";
canvas.addChild(button_code);
button_code.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
	CodeRegistQueue(text_input_code.text);
});

var text_height:Text = new Text();
text_height.x = 400;
text_height.y = 7;
text_height.width = 50;
text_height.text = "高さ:";
text_height.setStyle("textAlign","right");
canvas.addChild(text_height);

var stepper_height:NumericStepper  = new NumericStepper();
stepper_height.x = 450;
stepper_height.y = 5;
stepper_height.width = 60;
stepper_height.value = 25;
stepper_height.minimum = 1;
stepper_height.maximum = 1000;
canvas.addChild(stepper_height);
stepper_height.addEventListener(Event.CHANGE,function(e:Event):void{
	data_grid_user.rowHeight = data_grid_code.rowHeight = stepper_height.value;
	column_user.width = stepper_height.value;
	column_code.width = stepper_height.value;
});

// キャンバス作成
var lower:Canvas = new Canvas();
canvas.addChild(lower);
var progress:ProgressBar = new ProgressBar();
lower.addChild(progress);
progress.x = 5;
progress.y = 5;

// スプリッタ
var box_v : VDividedBox  = new VDividedBox();
canvas.addChild(box_v);
box_v.x = 5;

// ユーザー用データグリッド
var data_grid_user:DataGrid = new DataGrid();
data_grid_user.horizontalScrollPolicy = ScrollPolicy.AUTO;
box_v.addChild(data_grid_user);
data_grid_user.headerHeight = 25;
data_grid_user.rowHeight = 25;
data_grid_user.doubleClickEnabled = true;
data_grid_user.addEventListener(ListEvent.ITEM_DOUBLE_CLICK,function(e:ListEvent):void{
	var param:Object = collect_user.getItemAt(e.rowIndex);
	var url:URLRequest = new URLRequest("http://wonderfl.net/user/" + param.name);
	navigateToURL( url ,"_blank");
});

// コード用データグリッド
var data_grid_code:DataGrid = new DataGrid();
data_grid_code.horizontalScrollPolicy = ScrollPolicy.AUTO;
box_v.addChild(data_grid_code);
data_grid_code.headerHeight = 25;
data_grid_code.rowHeight = 25;
data_grid_code.doubleClickEnabled = true;
data_grid_code.addEventListener(ListEvent.ITEM_DOUBLE_CLICK,function(e:ListEvent):void{
	var param:Object = collect_code.getItemAt(e.rowIndex);
	var url:URLRequest = new URLRequest("http://wonderfl.net/c/" + param.id);
	navigateToURL( url ,"_blank");
});

// カラム設定
var columns:Array;
var column:DataGridColumn;


columns = new Array();

column = new DataGridColumn("名前");
column.dataField = "name";
column.width = 100;
column.wordWrap = true;
columns.push(column);

var column_user:DataGridColumn = new DataGridColumn(" ");
column_user.dataField = "icon";
column_user.itemRenderer = new ClassFactory(mx.controls.Image);
column_user.width = 25;
column_user.resizable = false;
column_user.setStyle("horizontalAlign","center");
column_user.setStyle("verticalAlign","middle");
columns.push(column_user);

column = new DataGridColumn("コード数");
column.dataField= "code_count";
column.width = 60;
column.wordWrap = true;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"code_count");
columns.push(column);

column = new DataGridColumn("URL");
column.dataField= "url";
column.width = 300;
column.wordWrap = true;
columns.push(column);

column = new DataGridColumn("コメント");
column.dataField = "description";
column.width = 300;
column.wordWrap = true;
columns.push(column);

column = new DataGridColumn("コードヒット数");
column.dataField = "code_hit_count";
column.width = 100;
column.wordWrap = true;
column.setStyle("textAlign","center");
columns.push(column);

column = new DataGridColumn("総forked数");
column.dataField = "forked_count";
column.width = 100;
column.wordWrap = true;
column.setStyle("textAlign","center");
columns.push(column);

column = new DataGridColumn("総favorite数");
column.dataField = "favorite_count";
column.width = 100;
column.wordWrap = true;
column.setStyle("textAlign","center");
columns.push(column);

column = new DataGridColumn("総コード文字数");
column.dataField = "code_text_count";
column.width = 100;
column.wordWrap = true;
column.setStyle("textAlign","center");
columns.push(column);

column = new DataGridColumn(" ");
column.dataField = "param";
column.width = 10;
columns.push(column);

data_grid_user.columns = columns;


columns = new Array();

column = new DataGridColumn("タイトル");
column.dataField = "title";
column.width = 200;
column.wordWrap = true;
columns.push(column);

var column_code:DataGridColumn = new DataGridColumn(" ");
column_code.dataField = "thumbnail";
column_code.itemRenderer = new ClassFactory(mx.controls.Image);
column_code.width = 25;
column_code.resizable = false;
column_code.setStyle("horizontalAlign","center");
column_code.setStyle("verticalAlign","middle");
columns.push(column_code);

column = new DataGridColumn("ID");
column.dataField = "id";
column.width = 50;
column.setStyle("textAlign","center");
columns.push(column);

column = new DataGridColumn("ユーザー");
column.dataField = "user";
column.width = 100;
columns.push(column);

column = new DataGridColumn("親");
column.dataField = "parent";
column.width = 50;
column.setStyle("textAlign","center");
columns.push(column);

column = new DataGridColumn("forked");
column.dataField = "forked_count";
column.width = 60;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"forked_count");
columns.push(column);

column = new DataGridColumn("favorite");
column.dataField = "favorite_count";
column.width = 60;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"favorite_count");
columns.push(column);

column = new DataGridColumn("実行可");
column.dataField= "compile_ok";
column.width = 50;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"compile_ok");
columns.push(column);

column = new DataGridColumn("作成日時");
column.dataField= "created_date";
column.width = 150;
column.setStyle("textAlign","center");
columns.push(column);

column = new DataGridColumn("更新日時");
column.dataField= "modified_date";
column.width = 150;
column.setStyle("textAlign","center");
columns.push(column);

column = new DataGridColumn("パス");
column.dataField = "swf";
column.width = 300;
column.wordWrap = true;
columns.push(column);

column = new DataGridColumn("diff");
column.dataField = "diff";
column.width = 50;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"diff");
columns.push(column);

column = new DataGridColumn("ライセンス");
column.dataField = "license";
column.width = 60;
column.setStyle("textAlign","center");
columns.push(column);

column = new DataGridColumn("文字総数");
column.dataField = "as3_length";
column.width = 60;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"as3_length");
columns.push(column);

column = new DataGridColumn("スクリプト");
column.dataField = "as3";
column.width = 300;
column.wordWrap = true;
columns.push(column);

column = new DataGridColumn(" ");
column.dataField = "param";
column.width = 10;
columns.push(column);

data_grid_code.columns = columns;


// -------------------------------------------------
// 数値ソート用コールバック関数
// -------------------------------------------------
function DataGridColumnSetSortNumber(column:DataGridColumn,str:String):void{

	column.sortCompareFunction = function (o1:Object, o2:Object):int{
		var v1:int = parseInt(o1[str]);
		var v2:int = parseInt(o2[str]);
	
		if(v1 < v2) {
			return -1;
		}
		else if(v1 > v2){
			return 1;
		}

		return 0;
	}
	
}


var collect_user:ArrayCollection = new ArrayCollection();
var collect_code:ArrayCollection = new ArrayCollection();
data_grid_user.dataProvider = collect_user;
data_grid_code.dataProvider = collect_code;



// -------------------------------------------------
// スプリッタ用設定
// -------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME,function(e:Event):void{
	box_v.moveDivider(0,1);
	stage.removeEventListener(Event.ENTER_FRAME ,arguments.callee);
});



// -------------------------------------------------
// リサイズ時にフィット
// -------------------------------------------------
stage.addEventListener(Event.RESIZE,ResizeFunc);
function ResizeFunc(e:Event):void{
	var w:uint = stage.stageWidth;
	var h:uint = stage.stageHeight;
	
	text_height.x = w - 5 - 60 - 50;
	stepper_height.x = w - 5 - 60;


	box_v.y = 35;
	box_v.width = w - 10;
	box_v.height = (h - 35 - 45);

	data_grid_user.width = w - 10;
	data_grid_code.width = w - 10;
	
	lower.y = h - 45;
	progress.width = w - 10;
}
ResizeFunc(null);




// -------------------------------------------------
// 初期化
// -------------------------------------------------
const STEP_WAIT:int = 0;
const STEP_LOAD:int = 1;

// ワンダフルAPI 作成
var wonderfl_api:Object = WonderflAPICreate(loaderInfo.parameters.open_api_key);
var step:int = STEP_WAIT;

// キュー
var user_queue:Array = new Array();
var code_queue:Array = new Array();

// ディクショナリ
var user_dictionary:Object = DictionaryCreate(0x10000);
var code_dictionary:Object = DictionaryCreate(0x10000);

var user_queue_count:int = 0;
var user_queue_max:int = 0;

var code_queue_count:int = 0;
var code_queue_max:int = 0;

var thread_count:int = 0;
var thread_max:int = 99;



// -------------------------------------------------
// 毎フレーム実行
// -------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME,function(e:Event):void{


	var percent:Number = (user_queue_count + code_queue_count) / (user_queue_max + code_queue_max) * 100;
	percent = Math.floor(percent * 10) / 10;
	progress.label = "%3%%  user(" + user_queue_count + "/" + user_queue_max + ")  code(" + code_queue_count + "/" + code_queue_max + ")  thread(" + thread_count + "/" + thread_max +  ")";
	progress.minimum = 0;
	progress.mode = ProgressBarMode.MANUAL;
	progress.setProgress((user_queue_count + code_queue_count) , (user_queue_max + code_queue_max));

	
//	if(step == STEP_WAIT)


	if(thread_count < thread_max)
	{
	
		// ユーザーキュー
		if(user_queue.length > 0){

			// 読み込みへ
			step = STEP_LOAD;

			var user_name:String = user_queue.shift();
			
			// ユーザー情報を読み込む
			thread_count ++;
			WonderflAPIGetUser(wonderfl_api,user_name,function(ret:Boolean,data:Object):void{

				user_queue_count ++;
				thread_count --;

				if(!ret){
					// 待機へ
					step = STEP_WAIT;
					return;
				}

				var user:Object = data.user;

				// ユーザーパラメータセット
				var user_param:Object = UserGetParam(user.name);
				user_param.icon = user.icon;
				user_param.name = user.name;
				user_param.url = user.external_url;
				user_param.code_count = user.code_count;
				user_param.description = user.description;
				
				// データグリッドに登録
				UserAddDataGrid(user_param);

				// ユーザーコード情報を読み込む
				thread_count ++;
				WonderflAPIGetUserCode(wonderfl_api,user_name,function(ret:Boolean,data:Object):void{

					thread_count --;

					if(!ret){
						// 待機へ
						step = STEP_WAIT;
					}

					var codes:Array = data.codes;
					var i:int;
					var num:int = codes.length;
					for(i=0;i<num;i++){
						var code:Object = codes[i];
						
						// パラメータセット
						var code_param:Object = CodeGetParam(code.id);
						code_param.thumbnail = code.thumbnail;
						code_param.parent = code.parent;
						code_param.user = user_name;
						code_param.compile_ok = code.compile_ok;
						code_param.created_date = DateGetString(parseInt(code.created_date));
						code_param.license = code.license;
						code_param.swf = code.swf;
						code_param.diff = code.diff;
						code_param.title = code.title;
						code_param.id = code.id;
						
						// コードをデータグリッドに登録
						CodeAddDataGrid(code_param);

						// コード登録
						CodeRegistQueue(code.id);
						CodeRegistQueue(code.parent);

					}


					// 待機へ
					step = STEP_WAIT;
					return;

				});

			});
		
		
			return;
		}
	
	
	
		// コードキュー
		if(code_queue.length > 0){
		
			// 読み込みへ
			step = STEP_LOAD;

			var code_id:String = code_queue.shift();
			
			// コード情報を読み込む
			thread_count ++;
			WonderflAPIGetCode(wonderfl_api,code_id,function(ret:Boolean,data:Object):void{

				thread_count --;

				if(!ret){
					// 待機へ
					step = STEP_WAIT;
					return;
				}

				var code:Object = data.code;
				var user:Object = code.user;

				// ユーザーパラメータをセット
				var user_param:Object = UserGetParam(user.name);
				user_param.code_hit_count ++;
				user_param.forked_count += parseInt(code.forked_count);
				user_param.favorite_count += parseInt(code.favorite_count);
				user_param.code_text_count += code.as3.length;

				// ユーザーをデータグリッドに登録
				UserAddDataGrid(user_param);
				
				// コードパラメータをセット
				var code_param:Object = CodeGetParam(code.id);
				code_param.thumbnail = code.thumbnail;
				code_param.parent = code.parent;
				code_param.compile_ok = code.compile_ok;
				code_param.created_date = DateGetString(parseInt(code.created_date));
				code_param.license = code.license;
				code_param.swf = code.swf;
				code_param.diff = code.diff;
				code_param.title = code.title;
				code_param.id = code_id;
				code_param.as3_length = code.as3.length;
				code_param.as3 = code.as3;
				code_param.modified_date = DateGetString(parseInt(code.modified_date));
				code_param.forked_count = code.forked_count;
				code_param.favorite_count = code.favorite_count;


				// コードをデータグリッドに登録
				CodeAddDataGrid(code_param);

				// ユーザー登録
				UserRegistQueue(user.name);

				// コード登録
				CodeRegistQueue(code.parent);

				// コード Forks 情報を読み込む
				thread_count ++;
				WonderflAPIGetCodeForks(wonderfl_api,code_id,function(ret:Boolean,data:Object):void{

					code_queue_count ++;
					thread_count --;

					step = STEP_WAIT;

					if(!ret){
						// 待機へ
						step = STEP_WAIT;
						return;
					}
					

					var forks:Array = data.forks;
					var i:int;
					var num:int = forks.length;
					for(i=0;i<num;i++){
						var fork:Object = forks[i];
						
						// ユーザー登録
						UserRegistQueue(fork.user.name);
					}


					// 待機へ
					step = STEP_WAIT;
					return;

				});

			});
		
		
			return;
		}
	}

	
});




// -------------------------------------------------
// ユーザーキュー登録
// -------------------------------------------------
function UserRegistQueue(name:String):Boolean{
	var user_name:String = name.toLowerCase();

	var page:Object = DictionaryGetPage(user_dictionary,user_name);
	if(!page){
		page = DictionaryCreatePage(user_dictionary,user_name);
		page.param = UserCreateParam();
	}
	
	var param:Object = page.param;
	if(!param.queue){
		user_queue_max ++;
		user_queue.push(user_name);
		param.queue = true;
		return true;
	}
	
	return false;
}


// -------------------------------------------------
// ユーザーパラメータ作成
// -------------------------------------------------
function UserCreateParam():Object{
	return {
		name:"loading...",	// 名前
		queue:false,		// キュー登録
		data_grid:false,	// グリッド登録
		code_hit_count:0,	// ヒットカウント
		forked_count:0,		// forked 数
		favorite_count:0,	// favorite 数
		code_text_count:0	// 総スクリプト文字数
	};
}


// -------------------------------------------------
// ユーザー情報取得
// -------------------------------------------------
function UserGetParam(name:String):Object{
	var user_name:String = name.toLowerCase();

	var page:Object = DictionaryGetPage(user_dictionary,user_name);
	if(!page){
		page = DictionaryCreatePage(user_dictionary,user_name);
		page.param = UserCreateParam();
	}

	return page.param;
}


// -------------------------------------------------
// ユーザー情報をデータグリッドに登録
// -------------------------------------------------
function UserAddDataGrid(param:Object):Boolean{

	if(!(param.data_grid)){
		collect_user.addItemAt(param,collect_user.length);
		param.data_grid = true;
	}

	return param.data_grid;
}


// -------------------------------------------------
// コードキュー登録
// -------------------------------------------------
function CodeRegistQueue(code_id:String):Boolean{

	var page:Object = DictionaryGetPage(code_dictionary,code_id);
	if(!page){
		page = DictionaryCreatePage(code_dictionary,code_id);
		page.param = CodeCreateParam();
	}
	
	var param:Object = page.param;
	if(!param.queue){
		code_queue_max ++;
		code_queue.push(code_id);
		param.queue = true;
		
		return true;
	}
	
	return false;
}


// -------------------------------------------------
// コードパラメータ作成
// -------------------------------------------------
function CodeCreateParam():Object{
	return {
		title:"loading...",	// タイトル
		queue:false,	// キュー登録
		data_grid:false	// グリッド登録
	};
}



// -------------------------------------------------
// コード情報取得
// -------------------------------------------------
function CodeGetParam(code_id:String):Object{
	var page:Object = DictionaryGetPage(code_dictionary,code_id);
	if(!page){
		page = DictionaryCreatePage(code_dictionary,code_id);
		page.param = CodeCreateParam();
	}

	return page.param;
}


// -------------------------------------------------
// コード情報をデータグリッドに登録
// -------------------------------------------------
function CodeAddDataGrid(param:Object):Boolean{

	if(!(param.data_grid)){
		collect_code.addItemAt(param,collect_code.length);
		param.data_grid = true;
	}

	return param.data_grid;
}



// -------------------------------------------------
// JSON から Object に変換
// -------------------------------------------------
function JsonGetObject(str:String):Object{

	var obj:Object = null;
	
	try{
		var p:int = 0;
		var l:int = str.length;
	
		var c:String = _jumpNextChar();

		// チェック
		switch(c){
		case "{":	obj = _getObject();	break;
		case "[":	obj = _getArray();	break;
		};
	}catch(e:Error){
	}

	// オブジェクト取得
	function _getObject():Object{
		var obj:Object = new Object();
		var c:String;
		var name:String;

		while(true){

			// プロパティ名取得
			name = _jumpNextString();

			// データ
			c = _getNextChar();
			switch(c){
			default:	
				obj[name] = _jumpNextProperty();
				break;
			case "{":
				_jumpNextChar();
				_jumpNextChar();
				obj[name] = _getObject();
				break;
			case "[":
				_jumpNextChar();
				_jumpNextChar();
				obj[name] = _getArray();
				break;
			};

			// 次のデータ取得
			c = _jumpNextChar();
			if(c == ","){
				continue;
			}else if(c == "}"){
				return obj;
			}

			// 異常終了
			break;
		}
		
		return null;
	}

	// 配列取得
	function _getArray():Array{
		var ary:Array = new Array();
		var c:String;
		var i:int = 0;
		
		while(true){
			// データ
			c = _getNextChar();
			switch(c){
			default:
				ary[i] = _jumpNextString();
				break;
			case "{":
				_jumpNextChar();
				ary[i] = _getObject();
				break;
			case "[":
				_jumpNextChar();
				ary[i] = _getArray();
				break;
			};

			// 次のデータ取得
			i++;
			c = _jumpNextChar();
			if(c == ","){
				continue;
			}else if(c == "]"){
				return ary;
			}

			// 異常終了
			break;
		}
		
		return null;
	}

	// 次の文字を取得
	function _getNextChar():String{
		var s:int = p;
		var c:String;
		while(true){
			c = str.charAt(s);
			s++;

			// 無視する文字
			if(c == " ")	continue;
			if(c == "\t")	continue;
			if(c == "\r")	continue;
			if(c == "\n")	continue;
			if(c == ":")	continue;

			break;
		}

		return c;
	}
	
	// 次の文字までジャンプ
	function _jumpNextChar():String{
		var _c:String = _getNextChar();
		var c:String;
		while(true){
			p++;
			c = str.charAt(p);

			// 無視する文字
			if(c == " ")	continue;
			if(c == "\t")	continue;
			if(c == "\r")	continue;
			if(c == "\n")	continue;
			if(c == ":")	continue;

			break;
		}

		return _c;
	}
	
	// 次の文字列までジャンプ
	function _jumpNextString():String{
		var c:String;

		// 開始
		var s:int = p;
		while(true){
			c = str.charAt(s);
			s++;
			if(c == "\"")	break;
		}

		// 終端
		var e:int = s;
		while(true){
			c = str.charAt(e);
			if(c == "\"")	break;
			e++;
		}

		p = e + 1;
		return str.slice(s,e);
	}

	// 次のプロパティを取得
	function _jumpNextProperty():String{
		var c:String;

		// 開始
		var s:int = p;
		while(true){
			c = str.charAt(s);
			s++;
			if(c == ":")	break;
		}
	
		// 空白無視
		while(true){
			c = str.charAt(s);
			if(c != " ")	break;
			s++;
		}
		
		// 文字列
		c = str.charAt(s);
		var e:int;
		if(c == "\""){
			// 終端
			var yen:int = 0;
			e = s;
			while(true){
				e++;
				c = str.charAt(e);
				
				if(yen > 0){
					yen ++;
					if(yen > 2)	yen = 0;
				}

				if(c == "\\"){
					yen = 1;
				}
				
				if(yen == 0){
					if(c == "\"")	break;
				}
			}
			e++;
		}else{
	
			// 終端
			e = s;
			while(true){
				c = str.charAt(e);
				if(c == ",")	break;
				if(c == "}")	break;
				e++;
			}
		}

		p = e;
		var t:String = str.slice(s,e);	
		// 除去
		try{
			var check:Boolean = true;
			if(t.charAt(0) != "\""){
			}else if(t.charAt(t.length - 1) != "\""){
			}else{
				t = t.slice(1,t.length - 1);
				check = false;
			}
			
			if(check){
				if(t == "null")	t = "";
			}

		}catch(e:Error){
		}		
		return t;
	}

	return obj;
}



// -------------------------------------------------
// ディクショナリ作成
// -------------------------------------------------
function DictionaryCreate(num:int):Object{

	var obj:Object = new Object;
	var ary:Array = new Array;
	var i:int;
	for(i=0;i<num;i++){
		var list:Object = new Object();
		list.pref = list;
		list.post = list;
		
		ary[i] = list;
	}

	obj.num = num;
	obj.table = ary;

	return obj;
}

// -------------------------------------------------
// ディクショナリからページ取得
// -------------------------------------------------
function DictionaryGetPage(obj:Object,name:String):Object{

	var hash:uint = StringGetHash(name) % obj.num;
	var table:Object = obj.table[hash];
	var list:Object = table.post;
	
	while(true){
		if(list == table)	break;
		
		if(list.name == name){
			return list;
		}
		
		list = list.post;
	
	}

	return null;
}

// -------------------------------------------------
// ディクショナリからページ取得
// -------------------------------------------------
function DictionaryCreatePage(obj:Object,name:String):Object{

	var hash:uint = StringGetHash(name) % obj.num;
	var table:Object = obj.table[hash];
	var list:Object = table.post;
	
	while(true){
		if(list == table)	break;

		if(list.name == name){
			return list;
		}
		
		list = list.post;
	
	}
	
	var pref:Object = table;
	var post:Object = table.post;
	list = new Object();
	pref.post = list;
	post.pref = list;
	list.pref = pref;
	list.post = post;

	list.name = name;

	return list;
}

// -------------------------------------------------
// 文字列からハッシュ値取得
// -------------------------------------------------
function StringGetHash(str:String):uint{
	var i:int;
	var num:int = str.length;
	var hash:uint = 0;
	
	for(i=0;i<num;i++){
     	   hash = hash * 137 + str.charCodeAt(i);
	}
	
	return hash;
}


// -------------------------------------------------
// 文字列からハッシュ値取得
// -------------------------------------------------
function DateGetString(time:uint):String{
	var date:Date = new Date(time * 1000);

	// 曜日データ
	var ary:Array = ["日","月","火","水","木","金","土"];

	// ローカル時間で取得可能パラメータを文字として連結
	var str:String = "";
	str += (date.fullYear < 10 ? "0" : "") + date.fullYear;
	str += "/";
	var month:uint = date.month + 1;
	str += (month < 10 ? "0" : "") + month;
	str += "/";
	str += (date.date < 10 ? "0" : "") + date.date;
	str += " ";
	str += "(" + ary[date.day] + ")";
	str += " ";
	str += (date.hours < 10 ? "0" : "") + date.hours;
	str += ":";
	str += (date.minutes < 10 ? "0" : "") + date.minutes;
	str += ":";
	str += (date.seconds < 10 ? "0" : "") + date.seconds;
	
	return str;
}


// -------------------------------------------------
// WonderflAPI 作成
// -------------------------------------------------
function WonderflAPICreate(api_key:String):Object{
	return {
		loader:null,		// ローダ
		api_key:api_key		// API キー
	};
}


// -------------------------------------------------
// WonderflAPI からユーザー情報取得
// -------------------------------------------------
function WonderflAPIGetUser(obj:Object,name:String,func:Function):Boolean{
	var str:String = "http://api.wonderfl.net/user/" + name + "?api_key="+obj.api_key;
	var url:URLRequest = new URLRequest(str);
	var url_loader:URLLoader = new URLLoader(url);

	// ロード成功
	url_loader.addEventListener(Event.COMPLETE,function (event : Event):void {
		var data : String = url_loader.data;
		data = unescape(data);
		func(true,JsonGetObject(data));
	});

	// ロード失敗
	url_loader.addEventListener (IOErrorEvent.IO_ERROR,function (event : IOErrorEvent):void {
		func(false,null);
	});
	url_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR,function (event : IOErrorEvent):void {
		func(false,null);
	});

	// 読み込み開始
	url_loader.load (url);
	
	obj.loader = url_loader;
	return true;
}


// -------------------------------------------------
// WonderflAPI からユーザーコード情報取得
// -------------------------------------------------
function WonderflAPIGetUserCode(obj:Object,name:String,func:Function):Boolean{
	var str:String = "http://api.wonderfl.net/user/" + name + "/codes?api_key="+obj.api_key;
	var url:URLRequest = new URLRequest(str);
	var url_loader:URLLoader = new URLLoader(url);

	// ロード成功
	url_loader.addEventListener(Event.COMPLETE,function (event : Event):void {
		var data : String = url_loader.data;
		data = unescape(data);
		func(true,JsonGetObject(data));
	});

	// ロード失敗
	url_loader.addEventListener (IOErrorEvent.IO_ERROR,function (event : IOErrorEvent):void {
		func(false,null);
	});
	url_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR,function (event : IOErrorEvent):void {
		func(false,null);
	});

	// 読み込み開始
	url_loader.load (url);
	
	obj.loader = url_loader;
	return true;
}


// -------------------------------------------------
// WonderflAPI からコード情報取得
// -------------------------------------------------
function WonderflAPIGetCode(obj:Object,id:String,func:Function):Boolean{
	var str:String = "http://api.wonderfl.net/code/" + id + "?api_key="+obj.api_key;
	var url:URLRequest = new URLRequest(str);
	var url_loader:URLLoader = new URLLoader(url);

	// ロード成功
	url_loader.addEventListener(Event.COMPLETE,function (event : Event):void {
		var data : String = url_loader.data;
		data = unescape(data);
		func(true,JsonGetObject(data));
	});

	// ロード失敗
	url_loader.addEventListener (IOErrorEvent.IO_ERROR,function (event : IOErrorEvent):void {
		func(false,null);
	});
	url_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR,function (event : IOErrorEvent):void {
		func(false,null);
	});

	// 読み込み開始
	url_loader.load (url);
	
	obj.loader = url_loader;
	return true;
}



// -------------------------------------------------
// WonderflAPI からコード forks 情報取得
// -------------------------------------------------
function WonderflAPIGetCodeForks(obj:Object,id:String,func:Function):Boolean{
	var str:String = "http://api.wonderfl.net/code/" + id + "/forks?api_key="+obj.api_key;
	var url:URLRequest = new URLRequest(str);
	var url_loader:URLLoader = new URLLoader(url);

	// ロード成功
	url_loader.addEventListener(Event.COMPLETE,function (event : Event):void {
		var data : String = url_loader.data;
		data = unescape(data);
		func(true,JsonGetObject(data));
	});

	// ロード失敗
	url_loader.addEventListener (IOErrorEvent.IO_ERROR,function (event : IOErrorEvent):void {
		func(false,null);
	});
	url_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR,function (event : IOErrorEvent):void {
		func(false,null);
	});

	// 読み込み開始
	url_loader.load (url);
	
	obj.loader = url_loader;
	return true;
}



}]]></mx:Script></mx:Application>