/*
 jQuery Extended Class
 
--------▼sample code--------
	JEC("Classname","<div></div>",function($instance){
		this.hoge = "hoge";
		this.abcdefg = function(){
			return "abcdefg"
		}
		return this;//必ずthisを返す
	});

	//新たにクラスインスタンスを作成(body等にappendして使用)
	var $instance = new Classname();
	alert($instance.hoge);//return "hoge"
	alert($instance.abcdefg());//return "abcdefg"

	//クラス化
	var $div = new Classname($("div:first"));
	alert($div.hoge);//return "hoge"
	alert($div.abcdefg());//return "abcdefg"

	//クラスとしてキャスト(クラス化を経ていない場合はnullが返る
	var $div = Classname($("div:first"));
	alert($div.hoge);//return "hoge"
	alert($div.abcdefg());//return "abcdefg"
--------△sample code--------
*/

(function(){
	var window = this,undefined;
	var jQueryExtendedClass = window.jQueryExtendedClass = function(CLASSNAME,CREATION_TAG,FUNCTION){
		//型チェック
		if(typeof(CLASSNAME) != "string" || typeof(FUNCTION) != "function") return null;
		
		var CLASSES = jQueryExtendedClass.CLASSES;
		
		//SCOPE = クラスを定義する親。デフォルトはwindow
		var SCOPE = window;
		//CLASSNAME = 名前空間を含めたクラス名
		var classname = CLASSNAME;
		
		//クラス名が"."で区切られていたら名前空間とみなし、SCOPEとCLASSNAMEを変更する。
		if(CLASSNAME.indexOf(".") != -1){
			var namespaces = CLASSNAME.split(".");
			classname = namespaces.pop();
			var length = namespaces.length;
			for(var i = 0; i < length;i++){
				var key = namespaces[i];
				if (!SCOPE[key]) SCOPE[key] = {};
				SCOPE = SCOPE[key];
			}
		}
		
		//create class to current window object.
		var CLASS = window[CLASSNAME] = SCOPE[classname] = function(){
			return (this.jQueryExtendedClass instanceof Function ?
				jQueryExtendedClass.CAST.apply(arguments[0],[arguments])
				: jQueryExtendedClass.INIT.apply(arguments[0],[arguments])
			);
		};
		
		CLASS.prototype.jQueryExtendedClass = {
			CLASSNAME:CLASSNAME,
			CREATION_TAG:CREATION_TAG || "<div></div>",
			FUNCTION:FUNCTION
		};
		
		return CLASS;
	}
	
	jQueryExtendedClass.NAMES = {};
	jQueryExtendedClass.CLASSES = {};
	
	jQueryExtendedClass.CAST = function(args){
		var CLASSNAME = args.callee.prototype.jQueryExtendedClass.CLASSNAME;
		return (this instanceof jQuery ?
			jQuery.data(this[0],CLASSNAME)
			: jQuery.data(this,CLASSNAME)
			) || null;
	}
	jQueryExtendedClass.INIT = function(args){
		var CREATION_TAG = args.callee.prototype.jQueryExtendedClass.CREATION_TAG;
		var CLASSNAME = args.callee.prototype.jQueryExtendedClass.CLASSNAME;
		var FUNCTION = args.callee.prototype.jQueryExtendedClass.FUNCTION;
		var INSTANCE = FUNCTION.apply(this instanceof jQuery ? this : jQuery(CREATION_TAG),args);
		jQuery.data(INSTANCE[0],CLASSNAME,INSTANCE);
		return jQuery.data(INSTANCE[0],CLASSNAME);
	}
	
	window.JEC = jQueryExtendedClass;
})();
