/**
#########################################################################
                                                            ooooo oooooooooo ooooo  oooo                                                  
                                                             888   888    888  888  88                                                            
                                                             888   888oooo88   888                                                               
                                                             888   888           888                                                                  
                                                             888  o888o         o888o                                                             
                                                          8o888                                                                                          
                                                         --jPy Javascript class like Python--                                                    
#########################################################################
*@author Taketoshi Aono
*Lincence MIT
*ver 1.0
*
**********Begin jPy structure block********************
*		jPy------util
*		|           |_____settings <def>
*		|           |_____frameWorkException <defineException>
*		|           |_____asPlugin
*		|_____Class
*		|_____Package <from> <load>
*		|_____namespace <add> <remove>
*		|_____anonymous
*
**********End jPy structure block ********************
*
************Begin example block*****************
*<example> make class
*	frameWork.Class(<must>"class_name",<optional>"inheritance_name")({
*		__init__ : function(){ <constructor>
*			do something...
*		},
* 	class method...
*	})
***Class tips.
###########################
*** To use class attributes.add these property.
*** final         ----     __final         : true
*** static       ----     __static       : true
*** singleton   ----     __singleton     : true
*
***To instaniate class
***var anyclass=frameWork.classes.<class_name>()
###########################
*
*
*<example> Package
*	Package({
		namespace : <must> "namespace",
		main : <must> function(){
			class definition...
		}
*	})
##########################
*** In package,declared class definition sets as static method of self main.
*** If you need to create instance of Package class,do like this.
*** var anyclass=this.main.class.<class_name>(); -- in example this statement pointed at Package self
##########################
*
*<example> Package.from().Import()
* Package.from(<must> "Package.namespace").Import(<optional>"class_name or *")
*
*************End example block*****************
*/
(function(){var t=undefined=void 0,u={},o={},q={},m={},v={},x=Function.__proto__?1:0,p={},y={},C=function(){for(var a,b=0,c=arguments.length;b<c;b++){var g=arguments[b];try{a=g();break}catch(f){}}return a},D=function(a){for(var b in a)this[b]=a[b]},r=function(){};new r;var z=function(a){this.name=a.name;this.message=a.message;this.type="frameWorkException"},h={};z.prototype.toString=function(){return this.type+"."+this.name+" : "+this.message};var w=function(){this.__throw__=function(a){try{throw new z(a); }catch(b){if(j.strict===true)throw Error(b);}}};w.prototype={defineException:function(a){w.prototype[a._name]=a._thrower},cantExtendsException:function(a){a=a||"undefined";h={name:"cantExtendsException",message:" Class has final attribute can't extends. Error at "+a};this.__throw__(h)},SingletonException:function(a){a=a||"undefined";h={name:"SingletonException",message:"Class has singleton attribute expected only one instance. Error at "+a};this.__throw__(h)},InstantiationException:function(a){a= a||"undefined";h={name:"InstantiationException",message:"Class can't create instance. Error at "+a};this.__throw__(h)},ArgumentsTypeException:function(a,b){expr=expr||"undefined";b=b||"undefined";h={name:"ArgumentsTypeException",message:"Arguments expected "+point+". but got "+b};this.__throw__(h)},NameSpaceConfliction:function(a){a=a||"undefined";h={name:"NameSpaceConfliction",message:"NameSpace "+a+" is already used."};this.__throw__(h)}};var j=function(){};j.prototype={packagePath:"/",strict:true}; j=new j;var A=function(){};A.prototype.def=function(a){j.packagePath=a.packagePath?a.packagePath:j.packagePath;j.strict=a.useStrict===true||a.useStrict===false?a.useStrict:true};var s=function(a){var b=a.namespace;a.main.isPackage=true;y[b]=true;p[b]=a};s.from=function(a,b,c){var g,f=0,k,d=arguments.callee.caller;b=b||j.packagePath;for(c=c||t;d;)if(d.isPackage===true){f=1;break}else d=d.arguments.callee.caller;if(y[a]!==true){g=C(function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new XMLHttpRequest}, function(){return new ActiveXObject("Msxml2.XMLHTTP")});g.open("GET",b+a+".js",false);g.send(null);Function(g.responseText)();p[a].main(window.frameWork);v[a]=true;g=null}if(!v[a]){v[a]=true;p[a].main(window.frameWork)}if(c===t)return{Import:function(l){if(f==1){k=d;if(!d.Class)d.Class={}}else k=q;if(l!=="*"){l=l.split(",");for(var i=0,n=l.length;i<n;i++)k[l[i]]=p[a].main.Class[l[i]]}else for(i in p[a].main.Class)k[i]=p[a].main.Class[i]}}};s.load=function(a){s.from(a,true)};r.prototype={util:{frameWorkException:new w, settings:new A,asPlugin:function(a){for(var b in window.frameWork)a[b]=window.frameWork[b];try{delete window.jpy}catch(c){}finally{window.jpy=null}}},Class:function(a,b,c){var g=0,f,k,d,l=0,i=0,n;b=b||t;for(c=c||arguments.callee.caller;c;){if(c.isPackage)break;c=c.arguments.callee.caller}c=c||function(){};if(b&&(!m[b]||m[b][0]!==1)){f=m[a]=[];d=u[a]=function(){};if(typeof b==="string"){d.prototype=new u[b];f=m[b]}else{l=1;if(b.constructorNameSpace)f=m[b.constructorNameSpace];if(typeof b==="function")d.prototype= new b.constructor;else if(typeof b==="Object"&&b.constructor===Object){i=1;d.prototype=b}else window.frameWork.util.frameWorkException.ArgumentsTypeException("Object",typeof b)}g=1}else if(m[b]&&m[b][0]===1)window.frameWork.util.frameWorkException.cantExtendsException("Class() : "+a);else{f=m[a]=[];d=u[a]=function(){}}c.isPackage||(q[a]=function(){var e=new d;if(x===0)e.__proto__=d.prototype;o[a].apply(e,arguments);if(f[1]===2)n=null;return e});return function(e){e=e||{};e.__init__=e.__init__||function(){}; if(e.__final===true){f[0]=1;delete e.__final}if(e.__singleton===true){f[1]=2;delete e.__singleton}if(e.__static===true){f[2]=3;delete e.__static}if(g===0){d.prototype=e;n=o[a]=e.__init__}else{for(var B in e)d.prototype[B]=e[B];if(l===1)i===0?n=o[a]=function(){b.constructor.apply(this,arguments);e.__init__()}:n=o[a]=function(){b.__init__&&b.__init__.apply(this,arguments);e.__init__()};else n=o[a]=function(){o[b].apply(this,arguments);e.__init__()}}delete d.prototype.__init__;d.prototype.constructor= d;d.prototype.constructorNameSpace=a;if(f&&f[2]===3)q[a]=q[a]();d.prototype.extend=D;if(c.isPackage&&c.isPackage===true){if(!c.Class)c.Class={};c.Class[a]=function(){k=d?new d:window.frameWork.util.frameWorkException.SingletonException("Class().extends() : line 170");if(x===0)k.__proto__=d.prototype;n.apply(k,arguments);if(f[1]===2)d=null;return k}}}},Package:s,classes:q,anonymous:function(a,b){a=a||{};a.__init__=a.__init__||function(){};b=b||{};var c=function(){},g;return function(){c.prototype= a;for(var f in b)c.prototype[f]=b[f];g=new c;a.__init__.apply(g,arguments);delete c.prototype.__init__;return g}},namespace:{add:function(a){if(window.frameWork[a]&&j.strict===true)window.frameWork.util.frameWorkException.NameSpaceConfliction(a);else window.frameWork[a]={}},remove:function(a){if(window.frameWork[a]){window.frameWork[a]=null;delete window.frameWork[a]}}}};r.extend=function(a){for(var b in a)this.prototype[b]=a[b]};this.jpy=this.frameWork=new r}).call(window);
