2013-10-16 13:53:29 +00:00
! function ( $ ) {
// Convenience vars for accessing elements
2013-10-18 10:31:18 +00:00
var $pageslide = $ ( '#pageslide' ) ,
2013-10-16 13:53:29 +00:00
$body = $ ( '#main-wrap' ) ,
$bottomNav = $ ( '.bottomnav' ) ,
$element ;
2013-10-18 10:31:18 +00:00
if ( $pageslide . length == 0 ) {
var _html = '<div id="pageslide"><div class="page-title clearfix"><a class="pull-right" href="javascript:$.pageslide.close()"><i class="icons-arrow-left-2"/></a><span/></div><div class="view-page"><div class="nano"><div class="content"/></div></div></div>' ;
$pageslide = $ ( _html ) . css ( 'display' , 'none' ) . appendTo ( $body ) ;
} else {
$pageslide . css ( 'display' , 'none' )
}
2013-10-16 13:53:29 +00:00
var _sliding = false , // Mutex to assist closing only once
_lastCaller ; // Used to keep track of last element to trigger pageslide
// $(window).resize(function(event) {
// if($pageslide.is(':visible')) {
// console.log("ddd")
// $pageslide.find('.nano').height($('body').height() - $('#orbit-bar').height() - $pageslide.find('.page-title').outerHeight(true));
// }
// });
2013-10-18 10:31:18 +00:00
function _checkTitle ( settings ) {
if ( settings . pageTitle ) {
$pageslide . find ( '.page-title' ) . show ( ) . children ( 'span' ) . text ( settings . pageTitle ) ;
$pageslide . find ( '.view-page' ) . css ( 'top' , 48 ) ;
} else {
$pageslide . find ( '.page-title' ) . hide ( ) ;
$pageslide . find ( '.view-page' ) . css ( 'top' , 0 ) ;
}
}
2013-10-16 13:53:29 +00:00
function _load ( settings ) {
// Are we loading an element from the page or a URL?
2013-10-18 10:31:18 +00:00
if ( settings . href . indexOf ( "#" ) === 0 ) {
// Load a page element
var _contentHtml = $ ( settings . href ) . html ( ) ;
var dtd = $ . Deferred ( ) ;
function appendHtml ( dtd ) {
$pageslide . find ( '.content' ) . html ( _contentHtml ) ;
if ( $pageslide . find ( '.content' ) . find ( '*' ) . length !== 0 ) {
dtd . resolve ( ) ;
} else {
dtd . reject ( ) ;
}
return dtd ;
}
$ . when ( appendHtml ( dtd ) )
. done ( function ( ) {
setTimeout ( function ( ) {
$pageslide . find ( '.nano' ) . nanoScroller ( { scrollTop : 0 , iOSNativeScrolling : true } ) ;
} , 1 ) ;
if ( settings . loadComplete ) settings . loadComplete . call ( this , $pageslide , $element ) ;
} )
. fail ( function ( ) { } ) ;
2013-10-16 13:53:29 +00:00
} else {
// Load a URL. Into an iframe?
if ( settings . iframe ) {
var iframe = $ ( "<iframe />" ) . attr ( {
src : settings . href ,
frameborder : 0 ,
hspace : 0
} )
. css ( {
width : "100%" ,
height : "100%"
} ) ;
$pageslide . find ( '.content' ) . html ( iframe ) . show ( ) ;
if ( settings . loadComplete ) settings . loadComplete . call ( this , $pageslide , $element ) ;
} else {
$pageslide . find ( '.content' ) . load ( settings . href , function ( response , status , xhr ) {
if ( status == 'success' ) {
$pageslide . show ( ) ;
if ( settings . loadComplete ) settings . loadComplete . call ( this , $pageslide , $element ) ;
$pageslide . find ( '.nano' ) . nanoScroller ( { scrollTop : 0 , iOSNativeScrolling : true } ) ;
} else {
var msg = '<div style="text-align: center;"><i class="icons-warning" style="font-size: 5em;"></i><h4>Oops!</h4>System may be wrong<br/> or please try again later</div>'
$pageslide . find ( '.content' ) . html ( msg ) ;
}
} ) ;
}
2013-10-20 13:16:17 +00:00
if ( $pageslide . find ( '.error-cover' ) . length ) $pageslide . find ( '.error-cover' ) . remove ( ) ;
2013-10-16 13:53:29 +00:00
$pageslide . data ( 'localEl' , false ) ;
}
2013-10-18 10:31:18 +00:00
_checkTitle ( settings ) ;
2013-10-16 13:53:29 +00:00
}
// Function that controls opening of the pageslide
function _start ( settings ) {
var slideWidth = $pageslide . outerWidth ( true ) ,
bodyMove = $sidebarState && ! $ ( '.item-groups' ) . length ? slideWidth - 241 : settings . direction == 'right' ? slideWidth - 61 : slideWidth ,
bodyAnimateIn = { } ,
bottomnavAnimateIn = { } ,
slideAnimateIn = { } ;
// If the slide is open or opening, just ignore the call
if ( $pageslide . is ( ':visible' ) || _sliding ) return ;
_sliding = true ;
switch ( settings . direction ) {
case 'left' :
$pageslide . css ( { left : 'auto' , right : '-' + slideWidth + 'px' } ) ;
bodyAnimateIn [ 'padding-right' ] = '+=' + bodyMove ;
slideAnimateIn [ 'right' ] = '+=' + slideWidth ;
break ;
default :
$pageslide . css ( { left : '-' + slideWidth + 'px' , right : 'auto' } ) ;
bodyAnimateIn [ 'margin-left' ] = '+=' + bodyMove ;
bottomnavAnimateIn [ 'left' ] = '+=' + bodyMove ;
if ( $ ( window ) . width ( ) <= 1440 && slideWidth > 963 ) {
bodyAnimateIn [ 'width' ] = $body . width ( ) ;
}
slideAnimateIn [ 'left' ] = '+=' + slideWidth ;
break ;
}
// Animate the slide, and attach this slide's settings to the element
$body . animate ( bodyAnimateIn , settings . speed ) ;
$bottomNav . animate ( bottomnavAnimateIn , settings . speed ) ;
$pageslide . show ( ) . animate ( slideAnimateIn , settings . speed , function ( ) {
_sliding = false ;
if ( typeof settings . openFn === "function" ) {
settings . openFn . call ( this , $pageslide , $element ) ;
} ;
} ) ;
}
$ . fn . pageslide = function ( options ) {
var $elements = this ;
// On click
$elements . click ( function ( e ) {
var $self = $ ( this ) ,
settings = $ . extend ( { href : $self . attr ( 'href' ) , pageTitle : $self . data ( 'title' ) } , options ) ;
$element = $self ;
// Prevent the default behavior and stop propagation
e . preventDefault ( ) ;
e . stopPropagation ( ) ;
if ( $pageslide . is ( ':visible' ) && $self [ 0 ] == _lastCaller ) {
// If we clicked the same element twice, toggle closed
$ . pageslide . close ( ) ;
} else {
// Open
$ . pageslide ( settings ) ;
// Record the last element to trigger pageslide
_lastCaller = $self [ 0 ] ;
}
} ) ;
} ;
/ *
* Default settings
* /
$ . fn . pageslide . defaults = {
speed : 300 , // Accepts standard jQuery effects speeds (i.e. fast, normal or milliseconds)
direction : 'right' , // Accepts 'left' or 'right'
modal : false , // If set to true, you must explicitly close pageslide using $.pageslide.close();
iframe : false , // By default, linked pages are loaded into an iframe. Set this to false if you don't want an iframe.
href : null , // Override the source of the content. Optional in most cases, but required when opening pageslide programmatically.
W : 264 ,
closeFn : null ,
openFn : null ,
loadComplete : null ,
pageTitle : '' ,
} ;
/ *
* Public methods
* /
// Open the pageslide
$ . pageslide = function ( options ) {
// Extend the settings with those the user has provided
var settings = $ . extend ( { } , $ . fn . pageslide . defaults , options ) ,
pageCss = { } ,
convertToFunction = function ( fn ) {
var x = new Function ( ) ;
x = fn ;
return x ;
} ;
pageCss [ 'width' ] = settings . W ;
pageCss [ 'margin-left' ] = $sidebarState && ! $ ( '.item-groups' ) . length ? 241 : settings . direction == 'right' ? 61 : 0 ;
// Change Object to Function
if ( settings . openFn ) {
$ . fn . pageslide . defaults . openFn = convertToFunction ( settings . openFn ) ;
} ;
if ( settings . closeFn ) {
$ . fn . pageslide . defaults . closeFn = convertToFunction ( settings . closeFn ) ;
} ;
if ( settings . loadComplete ) {
$ . fn . pageslide . defaults . loadComplete = convertToFunction ( settings . loadComplete ) ;
} ;
// Are we trying to open in different direction?
if ( ( $pageslide . is ( ':visible' ) && $pageslide . data ( 'W' ) != settings . W ) || ( $pageslide . is ( ':visible' ) && $pageslide . data ( 'direction' ) != settings . direction ) ) {
$ . pageslide . close ( function ( ) {
$pageslide . css ( pageCss ) ;
2013-10-18 10:31:18 +00:00
_checkTitle ( settings )
2013-10-16 13:53:29 +00:00
_load ( settings ) ;
_start ( settings ) ;
} ) ;
2013-10-18 10:31:18 +00:00
} else {
_checkTitle ( settings )
2013-10-16 13:53:29 +00:00
_load ( settings ) ;
if ( $pageslide . is ( ':hidden' ) ) {
$pageslide . css ( pageCss ) ;
_start ( settings ) ;
}
}
$pageslide . data ( settings ) ;
}
// Close the pageslide
$ . pageslide . close = function ( callback ) {
var $pageslide = $ ( '#pageslide' ) ,
slideWidth = $pageslide . outerWidth ( true ) ,
bodyMove = $sidebarState && ! $ ( '.item-groups' ) . length ? slideWidth - 241 : $ . fn . pageslide . defaults . direction == 'right' ? slideWidth - 61 : slideWidth
speed = $pageslide . data ( 'speed' ) ,
bodyAnimateIn = { } ,
bottomnavAnimateIn = { } ,
2013-10-18 10:31:18 +00:00
slideAnimateIn = { } ;
2013-10-16 13:53:29 +00:00
// If the slide isn't open, just ignore the call
if ( $pageslide . is ( ':hidden' ) || _sliding ) return ;
_sliding = true ;
switch ( $pageslide . data ( 'direction' ) ) {
case 'left' :
bodyAnimateIn [ 'padding-right' ] = '-=' + bodyMove ;
slideAnimateIn [ 'right' ] = '-=' + slideWidth ;
break ;
default :
bodyAnimateIn [ 'margin-left' ] = '-=' + bodyMove ;
bottomnavAnimateIn [ 'left' ] = '-=' + bodyMove ;
slideAnimateIn [ 'left' ] = '-=' + slideWidth ;
break ;
}
$pageslide . animate ( slideAnimateIn , speed ) ;
$bottomNav . animate ( bottomnavAnimateIn , speed ) ;
$body . animate ( bodyAnimateIn , speed , function ( ) {
2013-10-18 10:31:18 +00:00
if ( $pageslide . data ( 'href' ) == '#' ) {
$pageslide . attr ( 'style' , '' )
. hide ( )
. find ( '.content' )
. attr ( 'style' , '' )
. end ( )
. find ( '.view-page' )
. attr ( 'style' , '' )
. end ( )
. find ( '.pane' )
. remove ( )
. end ( )
. find ( '.page-title' )
. attr ( 'style' , '' )
. children ( 'span' ) ;
} else {
$pageslide . attr ( 'style' , '' )
. hide ( )
. find ( '.content' )
. attr ( 'style' , '' )
. empty ( )
. end ( )
. find ( '.view-page' )
. attr ( 'style' , '' )
. end ( )
. find ( '.pane' )
. remove ( )
. end ( )
. find ( '.page-title' )
. attr ( 'style' , '' )
. children ( 'span' )
. empty ( ) ;
}
2013-10-16 13:53:29 +00:00
_sliding = false ;
2013-10-20 13:16:17 +00:00
if ( $pageslide . find ( '.error-cover' ) . length ) $pageslide . find ( '.error-cover' ) . remove ( ) ;
2013-10-16 13:53:29 +00:00
if ( typeof callback != 'undefined' ) callback ( ) ;
if ( typeof $ . fn . pageslide . defaults . closeFn === "function" ) {
$ . fn . pageslide . defaults . closeFn . call ( this , $pageslide , $element ) ;
} ;
} ) ;
}
// Close Callback
$ . pageslide . closeCallback = function ( callback ) {
if ( typeof callback === "function" ) {
$ . fn . pageslide . defaults . closeFn = callback ;
} ;
} ;
// Open Callback
$ . pageslide . openCallback = function ( callback ) {
if ( typeof callback === "function" ) {
$ . fn . pageslide . defaults . openFn = callback ;
} ;
} ;
//data load complete callback
$ . pageslide . loadComplete = function ( callback ) {
if ( typeof callback === "function" ) {
$ . fn . pageslide . defaults . loadComplete = callback ;
} ;
} ;
/* Events */
// Don't let clicks to the pageslide close the window
$pageslide . click ( function ( e ) {
e . stopPropagation ( ) ;
} ) ;
// Close the pageslide if the document is clicked or the users presses the ESC key, unless the pageslide is modal
$ ( document ) . bind ( 'click keyup' , function ( e ) {
// If this is a keyup event, let's see if it's an ESC key
if ( e . type == "keyup" && e . keyCode != 27 ) return ;
// Make sure it's visible, and we're not modal
if ( $pageslide . is ( ':visible' ) && ! $pageslide . data ( 'modal' ) ) {
$ . pageslide . close ( ) ;
}
} ) ;
2013-10-20 22:34:55 +00:00
} ( window . jQuery ) ;
function setForm ( data ) {
$ . each ( data , function ( key , value ) {
switch ( $ ( "#pageslide form #" + key ) . prop ( "tagName" ) )
{
case "INPUT" :
$ ( "#pageslide form #" + key ) . val ( value ) ;
break ;
case "SELECT" :
$ ( "#pageslide form #" + key ) . val ( value ) ;
break ;
}
} ) ;
}
function resetForm ( ) {
$ ( "#pageslide form" ) . find ( "input[type=text], input[type=number], textarea" )
. val ( "" )
. end ( )
. find ( "select" )
. prop ( 'selectedIndex' , 0 )
. end ( )
. find ( "input[type=checkbox]" )
. prop ( 'checked' , false )
. end ( )
. find ( "input[type=radio]" )
. prop ( 'checked' , false ) ;
}