var eHEAD = null , eBODY = null
window.bError = false
window.LOADED = false

extend =function( o , m , bPreserve ){
	var b = bPreserve || false , s
	if( m )switch( m.constructor ){
		case Array: for( var i = 0 , n = m.length ; i < n ; i++) extend( o , m[i] , b )
			break;
		default:for( s in m ){
			if( s=="prototype" ) continue
			if( o[s] == undefined ) o[s] = m[s]
				else if( ! b )
					switch( o[s].constructor ){
						case Array: o[s] = Array.merge( o[s] ,to_array( m[s]))
							break
						default:
							if( s == "style" ) for( s2 in m[s]) o[s][s2] = m[s][s2] 
								else o[s]=m[s]
						} 
				}
			if( m.prototype ) extend( o.prototype , m.prototype , true )
		}
	return o
	}
Object.prototype.extend = function ( mSources , b ) {
	return extend ( this , mSources , b )
	}
Object.prototype.extend ({
	clone :function(){ 
		if(in_array(this.constructor,[Boolean,Number,String,Date,Function]))return this.valueOf( )
		var m=new this.constructor
		for(var i in this) m[i]= this[i] ? this[i].clone() : this[i]
		return m
		},
	each :function( f1 , aConstructors , m ){
		var a1=(m&&m.constructor==Array)?m:[]
		,a2=aConstructors||false
		,f=this.constructor||""
		,o1=(!m||m.constructor==Array)?window:m
		switch(f){
			case Array: for( var i = 0 , ni = this.length ; i < ni ; i++ )
					if( this[i] != undefined && (  ! a2 || in_array( this[i].constructor , a2 )))
						f1.apply( o1 ,[ this[i] ,i ].concat( a1 ))
				break;
			default: for( var s in this ) 
					if( this[s] != undefined && ( ! a2 || in_array( this[s].constructor , a2 )))
						f1.apply( o1 ,[ this[s] , s ].concat( a1 ))
			}
		return this
		}
	})

Browser = function (){
	if ( Browser.cache ) return Browser.cache
	var ua= navigator.userAgent
	, o = {
		isMacOS : ( ua.indexOf( 'Mac OS' ) != -1 ),
		isIE : ( navigator.appName == "Microsoft Internet Explorer"),
		isNS : ( ua.indexOf( 'Netscape/' ) != -1 )
		}
	var a = [ "Gecko" , "Chrome"  , "Opera" , "Firefox" , "Camino" , "Safari" ]
	for( var i = 0 , ni = a.length ; i < ni ; i++ )
		o[ 'is' + a[i]] = ( ua.indexOf( a[i]) != -1 )
	try {
		if( o.isIE ){
			o.isIE = ua.replace( /^.*?MSIE ([0-9\.]*).*$/ , "$1" )
			if( o.isIE < 6 ) throw new Error ( )
			}
		if( o.isNS ){ // work only on netscape > 8 with render mode IE
			o.isNS = ua.substr( ua.indexOf( 'Netscape/' ) + 9 )
			if( o.isNS  < 8 || ! o.isIE ) throw new Error ( )	
			}
		if( o.isOpera ){	
			o.isOpera = ua.replace( /^.*?Opera.*?([0-9\.]+).*$/i , "$1" )
			if( o.isOpera < 9 ) throw new Error ( )
			o.isIE = false
			}
		if( o.isFirefox ) o.isFirefox = ua.replace( /^.*?Firefox.*?([0-9\.]+).*$/i , "$1" )
		if( o.isCamino ) o.isCamino = ua.replace( /^.*?Camino.*?([0-9\.]+).*$/i , "$1" )
		if( o.isSafari ) o.isSafari = o.isChrome ? true : ua.replace( /^.*?Version\/([0-9]+\.[0-9]+).*$/i , "$1" )
		if( o.isChrome )	o.isChrome = ua.replace( /^.*?Chrome\/([0-9]+\.[0-9]+).*$/i , "$1" )
		 o.isValidBrowser = ( o.isIE  >= 6 || o.isOpera  >= 9 || o.isFirefox || o.isChrome || o.isCamino || o.isSafari >= 3 )
		} catch ( e ){ o = false }
	Browser.cache = o
	extend( Browser , o )
	return o
	} 
Nav = Browser()
Browser.extend({
	viewSize :function( s ){
		if( ! s ){
			var f = this.viewSize
			return { width: f( "Width" ) , height: f( "Height" )}
			}
		return self[ "inner" + s] || document.documentElement[ "client" + s] || document.body[ "client" + s]
		},
	scrollAttr :function( s ){
		if( ! s ){
			var f = this.scrollAttr
			return { width: f( "Width" ), height: f( "Height" ), left: f( "Left" ), top : f( "Top" )}
			}
		return document.documentElement[ "scroll" + s ] || document.body[ "scroll" + s ] 
		}
	})

to_array =function( M ){
	switch( M.constructor ){
		case Array : return M
		case String : return [ M ]
		default: if( M.length >= 0 ){
			for( var i=0 , aA = [] , n = M.length ; i < n ; i++ ) aA.push( M[i])
			return aA
			}
		}
	return [ M ]
	}
to_string =function( m , a ){
	var s = "" , a = a ? a : []
	if( m ) switch( m.constructor ){
		case Array :
			for( var i = 0 , n = m.length , a1 = [] ; i < n ; i++ ) a1.push( to_string( m[i] , a ))		
			s = "[" + a1.join( "," ) + "]"
			break
		case Boolean: s = m.toString(); break
		case Number :s = m; break
		case Object :
			if( in_array( m , a , true )) s += "@RECURSION@"
				else{
					a.push( m )
					var a1 = []
					for( i in m )
						if( m[i].constructor != Function )
							a1.push( i + ":" + to_string( m[i] , a ))
					s = "{" + a1.join( "," ) + "}"
					}
			break
		case String : s = "'" +  m.replace( /([^/])'/ , "$1\\'" ) + "'"; break
		case Function : s = m.toString(); break
		default : ;
		} else s = m
	return s ? s : "''"
	}

isset =function( m ){ return m != undefined }
in_array =function( M , A , bStrict ){ return A.contain( M , bStrict )}
str_replace =function( A1 , A2 , m ){ return m[ m.constructor == Array ? "replace" : "str_replace" ]( A1 , A2 )}
	
RegExp.extend ({
	escape :function( s ){
		return s.replace( /(\.|\?|\*|\+|\\|\(|\)|\[|\]|\}|\{|\$|\^|\|)/g , "\\$1" )
		}
	})

Function.prototype.extend ({
	alter :function(fA,oA){
		var fun=this,oA=oA||window
		return function(){
			return fun.apply(oA,[fA.apply( oA , arguments )].concat( to_array( arguments )))
			}
		},
	prefix :function(fA,oA,bA){
		var fun=this,oA=oA||window
		return function(){
			var a=arguments,r1=fun.apply(oA,a),r2=fA.apply(oA,a)
			return bA?r1:r2
			}
		},
	suffix :function(fA,oA,bA){
		var fun=this,oA=oA||window
		return function(){
			var a=arguments,r1=fA.apply(oA,a),r2=fun.apply(oA,a)
			return bA?r1:r2
			}
		}
	})

Array.extend ({
	merge :function(){
		for( var a1=[], a2=to_array( arguments ), i=0, n=a2.length ; i<n ; i++ ) a1=a1.concat( a2[i])
		return a1
		},
	unique :function( a1 ){
		for( var a2=[], a3=[], i=0, n=a1.length ; i<n ; i++ ){
			var mValue=a1[i],s1=to_string( mValue )
			if( ! in_array( s1 , a3 )){ a2.push( mValue ); a3.push( s1 )}
			}
		return a2
		}
	})
Array.prototype.extend ({
	diff :function(){
		var a1=this.clone(),a2=to_array(arguments)
		for(var j=this.length-1;j>=0;j--)
			a2.each(function(a3){
				a3.each(function(mValue){
					if(mValue==a1[j])a1.splice(j,1)
					})
				})
		return a1
		},
	contain :function(m,b){
		var b=b||false
		for(var i=0,n=this.length;i<n;i++)
			if(b?this[i]===m:this[i]==m)return true
		return false
		},
	indexOf :function(m){
		for(var i=0,n=this.length;i<n;i++)
			if(this[i]===m)return i
		return -1
		},
	remove :function(m0){
		for(var i=0,n=this.length;i<n;i++)
			if(this[i]==m0)return this.splice(i,1)
		return null
		},
	replace :function(A1,A2){
		var a = []
		for(var i=0,n=this.length;i<n;i++)
			a[i]=this[i].str_replace(A1,A2)
		return a
		},
	sortBy :function(s1,s2){
		var s1=s1||"",s2=s2||"ASC"
		if(s1!="")s1="['"+s1.str_replace("\.","']['" )+"']"
		var o1={
			"ASC":["<","==",">"],
			"DESC":[">","==","<"]
			}
		var a1=o1[s2]||o1["ASC"]
		function sortObject(m1,m2){
			var b1=eval("m1"+s1+a1[0]+"m2"+s1)
			, b2=eval("m1"+s1+a1[1]+"m2"+s1)
			, b3=eval("m1"+s1+a1[2]+"m2"+s1)
			return b1?-1:b3?1:0
			}
		return this.sort( sortObject )
		}
	})

String.prototype.extend ({
	trim :function(){
		for( var s = this.replace( /^\s+/ , '' ), i = s.length - 1 ; i > 0; i--){ 
			if( /\S/.test( s.charAt( i ))){
				s = s.substring( 0, i + 1 )
				break 
				} 
			} 
		return s
		},
	str_replace :function( m1 , m2 ){
		var s = this
		, a1 = to_array( m1 )
		, a2 = to_array( m2 )
		, b = m2.constructor == String
		a1.each( function( m , i ){
			var re = m.constructor == RegExp ? m : new RegExp ( RegExp.escape( m ) , "g" )
			s = s.replace( re , b ? a2[0] : ( a2[i] ? a2[i] : "" ))
			})
		return s
		},
	countLines :function(){
		var a = this.match( /\n/g )
		return a ? a.length + 1 : 1
		}
	})

Chrono = function(){ this.start()}
Chrono.prototype.extend ({
	start: function(){ this.dStart = new Date()},
	stop: function(){
		this.dStop = new Date()
		return parseInt( this.dStop.getTime() - this.dStart.getTime())
		}
	})

getElementById =function(s1){return document.getElementById(s1)}
getElementsByTagName =function(s1){return document.getElementsByTagName(s1)}
write = function(sText){return document.write(sText)}
_ = function( sId ){
	var collect =function( s ){ return window[ s ] = getElementById( s )}
	if( arguments.length == 1 ) return collect( sId )
	else for( var i = 0 , a = [] , ni = arguments.length ; i < ni ; i++ )
		a.push( collect( arguments[ i ]))
	return a
	}
	
Tag = function( s , o ){
	var e = s.nodeName ? s : document.createElement( s )
	if( o ) extend( e , o )
	extend( e , Tag.prototype )
	return e
	}
Tag.prototype.extend({
	cssClass :function( sClassName , sAction ){
		return Tag.cssClass( this , sClassName , sAction )
		},
	appendNodes :function(){
		var that = this
		to_array( arguments ).each( function( e ){ if( e && e.nodeName) that.appendChild( e )})
		return this
		},
	setOpacity :function ( n ){
		var that = this
		var f =function( s ){
			var a1 = s.split ( ";" ), o = {}
			for( var i = 0 , ni = a1.length ; i < ni ; i++ ){
				var a = a1[ i ].split( ":" )
				, sAttribute = a[ 0 ].trim ()
				, sValue = ( a[ 1 ] || "" ).trim ()
				if( a.length == 2 ){
					o[ sAttribute ] = sValue
					that.style[ sAttribute  ] = str_replace( "^([\"'])([^\1]*?)\1$" , "$2" , sValue )
					}
				}
			return o
			}
		f( Style.calculate( "opacity" , n ))
		}
	})
Tag.extend ({
	addChildNodes :function( e , s , a , mSelected ){
		var eSelected = null
		, f = function( m ){
			if( m ){
				var eChild = Tag( s )
				switch( m.constructor ){
					case Object : extend( eChild , m ) ; break
					case String : 
						eChild.innerHTML = m
						if( s.toLowerCase() == "option" ) eChild.value = m
						if( m == mSelected ) eChild.selected = true
						break
					default : 
					}
				e.appendChild( eChild )
				}
			}
		mSelected = mSelected || null
		if( a ) for( var i=0 , ni=a.length ; i<ni ; i++ ) f( a[i])
		},
	cssClass :function( e , sClassName , sAction ){
		var s = e.className
		, re = new RegExp( "(^|\\s+)" + sClassName + "($|\\s+)", "gi" )
		, b = re.test( s )
		switch( sAction ){
			case "add" : if( ! b ) return e.className += " " + sClassName
				break
			case "delete" : if( b ) return e.className = s.replace( re ,  "$1$2" )
				break
			default: return b
			}
		},
	cotes :function( eNode ){
		var pos=Tag.position(eNode)
		,dim=Tag.dimension(eNode)
		return { left:pos.left , top:pos.top , width:dim.width , height:dim.height }
		},
	dimension :function( e ){
		var o1 = e.style 
		, b1 = o1.display == "none"
		, s = o1.position
		if( b1 ) extend( o1 , { position: "absolute" , display: "" })
		var oDim = { width: e.offsetWidth , height:  e.offsetHeight }
		if( b1 ) extend( o1 , { position: s , display: "none" })
		return oDim 
		},
	interlock :function(){
		for( var i = arguments.length - 1 ; i > 0 ; i-- )
			arguments[ i - 1 ].appendChild( arguments[ i ])
		return arguments[0]
		},
	position :function( e ){
		if( e.parentNode === null || e.style.display == 'none' ) return false
		var parent = null
		, pos = {}
		, box
		if( e.getBoundingClientRect ){ // IE
			box = e.getBoundingClientRect()
			var scroll =  Browser.scrollAttr()
			, o = { left: box.left + scroll.left , top: box.top + scroll.top }
				// TEST breadcrumbs & colorpicker
				if( window.parent == window && Nav.isIE ){
					o.left -= 2
					o.top -= 2
					}
			return o
			}
		else if( document.getBoxObjectFor ) { // gecko
			box = document.getBoxObjectFor( e )
			pos =  { left: box.x , top: box.y }
			}
		else { // safari / opera
			pos = { left: e.offsetLeft, top: e.offsetTop }
			parent = e.offsetParent
			if( parent != e ){
				while( parent ){
					pos.left += parent.offsetLeft
					pos.top += parent.offsetTop
					parent = parent.offsetParent
					}
				}
			// opera & (safari absolute) incorrectly account for body offsetTop
			if( Nav.isOpera || ( Nav.isSafari && e.style.position == 'absolute' ))
				pos.top -= document.body.offsetTop
			}
		for( parent = e.parentNode ; parent && parent.tagName != 'BODY' && parent.tagName != 'HTML' ; parent = parent.parentNode ){
			pos.left -= parent.scrollLeft
			pos.top -= parent.scrollTop
			}
		return pos
		},
	removeChildNodes :function( e ){
		while(e.childNodes.length>0)e.removeChild(e.firstChild)
		},
	removeNode :function( e ){
		e.parentNode.removeChild( e )
		},
	setChildNodes :function( e , s , a , mSelected ){
		e.style.display = "none"
		Tag.removeChildNodes( e )
		Tag.addChildNodes( e , s , a , mSelected )
		e.value=mSelected||null
		e.style.display = ""
		}
	})

CssRules = {
	aSelectors: null,
	add :function( styles ){
		CssRules.getSelectors() 
 		styles = styles || false
		if( styles ){
			if( document.styleSheets.length == 0 )
				document.getElementsByTagName( "head" )[0].appendChild(
					Tag( "STYLE" , { type:"text/css" , media:"all" })
					)
			var e = document.styleSheets[0]
			, a = styles.split( "}" )
			, aRules = []
			for( var a2 , i = a.length - 2 ; i >= 0 ; i-- )
				if( a[i].indexOf( "{" ) != -1 ){
					a2 = a[i].split( "{" )
					aRules.push( [ a2[0].trim() , a2[1]])
					}
			for( var i = aRules.length - 1 ; i >= 0 ; i-- ){
				var sRuleName = aRules[i][0]
				, sRule = aRules[i][1]
				if( in_array( sRuleName.toLowerCase() , CssRules.aSelectors )){
					Style.set( CssRules.get( sRuleName ) , sRule )
					} else {
						// IE , Safari , Chrome
						if ( e.rules ) e.addRule( sRuleName , sRule );
						// Firefox, etc
						else if ( e.cssRules ) e.insertRule( sRuleName + "{" + sRule + "}" , 0 );
						CssRules.aSelectors.push( sRuleName.toLowerCase())
						}
				}
			}
		},
	getSelectors :function( b ){
		if( CssRules.aSelectors && ! b ) return CssRules.aSelectors
		var a = [], ai = document.styleSheets
		if( ai )
			for( var i = 0 ,ni = ai.length ; i < ni ; i++ ){
				try{
				var o = ai[i] , aj = o.cssRules || o.rules 
				} catch(e){}
				for( var j = 0 , nj = aj.length ; j < nj ; j++ ){
					if( aj[j].selectorText ){
						var s = aj[j].selectorText.trim().toLowerCase()
						a.push( s )
						}
					}
				}
		return CssRules.aSelectors = a
		},
	get :function( s , b ){
		CssRules.getSelectors() 
		var s = s.trim().toLowerCase() , ai = document.styleSheets
		if( ai )
			for( var i = 0 ,ni = ai.length ; i < ni ; i++ ){
				var o = ai[i], aj = o.cssRules || o.rules 
				for( var j = 0 , nj = aj.length ; j < nj ; j++ )
					if( aj[j].selectorText.toLowerCase() == s )
						if( b ){
							CssRules.aSelectors.remove( s )
							return o[ o.cssRules ? "deleteRule" : "removeRule" ]( j )
							}else{
								o = aj[j]
								return o.style
								}
				}
		return false
		},
	remove :function( s ){
		return CssRules.get( s.trim() , true )
		}
	}

Style = {
	calculate :function( s , m ){
		var bColor = /color/i.test( s ) , sUnit = ""
		switch( s ){
			case "font-size":
			case "height":
			case "width":
				m = m < 0 ? 0 : m
				break
			case "opacity" :
				m = eval( m )
				n = m < 0 ? 0 :( m > 1 ? 1 : m.toFixed( 2 ))
				m = n * 100
				return [ "filter:alpha(opacity=" , m , ");-moz-opacity:" , n , ";-khtml-opacity:" , n , ";opacity:" , n , ";" ].join( "" )
				break;
			}
		switch( s ){
			case "font-size" : sUnit = "em" ; break;
			default : sUnit = bColor ? "" : "px"
			}
		if( sUnit == "px" && /px/.test( m )) m = parseInt( m ) || 0
		return [ s , ":" , m , sUnit , ";" ].join( "" )
		},
	get :function( e , sAttr ){
		var s = Style.getAttributeNS( sAttr )
		, sValue = e.style[s]
		if( ! sValue && in_array( s , [ "height" , "width" , "left" , "top" ])){
			o = Tag.cotes( e )
			sValue = o[s]
			}
		if( ! sValue ){
			var sClasses = e.className
			if( sClasses ){
				a = sClasses.split( " " )
				for( var i = 0 , n = a.length, sClassName, o ; i < n ; i++ ){
					sClassName = a[i].trim ()
					if ( o = CssRules.get( "." + sClassName ))
						sValue = o[s] || sValue
					}
				}
			}
		if( ! sValue ){
			if( e.currentStyle )	sValue = e.currentStyle[s]
				else if( window.getComputedStyle )
					sValue = window.getComputedStyle( e , "" ).getPropertyValue( sAttr )
			}
		return sValue || "0"
		},
	getAttributeNS :function( s ){
		if( s.indexOf( "-" )){
			var a = s.split( "-" )
			for( var i = 0 , s = "", n = a.length , s1 ; i < n ; i++ ){
				s1 = a[i]
				s += ( i == 0 ) ? s1 : s1.charAt( 0 ).toUpperCase() +  s1.substr( 1 )
				}
			}
		return s
		},
	remove :function( m , s ){ // m == CssRule || Element
		m = m.style
		if( m && m[s]){
			if( m.removeProperty ) m.removeProperty( s ) 
				else try{ m[s] = "" }catch(e){}
			}
		},
	set :function( m , s ){
		var m = m.style || m
		for( var a1 = ( m.cssText + ";" + s ).split( ";" ), o = {}, i = 0 , n = a1.length ; i < n ; i++ ){
			var a = a1[i].split( ":" )
			if( a.length == 2 && a[1] ) o[ a[0].trim().toUpperCase() ] = ( a[1] || "" ).trim()
			}
		s = ""
		o.each( function( value , key ){
				s += [ key , ":" , value , ";" ].join( "" )
			} , [ String, Number ])
		return m.cssText = s
		}
	}

call =function( o1 , s1 ){
	var a1 = to_array( arguments )
	a1 = a1.slice( 2 , a1.length )
	var f1 =function( evt ){
		var evt = getEvent( evt )
		if( evt && o1[ s1 ]) return o1[ s1 ].call( o1 , evt , a1 )
		}
	return f1
	}
addEvent =function( e , s1 , f1 , bBefore ){
	if( ! e ) return ;
	var f =function(e,s1,f1){
		if( e.attachEvent ) return e.attachEvent( 'on' + s1 , f1 )
		if( e.addEventListener ) return e.addEventListener( s1 , f1 , false )
		}
	// Pour FIREFOX
	if( s1 == "mousewheel" && window.addEventListener ) return f( e , 'DOMMouseScroll' , f1 )
	bBefore = bBefore || false
	var f2 = e[ "on" + s1 ]
	, f3 = function( evt ){
		var evt = getEvent( evt )
		switch( bBefore ){
			case true: f1( evt , e ); if( f2 ) return f2( evt , e )
			case false: if( f2 ) f2( evt , e ); return f1( evt , e )
			case "..." : return f1( evt , e )
			}
		}
	e[ "on" + s1 ] =  f3
	if( ! e[ "on" + s1 ]) return f( e , s1 , f1 )
	return true
	}
addEvents =function(){
	for(var i=0,n=arguments.length;i<n;i++){
		var a=arguments[i]
		if(a[0]&&a.length>2)addEvent(a[0],a[1],a[2],a[3])
		}
	}
getElement =function( e ){ 
	if( ! e ) return null
	if( e.nodeName ) return e
	if( e.type ){
		e = getEvent( e )
		return e.target ? ( e.target.nodeType==3 ? e.target.parentNode : e.target ): e.srcElement
		}
	}
getEvent =function( evt ){
	return evt ? evt : ( window.event ? window.event : null )
	}
stopPropagation =function( evt ){
	if(evt=getEvent(evt)){
		evt.cancelBubble=true
		if(evt.stopPropagation)evt.stopPropagation() 
		}
	return false
	}
preventDefault =function( evt ){
	if(evt=getEvent(evt)){
		evt.returnValue=false
		if(evt.preventDefault)evt.preventDefault() 
		}
	return false
	}

Mouse = {
	button :function( evt ){
		var evt = getEvent( evt ), n
		if(  in_array(  evt.type , [ "mousedown" , "mouseup" ])){
			n = evt.which
			if( n ) switch( n ){
				case 1 : return "left"
				// case 2 : return "middle"
				case 3 : return "right"
				default: return n
				}
			n = evt.button
			if( n ) switch( n ){
				case 1 : return "left"
				case 2 : return "right"
				// case 4 : return "middle"
				default: return n
				}
			}
		return ""
		},
	position :function( evt ){
		var evt = getEvent( evt )
		, o = { 
			left: evt.pageX ? evt.pageX : evt.clientX || 0 , 
			top: evt.pageY ? evt.pageY : evt.clientY || 0
			}
		if( Nav.isIE ){
			var o1 = Browser.scrollAttr()
			o.left +=  o1.left 
			o.top +=  o1.top
			// TEST breadcrumbs & colorpicker
			if( window.parent == window ){
				o.left -= 2
				o.top -= 2
				}
			}
		return o
		},
	wheel :function(evt){ // Pour IE et FIREFOX
		var evt = getEvent( evt ), n
		if( in_array(  evt.type , [ "mousewheel" , "DOMMouseScroll" ])){
			n = evt.wheelDelta ? evt.wheelDelta / 120 : -( evt.detail || 0 ) / 3
			return n < 0 ? "down" : "up"
			}
		return ""
		}
	}

Keyboard = {
	key :function( evt ){
		if( evt ){
			Keyboard.extend({
				alt : Keyboard.AltPressed( evt ),
				ctrl :Keyboard.CtrlPressed( evt ),
				meta : evt.metaKey || false,
				shift : Keyboard.ShiftPressed( evt )
				})
			return evt.charCode || evt.keyCode || 0
			}
		return null
		},
	AltPressed :function( e ){
		return e.modifiers ? ( e.modifiers % 2 ) : e.altKey
		},
	CtrlPressed :function( e ){
		return e.modifiers ? (( e.modifiers == 2 ) || ( e.modifiers == 3 ) || ( e.modifiers > 5 )) : e.ctrlKey
		},
	ShiftPressed :function( e ){
		return e.modifiers ? (  e.modifiers > 3 ) : e.shiftKey
		}
	}

Widgets = {
	getId :function( sType ){
		Widgets[ sType ] = Widgets[ sType ] || 0
		return sType + Widgets[ sType ]++
		}
	}
	
L10N = {
	get: function( mId , s ){
		var m = L10N[ mId ] || ""
		switch(  m.constructor ){
			case Array : return ( m[ 0 ] || "" ) + ( s || "" ) + ( m[ 1 ] || "" )
			case String : return m
			}
		}
	}

FileSystem = {
	loaded : {},
	append :function( s , e1 ){
		e1.style.display = "none"
		var bDone = false
		, display =function( e1 , e2  ){
			if(  bDone || window.bError ) return
			e1.innerHTML = e2.contentWindow.document.documentElement.innerHTML
			e1.style.display = ""
			setTimeout( function(){ e1.parentNode.removeChild( e2 )} , 500 )
			bDone = true
			}
		, loadContent =function( evt ){
			var e2 = Tag( "IFRAME" , { style:{ display : "none" }})
			e1.parentNode.appendChild( e2 )
			addEvents(
				[ e2 , "load" , function(){ display(  e1 , e2 )}],
				[ e2 , "readystatechange" , function(){ if( e2.readyState == "complete" ) display(  e1 , e2 )}]
				)
			e2.src = s
			}
		if( ! eBODY ) addEvent( window , "load" , loadContent )
			else loadContent()
		},
	file :function( sFile , b ){
		var a = document.location.toString().split( "#" )
		, s =  str_replace( unescape( a[0]) , "" , unescape( sFile ))
		if( isset( b )) FileSystem.loaded[s] = b
			else return FileSystem.loaded[s]
		},
	getPath :function( sPattern ){
		var a = Array.merge( to_array( getElementsByTagName( "LINK" )) , to_array( getElementsByTagName( "SCRIPT" )))
		, a1 = document.location.toString().split( "#" )
		, re = new RegExp ( sPattern , "i" )
		for( var i = 0 , e , ni = a.length , s , a2; i < ni ; i++ ){
			e = a[i]
			s = e.src || e.href || false
			if( s && s.match( re )){
				a2 = s.split( re )
				return str_replace( unescape( a1[0]) , "" , unescape( a2[0]))
				break
				}
			}
		return ""
		},
	load :function( m ){
		if( arguments.length == 1 && m.constructor == String ){
			var er = /.*\.([^\?]*).*?$/
			, aResult = m.match ( er )
			if( aResult )
				switch( aResult[1]){
					case 'js' : return FileSystem.loadJS( m )
					case 'css' : return FileSystem.loadCSS( m )
					default : throw new Error ( "FileSystem.load \n EXTENSION_UNKNOWN \n File:" + m )
					}
				else throw new Error ( "FileSystem.load \n EXTENSION_REQUIRED \n File:" + m )
		}else{
			var a = m.constructor == Array ? m : arguments
			for( var i = 0 , n = a.length ; i < n ; i++ ) FileSystem.load( a[i])
			}
		},
	loadCSS :function( s ){
		if( ! FileSystem.file( s )){
			FileSystem.file( s , true )
			return eHEAD.appendChild(Tag("LINK",{rel:"stylesheet",type:"text/css", media:"all",href:s}))
			}
		},
	loadJS :function( s ){
		if( ! FileSystem.file( s )){
			FileSystem.file( s , true )
			return eHEAD.appendChild(Tag("SCRIPT",{type:"text/JavaScript",src:s}))
			}
		},
	unload :function( s , b ){
		var glob = function( e , i , sAttr ){ 
			if( e[ sAttr ].match( s )){
				FileSystem.file( e[ sAttr ] , false )
				e = e.parentNode.removeChild( e )
				e = null
				}
			}
		to_array( getElementsByTagName( "LINK" )).each( glob , null , [ "href" ])
		if( Nav.isSafari ){
			if( ! b ) FileSystem.unload( ".refresh" , true )
			FileSystem.loadCSS( ".refresh" )
			if( ! b )FileSystem.unload( ".refresh" , true )
			}
		}
	}

function init ( ){
	window.LOADED = true
	if( ! eHEAD ) eHEAD = ( getElementsByTagName( "HEAD" ))[0]
	if( ! eBODY ) eBODY = ( getElementsByTagName( "BODY" ))[0]
	} init()

addEvent( window , "load" , init )

/**/
GLOBAL_LOADED = true