2012-04-26 13:21:47 -04:00
//This is used so IE can use the classList api
2013-06-19 10:13:21 -04:00
/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
if ( typeof document !== "undefined" && ! ( "classList" in document . createElement ( "a" ) ) ) { ( function ( j ) { if ( ! ( "HTMLElement" in j ) && ! ( "Element" in j ) ) { return } var a = "classList" , f = "prototype" , m = ( j . HTMLElement || j . Element ) [ f ] , b = Object , k = String [ f ] . trim || function ( ) { return this . replace ( /^\s+|\s+$/g , "" ) } , c = Array [ f ] . indexOf || function ( q ) { var p = 0 , o = this . length ; for ( ; p < o ; p ++ ) { if ( p in this && this [ p ] === q ) { return p } } return - 1 } , n = function ( o , p ) { this . name = o ; this . code = DOMException [ o ] ; this . message = p } , g = function ( p , o ) { if ( o === "" ) { throw new n ( "SYNTAX_ERR" , "An invalid or illegal string was specified" ) } if ( /\s/ . test ( o ) ) { throw new n ( "INVALID_CHARACTER_ERR" , "String contains an invalid character" ) } return c . call ( p , o ) } , d = function ( s ) { var r = k . call ( s . className ) , q = r ? r . split ( /\s+/ ) : [ ] , p = 0 , o = q . length ; for ( ; p < o ; p ++ ) { this . push ( q [ p ] ) } this . _updateClassName = function ( ) { s . className = this . toString ( ) } } , e = d [ f ] = [ ] , i = function ( ) { return new d ( this ) } ; n [ f ] = Error [ f ] ; e . item = function ( o ) { return this [ o ] || null } ; e . contains = function ( o ) { o += "" ; return g ( this , o ) !== - 1 } ; e . add = function ( ) { var s = arguments , r = 0 , p = s . length , q , o = false ; do { q = s [ r ] + "" ; if ( g ( this , q ) === - 1 ) { this . push ( q ) ; o = true } } while ( ++ r < p ) ; if ( o ) { this . _updateClassName ( ) } } ; e . remove = function ( ) { var t = arguments , s = 0 , p = t . length , r , o = false ; do { r = t [ s ] + "" ; var q = g ( this , r ) ; if ( q !== - 1 ) { this . splice ( q , 1 ) ; o = true } } while ( ++ s < p ) ; if ( o ) { this . _updateClassName ( ) } } ; e . toggle = function ( p , q ) { p += "" ; var o = this . contains ( p ) , r = o ? q !== true && "remove" : q !== false && "add" ; if ( r ) { this [ r ] ( p ) } return ! o } ; e . toString = function ( ) { return this . join ( " " ) } ; if ( b . defineProperty ) { var l = { get : i , enumerable : true , configurable : true } ; try { b . defineProperty ( m , a , l ) } catch ( h ) { if ( h . number === - 2146823252 ) { l . enumerable = false ; b . defineProperty ( m , a , l ) } } } else { if ( b [ f ] . _ _defineGetter _ _ ) { m . _ _defineGetter _ _ ( a , i ) } } } ( self ) ) } ;
2012-01-24 08:55:21 -05:00
2011-11-02 12:10:58 -04:00
/ * *
* DOM
2012-03-29 11:48:11 -04:00
*
2011-11-02 12:10:58 -04:00
* Dom manipulation module
2011-10-24 12:26:00 -04:00
* /
2013-06-19 10:13:21 -04:00
( function ( undefined ) {
2011-11-01 20:14:38 -04:00
"use strict" ;
2011-11-03 16:04:35 -04:00
var d ;
2012-03-29 11:48:11 -04:00
2011-11-15 12:03:12 -05:00
//Private function for getting/setting attributes/properties
2011-10-24 12:26:00 -04:00
function _attr ( sel , name , value )
{
var oldVal , doAttr ;
//Get the value of the attribute, if it exists
2013-06-19 10:13:21 -04:00
if ( sel . hasAttribute !== undefined )
2011-10-24 12:26:00 -04:00
{
if ( sel . hasAttribute ( name ) )
{
oldVal = sel . getAttribute ( name ) ;
}
doAttr = true ;
}
2013-06-19 10:13:21 -04:00
else if ( sel [ name ] !== undefined )
2011-10-24 12:26:00 -04:00
{
oldVal = sel [ name ] ;
doAttr = false ;
}
2013-06-19 10:13:21 -04:00
else if ( name === "class" && sel . className !== undefined ) //className attribute
2011-10-24 12:26:00 -04:00
{
name = "className" ;
oldVal = sel . className ;
doAttr = false ;
}
//Well, I guess that attribute doesn't exist
2013-06-19 10:13:21 -04:00
if ( oldVal === undefined && ( value === undefined || value === null ) )
2011-10-24 12:26:00 -04:00
{
2012-03-29 11:48:11 -04:00
return null ;
2011-10-24 12:26:00 -04:00
}
//No value to set? Return the current value
2013-06-19 10:13:21 -04:00
if ( value === undefined )
2011-10-24 12:26:00 -04:00
{
return oldVal ;
}
//Determine what to do with the attribute
2013-06-19 10:13:21 -04:00
if ( value !== undefined && value !== null )
2011-10-24 12:26:00 -04:00
{
if ( doAttr === true )
{
sel . setAttribute ( name , value ) ;
}
else
{
sel [ name ] = value ;
2012-03-29 11:48:11 -04:00
}
2011-10-24 12:26:00 -04:00
}
else if ( value === null )
{
if ( doAttr === true )
{
sel . removeAttribute ( name ) ;
}
else
{
delete sel [ name ] ;
2012-03-29 11:48:11 -04:00
}
2011-10-24 12:26:00 -04:00
}
2013-06-19 10:13:21 -04:00
return ( value !== undefined ) ? value : oldVal ;
2011-10-24 12:26:00 -04:00
}
2012-03-29 11:48:11 -04:00
2012-02-23 12:42:33 -05:00
/ * *
* Change css property name to it ' s
* javascript camel case equivalent
* /
2011-10-24 12:26:00 -04:00
function _toCamel ( s )
{
return s . replace ( /(\-[a-z])/g , function ( $1 ) {
return $1 . toUpperCase ( ) . replace ( '-' , '' ) ;
} ) ;
}
function _css ( sel , prop , val )
{
var equi ;
2012-03-29 11:48:11 -04:00
2011-10-24 12:26:00 -04:00
//Camel-case
prop = _toCamel ( prop ) ;
//Equivalent properties for 'special' browsers
equi = {
outerHeight : "offsetHeight" ,
outerWidth : "offsetWidth" ,
top : "posTop"
} ;
2012-03-29 11:48:11 -04:00
2011-10-24 12:26:00 -04:00
//If you don't define a value, try returning the existing value
2013-06-19 10:13:21 -04:00
if ( val === undefined && sel . style [ prop ] !== undefined )
2011-10-24 12:26:00 -04:00
{
return sel . style [ prop ] ;
}
2013-06-19 10:13:21 -04:00
else if ( val === undefined && sel . style [ equi [ prop ] ] !== undefined )
2011-10-24 12:26:00 -04:00
{
return sel . style [ equi [ prop ] ] ;
}
//Let's try the easy way first
2013-06-19 10:13:21 -04:00
if ( sel . style [ prop ] !== undefined )
2011-10-24 12:26:00 -04:00
{
sel . style [ prop ] = val ;
//Short circuit
2012-03-29 11:48:11 -04:00
return null ;
2011-10-24 12:26:00 -04:00
}
else if ( sel . style [ equi [ prop ] ] )
{
sel . style [ equi [ prop ] ] = val ;
2012-03-29 11:48:11 -04:00
return null ;
2011-10-24 12:26:00 -04:00
}
}
2012-03-29 11:48:11 -04:00
2011-10-24 12:26:00 -04:00
// --------------------------------------------------------------------------
2011-11-01 18:56:27 -04:00
/ * *
* DOM
2012-03-29 11:48:11 -04:00
*
2011-11-01 18:56:27 -04:00
* Dom manipulation module
* @ namespace
* @ memberOf $ _
* @ name dom
* /
2011-10-24 12:26:00 -04:00
d = {
2011-11-01 18:56:27 -04:00
/ * *
* Adds a class to the element ( s ) specified by the current
* selector
2012-03-29 11:48:11 -04:00
*
2011-11-01 18:56:27 -04:00
* @ name addClass
* @ memberOf $ _ . dom
* @ function
* @ param string class
* /
2011-10-24 12:26:00 -04:00
addClass : function ( c )
{
$ _ . each ( function ( e ) {
2013-06-19 10:13:21 -04:00
this . classList . add ( c ) ;
2011-10-24 12:26:00 -04:00
} ) ;
} ,
2011-11-01 18:56:27 -04:00
/ * *
* Removes a class from the element ( s ) specified by the current
* selector
2012-03-29 11:48:11 -04:00
*
2011-11-01 18:56:27 -04:00
* @ name removeClass
* @ memberOf $ _ . dom
* @ function
* @ param string class
* /
2011-10-24 12:26:00 -04:00
removeClass : function ( c )
{
$ _ . each ( function ( e ) {
e . classList . remove ( c ) ;
} ) ;
} ,
2011-11-01 18:56:27 -04:00
/ * *
* Hides the element ( s ) specified by the current selector
2012-03-29 11:48:11 -04:00
*
2011-11-01 18:56:27 -04:00
* @ name hide
* @ memberOf $ _ . dom
* @ function
* /
2011-10-24 12:26:00 -04:00
hide : function ( )
{
this . css ( 'display' , 'none' ) ;
} ,
2011-11-01 18:56:27 -04:00
/ * *
2012-03-29 11:48:11 -04:00
* Shows the element ( s ) specified by the current selector .
2011-11-01 18:56:27 -04:00
* if type is specified , the element will have it ' s style
* property set to "display:[your type]" . If type is not
* specified , the element is set to "display:block" .
2012-03-29 11:48:11 -04:00
*
2011-11-01 18:56:27 -04:00
* @ name show
* @ memberOf $ _ . dom
* @ function
* @ param [ string ] type
* /
2011-10-24 12:26:00 -04:00
show : function ( type )
{
2013-06-19 10:13:21 -04:00
if ( type === undefined )
2011-10-24 12:26:00 -04:00
{
type = "block" ;
}
this . css ( "display" , type ) ;
} ,
2011-11-01 18:56:27 -04:00
/ * *
2012-03-29 11:48:11 -04:00
* Sets attributes on element ( s ) specified by the current
* selector , or , if name is not specified , returns the
2011-11-01 18:56:27 -04:00
* value of the attribute of the element specified by the
* current selector .
*
* @ name attr
* @ memberOf $ _ . dom
* @ function
* @ param string name
2011-11-03 16:04:35 -04:00
* @ param [ string ] value
2011-11-01 18:56:27 -04:00
* @ return string
* @ type string
* /
2011-10-24 12:26:00 -04:00
attr : function ( name , value )
{
var sel = this . el ;
//Make sure you don't try to get a bunch of elements
2013-06-19 10:13:21 -04:00
if ( sel . length > 1 && value === undefined )
2011-10-24 12:26:00 -04:00
{
2012-04-26 13:21:47 -04:00
return null ;
2011-10-24 12:26:00 -04:00
}
2013-06-19 10:13:21 -04:00
else if ( sel . length > 1 && value !== undefined ) //You can set a bunch, though
2011-10-24 12:26:00 -04:00
{
$ _ . each ( function ( e ) {
return _attr ( e , name , value ) ;
} ) ;
}
else //Normal behavior
{
return _attr ( sel , name , value ) ;
}
} ,
2011-11-01 18:56:27 -04:00
/ * *
* Sets or retrieves the text content of the element
2012-03-29 11:48:11 -04:00
* specified by the current selector . If a value is
2011-11-01 18:56:27 -04:00
* passed , it will set that value on the current element ,
* otherwise it will return the value of the current element
*
* @ name text
2011-11-02 19:12:58 -04:00
* @ memberOf $ _ . dom
2011-11-01 18:56:27 -04:00
* @ function
* @ param [ string ] value
2011-11-03 16:04:35 -04:00
* @ return string
2011-11-01 18:56:27 -04:00
* @ type string
* /
2011-10-24 12:26:00 -04:00
text : function ( value )
{
2012-10-04 13:25:09 -04:00
var oldValue , set , sel ;
2012-03-29 11:48:11 -04:00
2011-10-24 12:26:00 -04:00
sel = this . el ;
2012-03-29 11:48:11 -04:00
2013-06-19 10:13:21 -04:00
set = ( value !== undefined ) ? true : false ;
2012-03-29 11:48:11 -04:00
2012-10-04 13:25:09 -04:00
oldValue = sel . textContent ;
2012-03-29 11:48:11 -04:00
2011-10-24 12:26:00 -04:00
if ( set )
{
2012-10-04 13:25:09 -04:00
sel . textContent = value ;
2011-10-24 12:26:00 -04:00
return value ;
}
else
{
return oldValue ;
}
} ,
2011-11-01 18:56:27 -04:00
/ * *
* Sets or retrieves a css property of the element
2012-03-29 11:48:11 -04:00
* specified by the current selector . If a value is
2011-11-01 18:56:27 -04:00
* passed , it will set that value on the current element ,
* otherwise it will return the value of the css property
* on the current element
*
* @ name css
2011-11-02 19:12:58 -04:00
* @ memberOf $ _ . dom
2011-11-01 18:56:27 -04:00
* @ function
* @ param string property
* @ param [ string ] value
2011-11-03 16:04:35 -04:00
* @ return string
2011-11-01 18:56:27 -04:00
* @ type string
* /
2011-10-24 12:26:00 -04:00
css : function ( prop , val )
{
//Return the current value if a value is not set
2013-06-19 10:13:21 -04:00
if ( val === undefined )
2011-10-24 12:26:00 -04:00
{
return _css ( this . el , prop ) ;
}
2012-03-29 11:48:11 -04:00
2011-10-24 12:26:00 -04:00
$ _ . each ( function ( e ) {
_css ( e , prop , val ) ;
} ) ;
2011-11-02 19:12:58 -04:00
} ,
2011-11-22 15:23:50 -05:00
/ * *
* Adds to the innerHTML of the current element , after the last child .
2012-03-29 11:48:11 -04:00
*
2011-11-22 15:23:50 -05:00
* @ example $ _ ( "ul" ) . dom . append ( "<li></li>" ) adds an li element to the end of the selected ul element
* @ name append
* @ memberOf $ _ . dom
* @ function
* @ param string htm
* /
append : function ( htm )
{
2013-06-19 10:13:21 -04:00
if ( document . insertAdjacentHTML !== undefined )
2011-11-22 23:28:22 -05:00
{
this . el . insertAdjacentHTML ( 'beforeend' , htm ) ;
}
else
{
this . el . innerHTML += htm ;
}
2011-11-22 15:23:50 -05:00
} ,
/ * *
* Adds to the innerHTML of the selected element , before the current children
2012-03-29 11:48:11 -04:00
*
2011-11-22 15:23:50 -05:00
* @ name prepend
* @ memberOf $ _ . dom
* @ function
* @ param string htm
* /
prepend : function ( htm )
{
2013-06-19 10:13:21 -04:00
if ( document . insertAdjacentHTML !== undefined )
2011-11-22 23:28:22 -05:00
{
this . el . insertAdjacentHTML ( 'afterbegin' , htm ) ;
}
else
{
this . el . innerHTML = htm + this . el . innerHTML ;
}
2011-11-22 15:23:50 -05:00
} ,
2011-11-02 19:12:58 -04:00
/ * *
* Sets or gets the innerHTML propery of the element ( s ) passed
*
* @ name html
* @ memberOf $ _ . dom
* @ function
2011-11-03 16:04:35 -04:00
* @ param [ string ] htm
2011-11-02 19:12:58 -04:00
* @ return string
* @ type string
* /
html : function ( htm )
{
2012-03-29 11:48:11 -04:00
2013-06-19 10:13:21 -04:00
if ( htm !== undefined )
2011-11-02 19:12:58 -04:00
{
this . el . innerHTML = htm ;
}
2012-03-29 11:48:11 -04:00
2011-11-02 19:12:58 -04:00
//If the parameter is undefined, just return the current value
return this . el . innerHTML ;
2011-10-24 12:26:00 -04:00
}
} ;
$ _ . ext ( 'dom' , d ) ;
2012-03-29 11:48:11 -04:00
} ( ) ) ;