2011-12-12 11:47:20 -05:00
/ * *
Kis JS Keep It Simple JS Library
Copyright Timothy J . Warren
License Public Domain
2013-06-19 10:13:21 -04:00
Version 0.8 . 0
2011-12-12 11:47:20 -05:00
* /
2013-06-19 10:13:21 -04:00
( function ( undefined ) {
2011-12-12 11:47:20 -05:00
"use strict" ;
// Most functions rely on a string selector
// which returns html elements. This requires
// document.querySelectorAll or a custom
// selector engine. I choose to just use the
// browser feature, since it is present in
// IE 8+, and all other major browsers
2013-06-19 10:13:21 -04:00
if ( document . querySelector === undefined )
2011-12-12 11:47:20 -05:00
{
return ;
}
var $ _ , $ , dcopy , sel ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
/ * *
* $ _
*
* Constructor function
*
* @ constuctor
* @ namespace
* @ param string selector
* @ return object
* /
$ _ = function ( s )
{
2012-10-04 13:25:09 -04:00
// Have documentElement be default selector, just in case
2013-06-19 10:13:21 -04:00
if ( s === undefined )
2011-12-12 11:47:20 -05:00
{
2012-10-04 13:25:09 -04:00
// Defines a "global" selector for that instance
2013-06-19 10:13:21 -04:00
sel = ( $ _ . el !== undefined )
2011-12-12 11:47:20 -05:00
? $ _ . el
: document . documentElement ;
}
else
{
2012-10-04 13:25:09 -04:00
sel = $ ( s ) ;
2011-12-12 11:47:20 -05:00
}
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
// Add the selector to the prototype
$ _ . prototype . el = sel ;
2012-04-06 10:40:53 -04:00
// Use the $_ object as it's own prototype
2011-12-12 11:47:20 -05:00
var self = dcopy ( $ _ ) ;
// Give sel to each extension.
2012-03-29 12:05:11 -04:00
for ( var i in self )
2011-12-12 11:47:20 -05:00
{
if ( typeof self [ i ] === "object" )
{
self [ i ] . el = sel ;
2012-03-29 12:05:11 -04:00
}
2011-12-12 11:47:20 -05:00
}
self . el = sel ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
return self ;
} ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
/ * *
* Simple DOM selector function
*
* @ memberOf $ _
* @ param string selector
* @ param object context
* @ return object
* @ type object
* /
$ = function ( a , context )
{
var x , c ;
2012-03-29 12:05:11 -04:00
2013-06-19 10:13:21 -04:00
if ( typeof a != "string" || a === undefined ) { return a ; }
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
//Check for a context of a specific element, otherwise, just run on the document
2012-03-29 12:05:11 -04:00
c = ( context != null && context . nodeType === 1 )
? context
2011-12-12 11:47:20 -05:00
: document ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
//Pick the quickest method for each kind of selector
if ( a . match ( /^#([\w\-]+$)/ ) )
{
return document . getElementById ( a . split ( '#' ) [ 1 ] ) ;
}
else
{
x = c . querySelectorAll ( a ) ;
}
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
//Return the single object if applicable
return ( x . length === 1 ) ? x [ 0 ] : x ;
} ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
/ * *
* Deep copy / prototypical constructor function
*
* @ param object obj
* @ private
* @ return object
* @ type object
* /
dcopy = function ( obj )
{
var type , F ;
2012-03-29 12:05:11 -04:00
2013-06-19 10:13:21 -04:00
if ( obj === undefined )
2011-12-12 11:47:20 -05:00
{
return ;
}
2012-03-29 12:05:11 -04:00
2013-06-19 10:13:21 -04:00
if ( Object . create !== undefined )
2011-12-12 11:47:20 -05:00
{
return Object . create ( obj ) ;
}
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
type = typeof obj ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
if ( type !== "object" && type !== "function" )
{
return ;
}
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
/ * *
* @ private
* /
F = function ( ) { } ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
F . prototype = obj ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
return new F ( ) ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
} ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
/ * *
* Adds the property ` obj ` to the $ _ object , calling it ` name `
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -05:00
* @ param string name
* @ param object obj
* /
$ _ . ext = function ( name , obj )
{
obj . el = sel ;
$ _ [ name ] = obj ;
} ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
/ * *
* Iterates over a $ _ object , applying a callback to each item
*
* @ name $ _ . each
* @ function
* @ param function callback
* /
$ _ . ext ( 'each' , function ( callback )
{
2013-06-19 10:13:21 -04:00
if ( sel . length !== undefined && sel !== window )
2011-12-12 11:47:20 -05:00
{
2012-04-05 16:32:05 -04:00
// Use the native method, if it exists
2013-06-19 10:13:21 -04:00
if ( Array . prototype . forEach !== undefined )
2012-04-05 16:32:05 -04:00
{
[ ] . forEach . call ( sel , callback ) ;
return ;
}
2012-10-04 13:25:09 -04:00
2012-04-05 16:32:05 -04:00
// Otherwise, fall back to a for loop
2011-12-12 11:47:20 -05:00
var len = sel . length ;
if ( len === 0 )
{
return ;
}
var selx ;
for ( var x = 0 ; x < len ; x ++ )
{
selx = ( sel . item ( x ) ) ? sel . item ( x ) : sel [ x ] ;
callback . call ( selx , selx ) ;
}
}
else
{
callback . call ( sel , sel ) ;
}
} ) ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
/ * *
* Retrieves the type of the passed variable
*
* @ param mixed obj
* @ return string
* @ type string
* /
2012-03-29 12:05:11 -04:00
$ _ . type = function ( obj )
{
2011-12-12 11:47:20 -05:00
if ( ( function ( ) { return obj && ( obj !== this ) } ) . call ( obj ) )
{
//fallback on 'typeof' for truthy primitive values
return ( typeof obj ) . toLowerCase ( ) ;
}
2012-03-29 12:05:11 -04:00
//Strip x from [object x] and return
2011-12-12 11:47:20 -05:00
return ( { } ) . toString . call ( obj ) . match ( /\s([a-z|A-Z]+)/ ) [ 1 ] . toLowerCase ( ) ;
} ;
//Set global variables
$ _ = window . $ _ = window . $ _ || $ _ ;
$ _ . $ = $ ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
} ( ) ) ;
// --------------------------------------------------------------------------
/ * *
* A module of various browser polyfills
* @ file polyfill . js
* /
2012-04-05 18:39:10 -04:00
/ * *
* String trim function polyfill
* /
if ( typeof String . prototype . trim === "undefined" )
{
2011-12-12 11:47:20 -05:00
/ * *
2012-04-05 18:39:10 -04:00
* @ private
2011-12-12 11:47:20 -05:00
* /
2012-04-05 18:39:10 -04:00
String . prototype . trim = function ( )
2011-12-12 11:47:20 -05:00
{
2012-04-05 18:39:10 -04:00
return this . replace ( /^[\s\uFEFF]+|[\s\uFEFF]+$/g , "" ) ;
} ;
}
2012-01-24 08:55:21 -05:00
2012-04-05 18:39:10 -04:00
// --------------------------------------------------------------------------
2012-03-29 12:05:11 -04:00
2012-04-05 18:39:10 -04:00
/ * *
* Array . isArray polyfill
* /
if ( typeof Array . isArray === "undefined" )
{
Array . isArray = function ( v )
{
return Object . prototype . toString . apply ( v ) === '[object Array]' ;
}
}
2011-12-12 11:47:20 -05:00
// --------------------------------------------------------------------------
/ * *
* Ajax
*
* Module for making ajax requests
* /
2013-06-19 10:13:21 -04:00
( function ( undefined ) {
2011-12-12 11:47:20 -05:00
"use strict" ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
// Don't bother even defining the object if the XMLHttpRequest isn't available
2013-06-19 10:13:21 -04:00
if ( window . XMLHttpRequest === undefined )
2011-12-12 11:47:20 -05:00
{
return ;
}
var ajax = {
2012-04-19 08:16:04 -04:00
_do : function ( url , data , success _callback , error _callback , isPost )
2011-12-12 11:47:20 -05:00
{
2012-03-29 12:05:11 -04:00
var type ,
2011-12-12 11:47:20 -05:00
request = new XMLHttpRequest ( ) ;
2012-03-29 12:05:11 -04:00
2013-06-19 10:13:21 -04:00
if ( success _callback === undefined )
2011-12-12 11:47:20 -05:00
{
/ * *
* @ private
* /
2012-04-19 08:16:04 -04:00
success _callback = function ( ) { } ;
2011-12-12 11:47:20 -05:00
}
type = ( isPost ) ? "POST" : "GET" ;
2012-11-16 14:02:25 -05:00
2012-11-15 13:42:14 -05:00
if ( type === "GET" )
{
2012-11-16 14:02:25 -05:00
url += ( url . match ( /\?/ ) )
? this . _serialize ( data )
: "?" + this . _serialize ( data ) ;
2012-11-15 13:42:14 -05:00
}
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
request . open ( type , url ) ;
request . onreadystatechange = function ( )
{
if ( request . readyState === 4 )
{
2012-04-19 08:16:04 -04:00
if ( request . status === 200 )
{
success _callback . call ( request . responseText , request . responseText ) ;
}
else
{
2013-06-19 10:13:21 -04:00
if ( error _callback !== undefined )
2012-04-19 08:16:04 -04:00
{
error _callback . call ( request . status , request . status ) ;
}
}
2012-10-04 13:25:09 -04:00
2011-12-12 11:47:20 -05:00
}
} ;
if ( type === "POST" )
{
request . setRequestHeader ( "Content-Type" , "application/x-www-form-urlencoded" ) ;
request . send ( this . _serialize ( data ) ) ;
}
else
{
request . send ( null ) ;
}
} ,
_serialize : function ( data )
{
var name ,
value ,
pairs = [ ] ;
for ( name in data )
{
if ( ! data . hasOwnProperty ( name ) )
{
continue ;
}
if ( typeof data [ name ] === "function" )
{
continue ;
}
value = data [ name ] . toString ( ) ;
name = encodeURIComponent ( name ) ;
value = encodeURIComponent ( value ) ;
pairs . push ( name + "=" + value ) ;
}
return pairs . join ( "&" ) ;
}
} ;
/ * *
* Sends a GET type ajax request
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -05:00
* @ name get
* @ function
* @ memberOf $ _
* @ param string url
* @ param object data
2012-04-19 08:16:04 -04:00
* @ param function success _callback
* @ param function error _callback
2011-12-12 11:47:20 -05:00
* /
2012-04-19 08:16:04 -04:00
$ _ . ext ( 'get' , function ( url , data , success _callback , error _callback ) {
ajax . _do ( url , data , success _callback , error _callback , false ) ;
2011-12-12 11:47:20 -05:00
} ) ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
/ * *
* Sends a POST type ajax request
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -05:00
* @ name post
* @ function
* @ memberOf $ _
* @ param string url
* @ param object data
2012-04-19 08:16:04 -04:00
* @ param function success _callback
* @ param function error _callback
2011-12-12 11:47:20 -05:00
* /
2012-04-19 08:16:04 -04:00
$ _ . ext ( 'post' , function ( url , data , success _callback , error _callback ) {
ajax . _do ( url , data , success _callback , error _callback , true ) ;
2011-12-12 11:47:20 -05:00
} ) ;
2012-10-04 13:25:09 -04:00
2012-04-03 14:39:26 -04:00
/ * *
2012-04-12 13:12:11 -04:00
* Watches for server - sent events and applies a callback on message
2012-04-03 14:39:26 -04:00
*
* @ name sse
* @ function
* @ memberOf $ _
* @ param string url
* @ param function callback
* /
2012-10-04 13:25:09 -04:00
$ _ . ext ( 'sse' , function ( url , callback ) {
2012-04-03 14:39:26 -04:00
var source ;
2012-10-04 13:25:09 -04:00
2012-04-12 13:12:11 -04:00
// Check for server-sent event support
2013-06-19 10:13:21 -04:00
if ( EventSource !== undefined )
2012-04-03 14:39:26 -04:00
{
source = new EventSource ( url ) ;
2012-10-04 13:25:09 -04:00
2012-04-03 14:39:26 -04:00
// Apply the callback
2012-04-03 16:39:20 -04:00
source . onmessage = function ( event ) {
2012-10-04 13:25:09 -04:00
callback . call ( event . data , event . data ) ;
2012-04-03 16:39:20 -04:00
} ;
2012-04-03 14:39:26 -04:00
}
} ) ;
2012-10-04 13:25:09 -04:00
2011-12-12 11:47:20 -05:00
} ( ) ) ;
// --------------------------------------------------------------------------
/ * *
* Event
*
* Event api wrapper
2012-03-29 12:05:11 -04:00
* @ todo Add method for triggering events
2011-12-12 11:47:20 -05:00
* /
2013-06-19 10:13:21 -04:00
( function ( undefined ) {
2011-12-12 11:47:20 -05:00
"use strict" ;
2012-10-04 13:25:09 -04:00
var _add _remove , e , _attach _delegate ;
2011-12-12 11:47:20 -05:00
2012-10-04 13:25:09 -04:00
// Don't bother defining the methods if event api isn't supports
2013-06-19 10:13:21 -04:00
if ( document . addEventListener === undefined )
2011-12-12 11:47:20 -05:00
{
2012-10-04 13:25:09 -04:00
return false ;
2011-12-12 11:47:20 -05:00
}
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
_add _remove = function ( sel , event , callback , add )
{
var i , len ;
2012-03-29 12:05:11 -04:00
2013-06-19 10:13:21 -04:00
if ( sel === undefined )
2011-12-12 11:47:20 -05:00
{
2012-04-26 13:21:47 -04:00
return null ;
2011-12-12 11:47:20 -05:00
}
// Multiple events? Run recursively!
2012-02-23 12:42:33 -05:00
if ( ! event . match ( /^([\w\-]+)$/ ) )
2011-12-12 11:47:20 -05:00
{
event = event . split ( " " ) ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
len = event . length ;
for ( i = 0 ; i < len ; i ++ )
{
_add _remove ( sel , event [ i ] , callback , add ) ;
}
return ;
}
2012-10-04 13:25:09 -04:00
// Bind the event
( add === true )
? sel . addEventListener ( event , callback , false )
: sel . removeEventListener ( event , callback , false ) ;
2011-12-12 11:47:20 -05:00
} ;
_attach _delegate = function ( sel , target , event , callback )
{
// attach the listener to the parent object
_add _remove ( sel , event , function ( e ) {
2012-03-29 12:05:11 -04:00
2012-10-04 13:25:09 -04:00
var elem , t ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
// Get the live version of the target selector
2012-02-23 12:42:33 -05:00
t = $ _ . $ ( target , sel ) ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
// Check each element to see if it matches the target
for ( elem in t )
{
// Fire target callback when event bubbles from target
2012-10-04 13:25:09 -04:00
if ( e . target == t [ elem ] )
2011-12-12 11:47:20 -05:00
{
// Trigger the event callback
callback . call ( t [ elem ] , e ) ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
// Stop event propegation
e . stopPropagation ( ) ;
}
}
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
} , true ) ;
} ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
// --------------------------------------------------------------------------
/ * *
* Event Listener module
*
* @ namespace
* @ name event
* @ memberOf $ _
* /
e = {
/ * *
* Adds an event that returns a callback when triggered on the selected
* event and selector
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -05:00
* @ memberOf $ _ . event
* @ name add
* @ function
* @ example Eg . $ _ ( "#selector" ) . event . add ( "click" , do _something ( ) ) ;
* @ param string event
* @ param function callback
* /
add : function ( event , callback )
{
$ _ . each ( function ( e ) {
_add _remove ( e , event , callback , true ) ;
} ) ;
} ,
/ * *
* Removes an event bound the the specified selector , event type , and callback
*
* @ memberOf $ _ . event
* @ name remove
* @ function
* @ example Eg . $ _ ( "#selector" ) . event . remove ( "click" , do _something ( ) ) ;
* @ param string event
* @ param string callback
* /
remove : function ( event , callback )
{
$ _ . each ( function ( e ) {
_add _remove ( e , event , callback , false ) ;
} ) ;
} ,
2012-03-29 12:05:11 -04:00
/ * *
2011-12-12 11:47:20 -05:00
* Binds a persistent event to the document
*
* @ memberOf $ _ . event
* @ name live
* @ function
* @ example Eg . $ _ . event . live ( ".button" , "click" , do _something ( ) ) ;
* @ param string target
* @ param string event
* @ param function callback
* /
live : function ( target , event , callback )
{
_attach _delegate ( document . documentElement , target , event , callback ) ;
} ,
2012-03-29 12:05:11 -04:00
/ * *
2011-12-12 11:47:20 -05:00
* Binds an event to a parent object
*
* @ memberOf $ _ . event
* @ name delegate
* @ function
* @ example Eg . $ _ ( "#parent" ) . delegate ( ".button" , "click" , do _something ( ) ) ;
* @ param string target
* @ param string event _type
* @ param function callback
* /
delegate : function ( target , event , callback )
{
$ _ . each ( function ( e ) {
_attach _delegate ( e , target , event , callback ) ;
} ) ;
}
} ;
$ _ . ext ( 'event' , e ) ;
} ( ) ) ;
// --------------------------------------------------------------------------
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-12-12 11:47:20 -05:00
/ * *
* DOM
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -05:00
* Dom manipulation module
* /
2013-06-19 10:13:21 -04:00
( function ( undefined ) {
2011-12-12 11:47:20 -05:00
"use strict" ;
var d ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
//Private function for getting/setting attributes/properties
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-12-12 11:47:20 -05: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-12-12 11:47:20 -05:00
{
oldVal = sel [ name ] ;
doAttr = false ;
}
2013-06-19 10:13:21 -04:00
else if ( name === "class" && sel . className !== undefined ) //className attribute
2011-12-12 11:47:20 -05: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-12-12 11:47:20 -05:00
{
2012-03-29 12:05:11 -04:00
return null ;
2011-12-12 11:47:20 -05:00
}
//No value to set? Return the current value
2013-06-19 10:13:21 -04:00
if ( value === undefined )
2011-12-12 11:47:20 -05:00
{
return oldVal ;
}
//Determine what to do with the attribute
2013-06-19 10:13:21 -04:00
if ( value !== undefined && value !== null )
2011-12-12 11:47:20 -05:00
{
if ( doAttr === true )
{
sel . setAttribute ( name , value ) ;
}
else
{
sel [ name ] = value ;
2012-03-29 12:05:11 -04:00
}
2011-12-12 11:47:20 -05:00
}
else if ( value === null )
{
if ( doAttr === true )
{
sel . removeAttribute ( name ) ;
}
else
{
delete sel [ name ] ;
2012-03-29 12:05:11 -04:00
}
2011-12-12 11:47:20 -05:00
}
2013-06-19 10:13:21 -04:00
return ( value !== undefined ) ? value : oldVal ;
2011-12-12 11:47:20 -05:00
}
2012-03-29 12:05:11 -04:00
2012-02-23 12:42:33 -05:00
/ * *
* Change css property name to it ' s
* javascript camel case equivalent
* /
2011-12-12 11:47:20 -05: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 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
//Camel-case
prop = _toCamel ( prop ) ;
//Equivalent properties for 'special' browsers
equi = {
outerHeight : "offsetHeight" ,
outerWidth : "offsetWidth" ,
top : "posTop"
} ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05: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-12-12 11:47:20 -05:00
{
return sel . style [ prop ] ;
}
2013-06-19 10:13:21 -04:00
else if ( val === undefined && sel . style [ equi [ prop ] ] !== undefined )
2011-12-12 11:47:20 -05: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-12-12 11:47:20 -05:00
{
sel . style [ prop ] = val ;
//Short circuit
2012-03-29 12:05:11 -04:00
return null ;
2011-12-12 11:47:20 -05:00
}
else if ( sel . style [ equi [ prop ] ] )
{
sel . style [ equi [ prop ] ] = val ;
2012-03-29 12:05:11 -04:00
return null ;
2011-12-12 11:47:20 -05:00
}
}
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
// --------------------------------------------------------------------------
/ * *
* DOM
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -05:00
* Dom manipulation module
* @ namespace
* @ memberOf $ _
* @ name dom
* /
d = {
/ * *
* Adds a class to the element ( s ) specified by the current
* selector
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -05:00
* @ name addClass
* @ memberOf $ _ . dom
* @ function
* @ param string class
* /
addClass : function ( c )
{
$ _ . each ( function ( e ) {
2013-06-19 10:13:21 -04:00
this . classList . add ( c ) ;
2011-12-12 11:47:20 -05:00
} ) ;
} ,
/ * *
* Removes a class from the element ( s ) specified by the current
* selector
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -05:00
* @ name removeClass
* @ memberOf $ _ . dom
* @ function
* @ param string class
* /
removeClass : function ( c )
{
$ _ . each ( function ( e ) {
e . classList . remove ( c ) ;
} ) ;
} ,
/ * *
* Hides the element ( s ) specified by the current selector
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -05:00
* @ name hide
* @ memberOf $ _ . dom
* @ function
* /
hide : function ( )
{
this . css ( 'display' , 'none' ) ;
} ,
/ * *
2012-03-29 12:05:11 -04:00
* Shows the element ( s ) specified by the current selector .
2011-12-12 11:47:20 -05: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 12:05:11 -04:00
*
2011-12-12 11:47:20 -05:00
* @ name show
* @ memberOf $ _ . dom
* @ function
* @ param [ string ] type
* /
show : function ( type )
{
2013-06-19 10:13:21 -04:00
if ( type === undefined )
2011-12-12 11:47:20 -05:00
{
type = "block" ;
}
this . css ( "display" , type ) ;
} ,
/ * *
2012-03-29 12:05:11 -04:00
* Sets attributes on element ( s ) specified by the current
* selector , or , if name is not specified , returns the
2011-12-12 11:47:20 -05:00
* value of the attribute of the element specified by the
* current selector .
*
* @ name attr
* @ memberOf $ _ . dom
* @ function
* @ param string name
* @ param [ string ] value
* @ return string
* @ type string
* /
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-12-12 11:47:20 -05:00
{
2012-04-26 13:21:47 -04:00
return null ;
2011-12-12 11:47:20 -05:00
}
2013-06-19 10:13:21 -04:00
else if ( sel . length > 1 && value !== undefined ) //You can set a bunch, though
2011-12-12 11:47:20 -05:00
{
$ _ . each ( function ( e ) {
return _attr ( e , name , value ) ;
} ) ;
}
else //Normal behavior
{
return _attr ( sel , name , value ) ;
}
} ,
/ * *
* Sets or retrieves the text content of the element
2012-03-29 12:05:11 -04:00
* specified by the current selector . If a value is
2011-12-12 11:47:20 -05:00
* passed , it will set that value on the current element ,
* otherwise it will return the value of the current element
*
* @ name text
* @ memberOf $ _ . dom
* @ function
* @ param [ string ] value
* @ return string
* @ type string
* /
text : function ( value )
{
2012-10-04 13:25:09 -04:00
var oldValue , set , sel ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
sel = this . el ;
2012-03-29 12:05:11 -04:00
2013-06-19 10:13:21 -04:00
set = ( value !== undefined ) ? true : false ;
2012-03-29 12:05:11 -04:00
2012-10-04 13:25:09 -04:00
oldValue = sel . textContent ;
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
if ( set )
{
2012-10-04 13:25:09 -04:00
sel . textContent = value ;
2011-12-12 11:47:20 -05:00
return value ;
}
else
{
return oldValue ;
}
} ,
/ * *
* Sets or retrieves a css property of the element
2012-03-29 12:05:11 -04:00
* specified by the current selector . If a value is
2011-12-12 11:47:20 -05: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
* @ memberOf $ _ . dom
* @ function
* @ param string property
* @ param [ string ] value
* @ return string
* @ type string
* /
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-12-12 11:47:20 -05:00
{
return _css ( this . el , prop ) ;
}
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
$ _ . each ( function ( e ) {
_css ( e , prop , val ) ;
} ) ;
} ,
/ * *
* Adds to the innerHTML of the current element , after the last child .
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -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-12-12 11:47:20 -05:00
{
this . el . insertAdjacentHTML ( 'beforeend' , htm ) ;
}
else
{
this . el . innerHTML += htm ;
}
} ,
/ * *
* Adds to the innerHTML of the selected element , before the current children
2012-03-29 12:05:11 -04:00
*
2011-12-12 11:47:20 -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-12-12 11:47:20 -05:00
{
this . el . insertAdjacentHTML ( 'afterbegin' , htm ) ;
}
else
{
this . el . innerHTML = htm + this . el . innerHTML ;
}
} ,
/ * *
* Sets or gets the innerHTML propery of the element ( s ) passed
*
* @ name html
* @ memberOf $ _ . dom
* @ function
* @ param [ string ] htm
* @ return string
* @ type string
* /
html : function ( htm )
{
2012-03-29 12:05:11 -04:00
2013-06-19 10:13:21 -04:00
if ( htm !== undefined )
2011-12-12 11:47:20 -05:00
{
this . el . innerHTML = htm ;
}
2012-03-29 12:05:11 -04:00
2011-12-12 11:47:20 -05:00
//If the parameter is undefined, just return the current value
return this . el . innerHTML ;
}
} ;
$ _ . ext ( 'dom' , d ) ;
2012-03-29 12:05:11 -04:00
} ( ) ) ;