2009-05-29 16:51:21 +00:00
2013-07-11 01:24:36 +00:00
/ * * A d d o r r e m o v e C S S c l a s s
* @ param HTMLElement
* @ param string
* @ param [ bool ]
* /
function alterClass ( el , className , enable ) {
2014-03-15 17:58:24 +00:00
if ( el ) {
el . className = el . className . replace ( RegExp ( '(^|\\s)' + className + '(\\s|$)' ) , '$2' ) + ( enable ? ' ' + className : '' ) ;
}
2013-07-11 01:24:36 +00:00
}
2009-12-17 14:53:26 +00:00
/ * * T o g g l e v i s i b i l i t y
* @ param string
* @ return boolean
* /
2009-05-29 16:14:54 +00:00
function toggle ( id ) {
var el = document . getElementById ( id ) ;
el . className = ( el . className == 'hidden' ? '' : 'hidden' ) ;
return true ;
2009-06-03 18:32:23 +00:00
}
2010-03-05 16:22:54 +00:00
/ * * S e t p e r m a n e n t c o o k i e
* @ param string
* @ param number
* @ param string optional
* /
2011-02-08 19:58:31 +00:00
function cookie ( assign , days ) {
2010-03-05 16:22:54 +00:00
var date = new Date ( ) ;
date . setDate ( date . getDate ( ) + days ) ;
2011-02-08 19:58:31 +00:00
document . cookie = assign + '; expires=' + date ;
2010-03-05 16:22:54 +00:00
}
2009-12-17 14:53:26 +00:00
/ * * V e r i f y c u r r e n t A d m i n e r v e r s i o n
2013-12-19 17:29:16 +00:00
* @ param string
2009-12-17 14:53:26 +00:00
* /
2013-12-19 17:29:16 +00:00
function verifyVersion ( current ) {
2010-03-05 16:22:54 +00:00
cookie ( 'adminer_version=0' , 1 ) ;
2013-12-19 17:29:16 +00:00
var iframe = document . createElement ( 'iframe' ) ;
iframe . src = location . protocol + '//www.adminer.org/version/?current=' + current ;
iframe . frameBorder = 0 ;
iframe . marginHeight = 0 ;
iframe . scrolling = 'no' ;
iframe . style . width = '7ex' ;
iframe . style . height = '1.25em' ;
if ( window . postMessage && window . addEventListener ) {
iframe . style . display = 'none' ;
addEventListener ( 'message' , function ( event ) {
if ( event . origin == location . protocol + '//www.adminer.org' ) {
var match = /version=(.+)/ . exec ( event . data ) ;
if ( match ) {
cookie ( 'adminer_version=' + match [ 1 ] , 1 ) ;
}
}
} , false ) ;
}
document . getElementById ( 'version' ) . appendChild ( iframe ) ;
2009-07-29 15:01:47 +00:00
}
2010-10-16 23:51:56 +00:00
/ * * G e t v a l u e o f s e l e c t
2013-07-06 17:31:21 +00:00
* @ param HTMLElement < select > or < input >
2010-10-16 23:51:56 +00:00
* @ return string
* /
function selectValue ( select ) {
2013-07-06 17:31:21 +00:00
if ( ! select . selectedIndex ) {
return select . value ;
}
2011-02-28 14:57:37 +00:00
var selected = select . options [ select . selectedIndex ] ;
return ( ( selected . attributes . value || { } ) . specified ? selected . value : selected . text ) ;
2010-10-16 23:51:56 +00:00
}
2013-07-12 21:06:44 +00:00
/ * * V e r i f y i f e l e m e n t h a s a s p e c i f i e d t a g n a m e
* @ param HTMLElement
* @ param string regular expression
* @ return bool
* /
function isTag ( el , tag ) {
var re = new RegExp ( '^(' + tag + ')$' , 'i' ) ;
return re . test ( el . tagName ) ;
}
/ * * G e t p a r e n t n o d e w i t h s p e c i f i e d t a g n a m e
2012-08-08 16:22:23 +00:00
* @ param HTMLElement
2013-04-05 01:15:18 +00:00
* @ param string regular expression
2012-08-08 16:22:23 +00:00
* @ return HTMLElement
* /
function parentTag ( el , tag ) {
2013-07-12 21:06:44 +00:00
while ( el && ! isTag ( el , tag ) ) {
2012-08-08 16:22:23 +00:00
el = el . parentNode ;
}
return el ;
}
2011-08-11 11:48:27 +00:00
/ * * S e t c h e c k e d c l a s s
* @ param HTMLInputElement
* /
function trCheck ( el ) {
2012-08-08 16:22:23 +00:00
var tr = parentTag ( el , 'tr' ) ;
2013-07-11 01:24:36 +00:00
alterClass ( tr , 'checked' , el . checked ) ;
2014-02-02 04:50:08 +00:00
if ( el . form && el . form [ 'all' ] && el . form [ 'all' ] . onclick ) { // Opera treats form.all as document.all
2013-07-08 22:27:53 +00:00
el . form [ 'all' ] . onclick ( ) ;
}
}
/ * * F i l l n u m b e r o f s e l e c t e d i t e m s
* @ param string
2013-07-10 17:12:58 +00:00
* @ param string
2013-07-08 22:27:53 +00:00
* /
2013-07-10 17:12:58 +00:00
function selectCount ( id , count ) {
2013-07-11 23:45:52 +00:00
setHtml ( id , ( count === '' ? '' : '(' + ( count + '' ) . replace ( /\B(?=(\d{3})+$)/g , ' ' ) + ')' ) ) ;
2013-07-11 23:30:31 +00:00
var inputs = document . getElementById ( id ) . parentNode . parentNode . getElementsByTagName ( 'input' ) ;
for ( var i = 0 ; i < inputs . length ; i ++ ) {
var input = inputs [ i ] ;
if ( input . type == 'submit' ) {
input . disabled = ( count == '0' ) ;
}
}
2011-08-11 11:48:27 +00:00
}
2009-12-17 14:53:26 +00:00
/ * * C h e c k a l l e l e m e n t s m a t c h i n g g i v e n n a m e
* @ param HTMLInputElement
* @ param RegExp
* /
2009-12-17 13:22:28 +00:00
function formCheck ( el , name ) {
2009-05-29 16:14:54 +00:00
var elems = el . form . elements ;
for ( var i = 0 ; i < elems . length ; i ++ ) {
2009-06-01 13:06:11 +00:00
if ( name . test ( elems [ i ] . name ) ) {
2009-05-29 16:14:54 +00:00
elems [ i ] . checked = el . checked ;
2011-08-11 11:48:27 +00:00
trCheck ( elems [ i ] ) ;
}
}
}
/ * * C h e c k a l l r o w s i n < t a b l e c l a s s = " c h e c k a b l e " >
* /
function tableCheck ( ) {
var tables = document . getElementsByTagName ( 'table' ) ;
for ( var i = 0 ; i < tables . length ; i ++ ) {
if ( /(^|\s)checkable(\s|$)/ . test ( tables [ i ] . className ) ) {
var trs = tables [ i ] . getElementsByTagName ( 'tr' ) ;
for ( var j = 0 ; j < trs . length ; j ++ ) {
trCheck ( trs [ j ] . firstChild . firstChild ) ;
}
2009-05-29 16:14:54 +00:00
}
}
}
2009-12-17 14:53:26 +00:00
/ * * U n c h e c k s i n g l e e l e m e n t
* @ param string
* /
2009-12-17 13:22:28 +00:00
function formUncheck ( id ) {
2011-08-11 11:48:27 +00:00
var el = document . getElementById ( id ) ;
el . checked = false ;
trCheck ( el ) ;
2009-06-01 13:06:11 +00:00
}
2009-12-17 14:53:26 +00:00
/ * * G e t n u m b e r o f c h e c k e d e l e m e n t s m a t c h i n g g i v e n n a m e
* @ param HTMLInputElement
* @ param RegExp
* @ return number
* /
2009-12-17 13:22:28 +00:00
function formChecked ( el , name ) {
2009-09-23 12:21:14 +00:00
var checked = 0 ;
var elems = el . form . elements ;
for ( var i = 0 ; i < elems . length ; i ++ ) {
if ( name . test ( elems [ i ] . name ) && elems [ i ] . checked ) {
checked ++ ;
}
}
return checked ;
}
2009-12-17 14:53:26 +00:00
/ * * S e l e c t c l i c k e d r o w
* @ param MouseEvent
2012-10-04 07:42:56 +00:00
* @ param [ boolean ] force click
2009-12-17 14:53:26 +00:00
* /
2012-10-04 07:42:56 +00:00
function tableClick ( event , click ) {
click = ( click || ! window . getSelection || getSelection ( ) . isCollapsed ) ;
2013-07-19 17:41:06 +00:00
var el = getTarget ( event ) ;
2013-07-12 21:06:44 +00:00
while ( ! isTag ( el , 'tr' ) ) {
if ( isTag ( el , 'table|a|input|textarea' ) ) {
2014-03-20 17:04:48 +00:00
if ( el . origHref ) {
// open('about:blank').document.write('<meta http-equiv="Refresh">') still passes the referer in Chrome
var href = el . href ;
el . href = el . origHref ;
setTimeout ( function ( ) {
el . href = href ;
} , 0 ) ;
}
2012-06-13 19:21:21 +00:00
if ( el . type != 'checkbox' ) {
return ;
}
checkboxClick ( event , el ) ;
2011-08-11 11:48:27 +00:00
click = false ;
}
2009-08-25 12:21:03 +00:00
el = el . parentNode ;
2009-08-25 10:25:56 +00:00
}
2009-08-25 12:21:03 +00:00
el = el . firstChild . firstChild ;
2011-08-11 11:48:27 +00:00
if ( click ) {
2012-10-04 07:42:56 +00:00
el . checked = ! el . checked ;
2011-08-11 11:48:27 +00:00
el . onclick && el . onclick ( ) ;
}
trCheck ( el ) ;
2009-08-25 10:25:56 +00:00
}
2014-03-20 17:04:48 +00:00
/ * * C l e a n r e d i r e c t l i n k s t o s i m p l i f y t h e i r c o p y i n g
* @ param HTMLElement
* /
function selectLinks ( table ) {
var as = table . getElementsByTagName ( 'a' ) ;
for ( var i = 0 ; i < as . length ; i ++ ) {
var a = as [ i ] ;
var match = /^https?:\/\/www\.adminer\.org\/redirect\/\?url=(.+)/ . exec ( a . href ) ; //! rewrites also links intentionally stored with http://www.adminer.org/redirect/?url=
if ( match ) {
a . origHref = a . href ;
a . href = decodeURIComponent ( match [ 1 ] ) ;
}
}
}
2012-06-13 19:21:21 +00:00
var lastChecked ;
/ * * S h i f t - c l i c k o n c h e c k b o x f o r m u l t i p l e s e l e c t i o n .
* @ param MouseEvent
* @ param HTMLInputElement
* /
function checkboxClick ( event , el ) {
if ( ! el . name ) {
return ;
}
if ( event . shiftKey && ( ! lastChecked || lastChecked . name == el . name ) ) {
var checked = ( lastChecked ? lastChecked . checked : true ) ;
2012-08-08 16:22:23 +00:00
var inputs = parentTag ( el , 'table' ) . getElementsByTagName ( 'input' ) ;
2012-06-13 19:21:21 +00:00
var checking = ! lastChecked ;
for ( var i = 0 ; i < inputs . length ; i ++ ) {
var input = inputs [ i ] ;
if ( input . name === el . name ) {
if ( checking ) {
input . checked = checked ;
trCheck ( input ) ;
}
if ( input === el || input === lastChecked ) {
if ( checking ) {
break ;
}
checking = true ;
}
}
}
2012-08-08 15:54:15 +00:00
} else {
lastChecked = el ;
2012-06-13 19:21:21 +00:00
}
}
2010-04-21 12:01:32 +00:00
/ * * S e t H T M L c o d e o f a n e l e m e n t
* @ param string
* @ param string undefined to set parentNode to & nbsp ;
* /
function setHtml ( id , html ) {
var el = document . getElementById ( id ) ;
if ( el ) {
if ( html == undefined ) {
el . parentNode . innerHTML = ' ' ;
} else {
2011-05-16 14:26:24 +00:00
el . innerHTML = html ;
2010-04-21 12:01:32 +00:00
}
}
}
2011-01-25 16:13:57 +00:00
/ * * F i n d n o d e p o s i t i o n
* @ param Node
* @ return number
* /
function nodePosition ( el ) {
var pos = 0 ;
while ( el = el . previousSibling ) {
pos ++ ;
}
return pos ;
}
2010-11-12 16:31:18 +00:00
/ * * G o t o t h e s p e c i f i e d p a g e
* @ param string
* @ param string
* @ param [ MouseEvent ]
* /
function pageClick ( href , page , event ) {
if ( ! isNaN ( page ) && page ) {
href += ( page != 1 ? '&page=' + ( page - 1 ) : '' ) ;
2012-04-16 05:18:03 +00:00
location . href = href ;
2010-11-12 16:31:18 +00:00
}
}
2012-08-21 05:20:22 +00:00
/ * * D i s p l a y i t e m s i n m e n u
* @ param HTMLElement
* @ param MouseEvent
* /
function menuOver ( el , event ) {
2013-07-19 17:41:06 +00:00
var a = getTarget ( event ) ;
2013-07-12 21:06:44 +00:00
if ( isTag ( a , 'a|span' ) && a . offsetLeft + a . offsetWidth > a . parentNode . offsetWidth - 15 ) { // 15 - ellipsis
2012-08-21 05:20:22 +00:00
el . style . overflow = 'visible' ;
}
2012-08-08 15:27:50 +00:00
}
2012-08-21 05:20:22 +00:00
/ * * H i d e i t e m s i n m e n u
* @ param HTMLElement
* /
2012-08-08 15:27:50 +00:00
function menuOut ( el ) {
el . style . overflow = 'auto' ;
}
2009-05-29 16:51:21 +00:00
2009-12-17 14:53:26 +00:00
/ * * A d d r o w i n s e l e c t f i e l d s e t
* @ param HTMLSelectElement
* /
2009-12-17 13:22:28 +00:00
function selectAddRow ( field ) {
2012-05-17 06:54:56 +00:00
field . onchange = function ( ) {
selectFieldChange ( field . form ) ;
} ;
field . onchange ( ) ;
2013-05-05 00:02:59 +00:00
var row = cloneNode ( field . parentNode ) ;
2009-05-29 16:14:54 +00:00
var selects = row . getElementsByTagName ( 'select' ) ;
for ( var i = 0 ; i < selects . length ; i ++ ) {
2010-10-22 22:02:24 +00:00
selects [ i ] . name = selects [ i ] . name . replace ( /[a-z]\[\d+/ , '$&1' ) ;
2009-05-29 16:14:54 +00:00
selects [ i ] . selectedIndex = 0 ;
}
var inputs = row . getElementsByTagName ( 'input' ) ;
2013-07-06 17:31:21 +00:00
for ( var i = 0 ; i < inputs . length ; i ++ ) {
inputs [ i ] . name = inputs [ i ] . name . replace ( /[a-z]\[\d+/ , '$&1' ) ;
inputs [ i ] . value = '' ;
inputs [ i ] . className = '' ;
2009-05-29 16:14:54 +00:00
}
field . parentNode . parentNode . appendChild ( row ) ;
}
2010-04-23 15:26:59 +00:00
2013-12-21 01:42:13 +00:00
/ * * P r e v e n t o n s e a r c h h a n d l e r o n E n t e r
* @ param HTMLInputElement
* @ param KeyboardEvent
* /
function selectSearchKeydown ( el , event ) {
if ( event . keyCode == 13 || event . keyCode == 10 ) {
el . onsearch = function ( ) {
} ;
}
}
2013-04-05 01:32:05 +00:00
/ * * C l e a r c o l u m n n a m e a f t e r r e s e t t i n g s e a r c h
* @ param HTMLInputElement
* /
2013-05-04 01:53:13 +00:00
function selectSearchSearch ( el ) {
2013-04-05 01:32:05 +00:00
if ( ! el . value ) {
el . parentNode . firstChild . selectedIndex = 0 ;
}
}
2012-02-29 19:24:01 +00:00
2012-07-29 20:55:39 +00:00
/ * * T o g g l e s c o l u m n c o n t e x t m e n u
* @ param HTMLElement
* @ param [ string ] extra class name
* /
function columnMouse ( el , className ) {
var spans = el . getElementsByTagName ( 'span' ) ;
for ( var i = 0 ; i < spans . length ; i ++ ) {
if ( /column/ . test ( spans [ i ] . className ) ) {
spans [ i ] . className = 'column' + ( className || '' ) ;
}
}
}
2012-07-29 18:16:41 +00:00
/ * * F i l l c o l u m n i n s e a r c h f i e l d
* @ param string
* /
function selectSearch ( name ) {
var el = document . getElementById ( 'fieldset-search' ) ;
el . className = '' ;
var divs = el . getElementsByTagName ( 'div' ) ;
for ( var i = 0 ; i < divs . length ; i ++ ) {
var div = divs [ i ] ;
2013-07-12 21:06:44 +00:00
if ( isTag ( div . firstChild , 'select' ) && selectValue ( div . firstChild ) == name ) {
2012-07-29 18:16:41 +00:00
break ;
}
}
if ( i == divs . length ) {
div . firstChild . value = name ;
div . firstChild . onchange ( ) ;
}
div . lastChild . focus ( ) ;
}
2013-01-10 01:38:53 +00:00
/ * * C h e c k i f C t r l k e y ( C o m m a n d k e y o n M a c ) w a s p r e s s e d
* @ param KeyboardEvent | MouseEvent
* @ return boolean
* /
function isCtrl ( event ) {
return ( event . ctrlKey || event . metaKey ) && ! event . altKey ; // shiftKey allowed
}
2013-07-19 17:41:06 +00:00
/ * * R e t u r n e v e n t t a r g e t
* @ param Event
2013-07-19 18:55:49 +00:00
* @ return HTMLElement
2013-07-19 17:41:06 +00:00
* /
function getTarget ( event ) {
return event . target || event . srcElement ;
}
2013-01-10 01:38:53 +00:00
2012-07-29 18:16:41 +00:00
2011-05-04 09:42:46 +00:00
/ * * S e n d f o r m b y C t r l + E n t e r o n < s e l e c t > a n d < t e x t a r e a >
2011-03-18 16:24:29 +00:00
* @ param KeyboardEvent
2011-05-04 09:42:46 +00:00
* @ param [ string ]
2011-03-21 11:15:38 +00:00
* @ return boolean
2011-03-18 16:24:29 +00:00
* /
2011-05-04 09:42:46 +00:00
function bodyKeydown ( event , button ) {
2013-07-19 17:41:06 +00:00
var target = getTarget ( event ) ;
2013-07-22 18:45:09 +00:00
if ( target . jushTextarea ) {
target = target . jushTextarea ;
}
2013-07-12 21:06:44 +00:00
if ( isCtrl ( event ) && ( event . keyCode == 13 || event . keyCode == 10 ) && isTag ( target , 'select|textarea|input' ) ) { // 13|10 - Enter
2011-03-21 11:15:38 +00:00
target . blur ( ) ;
2012-04-16 05:18:03 +00:00
if ( button ) {
target . form [ button ] . click ( ) ;
} else {
target . form . submit ( ) ;
2011-03-21 11:15:38 +00:00
}
2013-06-29 19:41:35 +00:00
target . focus ( ) ;
2011-06-14 08:32:08 +00:00
return false ;
2011-03-18 16:24:29 +00:00
}
2011-06-14 08:32:08 +00:00
return true ;
2011-03-18 16:24:29 +00:00
}
2012-09-04 22:40:57 +00:00
/ * * O p e n f o r m t o a n e w w i n d o w o n C t r l + c l i c k o r S h i f t + c l i c k
* @ param MouseEvent
* /
function bodyClick ( event ) {
2013-07-19 17:41:06 +00:00
var target = getTarget ( event ) ;
2013-07-12 21:06:44 +00:00
if ( ( isCtrl ( event ) || event . shiftKey ) && target . type == 'submit' && isTag ( target , 'input' ) ) {
2012-09-04 22:40:57 +00:00
target . form . target = '_blank' ;
setTimeout ( function ( ) {
2013-01-10 01:38:53 +00:00
// if (isCtrl(event)) { focus(); } doesn't work
2012-09-04 22:40:57 +00:00
target . form . target = '' ;
} , 0 ) ;
}
}
2010-10-17 05:55:58 +00:00
2011-01-25 16:13:57 +00:00
/ * * C h a n g e f o c u s b y C t r l + U p o r C t r l + D o w n
* @ param KeyboardEvent
* @ return boolean
* /
function editingKeydown ( event ) {
2013-01-10 01:38:53 +00:00
if ( ( event . keyCode == 40 || event . keyCode == 38 ) && isCtrl ( event ) ) { // 40 - Down, 38 - Up
2013-07-19 17:41:06 +00:00
var target = getTarget ( event ) ;
2011-01-25 16:13:57 +00:00
var sibling = ( event . keyCode == 40 ? 'nextSibling' : 'previousSibling' ) ;
var el = target . parentNode . parentNode [ sibling ] ;
2013-07-12 21:06:44 +00:00
if ( el && ( isTag ( el , 'tr' ) || ( el = el [ sibling ] ) ) && isTag ( el , 'tr' ) && ( el = el . childNodes [ nodePosition ( target . parentNode ) ] ) && ( el = el . childNodes [ nodePosition ( target ) ] ) ) {
2011-01-25 16:13:57 +00:00
el . focus ( ) ;
}
return false ;
}
2011-06-14 08:32:08 +00:00
if ( event . shiftKey && ! bodyKeydown ( event , 'insert' ) ) {
eventStop ( event ) ;
return false ;
}
2011-01-25 16:13:57 +00:00
return true ;
}
2011-03-18 08:06:05 +00:00
/ * * D i s a b l e m a x l e n g t h f o r f u n c t i o n s
* @ param HTMLSelectElement
* /
function functionChange ( select ) {
var input = select . form [ select . name . replace ( /^function/ , 'fields' ) ] ;
if ( selectValue ( select ) ) {
2014-01-08 17:07:58 +00:00
if ( input . origType === undefined ) {
input . origType = input . type ;
2011-03-18 08:06:05 +00:00
input . origMaxLength = input . maxLength ;
}
input . removeAttribute ( 'maxlength' ) ;
2014-01-08 17:07:58 +00:00
input . type = 'text' ;
} else if ( input . origType ) {
input . type = input . origType ;
if ( input . origMaxLength >= 0 ) {
input . maxLength = input . origMaxLength ;
}
2011-03-18 08:06:05 +00:00
}
2013-07-19 18:55:49 +00:00
helpClose ( ) ;
2011-03-18 08:06:05 +00:00
}
2013-08-10 00:00:05 +00:00
/ * * C a l l t h i s . o n c h a n g e ( ) i f v a l u e c h a n g e s
* @ this HTMLInputElement
* /
function keyupChange ( ) {
if ( this . value != this . getAttribute ( 'value' ) ) {
this . onchange ( ) ;
this . setAttribute ( 'value' , this . value ) ;
}
}
2014-01-11 23:46:30 +00:00
/ * * A d d n e w f i e l d i n s c h e m a - l e s s e d i t
* @ param HTMLInputElement
* /
function fieldChange ( field ) {
var row = cloneNode ( parentTag ( field , 'tr' ) ) ;
var inputs = row . getElementsByTagName ( 'input' ) ;
for ( var i = 0 ; i < inputs . length ; i ++ ) {
inputs [ i ] . value = '' ;
}
// keep value in <select> (function)
parentTag ( field , 'table' ) . appendChild ( row ) ;
field . onchange = function ( ) { } ;
}
2011-01-25 16:13:57 +00:00
2010-10-16 23:51:56 +00:00
/ * * C r e a t e A J A X r e q u e s t
* @ param string
2011-03-11 23:33:06 +00:00
* @ param function ( XMLHttpRequest )
2010-10-17 21:54:41 +00:00
* @ param [ string ]
2010-10-16 23:51:56 +00:00
* @ return XMLHttpRequest or false in case of an error
* /
2010-10-18 11:57:22 +00:00
function ajax ( url , callback , data ) {
2012-02-29 19:08:13 +00:00
var request = ( window . XMLHttpRequest ? new XMLHttpRequest ( ) : ( window . ActiveXObject ? new ActiveXObject ( 'Microsoft.XMLHTTP' ) : false ) ) ;
if ( request ) {
request . open ( ( data ? 'POST' : 'GET' ) , url ) ;
2010-10-18 11:57:22 +00:00
if ( data ) {
2012-02-29 19:08:13 +00:00
request . setRequestHeader ( 'Content-Type' , 'application/x-www-form-urlencoded' ) ;
2010-10-17 05:50:40 +00:00
}
2012-02-29 19:08:13 +00:00
request . setRequestHeader ( 'X-Requested-With' , 'XMLHttpRequest' ) ;
request . onreadystatechange = function ( ) {
if ( request . readyState == 4 ) {
callback ( request ) ;
2010-10-16 23:51:56 +00:00
}
2010-10-17 05:19:01 +00:00
} ;
2012-02-29 19:08:13 +00:00
request . send ( data ) ;
2010-10-17 05:19:01 +00:00
}
2012-02-29 19:08:13 +00:00
return request ;
2010-10-16 23:51:56 +00:00
}
2010-10-18 23:40:49 +00:00
/ * * U s e s e t H t m l ( k e y , v a l u e ) f o r J S O N r e s p o n s e
* @ param string
* @ return XMLHttpRequest or false in case of an error
* /
function ajaxSetHtml ( url ) {
2012-02-29 19:08:13 +00:00
return ajax ( url , function ( request ) {
if ( request . status ) {
var data = eval ( '(' + request . responseText + ')' ) ;
2011-03-11 23:33:06 +00:00
for ( var key in data ) {
setHtml ( key , data [ key ] ) ;
}
2010-10-18 23:40:49 +00:00
}
} ) ;
}
2013-06-29 19:41:35 +00:00
/ * * S a v e f o r m c o n t e n t s t h r o u g h A J A X
* @ param HTMLFormElement
* @ param string
* @ param [ HTMLInputElement ]
* @ return boolean
* /
function ajaxForm ( form , message , button ) {
var data = [ ] ;
var els = form . elements ;
for ( var i = 0 ; i < els . length ; i ++ ) {
var el = els [ i ] ;
if ( el . name && ! el . disabled ) {
if ( /^file$/i . test ( el . type ) && el . value ) {
return false ;
}
if ( ! /^(checkbox|radio|submit|file)$/i . test ( el . type ) || el . checked || el == button ) {
2013-07-12 21:06:44 +00:00
data . push ( encodeURIComponent ( el . name ) + '=' + encodeURIComponent ( isTag ( el , 'select' ) ? selectValue ( el ) : el . value ) ) ;
2013-06-29 19:41:35 +00:00
}
}
}
data = data . join ( '&' ) ;
2013-12-19 20:44:15 +00:00
setHtml ( 'message' , '<div class="message">' + message + '</div>' ) ;
2013-06-29 19:41:35 +00:00
var url = form . action ;
if ( ! /post/i . test ( form . method ) ) {
url = url . replace ( /\?.*/ , '' ) + '?' + data ;
data = '' ;
}
return ajax ( url , function ( request ) {
setHtml ( 'message' , request . responseText ) ;
if ( window . jush ) {
2013-12-19 20:39:03 +00:00
jush . highlight _tag ( document . getElementById ( 'message' ) . getElementsByTagName ( 'code' ) , 0 ) ;
2013-06-29 19:41:35 +00:00
}
} , data ) ;
}
2010-07-13 16:18:47 +00:00
2010-04-26 16:19:59 +00:00
/ * * D i s p l a y e d i t f i e l d
* @ param HTMLElement
* @ param MouseEvent
2010-10-18 11:57:22 +00:00
* @ param number display textarea instead of input , 2 - load long text
2012-11-01 20:38:03 +00:00
* @ param string warning to display
2010-04-26 16:19:59 +00:00
* /
2012-11-01 20:38:03 +00:00
function selectClick ( td , event , text , warning ) {
2013-07-19 17:41:06 +00:00
var target = getTarget ( event ) ;
2013-07-12 21:06:44 +00:00
if ( ! isCtrl ( event ) || isTag ( td . firstChild , 'input|textarea' ) || isTag ( target , 'a' ) ) {
2011-05-10 09:06:50 +00:00
return ;
}
2012-11-01 20:38:03 +00:00
if ( warning ) {
return alert ( warning ) ;
}
2011-05-10 09:06:50 +00:00
var original = td . innerHTML ;
2012-08-12 03:21:03 +00:00
text = text || /\n/ . test ( original ) ;
2010-04-23 15:26:59 +00:00
var input = document . createElement ( text ? 'textarea' : 'input' ) ;
2011-05-10 09:06:50 +00:00
input . onkeydown = function ( event ) {
if ( ! event ) {
event = window . event ;
}
2013-01-10 01:38:53 +00:00
if ( event . keyCode == 27 && ! event . shiftKey && ! event . altKey && ! isCtrl ( event ) ) { // 27 - Esc
2013-07-07 06:53:03 +00:00
inputBlur . apply ( input ) ;
2011-05-10 09:06:50 +00:00
td . innerHTML = original ;
}
} ;
var pos = event . rangeOffset ;
var value = td . firstChild . alt || td . textContent || td . innerText ;
2010-10-17 14:00:29 +00:00
input . style . width = Math . max ( td . clientWidth - 14 , 20 ) + 'px' ; // 14 = 2 * (td.border + td.padding + input.border)
2010-04-23 15:26:59 +00:00
if ( text ) {
var rows = 1 ;
value . replace ( /\n/g , function ( ) {
rows ++ ;
} ) ;
input . rows = rows ;
}
2011-03-21 13:35:58 +00:00
if ( value == '\u00A0' || td . getElementsByTagName ( 'i' ) . length ) { // or i - NULL
value = '' ;
}
2010-04-23 15:26:59 +00:00
if ( document . selection ) {
var range = document . selection . createRange ( ) ;
2011-02-08 20:41:57 +00:00
range . moveToPoint ( event . clientX , event . clientY ) ;
2010-04-23 15:26:59 +00:00
var range2 = range . duplicate ( ) ;
range2 . moveToElementText ( td ) ;
range2 . setEndPoint ( 'EndToEnd' , range ) ;
pos = range2 . text . length ;
}
td . innerHTML = '' ;
td . appendChild ( input ) ;
2013-05-05 00:02:59 +00:00
setupSubmitHighlight ( td ) ;
2010-04-23 15:26:59 +00:00
input . focus ( ) ;
2010-10-18 11:57:22 +00:00
if ( text == 2 ) { // long text
2012-02-29 19:08:13 +00:00
return ajax ( location . href + '&' + encodeURIComponent ( td . id ) + '=' , function ( request ) {
2014-01-09 07:06:53 +00:00
if ( request . status && request . responseText ) {
2012-02-29 19:08:13 +00:00
input . value = request . responseText ;
2011-03-11 23:33:06 +00:00
input . name = td . id ;
}
2010-10-18 11:57:22 +00:00
} ) ;
}
2010-11-28 15:40:11 +00:00
input . value = value ;
2010-10-18 22:57:37 +00:00
input . name = td . id ;
2010-04-23 15:26:59 +00:00
input . selectionStart = pos ;
input . selectionEnd = pos ;
if ( document . selection ) {
var range = document . selection . createRange ( ) ;
2010-11-19 14:50:09 +00:00
range . moveEnd ( 'character' , - input . value . length + pos ) ;
2010-04-23 15:26:59 +00:00
range . select ( ) ;
}
}
2010-11-22 15:52:54 +00:00
2012-08-20 03:32:53 +00:00
/ * * L o a d a n d d i s p l a y n e x t p a g e i n s e l e c t
* @ param HTMLLinkElement
* @ param number
2013-12-19 20:44:15 +00:00
* @ param string
2012-08-20 03:32:53 +00:00
* @ return boolean
* /
function selectLoadMore ( a , limit , loading ) {
var title = a . innerHTML ;
var href = a . href ;
a . innerHTML = loading ;
if ( href ) {
a . removeAttribute ( 'href' ) ;
return ajax ( href , function ( request ) {
2013-03-27 01:31:03 +00:00
var tbody = document . createElement ( 'tbody' ) ;
tbody . innerHTML = request . responseText ;
document . getElementById ( 'table' ) . appendChild ( tbody ) ;
2014-03-20 17:04:48 +00:00
selectLinks ( tbody ) ;
2013-03-27 01:31:03 +00:00
if ( tbody . children . length < limit ) {
2012-08-20 03:32:53 +00:00
a . parentNode . removeChild ( a ) ;
} else {
a . href = href . replace ( /\d+$/ , function ( page ) {
return + page + 1 ;
} ) ;
a . innerHTML = title ;
}
} ) ;
}
}
2010-12-01 17:44:17 +00:00
/ * * S t o p e v e n t p r o p a g a t i o n
* @ param Event
* /
function eventStop ( event ) {
if ( event . stopPropagation ) {
event . stopPropagation ( ) ;
} else {
event . cancelBubble = true ;
}
}
2013-05-05 00:02:59 +00:00
/ * * S e t u p h i g h l i g h t i n g o f d e f a u l t s u b m i t b u t t o n o n f o r m f i e l d f o c u s
* @ param HTMLElement
* /
function setupSubmitHighlight ( parent ) {
for ( var key in { input : 1 , select : 1 , textarea : 1 } ) {
var inputs = parent . getElementsByTagName ( key ) ;
for ( var i = 0 ; i < inputs . length ; i ++ ) {
2013-07-23 23:33:07 +00:00
setupSubmitHighlightInput ( inputs [ i ] )
2013-05-05 00:02:59 +00:00
}
}
}
2013-07-23 23:33:07 +00:00
/ * * S e t u p s u b m i t h i g h l i g h t i n g f o r s i n g l e e l e m e n t
* @ param HTMLElement
* /
function setupSubmitHighlightInput ( input ) {
if ( ! /submit|image|file/ . test ( input . type ) ) {
addEvent ( input , 'focus' , inputFocus ) ;
addEvent ( input , 'blur' , inputBlur ) ;
}
}
2013-05-05 00:02:59 +00:00
/ * * H i g h l i g h t d e f a u l t s u b m i t b u t t o n
* @ this HTMLInputElement
* /
function inputFocus ( ) {
2013-07-23 23:33:07 +00:00
var submit = findDefaultSubmit ( this ) ;
2013-05-05 00:02:59 +00:00
if ( submit ) {
2013-07-11 01:24:36 +00:00
alterClass ( submit , 'default' , true ) ;
2013-05-05 00:02:59 +00:00
}
}
/ * * U n h i g h l i g h t d e f a u l t s u b m i t b u t t o n
* @ this HTMLInputElement
* /
function inputBlur ( ) {
2013-07-23 23:33:07 +00:00
var submit = findDefaultSubmit ( this ) ;
2013-05-05 00:02:59 +00:00
if ( submit ) {
2013-07-11 01:24:36 +00:00
alterClass ( submit , 'default' ) ;
2013-05-05 00:02:59 +00:00
}
}
/ * * F i n d s u b m i t b u t t o n u s e d b y E n t e r
2013-07-23 23:33:07 +00:00
* @ param HTMLElement
2013-05-05 00:02:59 +00:00
* @ return HTMLInputElement
* /
2013-07-23 23:33:07 +00:00
function findDefaultSubmit ( el ) {
if ( el . jushTextarea ) {
el = el . jushTextarea ;
}
var inputs = el . form . getElementsByTagName ( 'input' ) ;
2013-05-05 00:02:59 +00:00
for ( var i = 0 ; i < inputs . length ; i ++ ) {
var input = inputs [ i ] ;
2013-07-10 19:44:03 +00:00
if ( input . type == 'submit' && ! input . style . zIndex ) {
2013-05-05 00:02:59 +00:00
return input ;
}
}
}
/ * * A d d e v e n t l i s t e n e r
* @ param HTMLElement
* @ param string without 'on'
* @ param function
* /
function addEvent ( el , action , handler ) {
if ( el . addEventListener ) {
el . addEventListener ( action , handler , false ) ;
} else {
el . attachEvent ( 'on' + action , handler ) ;
}
}
/ * * D e f e r f o c u s i n g e l e m e n t
* @ param HTMLElement
* /
function focus ( el ) {
setTimeout ( function ( ) { // this has to be an anonymous function because Firefox passes some arguments to setTimeout callback
el . focus ( ) ;
} , 0 ) ;
}
/ * * C l o n e n o d e a n d s e t u p s u b m i t h i g h l i g h t i n g
* @ param HTMLElement
* @ return HTMLElement
* /
function cloneNode ( el ) {
var el2 = el . cloneNode ( true ) ;
setupSubmitHighlight ( el2 ) ;
return el2 ;
}