Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PSDI Army
yii2
Commits
7960ccdf
Commit
7960ccdf
authored
Mar 16, 2014
by
Qiang Xue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Tab to spaces conversion.
parent
8cb144c5
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1092 additions
and
1090 deletions
+1092
-1090
toolbar.js
extensions/debug/assets/toolbar.js
+39
-39
gii.js
extensions/gii/assets/gii.js
+122
-120
yii.activeForm.js
framework/assets/yii.activeForm.js
+371
-371
yii.captcha.js
framework/assets/yii.captcha.js
+51
-51
yii.gridView.js
framework/assets/yii.gridView.js
+101
-101
yii.js
framework/assets/yii.js
+194
-194
yii.validation.js
framework/assets/yii.validation.js
+214
-214
No files found.
extensions/debug/assets/toolbar.js
View file @
7960ccdf
(
function
()
{
var
ajax
=
function
(
url
,
settings
)
{
var
xhr
=
window
.
XMLHttpRequest
?
new
XMLHttpRequest
()
:
new
ActiveXObject
(
'Microsoft.XMLHTTP'
);
settings
=
settings
||
{};
xhr
.
open
(
settings
.
method
||
'GET'
,
url
,
true
);
xhr
.
setRequestHeader
(
'X-Requested-With'
,
'XMLHttpRequest'
);
xhr
.
onreadystatechange
=
function
(
state
)
{
if
(
xhr
.
readyState
==
4
)
{
if
(
xhr
.
status
==
200
&&
settings
.
success
)
{
settings
.
success
(
xhr
);
}
else
if
(
xhr
.
status
!=
200
&&
settings
.
error
)
{
settings
.
error
(
xhr
);
}
}
};
xhr
.
send
(
settings
.
data
||
''
);
};
(
function
()
{
var
ajax
=
function
(
url
,
settings
)
{
var
xhr
=
window
.
XMLHttpRequest
?
new
XMLHttpRequest
()
:
new
ActiveXObject
(
'Microsoft.XMLHTTP'
);
settings
=
settings
||
{};
xhr
.
open
(
settings
.
method
||
'GET'
,
url
,
true
);
xhr
.
setRequestHeader
(
'X-Requested-With'
,
'XMLHttpRequest'
);
xhr
.
onreadystatechange
=
function
(
state
)
{
if
(
xhr
.
readyState
==
4
)
{
if
(
xhr
.
status
==
200
&&
settings
.
success
)
{
settings
.
success
(
xhr
);
}
else
if
(
xhr
.
status
!=
200
&&
settings
.
error
)
{
settings
.
error
(
xhr
);
}
}
};
xhr
.
send
(
settings
.
data
||
''
);
};
var
e
=
document
.
getElementById
(
'yii-debug-toolbar'
);
if
(
e
)
{
e
.
style
.
display
=
'block'
;
var
url
=
e
.
getAttribute
(
'data-url'
);
ajax
(
url
,
{
success
:
function
(
xhr
)
{
var
div
=
document
.
createElement
(
'div'
);
div
.
innerHTML
=
xhr
.
responseText
;
e
.
parentNode
.
replaceChild
(
div
,
e
);
if
(
window
.
localStorage
)
{
var
pref
=
localStorage
.
getItem
(
'yii-debug-toolbar'
);
if
(
pref
==
'minimized'
)
{
document
.
getElementById
(
'yii-debug-toolbar'
).
style
.
display
=
'none'
;
document
.
getElementById
(
'yii-debug-toolbar-min'
).
style
.
display
=
'block'
;
}
}
},
error
:
function
(
xhr
)
{
e
.
innerHTML
=
xhr
.
responseText
;
}
});
}
var
e
=
document
.
getElementById
(
'yii-debug-toolbar'
);
if
(
e
)
{
e
.
style
.
display
=
'block'
;
var
url
=
e
.
getAttribute
(
'data-url'
);
ajax
(
url
,
{
success
:
function
(
xhr
)
{
var
div
=
document
.
createElement
(
'div'
);
div
.
innerHTML
=
xhr
.
responseText
;
e
.
parentNode
.
replaceChild
(
div
,
e
);
if
(
window
.
localStorage
)
{
var
pref
=
localStorage
.
getItem
(
'yii-debug-toolbar'
);
if
(
pref
==
'minimized'
)
{
document
.
getElementById
(
'yii-debug-toolbar'
).
style
.
display
=
'none'
;
document
.
getElementById
(
'yii-debug-toolbar-min'
).
style
.
display
=
'block'
;
}
}
},
error
:
function
(
xhr
)
{
e
.
innerHTML
=
xhr
.
responseText
;
}
});
}
})();
extensions/gii/assets/gii.js
View file @
7960ccdf
yii
.
gii
=
(
function
(
$
)
{
var
isActive
=
$
(
'.default-view'
).
length
>
0
;
var
isActive
=
$
(
'.default-view'
).
length
>
0
;
var
initHintBlocks
=
function
()
{
$
(
'.hint-block'
).
each
(
function
()
{
var
$hint
=
$
(
this
);
$hint
.
parent
().
find
(
'label'
).
addClass
(
'help'
).
popover
({
html
:
true
,
trigger
:
'hover'
,
placement
:
'right'
,
content
:
$hint
.
html
()
});
});
};
var
initHintBlocks
=
function
()
{
$
(
'.hint-block'
).
each
(
function
()
{
var
$hint
=
$
(
this
);
$hint
.
parent
().
find
(
'label'
).
addClass
(
'help'
).
popover
({
html
:
true
,
trigger
:
'hover'
,
placement
:
'right'
,
content
:
$hint
.
html
()
});
});
};
var
initStickyInputs
=
function
()
{
$
(
'.sticky:not(.error)'
).
find
(
'input[type="text"],select,textarea'
).
each
(
function
()
{
var
value
;
if
(
this
.
tagName
===
'SELECT'
)
{
value
=
this
.
options
[
this
.
selectedIndex
].
text
;
}
else
if
(
this
.
tagName
===
'TEXTAREA'
)
{
value
=
$
(
this
).
html
();
}
else
{
value
=
$
(
this
).
val
();
}
if
(
value
===
''
)
{
value
=
'[empty]'
;
}
$
(
this
).
before
(
'<div class="sticky-value">'
+
value
+
'</div>'
).
hide
();
});
$
(
'.sticky-value'
).
on
(
'click'
,
function
()
{
$
(
this
).
hide
();
$
(
this
).
next
().
show
().
get
(
0
).
focus
();
});
};
var
initStickyInputs
=
function
()
{
$
(
'.sticky:not(.error)'
).
find
(
'input[type="text"],select,textarea'
).
each
(
function
()
{
var
value
;
if
(
this
.
tagName
===
'SELECT'
)
{
value
=
this
.
options
[
this
.
selectedIndex
].
text
;
}
else
if
(
this
.
tagName
===
'TEXTAREA'
)
{
value
=
$
(
this
).
html
();
}
else
{
value
=
$
(
this
).
val
();
}
if
(
value
===
''
)
{
value
=
'[empty]'
;
}
$
(
this
).
before
(
'<div class="sticky-value">'
+
value
+
'</div>'
).
hide
();
});
$
(
'.sticky-value'
).
on
(
'click'
,
function
()
{
$
(
this
).
hide
();
$
(
this
).
next
().
show
().
get
(
0
).
focus
();
});
};
var
initPreviewDiffLinks
=
function
()
{
$
(
'.preview-code, .diff-code, .modal-refresh, .modal-previous, .modal-next'
).
on
(
'click'
,
function
()
{
var
$modal
=
$
(
'#preview-modal'
);
var
$link
=
$
(
this
);
$modal
.
find
(
'.modal-refresh'
).
attr
(
'href'
,
$link
.
attr
(
'href'
));
if
(
$link
.
hasClass
(
'preview-code'
)
||
$link
.
hasClass
(
'diff-code'
))
{
$modal
.
data
(
'action'
,
(
$link
.
hasClass
(
'preview-code'
)
?
'preview-code'
:
'diff-code'
))
}
$modal
.
find
(
'.modal-title'
).
text
(
$link
.
data
(
'title'
));
$modal
.
find
(
'.modal-body'
).
html
(
'Loading ...'
);
$modal
.
modal
(
'show'
);
$
.
ajax
({
type
:
'POST'
,
cache
:
false
,
url
:
$link
.
prop
(
'href'
),
data
:
$
(
'.default-view form'
).
serializeArray
(),
success
:
function
(
data
)
{
if
(
!
$link
.
hasClass
(
'modal-refresh'
))
{
var
filesSelector
=
'a.'
+
$modal
.
data
(
'action'
);
var
$files
=
$
(
filesSelector
);
var
index
=
$files
.
filter
(
'[href="'
+
$link
.
attr
(
'href'
)
+
'"]'
).
index
(
filesSelector
);
var
$prev
=
$files
.
eq
(
index
-
1
);
var
$next
=
$files
.
eq
((
index
+
1
==
$files
.
length
?
0
:
index
+
1
));
$modal
.
find
(
'.modal-previous'
).
attr
(
'href'
,
$prev
.
attr
(
'href'
)).
data
(
'title'
,
$prev
.
data
(
'title'
));
$modal
.
find
(
'.modal-next'
).
attr
(
'href'
,
$next
.
attr
(
'href'
)).
data
(
'title'
,
$next
.
data
(
'title'
));
}
$modal
.
find
(
'.modal-body'
).
html
(
data
);
$modal
.
find
(
'.content'
).
css
(
'max-height'
,
(
$
(
window
).
height
()
-
200
)
+
'px'
);
},
error
:
function
(
XMLHttpRequest
,
textStatus
,
errorThrown
)
{
$modal
.
find
(
'.modal-body'
).
html
(
'<div class="error">'
+
XMLHttpRequest
.
responseText
+
'</div>'
);
}
});
return
false
;
});
var
initPreviewDiffLinks
=
function
()
{
$
(
'.preview-code, .diff-code, .modal-refresh, .modal-previous, .modal-next'
).
on
(
'click'
,
function
()
{
var
$modal
=
$
(
'#preview-modal'
);
var
$link
=
$
(
this
);
$modal
.
find
(
'.modal-refresh'
).
attr
(
'href'
,
$link
.
attr
(
'href'
));
if
(
$link
.
hasClass
(
'preview-code'
)
||
$link
.
hasClass
(
'diff-code'
))
{
$modal
.
data
(
'action'
,
(
$link
.
hasClass
(
'preview-code'
)
?
'preview-code'
:
'diff-code'
))
}
$modal
.
find
(
'.modal-title'
).
text
(
$link
.
data
(
'title'
));
$modal
.
find
(
'.modal-body'
).
html
(
'Loading ...'
);
$modal
.
modal
(
'show'
);
$
.
ajax
({
type
:
'POST'
,
cache
:
false
,
url
:
$link
.
prop
(
'href'
),
data
:
$
(
'.default-view form'
).
serializeArray
(),
success
:
function
(
data
)
{
if
(
!
$link
.
hasClass
(
'modal-refresh'
))
{
var
filesSelector
=
'a.'
+
$modal
.
data
(
'action'
);
var
$files
=
$
(
filesSelector
);
var
index
=
$files
.
filter
(
'[href="'
+
$link
.
attr
(
'href'
)
+
'"]'
).
index
(
filesSelector
);
var
$prev
=
$files
.
eq
(
index
-
1
);
var
$next
=
$files
.
eq
((
index
+
1
==
$files
.
length
?
0
:
index
+
1
));
$modal
.
find
(
'.modal-previous'
).
attr
(
'href'
,
$prev
.
attr
(
'href'
)).
data
(
'title'
,
$prev
.
data
(
'title'
));
$modal
.
find
(
'.modal-next'
).
attr
(
'href'
,
$next
.
attr
(
'href'
)).
data
(
'title'
,
$next
.
data
(
'title'
));
}
$modal
.
find
(
'.modal-body'
).
html
(
data
);
$modal
.
find
(
'.content'
).
css
(
'max-height'
,
(
$
(
window
).
height
()
-
200
)
+
'px'
);
},
error
:
function
(
XMLHttpRequest
,
textStatus
,
errorThrown
)
{
$modal
.
find
(
'.modal-body'
).
html
(
'<div class="error">'
+
XMLHttpRequest
.
responseText
+
'</div>'
);
}
});
return
false
;
});
$
(
'#preview-modal'
).
on
(
'keydown'
,
function
(
e
)
{
if
(
e
.
keyCode
===
37
)
{
$
(
'.modal-previous'
).
trigger
(
'click'
);
}
else
if
(
e
.
keyCode
===
39
)
{
$
(
'.modal-next'
).
trigger
(
'click'
);
}
else
if
(
e
.
keyCode
===
82
)
{
$
(
'.modal-refresh'
).
trigger
(
'click'
);
}
});
};
$
(
'#preview-modal'
).
on
(
'keydown'
,
function
(
e
)
{
if
(
e
.
keyCode
===
37
)
{
$
(
'.modal-previous'
).
trigger
(
'click'
);
}
else
if
(
e
.
keyCode
===
39
)
{
$
(
'.modal-next'
).
trigger
(
'click'
);
}
else
if
(
e
.
keyCode
===
82
)
{
$
(
'.modal-refresh'
).
trigger
(
'click'
);
}
});
};
var
initConfirmationCheckboxes
=
function
()
{
var
$checkAll
=
$
(
'#check-all'
);
$checkAll
.
click
(
function
()
{
$
(
'.default-view-files table .check input'
).
prop
(
'checked'
,
this
.
checked
);
});
$
(
'.default-view-files table .check input'
).
click
(
function
()
{
$checkAll
.
prop
(
'checked'
,
!
$
(
'.default-view-files table .check input:not(:checked)'
).
length
);
});
$checkAll
.
prop
(
'checked'
,
!
$
(
'.default-view-files table .check input:not(:checked)'
).
length
);
};
var
initConfirmationCheckboxes
=
function
()
{
var
$checkAll
=
$
(
'#check-all'
);
$checkAll
.
click
(
function
()
{
$
(
'.default-view-files table .check input'
).
prop
(
'checked'
,
this
.
checked
);
});
$
(
'.default-view-files table .check input'
).
click
(
function
()
{
$checkAll
.
prop
(
'checked'
,
!
$
(
'.default-view-files table .check input:not(:checked)'
).
length
);
});
$checkAll
.
prop
(
'checked'
,
!
$
(
'.default-view-files table .check input:not(:checked)'
).
length
);
};
return
{
autocomplete
:
function
(
counter
,
data
)
{
var
datum
=
new
Bloodhound
({
datumTokenizer
:
function
(
d
){
return
Bloodhound
.
tokenizers
.
whitespace
(
d
.
word
);},
queryTokenizer
:
Bloodhound
.
tokenizers
.
whitespace
,
local
:
data
});
datum
.
initialize
();
jQuery
(
'.typeahead-'
+
counter
).
typeahead
(
null
,{
displayKey
:
'word'
,
source
:
datum
.
ttAdapter
()});
},
init
:
function
()
{
initHintBlocks
();
initStickyInputs
();
initPreviewDiffLinks
();
initConfirmationCheckboxes
();
return
{
autocomplete
:
function
(
counter
,
data
)
{
var
datum
=
new
Bloodhound
({
datumTokenizer
:
function
(
d
)
{
return
Bloodhound
.
tokenizers
.
whitespace
(
d
.
word
);
},
queryTokenizer
:
Bloodhound
.
tokenizers
.
whitespace
,
local
:
data
});
datum
.
initialize
();
jQuery
(
'.typeahead-'
+
counter
).
typeahead
(
null
,
{
displayKey
:
'word'
,
source
:
datum
.
ttAdapter
()});
},
init
:
function
()
{
initHintBlocks
();
initStickyInputs
();
initPreviewDiffLinks
();
initConfirmationCheckboxes
();
// model generator: hide class name input when table name input contains *
$
(
'#model-generator #generator-tablename'
).
on
(
'change'
,
function
()
{
$
(
'#model-generator .field-generator-modelclass'
).
toggle
(
$
(
this
).
val
().
indexOf
(
'*'
)
==
-
1
);
}).
change
();
// model generator: hide class name input when table name input contains *
$
(
'#model-generator #generator-tablename'
).
on
(
'change'
,
function
()
{
$
(
'#model-generator .field-generator-modelclass'
).
toggle
(
$
(
this
).
val
().
indexOf
(
'*'
)
==
-
1
);
}).
change
();
// hide Generate button if any input is changed
$
(
'.default-view .form-group input,select,textarea'
).
change
(
function
()
{
$
(
'.default-view-results,.default-view-files'
).
hide
();
$
(
'.default-view button[name="generate"]'
).
hide
();
});
// hide Generate button if any input is changed
$
(
'.default-view .form-group input,select,textarea'
).
change
(
function
()
{
$
(
'.default-view-results,.default-view-files'
).
hide
();
$
(
'.default-view button[name="generate"]'
).
hide
();
});
$
(
'.module-form #generator-moduleclass'
).
change
(
function
()
{
var
value
=
$
(
this
).
val
().
match
(
/
(\w
+
)\\\w
+$/
);
var
$idInput
=
$
(
'#generator-moduleid'
);
if
(
value
&&
value
[
1
]
&&
$idInput
.
val
()
==
''
)
{
$idInput
.
val
(
value
[
1
]);
}
});
}
};
$
(
'.module-form #generator-moduleclass'
).
change
(
function
()
{
var
value
=
$
(
this
).
val
().
match
(
/
(\w
+
)\\\w
+$/
);
var
$idInput
=
$
(
'#generator-moduleid'
);
if
(
value
&&
value
[
1
]
&&
$idInput
.
val
()
==
''
)
{
$idInput
.
val
(
value
[
1
]);
}
});
}
};
})(
jQuery
);
framework/assets/yii.activeForm.js
View file @
7960ccdf
...
...
@@ -10,400 +10,400 @@
* @since 2.0
*/
(
function
(
$
)
{
$
.
fn
.
yiiActiveForm
=
function
(
method
)
{
if
(
methods
[
method
])
{
return
methods
[
method
].
apply
(
this
,
Array
.
prototype
.
slice
.
call
(
arguments
,
1
));
}
else
if
(
typeof
method
===
'object'
||
!
method
)
{
return
methods
.
init
.
apply
(
this
,
arguments
);
}
else
{
$
.
error
(
'Method '
+
method
+
' does not exist on jQuery.yiiActiveForm'
);
return
false
;
}
};
var
defaults
=
{
// the jQuery selector for the error summary
errorSummary
:
undefined
,
// whether to perform validation before submitting the form.
validateOnSubmit
:
true
,
// the container CSS class representing the corresponding attribute has validation error
errorCssClass
:
'error'
,
// the container CSS class representing the corresponding attribute passes validation
successCssClass
:
'success'
,
// the container CSS class representing the corresponding attribute is being validated
validatingCssClass
:
'validating'
,
// the URL for performing AJAX-based validation. If not set, it will use the the form's action
validationUrl
:
undefined
,
// a callback that is called before submitting the form. The signature of the callback should be:
// function ($form) { ...return false to cancel submission...}
beforeSubmit
:
undefined
,
// a callback that is called before validating each attribute. The signature of the callback should be:
// function ($form, attribute, messages) { ...return false to cancel the validation...}
beforeValidate
:
undefined
,
// a callback that is called after an attribute is validated. The signature of the callback should be:
// function ($form, attribute, messages)
afterValidate
:
undefined
,
// the GET parameter name indicating an AJAX-based validation
ajaxParam
:
'ajax'
,
// the type of data that you're expecting back from the server
ajaxDataType
:
'json'
};
$
.
fn
.
yiiActiveForm
=
function
(
method
)
{
if
(
methods
[
method
])
{
return
methods
[
method
].
apply
(
this
,
Array
.
prototype
.
slice
.
call
(
arguments
,
1
));
}
else
if
(
typeof
method
===
'object'
||
!
method
)
{
return
methods
.
init
.
apply
(
this
,
arguments
);
}
else
{
$
.
error
(
'Method '
+
method
+
' does not exist on jQuery.yiiActiveForm'
);
return
false
;
}
};
var
attributeDefaults
=
{
// attribute name or expression (e.g. "[0]content" for tabular input)
name
:
undefined
,
// the jQuery selector of the container of the input field
container
:
undefined
,
// the jQuery selector of the input field
input
:
undefined
,
// the jQuery selector of the error tag
error
:
undefined
,
// whether to perform validation when a change is detected on the input
validateOnChange
:
false
,
// whether to perform validation when the user is typing.
validateOnType
:
false
,
// number of milliseconds that the validation should be delayed when a user is typing in the input field.
validationDelay
:
200
,
// whether to enable AJAX-based validation.
enableAjaxValidation
:
false
,
// function (attribute, value, messages), the client-side validation function.
validate
:
undefined
,
// status of the input field, 0: empty, not entered before, 1: validated, 2: pending validation, 3: validating
status
:
0
,
// the value of the input
value
:
undefined
};
var
defaults
=
{
// the jQuery selector for the error summary
errorSummary
:
undefined
,
// whether to perform validation before submitting the form.
validateOnSubmit
:
true
,
// the container CSS class representing the corresponding attribute has validation error
errorCssClass
:
'error'
,
// the container CSS class representing the corresponding attribute passes validation
successCssClass
:
'success'
,
// the container CSS class representing the corresponding attribute is being validated
validatingCssClass
:
'validating'
,
// the URL for performing AJAX-based validation. If not set, it will use the the form's action
validationUrl
:
undefined
,
// a callback that is called before submitting the form. The signature of the callback should be:
// function ($form) { ...return false to cancel submission...}
beforeSubmit
:
undefined
,
// a callback that is called before validating each attribute. The signature of the callback should be:
// function ($form, attribute, messages) { ...return false to cancel the validation...}
beforeValidate
:
undefined
,
// a callback that is called after an attribute is validated. The signature of the callback should be:
// function ($form, attribute, messages)
afterValidate
:
undefined
,
// the GET parameter name indicating an AJAX-based validation
ajaxParam
:
'ajax'
,
// the type of data that you're expecting back from the server
ajaxDataType
:
'json'
};
var
methods
=
{
init
:
function
(
attributes
,
options
)
{
return
this
.
each
(
function
()
{
var
$form
=
$
(
this
);
if
(
$form
.
data
(
'yiiActiveForm'
))
{
return
;
}
var
attributeDefaults
=
{
// attribute name or expression (e.g. "[0]content" for tabular input)
name
:
undefined
,
// the jQuery selector of the container of the input field
container
:
undefined
,
// the jQuery selector of the input field
input
:
undefined
,
// the jQuery selector of the error tag
error
:
undefined
,
// whether to perform validation when a change is detected on the input
validateOnChange
:
false
,
// whether to perform validation when the user is typing.
validateOnType
:
false
,
// number of milliseconds that the validation should be delayed when a user is typing in the input field.
validationDelay
:
200
,
// whether to enable AJAX-based validation.
enableAjaxValidation
:
false
,
// function (attribute, value, messages), the client-side validation function.
validate
:
undefined
,
// status of the input field, 0: empty, not entered before, 1: validated, 2: pending validation, 3: validating
status
:
0
,
// the value of the input
value
:
undefined
};
var
settings
=
$
.
extend
({},
defaults
,
options
||
{});
if
(
settings
.
validationUrl
===
undefined
)
{
settings
.
validationUrl
=
$form
.
prop
(
'action'
);
}
$
.
each
(
attributes
,
function
(
i
)
{
attributes
[
i
]
=
$
.
extend
({
value
:
getValue
(
$form
,
this
)},
attributeDefaults
,
this
);
});
$form
.
data
(
'yiiActiveForm'
,
{
settings
:
settings
,
attributes
:
attributes
,
submitting
:
false
,
validated
:
false
});
var
methods
=
{
init
:
function
(
attributes
,
options
)
{
return
this
.
each
(
function
()
{
var
$form
=
$
(
this
);
if
(
$form
.
data
(
'yiiActiveForm'
))
{
return
;
}
watchAttributes
(
$form
,
attributes
);
var
settings
=
$
.
extend
({},
defaults
,
options
||
{});
if
(
settings
.
validationUrl
===
undefined
)
{
settings
.
validationUrl
=
$form
.
prop
(
'action'
);
}
$
.
each
(
attributes
,
function
(
i
)
{
attributes
[
i
]
=
$
.
extend
({
value
:
getValue
(
$form
,
this
)},
attributeDefaults
,
this
);
});
$form
.
data
(
'yiiActiveForm'
,
{
settings
:
settings
,
attributes
:
attributes
,
submitting
:
false
,
validated
:
false
});
/**
* Clean up error status when the form is reset.
* Note that $form.on('reset', ...) does work because the "reset" event does not bubble on IE.
*/
$form
.
bind
(
'reset.yiiActiveForm'
,
methods
.
resetForm
);
watchAttributes
(
$form
,
attributes
);
if
(
settings
.
validateOnSubmit
)
{
$form
.
on
(
'mouseup.yiiActiveForm keyup.yiiActiveForm'
,
':submit'
,
function
()
{
$form
.
data
(
'yiiActiveForm'
).
submitObject
=
$
(
this
);
});
$form
.
on
(
'submit'
,
methods
.
submitForm
);
}
});
},
/**
* Clean up error status when the form is reset.
* Note that $form.on('reset', ...) does work because the "reset" event does not bubble on IE.
*/
$form
.
bind
(
'reset.yiiActiveForm'
,
methods
.
resetForm
);
destroy
:
function
()
{
return
this
.
each
(
function
()
{
$
(
window
).
unbind
(
'.yiiActiveForm'
);
$
(
this
).
removeData
(
'yiiActiveForm'
);
});
},
if
(
settings
.
validateOnSubmit
)
{
$form
.
on
(
'mouseup.yiiActiveForm keyup.yiiActiveForm'
,
':submit'
,
function
()
{
$form
.
data
(
'yiiActiveForm'
).
submitObject
=
$
(
this
);
});
$form
.
on
(
'submit'
,
methods
.
submitForm
);
}
});
},
data
:
function
()
{
return
this
.
data
(
'yiiActiveForm'
);
},
destroy
:
function
()
{
return
this
.
each
(
function
()
{
$
(
window
).
unbind
(
'.yiiActiveForm'
);
$
(
this
).
removeData
(
'yiiActiveForm'
);
});
},
submitForm
:
function
()
{
var
$form
=
$
(
this
),
data
=
$form
.
data
(
'yiiActiveForm'
);
if
(
data
.
validated
)
{
if
(
data
.
settings
.
beforeSubmit
!==
undefined
)
{
if
(
data
.
settings
.
beforeSubmit
(
$form
)
==
false
)
{
data
.
validated
=
false
;
data
.
submitting
=
false
;
return
false
;
}
}
// continue submitting the form since validation passes
return
true
;
}
data
:
function
()
{
return
this
.
data
(
'yiiActiveForm'
);
},
if
(
data
.
settings
.
timer
!==
undefined
)
{
clearTimeout
(
data
.
settings
.
timer
);
}
data
.
submitting
=
true
;
validate
(
$form
,
function
(
messages
)
{
var
errors
=
[];
$
.
each
(
data
.
attributes
,
function
()
{
if
(
updateInput
(
$form
,
this
,
messages
))
{
errors
.
push
(
this
.
input
);
}
});
updateSummary
(
$form
,
messages
);
if
(
errors
.
length
)
{
var
top
=
$form
.
find
(
errors
.
join
(
','
)).
first
().
offset
().
top
;
var
wtop
=
$
(
window
).
scrollTop
();
if
(
top
<
wtop
||
top
>
wtop
+
$
(
window
).
height
)
{
$
(
window
).
scrollTop
(
top
);
}
}
else
{
data
.
validated
=
true
;
var
$button
=
data
.
submitObject
||
$form
.
find
(
':submit:first'
);
// TODO: if the submission is caused by "change" event, it will not work
if
(
$button
.
length
)
{
$button
.
click
();
}
else
{
// no submit button in the form
$form
.
submit
();
}
return
;
}
data
.
submitting
=
false
;
},
function
()
{
data
.
submitting
=
false
;
});
return
false
;
},
submitForm
:
function
()
{
var
$form
=
$
(
this
),
data
=
$form
.
data
(
'yiiActiveForm'
);
if
(
data
.
validated
)
{
if
(
data
.
settings
.
beforeSubmit
!==
undefined
)
{
if
(
data
.
settings
.
beforeSubmit
(
$form
)
==
false
)
{
data
.
validated
=
false
;
data
.
submitting
=
false
;
return
false
;
}
}
// continue submitting the form since validation passes
return
true
;
}
resetForm
:
function
()
{
var
$form
=
$
(
this
);
var
data
=
$form
.
data
(
'yiiActiveForm'
);
// Because we bind directly to a form reset event instead of a reset button (that may not exist),
// when this function is executed form input values have not been reset yet.
// Therefore we do the actual reset work through setTimeout.
setTimeout
(
function
()
{
$
.
each
(
data
.
attributes
,
function
()
{
// Without setTimeout() we would get the input values that are not reset yet.
this
.
value
=
getValue
(
$form
,
this
);
this
.
status
=
0
;
var
$container
=
$form
.
find
(
this
.
container
);
$container
.
removeClass
(
data
.
settings
.
validatingCssClass
+
' '
+
data
.
settings
.
errorCssClass
+
' '
+
data
.
settings
.
successCssClass
);
$container
.
find
(
this
.
error
).
html
(
''
);
});
$form
.
find
(
data
.
settings
.
summary
).
hide
().
find
(
'ul'
).
html
(
''
);
},
1
);
}
};
if
(
data
.
settings
.
timer
!==
undefined
)
{
clearTimeout
(
data
.
settings
.
timer
);
}
data
.
submitting
=
true
;
validate
(
$form
,
function
(
messages
)
{
var
errors
=
[];
$
.
each
(
data
.
attributes
,
function
()
{
if
(
updateInput
(
$form
,
this
,
messages
))
{
errors
.
push
(
this
.
input
);
}
});
updateSummary
(
$form
,
messages
);
if
(
errors
.
length
)
{
var
top
=
$form
.
find
(
errors
.
join
(
','
)).
first
().
offset
().
top
;
var
wtop
=
$
(
window
).
scrollTop
();
if
(
top
<
wtop
||
top
>
wtop
+
$
(
window
).
height
)
{
$
(
window
).
scrollTop
(
top
);
}
}
else
{
data
.
validated
=
true
;
var
$button
=
data
.
submitObject
||
$form
.
find
(
':submit:first'
);
// TODO: if the submission is caused by "change" event, it will not work
if
(
$button
.
length
)
{
$button
.
click
();
}
else
{
// no submit button in the form
$form
.
submit
();
}
return
;
}
data
.
submitting
=
false
;
},
function
()
{
data
.
submitting
=
false
;
});
return
false
;
},
var
watchAttributes
=
function
(
$form
,
attributes
)
{
$
.
each
(
attributes
,
function
(
i
,
attribute
)
{
var
$input
=
findInput
(
$form
,
attribute
);
if
(
attribute
.
validateOnChange
)
{
$input
.
on
(
'change.yiiActiveForm'
,
function
()
{
validateAttribute
(
$form
,
attribute
,
false
);
}).
on
(
'blur.yiiActiveForm'
,
function
()
{
if
(
attribute
.
status
==
0
||
attribute
.
status
==
1
)
{
validateAttribute
(
$form
,
attribute
,
!
attribute
.
status
);
}
});
}
if
(
attribute
.
validateOnType
)
{
$input
.
on
(
'keyup.yiiActiveForm'
,
function
()
{
if
(
attribute
.
value
!==
getValue
(
$form
,
attribute
))
{
validateAttribute
(
$form
,
attribute
,
false
);
}
});
}
});
};
resetForm
:
function
()
{
var
$form
=
$
(
this
);
var
data
=
$form
.
data
(
'yiiActiveForm'
);
// Because we bind directly to a form reset event instead of a reset button (that may not exist),
// when this function is executed form input values have not been reset yet.
// Therefore we do the actual reset work through setTimeout.
setTimeout
(
function
()
{
$
.
each
(
data
.
attributes
,
function
()
{
// Without setTimeout() we would get the input values that are not reset yet.
this
.
value
=
getValue
(
$form
,
this
);
this
.
status
=
0
;
var
$container
=
$form
.
find
(
this
.
container
);
$container
.
removeClass
(
data
.
settings
.
validatingCssClass
+
' '
+
data
.
settings
.
errorCssClass
+
' '
+
data
.
settings
.
successCssClass
);
$container
.
find
(
this
.
error
).
html
(
''
);
});
$form
.
find
(
data
.
settings
.
summary
).
hide
().
find
(
'ul'
).
html
(
''
);
},
1
);
}
};
var
validateAttribute
=
function
(
$form
,
attribute
,
forceValidate
)
{
var
data
=
$form
.
data
(
'yiiActiveForm'
);
var
watchAttributes
=
function
(
$form
,
attributes
)
{
$
.
each
(
attributes
,
function
(
i
,
attribute
)
{
var
$input
=
findInput
(
$form
,
attribute
);
if
(
attribute
.
validateOnChange
)
{
$input
.
on
(
'change.yiiActiveForm'
,
function
()
{
validateAttribute
(
$form
,
attribute
,
false
);
}).
on
(
'blur.yiiActiveForm'
,
function
()
{
if
(
attribute
.
status
==
0
||
attribute
.
status
==
1
)
{
validateAttribute
(
$form
,
attribute
,
!
attribute
.
status
);
}
});
}
if
(
attribute
.
validateOnType
)
{
$input
.
on
(
'keyup.yiiActiveForm'
,
function
()
{
if
(
attribute
.
value
!==
getValue
(
$form
,
attribute
))
{
validateAttribute
(
$form
,
attribute
,
false
);
}
});
}
});
};
if
(
forceValidate
)
{
attribute
.
status
=
2
;
}
$
.
each
(
data
.
attributes
,
function
()
{
if
(
this
.
value
!==
getValue
(
$form
,
this
))
{
this
.
status
=
2
;
forceValidate
=
true
;
}
});
if
(
!
forceValidate
)
{
return
;
}
var
validateAttribute
=
function
(
$form
,
attribute
,
forceValidate
)
{
var
data
=
$form
.
data
(
'yiiActiveForm'
);
if
(
data
.
settings
.
timer
!==
undefined
)
{
clearTimeout
(
data
.
settings
.
timer
);
}
data
.
settings
.
timer
=
setTimeout
(
function
()
{
if
(
data
.
submitting
||
$form
.
is
(
':hidden'
))
{
return
;
}
$
.
each
(
data
.
attributes
,
function
()
{
if
(
this
.
status
===
2
)
{
this
.
status
=
3
;
$form
.
find
(
this
.
container
).
addClass
(
data
.
settings
.
validatingCssClass
);
}
});
validate
(
$form
,
function
(
messages
)
{
var
hasError
=
false
;
$
.
each
(
data
.
attributes
,
function
()
{
if
(
this
.
status
===
2
||
this
.
status
===
3
)
{
hasError
=
updateInput
(
$form
,
this
,
messages
)
||
hasError
;
}
});
});
},
data
.
settings
.
validationDelay
);
};
/**
* Performs validation.
* @param $form jQuery the jquery representation of the form
* @param successCallback function the function to be invoked if the validation completes
* @param errorCallback function the function to be invoked if the ajax validation request fails
*/
var
validate
=
function
(
$form
,
successCallback
,
errorCallback
)
{
var
data
=
$form
.
data
(
'yiiActiveForm'
),
needAjaxValidation
=
false
,
messages
=
{};
if
(
forceValidate
)
{
attribute
.
status
=
2
;
}
$
.
each
(
data
.
attributes
,
function
()
{
if
(
this
.
value
!==
getValue
(
$form
,
this
))
{
this
.
status
=
2
;
forceValidate
=
true
;
}
});
if
(
!
forceValidate
)
{
return
;
}
$
.
each
(
data
.
attributes
,
function
()
{
if
(
data
.
submitting
||
this
.
status
===
2
||
this
.
status
===
3
)
{
var
msg
=
[];
if
(
!
data
.
settings
.
beforeValidate
||
data
.
settings
.
beforeValidate
(
$form
,
this
,
msg
))
{
if
(
this
.
validate
)
{
this
.
validate
(
this
,
getValue
(
$form
,
this
),
msg
);
}
if
(
msg
.
length
)
{
messages
[
this
.
name
]
=
msg
;
}
else
if
(
this
.
enableAjaxValidation
)
{
needAjaxValidation
=
true
;
}
}
}
});
if
(
data
.
settings
.
timer
!==
undefined
)
{
clearTimeout
(
data
.
settings
.
timer
);
}
data
.
settings
.
timer
=
setTimeout
(
function
()
{
if
(
data
.
submitting
||
$form
.
is
(
':hidden'
))
{
return
;
}
$
.
each
(
data
.
attributes
,
function
()
{
if
(
this
.
status
===
2
)
{
this
.
status
=
3
;
$form
.
find
(
this
.
container
).
addClass
(
data
.
settings
.
validatingCssClass
);
}
});
validate
(
$form
,
function
(
messages
)
{
var
hasError
=
false
;
$
.
each
(
data
.
attributes
,
function
()
{
if
(
this
.
status
===
2
||
this
.
status
===
3
)
{
hasError
=
updateInput
(
$form
,
this
,
messages
)
||
hasError
;
}
});
});
},
data
.
settings
.
validationDelay
);
};
if
(
needAjaxValidation
&&
(
!
data
.
submitting
||
$
.
isEmptyObject
(
messages
)))
{
// Perform ajax validation when at least one input needs it.
// If the validation is triggered by form submission, ajax validation
// should be done only when all inputs pass client validation
var
$button
=
data
.
submitObject
,
extData
=
'&'
+
data
.
settings
.
ajaxParam
+
'='
+
$form
.
prop
(
'id'
);
if
(
$button
&&
$button
.
length
&&
$button
.
prop
(
'name'
))
{
extData
+=
'&'
+
$button
.
prop
(
'name'
)
+
'='
+
$button
.
prop
(
'value'
);
}
$
.
ajax
({
url
:
data
.
settings
.
validationUrl
,
type
:
$form
.
prop
(
'method'
),
data
:
$form
.
serialize
()
+
extData
,
dataType
:
data
.
settings
.
ajaxDataType
,
success
:
function
(
msgs
)
{
if
(
msgs
!==
null
&&
typeof
msgs
===
'object'
)
{
$
.
each
(
data
.
attributes
,
function
()
{
if
(
!
this
.
enableAjaxValidation
)
{
delete
msgs
[
this
.
name
];
}
});
successCallback
(
$
.
extend
({},
messages
,
msgs
));
}
else
{
successCallback
(
messages
);
}
},
error
:
errorCallback
});
}
else
if
(
data
.
submitting
)
{
// delay callback so that the form can be submitted without problem
setTimeout
(
function
()
{
successCallback
(
messages
);
},
200
);
}
else
{
successCallback
(
messages
);
}
};
/**
* Performs validation.
* @param $form jQuery the jquery representation of the form
* @param successCallback function the function to be invoked if the validation completes
* @param errorCallback function the function to be invoked if the ajax validation request fails
*/
var
validate
=
function
(
$form
,
successCallback
,
errorCallback
)
{
var
data
=
$form
.
data
(
'yiiActiveForm'
),
needAjaxValidation
=
false
,
messages
=
{};
/**
* Updates the error message and the input container for a particular attribute.
* @param $form the form jQuery object
* @param attribute object the configuration for a particular attribute.
* @param messages array the validation error messages
* @return boolean whether there is a validation error for the specified attribute
*/
var
updateInput
=
function
(
$form
,
attribute
,
messages
)
{
var
data
=
$form
.
data
(
'yiiActiveForm'
),
$input
=
findInput
(
$form
,
attribute
),
hasError
=
false
;
$
.
each
(
data
.
attributes
,
function
()
{
if
(
data
.
submitting
||
this
.
status
===
2
||
this
.
status
===
3
)
{
var
msg
=
[];
if
(
!
data
.
settings
.
beforeValidate
||
data
.
settings
.
beforeValidate
(
$form
,
this
,
msg
))
{
if
(
this
.
validate
)
{
this
.
validate
(
this
,
getValue
(
$form
,
this
),
msg
);
}
if
(
msg
.
length
)
{
messages
[
this
.
name
]
=
msg
;
}
else
if
(
this
.
enableAjaxValidation
)
{
needAjaxValidation
=
true
;
}
}
}
});
if
(
data
.
settings
.
afterValidate
)
{
data
.
settings
.
afterValidate
(
$form
,
attribute
,
messages
);
}
attribute
.
status
=
1
;
if
(
$input
.
length
)
{
hasError
=
messages
&&
$
.
isArray
(
messages
[
attribute
.
name
])
&&
messages
[
attribute
.
name
].
length
;
var
$container
=
$form
.
find
(
attribute
.
container
);
var
$error
=
$container
.
find
(
attribute
.
error
);
if
(
hasError
)
{
$error
.
text
(
messages
[
attribute
.
name
][
0
]);
$container
.
removeClass
(
data
.
settings
.
validatingCssClass
+
' '
+
data
.
settings
.
successCssClass
)
.
addClass
(
data
.
settings
.
errorCssClass
);
}
else
{
$error
.
text
(
''
);
$container
.
removeClass
(
data
.
settings
.
validatingCssClass
+
' '
+
data
.
settings
.
errorCssClass
+
' '
)
.
addClass
(
data
.
settings
.
successCssClass
);
}
attribute
.
value
=
getValue
(
$form
,
attribute
);
}
return
hasError
;
};
if
(
needAjaxValidation
&&
(
!
data
.
submitting
||
$
.
isEmptyObject
(
messages
)))
{
// Perform ajax validation when at least one input needs it.
// If the validation is triggered by form submission, ajax validation
// should be done only when all inputs pass client validation
var
$button
=
data
.
submitObject
,
extData
=
'&'
+
data
.
settings
.
ajaxParam
+
'='
+
$form
.
prop
(
'id'
);
if
(
$button
&&
$button
.
length
&&
$button
.
prop
(
'name'
))
{
extData
+=
'&'
+
$button
.
prop
(
'name'
)
+
'='
+
$button
.
prop
(
'value'
);
}
$
.
ajax
({
url
:
data
.
settings
.
validationUrl
,
type
:
$form
.
prop
(
'method'
),
data
:
$form
.
serialize
()
+
extData
,
dataType
:
data
.
settings
.
ajaxDataType
,
success
:
function
(
msgs
)
{
if
(
msgs
!==
null
&&
typeof
msgs
===
'object'
)
{
$
.
each
(
data
.
attributes
,
function
()
{
if
(
!
this
.
enableAjaxValidation
)
{
delete
msgs
[
this
.
name
];
}
});
successCallback
(
$
.
extend
({},
messages
,
msgs
));
}
else
{
successCallback
(
messages
);
}
},
error
:
errorCallback
});
}
else
if
(
data
.
submitting
)
{
// delay callback so that the form can be submitted without problem
setTimeout
(
function
()
{
successCallback
(
messages
);
},
200
);
}
else
{
successCallback
(
messages
);
}
};
/**
* Updates the error summary.
* @param $form the form jQuery object
* @param messages array the validation error messages
*/
var
updateSummary
=
function
(
$form
,
messages
)
{
var
data
=
$form
.
data
(
'yiiActiveForm'
),
$summary
=
$form
.
find
(
data
.
settings
.
errorSummary
),
$ul
=
$summary
.
find
(
'ul'
).
html
(
''
);
/**
* Updates the error message and the input container for a particular attribute.
* @param $form the form jQuery object
* @param attribute object the configuration for a particular attribute.
* @param messages array the validation error messages
* @return boolean whether there is a validation error for the specified attribute
*/
var
updateInput
=
function
(
$form
,
attribute
,
messages
)
{
var
data
=
$form
.
data
(
'yiiActiveForm'
),
$input
=
findInput
(
$form
,
attribute
),
hasError
=
false
;
if
(
$summary
.
length
&&
messages
)
{
$
.
each
(
data
.
attributes
,
function
()
{
if
(
$
.
isArray
(
messages
[
this
.
name
])
&&
messages
[
this
.
name
].
length
)
{
$ul
.
append
(
$
(
'<li/>'
).
text
(
messages
[
this
.
name
][
0
]));
}
});
$summary
.
toggle
(
$ul
.
find
(
'li'
).
length
>
0
);
}
};
if
(
data
.
settings
.
afterValidate
)
{
data
.
settings
.
afterValidate
(
$form
,
attribute
,
messages
);
}
attribute
.
status
=
1
;
if
(
$input
.
length
)
{
hasError
=
messages
&&
$
.
isArray
(
messages
[
attribute
.
name
])
&&
messages
[
attribute
.
name
].
length
;
var
$container
=
$form
.
find
(
attribute
.
container
);
var
$error
=
$container
.
find
(
attribute
.
error
);
if
(
hasError
)
{
$error
.
text
(
messages
[
attribute
.
name
][
0
]);
$container
.
removeClass
(
data
.
settings
.
validatingCssClass
+
' '
+
data
.
settings
.
successCssClass
)
.
addClass
(
data
.
settings
.
errorCssClass
);
}
else
{
$error
.
text
(
''
);
$container
.
removeClass
(
data
.
settings
.
validatingCssClass
+
' '
+
data
.
settings
.
errorCssClass
+
' '
)
.
addClass
(
data
.
settings
.
successCssClass
);
}
attribute
.
value
=
getValue
(
$form
,
attribute
);
}
return
hasError
;
};
var
getValue
=
function
(
$form
,
attribute
)
{
var
$input
=
findInput
(
$form
,
attribute
);
var
type
=
$input
.
prop
(
'type'
);
if
(
type
===
'checkbox'
||
type
===
'radio'
)
{
var
$realInput
=
$input
.
filter
(
':checked'
);
if
(
!
$realInput
.
length
)
{
$realInput
=
$form
.
find
(
'input[type=hidden][name="'
+
$input
.
prop
(
'name'
)
+
'"]'
);
}
return
$realInput
.
val
();
}
else
{
return
$input
.
val
();
}
};
/**
* Updates the error summary.
* @param $form the form jQuery object
* @param messages array the validation error messages
*/
var
updateSummary
=
function
(
$form
,
messages
)
{
var
data
=
$form
.
data
(
'yiiActiveForm'
),
$summary
=
$form
.
find
(
data
.
settings
.
errorSummary
),
$ul
=
$summary
.
find
(
'ul'
).
html
(
''
);
var
findInput
=
function
(
$form
,
attribute
)
{
var
$input
=
$form
.
find
(
attribute
.
input
);
if
(
$input
.
length
&&
$input
[
0
].
tagName
.
toLowerCase
()
===
'div'
)
{
// checkbox list or radio list
return
$input
.
find
(
'input'
);
}
else
{
return
$input
;
}
};
if
(
$summary
.
length
&&
messages
)
{
$
.
each
(
data
.
attributes
,
function
()
{
if
(
$
.
isArray
(
messages
[
this
.
name
])
&&
messages
[
this
.
name
].
length
)
{
$ul
.
append
(
$
(
'<li/>'
).
text
(
messages
[
this
.
name
][
0
]));
}
});
$summary
.
toggle
(
$ul
.
find
(
'li'
).
length
>
0
);
}
};
var
getValue
=
function
(
$form
,
attribute
)
{
var
$input
=
findInput
(
$form
,
attribute
);
var
type
=
$input
.
prop
(
'type'
);
if
(
type
===
'checkbox'
||
type
===
'radio'
)
{
var
$realInput
=
$input
.
filter
(
':checked'
);
if
(
!
$realInput
.
length
)
{
$realInput
=
$form
.
find
(
'input[type=hidden][name="'
+
$input
.
prop
(
'name'
)
+
'"]'
);
}
return
$realInput
.
val
();
}
else
{
return
$input
.
val
();
}
};
var
findInput
=
function
(
$form
,
attribute
)
{
var
$input
=
$form
.
find
(
attribute
.
input
);
if
(
$input
.
length
&&
$input
[
0
].
tagName
.
toLowerCase
()
===
'div'
)
{
// checkbox list or radio list
return
$input
.
find
(
'input'
);
}
else
{
return
$input
;
}
};
})(
window
.
jQuery
);
framework/assets/yii.captcha.js
View file @
7960ccdf
...
...
@@ -10,63 +10,63 @@
* @since 2.0
*/
(
function
(
$
)
{
$
.
fn
.
yiiCaptcha
=
function
(
method
)
{
if
(
methods
[
method
])
{
return
methods
[
method
].
apply
(
this
,
Array
.
prototype
.
slice
.
call
(
arguments
,
1
));
}
else
if
(
typeof
method
===
'object'
||
!
method
)
{
return
methods
.
init
.
apply
(
this
,
arguments
);
}
else
{
$
.
error
(
'Method '
+
method
+
' does not exist on jQuery.yiiCaptcha'
);
return
false
;
}
};
$
.
fn
.
yiiCaptcha
=
function
(
method
)
{
if
(
methods
[
method
])
{
return
methods
[
method
].
apply
(
this
,
Array
.
prototype
.
slice
.
call
(
arguments
,
1
));
}
else
if
(
typeof
method
===
'object'
||
!
method
)
{
return
methods
.
init
.
apply
(
this
,
arguments
);
}
else
{
$
.
error
(
'Method '
+
method
+
' does not exist on jQuery.yiiCaptcha'
);
return
false
;
}
};
var
defaults
=
{
refreshUrl
:
undefined
,
hashKey
:
undefined
};
var
defaults
=
{
refreshUrl
:
undefined
,
hashKey
:
undefined
};
var
methods
=
{
init
:
function
(
options
)
{
return
this
.
each
(
function
()
{
var
$e
=
$
(
this
);
var
settings
=
$
.
extend
({},
defaults
,
options
||
{});
$e
.
data
(
'yiiCaptcha'
,
{
settings
:
settings
});
var
methods
=
{
init
:
function
(
options
)
{
return
this
.
each
(
function
()
{
var
$e
=
$
(
this
);
var
settings
=
$
.
extend
({},
defaults
,
options
||
{});
$e
.
data
(
'yiiCaptcha'
,
{
settings
:
settings
});
$e
.
on
(
'click.yiiCaptcha'
,
function
()
{
methods
.
refresh
.
apply
(
$e
);
return
false
;
});
$e
.
on
(
'click.yiiCaptcha'
,
function
()
{
methods
.
refresh
.
apply
(
$e
);
return
false
;
});
});
},
});
},
refresh
:
function
()
{
var
$e
=
this
,
settings
=
this
.
data
(
'yiiCaptcha'
).
settings
;
$
.
ajax
({
url
:
$e
.
data
(
'yiiCaptcha'
).
settings
.
refreshUrl
,
dataType
:
'json'
,
cache
:
false
,
success
:
function
(
data
)
{
$e
.
attr
(
'src'
,
data
.
url
);
$
(
'body'
).
data
(
settings
.
hashKey
,
[
data
.
hash1
,
data
.
hash2
]);
}
});
},
refresh
:
function
()
{
var
$e
=
this
,
settings
=
this
.
data
(
'yiiCaptcha'
).
settings
;
$
.
ajax
({
url
:
$e
.
data
(
'yiiCaptcha'
).
settings
.
refreshUrl
,
dataType
:
'json'
,
cache
:
false
,
success
:
function
(
data
)
{
$e
.
attr
(
'src'
,
data
.
url
);
$
(
'body'
).
data
(
settings
.
hashKey
,
[
data
.
hash1
,
data
.
hash2
]);
}
});
},
destroy
:
function
()
{
return
this
.
each
(
function
()
{
$
(
window
).
unbind
(
'.yiiCaptcha'
);
$
(
this
).
removeData
(
'yiiCaptcha'
);
});
},
destroy
:
function
()
{
return
this
.
each
(
function
()
{
$
(
window
).
unbind
(
'.yiiCaptcha'
);
$
(
this
).
removeData
(
'yiiCaptcha'
);
});
},
data
:
function
()
{
return
this
.
data
(
'yiiCaptcha'
);
}
};
data
:
function
()
{
return
this
.
data
(
'yiiCaptcha'
);
}
};
})(
window
.
jQuery
);
framework/assets/yii.gridView.js
View file @
7960ccdf
...
...
@@ -10,120 +10,120 @@
* @since 2.0
*/
(
function
(
$
)
{
$
.
fn
.
yiiGridView
=
function
(
method
)
{
if
(
methods
[
method
])
{
return
methods
[
method
].
apply
(
this
,
Array
.
prototype
.
slice
.
call
(
arguments
,
1
));
}
else
if
(
typeof
method
===
'object'
||
!
method
)
{
return
methods
.
init
.
apply
(
this
,
arguments
);
}
else
{
$
.
error
(
'Method '
+
method
+
' does not exist on jQuery.yiiGridView'
);
return
false
;
}
};
$
.
fn
.
yiiGridView
=
function
(
method
)
{
if
(
methods
[
method
])
{
return
methods
[
method
].
apply
(
this
,
Array
.
prototype
.
slice
.
call
(
arguments
,
1
));
}
else
if
(
typeof
method
===
'object'
||
!
method
)
{
return
methods
.
init
.
apply
(
this
,
arguments
);
}
else
{
$
.
error
(
'Method '
+
method
+
' does not exist on jQuery.yiiGridView'
);
return
false
;
}
};
var
defaults
=
{
filterUrl
:
undefined
,
filterSelector
:
undefined
};
var
defaults
=
{
filterUrl
:
undefined
,
filterSelector
:
undefined
};
var
gridData
=
{};
var
gridData
=
{};
var
methods
=
{
init
:
function
(
options
)
{
return
this
.
each
(
function
()
{
var
$e
=
$
(
this
);
var
settings
=
$
.
extend
({},
defaults
,
options
||
{});
gridData
[
$e
.
prop
(
'id'
)]
=
{
settings
:
settings
};
var
methods
=
{
init
:
function
(
options
)
{
return
this
.
each
(
function
()
{
var
$e
=
$
(
this
);
var
settings
=
$
.
extend
({},
defaults
,
options
||
{});
gridData
[
$e
.
prop
(
'id'
)]
=
{
settings
:
settings
};
var
enterPressed
=
false
;
$
(
document
).
off
(
'change.yiiGridView keydown.yiiGridView'
,
settings
.
filterSelector
)
.
on
(
'change.yiiGridView keydown.yiiGridView'
,
settings
.
filterSelector
,
function
(
event
)
{
if
(
event
.
type
===
'keydown'
)
{
if
(
event
.
keyCode
!==
13
)
{
return
;
// only react to enter key
}
else
{
enterPressed
=
true
;
}
}
else
{
// prevent processing for both keydown and change events
if
(
enterPressed
)
{
enterPressed
=
false
;
return
;
}
}
var
enterPressed
=
false
;
$
(
document
).
off
(
'change.yiiGridView keydown.yiiGridView'
,
settings
.
filterSelector
)
.
on
(
'change.yiiGridView keydown.yiiGridView'
,
settings
.
filterSelector
,
function
(
event
)
{
if
(
event
.
type
===
'keydown'
)
{
if
(
event
.
keyCode
!==
13
)
{
return
;
// only react to enter key
}
else
{
enterPressed
=
true
;
}
}
else
{
// prevent processing for both keydown and change events
if
(
enterPressed
)
{
enterPressed
=
false
;
return
;
}
}
methods
.
applyFilter
.
apply
(
$e
);
methods
.
applyFilter
.
apply
(
$e
);
return
false
;
});
});
},
return
false
;
});
});
},
applyFilter
:
function
()
{
var
$grid
=
$
(
this
);
var
settings
=
gridData
[
$grid
.
prop
(
'id'
)].
settings
;
var
data
=
{};
$
.
each
(
$
(
settings
.
filterSelector
).
serializeArray
(),
function
()
{
data
[
this
.
name
]
=
this
.
value
;
});
applyFilter
:
function
()
{
var
$grid
=
$
(
this
);
var
settings
=
gridData
[
$grid
.
prop
(
'id'
)].
settings
;
var
data
=
{};
$
.
each
(
$
(
settings
.
filterSelector
).
serializeArray
(),
function
()
{
data
[
this
.
name
]
=
this
.
value
;
});
$
.
each
(
yii
.
getQueryParams
(
settings
.
filterUrl
),
function
(
name
,
value
)
{
if
(
data
[
name
]
===
undefined
)
{
data
[
name
]
=
value
;
}
});
$
.
each
(
yii
.
getQueryParams
(
settings
.
filterUrl
),
function
(
name
,
value
)
{
if
(
data
[
name
]
===
undefined
)
{
data
[
name
]
=
value
;
}
});
var
pos
=
settings
.
filterUrl
.
indexOf
(
'?'
);
var
url
=
pos
<
0
?
settings
.
filterUrl
:
settings
.
filterUrl
.
substring
(
0
,
pos
);
var
pos
=
settings
.
filterUrl
.
indexOf
(
'?'
);
var
url
=
pos
<
0
?
settings
.
filterUrl
:
settings
.
filterUrl
.
substring
(
0
,
pos
);
$grid
.
find
(
'form.gridview-filter-form'
).
remove
();
var
$form
=
$
(
'<form action="'
+
url
+
'" method="get" class="gridview-filter-form" style="display:none" data-pjax></form>'
).
appendTo
(
$grid
);
$
.
each
(
data
,
function
(
name
,
value
)
{
$form
.
append
(
$
(
'<input type="hidden" name="t" value="" />'
).
attr
(
'name'
,
name
).
val
(
value
));
});
$form
.
submit
();
},
$grid
.
find
(
'form.gridview-filter-form'
).
remove
();
var
$form
=
$
(
'<form action="'
+
url
+
'" method="get" class="gridview-filter-form" style="display:none" data-pjax></form>'
).
appendTo
(
$grid
);
$
.
each
(
data
,
function
(
name
,
value
)
{
$form
.
append
(
$
(
'<input type="hidden" name="t" value="" />'
).
attr
(
'name'
,
name
).
val
(
value
));
});
$form
.
submit
();
},
setSelectionColumn
:
function
(
options
)
{
var
$grid
=
$
(
this
);
var
id
=
$
(
this
).
prop
(
'id'
);
gridData
[
id
].
selectionColumn
=
options
.
name
;
if
(
!
options
.
multiple
)
{
return
;
}
var
inputs
=
"#"
+
id
+
" input[name='"
+
options
.
checkAll
+
"']"
;
$
(
document
).
off
(
'click.yiiGridView'
,
inputs
).
on
(
'click.yiiGridView'
,
inputs
,
function
()
{
$grid
.
find
(
"input[name='"
+
options
.
name
+
"']:enabled"
).
prop
(
'checked'
,
this
.
checked
);
});
$
(
document
).
off
(
'click.yiiGridView'
,
inputs
+
":enabled"
).
on
(
'click.yiiGridView'
,
inputs
+
":enabled"
,
function
()
{
var
all
=
$grid
.
find
(
"input[name='"
+
options
.
name
+
"']"
).
length
==
$grid
.
find
(
"input[name='"
+
options
.
name
+
"']:checked"
).
length
;
$grid
.
find
(
"input[name='"
+
options
.
checkAll
+
"']"
).
prop
(
'checked'
,
all
);
});
},
setSelectionColumn
:
function
(
options
)
{
var
$grid
=
$
(
this
);
var
id
=
$
(
this
).
prop
(
'id'
);
gridData
[
id
].
selectionColumn
=
options
.
name
;
if
(
!
options
.
multiple
)
{
return
;
}
var
inputs
=
"#"
+
id
+
" input[name='"
+
options
.
checkAll
+
"']"
;
$
(
document
).
off
(
'click.yiiGridView'
,
inputs
).
on
(
'click.yiiGridView'
,
inputs
,
function
()
{
$grid
.
find
(
"input[name='"
+
options
.
name
+
"']:enabled"
).
prop
(
'checked'
,
this
.
checked
);
});
$
(
document
).
off
(
'click.yiiGridView'
,
inputs
+
":enabled"
).
on
(
'click.yiiGridView'
,
inputs
+
":enabled"
,
function
()
{
var
all
=
$grid
.
find
(
"input[name='"
+
options
.
name
+
"']"
).
length
==
$grid
.
find
(
"input[name='"
+
options
.
name
+
"']:checked"
).
length
;
$grid
.
find
(
"input[name='"
+
options
.
checkAll
+
"']"
).
prop
(
'checked'
,
all
);
});
},
getSelectedRows
:
function
()
{
var
$grid
=
$
(
this
);
var
data
=
gridData
[
$grid
.
prop
(
'id'
)];
var
keys
=
[];
if
(
data
.
selectionColumn
)
{
$grid
.
find
(
"input[name='"
+
data
.
selectionColumn
+
"']:checked"
).
each
(
function
()
{
keys
.
push
(
$
(
this
).
parent
().
closest
(
'tr'
).
data
(
'key'
));
});
}
return
keys
;
},
getSelectedRows
:
function
()
{
var
$grid
=
$
(
this
);
var
data
=
gridData
[
$grid
.
prop
(
'id'
)];
var
keys
=
[];
if
(
data
.
selectionColumn
)
{
$grid
.
find
(
"input[name='"
+
data
.
selectionColumn
+
"']:checked"
).
each
(
function
()
{
keys
.
push
(
$
(
this
).
parent
().
closest
(
'tr'
).
data
(
'key'
));
});
}
return
keys
;
},
destroy
:
function
()
{
return
this
.
each
(
function
()
{
$
(
window
).
unbind
(
'.yiiGridView'
);
$
(
this
).
removeData
(
'yiiGridView'
);
});
},
destroy
:
function
()
{
return
this
.
each
(
function
()
{
$
(
window
).
unbind
(
'.yiiGridView'
);
$
(
this
).
removeData
(
'yiiGridView'
);
});
},
data
:
function
()
{
var
id
=
$
(
this
).
prop
(
'id'
);
return
gridData
[
id
];
}
};
data
:
function
()
{
var
id
=
$
(
this
).
prop
(
'id'
);
return
gridData
[
id
];
}
};
})(
window
.
jQuery
);
framework/assets/yii.js
View file @
7960ccdf
...
...
@@ -42,220 +42,220 @@
* You must call "yii.initModule()" once for the root module of all your modules.
*/
yii
=
(
function
(
$
)
{
var
pub
=
{
/**
* List of scripts that can be loaded multiple times via AJAX requests. Each script can be represented
* as either an absolute URL or a relative one.
*/
reloadableScripts
:
[],
/**
* The selector for clickable elements that need to support confirmation and form submission.
*/
clickableSelector
:
'a, button, input[type="submit"], input[type="button"], input[type="reset"], input[type="image"]'
,
/**
* The selector for changeable elements that need to support confirmation and form submission.
*/
changeableSelector
:
'select, input, textarea'
,
var
pub
=
{
/**
* List of scripts that can be loaded multiple times via AJAX requests. Each script can be represented
* as either an absolute URL or a relative one.
*/
reloadableScripts
:
[],
/**
* The selector for clickable elements that need to support confirmation and form submission.
*/
clickableSelector
:
'a, button, input[type="submit"], input[type="button"], input[type="reset"], input[type="image"]'
,
/**
* The selector for changeable elements that need to support confirmation and form submission.
*/
changeableSelector
:
'select, input, textarea'
,
/**
* @return string|undefined the CSRF parameter name. Undefined is returned if CSRF validation is not enabled.
*/
getCsrfParam
:
function
()
{
return
$
(
'meta[name=csrf-param]'
).
prop
(
'content'
);
},
/**
* @return string|undefined the CSRF parameter name. Undefined is returned if CSRF validation is not enabled.
*/
getCsrfParam
:
function
()
{
return
$
(
'meta[name=csrf-param]'
).
prop
(
'content'
);
},
/**
* @return string|undefined the CSRF token. Undefined is returned if CSRF validation is not enabled.
*/
getCsrfToken
:
function
()
{
return
$
(
'meta[name=csrf-token]'
).
prop
(
'content'
);
},
/**
* @return string|undefined the CSRF token. Undefined is returned if CSRF validation is not enabled.
*/
getCsrfToken
:
function
()
{
return
$
(
'meta[name=csrf-token]'
).
prop
(
'content'
);
},
/**
* Displays a confirmation dialog.
* The default implementation simply displays a js confirmation dialog.
* You may override this by setting `yii.confirm`.
* @param message the confirmation message.
* @return boolean whether the user confirms with the message in the dialog
*/
confirm
:
function
(
message
)
{
return
confirm
(
message
);
},
/**
* Displays a confirmation dialog.
* The default implementation simply displays a js confirmation dialog.
* You may override this by setting `yii.confirm`.
* @param message the confirmation message.
* @return boolean whether the user confirms with the message in the dialog
*/
confirm
:
function
(
message
)
{
return
confirm
(
message
);
},
/**
* Returns a value indicating whether to allow executing the action defined for the specified element.
* This method recognizes the `data-confirm` attribute of the element and uses it
* as the message in a confirmation dialog. The method will return true if this special attribute
* is not defined or if the user confirms the message.
* @param $e the jQuery representation of the element
* @return boolean whether to allow executing the action defined for the specified element.
*/
allowAction
:
function
(
$e
)
{
var
message
=
$e
.
data
(
'confirm'
);
return
message
===
undefined
||
pub
.
confirm
(
message
);
},
/**
* Returns a value indicating whether to allow executing the action defined for the specified element.
* This method recognizes the `data-confirm` attribute of the element and uses it
* as the message in a confirmation dialog. The method will return true if this special attribute
* is not defined or if the user confirms the message.
* @param $e the jQuery representation of the element
* @return boolean whether to allow executing the action defined for the specified element.
*/
allowAction
:
function
(
$e
)
{
var
message
=
$e
.
data
(
'confirm'
);
return
message
===
undefined
||
pub
.
confirm
(
message
);
},
/**
* Handles the action triggered by user.
* This method recognizes the `data-method` attribute of the element. If the attribute exists,
* the method will submit the form containing this element. If there is no containing form, a form
* will be created and submitted using the method given by this attribute value (e.g. "post", "put").
* For hyperlinks, the form action will take the value of the "href" attribute of the link.
* For other elements, either the containing form action or the current page URL will be used
* as the form action URL.
*
* If the `data-method` attribute is not defined, the default element action will be performed.
*
* @param $e the jQuery representation of the element
* @return boolean whether to execute the default action for the element.
*/
handleAction
:
function
(
$e
)
{
var
method
=
$e
.
data
(
'method'
);
if
(
method
===
undefined
)
{
return
true
;
}
/**
* Handles the action triggered by user.
* This method recognizes the `data-method` attribute of the element. If the attribute exists,
* the method will submit the form containing this element. If there is no containing form, a form
* will be created and submitted using the method given by this attribute value (e.g. "post", "put").
* For hyperlinks, the form action will take the value of the "href" attribute of the link.
* For other elements, either the containing form action or the current page URL will be used
* as the form action URL.
*
* If the `data-method` attribute is not defined, the default element action will be performed.
*
* @param $e the jQuery representation of the element
* @return boolean whether to execute the default action for the element.
*/
handleAction
:
function
(
$e
)
{
var
method
=
$e
.
data
(
'method'
);
if
(
method
===
undefined
)
{
return
true
;
}
var
$form
=
$e
.
closest
(
'form'
);
var
newForm
=
!
$form
.
length
;
if
(
newForm
)
{
var
action
=
$e
.
prop
(
'href'
);
if
(
!
action
||
!
action
.
match
(
/
(
^
\/
|:
\/\/)
/
))
{
action
=
window
.
location
.
href
;
}
$form
=
$
(
'<form method="'
+
method
+
'" action="'
+
action
+
'"></form>'
);
var
target
=
$e
.
prop
(
'target'
);
if
(
target
)
{
$form
.
attr
(
'target'
,
target
);
}
if
(
!
method
.
match
(
/
(
get|post
)
/i
))
{
$form
.
append
(
'<input name="_method" value="'
+
method
+
'" type="hidden">'
);
}
var
csrfParam
=
pub
.
getCsrfParam
();
if
(
csrfParam
)
{
$form
.
append
(
'<input name="'
+
csrfParam
+
'" value="'
+
pub
.
getCsrfToken
()
+
'" type="hidden">'
);
}
$form
.
hide
().
appendTo
(
'body'
);
}
var
$form
=
$e
.
closest
(
'form'
);
var
newForm
=
!
$form
.
length
;
if
(
newForm
)
{
var
action
=
$e
.
prop
(
'href'
);
if
(
!
action
||
!
action
.
match
(
/
(
^
\/
|:
\/\/)
/
))
{
action
=
window
.
location
.
href
;
}
$form
=
$
(
'<form method="'
+
method
+
'" action="'
+
action
+
'"></form>'
);
var
target
=
$e
.
prop
(
'target'
);
if
(
target
)
{
$form
.
attr
(
'target'
,
target
);
}
if
(
!
method
.
match
(
/
(
get|post
)
/i
))
{
$form
.
append
(
'<input name="_method" value="'
+
method
+
'" type="hidden">'
);
}
var
csrfParam
=
pub
.
getCsrfParam
();
if
(
csrfParam
)
{
$form
.
append
(
'<input name="'
+
csrfParam
+
'" value="'
+
pub
.
getCsrfToken
()
+
'" type="hidden">'
);
}
$form
.
hide
().
appendTo
(
'body'
);
}
var
activeFormData
=
$form
.
data
(
'yiiActiveForm'
);
if
(
activeFormData
)
{
// remember who triggers the form submission. This is used by yii.activeForm.js
activeFormData
.
submitObject
=
$e
;
}
var
activeFormData
=
$form
.
data
(
'yiiActiveForm'
);
if
(
activeFormData
)
{
// remember who triggers the form submission. This is used by yii.activeForm.js
activeFormData
.
submitObject
=
$e
;
}
$form
.
trigger
(
'submit'
);
$form
.
trigger
(
'submit'
);
if
(
newForm
)
{
$form
.
remove
();
}
if
(
newForm
)
{
$form
.
remove
();
}
return
false
;
},
return
false
;
},
getQueryParams
:
function
(
url
)
{
var
pos
=
url
.
indexOf
(
'?'
);
if
(
pos
<
0
)
{
return
{};
}
var
qs
=
url
.
substring
(
pos
+
1
).
split
(
'&'
);
for
(
var
i
=
0
,
result
=
{};
i
<
qs
.
length
;
i
++
)
{
qs
[
i
]
=
qs
[
i
].
split
(
'='
);
result
[
decodeURIComponent
(
qs
[
i
][
0
])]
=
decodeURIComponent
(
qs
[
i
][
1
]);
}
return
result
;
},
getQueryParams
:
function
(
url
)
{
var
pos
=
url
.
indexOf
(
'?'
);
if
(
pos
<
0
)
{
return
{};
}
var
qs
=
url
.
substring
(
pos
+
1
).
split
(
'&'
);
for
(
var
i
=
0
,
result
=
{};
i
<
qs
.
length
;
i
++
)
{
qs
[
i
]
=
qs
[
i
].
split
(
'='
);
result
[
decodeURIComponent
(
qs
[
i
][
0
])]
=
decodeURIComponent
(
qs
[
i
][
1
]);
}
return
result
;
},
initModule
:
function
(
module
)
{
if
(
module
.
isActive
===
undefined
||
module
.
isActive
)
{
if
(
$
.
isFunction
(
module
.
init
))
{
module
.
init
();
}
$
.
each
(
module
,
function
()
{
if
(
$
.
isPlainObject
(
this
))
{
pub
.
initModule
(
this
);
}
});
}
},
initModule
:
function
(
module
)
{
if
(
module
.
isActive
===
undefined
||
module
.
isActive
)
{
if
(
$
.
isFunction
(
module
.
init
))
{
module
.
init
();
}
$
.
each
(
module
,
function
()
{
if
(
$
.
isPlainObject
(
this
))
{
pub
.
initModule
(
this
);
}
});
}
},
init
:
function
()
{
initCsrfHandler
();
initRedirectHandler
();
initScriptFilter
();
initDataMethods
();
}
};
init
:
function
()
{
initCsrfHandler
();
initRedirectHandler
();
initScriptFilter
();
initDataMethods
();
}
};
function
initRedirectHandler
()
{
// handle AJAX redirection
$
(
document
).
ajaxComplete
(
function
(
event
,
xhr
,
settings
)
{
var
url
=
xhr
.
getResponseHeader
(
'X-Redirect'
);
if
(
url
)
{
window
.
location
=
url
;
}
});
}
function
initRedirectHandler
()
{
// handle AJAX redirection
$
(
document
).
ajaxComplete
(
function
(
event
,
xhr
,
settings
)
{
var
url
=
xhr
.
getResponseHeader
(
'X-Redirect'
);
if
(
url
)
{
window
.
location
=
url
;
}
});
}
function
initCsrfHandler
()
{
// automatically send CSRF token for all AJAX requests
$
.
ajaxPrefilter
(
function
(
options
,
originalOptions
,
xhr
)
{
if
(
!
options
.
crossDomain
&&
pub
.
getCsrfParam
())
{
xhr
.
setRequestHeader
(
'X-CSRF-Token'
,
pub
.
getCsrfToken
());
}
});
}
function
initCsrfHandler
()
{
// automatically send CSRF token for all AJAX requests
$
.
ajaxPrefilter
(
function
(
options
,
originalOptions
,
xhr
)
{
if
(
!
options
.
crossDomain
&&
pub
.
getCsrfParam
())
{
xhr
.
setRequestHeader
(
'X-CSRF-Token'
,
pub
.
getCsrfToken
());
}
});
}
function
initDataMethods
()
{
var
$document
=
$
(
document
);
// handle data-confirm and data-method for clickable elements
$document
.
on
(
'click.yii'
,
pub
.
clickableSelector
,
function
(
event
)
{
var
$this
=
$
(
this
);
if
(
pub
.
allowAction
(
$this
))
{
return
pub
.
handleAction
(
$this
);
}
else
{
event
.
stopImmediatePropagation
();
return
false
;
}
});
function
initDataMethods
()
{
var
$document
=
$
(
document
);
// handle data-confirm and data-method for clickable elements
$document
.
on
(
'click.yii'
,
pub
.
clickableSelector
,
function
(
event
)
{
var
$this
=
$
(
this
);
if
(
pub
.
allowAction
(
$this
))
{
return
pub
.
handleAction
(
$this
);
}
else
{
event
.
stopImmediatePropagation
();
return
false
;
}
});
// handle data-confirm and data-method for changeable elements
$document
.
on
(
'change.yii'
,
pub
.
changeableSelector
,
function
(
event
)
{
var
$this
=
$
(
this
);
if
(
pub
.
allowAction
(
$this
))
{
return
pub
.
handleAction
(
$this
);
}
else
{
event
.
stopImmediatePropagation
();
return
false
;
}
});
}
// handle data-confirm and data-method for changeable elements
$document
.
on
(
'change.yii'
,
pub
.
changeableSelector
,
function
(
event
)
{
var
$this
=
$
(
this
);
if
(
pub
.
allowAction
(
$this
))
{
return
pub
.
handleAction
(
$this
);
}
else
{
event
.
stopImmediatePropagation
();
return
false
;
}
});
}
function
initScriptFilter
()
{
var
hostInfo
=
location
.
protocol
+
'//'
+
location
.
host
;
var
loadedScripts
=
$
(
'script[src]'
).
map
(
function
()
{
return
this
.
src
.
charAt
(
0
)
===
'/'
?
hostInfo
+
this
.
src
:
this
.
src
;
}).
toArray
();
$
.
ajaxPrefilter
(
'script'
,
function
(
options
,
originalOptions
,
xhr
)
{
if
(
options
.
dataType
==
'jsonp'
)
{
return
;
}
var
url
=
options
.
url
.
charAt
(
0
)
===
'/'
?
hostInfo
+
options
.
url
:
options
.
url
;
if
(
$
.
inArray
(
url
,
loadedScripts
)
===
-
1
)
{
loadedScripts
.
push
(
url
);
}
else
{
var
found
=
$
.
inArray
(
url
,
$
.
map
(
pub
.
reloadableScripts
,
function
(
script
)
{
return
script
.
charAt
(
0
)
===
'/'
?
hostInfo
+
script
:
script
;
}))
!==
-
1
;
if
(
!
found
)
{
xhr
.
abort
();
}
}
});
}
function
initScriptFilter
()
{
var
hostInfo
=
location
.
protocol
+
'//'
+
location
.
host
;
var
loadedScripts
=
$
(
'script[src]'
).
map
(
function
()
{
return
this
.
src
.
charAt
(
0
)
===
'/'
?
hostInfo
+
this
.
src
:
this
.
src
;
}).
toArray
();
$
.
ajaxPrefilter
(
'script'
,
function
(
options
,
originalOptions
,
xhr
)
{
if
(
options
.
dataType
==
'jsonp'
)
{
return
;
}
var
url
=
options
.
url
.
charAt
(
0
)
===
'/'
?
hostInfo
+
options
.
url
:
options
.
url
;
if
(
$
.
inArray
(
url
,
loadedScripts
)
===
-
1
)
{
loadedScripts
.
push
(
url
);
}
else
{
var
found
=
$
.
inArray
(
url
,
$
.
map
(
pub
.
reloadableScripts
,
function
(
script
)
{
return
script
.
charAt
(
0
)
===
'/'
?
hostInfo
+
script
:
script
;
}))
!==
-
1
;
if
(
!
found
)
{
xhr
.
abort
();
}
}
});
}
return
pub
;
return
pub
;
})(
jQuery
);
jQuery
(
document
).
ready
(
function
()
{
yii
.
initModule
(
yii
);
yii
.
initModule
(
yii
);
});
framework/assets/yii.validation.js
View file @
7960ccdf
...
...
@@ -11,218 +11,218 @@
*/
yii
.
validation
=
(
function
(
$
)
{
var
pub
=
{
isEmpty
:
function
(
value
)
{
return
value
===
null
||
value
===
undefined
||
value
==
[]
||
value
===
''
;
},
addMessage
:
function
(
messages
,
message
,
value
)
{
messages
.
push
(
message
.
replace
(
/
\{
value
\}
/g
,
value
));
},
required
:
function
(
value
,
messages
,
options
)
{
var
valid
=
false
;
if
(
options
.
requiredValue
===
undefined
)
{
var
isString
=
typeof
value
==
'string'
||
value
instanceof
String
;
if
(
options
.
strict
&&
value
!==
undefined
||
!
options
.
strict
&&
!
pub
.
isEmpty
(
isString
?
$
.
trim
(
value
)
:
value
))
{
valid
=
true
;
}
}
else
if
(
!
options
.
strict
&&
value
==
options
.
requiredValue
||
options
.
strict
&&
value
===
options
.
requiredValue
)
{
valid
=
true
;
}
if
(
!
valid
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
boolean
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
var
valid
=
!
options
.
strict
&&
(
value
==
options
.
trueValue
||
value
==
options
.
falseValue
)
||
options
.
strict
&&
(
value
===
options
.
trueValue
||
value
===
options
.
falseValue
);
if
(
!
valid
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
string
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
if
(
typeof
value
!==
'string'
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
return
;
}
if
(
options
.
min
!==
undefined
&&
value
.
length
<
options
.
min
)
{
pub
.
addMessage
(
messages
,
options
.
tooShort
,
value
);
}
if
(
options
.
max
!==
undefined
&&
value
.
length
>
options
.
max
)
{
pub
.
addMessage
(
messages
,
options
.
tooLong
,
value
);
}
if
(
options
.
is
!==
undefined
&&
value
.
length
!=
options
.
is
)
{
pub
.
addMessage
(
messages
,
options
.
is
,
value
);
}
},
number
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
if
(
typeof
value
===
'string'
&&
!
value
.
match
(
options
.
pattern
))
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
return
;
}
if
(
options
.
min
!==
undefined
&&
value
<
options
.
min
)
{
pub
.
addMessage
(
messages
,
options
.
tooSmall
,
value
);
}
if
(
options
.
max
!==
undefined
&&
value
>
options
.
max
)
{
pub
.
addMessage
(
messages
,
options
.
tooBig
,
value
);
}
},
range
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
var
valid
=
!
options
.
not
&&
$
.
inArray
(
value
,
options
.
range
)
>
-
1
||
options
.
not
&&
$
.
inArray
(
value
,
options
.
range
)
==
-
1
;
if
(
!
valid
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
regularExpression
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
if
(
!
options
.
not
&&
!
value
.
match
(
options
.
pattern
)
||
options
.
not
&&
value
.
match
(
options
.
pattern
))
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
email
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
var
valid
=
true
;
if
(
options
.
enableIDN
)
{
var
regexp
=
/^
(
.*<
?)(
.*
)
@
(
.*
)(
>
?)
$/
,
matches
=
regexp
.
exec
(
value
);
if
(
matches
===
null
)
{
valid
=
false
;
}
else
{
value
=
matches
[
1
]
+
punycode
.
toASCII
(
matches
[
2
])
+
'@'
+
punycode
.
toASCII
(
matches
[
3
])
+
matches
[
4
];
}
}
if
(
!
valid
||
!
(
value
.
match
(
options
.
pattern
)
||
(
options
.
allowName
&&
value
.
match
(
options
.
fullPattern
))))
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
url
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
if
(
options
.
defaultScheme
&&
!
value
.
match
(
/:
\/\/
/
))
{
value
=
options
.
defaultScheme
+
'://'
+
value
;
}
var
valid
=
true
;
if
(
options
.
enableIDN
)
{
var
regexp
=
/^
([^
:
]
+
)
:
\/\/([^\/]
+
)(
.*
)
$/
,
matches
=
regexp
.
exec
(
value
);
if
(
matches
===
null
)
{
valid
=
false
;
}
else
{
value
=
matches
[
1
]
+
'://'
+
punycode
.
toASCII
(
matches
[
2
])
+
matches
[
3
];
}
}
if
(
!
valid
||
!
value
.
match
(
options
.
pattern
))
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
captcha
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
// CAPTCHA may be updated via AJAX and the updated hash is stored in body data
var
hash
=
$
(
'body'
).
data
(
options
.
hashKey
);
if
(
hash
==
null
)
{
hash
=
options
.
hash
;
}
else
{
hash
=
hash
[
options
.
caseSensitive
?
0
:
1
];
}
var
v
=
options
.
caseSensitive
?
value
:
value
.
toLowerCase
();
for
(
var
i
=
v
.
length
-
1
,
h
=
0
;
i
>=
0
;
--
i
)
{
h
+=
v
.
charCodeAt
(
i
);
}
if
(
h
!=
hash
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
compare
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
var
compareValue
,
valid
=
true
;
if
(
options
.
compareAttribute
===
undefined
)
{
compareValue
=
options
.
compareValue
;
}
else
{
compareValue
=
$
(
'#'
+
options
.
compareAttribute
).
val
();
}
switch
(
options
.
operator
)
{
case
'=='
:
valid
=
value
==
compareValue
;
break
;
case
'==='
:
valid
=
value
===
compareValue
;
break
;
case
'!='
:
valid
=
value
!=
compareValue
;
break
;
case
'!=='
:
valid
=
value
!==
compareValue
;
break
;
case
'>'
:
valid
=
value
>
compareValue
;
break
;
case
'>='
:
valid
=
value
>=
compareValue
;
break
;
case
'<'
:
valid
=
value
<
compareValue
;
break
;
case
'<='
:
valid
=
value
<=
compareValue
;
break
;
default
:
valid
=
false
;
break
;
}
if
(
!
valid
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
}
};
return
pub
;
var
pub
=
{
isEmpty
:
function
(
value
)
{
return
value
===
null
||
value
===
undefined
||
value
==
[]
||
value
===
''
;
},
addMessage
:
function
(
messages
,
message
,
value
)
{
messages
.
push
(
message
.
replace
(
/
\{
value
\}
/g
,
value
));
},
required
:
function
(
value
,
messages
,
options
)
{
var
valid
=
false
;
if
(
options
.
requiredValue
===
undefined
)
{
var
isString
=
typeof
value
==
'string'
||
value
instanceof
String
;
if
(
options
.
strict
&&
value
!==
undefined
||
!
options
.
strict
&&
!
pub
.
isEmpty
(
isString
?
$
.
trim
(
value
)
:
value
))
{
valid
=
true
;
}
}
else
if
(
!
options
.
strict
&&
value
==
options
.
requiredValue
||
options
.
strict
&&
value
===
options
.
requiredValue
)
{
valid
=
true
;
}
if
(
!
valid
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
boolean
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
var
valid
=
!
options
.
strict
&&
(
value
==
options
.
trueValue
||
value
==
options
.
falseValue
)
||
options
.
strict
&&
(
value
===
options
.
trueValue
||
value
===
options
.
falseValue
);
if
(
!
valid
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
string
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
if
(
typeof
value
!==
'string'
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
return
;
}
if
(
options
.
min
!==
undefined
&&
value
.
length
<
options
.
min
)
{
pub
.
addMessage
(
messages
,
options
.
tooShort
,
value
);
}
if
(
options
.
max
!==
undefined
&&
value
.
length
>
options
.
max
)
{
pub
.
addMessage
(
messages
,
options
.
tooLong
,
value
);
}
if
(
options
.
is
!==
undefined
&&
value
.
length
!=
options
.
is
)
{
pub
.
addMessage
(
messages
,
options
.
is
,
value
);
}
},
number
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
if
(
typeof
value
===
'string'
&&
!
value
.
match
(
options
.
pattern
))
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
return
;
}
if
(
options
.
min
!==
undefined
&&
value
<
options
.
min
)
{
pub
.
addMessage
(
messages
,
options
.
tooSmall
,
value
);
}
if
(
options
.
max
!==
undefined
&&
value
>
options
.
max
)
{
pub
.
addMessage
(
messages
,
options
.
tooBig
,
value
);
}
},
range
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
var
valid
=
!
options
.
not
&&
$
.
inArray
(
value
,
options
.
range
)
>
-
1
||
options
.
not
&&
$
.
inArray
(
value
,
options
.
range
)
==
-
1
;
if
(
!
valid
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
regularExpression
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
if
(
!
options
.
not
&&
!
value
.
match
(
options
.
pattern
)
||
options
.
not
&&
value
.
match
(
options
.
pattern
))
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
email
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
var
valid
=
true
;
if
(
options
.
enableIDN
)
{
var
regexp
=
/^
(
.*<
?)(
.*
)
@
(
.*
)(
>
?)
$/
,
matches
=
regexp
.
exec
(
value
);
if
(
matches
===
null
)
{
valid
=
false
;
}
else
{
value
=
matches
[
1
]
+
punycode
.
toASCII
(
matches
[
2
])
+
'@'
+
punycode
.
toASCII
(
matches
[
3
])
+
matches
[
4
];
}
}
if
(
!
valid
||
!
(
value
.
match
(
options
.
pattern
)
||
(
options
.
allowName
&&
value
.
match
(
options
.
fullPattern
))))
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
url
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
if
(
options
.
defaultScheme
&&
!
value
.
match
(
/:
\/\/
/
))
{
value
=
options
.
defaultScheme
+
'://'
+
value
;
}
var
valid
=
true
;
if
(
options
.
enableIDN
)
{
var
regexp
=
/^
([^
:
]
+
)
:
\/\/([^\/]
+
)(
.*
)
$/
,
matches
=
regexp
.
exec
(
value
);
if
(
matches
===
null
)
{
valid
=
false
;
}
else
{
value
=
matches
[
1
]
+
'://'
+
punycode
.
toASCII
(
matches
[
2
])
+
matches
[
3
];
}
}
if
(
!
valid
||
!
value
.
match
(
options
.
pattern
))
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
captcha
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
// CAPTCHA may be updated via AJAX and the updated hash is stored in body data
var
hash
=
$
(
'body'
).
data
(
options
.
hashKey
);
if
(
hash
==
null
)
{
hash
=
options
.
hash
;
}
else
{
hash
=
hash
[
options
.
caseSensitive
?
0
:
1
];
}
var
v
=
options
.
caseSensitive
?
value
:
value
.
toLowerCase
();
for
(
var
i
=
v
.
length
-
1
,
h
=
0
;
i
>=
0
;
--
i
)
{
h
+=
v
.
charCodeAt
(
i
);
}
if
(
h
!=
hash
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
},
compare
:
function
(
value
,
messages
,
options
)
{
if
(
options
.
skipOnEmpty
&&
pub
.
isEmpty
(
value
))
{
return
;
}
var
compareValue
,
valid
=
true
;
if
(
options
.
compareAttribute
===
undefined
)
{
compareValue
=
options
.
compareValue
;
}
else
{
compareValue
=
$
(
'#'
+
options
.
compareAttribute
).
val
();
}
switch
(
options
.
operator
)
{
case
'=='
:
valid
=
value
==
compareValue
;
break
;
case
'==='
:
valid
=
value
===
compareValue
;
break
;
case
'!='
:
valid
=
value
!=
compareValue
;
break
;
case
'!=='
:
valid
=
value
!==
compareValue
;
break
;
case
'>'
:
valid
=
value
>
compareValue
;
break
;
case
'>='
:
valid
=
value
>=
compareValue
;
break
;
case
'<'
:
valid
=
value
<
compareValue
;
break
;
case
'<='
:
valid
=
value
<=
compareValue
;
break
;
default
:
valid
=
false
;
break
;
}
if
(
!
valid
)
{
pub
.
addMessage
(
messages
,
options
.
message
,
value
);
}
}
};
return
pub
;
})(
jQuery
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment