			function $( data , objobj , name_group ) {
				var is = this.is , Doc = this.document ;

				if( objobj && typeof data == "object" && data.constructor == Object ) { return data ; }
				data = data ? data == this ? data : data == Doc ? data : String( data.nodeType ).match( /^(1|3)$/ ) ? data : Doc.getElementsByTagName( "*" )[ data ] ? Doc.getElementsByTagName( "*" )[ data ] : null : null ;
				data = name_group && data ? data.getElementsByTagName( name_group ) : data ;

				return data ;
			}
			function add_eve( name , callback , prevent , el ) {
				var $ = this.$ , Doc = this.document ;

				if( !name || !( el = $( el ) ) ) { return null ; }
				if( el.addEventListener ) {
				el.addEventListener( name , function ( eve , el ) {
					if( prevent ) {
					eve.preventDefault() ;
					}

					return callback( eve , el ) ;
				} , prevent ) ;
				}
				else
				if( el.attachEvent ) {
				el.attachEvent( "on" + ( name ) , function ( eve , el ) {
					if( prevent ) {
					eve.returnValue = false ;
					}

					return callback( eve , el ) ;
				} ) ;
			
				}

				return el ;
			}
			function app( child , par ) {
				var $ = this.$ ;

				if( !( child = $( child ) ) || !( par = $( par ) ) ) { return null ; }
				 
				return par.appendChild( child ) ;
			}
			function att_obj( src ) {
				var is = this.is , get = this.get ;

				if( !src ) { return "" ; }

				var str = "" ;
				if( is( "object" , src ) ) {
				for( var z in src ) {
					cur = get( z , src ) ;
					if( z.match( /^style$/ ) ) {
					str += "style='" ;
					if( is( "object" , cur ) ) {
					for( var y in cur ) {
						str += ( y ) + ":" + ( cur[ y ] ) + "; " ;
					} ;
					}
					else {
					str += cur ;
					}
					str += "'" ;
					}
					else {
					str += " " + ( z ) + "='" + ( cur ) + "'"
					}
				} ;
				}
				else {
				str += " " + ( src ) ;
				}

				return str ;
			}
			function body() {
				return this.document.getElementsByTagName( "body" )[ 0 ] ;
			}
			function by_case( callback , from_group ) {
				 var is = this.is ;
				 if (!from_group) return null;
	 
				 
				if( !is( "fun" , callback ) || !is( "object" , from_group ) || !is( "num" , from_group.length ) ) { return null ; }
				var to_group = [] ;
 
				var a = 0 ; 
				var item ;
				while( a < from_group.length ) {
					item = from_group[ a ] ;
					if( callback( item , a , from_group ) ) {
					to_group.push( item ) ;
					}
					a ++ ;
				} ;
				
				return to_group ;
			}
			function by_cname( cname , el ) {
				var $ = this.$ , Doc = this.document ;

				if( !( el = $( el ) ) ) { el = Doc ; }

				var from_group = by_tname( "*" , el ) ;
				var to_group = [] ;
				var item , a = 0 ;
				
				while( a < from_group.length ) {
					item = from_group[ a ] ;
					if( item.className.match( rege( "(^|\s)?" + ( cname ) + "(\s|$)?" ) ) ) {
					to_group.push( item ) ;
					}
					a ++ ;
				} ;

				return to_group ;
			}
			function by_tname( tname , el , to_arr ) {
				var $ = this.$ , Doc = this.document ;
	
				if( !( el = $( el ) ) ) { el = Doc ; }

				var from_group = el.getElementsByTagName( tname ) ;
				if( to_arr ) {
				var tmp_group = [] ;
				for( var a = 0 ;  a < from_group.length ; a ++ ) {
					tmp_group.push( from_group[ a ] ) ;
				} ;
				from_group = tmp_group ;
				}				

				return from_group ;
			}
			function cdown( name_timer , slot , loc ) {
				name_timer = name_timer ? name_timer : "timer_cdown" ;
				slot = $( slot ) ;
				var a = 0 ;
				var sec = ( 10 * 1000 ) ;
				this[ name_timer ] = this.setInterval( function () {
					a += 250 ;	// quarter second
					if( a >= 1000 ) {
					sec -= ( 1 * 1000 ) ;
					if( sec <= ( 1 * 1000 ) ) {
					this.clearInterval( this[ name_timer ] ) ;
					if( loc ) { location = loc ; }
					}
					if( slot ) { slot.innerHTML = ( sec / 1000 ) ; }
					a = 0 ;
					}	
				} , 250 ) ;
			}
			function cln( To , From ) {
				var $ = this.$ ;

				if( !( To = $( To , 1 ) ) || !( From = $( From , 1 ) ) ) { return null ; }

				var item ;
				for( var k in From ) {
					item = From[ k ] ;
					To[ k ] = item ;
				} ;

				return $( To , 1 ) ;
			}
			function combine( obj1 , obj2 ) {
				var is =this.is ;

				if( is( "object" , obj1 ) && is( "object" , obj2 )  ) {
				var ret_obj = {} ;
				for( var k in obj1 ) {
					ret_obj[ k ] = obj2[ k ] ;
				} ;

				return ret_obj ;
				}

				return alert( "invalid obj(s)" ) ;
			}
			function contains( node ) {	// function ready to be made a method of a html element
				if( node == null ) { return false ; }
				if( node == this ) { return true ; }
				else { return this.contains( node.parentNode ) ; }
			}
			function dollarformat( num ) {
    			num = num.toString().replace( /\$|\,/g , "" ) ;
 
    			if( isNaN( num ) ) { num = "0" ; }
 
       			var cents = Math.floor( ( num * 100 + 0.5 ) % 100 ) ;
       			num = Math.floor( ( num * 100 + 0.5 ) / 100 ).toString() ;
 
    			if( cents < 10 ) { cents = "0" + cents ; }
        		for( var i = 0 ; i < Math.floor( ( num.length - ( 1 + i ) ) / 3 ) ; i ++ ) {
           			num = num.substring( 0 , num.length - ( 4 * i + 3 ) ) + "," + num.substring( num.length - ( 4 * i + 3 ) ) ;
           		} ;
 
    			return  ( "$" + num + "." + cents ) ;
			}
			function fill( target , src ) {
				var is = this.is ;

				if( !target || !is( 'object' , target ) || !is( 'num' ,  target.length ) ) { return alert( "invalid target" ) ; }
				if( !src || !is( 'object' , src ) || !is( 'num' ,  src.length ) ) { return alert( "invalid src" ) ; }
				for( var a = 0 ; a < src.length ; a++ ) {
					target[ target.length ]  = src[ a ] ;
				} ;
				 
				return target ;
			}
			function fore( callback , group , bythis ) {
				var is = this.is ;
				
				if( !( is( "object" , group ) ) || !is( "fun" , callback ) ) {return null ;}
				bythis = ( bythis == "m" || bythis == "i" ? bythis : "m" ) ;

				if( bythis == "i" && is( "num" , group.length ) ) {
				for( var k = 0 ; k < group.length ; k ++ ) {
				callback( group[ k ] , k , group ) ;	
				} ;
				}
				else
				for( var k in group ) {
				callback( group[ k ] , k , group ) ;
				} ;

				return group ; 
			}
			function is_empty( data , strict ) {
				return data == "" || ( strict ? data == 0 || data == null : false ) ;
			}
			function get( att , el ) {
				var $ = this.$ ;

				if( !( el = $( el , 1 ) ) ) { return null ; }

				return el.nodeType == 1 ? el.getAttribute( att ) || el[ att ] : el[ att ] ;
			}
			function get_by( query , by_this , parorsib , el , all , dire ) {
				var $ = this.$ , get_pars = this.get_pars , get_sibs = this.get_sibs ;

				if( !( el = $( el ) ) ) { return null ; }
				parorsib = parorsib == "par" || parorsib == "sib" ? parorsib : "par" ;

				var results = [] ;
				while( el ) {
					if( String( el[ by_this ] ).match( query ) ) {
					results.push( el ) ;
					}
					el = parorsib == "par" ? get_pars( el ) : get_sibs( el , null , dire ) ;
				} ;	

				return !all ? results[ 0 ] : results ;			
			}
			function get_css( k , el ) {
				var $ = this.$ , Doc = this.document ;

				if( !( el = $( el ) ) ) {return null ;}
						
				return ( Doc.defaultView ? Doc.defaultView.getComputedStyle( el , null ) : el.currentStyle ? el.currentStyle : el.style )[ k ] ;				
			}
			function get_cnodes( el ) {
				var $ = this.$ ;

				if( !( el = $( el ) ) ) { return null ; }

				return el.childNodes ;
			}
			function get_exs( att , xory , el , inc_pars ) {
				var $ = this.$ , get_css = this.get_css ;

				if( !( el = $( el ) ) ) { return null; }
				if( !att ) {
				att = "pad" ;
				}
				att = new String( att ) ;
				xory = xory == "x" || xory == "y" ? xory : "x" ;
				var dirs = xory == "y" ? [ "Top" , "Bottom" ] : [ "Left" , "Right" ] ;
				var ret = 0 ;
				
				els = [ el ] ;
				if( inc_pars ) {
				while( el && el.nodeName != "BODY" ) {
					els.push( el ) ;
					el = el.offsetParent ;
				} ;
				}
				for( var b = 0 ; b < els.length ; b++ ) {
					el = els[ b ] ;
					for( var a = 0 ; a < dirs.length ; a++ ) {
						ret += parseInt( get_css(  att.match( /pad/i ) ? "padding" + ( dirs[ a ] ) : att.match( /mar/i ) ? "margin" + ( dirs[ a ] ) : ( att.match( /pad/i ) ? "padding" : "border" ) + dirs[ a ] + "Width" , el ) ) || 0  ;
					} ;
				} ;
				
				return ret ;
			}
			function get_outer( data ) {
				var new_el = this.new_el , app = this.app , is = this.is ;

				var tmp = new_el( "div" ) ;
				if( is( "str" , data ) ) {
				tmp.innerHTML = data ;
				data = tmp.lastChild.cloneNode( true ) ;
				}
				else
				if( is( "object" , data ) ) {
				app( data.cloneNode( true ) , tmp ) ;
				}
 
				return { "str" : tmp.innerHTML , "obj" : tmp.lastChild } ;
			}
			function get_pars( el , all , offset ) {
				var $ = this.$ ;

				if( !( el = $( el ) ) ) { return null ; }

				var pars = [] ;
				
				while( el ) {
					el = el[ ( !offset ? "parentNode" : "offsetParent" ) ] ;
					pars.push( el ) ;
				} ;

				return !all ? pars[ 0 ] : pars ;
			}
			function get_pos( el ) {
				var $ = this.$ ;

				if( !( el = $( el ) ) ) { return null ; }
		
				var ow = el.clientWidth | el.offsetWidth ;
				var oh = el.clientHeight | el.offsetHeight ;
				var l =  0 , t = 0 , r = 0 , b = 0 ;

				while( el ) {
					l += el.offsetLeft ;
					t += el.offsetTop ;
					el = el.offsetParent ;
				} ;
				
				return { "ow" : ow , "oh" : oh , "l" : l , "t" : t , "r" : l + ow , "b" : t + oh } ;
			}
			function get_pos_cur( eve ) {
				var is = this.is , get_pos_scroll = this.get_pos_scroll ;
				
				if( !( eve = eve || self.event ) ) { return null ; }
				
				var cursor = {} ;
				if( !is( "und" , eve.pageX ) && !is( "un" , eve.x ) ) {
				cursor.x = eve.pageX ;
				cursor.y = eve.pageY ;
				}		
				else {
				var spos = get_pos_scroll( eve ) ;
				cursor.x = eve.clientX + spos.x ;
				cursor.y = eve.clientY + spos.y ;
				}
		
				return cursor ;
			}
			function get_pos_scroll( eve ) {
				var is = this.is , Doc = this.document ;
				
				if( !( eve = eve || self.event ) )  { return null ; }
				
				var scroll = {} ;
				if( !is( "und" , this.pageYOffset ) ) {
				scroll.x = this.pageXOffset ;
				scroll.y = this.pageYOffset ;
				}
				else
				if( !is( "und" , Doc.documentElement.scrollTop )  && Doc.documentElement.scrollTop > 0 ) {
				scroll.x = Doc.documentElement.scrollLeft ;
				scroll.y = Doc.documentElement.scrollTop ;
				}
				else
				if( !is( "und" , Doc.body.scrollTop ) ) {
				scroll.x = Doc.body.scrollLeft ;
				scroll.y = Doc.body.scrollTop ;
				}

				return scroll ;
			}
			function get_sibs( el , all , dire , strict ) {
				var $ = this.$ ;

				if( !( el = $( el ) ) ) { return null ; }

				dire = dire == "next" || dire == "previous" ? dire : "next" ;
			
				var sibs = [] ;

				while( el ) {
					el = el[ ( dire ) + "Sibling" ] ;
					if( strict && el && el.nodeType == 3 && String( el.nodeValue ).match( /^\s+$/ ) ) { continue ; }
					sibs.push( el ) ;
				} ;
				
				sibs.pop() ;

				return !all ? sibs[ 0 ] : sibs ;
			}
			function get_ss( sheet ) {
				var Doc = this.document , app = this.app , head = this.head , newel = this.new_el , is = this.is ;
				sheet = Math.abs( is( "num" , sheet ) ? sheet : -1 ) ;
				var ssheets = Doc.styleSheets ;
				sheet = is( "object" , ssheets[ sheet ] ) ? ssheets[ sheet ] : ssheets.length && ssheets[ ssheets.length - 1 ].nodeName == "STYLE" ?ssheets[ ssheets.length - 1 ] : null ;
				var o = sheet.ownerNode || sheet.owningElement ;
				if( !sheet || ( sheet && !o.nodeName.match( /^style$/i ) ) ) {
				sheet= app( new_el( "style" ) , head() ).sheet ;
				}

				sheet.get_owner = function () {
					return this.ownerNode || this.owningElement ;
				}
				sheet.ss = function ( k , v ) {
					if( sheet.insertRule ) {
					sheet.insertRule( k + "{" + ( v ) + "}"  , 0 ) ;
					alert( sheet ) ;
					}
					else
					if( sheet.addRule ) {
					sheet.addRule( k , v , 0 ) ;
					}
					else {
					return alert( "css not supported" ) ;
					}
					return this ;
				}
				sheet.ss2 = function ( v ) {
					if( sheet.ownerNode ) {
					sheet.ownerNode.innerHTML += v ;
					}
					else
					if( sheet.owningElement ) {
					sheet.owningElement.cssText += v ;
					}
					else {
					return alert( "css not supported" ) ;
					}
					return this ;
				}
 
				return sheet ;
			}
			function get_target( eve ) { 
				eve = eve ? eve : event ;
				target = eve.target ? eve.target : eve.srcElement ;

				while( target.nodeType == 3 && target.parentNode != null ) {
					target = target.parentNode ;
				} ;

				return target ;
			}
			function get_tnodes( el ) {
				var $ = this.$ , get_cnodes = this.get_cnodes , get_sibs = this.get_sibs ;

				if( !( el = $( el ) ) ) { return null ; }

				var tnodes = [] ;
				
				function act_1( el ) {
					if( el.nodeType == 3 ) {
					tnodes.push( el ) ;
					}
					if( el.nodeType == 1 ) {
					var fchild = get_cnodes( el )[ 0 ] ;
					while( fchild ) {
						act_1( fchild ) ;
						fchild = get_sibs( fchild , "next" )[ 0 ] ;
					} ;
					}
				}
				act_1( el ) ;

				return tnodes ;
			}
			function get_xho( method , src , async ,  callback , params ) {
				var is = this.is ;

				callback = is( "fun" , callback ) ? callback : this[ callback ] ;
				params = params ? String( params ) : null ;

				var xho ;
				try {xho = new ActiveXObject( "Microsoft.XMLHTTP" ) ;}
				catch( err ) {
				try {xho = new XMLHttpRequest() ;}
				catch( err ) {return alert( "warning: Ajax Not Supported" ) ;}
				}
				if( xho && method && src && is( "fun" , callback ) ) {
				xho.open( method , src , async ) ;
				xho.setRequestHeader( "content-type" , "application/x-www-form-urlencoded" );
				xho.setRequestHeader( "content-length" , params.length );
				xho.setRequestHeader( "connection" , "close" );
				xho.onreadystatechange = function () {
					if( xho.readyState == 4 ) {
					callback( xho ) ;
					}
				}
				xho.send( params ) ;
				}

				return xho ;
			}
			function head() {
				return this.document.getElementsByTagName( "head" )[ 0 ] ;
			}
			function in_array( query , group , bythis , byindex ) {
				var is = this.is ;
				
				if( !( is( "object" , group ) ) ) {return null ;}
				bythis = ( bythis == "k" || bythis == "v" ? bythis : "v" ) ;

				if( byindex && is( "num" , group.length ) ) {
				for( var k = 0 ; k < group.length ; k ++ ) {
					if( ( bythis == "k" ? query == k : query == group[ k ] ) ) { return group[ k ] ; }
				} ;
				}
				for( var k in group ) {
					if( ( bythis == "k" ? query == k : query == group[ k ] ) ) { return group[ k ] ; }
				} ;
				
				return false ;
			}
			function is( type , data ) {
				if( type == "num" ) { return typeof data == "number" ; }
				if( type == "str" ) { return typeof data == "string" ; }
				if( type == "boo" ) { return typeof data == "boolean" ; }
				if( type == "null" ) { return typeof data == "null" ; }
				if( type == "object" ) { return typeof data == "object" ; }
				if( type == "fun" ) { return typeof data == "function" ; }
				if( type == "obj" ) { return typeof data == "object" && data.constructor == Object ; }
				if( type == "arr" ) { return typeof data == "object" && data.constructor == Array ; }
				if( type == "date" ) { return typeof data == "object" && data.constructor == Date ; }
				if( type == "reg" ) { return typeof data == "object" && data.constructor == RegExp ; }
 				if( type == "und" ) { return typeof data == undefined && typeof data === undefined && typeof data == "undefined" ; }
			}
			function keep_cen( eve , el , exclude , exx , exy , Tog ) {
				var $ = this.$ , set_css = this.set_css , get_pos_scroll = this.get_scroll_pos
				, get_dims = this.get_dims , get_dims = this.get_dims ;
							
				if( !eve || !( el = $( el ) ) ) { return null ; }
				exclude = new String( exclude ) ;
				exx = exx | 0 ;
				exy = exy | 0 ;
				var scroll = get_pos_scroll( eve ) ;
				var dims = get_dims() ;
				var pos = get_pos( el ) ;
				var y =   !exclude.match( "y" ) ?  scroll.y + Math.abs( dims.h * .5 - pos.oh * .5 ) + exy : false ;
				var x =  !exclude.match( "x" ) ? scroll.x + Math.abs( dims.w * .5 - pos.ow * .5 ) + exx : false ;
			
				if( !x && !y ) { return null ; }
				if( Tog ) {

				}
				else {
				set_css( ( x ? "left:" + ( x ) + "px;" : "" ) + ( y ? "top:" + ( y ) + "px;" : "" ) , el ) ;
				}
				 
				return el ;
			}
			function load_incs( incs ) {
				var fore = this.fore ;

				var str_incs = ''
				+ '$incs = array() ;' ;
				if( incs ) {
				fore( function ( inc ) {
					 str_incs += '$incs[] = "' + ( inc ) + '" ;' ;
				} , incs ) ;
				str_incs += "foreach( $incs as $k => $v ) {include( $v ) ;} ;" ;
				}

				return str_incs ;
			}
			function mydecode( data ) {
				data = rep( new RegExp( "::emark::", "g" ) ,  "!"  , data ) ;
				data = rep( new RegExp( "::asign::" , "g" ) , "@" , data ) ;
				data = rep( new RegExp( "::nsign::" , "g") , "#" , data ) ;
				data = rep( new RegExp( "::persign::" , "g" ) , "%" , data ) ;
				data = rep( new RegExp( "::tri::" , "g" ) , "^" , data ) ;
				data = rep( new RegExp( "::andsign::" , "g" ) , "&" , data ) ;
				data = rep( new RegExp( "::star::" , "g" ) , "*" , data ) ;
				data = rep( new RegExp( "::parl::" , "g" ) , "(" , data ) ;
				data = rep( new RegExp( "::parr::" , "g" ) , ")" , data ) ;
				data = rep( new RegExp( "::uline::" , "g" ) , "_" , data ) ;
				data = rep( new RegExp( "::msign::" , "g" ) , "-" , data ) ;
				data = rep( new RegExp( "::psign::" , "g" ) , "+" , data ) ;
				data = rep( new RegExp( "::esign::" , "g" ) , "=" , data ) ;
				data = rep( new RegExp( "::sbraql::" , "g" ) , "{" , data ) ;
				data = rep( new RegExp( "::sbraqr::" , "g" ) , "}" , data ) ;
				data = rep( new RegExp( "::braql::" , "g" ) , "[" , data ) ;
				data = rep( new RegExp( "::braqr::" , "g" ) , "]" , data ) ;
				data = rep( new RegExp( " ::pipe::" , "g" ) , "|" , data ) ;
				data = rep( new RegExp( "::bslash::" , "g" ) , "\\" , data ) ;
				//data = rep( new RegExp( "::col::" , "g" ) , ":" , data ) ;
				data = rep( new RegExp( "::scol::" , "g" ) , ";" , data ) ;
				data = rep( new RegExp( "::dquote::" , "g" ) , "\"" ,data ) ;
				data = rep( new RegExp( "::squote::" , "g" ) , "'" , data ) ;
				data = rep( new RegExp( "::comm::" , "g" ) , "," ,data ) ;
				data = rep( new RegExp( "::per::" , "g" ) , "." , data ) ;
				data = rep( new RegExp( "::qmark::" , "g" ) , "?" ,  data ) ;
				data = rep( new RegExp( "::fslash::" , "g" ) , "/" , data ) ;
				 
				data = rep( new RegExp( "::lt::" , "g" ) , "<" , data ) ;
				data = rep( new RegExp( "::gt::" , "g" ) , ">" , data ) ;
				data = rep( new RegExp( "::space::" , "g" ) , " " , data ) ;
				 
				return data
			}
			function myencode( data ) {
				data = rep( /\!/g , "::emark::" , data ) ;
				data = rep( /@/g , "::asign::" , data ) ;
				data = rep( /#/g , "::nsign::" , data ) ;
				data = rep( /%/g , "::persign::" , data ) ;
				data = rep( /\^/g , "::tri::" , data ) ;
				data = rep( /&/g , "::andsign::" , data ) ;
				data = rep( /\*/g , "::star::" , data ) ;
				data = rep( /\(/g , "::parl::" , data ) ;
				data = rep( /\)/g , "::parr::" , data ) ;
				data = rep( /_/g , "::uline::" , data ) ;
				data = rep( /-/g , "::msign::" , data ) ;
				data = rep( /\+/g , "::psign::" , data ) ;
				data = rep( /=/g , "::esign::" , data ) ;
				data = rep( /\{/g , "::sbraql::" , data ) ;
				data = rep( /\}/g , "::sbraqr::" , data ) ;
				data = rep( /\[/g , "::braql::" , data ) ;
				data = rep( /\]/g , "::braqr::" , data ) ;
				data = rep( /\|/g , "::pipe::" , data ) ;
				data = rep( /\[\]/g , "::bslash::" , data ) ;
				//data = rep( /:/g , "::col::" , data ) ;
				data = rep( /;/g , "::scol::" , data ) ;
				data = rep( /"/g , "::dquote::" , data ) ;
				data = rep( /'/g , "::squote::" , data ) ;
				data = rep( /,/g , "::comm::" , data ) ;
				data = rep( /\./g , "::per::" , data ) ;
				data = rep( /\?/g , "::qmark::" , data ) ;
				data = rep( /\//g , "::fslash::" , data ) ;
				 
				data = rep( /</g , "::lt::" , data ) ;
				data = rep( />/g , "::gt::" , data ) ;
				data = rep( /\s/g , "::space::" , data ) ;
				 
				return data ;
			}
			function new_el( data , tnode ) {
				return this.document[ "create" + ( tnode ? "TextNode" : "Element" ) ]( data ) ;
			}
			function rege( patt , flags ) {
				flags = flags == "i" || flags == "g" ? flags : "" ;

				return new RegExp( patt , flags ) ;
			}
			function rem( child ) {
				var $ = this.$ ;

				if( !( child = $( child ) ) ) { return null ; }

				return child.parentNode.removeChild( child ) ;
			}
			function rep( Query , That , This ) {
				return String( This ).replace( Query , That ) ;
			}
			function repeat( co , data , chars , callback ) {
				var is = this.is ;
				
				co = is( "num" , co ) ? co : 1 ;
				data = data ? data : "<br />" ;
				
				var str = "" ;
				var a = 0 ;
				while( a < co ) {
					if( chars ) {
					data = data[ a ] ;
					}
					str += is( "fun" , callback ) ? callback( data ) : data ;
					a ++ ;
				} ;
				
				return str ;
			}
			function reverse( obj ) {
				var is = this.is ;
		
				if( !is( "object" , obj ) ) {return alert( "invalid obj" ) ; }
				 
 				var tmp = {} ;
				var i= 0;
				for( var k in obj ) {
				try { 
					tmp[ obj[ k ] ] = k ; 
				}
				catch( err ) {
					tmp[ i ] = k ;
				}
				i++ ;
				} ;
				obj = tmp ;
				 
				return obj ;
			}
			function safe( type , data , except , defau ) {
				var is = this.is ;

				return is( type , data ) ? defau ? defau : data : except ;
			}
			function set( att , value , el ) {
				var $ = this.$ ;

				if( !( el = $( el , 1 ) ) ) { return null ; }

				el[ att ] = value ;

				return el ;
			}
			function set_css( v , el ) {
				var $ = this.$ ;

				if( !( el = $( el ) ) ) { return null ;}
				el.style.cssText+= ";" + v ;
	
				return el ;
			}
			function set_css2( k , v , el ) {
				var $ = this.$ ;

				if( !( el = $( el ) ) || !k ) {return null ;}
				el.style[ k ] = v ;
	
				return el ;
			}
			function set_inn( data , fill , el ) {
				var $ = this.$ ;

				if( !( el = $( el ) ) ) { return null ; }
			 
				if( typeof el.innerHTML != undefined ) {
				el.innerHTML = fill ? data : el.innerHTML + data ;
				}
				else
				if( typeof el.htmlFor != undefined ) {
				el.htmlFor = fill ? data : el.htmlFor + data ;	
				}
				
				return el ;
			}
			function set_op( v , el ) {
				var $ = this.$ ;

				if( !( el = $( el ) ) ) { return null ;}
				v = ( is( "num" , v ) ? v : 100 ) / 100 ;
				el.style.opacity = v ;
				el.style.MozOpacity = v ;
				el.style.KhtmlOpacity = v ;
				el.style.filter = "alpha(opacity=" + ( ( v * 100 ) ) + ")" ;
				if( Math.ceil( v ) >= 9 ) {
				try {
				el.style.removeAttribute( "filter" ) ;
				}
				catch( err ) {}
				}

				return el ;
			}
			function sha( data , tag , atts , more_classes ) {
				var att_obj = this.att_obj ;

				tag = tag ? tag : "div" ;
				more_classes = more_classes ? " " + ( more_classes ) : "" ;
				atts = att_obj( atts ) ;

				data = "<" + ( tag ) + " class='sha" + ( more_classes ) + "'" + ( att_obj( atts ) ) + ">"
					+ "<" + ( tag ) + " class='sha_top'>" + ( data ) + "</" + ( tag ) + ">"
					+ "<" + ( tag ) + " class='sha_bot'>" + ( data ) + "</" + ( tag ) + ">"
				+ "</" + ( tag ) + ">" ;

				return data ;
			}
			function stop_eve( eve ) {
				if( !eve ) { return null ; }
				if( eve.stopPropagation ) {
				return eve.stopPropagation() ;
				}
				else {
				return eve.cancelBubble = true ;
				}
			}
			function tog( des , spd , att , el , While , Post , cre , ease ) {
				var $ = this.$ , set_css2 = this.set_css2 , set_op = this.set_op
				, get_pos = this.get_pos , is = this.is ;

				if( !( el = $( el ) ) || !att ) {return null ;}
				cre = is( "num" , cre ) ? cre : 5 ;
				var name_att = "tog" + ( att ) + "status" ;
				var name_timer = name_att.replace( /status/i , "timer" ) ;
				if( !is( "num" , el[ name_att ] ) ) {
				
				var dims = get_pos( el ) ;
				el[ name_att ] = att.match( /^width$/i ) ? dims.ow : att.match( /^height$/i ) ? dims.oh : parseInt( att.match( /opacity/i ) ? ( el.style.opacity ? el.style.opacity : el.filters && el.filters.alpha && el.filters.opacity ) | 100 : el.style[ att ] ) || 0 ; 
				}
			
				function go() {
				if( ease ) {
				cre = Math.round( 1 + Math.abs( des - el[ name_att ] ) / 10 ) ;
				}
				if( des > el[ name_att ] ) {
				el[ name_att ] += cre ;
				if( el[ name_att ] >= des ) {
				el[ name_att ] = des ;
				this.clearInterval( el[ name_timer ] ) ;
				if( is( "fun" , Post ) ) {
				Post( el[ name_att ] , el[ name_timer ] , el ) ;
				}
				}
				}
				else {
				el[ name_att ] -= cre ;
				if( el[ name_att ] <= des ) {
				el[ name_att ] = des ;
				this.clearInterval( el[ name_timer ] ) ;
				if( is( "fun" , Post ) ) {
				Post( el[ name_att ] , el[ name_timer ] , el ) ;
				}
				}
				}
				el[ name_att ] = Math.round( el[ name_att ] ) ;
				if( att.match( /opacity/i ) ) {
				set_op( el[ name_att ] , el ) ;
				}
				else {
				set_css2( att , el[ name_att ] , el ) ;
				}
				if( is( "fun" , While ) ) {
				While( el[ name_att ] , el[ name_timer ] , el ) ;
				}
				}
				
				if( el[ name_timer ] ) {
				this.clearInterval( el[ name_timer ] ) ;
				el[ name_timer ] = null ;
				}
				el[ name_timer ] = setInterval( go , spd ) ;

				return el ;
			}
			function tog_cname( cname , el , new_cname ) {
				var $ = this.$ , rege = this.rege ;
				
				if( !( el = $( el ) ) ) { return null ; }
				new_cname = new_cname ? new_cname : "" ;
				
				var patt = rege( "(^|\s)?" + ( cname ) + "(\s|$)?" ) ;
				el.className = el.className.match( patt ) ? el.className.replace( patt , new_cname ) : ( cname ) + " " + ( el.className ) ;
				
				return el ;
			}
			function tomh( str , decode ) {
				var fill = this.fill , combine = this.combine
				 , reverse = this.reverse ;

				var lets = "abcdefghijklmnopqrstuvwxyz".split( "" ) ;
				var nums = [] ;
				nums = fill(  nums , lets ) ;
				var mh = combine( lets , nums ) ;
				mh = decode ? mh : reverse( mh ) ;
				var str_tmp = String( str ).toLowerCase() ;
				var ret_arr = [] ;	
				var ret_str = "" ;
				var ret_value =  0 ;
				var ret_nan = [] ;
				var char = "" ;
				for( var a = 0 ; a < str_tmp.length ; a++ ) {
					char =decode ? mh[ a ] : eval( mh[ str_tmp[ a ] ] ) + 1;
					if( !mh[ str_tmp[ a ] ] ) {
					ret_nan.push( str_tmp[ a ] ) ;		// if cannot be converted to myhand capture in array
					}
					ret_arr.push( char ) ;
					ret_str += char ;
					ret_value = eval( ret_value + char ) ;
					
				} ;
				
				return { "arr" : ret_arr , "str" : ret_str , "value" : ret_value ,  "nan" : ret_nan } ;
			}
			function watch(  callback , el ) {
				var $ = this.$ , add_eve = this.add_eve ;

				if( !( el = $( el ) ) ) { el = this.document.body ; }
				return add_eve( "mousemove" , callback , false , el ) ;
			}
			function wr( data , co , callback ) {
				var Doc = this.document ;

				var tmp = {} ;
				tmp.a = function () { Doc.write( data ) ;}.repeat( co , callback ) ;

				return Doc ;
			}
			function wrap( tags , data , auto_implode ) {
				var is =this.is , att_obj = this.att_obj ;

				tags = is( "arr" , tags ) ? [ tags ] : tags ;
				data = is( "arr" , data ) ? [ data ] : data ;

				var tag , split , str_tag , atts , ret_data ;
				var ret_arr = [] ;
				var a = 0 , b = 0 ;
				while( b < data.length ) {
					while( a < tags.length ) {
						tag = String( tags[ a ] ) ;
						split = tag.split( "@" ) ;
						str_tag = split[ 0 ] ;
						atts = att_obj( split[ 1 ] ) ;
						ret_data = "<" + ( str_tag + atts ) + ">" + ( ret_data ) + "</" + ( str_tag ) + ">" ;
						a ++ ;
					} ;
					ret_arr.push( ret_data ) ;
					a = 0 ;	// reset a
					b ++ ;
				} ;
				b = 0 ;	// optionally reset, but is none effective in this scenario
				
				return auto_implode !== false ? ret_arr.join( auto_implode || "" ) : ret_arr ;
			}


			Function.prototype.repeat = function ( co , callback ) {
				var is = self.is ;

 				if( !is( "num" , co ) ) { co = 1 ; } 

				for( var a = 0 ; a < co ; a ++ ) {
					if( is( "fun" , callback ) ) {
					callback( this( a ) , a );
					}
					else {
					this( a ) ;
					}
				} ;

				return this ;
			}
