merge master
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
dist/
|
dist/
|
||||||
build.properties
|
build.properties
|
||||||
package.xml
|
package.xml
|
||||||
|
semanticscuttle-dump.sql
|
||||||
data/config.unittest.php
|
data/config.unittest.php
|
||||||
|
@ -334,7 +334,7 @@ $index_sidebar_blocks = array(
|
|||||||
* @var string
|
* @var string
|
||||||
* @link http://php.net/date
|
* @link http://php.net/date
|
||||||
*/
|
*/
|
||||||
$shortdate = 'd-m-Y';
|
$shortdate = 'Y-m-d';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format of long dates.
|
* Format of long dates.
|
||||||
|
@ -604,7 +604,7 @@ msgid ""
|
|||||||
"file to your computer"
|
"file to your computer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Speichern Sie die resultierende <abbr title=\"Extensible Markup Language"
|
"Speichern Sie die resultierende <abbr title=\"Extensible Markup Language"
|
||||||
"\">XML</abbr-Datei lokal auf Ihrem Computer"
|
"\">XML</abbr>-Datei lokal auf Ihrem Computer"
|
||||||
|
|
||||||
#: data/templates/importDelicious.tpl.php:35
|
#: data/templates/importDelicious.tpl.php:35
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -11,7 +11,7 @@ foreach($users as $user) {
|
|||||||
|
|
||||||
echo '<div class="link">';
|
echo '<div class="link">';
|
||||||
echo '<a href="'.createURL('profile', $user->getUsername()).'">'.$user->getUsername().'</a>';
|
echo '<a href="'.createURL('profile', $user->getUsername()).'">'.$user->getUsername().'</a>';
|
||||||
echo ' - <span title='. T_('Public/Shared/Private') .'>'. $user->getNbBookmarks('public') .' / '. $user->getNbBookmarks('shared') .' / '. $user->getNbBookmarks('private') .' '. T_('bookmark(s)') .'</span>';
|
echo ' - <span title="'. T_('Public/Shared/Private') .'">'. $user->getNbBookmarks('public') .' / '. $user->getNbBookmarks('shared') .' / '. $user->getNbBookmarks('private') .' '. T_('bookmark(s)') .'</span>';
|
||||||
echo '</div>';
|
echo '</div>';
|
||||||
|
|
||||||
if($user->getUsername() != $currentUser->getUsername()) {
|
if($user->getUsername() != $currentUser->getUsername()) {
|
||||||
|
@ -30,7 +30,8 @@ window.onload = function() {
|
|||||||
if(strlen($description['cdDatetime'])>0) {
|
if(strlen($description['cdDatetime'])>0) {
|
||||||
echo T_('Last modification:').' '.$description['cdDatetime'].', ';
|
echo T_('Last modification:').' '.$description['cdDatetime'].', ';
|
||||||
$lastUser = $userservice->getUser($description['uId']);
|
$lastUser = $userservice->getUser($description['uId']);
|
||||||
echo '<a href="'.createURL('profile', $lastUser['username']).'">'.$lastUser['username'].'</a>';
|
echo '<a href="'.createURL('profile', $lastUser['username']).'">'
|
||||||
|
. SemanticScuttle_Model_UserArray::getName($lastUser) . '</a>';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</td>
|
</td>
|
||||||
|
117
data/templates/bookmarklet.inc.php
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
<h3><?php echo T_('Bookmarklet'); ?></h3>
|
||||||
|
<p id="bookmarklet"></p>
|
||||||
|
<script type="text/javascript">
|
||||||
|
//<![CDATA[
|
||||||
|
var browser = navigator.appName;
|
||||||
|
jQuery(function($) {
|
||||||
|
if (browser == "Opera") {
|
||||||
|
$('#bookmarklet').append(
|
||||||
|
<?php echo json_encode(
|
||||||
|
sprintf(
|
||||||
|
T_("Click one of the following bookmarklets to add a button you can click whenever you want to add the page you are on to %s") . ':',
|
||||||
|
$GLOBALS['sitename']
|
||||||
|
)
|
||||||
|
); ?>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$('#bookmarklet').append(
|
||||||
|
<?php echo json_encode(
|
||||||
|
sprintf(
|
||||||
|
T_("Drag one of the following bookmarklets to your browser's bookmarks and click it whenever you want to add the page you are on to %s") . ':',
|
||||||
|
$GLOBALS['sitename']
|
||||||
|
)
|
||||||
|
);
|
||||||
|
?>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//]]>
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
//<![CDATA[
|
||||||
|
var selection = '';
|
||||||
|
if (window.getSelection) {
|
||||||
|
selection = 'window.getSelection()';
|
||||||
|
} else if (document.getSelection) {
|
||||||
|
selection = 'document.getSelection()';
|
||||||
|
} else if (document.selection) {
|
||||||
|
selection = 'document.selection.createRange().text';
|
||||||
|
}
|
||||||
|
if (browser == "Opera") {
|
||||||
|
$('#bookmarklet').append(
|
||||||
|
'<ul>'
|
||||||
|
+ '<li>'
|
||||||
|
+ '<a class="bookmarklet" href="'
|
||||||
|
+ '<?php
|
||||||
|
$popupLink = 'javascript:'
|
||||||
|
. "location.href='"
|
||||||
|
. createURL('bookmarks', $GLOBALS['user'])
|
||||||
|
. '?action=add'
|
||||||
|
. "&address='+encodeURIComponent(document.location.href)+'"
|
||||||
|
. "&title='+encodeURIComponent(document.title)+'"
|
||||||
|
. "&description='+encodeURIComponent(SELECTION)"
|
||||||
|
. ";";
|
||||||
|
$link = 'opera:/button/'
|
||||||
|
//Opera command
|
||||||
|
. 'Go to page'
|
||||||
|
//command parameter 1
|
||||||
|
. ',"' . rawurlencode($popupLink) . '"'
|
||||||
|
//command parameter 2
|
||||||
|
. ','
|
||||||
|
//button title
|
||||||
|
. ',"Post to ' . fixOperaButtonName($GLOBALS['sitename']) . '"'
|
||||||
|
//button icon name
|
||||||
|
. ',"Scuttle"';
|
||||||
|
echo jsEscTitle(htmlspecialchars($link));
|
||||||
|
?>'.replace('SELECTION', selection)
|
||||||
|
+ '"><?php echo jsEscTitle(sprintf(T_('Post to %s'), $GLOBALS['sitename'])); ?></a>'
|
||||||
|
+ '</li>'
|
||||||
|
+ '<li>'
|
||||||
|
+ '<a class="bookmarklet" href="'
|
||||||
|
+ '<?php
|
||||||
|
$popupLink = 'javascript:'
|
||||||
|
. 'open('
|
||||||
|
. "'" . createURL('bookmarks', $GLOBALS['user'])
|
||||||
|
. '?action=add'
|
||||||
|
. '&popup=1'
|
||||||
|
. "&address='+encodeURIComponent(document.location.href)+'"
|
||||||
|
. "&title='+encodeURIComponent(document.title)+'"
|
||||||
|
. "&description='+encodeURIComponent(SELECTION)"
|
||||||
|
. ","
|
||||||
|
. "'" . htmlspecialchars(jsEscTitle($GLOBALS['sitename'])) . "',"
|
||||||
|
. "'modal=1,status=0,scrollbars=1,toolbar=0,resizable=1,width=790,height=465"
|
||||||
|
. ",left='+(screen.width-790)/2+',top='+(screen.height-425)/2"
|
||||||
|
. ");void 0";
|
||||||
|
$link = 'opera:/button/'
|
||||||
|
. 'Go to page'
|
||||||
|
. ',"' . rawurlencode($popupLink) . '"'
|
||||||
|
. ','
|
||||||
|
. ',"Post to ' . fixOperaButtonName($GLOBALS['sitename']) . ' (Pop-up)"'
|
||||||
|
. ',"Scuttle"';
|
||||||
|
echo jsEscTitle(htmlspecialchars($link));
|
||||||
|
?>'.replace('SELECTION', selection)
|
||||||
|
+ '"><?php echo jsEscTitle(sprintf(T_('Post to %s (Pop-up)'), $GLOBALS['sitename'])); ?></a>'
|
||||||
|
+ '</li>'
|
||||||
|
+ '</ul>'
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$('#bookmarklet').append(
|
||||||
|
'<ul>'
|
||||||
|
+ '<li><a class="bookmarklet" href="javascript:x=document;a=encodeURIComponent(x.location.href);t=encodeURIComponent(x.title);d=encodeURIComponent('+selection+');location.href=\'<?php echo createURL('bookmarks', $GLOBALS['user']); ?>?action=add&address=\'+a+\'&title=\'+t+\'&description=\'+d;void 0;"><?php echo jsEscTitle(sprintf(T_('Post to %s'), $GLOBALS['sitename'])); ?><\/a><\/li>'
|
||||||
|
+ '<li>'
|
||||||
|
+ '<a class="bookmarklet" href="'
|
||||||
|
+ 'javascript:x=document;'
|
||||||
|
+ 'a=encodeURIComponent(x.location.href);'
|
||||||
|
+ 't=encodeURIComponent(x.title);'
|
||||||
|
+ 'd=encodeURIComponent('+selection+');'
|
||||||
|
+ 'open('
|
||||||
|
+ '\'<?php echo createURL('bookmarks', $GLOBALS['user']); ?>?action=add&popup=1&address=\'+a+\'&title=\'+t+\'&description=\'+d,\'<?php echo htmlspecialchars(jsEscTitleDouble($GLOBALS['sitename'])); ?>\',\'modal=1,status=0,scrollbars=1,toolbar=0,resizable=1,width=790,height=465,left=\'+(screen.width-790)/2+\',top=\'+(screen.height-425)/2'
|
||||||
|
+ ');void 0;">'
|
||||||
|
+ '<?php echo jsEscTitle(sprintf(T_('Post to %s (Pop-up)'), $GLOBALS['sitename'])); ?>'
|
||||||
|
+ '</a>'
|
||||||
|
+ '</li>'
|
||||||
|
+ '</ul>'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
//]]>
|
||||||
|
</script>
|
@ -62,12 +62,16 @@ if($currenttag!= '' && $cdservice->getLastTagDescription($currenttag)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//common tag description edit
|
//common tag description edit
|
||||||
if($userservice->isLoggedOn()) {
|
if ($userservice->isLoggedOn()) {
|
||||||
if($currenttag!= '' && ($GLOBALS['enableCommonTagDescriptionEditedByAll'] || $currentUser->isAdmin())) {
|
if ($currenttag != ''
|
||||||
|
&& ($GLOBALS['enableCommonTagDescriptionEditedByAll']
|
||||||
|
|| $currentUser->isAdmin()
|
||||||
|
)
|
||||||
|
) {
|
||||||
echo ' <a href="'. createURL('tagcommondescriptionedit', $currenttag).'" title="'.T_('Edit the common description of this tag').'">';
|
echo ' <a href="'. createURL('tagcommondescriptionedit', $currenttag).'" title="'.T_('Edit the common description of this tag').'">';
|
||||||
echo !is_array($cDescription) || strlen($cDescription['cdDescription'])==0?T_('Edit the common description of this tag'):'';
|
echo !is_array($cDescription) || strlen($cDescription['cdDescription'])==0?T_('Edit the common description of this tag'):'';
|
||||||
echo ' <img src="'.ROOT.'images/b_edit.png" /></a>';
|
echo ' <img src="'.ROOT.'images/b_edit.png" /></a>';
|
||||||
} elseif(isset($hash)) {
|
} else if (isset($hash)) {
|
||||||
echo ' (<a href="'.createURL('bookmarkcommondescriptionedit', $hash).'" title="'.T_('Edit the common description of this bookmark').'">';
|
echo ' (<a href="'.createURL('bookmarkcommondescriptionedit', $hash).'" title="'.T_('Edit the common description of this bookmark').'">';
|
||||||
echo T_('Edit the common description of this bookmark').'</a>)';
|
echo T_('Edit the common description of this bookmark').'</a>)';
|
||||||
}
|
}
|
||||||
@ -117,33 +121,33 @@ $votingSort = 'voting_desc';
|
|||||||
|
|
||||||
switch(getSortOrder()) {
|
switch(getSortOrder()) {
|
||||||
case 'date_asc':
|
case 'date_asc':
|
||||||
$dateArrow = ' ↑';
|
$dateArrow = ' ↑';
|
||||||
$dateSort = 'date_desc';
|
$dateSort = 'date_desc';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'title_asc':
|
case 'title_asc':
|
||||||
$titleArrow = ' ↑';
|
$titleArrow = ' ↑';
|
||||||
$titleSort = 'title_desc';
|
$titleSort = 'title_desc';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'title_desc':
|
case 'title_desc':
|
||||||
$titleArrow = ' ↓';
|
$titleArrow = ' ↓';
|
||||||
$titleSort = 'title_asc';
|
$titleSort = 'title_asc';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'voting_asc':
|
case 'voting_asc':
|
||||||
$votingArrow = ' ↑';
|
$votingArrow = ' ↑';
|
||||||
$votingSort = 'voting_desc';
|
$votingSort = 'voting_desc';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'voting_desc':
|
case 'voting_desc':
|
||||||
$votingArrow = ' ↓';
|
$votingArrow = ' ↓';
|
||||||
$votingSort = 'voting_asc';
|
$votingSort = 'voting_asc';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'date_desc':
|
case 'date_desc':
|
||||||
default:
|
default:
|
||||||
$dateArrow = ' ↓';
|
$dateArrow = ' ↓';
|
||||||
$dateSort = 'date_asc';
|
$dateSort = 'date_asc';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -292,10 +296,9 @@ if ($currenttag!= '') {
|
|||||||
$edit = ' - <a href="' . createURL('edit', $row['bId']) . '">'
|
$edit = ' - <a href="' . createURL('edit', $row['bId']) . '">'
|
||||||
. T_('Edit')
|
. T_('Edit')
|
||||||
. '</a>'
|
. '</a>'
|
||||||
. '<script type="text/javascript">'
|
. ' <a href="#" onclick="deleteBookmark(this, '. $row['bId'] .'); return false;">'
|
||||||
. 'document.write(" - <a href=\"#\" onclick=\"deleteBookmark(this, '. $row['bId'] .'); return false;\">'
|
|
||||||
. T_('Delete')
|
. T_('Delete')
|
||||||
.'<\/a>");</script>';
|
.'</a>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Last update
|
// Last update
|
||||||
@ -309,10 +312,11 @@ if ($currenttag!= '') {
|
|||||||
$copy .= T_('you');
|
$copy .= T_('you');
|
||||||
} else {
|
} else {
|
||||||
$copy .= '<a href="' . createURL('bookmarks', $row['username']) . '">'
|
$copy .= '<a href="' . createURL('bookmarks', $row['username']) . '">'
|
||||||
. $row['username'] . '</a>';
|
. SemanticScuttle_Model_UserArray::getName($row)
|
||||||
|
. '</a>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Udders!
|
// others
|
||||||
if (!isset($hash)) {
|
if (!isset($hash)) {
|
||||||
$others = $otherCounts[$row['bAddress']];
|
$others = $otherCounts[$row['bAddress']];
|
||||||
$ostart = '<a href="' . createURL('history', $row['bHash']) . '">';
|
$ostart = '<a href="' . createURL('history', $row['bHash']) . '">';
|
||||||
@ -390,7 +394,7 @@ if ($currenttag!= '') {
|
|||||||
echo ' <div' . $adminBgClass . '>' . "\n";
|
echo ' <div' . $adminBgClass . '>' . "\n";
|
||||||
|
|
||||||
echo ' <div class="link">'
|
echo ' <div class="link">'
|
||||||
. '<a href="'. $address .'"'. $rel .' class="taggedlink" target="_blank">'
|
. '<a href="'. htmlspecialchars($address) .'"'. $rel .' class="taggedlink">'
|
||||||
. filter($row['bTitle'])
|
. filter($row['bTitle'])
|
||||||
. '</a>' . $adminStar . "</div>\n";
|
. '</a>' . $adminStar . "</div>\n";
|
||||||
if ($row['bDescription'] == '') {
|
if ($row['bDescription'] == '') {
|
||||||
|
@ -36,28 +36,40 @@ $allPopularTagsCount = count($allPopularTags);
|
|||||||
|
|
||||||
|
|
||||||
// function printing the cloud
|
// function printing the cloud
|
||||||
function writeTagsProposition($tagsCloud, $title) {
|
function writeTagsProposition($tagsCloud, $title)
|
||||||
echo 'document.write(\'<div class="collapsible">\');';
|
{
|
||||||
echo 'document.write(\'<h3>'. $title .'<\/h3>\');';
|
static $id = 0;
|
||||||
echo 'document.write(\'<p id="popularTags" class="tags">\');';
|
++$id;
|
||||||
|
|
||||||
|
echo <<<JS
|
||||||
|
$('.edit-tagclouds')
|
||||||
|
.append(
|
||||||
|
'<div class="collapsible" id="edit-tagcloud-$id">'
|
||||||
|
+ ' <h3>$title</h3>'
|
||||||
|
+ ' <p class="popularTags tags"></p>'
|
||||||
|
+ '</div>');
|
||||||
|
JS;
|
||||||
|
|
||||||
$taglist = '';
|
$taglist = '';
|
||||||
foreach(array_keys($tagsCloud) as $key) {
|
foreach (array_keys($tagsCloud) as $key) {
|
||||||
$row =& $tagsCloud[$key];
|
$row = $tagsCloud[$key];
|
||||||
$entries = T_ngettext('bookmark', 'bookmarks', $row['bCount']);
|
$entries = T_ngettext('bookmark', 'bookmarks', $row['bCount']);
|
||||||
$taglist .= '<span title="'. $row['bCount'] .' '. $entries .'" style="font-size:'. $row['size'] .'" onclick="addTag(this)">'. filter($row['tag']) .'<\/span> ';
|
$taglist .= '<span'
|
||||||
|
. ' title="'. $row['bCount'] . ' ' . $entries . '"'
|
||||||
|
. ' style="font-size:' . $row['size'] . '"'
|
||||||
|
. ' onclick="addTag(this)">'
|
||||||
|
. filter($row['tag'])
|
||||||
|
. '</span> ';
|
||||||
}
|
}
|
||||||
|
echo '$(\'#edit-tagcloud-' . $id . ' p\').append('
|
||||||
echo 'document.write(\''. $taglist .'\');';
|
. json_encode($taglist)
|
||||||
echo 'document.write(\'<\/p>\');';
|
. ");\n";
|
||||||
echo 'document.write(\'<\/div>\');';
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ($allPopularTagsCount > 0 || $userPopularTagsCount > 0 ) { ?>
|
if ($allPopularTagsCount > 0 || $userPopularTagsCount > 0 ) { ?>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
//<![CDATA[
|
||||||
Array.prototype.contains = function (ele) {
|
Array.prototype.contains = function (ele) {
|
||||||
for (var i = 0; i < this.length; i++) {
|
for (var i = 0; i < this.length; i++) {
|
||||||
if (this[i] == ele) {
|
if (this[i] == ele) {
|
||||||
@ -87,20 +99,26 @@ function addonload(addition) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addonload(
|
jQuery(function($) {
|
||||||
function () {
|
<?php
|
||||||
var taglist = document.getElementById('tags');
|
if ($userPopularTagsCount > 0) {
|
||||||
var tags = taglist.value.split(', ');
|
writeTagsProposition($userPopularTagsCloud, T_('Popular Tags'));
|
||||||
|
}
|
||||||
|
if ($allPopularTagsCount > 0) {
|
||||||
|
writeTagsProposition($allPopularTagsCloud, T_('Popular Tags From All Users'));
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
var taglist = $('#tags');
|
||||||
|
var tags = taglist.val().split(', ');
|
||||||
|
|
||||||
var populartags = document.getElementById('popularTags').getElementsByTagName('span');
|
var populartags = $('.edit-tagclouds span');
|
||||||
|
|
||||||
for (var i = 0; i < populartags.length; i++) {
|
for (var i = 0; i < populartags.length; i++) {
|
||||||
if (tags.contains(populartags[i].innerHTML)) {
|
if (tags.contains(populartags[i].innerHTML)) {
|
||||||
populartags[i].className = 'selected';
|
populartags[i].className = 'selected';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
||||||
function addTag(ele) {
|
function addTag(ele) {
|
||||||
var thisTag = ele.innerHTML;
|
var thisTag = ele.innerHTML;
|
||||||
@ -122,20 +140,9 @@ function addTag(ele) {
|
|||||||
|
|
||||||
document.getElementById('tags').focus();
|
document.getElementById('tags').focus();
|
||||||
}
|
}
|
||||||
|
//]]>
|
||||||
<?php
|
|
||||||
if( $userPopularTagsCount > 0) {
|
|
||||||
writeTagsProposition($userPopularTagsCloud, T_('Popular Tags'));
|
|
||||||
}
|
|
||||||
if( $allPopularTagsCount > 0) {
|
|
||||||
writeTagsProposition($allPopularTagsCloud, T_('Popular Tags From All Users'));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<div class="edit-tagclouds"></div>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
@ -16,33 +16,41 @@ switch ($row['bStatus']) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->includeTemplate("dojo.inc");
|
|
||||||
|
|
||||||
function jsEscTitle($title)
|
function jsEscTitle($title)
|
||||||
{
|
{
|
||||||
return addcslashes($title, "'");
|
return addcslashes($title, "'");
|
||||||
}
|
}
|
||||||
|
function jsEscTitleDouble($title)
|
||||||
|
{
|
||||||
|
return addcslashes(addcslashes($title, "'"), "'\\");
|
||||||
|
}
|
||||||
|
function fixOperaButtonName($name) {
|
||||||
|
//yes, opera has problems with double quotes in button names
|
||||||
|
return str_replace('"', "''", $name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($row['tags'])) {
|
||||||
|
$row['tags'] = implode(', ', $row['tags']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ajaxUrl = ROOT . 'ajax/'
|
||||||
|
. (
|
||||||
|
($GLOBALS['adminsAreAdvisedTagsFromOtherAdmins'] && $currentUser->isAdmin())
|
||||||
|
? 'getadmintags'
|
||||||
|
: 'getcontacttags'
|
||||||
|
) . '.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
//window.onload = function() {
|
|
||||||
// document.getElementById("address").focus();
|
|
||||||
//}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<form action="<?php echo $formaction; ?>" method="post">
|
<form action="<?php echo $formaction; ?>" method="post">
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<th align="left"><?php echo T_('Address'); ?></th>
|
<th align="left"><?php echo T_('Address'); ?></th>
|
||||||
<td><input type="text" id="address" name="address" size="75" maxlength="65535" value="<?php echo filter($row['bAddress'], 'xml'); ?>" onblur="useAddress(this)" /></td>
|
<td><input type="text" id="address" name="address" size="75" maxlength="65535" value="<?php echo filter($row['bAddress'], 'xml'); ?>" onblur="useAddress(this)" /></td>
|
||||||
<td>← <?php echo T_('Required'); ?></td>
|
<td>← <?php echo T_('Required'); ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th align="left"><?php echo T_('Title'); ?></th>
|
<th align="left"><?php echo T_('Title'); ?></th>
|
||||||
<td><input type="text" id="titleField" name="title" size="75" maxlength="255" value="<?php echo filter($row['bTitle'], 'xml'); ?>" onkeypress="this.style.backgroundImage = 'none';" /></td>
|
<td><input type="text" id="titleField" name="title" size="75" maxlength="255" value="<?php echo filter($row['bTitle'], 'xml'); ?>" onkeypress="this.style.backgroundImage = 'none';" /></td>
|
||||||
<td>← <?php echo T_('Required'); ?></td>
|
<td>← <?php echo T_('Required'); ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th align="left">
|
<th align="left">
|
||||||
@ -50,7 +58,7 @@ function jsEscTitle($title)
|
|||||||
<a onclick="var nz = document.getElementById('privateNoteZone'); nz.style.display='';this.style.display='none';"><?php echo T_("Add Note"); ?></a>
|
<a onclick="var nz = document.getElementById('privateNoteZone'); nz.style.display='';this.style.display='none';"><?php echo T_("Add Note"); ?></a>
|
||||||
</th>
|
</th>
|
||||||
<td><textarea name="description" id="description" rows="5" cols="63" ><?php echo filter($row['bDescription'], 'xml'); ?></textarea></td>
|
<td><textarea name="description" id="description" rows="5" cols="63" ><?php echo filter($row['bDescription'], 'xml'); ?></textarea></td>
|
||||||
<td>← <?php echo T_('You can use anchors to delimite attributes. for example: [publisher]blah[/publisher] '); ?>
|
<td>← <?php echo T_('You can use anchors to delimite attributes. for example: [publisher]blah[/publisher] '); ?>
|
||||||
<?php if(count($GLOBALS['descriptionAnchors'])>0): ?>
|
<?php if(count($GLOBALS['descriptionAnchors'])>0): ?>
|
||||||
<br /><br />
|
<br /><br />
|
||||||
<?php echo T_('Suggested anchors: '); ?>
|
<?php echo T_('Suggested anchors: '); ?>
|
||||||
@ -67,19 +75,19 @@ function jsEscTitle($title)
|
|||||||
<tr id="privateNoteZone" <?php if(strlen($row['bPrivateNote'])==0):?>style="display:none"<?php endif; ?>>
|
<tr id="privateNoteZone" <?php if(strlen($row['bPrivateNote'])==0):?>style="display:none"<?php endif; ?>>
|
||||||
<th align="left"><?php echo T_('Private Note'); ?></th>
|
<th align="left"><?php echo T_('Private Note'); ?></th>
|
||||||
<td><textarea name="privateNote" id="privateNote" rows="1" cols="63" ><?php echo filter($row['bPrivateNote'], 'xml'); ?></textarea></td>
|
<td><textarea name="privateNote" id="privateNote" rows="1" cols="63" ><?php echo filter($row['bPrivateNote'], 'xml'); ?></textarea></td>
|
||||||
<td>← <?php echo T_('Just visible by you and your contacts.'); ?>
|
<td>← <?php echo T_('Just visible by you and your contacts.'); ?>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th align="left"><?php echo T_('Tags'); ?></th>
|
<th align="left"><?php echo T_('Tags'); ?></th>
|
||||||
<td class="scuttletheme">
|
<td class="scuttletheme">
|
||||||
<span dojoType="dojo.data.ItemFileReadStore" jsId="memberTagStore" url="<?php echo ROOT?>ajax/<?php echo ($GLOBALS['adminsAreAdvisedTagsFromOtherAdmins'] && $currentUser->isAdmin())?'getadmintags':'getcontacttags'?>.php"></span>
|
<input type="text" id="tags" name="tags" size="75" value="<?php echo filter($row['tags'], 'xml'); ?>"/>
|
||||||
<input type="text" dojoType="js.MultiComboBox" id="tags" name="tags" size="75" value="<?php echo filter(implode(', ', $row['tags']), 'xml'); ?>" store="memberTagStore" delimiter="," searchAttr="tag" hasDownArrow="false" queryExpr="*${0}*" autoComplete="false" highlightMatch="all"/></td>
|
</td>
|
||||||
<td>← <?php echo T_('Comma-separated'); ?></td>
|
<td>← <?php echo T_('Comma-separated'); ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
<td align="right"><small><?php echo T_('Note: use ">" to include one tag in another. e.g.: europe>france>paris')?></small></td>
|
<td align="right"><small><?php echo htmlspecialchars(T_('Note: use ">" to include one tag in another. e.g.: europe>france>paris'))?></small></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
@ -124,65 +132,83 @@ function jsEscTitle($title)
|
|||||||
?>
|
?>
|
||||||
</td>
|
</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<link href="<?php echo ROOT ?>js/jquery-ui-1.8.11/themes/base/jquery.ui.all.css" rel="stylesheet" type="text/css"/>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT ?>js/jquery-ui-1.8.11/jquery.ui.core.js"></script>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT ?>js/jquery-ui-1.8.11/jquery.ui.widget.js"></script>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT ?>js/jquery-ui-1.8.11/jquery.ui.position.js"></script>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT ?>js/jquery-ui-1.8.11/jquery.ui.autocomplete.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
//<![CDATA[
|
||||||
|
jQuery(document).ready(function() {
|
||||||
|
function split(val)
|
||||||
|
{
|
||||||
|
return val.split(/[,=><]\s*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractLast(term)
|
||||||
|
{
|
||||||
|
return split(term).pop();
|
||||||
|
}
|
||||||
|
//var availableTags = ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby"];
|
||||||
|
|
||||||
|
jQuery("input#tags").autocomplete({
|
||||||
|
autoFocus: true,
|
||||||
|
minLength: 1,
|
||||||
|
|
||||||
|
source: function(request, response) {
|
||||||
|
// delegate back to autocomplete, but extract the last term
|
||||||
|
var term = extractLast(request.term);
|
||||||
|
if (term.length < this.options.minLength) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
response(
|
||||||
|
/*
|
||||||
|
$.ui.autocomplete.filter(
|
||||||
|
availableTags, extractLast(request.term)
|
||||||
|
)
|
||||||
|
*/
|
||||||
|
$.getJSON(
|
||||||
|
"<?php echo $ajaxUrl; ?>",
|
||||||
|
{ beginsWith: term },
|
||||||
|
response
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
focus: function() {
|
||||||
|
// prevent value inserted on focus
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
select: function(event, ui) {
|
||||||
|
var terms = split(this.value);
|
||||||
|
// remove the current input
|
||||||
|
terms.pop();
|
||||||
|
// add the selected item
|
||||||
|
terms.push(ui.item.value);
|
||||||
|
// add placeholder to get the comma-and-space at the end
|
||||||
|
terms.push("");
|
||||||
|
this.value = terms.join(", ");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
//]]>
|
||||||
|
</script>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
// Dynamic tag selection
|
// Dynamic tag selection
|
||||||
$this->includeTemplate('dynamictags.inc');
|
$this->includeTemplate('dynamictags.inc');
|
||||||
|
|
||||||
// Bookmarklets and import links
|
// Bookmarklets and import links
|
||||||
if (empty($_REQUEST['popup']) && (!isset($showdelete) || !$showdelete)) {
|
if (empty($_REQUEST['popup']) && (!isset($showdelete) || !$showdelete)) {
|
||||||
|
|
||||||
|
$this->includeTemplate('bookmarklet.inc.php');
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<h3><?php echo T_('Bookmarklet'); ?></h3>
|
|
||||||
<script type="text/javascript">
|
|
||||||
//<![CDATA[
|
|
||||||
var browser=navigator.appName;
|
|
||||||
if (browser == "Opera") {
|
|
||||||
document.write('<p>' +
|
|
||||||
<?php echo json_encode(
|
|
||||||
sprintf(
|
|
||||||
T_("Click one of the following bookmarklets to add a button you can click whenever you want to add the page you are on to %s"),
|
|
||||||
$GLOBALS['sitename']
|
|
||||||
)
|
|
||||||
); ?> + ':</p>'
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
document.write('<p>' +
|
|
||||||
<?php echo json_encode(
|
|
||||||
sprintf(
|
|
||||||
T_("Drag one of the following bookmarklets to your browser's bookmarks and click it whenever you want to add the page you are on to %s"),
|
|
||||||
$GLOBALS['sitename']
|
|
||||||
)
|
|
||||||
);
|
|
||||||
?> + ':</p>'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
var selection = '';
|
|
||||||
if (window.getSelection) {
|
|
||||||
selection = 'window.getSelection()';
|
|
||||||
} else if (document.getSelection) {
|
|
||||||
selection = 'document.getSelection()';
|
|
||||||
} else if (document.selection) {
|
|
||||||
selection = 'document.selection.createRange().text';
|
|
||||||
}
|
|
||||||
document.write('<ul>');
|
|
||||||
if (browser == "Opera")
|
|
||||||
{
|
|
||||||
document.write('<li><a class="bookmarklet" href="opera:/button/Go%20to%20page,%20%22javascript:x=document;a=encodeURIComponent(x.location.href);t=encodeURIComponent(x.title);d=encodeURIComponent('+selection+');location.href=\'<?php echo createURL('bookmarks', $GLOBALS['user']); ?>?action=add&address=\'+a+\'&title=\'+t+\'&description=\'+d;void 0%22;,,%22Post%20to%20<?php echo jsEscTitle($GLOBALS['sitename']); ?>%22,%22Scuttle%22"><?php echo jsEscTitle(sprintf(T_('Post to %s'), $GLOBALS['sitename'])); ?><\/a><\/li>');
|
|
||||||
document.write('<li><a class="bookmarklet" href="opera:/button/Go%20to%20page,%20%22javascript:x=document;a=encodeURIComponent(x.location.href);t=encodeURIComponent(x.title);d=encodeURIComponent('+selection+');open(\'<?php echo createURL('bookmarks', $GLOBALS['user']); ?>?action=add&popup=1&address=\'+a+\'&title=\'+t+\'&description=\'+d,\'<?php echo jsEscTitle($GLOBALS['sitename']); ?>\',\'modal=1,status=0,scrollbars=1,toolbar=0,resizable=1,width=790,height=465,left=\'+(screen.width-790)/2+\',top=\'+(screen.height-425)/2);void 0;%22,,%22Post%20to%20<?php echo urlencode($GLOBALS['sitename']); ?>%20(Pop-up)%22,%22Scuttle%22"><?php echo jsEscTitle(sprintf(T_('Post to %s (Pop-up)'), $GLOBALS['sitename'])); ?><\/a><\/li>');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
document.write('<li><a class="bookmarklet" href="javascript:x=document;a=encodeURIComponent(x.location.href);t=encodeURIComponent(x.title);d=encodeURIComponent('+selection+');location.href=\'<?php echo createURL('bookmarks', $GLOBALS['user']); ?>?action=add&address=\'+a+\'&title=\'+t+\'&description=\'+d;void 0;"><?php echo jsEscTitle(sprintf(T_('Post to %s'), $GLOBALS['sitename'])); ?><\/a><\/li>');
|
|
||||||
document.write('<li><a class="bookmarklet" href="javascript:x=document;a=encodeURIComponent(x.location.href);t=encodeURIComponent(x.title);d=encodeURIComponent('+selection+');open(\'<?php echo createURL('bookmarks', $GLOBALS['user']); ?>?action=add&popup=1&address=\'+a+\'&title=\'+t+\'&description=\'+d,\'<?php echo jsEscTitle($GLOBALS['sitename']); ?>\',\'modal=1,status=0,scrollbars=1,toolbar=0,resizable=1,width=790,height=465,left=\'+(screen.width-790)/2+\',top=\'+(screen.height-425)/2);void 0;"><?php echo jsEscTitle(sprintf(T_('Post to %s (Pop-up)'), $GLOBALS['sitename'])); ?><\/a><\/li>');
|
|
||||||
}
|
|
||||||
document.write('<\/ul>');
|
|
||||||
//]]>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<h3><?php echo T_('Import'); ?></h3>
|
<h3><?php echo T_('Import'); ?></h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="<?php echo createURL('importNetscape'); ?>"><?php echo T_('Import bookmarks from bookmark file'); ?></a> (<?php echo T_('Internet Explorer, Mozilla Firefox and Netscape'); ?>)</li>
|
<li><a href="<?php echo createURL('importNetscape'); ?>"><?php echo T_('Import bookmarks from bookmark file'); ?></a> (<?php echo T_('Internet Explorer, Mozilla Firefox and Netscape'); ?>)</li>
|
||||||
|
@ -3,9 +3,7 @@ $this->includeTemplate($GLOBALS['top_include']);
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<form action="<?php echo $formaction; ?>" method="post">
|
<form action="<?php echo $formaction; ?>" method="post">
|
||||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
<input type="hidden" name="token" value="<?php echo $token; ?>"/>
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h3><?php echo T_('Account Details'); ?></h3>
|
<h3><?php echo T_('Account Details'); ?></h3>
|
||||||
|
|
||||||
@ -28,7 +26,7 @@ $this->includeTemplate($GLOBALS['top_include']);
|
|||||||
<tr>
|
<tr>
|
||||||
<th align="left"><?php echo T_('E-mail'); ?></th>
|
<th align="left"><?php echo T_('E-mail'); ?></th>
|
||||||
<td><input type="text" name="pMail" size="75" value="<?php echo filter($objectUser->getEmail(), 'xml'); ?>" /></td>
|
<td><input type="text" name="pMail" size="75" value="<?php echo filter($objectUser->getEmail(), 'xml'); ?>" /></td>
|
||||||
<td>← <?php echo T_('Required'); ?></td>
|
<td>← <?php echo T_('Required'); ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@ -58,7 +56,7 @@ $this->includeTemplate($GLOBALS['top_include']);
|
|||||||
<th align="left"><?php echo T_('Export bookmarks'); ?></th>
|
<th align="left"><?php echo T_('Export bookmarks'); ?></th>
|
||||||
<td>
|
<td>
|
||||||
<a href="../api/export_html.php"><?php echo T_('HTML file (for browsers)')?></a> /
|
<a href="../api/export_html.php"><?php echo T_('HTML file (for browsers)')?></a> /
|
||||||
<a href="../api/posts/all"><?php echo T_('XML file (like del.icio.us)')?></a> /
|
<a href="../api/posts_all.php"><?php echo T_('XML file (like del.icio.us)')?></a> /
|
||||||
<a href="../api/export_csv.php"><?php echo T_('CSV file (for spreadsheet tools)')?></a>
|
<a href="../api/export_csv.php"><?php echo T_('CSV file (for spreadsheet tools)')?></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -1,4 +1,11 @@
|
|||||||
<?php
|
<?php
|
||||||
|
/*
|
||||||
|
* Used in:
|
||||||
|
* - populartags.php
|
||||||
|
* - bookmarks.php
|
||||||
|
* - alltags.php
|
||||||
|
* - tags.php
|
||||||
|
*/
|
||||||
/* Service creation: only useful services are created */
|
/* Service creation: only useful services are created */
|
||||||
$tag2tagservice =SemanticScuttle_Service_Factory::get('Tag2Tag');
|
$tag2tagservice =SemanticScuttle_Service_Factory::get('Tag2Tag');
|
||||||
|
|
||||||
@ -8,98 +15,52 @@ require_once('sidebar.linkedtags.inc.php');
|
|||||||
$user = isset($user)?$user:'';
|
$user = isset($user)?$user:'';
|
||||||
$userid = isset($userid)?$userid:0;
|
$userid = isset($userid)?$userid:0;
|
||||||
$currenttag = isset($currenttag)?$currenttag:'';
|
$currenttag = isset($currenttag)?$currenttag:'';
|
||||||
$summarizeLinkedTags = isset($summarizeLinkedTags)?$summarizeLinkedTags:false;
|
//$summarizeLinkedTags = isset($summarizeLinkedTags)?$summarizeLinkedTags:false;
|
||||||
|
|
||||||
|
|
||||||
$logged_on_userid = $userservice->getCurrentUserId();
|
$logged_on_userid = $userservice->getCurrentUserId();
|
||||||
if ($logged_on_userid === false) {
|
$editingMode = $logged_on_userid !== false;
|
||||||
$logged_on_userid = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
$explodedTags = array();
|
|
||||||
if (strlen($currenttag)>0) {
|
|
||||||
$explodedTags = explode('+', $currenttag);
|
|
||||||
} else {
|
|
||||||
if($summarizeLinkedTags == true) {
|
|
||||||
$orphewTags = $tag2tagservice->getOrphewTags('>', $userid, 4, "nb");
|
|
||||||
} else {
|
|
||||||
$orphewTags = $tag2tagservice->getOrphewTags('>', $userid);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($orphewTags as $orphewTag) {
|
|
||||||
$explodedTags[] = $orphewTag['tag'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
<h2><?php echo T_('Linked Tags'); ?></h2>
|
||||||
|
<div id="related">
|
||||||
<?php
|
<?php
|
||||||
if(($logged_on_userid != null) && ($userid === $logged_on_userid)) {
|
if ($editingMode) {
|
||||||
$editingMode = true;
|
|
||||||
} else {
|
|
||||||
$editingMode = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->includeTemplate("dojo.inc");
|
|
||||||
?>
|
|
||||||
|
|
||||||
<?php if(count($explodedTags)>0 || $editingMode):?>
|
|
||||||
|
|
||||||
<h2><?php
|
|
||||||
|
|
||||||
|
|
||||||
echo T_('Linked Tags').' ';
|
|
||||||
//if($userid != null) {
|
|
||||||
$cUser = $userservice->getUser($userid);
|
|
||||||
//echo '<small><a href="'.createURL('alltags', $cUser['username']).'">('.T_('all tags').')</a></small>';
|
|
||||||
//}
|
|
||||||
?></h2>
|
|
||||||
<?php //endif?>
|
|
||||||
|
|
||||||
<div id="related"> <?php
|
|
||||||
if($editingMode) {
|
|
||||||
echo '<p style="margin-bottom: 13px;text-align:center;">';
|
echo '<p style="margin-bottom: 13px;text-align:center;">';
|
||||||
echo ' (<a href="'. createURL('tag2tagadd','') .'" rel="tag">'.T_('Add new link').'</a>) ';
|
echo ' (<a href="'. createURL('tag2tagadd','') .'" rel="tag">'.T_('Add new link').'</a>) ';
|
||||||
echo ' (<a href="'. createURL('tag2tagdelete','') .'" rel="tag">'.T_('Delete link').'</a>)';
|
echo ' (<a href="'. createURL('tag2tagdelete','') .'" rel="tag">'.T_('Delete link').'</a>)';
|
||||||
echo '</p>';
|
echo '</p>';
|
||||||
}
|
}
|
||||||
|
?>
|
||||||
|
<div id="related-content"></div>
|
||||||
|
<script type="text/javascript">//<![CDATA[
|
||||||
|
jQuery("#related-content")
|
||||||
|
.jstree({
|
||||||
|
"themes" : {
|
||||||
|
"theme": "default",
|
||||||
|
"dots": false,
|
||||||
|
"icons": true,
|
||||||
|
"url": '<?php echo ROOT_JS ?>themes/default/style.css'
|
||||||
|
},
|
||||||
|
"json_data" : {
|
||||||
|
"ajax" : {
|
||||||
|
"url": function(node) {
|
||||||
|
//-1 is root
|
||||||
|
parentparam = "";
|
||||||
|
if (node == -1 ) {
|
||||||
|
node = <?php echo json_encode($currenttag); ?>;
|
||||||
|
parentparam = "&parent=true";
|
||||||
|
} else if (node.attr('rel')) {
|
||||||
|
node = node.attr('rel');
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(strlen($user)==0) {
|
return "<?php echo ROOT ?>ajax/getlinkedtags.php?tag=" + node
|
||||||
$cat_url = createURL('tags', '%2$s');
|
+ parentparam;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$stopList = array();
|
},
|
||||||
foreach($explodedTags as $explodedTag) {
|
plugins : [ "themes", "json_data"]
|
||||||
if(!in_array($explodedTag, $stopList)) {
|
});
|
||||||
|
//]]>
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
// fathers tag
|
|
||||||
$fatherTags = $tag2tagservice->getLinkedTags($explodedTag, '>', $userid, true);
|
|
||||||
if(count($fatherTags)>0) {
|
|
||||||
foreach($fatherTags as $fatherTag) {
|
|
||||||
echo '<a href="'. sprintf($cat_url, filter($user, 'url'), filter($fatherTag, 'url')) .'" rel="tag">('. filter($fatherTag) .')</a> ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
$displayLinkedTags = displayLinkedTags($explodedTag, '>', $userid, $cat_url, $user, $editingMode, null, 1);
|
|
||||||
echo $displayLinkedTags['output'];
|
|
||||||
if(is_array($displayLinkedTags['stopList'])) {
|
|
||||||
$stopList = array_merge($stopList, $displayLinkedTags['stopList']);
|
|
||||||
}*/
|
|
||||||
echo '<div dojoType="dojo.data.ItemFileReadStore" url="'.ROOT.'ajax/getlinkedtags.php?tag='.filter($explodedTag, 'url').'&uId='.$userid.'" jsid="linkedTagStore" ></div>';
|
|
||||||
echo '<div dojoType="dijit.Tree" store="linkedTagStore" labelAttr="name" >';
|
|
||||||
echo '<script type="dojo/method" event="onClick" args="item">';
|
|
||||||
$returnUrl = sprintf($cat_url, filter($user, 'url'), filter('', 'url'));
|
|
||||||
echo 'window.location = "'.$returnUrl.'"+item.name';
|
|
||||||
echo '</script>';
|
|
||||||
echo '<script type="dojo/method" event="getLabelClass" args="item">';
|
|
||||||
echo 'return \'treeTag\';';
|
|
||||||
echo '</script>';
|
|
||||||
echo '</div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
?> </div>
|
|
||||||
|
|
||||||
<?php endif?>
|
|
@ -65,13 +65,13 @@ if (sizeof($menuTags) > 0 || ($userid != 0 && $userid === $logged_on_userid)) {
|
|||||||
<?php $cUser = $userservice->getUser($userid); ?>
|
<?php $cUser = $userservice->getUser($userid); ?>
|
||||||
<?php if($userid>0): ?>
|
<?php if($userid>0): ?>
|
||||||
<?php if($userid==$logged_on_userid): ?>
|
<?php if($userid==$logged_on_userid): ?>
|
||||||
<p style="text-align:right"><a href="<?php echo createURL('alltags', $cUser['username']); ?>" title="<?php echo T_('See all your tags')?>"><?php echo T_('all your tags'); ?></a> →</p>
|
<p style="text-align:right"><a href="<?php echo createURL('alltags', $cUser['username']); ?>" title="<?php echo T_('See all your tags')?>"><?php echo T_('all your tags'); ?></a> →</p>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<p style="text-align:right"><a href="<?php echo createURL('alltags', $cUser['username']); ?>" title="<?php echo T_('See all tags from this user')?>"><?php echo T_('all tags from this user'); ?></a> →</p>
|
<p style="text-align:right"><a href="<?php echo createURL('alltags', $cUser['username']); ?>" title="<?php echo T_('See all tags from this user')?>"><?php echo T_('all tags from this user'); ?></a> →</p>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php else : ?>
|
<?php else : ?>
|
||||||
<p style="text-align:right"><a href="<?php echo createURL('populartags', $cUser['username']); ?>" title="<?php echo T_('See popular tags')?>"><?php echo T_('Popular Tags'); ?></a> →</p>
|
<p style="text-align:right"><a href="<?php echo createURL('populartags', $cUser['username']); ?>" title="<?php echo T_('See popular tags')?>"><?php echo T_('Popular Tags'); ?></a> →</p>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
/* Service creation: only useful services are created */
|
|
||||||
$tag2tagservice =SemanticScuttle_Service_Factory::get('Tag2Tag');
|
|
||||||
|
|
||||||
require_once('sidebar.linkedtags.inc.php');
|
require_once('sidebar.linkedtags.inc.php');
|
||||||
|
|
||||||
/* Manage input */
|
/* Manage input */
|
||||||
@ -15,44 +12,60 @@ if ($logged_on_userid === false) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$cat_url = createURL('tags', '%2$s');
|
$cat_url = createURL('tags', '%s');
|
||||||
$menu2Tags = $GLOBALS['menu2Tags'];
|
$menu2Tags = $GLOBALS['menu2Tags'];
|
||||||
|
|
||||||
if (sizeOf($menu2Tags) > 0) {
|
if (count($menu2Tags) > 0) {
|
||||||
$this->includeTemplate("dojo.inc");
|
?>
|
||||||
?>
|
|
||||||
|
|
||||||
<h2><?php echo T_('Featured Menu Tags');?></h2>
|
<h2><?php echo T_('Featured Menu Tags');?></h2>
|
||||||
|
|
||||||
|
|
||||||
<div id="maintagsmenu"
|
<div id="maintagsmenu"
|
||||||
<?php echo 'title="'.T_('This menu is composed of keywords (tags) organized by admins.').'"'?>>
|
<?php echo 'title="'.T_('This menu is composed of keywords (tags) organized by admins.').'"'?>>
|
||||||
|
<ul>
|
||||||
<?php
|
<?php
|
||||||
foreach($menu2Tags as $menu2Tag) {
|
//this is unneeded and replaced by the ajax tree anyway. we keep it for
|
||||||
|
// non-js browsers
|
||||||
echo '<div dojoType="dojo.data.ItemFileReadStore" url="'.ROOT.'ajax/getadminlinkedtags.php?tag='.filter($menu2Tag, 'url').'" jsid="linkedTagStore" ></div>';
|
foreach ($menu2Tags as $menu2Tag) {
|
||||||
echo '<div dojoType="dijit.Tree" store="linkedTagStore" labelAttr="name" >';
|
echo ' <li>'
|
||||||
echo '<script type="dojo/method" event="onClick" args="item">';
|
. sprintf(
|
||||||
$returnUrl = sprintf($cat_url, filter($user, 'url'), filter('', 'url'));
|
'<a href="%s">%s</a>',
|
||||||
echo 'window.location = "'.$returnUrl.'"+item.name';
|
sprintf($cat_url, $menu2Tag),
|
||||||
echo '</script>';
|
$menu2Tag
|
||||||
//echo '<script type="dojo/method" event="getLabel" args="item">';
|
)
|
||||||
//echo 'return item.name + "...";';
|
. '</li>' . "\n";
|
||||||
//echo '</script>';
|
|
||||||
//echo '<script type="dojo/method" event="onMouseOver" args="item">';
|
|
||||||
//echo 'i = item.relatedTarget;';
|
|
||||||
//echo 'if(i.innerHTML.charAt(i.innerHTML)=="a") alert(i.innerHTML)';
|
|
||||||
//echo '</script>';
|
|
||||||
//echo '<script type="dojo/method" event="getLabelClass" args="item">';
|
|
||||||
//echo 'return \'treeTag\';';
|
|
||||||
//echo '</script>';
|
|
||||||
echo '</div>';
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery("#maintagsmenu")
|
||||||
|
.jstree({
|
||||||
|
"themes" : {
|
||||||
|
"theme": "default",
|
||||||
|
"dots": false,
|
||||||
|
"icons": true,
|
||||||
|
"url": '<?php echo ROOT_JS ?>themes/default/style.css'
|
||||||
|
},
|
||||||
|
"json_data" : {
|
||||||
|
"ajax" : {
|
||||||
|
"url": function(node) {
|
||||||
|
//-1 is root
|
||||||
|
if (node == -1 ) {
|
||||||
|
node = "";
|
||||||
|
} else if (node.attr('rel')) {
|
||||||
|
node = node.attr('rel');
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return "<?php echo ROOT ?>ajax/getadminlinkedtags.php?tag=" + node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugins : [ "themes", "json_data"]
|
||||||
|
});
|
||||||
|
</script>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
@ -31,7 +31,7 @@ if ($recentTags && count($recentTags) > 0) {
|
|||||||
}
|
}
|
||||||
echo $contents ."</p>\n";
|
echo $contents ."</p>\n";
|
||||||
?>
|
?>
|
||||||
<p style="text-align:right"><a href="<?php echo createURL('populartags'); ?>"><?php echo T_('Popular Tags'); ?></a> →</p>
|
<p style="text-align:right"><a href="<?php echo createURL('populartags'); ?>"><?php echo T_('Popular Tags'); ?></a> →</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
@ -34,7 +34,7 @@ foreach ($lastSearches as $row) {
|
|||||||
echo '<a href="'
|
echo '<a href="'
|
||||||
. htmlspecialchars(createURL('search', $range.'/'.$row['shTerms']))
|
. htmlspecialchars(createURL('search', $range.'/'.$row['shTerms']))
|
||||||
. '">';
|
. '">';
|
||||||
echo $row['shTerms'];
|
echo htmlspecialchars($row['shTerms']);
|
||||||
echo '</a>';
|
echo '</a>';
|
||||||
echo ' <span title="'
|
echo ' <span title="'
|
||||||
. T_('Number of bookmarks for this query')
|
. T_('Number of bookmarks for this query')
|
||||||
|
@ -18,7 +18,7 @@ if ($lastUsers && count($lastUsers) > 0) {
|
|||||||
foreach ($lastUsers as $row) {
|
foreach ($lastUsers as $row) {
|
||||||
echo '<tr><td>';
|
echo '<tr><td>';
|
||||||
echo '<a href="'.createURL('profile', $row['username']).'">';
|
echo '<a href="'.createURL('profile', $row['username']).'">';
|
||||||
echo $row['username'];
|
echo SemanticScuttle_Model_UserArray::getName($row);
|
||||||
echo '</a>';
|
echo '</a>';
|
||||||
echo ' (<a href="'.createURL('bookmarks', $row['username']).'">'.T_('bookmarks').'</a>)';
|
echo ' (<a href="'.createURL('bookmarks', $row['username']).'">'.T_('bookmarks').'</a>)';
|
||||||
echo '</td></tr>';
|
echo '</td></tr>';
|
||||||
@ -27,7 +27,7 @@ foreach ($lastUsers as $row) {
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
<p style="text-align:right"><a href="<?php echo createURL('users'); ?>" title="<?php echo T_('See all users')?>"><?php echo T_('All users'); ?></a> →</p>
|
<p style="text-align:right"><a href="<?php echo createURL('users'); ?>" title="<?php echo T_('See all users')?>"><?php echo T_('All users'); ?></a> →</p>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ foreach($watching as $watchuser) {
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<?php if(count($closeContacts)>0):?>
|
<?php if(count($closeContacts)>0):?>
|
||||||
<h2 title="<?php echo T_('Close contacts are mutual contacts');?>"><?php echo ' ↔ '. T_('Close contacts'); ?></h2>
|
<h2 title="<?php echo T_('Close contacts are mutual contacts');?>"><?php echo ' ↔ '. T_('Close contacts'); ?></h2>
|
||||||
<div id="watching">
|
<div id="watching">
|
||||||
<ul>
|
<ul>
|
||||||
<?php foreach($closeContacts as $watchuser): ?>
|
<?php foreach($closeContacts as $watchuser): ?>
|
||||||
@ -27,7 +27,7 @@ foreach($watching as $watchuser) {
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
|
|
||||||
<h2><?php echo ' → '. T_('Watching'); ?></h2>
|
<h2><?php echo ' → '. T_('Watching'); ?></h2>
|
||||||
<div id="watching">
|
<div id="watching">
|
||||||
<ul>
|
<ul>
|
||||||
<?php if($userservice->isLoggedOn() && $currentUser->getUsername() == $user): ?>
|
<?php if($userservice->isLoggedOn() && $currentUser->getUsername() == $user): ?>
|
||||||
@ -41,7 +41,7 @@ foreach($watching as $watchuser) {
|
|||||||
<?php foreach($watching as $watchuser): ?>
|
<?php foreach($watching as $watchuser): ?>
|
||||||
<li><a href="<?php echo createURL('bookmarks', $watchuser); ?>"><?php echo $watchuser; ?></a>
|
<li><a href="<?php echo createURL('bookmarks', $watchuser); ?>"><?php echo $watchuser; ?></a>
|
||||||
<?php if($userservice->isLoggedOn() && $currentUser->getUsername() == $user): ?>
|
<?php if($userservice->isLoggedOn() && $currentUser->getUsername() == $user): ?>
|
||||||
- <a href="<?php echo createUrl('watch','?contact='.$watchuser); ?>" title="<?php echo T_('Remove this contact'); ?>">x<a/>
|
- <a href="<?php echo createUrl('watch','?contact='.$watchuser); ?>" title="<?php echo T_('Remove this contact'); ?>">x</a>
|
||||||
</li>
|
</li>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
@ -49,7 +49,7 @@ foreach($watching as $watchuser) {
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2><?php echo ' ← '. T_('Watched By'); ?></h2>
|
<h2><?php echo ' ← '. T_('Watched By'); ?></h2>
|
||||||
<div id="watching">
|
<div id="watching">
|
||||||
<ul>
|
<ul>
|
||||||
<?php foreach($watchedBy as $watchuser): ?>
|
<?php foreach($watchedBy as $watchuser): ?>
|
||||||
|
@ -4,7 +4,7 @@ $this->includeTemplate($GLOBALS['top_include']);
|
|||||||
|
|
||||||
<form action="<?php echo $formaction; ?>" method="post">
|
<form action="<?php echo $formaction; ?>" method="post">
|
||||||
|
|
||||||
<p align=right" style="float:right">
|
<p align="right" style="float:right">
|
||||||
<small style="text-align:right"><?php echo T_('Note: use "=" to make synonym two tags. e.g.: france=frenchcountry')?></small><br/>
|
<small style="text-align:right"><?php echo T_('Note: use "=" to make synonym two tags. e.g.: france=frenchcountry')?></small><br/>
|
||||||
<small style="text-align:right"><?php echo T_('Note: use ">" to include one tag in another. e.g.: europe>france>paris')?></small><br/>
|
<small style="text-align:right"><?php echo T_('Note: use ">" to include one tag in another. e.g.: europe>france>paris')?></small><br/>
|
||||||
</p>
|
</p>
|
||||||
|
@ -20,7 +20,8 @@ window.onload = function() {
|
|||||||
if(strlen($description['cdDatetime'])>0) {
|
if(strlen($description['cdDatetime'])>0) {
|
||||||
echo T_('Last modification:').' '.$description['cdDatetime'].', ';
|
echo T_('Last modification:').' '.$description['cdDatetime'].', ';
|
||||||
$lastUser = $userservice->getUser($description['uId']);
|
$lastUser = $userservice->getUser($description['uId']);
|
||||||
echo '<a href="'.createURL('profile', $lastUser['username']).'">'.$lastUser['username'].'</a>';
|
echo '<a href="' . createURL('profile', $lastUser['username']) . '">'
|
||||||
|
. SemanticScuttle_Model_UserArray::getName($lastUser) . '</a>';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</td>
|
</td>
|
||||||
|
@ -11,12 +11,12 @@ window.onload = function() {
|
|||||||
<tr>
|
<tr>
|
||||||
<th align="left"><?php echo T_('Old'); ?></th>
|
<th align="left"><?php echo T_('Old'); ?></th>
|
||||||
<td><input type="text" name="old" id="old" value="<?php echo $old; ?>" /></td>
|
<td><input type="text" name="old" id="old" value="<?php echo $old; ?>" /></td>
|
||||||
<td>← <?php echo T_('Required'); ?></td>
|
<td>← <?php echo T_('Required'); ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th align="left"><?php echo T_('New'); ?></th>
|
<th align="left"><?php echo T_('New'); ?></th>
|
||||||
<td><input type="text" name="new" id="new" value="" /></td>
|
<td><input type="text" name="new" id="new" value="" /></td>
|
||||||
<td>← <?php echo T_('Required'); ?></td>
|
<td>← <?php echo T_('Required'); ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
|
||||||
<title><?php echo filter($GLOBALS['sitename'] .(isset($pagetitle) ? ' » ' . $pagetitle : '')); ?></title>
|
<title><?php echo filter($GLOBALS['sitename'] .(isset($pagetitle) ? ' » ' . $pagetitle : '')); ?></title>
|
||||||
<link rel="icon" type="image/png" href="<?php echo ROOT ?>icon.png" />
|
<link rel="icon" type="image/png" href="<?php echo ROOT ?>icon.png" />
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo ROOT ?>scuttle.css" />
|
<link rel="stylesheet" type="text/css" href="<?php echo ROOT ?>scuttle.css" />
|
||||||
@ -17,17 +18,19 @@ if (isset($rsschannels)) {
|
|||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<link rel="stylesheet" type="text/css"
|
|
||||||
href="http://ajax.googleapis.com/ajax/libs/dojo/1.2/dijit/themes/nihilo/nihilo.css" />
|
|
||||||
|
|
||||||
<?php if (isset($loadjs)) :?>
|
<?php if (isset($loadjs)) :?>
|
||||||
|
<?php if (DEBUG_MODE) : ?>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT_JS ?>jquery-1.4.2.js"></script>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT_JS ?>jquery.jstree.js"></script>
|
||||||
|
<?php else: ?>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT_JS ?>jquery-1.4.2.min.js"></script>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT_JS ?>jquery.jstree.min.js"></script>
|
||||||
|
<?php endif ?>
|
||||||
<script type="text/javascript" src="<?php echo ROOT ?>jsScuttle.php"></script>
|
<script type="text/javascript" src="<?php echo ROOT ?>jsScuttle.php"></script>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
<body>
|
||||||
<body class="nihilo">
|
|
||||||
<!-- the class is used by Dojo widgets -->
|
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
$headerstyle = '';
|
$headerstyle = '';
|
||||||
|
@ -14,7 +14,14 @@ if ($users && count($users) > 0) {
|
|||||||
<?php
|
<?php
|
||||||
$contents = '<';
|
$contents = '<';
|
||||||
foreach ($users as $row) {
|
foreach ($users as $row) {
|
||||||
echo '<li><strong>'.$row['username'].'</strong> (<a href="'.createURL('profile', $row['username']).'">'.T_('profile').'</a> '.T_('created in').' '.date('M Y',strtotime($row['uDatetime'])).') : <a href="'.createURL('bookmarks', $row['username']).'">'.T_('bookmarks').'</a></li>';
|
echo '<li><strong>'
|
||||||
|
. SemanticScuttle_Model_UserArray::getName($row) . '</strong>'
|
||||||
|
. ' (<a href="' . createURL('profile', $row['username']) . '">'
|
||||||
|
. T_('profile') . '</a> '
|
||||||
|
. T_('created in') . ' '
|
||||||
|
. date('M Y', strtotime($row['uDatetime'])) . ')'
|
||||||
|
. ' : <a href="' . createURL('bookmarks', $row['username']).'">'
|
||||||
|
. T_('bookmarks') . '</a></li>';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -1,13 +1,18 @@
|
|||||||
ChangeLog for SemantiScuttle
|
ChangeLog for SemantiScuttle
|
||||||
============================
|
============================
|
||||||
|
|
||||||
0.9X.X - 2010-XX-XX
|
0.98.0 - 2011-XX-XX
|
||||||
-------------------
|
-------------------
|
||||||
|
- Switch to jQuery and drop dojo
|
||||||
|
- Fix bug #3187177: Wrong URL / Export XML Bookmarks
|
||||||
- Fix bug in getTagsForBookmarks() that fetched all tags
|
- Fix bug in getTagsForBookmarks() that fetched all tags
|
||||||
- Show error message on mysqli connection errors
|
- Fix bug #3097187: Using opensearch with two tags does not work in Firefox
|
||||||
|
- Implement request #3054906: Show user's full name instead of nickname
|
||||||
- Implement patch #3059829: update FR_CA translation
|
- Implement patch #3059829: update FR_CA translation
|
||||||
|
- Show error message on mysqli connection errors
|
||||||
- Update php-gettext library to 1.0.10
|
- Update php-gettext library to 1.0.10
|
||||||
- api/posts/add respects the "replace" parameter now
|
- api/posts/add respects the "replace" parameter now
|
||||||
|
- Fix privacy issue when fetching tags of several users
|
||||||
|
|
||||||
|
|
||||||
0.97.2 - 2011-02-17
|
0.97.2 - 2011-02-17
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
- Bookmarklets: Text selection is used as description
|
||||||
|
- Tag nesting: Paris > France > World
|
||||||
|
- Tag alias: Deutschland = Germany
|
||||||
|
|
||||||
|
|
||||||
- Which fields are searched?
|
- Which fields are searched?
|
||||||
title, description, private note, username, tags
|
title, description, private note, username, tags
|
||||||
|
|
||||||
|
26
scripts/database-dump.php
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Dumps the semanticscuttle database into a file using mysqldump.
|
||||||
|
*
|
||||||
|
* This file is part of
|
||||||
|
* SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
require_once dirname(__FILE__) . '/../src/SemanticScuttle/header-standalone.php';
|
||||||
|
|
||||||
|
passthru(
|
||||||
|
'mysqldump'
|
||||||
|
. ' -h' . escapeshellarg($GLOBALS['dbhost'])
|
||||||
|
. ' -u' . escapeshellarg($GLOBALS['dbuser'])
|
||||||
|
. ' -p' . escapeshellarg($GLOBALS['dbpass'])
|
||||||
|
. ' ' . escapeshellarg($GLOBALS['dbname'])
|
||||||
|
. ' > semanticscuttle-dump.sql'
|
||||||
|
);
|
||||||
|
?>
|
37
scripts/database-restore.php
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Restores the semanticscuttle database from a given file.
|
||||||
|
*
|
||||||
|
* This file is part of
|
||||||
|
* SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!isset($argv[1])) {
|
||||||
|
echo "Please pass the sql file to restore\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
$file = $argv[1];
|
||||||
|
if (!file_exists($file)) {
|
||||||
|
echo "The file does not exist\n";
|
||||||
|
exit(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once dirname(__FILE__) . '/../src/SemanticScuttle/header-standalone.php';
|
||||||
|
|
||||||
|
passthru(
|
||||||
|
'mysql'
|
||||||
|
. ' -h' . escapeshellarg($GLOBALS['dbhost'])
|
||||||
|
. ' -u' . escapeshellarg($GLOBALS['dbuser'])
|
||||||
|
. ' -p' . escapeshellarg($GLOBALS['dbpass'])
|
||||||
|
. ' ' . escapeshellarg($GLOBALS['dbname'])
|
||||||
|
. ' < ' . escapeshellarg($file)
|
||||||
|
);
|
||||||
|
?>
|
41
src/SemanticScuttle/Model/UserArray.php
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mostly static methods that help working with a user row array from database.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
class SemanticScuttle_Model_UserArray
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns full user name as specified in the profile if it is set,
|
||||||
|
* otherwise the nickname/loginname is returned.
|
||||||
|
*
|
||||||
|
* @param array $row User row array from database
|
||||||
|
*
|
||||||
|
* @return string Full name or username
|
||||||
|
*/
|
||||||
|
public static function getName($row)
|
||||||
|
{
|
||||||
|
if (isset($row['name']) && $row['name']) {
|
||||||
|
return $row['name'];
|
||||||
|
}
|
||||||
|
return $row['username'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
@ -734,7 +734,8 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
|
|||||||
if (SQL_LAYER == 'mysql4') {
|
if (SQL_LAYER == 'mysql4') {
|
||||||
$query_1 .= 'SQL_CALC_FOUND_ROWS ';
|
$query_1 .= 'SQL_CALC_FOUND_ROWS ';
|
||||||
}
|
}
|
||||||
$query_1 .= 'B.*, U.'. $userservice->getFieldName('username');
|
$query_1 .= 'B.*, U.'. $userservice->getFieldName('username')
|
||||||
|
. ', U.name';
|
||||||
|
|
||||||
$query_2 = ' FROM '. $userservice->getTableName() .' AS U'
|
$query_2 = ' FROM '. $userservice->getTableName() .' AS U'
|
||||||
. ', '. $this->getTableName() .' AS B';
|
. ', '. $this->getTableName() .' AS B';
|
||||||
|
@ -454,58 +454,155 @@ class SemanticScuttle_Service_Bookmark2Tag extends SemanticScuttle_DbService
|
|||||||
return $output;
|
return $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
function &getAdminTags($limit = 30, $logged_on_user = NULL, $days = NULL) {
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the tags used by admin users
|
||||||
|
*
|
||||||
|
* @param integer $limit Number of tags to return
|
||||||
|
* @param integer $logged_on_user ID of the user that's currently logged in.
|
||||||
|
* If the logged in user equals the $user to find
|
||||||
|
* tags for, tags of private bookmarks are
|
||||||
|
* returned.
|
||||||
|
* @param integer $days Bookmarks have to be changed in the last X days
|
||||||
|
* if their tags shall count
|
||||||
|
* @param string $beginsWith The tag name shall begin with that string
|
||||||
|
*
|
||||||
|
* @return array Array of found tags. Each tag entry is an array with two keys,
|
||||||
|
* 'tag' (tag name) and 'bCount'.
|
||||||
|
*
|
||||||
|
* @see getPopularTags()
|
||||||
|
*/
|
||||||
|
public function getAdminTags(
|
||||||
|
$limit = 30, $logged_on_user = null, $days = null, $beginsWith = null
|
||||||
|
) {
|
||||||
// look for admin ids
|
// look for admin ids
|
||||||
$userservice = SemanticScuttle_Service_Factory :: get('User');
|
$userservice = SemanticScuttle_Service_Factory::get('User');
|
||||||
$adminIds = $userservice->getAdminIds();
|
$adminIds = $userservice->getAdminIds();
|
||||||
|
|
||||||
// ask for their tags
|
// ask for their tags
|
||||||
return $this->getPopularTags($adminIds, $limit, $logged_on_user, $days);
|
return $this->getPopularTags(
|
||||||
|
$adminIds, $limit, $logged_on_user, $days, $beginsWith
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function &getContactTags($user, $limit = 30, $logged_on_user = NULL, $days = NULL) {
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the tags used by users that are part of the user's watchlist,
|
||||||
|
* and the current user's own tags.
|
||||||
|
*
|
||||||
|
* @param integer $user ID of the user to get the watchlist from
|
||||||
|
* @param integer $limit Number of tags to return
|
||||||
|
* @param integer $logged_on_user ID of the user that's currently logged in.
|
||||||
|
* If set, that user is added to the list of
|
||||||
|
* people to get the tags from
|
||||||
|
* @param integer $days Bookmarks have to be changed in the last X days
|
||||||
|
* if their tags shall count
|
||||||
|
* @param string $beginsWith The tag name shall begin with that string
|
||||||
|
*
|
||||||
|
* @return array Array of found tags. Each tag entry is an array with two keys,
|
||||||
|
* 'tag' (tag name) and 'bCount'.
|
||||||
|
*
|
||||||
|
* @see getPopularTags()
|
||||||
|
*/
|
||||||
|
public function getContactTags(
|
||||||
|
$user, $limit = 30, $logged_on_user = null, $days = null,
|
||||||
|
$beginsWith = null
|
||||||
|
) {
|
||||||
// look for contact ids
|
// look for contact ids
|
||||||
$userservice = SemanticScuttle_Service_Factory :: get('User');
|
$userservice = SemanticScuttle_Service_Factory::get('User');
|
||||||
$contacts = $userservice->getWatchlist($user);
|
$contacts = $userservice->getWatchlist($user);
|
||||||
|
|
||||||
// add the user (to show him/her also his/her tags)
|
// add the user (to show him also his own tags)
|
||||||
if(!is_null($logged_on_user)) {
|
if (!is_null($logged_on_user)) {
|
||||||
$contacts[] = $logged_on_user;
|
$contacts[] = $logged_on_user;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ask for their tags
|
// ask for their tags
|
||||||
return $this->getPopularTags($contacts, $limit, $logged_on_user, $days);
|
return $this->getPopularTags(
|
||||||
|
$contacts, $limit, $logged_on_user, $days, $beginsWith
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// $users can be {NULL, an id, an array of id}
|
|
||||||
function &getPopularTags($user = NULL, $limit = 30, $logged_on_user = NULL, $days = NULL) {
|
|
||||||
|
/**
|
||||||
|
* The the most popular tags and their usage count
|
||||||
|
*
|
||||||
|
* @param mixed $user Integer user ID or array of user IDs to limit tag
|
||||||
|
* finding to
|
||||||
|
* @param integer $limit Number of tags to return
|
||||||
|
* @param integer $logged_on_user ID of the user that's currently logged in.
|
||||||
|
* If the logged in user equals the $user to find
|
||||||
|
* tags for, tags of private bookmarks are
|
||||||
|
* returned.
|
||||||
|
* @param integer $days Bookmarks have to be changed in the last X days
|
||||||
|
* if their tags shall count
|
||||||
|
* @param string $beginsWith The tag name shall begin with that string
|
||||||
|
*
|
||||||
|
* @return array Array of found tags. Each tag entry is an array with two keys,
|
||||||
|
* 'tag' (tag name) and 'bCount'.
|
||||||
|
*
|
||||||
|
* @see getAdminTags()
|
||||||
|
* @see getContactTags()
|
||||||
|
*/
|
||||||
|
public function getPopularTags(
|
||||||
|
$user = null, $limit = 30, $logged_on_user = null, $days = null,
|
||||||
|
$beginsWith = null
|
||||||
|
) {
|
||||||
// Only count the tags that are visible to the current user.
|
// Only count the tags that are visible to the current user.
|
||||||
if (($user != $logged_on_user) || is_null($user) || ($user === false))
|
if (($user != $logged_on_user) || is_null($user) || ($user === false)) {
|
||||||
$privacy = ' AND B.bStatus = 0';
|
$privacy = ' AND B.bStatus = 0';
|
||||||
else
|
|
||||||
$privacy = '';
|
|
||||||
|
|
||||||
if (is_null($days) || !is_int($days))
|
|
||||||
$span = '';
|
|
||||||
else
|
|
||||||
$span = ' AND B.bDatetime > "'. date('Y-m-d H:i:s', time() - (86400 * $days)) .'"';
|
|
||||||
|
|
||||||
$query = 'SELECT T.tag, COUNT(T.bId) AS bCount FROM '. $this->getTableName() .' AS T, '. $GLOBALS['tableprefix'] .'bookmarks AS B WHERE ';
|
|
||||||
if (is_null($user) || ($user === false)) {
|
|
||||||
$query .= 'B.bId = T.bId AND B.bStatus = 0';
|
|
||||||
} elseif(is_array($user)) {
|
|
||||||
$query .= ' (1 = 0'; //tricks
|
|
||||||
foreach($user as $u) {
|
|
||||||
$query .= ' OR B.uId = '. $this->db->sql_escape($u) .' AND B.bId = T.bId';
|
|
||||||
}
|
|
||||||
$query .= ' )';
|
|
||||||
} else {
|
} else {
|
||||||
$query .= 'B.uId = '. $this->db->sql_escape($user) .' AND B.bId = T.bId'. $privacy;
|
$privacy = '';
|
||||||
}
|
}
|
||||||
$query .= $span .' AND LEFT(T.tag, 7) <> "system:" GROUP BY T.tag ORDER BY bCount DESC, tag';
|
|
||||||
|
|
||||||
if (!($dbresult =& $this->db->sql_query_limit($query, $limit))) {
|
$query = 'SELECT'
|
||||||
message_die(GENERAL_ERROR, 'Could not get popular tags', '', __LINE__, __FILE__, $query, $this->db);
|
. ' T.tag, COUNT(T.bId) AS bCount'
|
||||||
|
. ' FROM '
|
||||||
|
. $this->getTableName() . ' AS T'
|
||||||
|
. ', ' . $GLOBALS['tableprefix'] . 'bookmarks AS B'
|
||||||
|
. ' WHERE';
|
||||||
|
|
||||||
|
if (is_null($user) || ($user === false)) {
|
||||||
|
$query .= ' B.bId = T.bId AND B.bStatus = 0';
|
||||||
|
} else if (is_array($user)) {
|
||||||
|
$query .= ' (1 = 0'; //tricks
|
||||||
|
foreach ($user as $u) {
|
||||||
|
if (is_numeric($u)) {
|
||||||
|
$query .= ' OR B.uId = ' . $this->db->sql_escape($u)
|
||||||
|
. ' AND B.bId = T.bId';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$query .= ' )' . $privacy;
|
||||||
|
} else {
|
||||||
|
$query .= ' B.uId = ' . $this->db->sql_escape($user)
|
||||||
|
. ' AND B.bId = T.bId' . $privacy;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_int($days)) {
|
||||||
|
$query .= ' AND B.bDatetime > "'
|
||||||
|
. date('Y-m-d H:i:s', time() - (86400 * $days))
|
||||||
|
. '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_null($beginsWith)) {
|
||||||
|
$query .= ' AND T.tag LIKE \''
|
||||||
|
. $this->db->sql_escape($beginsWith)
|
||||||
|
. '%\'';
|
||||||
|
}
|
||||||
|
|
||||||
|
$query .= ' AND LEFT(T.tag, 7) <> "system:"'
|
||||||
|
. ' GROUP BY T.tag'
|
||||||
|
. ' ORDER BY bCount DESC, tag';
|
||||||
|
|
||||||
|
if (!($dbresult = $this->db->sql_query_limit($query, $limit))) {
|
||||||
|
message_die(
|
||||||
|
GENERAL_ERROR, 'Could not get popular tags',
|
||||||
|
'', __LINE__, __FILE__, $query, $this->db
|
||||||
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -514,6 +611,8 @@ class SemanticScuttle_Service_Bookmark2Tag extends SemanticScuttle_DbService
|
|||||||
return $output;
|
return $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function hasTag($bookmarkid, $tag) {
|
function hasTag($bookmarkid, $tag) {
|
||||||
$query = 'SELECT COUNT(*) AS tCount FROM '. $this->getTableName() .' WHERE bId = '. intval($bookmarkid) .' AND tag ="'. $this->db->sql_escape($tag) .'"';
|
$query = 'SELECT COUNT(*) AS tCount FROM '. $this->getTableName() .' WHERE bId = '. intval($bookmarkid) .' AND tag ="'. $this->db->sql_escape($tag) .'"';
|
||||||
|
|
||||||
@ -592,7 +691,15 @@ class SemanticScuttle_Service_Bookmark2Tag extends SemanticScuttle_DbService
|
|||||||
return $output;
|
return $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteAll() {
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes all tags in bookmarks2tags
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function deleteAll()
|
||||||
|
{
|
||||||
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
|
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
|
||||||
$this->db->sql_query($query);
|
$this->db->sql_query($query);
|
||||||
}
|
}
|
||||||
|
@ -107,6 +107,7 @@ class SemanticScuttle_Service_Factory
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads self::$db if it is not loaded already.
|
* Loads self::$db if it is not loaded already.
|
||||||
|
* Dies if the connection could not be established.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@ -141,7 +142,7 @@ class SemanticScuttle_Service_Factory
|
|||||||
/**
|
/**
|
||||||
* Returns sql database object
|
* Returns sql database object
|
||||||
*
|
*
|
||||||
* @return void
|
* @return sql_db Database instance
|
||||||
*/
|
*/
|
||||||
public static function getDb()
|
public static function getDb()
|
||||||
{
|
{
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SemanticScuttle tag-to-tag service.
|
* SemanticScuttle tag-to-tag service which works with tag relations.
|
||||||
*
|
*
|
||||||
* @category Bookmarking
|
* @category Bookmarking
|
||||||
* @package SemanticScuttle
|
* @package SemanticScuttle
|
||||||
@ -102,18 +102,49 @@ class SemanticScuttle_Service_Tag2Tag extends SemanticScuttle_DbService
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return linked tags just for admin users
|
|
||||||
function getAdminLinkedTags($tag, $relationType, $inverseRelation = false, $stopList = array()) {
|
|
||||||
|
/**
|
||||||
|
* Same as getLinkedTags(), but only tags that have been created
|
||||||
|
* by admin users are returned.
|
||||||
|
*
|
||||||
|
* @param string $tag Tag to get related tags for
|
||||||
|
* @param string $relationType Type of tag-to-tag relation: >, < or =
|
||||||
|
* @param boolean $inverseRelation Reverse relation (parent -> child)
|
||||||
|
* @param array $stopList Array of tags that shall not be returned
|
||||||
|
*
|
||||||
|
* @return array Array of tag names
|
||||||
|
*
|
||||||
|
* @see getLinkedTags()
|
||||||
|
*/
|
||||||
|
public function getAdminLinkedTags(
|
||||||
|
$tag, $relationType, $inverseRelation = false, $stopList = array()
|
||||||
|
) {
|
||||||
// look for admin ids
|
// look for admin ids
|
||||||
$userservice = SemanticScuttle_Service_Factory :: get('User');
|
$userservice = SemanticScuttle_Service_Factory :: get('User');
|
||||||
$adminIds = $userservice->getAdminIds();
|
$adminIds = $userservice->getAdminIds();
|
||||||
|
|
||||||
//ask for their linked tags
|
//ask for their linked tags
|
||||||
return $this->getLinkedTags($tag, $relationType, $adminIds, $inverseRelation, $stopList);
|
return $this->getLinkedTags(
|
||||||
|
$tag, $relationType, $adminIds, $inverseRelation, $stopList
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the target linked tags. If inverseRelation is true, return the source linked tags.
|
|
||||||
function getLinkedTags($tag, $relationType, $uId = null, $inverseRelation = false, $stopList = array()) {
|
|
||||||
|
/**
|
||||||
|
* Returns an array of tags that are in relation to the given $tag.
|
||||||
|
*
|
||||||
|
* @param string $tag Tag to get related tags for
|
||||||
|
* @param string $relationType Type of tag-to-tag relation: >, < or =
|
||||||
|
* @param boolean $inverseRelation Reverse relation (parent -> child)
|
||||||
|
* @param array $stopList Array of tags that shall not be returned
|
||||||
|
*
|
||||||
|
* @return array Array of tag names
|
||||||
|
*/
|
||||||
|
public function getLinkedTags(
|
||||||
|
$tag, $relationType, $uId = null, $inverseRelation = false, $stopList = array()
|
||||||
|
) {
|
||||||
// Set up the SQL query.
|
// Set up the SQL query.
|
||||||
if($inverseRelation) {
|
if($inverseRelation) {
|
||||||
$queriedTag = "tag1";
|
$queriedTag = "tag1";
|
||||||
|
@ -203,18 +203,26 @@ class SemanticScuttle_Service_User extends SemanticScuttle_DbService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Takes an numerical "id" or a string "username"
|
/**
|
||||||
and returns the numerical "id" if the user exists else returns NULL */
|
* Obtains the ID of the given user name.
|
||||||
function getIdFromUser($user) {
|
* If a user ID is passed, it is returned.
|
||||||
|
* In case the user does not exist, NULL is returned.
|
||||||
|
*
|
||||||
|
* @param string|integer $user User name or user ID
|
||||||
|
*
|
||||||
|
* @return integer NULL if not found or the user ID
|
||||||
|
*/
|
||||||
|
public function getIdFromUser($user)
|
||||||
|
{
|
||||||
if (is_int($user)) {
|
if (is_int($user)) {
|
||||||
return intval($user);
|
return intval($user);
|
||||||
} else {
|
} else {
|
||||||
$objectUser = $this->getObjectUserByUsername($user);
|
$objectUser = $this->getObjectUserByUsername($user);
|
||||||
if($objectUser != NULL) {
|
if ($objectUser != null) {
|
||||||
return $objectUser->getId();
|
return $objectUser->getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,34 +1,51 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/**
|
||||||
* Define constants used in all the application.
|
* Define constants used in all the application.
|
||||||
* Some constants are based on variables from configuration file.
|
* Some constants are based on variables from configuration file.
|
||||||
|
*
|
||||||
|
* SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @subcategory Base
|
||||||
|
* @author Benjamin Huynh-Kim-Bang <mensonge@users.sourceforge.net>
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @author Eric Dane <ericdane@users.sourceforge.net>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Debug managament
|
// Debug managament
|
||||||
if(isset($GLOBALS['debugMode'])) {
|
if (isset($GLOBALS['debugMode'])) {
|
||||||
define('DEBUG_MODE', $GLOBALS['debugMode']);
|
define('DEBUG_MODE', $GLOBALS['debugMode']);
|
||||||
define('DEBUG_EXTRA', $GLOBALS['debugMode']); // Constant used exclusively into db/ directory
|
// Constant used exclusively into db/ directory
|
||||||
|
define('DEBUG_EXTRA', $GLOBALS['debugMode']);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine the base URL as ROOT
|
// Determine the base URL as ROOT
|
||||||
if (!isset($GLOBALS['root'])) {
|
if (!isset($GLOBALS['root'])) {
|
||||||
$pieces = explode('/', $_SERVER['SCRIPT_NAME']);
|
$pieces = explode('/', $_SERVER['SCRIPT_NAME']);
|
||||||
|
|
||||||
$rootTmp = '/';
|
|
||||||
foreach ($pieces as $piece) {
|
|
||||||
//we eliminate possible sscuttle subfolders (like gsearch for example)
|
|
||||||
if ($piece != '' && !strstr($piece, '.php') && $piece != 'gsearch') {
|
|
||||||
$rootTmp .= $piece .'/';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (($rootTmp != '/') && (substr($rootTmp, -1, 1) != '/')) {
|
|
||||||
$rootTmp .= '/';
|
|
||||||
}
|
|
||||||
|
|
||||||
define('ROOT', 'http://'. $_SERVER['HTTP_HOST'] . $rootTmp);
|
$rootTmp = '/';
|
||||||
|
foreach ($pieces as $piece) {
|
||||||
|
//we eliminate possible sscuttle subfolders (like gsearch for example)
|
||||||
|
if ($piece != '' && !strstr($piece, '.php')
|
||||||
|
&& $piece != 'gsearch' && $piece != 'ajax'
|
||||||
|
) {
|
||||||
|
$rootTmp .= $piece .'/';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (($rootTmp != '/') && (substr($rootTmp, -1, 1) != '/')) {
|
||||||
|
$rootTmp .= '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
define('ROOT', 'http://'. $_SERVER['HTTP_HOST'] . $rootTmp);
|
||||||
} else {
|
} else {
|
||||||
define('ROOT', $GLOBALS['root']);
|
define('ROOT', $GLOBALS['root']);
|
||||||
}
|
}
|
||||||
|
define('ROOT_JS', ROOT . 'js/jstree-1.0-rc2/');
|
||||||
|
|
||||||
// Error codes
|
// Error codes
|
||||||
define('GENERAL_MESSAGE', 200);
|
define('GENERAL_MESSAGE', 200);
|
||||||
@ -44,19 +61,21 @@ define('PAGE_WATCHLIST', "watchlist");
|
|||||||
|
|
||||||
// Miscellanous
|
// Miscellanous
|
||||||
|
|
||||||
// INSTALLATION_ID is based on directory DB and used as prefix (in session and cookie) to prevent mutual login for different installations on the same host server
|
// INSTALLATION_ID is based on directory DB and used as prefix
|
||||||
|
// (in session and cookie) to prevent mutual login for different
|
||||||
|
// installations on the same host server
|
||||||
define('INSTALLATION_ID', md5($GLOBALS['dbname'].$GLOBALS['tableprefix']));
|
define('INSTALLATION_ID', md5($GLOBALS['dbname'].$GLOBALS['tableprefix']));
|
||||||
|
|
||||||
// Correct bugs with PATH_INFO (maybe for Apache 1 or CGI) -- for 1&1 host...
|
// Correct bugs with PATH_INFO (maybe for Apache 1 or CGI) -- for 1&1 host...
|
||||||
if (isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO'])) {
|
if (isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO'])) {
|
||||||
if(strlen($_SERVER["PATH_INFO"])<strlen($_SERVER["ORIG_PATH_INFO"])) {
|
if (strlen($_SERVER["PATH_INFO"])<strlen($_SERVER["ORIG_PATH_INFO"])) {
|
||||||
$_SERVER["PATH_INFO"] = $_SERVER["ORIG_PATH_INFO"];
|
$_SERVER["PATH_INFO"] = $_SERVER["ORIG_PATH_INFO"];
|
||||||
}
|
}
|
||||||
if(strcasecmp($_SERVER["PATH_INFO"], $_SERVER["SCRIPT_NAME "]) == 0) {
|
if (strcasecmp($_SERVER["PATH_INFO"], $_SERVER["SCRIPT_NAME "]) == 0) {
|
||||||
unset($_SERVER["PATH_INFO"]);
|
unset($_SERVER["PATH_INFO"]);
|
||||||
}
|
}
|
||||||
if(strpos($_SERVER["PATH_INFO"], '.php') !== false) {
|
if (strpos($_SERVER["PATH_INFO"], '.php') !== false) {
|
||||||
unset($_SERVER["PATH_INFO"]);
|
unset($_SERVER["PATH_INFO"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
@ -82,6 +82,7 @@ require_once 'SemanticScuttle/Service.php';
|
|||||||
require_once 'SemanticScuttle/DbService.php';
|
require_once 'SemanticScuttle/DbService.php';
|
||||||
require_once 'SemanticScuttle/Service/Factory.php';
|
require_once 'SemanticScuttle/Service/Factory.php';
|
||||||
require_once 'SemanticScuttle/functions.php';
|
require_once 'SemanticScuttle/functions.php';
|
||||||
|
require_once 'SemanticScuttle/Model/UserArray.php';
|
||||||
|
|
||||||
if (count($GLOBALS['serviceoverrides']) > 0
|
if (count($GLOBALS['serviceoverrides']) > 0
|
||||||
&& !defined('UNIT_TEST_MODE')
|
&& !defined('UNIT_TEST_MODE')
|
||||||
@ -134,7 +135,15 @@ $tplVars['userservice'] = $userservice;
|
|||||||
if (!defined('UNIT_TEST_MODE') || defined('HTTP_UNIT_TEST_MODE')) {
|
if (!defined('UNIT_TEST_MODE') || defined('HTTP_UNIT_TEST_MODE')) {
|
||||||
//API files define that, so we need a way to support both of them
|
//API files define that, so we need a way to support both of them
|
||||||
if (!isset($httpContentType)) {
|
if (!isset($httpContentType)) {
|
||||||
$httpContentType = 'text/html';
|
if (DEBUG_MODE) {
|
||||||
|
//using that mime type makes all javascript nice in Chromium
|
||||||
|
// it also serves as test base if the pages really validate
|
||||||
|
$httpContentType = 'application/xhtml+xml';
|
||||||
|
} else {
|
||||||
|
//until we are sure that all pages validate, we
|
||||||
|
// keep the non-strict mode on for normal installations
|
||||||
|
$httpContentType = 'text/html';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ($httpContentType !== false) {
|
if ($httpContentType !== false) {
|
||||||
header('Content-Type: ' . $httpContentType . '; charset=utf-8');
|
header('Content-Type: ' . $httpContentType . '; charset=utf-8');
|
||||||
|
@ -12,23 +12,15 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'AllTests::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'prepare.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SemanticScuttle unit tests.
|
* SemanticScuttle unit tests.
|
||||||
*
|
*
|
||||||
* To launch this tests, you need PHPUnit 3.
|
* To launch this tests, you need PHPUnit 3.
|
||||||
* Run them with:
|
* Run them with:
|
||||||
* $ php tests/AllTests.php
|
* $ cd tests; phpunit .
|
||||||
* or single files like:
|
* or single files like:
|
||||||
* $ php tests/BookmarkTest.php
|
* $ cd tests; phpunit BookmarkTest.php
|
||||||
*
|
|
||||||
* You also may use phpunit directly:
|
|
||||||
* $ phpunit tests/AllTests.php
|
|
||||||
*
|
*
|
||||||
* @category Bookmarking
|
* @category Bookmarking
|
||||||
* @package SemanticScuttle
|
* @package SemanticScuttle
|
||||||
@ -40,14 +32,6 @@ require_once 'prepare.php';
|
|||||||
*/
|
*/
|
||||||
class AllTests extends PHPUnit_Framework_TestSuite
|
class AllTests extends PHPUnit_Framework_TestSuite
|
||||||
{
|
{
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(self::suite());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static function suite()
|
public static function suite()
|
||||||
{
|
{
|
||||||
$suite = new AllTests();
|
$suite = new AllTests();
|
||||||
@ -74,9 +58,4 @@ class AllTests extends PHPUnit_Framework_TestSuite
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'AllTests::main') {
|
|
||||||
AllTests::main();
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
?>
|
@ -12,14 +12,8 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../prepare.php';
|
|
||||||
require_once 'HTTP/Request2.php';
|
require_once 'HTTP/Request2.php';
|
||||||
|
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'Api_ExportCsvTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle csv export API
|
* Unit tests for the SemanticScuttle csv export API
|
||||||
*
|
*
|
||||||
@ -39,21 +33,6 @@ class Api_ExportCsvTest extends TestBaseApi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test if authentication is required when sending no auth data
|
* Test if authentication is required when sending no auth data
|
||||||
*/
|
*/
|
||||||
@ -280,8 +259,4 @@ class Api_ExportCsvTest extends TestBaseApi
|
|||||||
return $ar;
|
return $ar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'Api_ExportCsvTest::main') {
|
|
||||||
Api_ExportCsvTest::main();
|
|
||||||
}
|
|
||||||
?>
|
?>
|
76
tests/Api/OpenSearchTest.php
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
class Api_OpenSearchTest extends TestBaseApi
|
||||||
|
{
|
||||||
|
protected $urlPart = '';
|
||||||
|
|
||||||
|
|
||||||
|
public function testOpenSearchAvailable()
|
||||||
|
{
|
||||||
|
$req = $this->getRequest();
|
||||||
|
$xhtml = $req->send()->getBody();
|
||||||
|
|
||||||
|
$xml = simplexml_load_string($xhtml);
|
||||||
|
$xml->registerXPathNamespace('h', reset($xml->getDocNamespaces()));
|
||||||
|
|
||||||
|
$this->assertInstanceOf(
|
||||||
|
'SimpleXMLElement', $xml,
|
||||||
|
'SemanticScuttle main page XHTML could not be loaded - maybe invalid?'
|
||||||
|
);
|
||||||
|
|
||||||
|
$arElements = $xml->xpath(
|
||||||
|
'//h:head/h:link'
|
||||||
|
. '[@rel="search" and @type="application/opensearchdescription+xml"]'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
1, count($arElements),
|
||||||
|
'OpenSearch link in HTML is missing'
|
||||||
|
);
|
||||||
|
$searchDescUrl = (string)$arElements[0]['href'];
|
||||||
|
$this->assertNotNull($searchDescUrl, 'Search description URL is empty');
|
||||||
|
|
||||||
|
$req = new HTTP_Request2($searchDescUrl);
|
||||||
|
$res = $req->send();
|
||||||
|
$this->assertEquals(
|
||||||
|
200, $res->getStatus(),
|
||||||
|
'HTTP response status code is not 200'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
$GLOBALS['unittestUrl'] . 'api/opensearch.php',
|
||||||
|
$searchDescUrl,
|
||||||
|
'OpenSearch URL found, but it is not the expected one.'
|
||||||
|
. ' It may be that you misconfigured the "unittestUrl" setting'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testOpenSearchContentType()
|
||||||
|
{
|
||||||
|
$res = $this->getRequest('api/opensearch.php')->send();
|
||||||
|
$this->assertEquals(
|
||||||
|
'text/xml; charset=utf-8',
|
||||||
|
$res->getHeader('content-type')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testOpenSearchSearchUrl()
|
||||||
|
{
|
||||||
|
$xml = $this->getRequest('api/opensearch.php')->send()->getBody();
|
||||||
|
$x = simplexml_load_string($xml);
|
||||||
|
$x->registerXPathNamespace('os', reset($x->getDocNamespaces()));
|
||||||
|
|
||||||
|
$arElements = $x->xpath('//os:Url[@type="text/html"]');
|
||||||
|
$this->assertEquals(
|
||||||
|
1, count($arElements),
|
||||||
|
'Url in OpenSearch description is missing'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$GLOBALS['unittestUrl'] . 'search.php/all/{searchTerms}',
|
||||||
|
(string)$arElements[0]['template']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -12,14 +12,8 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../prepare.php';
|
|
||||||
require_once 'HTTP/Request2.php';
|
require_once 'HTTP/Request2.php';
|
||||||
|
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'Api_PostsAddTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle post addition API.
|
* Unit tests for the SemanticScuttle post addition API.
|
||||||
*
|
*
|
||||||
@ -37,28 +31,6 @@ class Api_PostsAddTest extends TestBaseApi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function setUp()
|
|
||||||
{
|
|
||||||
parent::setUp();
|
|
||||||
$this->bs->deleteAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test if authentication is required when sending no auth data
|
* Test if authentication is required when sending no auth data
|
||||||
*/
|
*/
|
||||||
@ -89,6 +61,8 @@ class Api_PostsAddTest extends TestBaseApi
|
|||||||
*/
|
*/
|
||||||
public function testAddBookmarkPost()
|
public function testAddBookmarkPost()
|
||||||
{
|
{
|
||||||
|
$this->bs->deleteAll();
|
||||||
|
|
||||||
$bmUrl = 'http://example.org/tag-1';
|
$bmUrl = 'http://example.org/tag-1';
|
||||||
$bmTags = array('foo', 'bar', 'baz');
|
$bmTags = array('foo', 'bar', 'baz');
|
||||||
$bmDatetime = '2010-09-08T03:02:01Z';
|
$bmDatetime = '2010-09-08T03:02:01Z';
|
||||||
@ -149,6 +123,8 @@ TXT;
|
|||||||
*/
|
*/
|
||||||
public function testAddBookmarkGet()
|
public function testAddBookmarkGet()
|
||||||
{
|
{
|
||||||
|
$this->bs->deleteAll();
|
||||||
|
|
||||||
$bmUrl = 'http://example.org/tag-1';
|
$bmUrl = 'http://example.org/tag-1';
|
||||||
$bmTags = array('foo', 'bar', 'baz');
|
$bmTags = array('foo', 'bar', 'baz');
|
||||||
$bmDatetime = '2010-09-08T03:02:01Z';
|
$bmDatetime = '2010-09-08T03:02:01Z';
|
||||||
@ -208,6 +184,8 @@ TXT;
|
|||||||
*/
|
*/
|
||||||
public function testUrlDescEnough()
|
public function testUrlDescEnough()
|
||||||
{
|
{
|
||||||
|
$this->bs->deleteAll();
|
||||||
|
|
||||||
list($req, $uId) = $this->getAuthRequest();
|
list($req, $uId) = $this->getAuthRequest();
|
||||||
$req->setMethod(HTTP_Request2::METHOD_POST);
|
$req->setMethod(HTTP_Request2::METHOD_POST);
|
||||||
$req->addPostParameter('url', 'http://example.org/tag2');
|
$req->addPostParameter('url', 'http://example.org/tag2');
|
||||||
@ -242,6 +220,8 @@ TXT;
|
|||||||
*/
|
*/
|
||||||
public function testUrlRequired()
|
public function testUrlRequired()
|
||||||
{
|
{
|
||||||
|
$this->bs->deleteAll();
|
||||||
|
|
||||||
list($req, $uId) = $this->getAuthRequest();
|
list($req, $uId) = $this->getAuthRequest();
|
||||||
$req->setMethod(HTTP_Request2::METHOD_POST);
|
$req->setMethod(HTTP_Request2::METHOD_POST);
|
||||||
//$req->addPostParameter('url', 'http://example.org/tag2');
|
//$req->addPostParameter('url', 'http://example.org/tag2');
|
||||||
@ -276,6 +256,8 @@ TXT;
|
|||||||
*/
|
*/
|
||||||
public function testDescriptionRequired()
|
public function testDescriptionRequired()
|
||||||
{
|
{
|
||||||
|
$this->bs->deleteAll();
|
||||||
|
|
||||||
list($req, $uId) = $this->getAuthRequest();
|
list($req, $uId) = $this->getAuthRequest();
|
||||||
$req->setMethod(HTTP_Request2::METHOD_POST);
|
$req->setMethod(HTTP_Request2::METHOD_POST);
|
||||||
$req->addPostParameter('url', 'http://example.org/tag2');
|
$req->addPostParameter('url', 'http://example.org/tag2');
|
||||||
@ -310,6 +292,8 @@ TXT;
|
|||||||
*/
|
*/
|
||||||
public function testReplaceNo()
|
public function testReplaceNo()
|
||||||
{
|
{
|
||||||
|
$this->bs->deleteAll();
|
||||||
|
|
||||||
$url = 'http://example.org/tag2';
|
$url = 'http://example.org/tag2';
|
||||||
$title1 = 'foo bar 1';
|
$title1 = 'foo bar 1';
|
||||||
$title2 = 'bar 2 foo';
|
$title2 = 'bar 2 foo';
|
||||||
@ -376,6 +360,8 @@ TXT;
|
|||||||
*/
|
*/
|
||||||
public function testReplaceYes()
|
public function testReplaceYes()
|
||||||
{
|
{
|
||||||
|
$this->bs->deleteAll();
|
||||||
|
|
||||||
$url = 'http://example.org/tag2';
|
$url = 'http://example.org/tag2';
|
||||||
$title1 = 'foo bar 1';
|
$title1 = 'foo bar 1';
|
||||||
$title2 = 'bar 2 foo';
|
$title2 = 'bar 2 foo';
|
||||||
@ -625,8 +611,4 @@ TXT;
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'Api_PostsAddTest::main') {
|
|
||||||
Api_PostsAddTest::main();
|
|
||||||
}
|
|
||||||
?>
|
?>
|
||||||
|
@ -12,14 +12,8 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../prepare.php';
|
|
||||||
require_once 'HTTP/Request2.php';
|
require_once 'HTTP/Request2.php';
|
||||||
|
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'Api_PostsDeleteTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle post deletion API.
|
* Unit tests for the SemanticScuttle post deletion API.
|
||||||
*
|
*
|
||||||
@ -37,21 +31,6 @@ class Api_PostsDeleteTest extends TestBaseApi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test if authentication is required when sending no auth data
|
* Test if authentication is required when sending no auth data
|
||||||
*/
|
*/
|
||||||
@ -296,8 +275,4 @@ class Api_PostsDeleteTest extends TestBaseApi
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'Api_PostsDeleteTest::main') {
|
|
||||||
Api_PostsDeleteTest::main();
|
|
||||||
}
|
|
||||||
?>
|
?>
|
@ -12,14 +12,8 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../prepare.php';
|
|
||||||
require_once 'HTTP/Request2.php';
|
require_once 'HTTP/Request2.php';
|
||||||
|
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'Api_PostsUpdateTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle last-update time API.
|
* Unit tests for the SemanticScuttle last-update time API.
|
||||||
*
|
*
|
||||||
@ -37,21 +31,6 @@ class Api_PostsUpdateTest extends TestBaseApi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test if authentication is required when sending no auth data
|
* Test if authentication is required when sending no auth data
|
||||||
*/
|
*/
|
||||||
@ -128,8 +107,4 @@ class Api_PostsUpdateTest extends TestBaseApi
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'Api_PostsUpdateTest::main') {
|
|
||||||
Api_PostsUpdateTest::main();
|
|
||||||
}
|
|
||||||
?>
|
?>
|
@ -12,11 +12,6 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'Bookmark2TagTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'prepare.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle bookmark-tag combination service.
|
* Unit tests for the SemanticScuttle bookmark-tag combination service.
|
||||||
@ -37,17 +32,22 @@ class Bookmark2TagTest extends TestBase
|
|||||||
protected $tts;
|
protected $tts;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to run this test class standalone
|
* Create a bookmark. Like addBookmark(), just with other paramter order
|
||||||
|
* to make some tests in that class easier to write.
|
||||||
*
|
*
|
||||||
* @return void
|
* @param integer $user User ID the bookmark shall belong
|
||||||
|
* @param array $tags Array of tags to attach. If "null" is given,
|
||||||
|
* it will automatically be "unittest"
|
||||||
|
* @param string $date strtotime-compatible string
|
||||||
|
* @param string $title Bookmark title
|
||||||
|
*
|
||||||
|
* @return integer ID of bookmark
|
||||||
*/
|
*/
|
||||||
public static function main()
|
protected function addTagBookmark($user, $tags, $date = null, $title = null)
|
||||||
{
|
{
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
return $this->addBookmark(
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
$user, null, 0, $tags, $title, $date
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,6 +56,7 @@ class Bookmark2TagTest extends TestBase
|
|||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->us = SemanticScuttle_Service_Factory::get('User');
|
$this->us = SemanticScuttle_Service_Factory::get('User');
|
||||||
|
$this->us->deleteAll();
|
||||||
$this->bs = SemanticScuttle_Service_Factory::get('Bookmark');
|
$this->bs = SemanticScuttle_Service_Factory::get('Bookmark');
|
||||||
$this->bs->deleteAll();
|
$this->bs->deleteAll();
|
||||||
$this->b2ts= SemanticScuttle_Service_Factory::get('Bookmark2Tag');
|
$this->b2ts= SemanticScuttle_Service_Factory::get('Bookmark2Tag');
|
||||||
@ -73,7 +74,7 @@ class Bookmark2TagTest extends TestBase
|
|||||||
/**
|
/**
|
||||||
* Test getTagsForBookmark() when the bookmark has no tags
|
* Test getTagsForBookmark() when the bookmark has no tags
|
||||||
*
|
*
|
||||||
* @return void
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getTagsForBookmark
|
||||||
*/
|
*/
|
||||||
public function testGetTagsForBookmarkNone()
|
public function testGetTagsForBookmarkNone()
|
||||||
{
|
{
|
||||||
@ -91,7 +92,7 @@ class Bookmark2TagTest extends TestBase
|
|||||||
/**
|
/**
|
||||||
* Test getTagsForBookmark() when the bookmark has one tag
|
* Test getTagsForBookmark() when the bookmark has one tag
|
||||||
*
|
*
|
||||||
* @return void
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getTagsForBookmark
|
||||||
*/
|
*/
|
||||||
public function testGetTagsForBookmarkOne()
|
public function testGetTagsForBookmarkOne()
|
||||||
{
|
{
|
||||||
@ -110,9 +111,9 @@ class Bookmark2TagTest extends TestBase
|
|||||||
/**
|
/**
|
||||||
* Test getTagsForBookmark() when the bookmark has three tags
|
* Test getTagsForBookmark() when the bookmark has three tags
|
||||||
*
|
*
|
||||||
* @return void
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getTagsForBookmark
|
||||||
*/
|
*/
|
||||||
public function testGetTagsForBookmarkThree()
|
public function testGetTagsForBookmarkThr()
|
||||||
{
|
{
|
||||||
$this->addBookmark(null, null, 0, array('forz', 'barz'));
|
$this->addBookmark(null, null, 0, array('forz', 'barz'));
|
||||||
|
|
||||||
@ -131,7 +132,7 @@ class Bookmark2TagTest extends TestBase
|
|||||||
/**
|
/**
|
||||||
* Test getTagsForBookmarks() when no bookmarks have tags.
|
* Test getTagsForBookmarks() when no bookmarks have tags.
|
||||||
*
|
*
|
||||||
* @return void
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getTagsForBookmarks
|
||||||
*/
|
*/
|
||||||
public function testGetTagsForBookmarksNone()
|
public function testGetTagsForBookmarksNone()
|
||||||
{
|
{
|
||||||
@ -154,7 +155,7 @@ class Bookmark2TagTest extends TestBase
|
|||||||
/**
|
/**
|
||||||
* Test getTagsForBookmarks() when most bookmarks have tags.
|
* Test getTagsForBookmarks() when most bookmarks have tags.
|
||||||
*
|
*
|
||||||
* @return void
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getTagsForBookmarks
|
||||||
*/
|
*/
|
||||||
public function testGetTagsForBookmarksMost()
|
public function testGetTagsForBookmarksMost()
|
||||||
{
|
{
|
||||||
@ -204,9 +205,407 @@ class Bookmark2TagTest extends TestBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'Bookmark2TagTest::main') {
|
|
||||||
Bookmark2TagTest::main();
|
|
||||||
|
/**
|
||||||
|
* Fetch the most popular tags in descending order
|
||||||
|
*
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsOrder()
|
||||||
|
{
|
||||||
|
$user = $this->addUser();
|
||||||
|
$this->addTagBookmark($user, array('one', 'two'));
|
||||||
|
$this->addTagBookmark($user, array('one', 'thr'));
|
||||||
|
$this->addTagBookmark($user, array('one', 'two'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags();
|
||||||
|
$this->assertInternalType('array', $arTags);
|
||||||
|
$this->assertEquals(3, count($arTags));
|
||||||
|
|
||||||
|
$this->assertInternalType('array', $arTags[0]);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
array('tag' => 'one', 'bCount' => '3'),
|
||||||
|
array('tag' => 'two', 'bCount' => '2'),
|
||||||
|
array('tag' => 'thr', 'bCount' => '1')
|
||||||
|
),
|
||||||
|
$arTags
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsLimit()
|
||||||
|
{
|
||||||
|
$user = $this->addUser();
|
||||||
|
$this->addTagBookmark($user, array('one', 'two'));
|
||||||
|
$this->addTagBookmark($user, array('one', 'thr'));
|
||||||
|
$this->addTagBookmark($user, array('one', 'two'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags();
|
||||||
|
$this->assertInternalType('array', $arTags);
|
||||||
|
$this->assertEquals(3, count($arTags));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(null, 2);
|
||||||
|
$this->assertInternalType('array', $arTags);
|
||||||
|
$this->assertEquals(2, count($arTags));
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
array('tag' => 'one', 'bCount' => '3'),
|
||||||
|
array('tag' => 'two', 'bCount' => '2'),
|
||||||
|
),
|
||||||
|
$arTags
|
||||||
|
);
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(null, 1);
|
||||||
|
$this->assertInternalType('array', $arTags);
|
||||||
|
$this->assertEquals(1, count($arTags));
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
array('tag' => 'one', 'bCount' => '3'),
|
||||||
|
),
|
||||||
|
$arTags
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsDays()
|
||||||
|
{
|
||||||
|
$user = $this->addUser();
|
||||||
|
$this->addTagBookmark($user, array('one', 'two'), 'today');
|
||||||
|
$this->addTagBookmark($user, array('one', 'thr'), 'today');
|
||||||
|
$this->addTagBookmark($user, array('one', 'two'), '-1 day 1 hour');
|
||||||
|
$this->addTagBookmark($user, array('one', 'thr'), '-3 days 1 hour');
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(null, 10, null, 1);
|
||||||
|
$this->assertInternalType('array', $arTags);
|
||||||
|
$this->assertEquals(3, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'one', 'bCount' => '2'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'two', 'bCount' => '1'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'thr', 'bCount' => '1'), $arTags);
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(null, 10, null, 2);
|
||||||
|
$this->assertInternalType('array', $arTags);
|
||||||
|
$this->assertEquals(3, count($arTags));
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
array('tag' => 'one', 'bCount' => '3'),
|
||||||
|
array('tag' => 'two', 'bCount' => '2'),
|
||||||
|
array('tag' => 'thr', 'bCount' => '1'),
|
||||||
|
),
|
||||||
|
$arTags
|
||||||
|
);
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(null, 10, null, 5);
|
||||||
|
$this->assertInternalType('array', $arTags);
|
||||||
|
$this->assertEquals(3, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'one', 'bCount' => '4'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'two', 'bCount' => '2'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'thr', 'bCount' => '2'), $arTags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsBeginsWith()
|
||||||
|
{
|
||||||
|
$user = $this->addUser();
|
||||||
|
$this->addTagBookmark($user, array('one', 'two'));
|
||||||
|
$this->addTagBookmark($user, array('one', 'thr'));
|
||||||
|
$this->addTagBookmark($user, array('one', 'two'));
|
||||||
|
$this->addTagBookmark($user, array('one', 'thr'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(null, 10, null, null, 'o');
|
||||||
|
$this->assertEquals(1, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'one', 'bCount' => '4'), $arTags);
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(null, 10, null, null, 'tw');
|
||||||
|
$this->assertEquals(1, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'two', 'bCount' => '2'), $arTags);
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(null, 10, null, null, 't');
|
||||||
|
$this->assertEquals(2, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'two', 'bCount' => '2'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'thr', 'bCount' => '2'), $arTags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsExcludesSystemTags()
|
||||||
|
{
|
||||||
|
$user = $this->addUser();
|
||||||
|
$this->addTagBookmark($user, array('one', 'system:test'));
|
||||||
|
$this->addTagBookmark($user, array('one', 'system:unittest'));
|
||||||
|
$this->addTagBookmark($user, array('one', 'sys:unittest'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags();
|
||||||
|
$this->assertInternalType('array', $arTags);
|
||||||
|
$this->assertEquals(2, count($arTags));
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
array('tag' => 'one', 'bCount' => '3'),
|
||||||
|
array('tag' => 'sys:unittest', 'bCount' => '1'),
|
||||||
|
),
|
||||||
|
$arTags
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsUserTags()
|
||||||
|
{
|
||||||
|
$user1 = $this->addUser();
|
||||||
|
$user2 = $this->addUser();
|
||||||
|
$user3 = $this->addUser();
|
||||||
|
$this->addTagBookmark($user1, array('one'));
|
||||||
|
$this->addTagBookmark($user2, array('one', 'two'));
|
||||||
|
$this->addTagBookmark($user2, array('two'));
|
||||||
|
$this->addTagBookmark($user3, array('one', 'thr'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags($user1);
|
||||||
|
$this->assertEquals(1, count($arTags));
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
array('tag' => 'one', 'bCount' => '1'),
|
||||||
|
),
|
||||||
|
$arTags
|
||||||
|
);
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags($user2);
|
||||||
|
$this->assertEquals(2, count($arTags));
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
array('tag' => 'two', 'bCount' => '2'),
|
||||||
|
array('tag' => 'one', 'bCount' => '1'),
|
||||||
|
),
|
||||||
|
$arTags
|
||||||
|
);
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(array($user2, $user3));
|
||||||
|
$this->assertEquals(3, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'one', 'bCount' => '2'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'two', 'bCount' => '2'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'thr', 'bCount' => '1'), $arTags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This may happen when the method is called with a problematic user array.
|
||||||
|
* In that case we may not generate invalid SQL or so.
|
||||||
|
*
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsUserArrayWithNull()
|
||||||
|
{
|
||||||
|
$user1 = $this->addUser();
|
||||||
|
$this->addTagBookmark($user1, array('one'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(array(null));
|
||||||
|
$this->assertEquals(0, count($arTags));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsPublicOnlyNoUser()
|
||||||
|
{
|
||||||
|
$user1 = $this->addUser();
|
||||||
|
$this->addBookmark($user1, null, 0, array('one'));
|
||||||
|
$this->addBookmark($user1, null, 1, array('one', 'two'));
|
||||||
|
$this->addBookmark($user1, null, 2, array('thr'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags();
|
||||||
|
$this->assertEquals(1, count($arTags));
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
array('tag' => 'one', 'bCount' => '1'),
|
||||||
|
),
|
||||||
|
$arTags
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsPublicOnlySingleUser()
|
||||||
|
{
|
||||||
|
$user1 = $this->addUser();
|
||||||
|
$this->addBookmark($user1, null, 0, array('one'));
|
||||||
|
$this->addBookmark($user1, null, 1, array('one', 'two'));
|
||||||
|
$this->addBookmark($user1, null, 2, array('thr'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags($user1);
|
||||||
|
$this->assertEquals(1, count($arTags));
|
||||||
|
$this->assertEquals(
|
||||||
|
array(
|
||||||
|
array('tag' => 'one', 'bCount' => '1'),
|
||||||
|
),
|
||||||
|
$arTags
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsPublicOnlySeveralUsers()
|
||||||
|
{
|
||||||
|
$user1 = $this->addUser();
|
||||||
|
$user2 = $this->addUser();
|
||||||
|
$this->addBookmark($user1, null, 0, array('one'));
|
||||||
|
$this->addBookmark($user1, null, 1, array('one', 'two'));
|
||||||
|
$this->addBookmark($user1, null, 2, array('thr'));
|
||||||
|
$this->addBookmark($user2, null, 0, array('fou'));
|
||||||
|
$this->addBookmark($user2, null, 1, array('fiv'));
|
||||||
|
$this->addBookmark($user2, null, 2, array('six'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags(array($user1, $user2));
|
||||||
|
$this->assertEquals(2, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'one', 'bCount' => '1'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'fou', 'bCount' => '1'), $arTags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getPopularTags
|
||||||
|
*/
|
||||||
|
public function testGetPopularTagsUserPrivatesWhenLoggedIn()
|
||||||
|
{
|
||||||
|
$user1 = $this->addUser();
|
||||||
|
$this->addBookmark($user1, null, 0, array('one'));
|
||||||
|
$this->addBookmark($user1, null, 1, array('one', 'two'));
|
||||||
|
$this->addBookmark($user1, null, 2, array('thr'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getPopularTags($user1, 10, $user1);
|
||||||
|
$this->assertEquals(3, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'one', 'bCount' => '2'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'two', 'bCount' => '1'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'thr', 'bCount' => '1'), $arTags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getAdminTags
|
||||||
|
*/
|
||||||
|
public function testGetAdminTags()
|
||||||
|
{
|
||||||
|
$admin1 = $this->addUser('admin1');
|
||||||
|
$admin2 = $this->addUser('admin2');
|
||||||
|
$user1 = $this->addUser();
|
||||||
|
$this->addBookmark($admin1, null, 0, array('admintag', 'admintag1'));
|
||||||
|
$this->addBookmark($admin2, null, 0, array('admintag', 'admintag2'));
|
||||||
|
$this->addBookmark($user1, null, 0, array('usertag'));
|
||||||
|
|
||||||
|
$GLOBALS['admin_users'] = array('admin1', 'admin2');
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getAdminTags(4);
|
||||||
|
$this->assertEquals(3, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'admintag', 'bCount' => '2'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'admintag1', 'bCount' => '1'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'admintag2', 'bCount' => '1'), $arTags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getAdminTags
|
||||||
|
*/
|
||||||
|
public function testGetAdminTagsBeginsWith()
|
||||||
|
{
|
||||||
|
$admin1 = $this->addUser('admin1');
|
||||||
|
$this->addBookmark($admin1, null, 0, array('admintag', 'admintag1'));
|
||||||
|
$this->addBookmark($admin1, null, 0, array('tester', 'testos'));
|
||||||
|
|
||||||
|
$GLOBALS['admin_users'] = array('admin1');
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getAdminTags(4, null, null, 'test');
|
||||||
|
$this->assertEquals(2, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'tester', 'bCount' => '1'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'testos', 'bCount' => '1'), $arTags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getContactTags
|
||||||
|
*/
|
||||||
|
public function testGetContactTagsWatchlistOnly()
|
||||||
|
{
|
||||||
|
$user1 = $this->addUser();
|
||||||
|
$user2 = $this->addUser();
|
||||||
|
$user3 = $this->addUser();
|
||||||
|
$this->us->setCurrentUserId($user1);
|
||||||
|
$this->us->setWatchStatus($user2);
|
||||||
|
//user1 watches user2 now
|
||||||
|
|
||||||
|
$this->addBookmark($user1, null, 0, array('usertag', 'usertag1'));
|
||||||
|
$this->addBookmark($user2, null, 0, array('usertag', 'usertag2'));
|
||||||
|
$this->addBookmark($user3, null, 0, array('usertag', 'usertag3'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getContactTags($user1, 10);
|
||||||
|
$this->assertEquals(2, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'usertag', 'bCount' => '1'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'usertag2', 'bCount' => '1'), $arTags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getContactTags
|
||||||
|
*/
|
||||||
|
public function testGetContactTagsIncludingUser()
|
||||||
|
{
|
||||||
|
$user1 = $this->addUser();
|
||||||
|
$user2 = $this->addUser();
|
||||||
|
$user3 = $this->addUser();
|
||||||
|
$this->us->setCurrentUserId($user1);
|
||||||
|
$this->us->setWatchStatus($user2);
|
||||||
|
//user1 watches user2 now
|
||||||
|
|
||||||
|
$this->addBookmark($user1, null, 0, array('usertag', 'usertag1'));
|
||||||
|
$this->addBookmark($user2, null, 0, array('usertag', 'usertag2'));
|
||||||
|
$this->addBookmark($user3, null, 0, array('usertag', 'usertag3'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getContactTags($user1, 10, $user1);
|
||||||
|
$this->assertEquals(3, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'usertag', 'bCount' => '2'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'usertag1', 'bCount' => '1'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'usertag2', 'bCount' => '1'), $arTags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers SemanticScuttle_Service_Bookmark2Tag::getContactTags
|
||||||
|
*/
|
||||||
|
public function testGetContactTagsBeginsWith()
|
||||||
|
{
|
||||||
|
$user1 = $this->addUser();
|
||||||
|
$this->addBookmark($user1, null, 0, array('usertag', 'usertag1'));
|
||||||
|
$this->addBookmark($user1, null, 0, array('usable', 'undefined'));
|
||||||
|
$this->addBookmark($user1, null, 0, array('fußbad', 'usable'));
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getContactTags($user1, 10, $user1, null, 'user');
|
||||||
|
$this->assertEquals(2, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'usertag', 'bCount' => '1'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'usertag1', 'bCount' => '1'), $arTags);
|
||||||
|
|
||||||
|
$arTags = $this->b2ts->getContactTags($user1, 10, $user1, null, 'us');
|
||||||
|
$this->assertEquals(3, count($arTags));
|
||||||
|
$this->assertContains(array('tag' => 'usertag', 'bCount' => '1'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'usertag1', 'bCount' => '1'), $arTags);
|
||||||
|
$this->assertContains(array('tag' => 'usable', 'bCount' => '2'), $arTags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
@ -12,11 +12,6 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'BookmarkTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'prepare.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle bookmark service.
|
* Unit tests for the SemanticScuttle bookmark service.
|
||||||
@ -37,22 +32,6 @@ class BookmarkTest extends TestBase
|
|||||||
protected $tts;
|
protected $tts;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->us = SemanticScuttle_Service_Factory::get('User');
|
$this->us = SemanticScuttle_Service_Factory::get('User');
|
||||||
@ -1344,10 +1323,5 @@ class BookmarkTest extends TestBase
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'BookmarkTest::main') {
|
|
||||||
BookmarkTest::main();
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
@ -12,11 +12,6 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'CommonDescriptionTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'prepare.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle common description service.
|
* Unit tests for the SemanticScuttle common description service.
|
||||||
@ -39,21 +34,6 @@ class CommonDescriptionTest extends TestBase
|
|||||||
protected $cds;
|
protected $cds;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->us =SemanticScuttle_Service_Factory::get('User');
|
$this->us =SemanticScuttle_Service_Factory::get('User');
|
||||||
@ -128,9 +108,4 @@ class CommonDescriptionTest extends TestBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'CommonDescriptionTest::main') {
|
|
||||||
CommonDescriptionTest::main();
|
|
||||||
}
|
|
||||||
?>
|
?>
|
||||||
|
13
tests/FactoryTest.php
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class FactoryTest extends TestBase
|
||||||
|
{
|
||||||
|
public function testGetDb()
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf(
|
||||||
|
'sql_db',
|
||||||
|
SemanticScuttle_Service_Factory::getDb()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
@ -12,11 +12,6 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'SearchHistoryTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'prepare.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle search history service.
|
* Unit tests for the SemanticScuttle search history service.
|
||||||
@ -38,22 +33,6 @@ class SearchHistoryTest extends TestBase
|
|||||||
protected $shs;
|
protected $shs;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set up all services
|
* Set up all services
|
||||||
*
|
*
|
||||||
@ -391,10 +370,4 @@ class SearchHistoryTest extends TestBase
|
|||||||
$this->assertEquals(0, $this->shs->countSearches());
|
$this->assertEquals(0, $this->shs->countSearches());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'SearchHistoryTest::main') {
|
|
||||||
SearchHistoryTest::main();
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
@ -12,11 +12,6 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'Tag2TagTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'prepare.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle tag2tag service.
|
* Unit tests for the SemanticScuttle tag2tag service.
|
||||||
@ -37,22 +32,6 @@ class Tag2TagTest extends TestBase
|
|||||||
protected $tts;
|
protected $tts;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->us =SemanticScuttle_Service_Factory::get('User');
|
$this->us =SemanticScuttle_Service_Factory::get('User');
|
||||||
@ -550,8 +529,4 @@ class Tag2TagTest extends TestBase
|
|||||||
|
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'Tag2TagTest::main') {
|
|
||||||
Tag2TagTest::main();
|
|
||||||
}
|
|
||||||
?>
|
?>
|
||||||
|
@ -12,11 +12,6 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'TagTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'prepare.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle tag service.
|
* Unit tests for the SemanticScuttle tag service.
|
||||||
@ -34,22 +29,6 @@ class TagTest extends TestBase
|
|||||||
protected $ts;
|
protected $ts;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->ts =SemanticScuttle_Service_Factory::get('Tag');
|
$this->ts =SemanticScuttle_Service_Factory::get('Tag');
|
||||||
@ -109,9 +88,4 @@ class TagTest extends TestBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'TagTest::main') {
|
|
||||||
TagTest::main();
|
|
||||||
}
|
|
||||||
?>
|
?>
|
||||||
|
@ -12,11 +12,6 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'TagsCacheTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'prepare.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle tags cache service.
|
* Unit tests for the SemanticScuttle tags cache service.
|
||||||
@ -38,19 +33,6 @@ class TagsCacheTest extends PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->us =SemanticScuttle_Service_Factory::get('User');
|
$this->us =SemanticScuttle_Service_Factory::get('User');
|
||||||
@ -207,9 +189,4 @@ class TagsCacheTest extends PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals(array(), $tcs->getSynonyms('d', 1));
|
$this->assertEquals(array(), $tcs->getSynonyms('d', 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'TagsCacheTest::main') {
|
|
||||||
TagsCacheTest::main();
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
@ -31,6 +31,7 @@ class TestBase extends PHPUnit_Framework_TestCase
|
|||||||
* @param array $tags Array of tags to attach. If "null" is given,
|
* @param array $tags Array of tags to attach. If "null" is given,
|
||||||
* it will automatically be "unittest"
|
* it will automatically be "unittest"
|
||||||
* @param string $title Bookmark title
|
* @param string $title Bookmark title
|
||||||
|
* @param string $date strtotime-compatible string
|
||||||
*
|
*
|
||||||
* @return integer ID of bookmark
|
* @return integer ID of bookmark
|
||||||
*
|
*
|
||||||
@ -38,7 +39,7 @@ class TestBase extends PHPUnit_Framework_TestCase
|
|||||||
*/
|
*/
|
||||||
protected function addBookmark(
|
protected function addBookmark(
|
||||||
$user = null, $address = null, $status = 0,
|
$user = null, $address = null, $status = 0,
|
||||||
$tags = null, $title = null
|
$tags = null, $title = null, $date = null
|
||||||
) {
|
) {
|
||||||
if ($user === null) {
|
if ($user === null) {
|
||||||
$user = $this->addUser();
|
$user = $this->addUser();
|
||||||
@ -64,7 +65,7 @@ class TestBase extends PHPUnit_Framework_TestCase
|
|||||||
null,
|
null,
|
||||||
$status,
|
$status,
|
||||||
$tags,
|
$tags,
|
||||||
null, null, false, false,
|
null, $date, false, false,
|
||||||
$user
|
$user
|
||||||
);
|
);
|
||||||
return $bid;
|
return $bid;
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
require_once 'HTTP/Request2.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base unittest class for web API tests.
|
* Base unittest class for web API tests.
|
||||||
*
|
*
|
||||||
@ -89,7 +91,8 @@ class TestBaseApi extends TestBase
|
|||||||
* the request object with authentication details, so that
|
* the request object with authentication details, so that
|
||||||
* the user is logged in.
|
* the user is logged in.
|
||||||
*
|
*
|
||||||
* Only usable for API requests, not "normal" HTTP page requests
|
* Useful for HTTP API methods only, cannot be used with
|
||||||
|
* "normal" HTML pages since they do not support HTTP auth.
|
||||||
*
|
*
|
||||||
* @param string $urlSuffix Suffix for the URL
|
* @param string $urlSuffix Suffix for the URL
|
||||||
* @param mixed $auth If user authentication is needed (true/false)
|
* @param mixed $auth If user authentication is needed (true/false)
|
||||||
@ -165,6 +168,25 @@ class TestBaseApi extends TestBase
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies that the HTTP response has status code 200 and
|
||||||
|
* content-type application/json; charset=utf-8
|
||||||
|
*
|
||||||
|
* @param HTTP_Request2_Response $res HTTP Response object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function assertResponseJson200(HTTP_Request2_Response $res)
|
||||||
|
{
|
||||||
|
$this->assertEquals(200, $res->getStatus());
|
||||||
|
$this->assertEquals(
|
||||||
|
'application/json; charset=utf-8',
|
||||||
|
$res->getHeader('content-type')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes a special unittest configuration file.
|
* Writes a special unittest configuration file.
|
||||||
* The unittest config file is read when a GET request with unittestMode=1
|
* The unittest config file is read when a GET request with unittestMode=1
|
||||||
|
66
tests/UserArrayTest.php
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit tests for the SemanticScuttle user array model.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
class UserArrayTest extends PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
|
||||||
|
public function testGetNameLongName()
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
'John Doe',
|
||||||
|
SemanticScuttle_Model_UserArray::getName(
|
||||||
|
array(
|
||||||
|
'name' => 'John Doe',
|
||||||
|
'username' => 'jdoe'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetNameUsernameIfNameIsEmpty()
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
'jdoe',
|
||||||
|
SemanticScuttle_Model_UserArray::getName(
|
||||||
|
array(
|
||||||
|
'name' => '',
|
||||||
|
'username' => 'jdoe'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetNameUsernameIfNameIsNotSet()
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
'jdoe',
|
||||||
|
SemanticScuttle_Model_UserArray::getName(
|
||||||
|
array(
|
||||||
|
'username' => 'jdoe'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -12,11 +12,6 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'UserTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'prepare.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle user service.
|
* Unit tests for the SemanticScuttle user service.
|
||||||
@ -31,24 +26,6 @@ require_once 'prepare.php';
|
|||||||
*/
|
*/
|
||||||
class UserTest extends TestBase
|
class UserTest extends TestBase
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite(__CLASS__)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->us = SemanticScuttle_Service_Factory::get('User');
|
$this->us = SemanticScuttle_Service_Factory::get('User');
|
||||||
@ -200,10 +177,4 @@ class UserTest extends TestBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'UserTest::main') {
|
|
||||||
UserTest::main();
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
?>
|
@ -10,11 +10,6 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
if (!defined('PHPUnit_MAIN_METHOD')) {
|
|
||||||
define('PHPUnit_MAIN_METHOD', 'VoteTest::main');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once 'prepare.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the SemanticScuttle voting system.
|
* Unit tests for the SemanticScuttle voting system.
|
||||||
@ -43,21 +38,6 @@ class VoteTest extends TestBase
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to run this test class standalone
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function main()
|
|
||||||
{
|
|
||||||
require_once 'PHPUnit/TextUI/TestRunner.php';
|
|
||||||
PHPUnit_TextUI_TestRunner::run(
|
|
||||||
new PHPUnit_Framework_TestSuite('VoteTest')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function setUp()
|
public function setUp()
|
||||||
{
|
{
|
||||||
$GLOBALS['enableVoting'] = true;
|
$GLOBALS['enableVoting'] = true;
|
||||||
@ -553,9 +533,4 @@ class VoteTest extends TestBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
}//class VoteTest extends TestBase
|
}//class VoteTest extends TestBase
|
||||||
|
|
||||||
|
|
||||||
if (PHPUnit_MAIN_METHOD == 'VoteTest::main') {
|
|
||||||
VoteTest::main();
|
|
||||||
}
|
|
||||||
?>
|
?>
|
120
tests/ajax/GetAdminLinkedTagsTest.php
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Benjamin Huynh-Kim-Bang <mensonge@users.sourceforge.net>
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @author Eric Dane <ericdane@users.sourceforge.net>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
require_once 'HTTP/Request2.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit tests for the ajax linked admin tags script
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
class ajax_GetAdminLinkedTagsTest extends TestBaseApi
|
||||||
|
{
|
||||||
|
protected $urlPart = 'ajax/getadminlinkedtags.php';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify that we get the configured root tags if
|
||||||
|
* we do not pass any parameters
|
||||||
|
*/
|
||||||
|
public function testRootTags()
|
||||||
|
{
|
||||||
|
$req = $this->getRequest();
|
||||||
|
$res = $req->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
|
||||||
|
//same number of elements as the menu2Tags array
|
||||||
|
$this->assertEquals(
|
||||||
|
count($GLOBALS['menu2Tags']),
|
||||||
|
count($data)
|
||||||
|
);
|
||||||
|
|
||||||
|
//and the same contents
|
||||||
|
foreach ($data as $tagObj) {
|
||||||
|
$tagName = $tagObj->data->title;
|
||||||
|
$this->assertContains($tagName, $GLOBALS['menu2Tags']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify that we get subtags of a given tag
|
||||||
|
*/
|
||||||
|
public function testSubTags()
|
||||||
|
{
|
||||||
|
$t2t = SemanticScuttle_Service_Factory::get('Tag2Tag');
|
||||||
|
$t2t->deleteAll();
|
||||||
|
|
||||||
|
$menu2Tag = reset($GLOBALS['menu2Tags']);
|
||||||
|
//we have a subtag now
|
||||||
|
$this->addBookmark(
|
||||||
|
$this->getAdminUser(),
|
||||||
|
null,
|
||||||
|
0,
|
||||||
|
$menu2Tag . '>adminsubtag'
|
||||||
|
);
|
||||||
|
|
||||||
|
$res = $this->getRequest('?tag=' . $menu2Tag)->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
|
||||||
|
//only one subtag
|
||||||
|
$this->assertEquals(1, count($data));
|
||||||
|
$this->assertEquals('adminsubtag', $data[0]->data->title);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify that we only get admin tags, not tags from
|
||||||
|
* non-admin people
|
||||||
|
*/
|
||||||
|
public function testOnlyAdminTags()
|
||||||
|
{
|
||||||
|
$t2t = SemanticScuttle_Service_Factory::get('Tag2Tag');
|
||||||
|
$t2t->deleteAll();
|
||||||
|
|
||||||
|
$menu2Tag = reset($GLOBALS['menu2Tags']);
|
||||||
|
//we have a subtag now
|
||||||
|
$this->addBookmark(
|
||||||
|
$this->getAdminUser(),
|
||||||
|
null,
|
||||||
|
0,
|
||||||
|
$menu2Tag . '>adminsubtag'
|
||||||
|
);
|
||||||
|
//add another bookmark now, but for a normal user
|
||||||
|
$this->addBookmark(
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
0,
|
||||||
|
$menu2Tag . '>normalsubtag'
|
||||||
|
);
|
||||||
|
|
||||||
|
$res = $this->getRequest('?tag=' . $menu2Tag)->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
|
||||||
|
//we should have only one subtag now, the admin one
|
||||||
|
$this->assertEquals(1, count($data));
|
||||||
|
$this->assertEquals('adminsubtag', $data[0]->data->title);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
@ -12,8 +12,6 @@
|
|||||||
* @license GPL http://www.gnu.org/licenses/gpl.html
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
* @link http://sourceforge.net/projects/semanticscuttle
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/../prepare.php';
|
|
||||||
require_once 'HTTP/Request2.php';
|
require_once 'HTTP/Request2.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,11 +43,7 @@ class ajax_GetAdminTagsTest extends TestBaseApi
|
|||||||
|
|
||||||
$req = $this->getRequest('?unittestMode=1');
|
$req = $this->getRequest('?unittestMode=1');
|
||||||
$res = $req->send();
|
$res = $req->send();
|
||||||
$this->assertEquals(200, $res->getStatus());
|
$this->assertResponseJson200($res);
|
||||||
$this->assertEquals(
|
|
||||||
'application/json; charset=utf-8',
|
|
||||||
$res->getHeader('content-type')
|
|
||||||
);
|
|
||||||
$data = json_decode($res->getBody());
|
$data = json_decode($res->getBody());
|
||||||
$this->assertInternalType('array', $data);
|
$this->assertInternalType('array', $data);
|
||||||
$this->assertEquals(2, count($data));
|
$this->assertEquals(2, count($data));
|
||||||
@ -57,6 +51,69 @@ class ajax_GetAdminTagsTest extends TestBaseApi
|
|||||||
$this->assertContains('admintag2', $data);
|
$this->assertContains('admintag2', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testParameterBeginsWith()
|
||||||
|
{
|
||||||
|
list($user1, $uname1) = $this->addUserData();
|
||||||
|
$this->addBookmark($user1, null, 0, array('foo', 'foobar', 'bar'));
|
||||||
|
|
||||||
|
$this->setUnittestConfig(
|
||||||
|
array(
|
||||||
|
'admin_users' => array($uname1)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$req = $this->getRequest('?unittestMode=1&beginsWith=foo');
|
||||||
|
$res = $req->send();
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
$this->assertEquals(2, count($data));
|
||||||
|
$this->assertContains('foo', $data);
|
||||||
|
$this->assertContains('foobar', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public function testParameterLimit()
|
||||||
|
{
|
||||||
|
list($user1, $uname1) = $this->addUserData();
|
||||||
|
list($user2, $uname2) = $this->addUserData();
|
||||||
|
$this->addBookmark($user1, null, 0, array('foo', 'foobar'));
|
||||||
|
$this->addBookmark($user2, null, 0, array('foo', 'bar'));
|
||||||
|
|
||||||
|
$this->setUnittestConfig(
|
||||||
|
array(
|
||||||
|
'admin_users' => array($uname1, $uname2)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$req = $this->getRequest('?unittestMode=1&limit=1');
|
||||||
|
$res = $req->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
$this->assertEquals(1, count($data));
|
||||||
|
$this->assertContains('foo', $data);
|
||||||
|
|
||||||
|
$req = $this->getRequest('?unittestMode=1&limit=2');
|
||||||
|
$res = $req->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
$this->assertEquals(2, count($data));
|
||||||
|
$this->assertContains('foo', $data);
|
||||||
|
|
||||||
|
$req = $this->getRequest('?unittestMode=1&limit=3');
|
||||||
|
$res = $req->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
$this->assertEquals(3, count($data));
|
||||||
|
$this->assertContains('foo', $data);
|
||||||
|
$this->assertContains('foobar', $data);
|
||||||
|
$this->assertContains('bar', $data);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
100
tests/ajax/GetContactTagsTest.php
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Benjamin Huynh-Kim-Bang <mensonge@users.sourceforge.net>
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @author Eric Dane <ericdane@users.sourceforge.net>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
require_once 'HTTP/Request2.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit tests for the ajax getcontacttags.php script
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
class ajax_GetContactTagsTest extends TestBaseApi
|
||||||
|
{
|
||||||
|
protected $urlPart = 'ajax/getcontacttags.php';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If no user is logged in, no data are returned
|
||||||
|
*/
|
||||||
|
public function testNoUserLoggedIn()
|
||||||
|
{
|
||||||
|
$res = $this->getRequest()->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
$this->assertEquals(0, count($data));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testUserLoggedInWatchlist()
|
||||||
|
{
|
||||||
|
list($req, $uId) = $this->getLoggedInRequest();
|
||||||
|
$this->addBookmark($uId, null, 0, array('public', 'public2'));
|
||||||
|
|
||||||
|
$user2 = $this->addUser();
|
||||||
|
$this->us->setCurrentUserId($uId);
|
||||||
|
$this->us->setWatchStatus($user2);
|
||||||
|
//uId watches user2 now
|
||||||
|
$this->addBookmark($user2, null, 0, array('user2tag'));
|
||||||
|
|
||||||
|
$res = $req->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
$this->assertEquals(3, count($data));
|
||||||
|
$this->assertContains('public', $data);
|
||||||
|
$this->assertContains('public2', $data);
|
||||||
|
$this->assertContains('user2tag', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testParameterBeginsWith()
|
||||||
|
{
|
||||||
|
list($req, $uId) = $this->getLoggedInRequest('?beginsWith=bar');
|
||||||
|
$this->addBookmark($uId, null, 0, array('foobar', 'barmann'));
|
||||||
|
|
||||||
|
$res = $req->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
$this->assertEquals(1, count($data));
|
||||||
|
$this->assertContains('barmann', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testParameterLimit()
|
||||||
|
{
|
||||||
|
list($req, $uId) = $this->getLoggedInRequest('?limit=2');
|
||||||
|
$this->addBookmark($uId, null, 0, array('foo', 'bar', 'baz', 'omg'));
|
||||||
|
|
||||||
|
$res = $req->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
$this->assertEquals(2, count($data));
|
||||||
|
|
||||||
|
$req2 = $this->getRequest('?limit=3');
|
||||||
|
$req2->setCookieJar($req->getCookieJar());
|
||||||
|
$res = $req2->send();
|
||||||
|
$this->assertResponseJson200($res);
|
||||||
|
$data = json_decode($res->getBody());
|
||||||
|
$this->assertInternalType('array', $data);
|
||||||
|
$this->assertEquals(3, count($data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
15
tests/phpunit.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<phpunit strict="true" colors="true"
|
||||||
|
bootstrap="prepare.php"
|
||||||
|
>
|
||||||
|
<filter>
|
||||||
|
<whitelist addUncoveredFilesFromWhitelist="false">
|
||||||
|
<directory suffix=".php">../src/SemanticScuttle/</directory>
|
||||||
|
<directory suffix=".php">../data/templates/</directory>
|
||||||
|
<directory suffix=".php">../www/</directory>
|
||||||
|
<exclude>
|
||||||
|
<directory suffix=".php">../src/SemanticScuttle/db/</directory>
|
||||||
|
</exclude>
|
||||||
|
</whitelist>
|
||||||
|
</filter>
|
||||||
|
</phpunit>
|
68
tests/www/searchTest.php
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class www_SearchTest extends TestBaseApi
|
||||||
|
{
|
||||||
|
protected $urlPart = 'search.php';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some browsers using opensearch do "urlencode" on the terms,
|
||||||
|
* for example Firefox. Multiple terms separated with space
|
||||||
|
* appear as "foo+bar" in the URL.
|
||||||
|
*/
|
||||||
|
public function testMultipleTermsUrlEncoded()
|
||||||
|
{
|
||||||
|
$this->addBookmark(null, null, 0, null, 'unittest foo bar');
|
||||||
|
$res = $this->getRequest('/all/foo+bar')->send();
|
||||||
|
$this->assertSelectCount(
|
||||||
|
'.xfolkentry', true, $res->getBody(),
|
||||||
|
'No bookmark found', false
|
||||||
|
);
|
||||||
|
|
||||||
|
$res = $this->getRequest('/all/baz+bat')->send();
|
||||||
|
$this->assertSelectCount(
|
||||||
|
'.xfolkentry', false, $res->getBody(),
|
||||||
|
'Bookmarks found', false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some browsers using opensearch do "rawurlencode" on the terms,
|
||||||
|
* for example Opera. Multiple terms separated with space
|
||||||
|
* appear as "foo%20bar" in the URL.
|
||||||
|
*/
|
||||||
|
public function testMultipleTermsRawUrlEncoded()
|
||||||
|
{
|
||||||
|
$this->addBookmark(null, null, 0, null, 'unittest foo bar');
|
||||||
|
$res = $this->getRequest('/all/foo%20bar')->send();
|
||||||
|
$this->assertSelectCount(
|
||||||
|
'.xfolkentry', true, $res->getBody(),
|
||||||
|
'No bookmark found', false
|
||||||
|
);
|
||||||
|
|
||||||
|
$res = $this->getRequest('/all/baz bat')->send();
|
||||||
|
$this->assertSelectCount(
|
||||||
|
'.xfolkentry', false, $res->getBody(),
|
||||||
|
'Bookmarks found', false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testMultipleTags()
|
||||||
|
{
|
||||||
|
$this->markTestSkipped(
|
||||||
|
'FIXME: SemanticScuttle currently does not search multiple tags'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->addBookmark(null, null, 0, array('foo', 'bar'));
|
||||||
|
$res = $this->getRequest('/all/foo+bar')->send();
|
||||||
|
$this->assertSelectCount(
|
||||||
|
'.xfolkentry', true, $res->getBody(),
|
||||||
|
'No bookmark found', false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -1,64 +1,92 @@
|
|||||||
<?php
|
<?php
|
||||||
/***************************************************************************
|
/**
|
||||||
Copyright (C) 2004 - 2006 Scuttle project
|
* Returns a list of tags managed by the admins, in json format
|
||||||
http://sourceforge.net/projects/scuttle/
|
* suitable for jsTree consumption.
|
||||||
http://scuttle.org/
|
*
|
||||||
|
* @param string $tag Tag for which the children tags shall be returned
|
||||||
|
*
|
||||||
|
* SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @subcategory Templates
|
||||||
|
* @author Benjamin Huynh-Kim-Bang <mensonge@users.sourceforge.net>
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @author Eric Dane <ericdane@users.sourceforge.net>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
/* Return a json file with list of linked tags */
|
|
||||||
$httpContentType = 'application/json';
|
$httpContentType = 'application/json';
|
||||||
require_once '../www-header.php';
|
require_once '../www-header.php';
|
||||||
|
|
||||||
/* Service creation: only useful services are created */
|
/**
|
||||||
$b2tservice =SemanticScuttle_Service_Factory::get('Bookmark2Tag');
|
* Creates and returns an array of tags for the jsTree ajax loader.
|
||||||
$bookmarkservice =SemanticScuttle_Service_Factory::get('Tag');
|
* If the tag is empty, the configured menu2 (admin) main tags are used.
|
||||||
$tagstatservice =SemanticScuttle_Service_Factory::get('TagStat');
|
*
|
||||||
|
* @param string $tag Tag name to fetch subtags for
|
||||||
|
* @param SemanticScuttle_Service_Tag2Tag $t2t Tag relation service
|
||||||
|
*
|
||||||
|
* @return array Array of tag data suitable for the jsTree ajax loader
|
||||||
|
*/
|
||||||
|
function assembleAdminTagData($tag, SemanticScuttle_Service_Tag2Tag $t2t)
|
||||||
|
{
|
||||||
|
if ($tag == '') {
|
||||||
|
$linkedTags = $GLOBALS['menu2Tags'];
|
||||||
|
} else {
|
||||||
|
$linkedTags = $t2t->getAdminLinkedTags($tag, '>');
|
||||||
|
}
|
||||||
|
|
||||||
/* Managing all possible inputs */
|
$tagData = array();
|
||||||
isset($_GET['tag']) ? define('GET_TAG', $_GET['tag']): define('GET_TAG', '');
|
foreach ($linkedTags as $tag) {
|
||||||
isset($_GET['uId']) ? define('GET_UID', $_GET['uId']): define('GET_UID', '');
|
//FIXME: the hasChildren code is nasty, because it causes too many
|
||||||
|
// queries onto the database
|
||||||
|
$hasChildren = 0 < count($t2t->getAdminLinkedTags($tag, '>'));
|
||||||
|
$tagData[] = createTagArray($tag, $hasChildren);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tagData;
|
||||||
function displayTag($tag, $uId) {
|
|
||||||
$uId = ($uId==0)?NULL:$uId; // if user is nobody, NULL allows to look for every public tags
|
|
||||||
|
|
||||||
$tag2tagservice =SemanticScuttle_Service_Factory::get('Tag2Tag');
|
|
||||||
$output = '{ id:'.rand().', name:\''.$tag.'\'';
|
|
||||||
|
|
||||||
$linkedTags = $tag2tagservice->getAdminLinkedTags($tag, '>');
|
|
||||||
if(count($linkedTags) > 0) {
|
|
||||||
$output.= ', children: [';
|
|
||||||
foreach($linkedTags as $linkedTag) {
|
|
||||||
$output.= displayTag($linkedTag, $uId);
|
|
||||||
}
|
|
||||||
$output = substr($output, 0, -1); // remove final comma avoiding IE6 Dojo bug
|
|
||||||
$output.= "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
$output.= '},';
|
|
||||||
return $output;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
/**
|
||||||
|
* Creates an jsTree json array for the given tag
|
||||||
|
*
|
||||||
|
* @param string $tag Tag name
|
||||||
|
* @param boolean $hasChildren If the tag has subtags (children) or not.
|
||||||
|
* If unsure, set it to "true".
|
||||||
|
*
|
||||||
|
* @return array Array to be sent back to the browser as json
|
||||||
|
*/
|
||||||
|
function createTagArray($tag, $hasChildren = true)
|
||||||
|
{
|
||||||
|
$ar = array(
|
||||||
|
'data' => array(
|
||||||
|
//<a> attributes
|
||||||
|
'title' => $tag,
|
||||||
|
'attr' => array(
|
||||||
|
'href' => createUrl('tags', $tag)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
//<li> attributes
|
||||||
|
'attr' => array(
|
||||||
|
'rel' => $tag,//needed for identifying the tag in html
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if ($hasChildren) {
|
||||||
|
//jstree needs that to show the arrows
|
||||||
|
$ar['state'] = 'closed';
|
||||||
|
}
|
||||||
|
|
||||||
{ label: 'name', identifier: 'id', items: [
|
return $ar;
|
||||||
<?php
|
}
|
||||||
$json = displayTag(GET_TAG, intval(GET_UID));
|
|
||||||
$json = substr($json, 0, -1); // remove final comma avoiding IE6 Dojo bug
|
|
||||||
echo $json;
|
$tag = isset($_GET['tag']) ? trim($_GET['tag']) : '';
|
||||||
?>
|
$tagData = assembleAdminTagData(
|
||||||
] }
|
$tag,
|
||||||
|
SemanticScuttle_Service_Factory::get('Tag2Tag')
|
||||||
|
);
|
||||||
|
echo json_encode($tagData);
|
||||||
|
?>
|
@ -1,44 +1,47 @@
|
|||||||
<?php
|
<?php
|
||||||
/***************************************************************************
|
/**
|
||||||
Copyright (C) 2004 - 2006 Scuttle project
|
* Return a json file with list of public tags used by admins and sorted
|
||||||
http://sourceforge.net/projects/scuttle/
|
* by popularity.
|
||||||
http://scuttle.org/
|
*
|
||||||
|
* The following GET parameters are accepted:
|
||||||
|
* @param string $beginsWith The tag name shall start with that string.
|
||||||
|
* No default.
|
||||||
|
* @param integer $limit Number of tags to return. Defaults to 1000
|
||||||
|
*
|
||||||
|
* Part of SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Benjamin Huynh-Kim-Bang <mensonge@users.sourceforge.net>
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @author Eric Dane <ericdane@users.sourceforge.net>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
/* Return a json file with list of tags according to current user and sort by popularity*/
|
|
||||||
$httpContentType = 'application/json';
|
$httpContentType = 'application/json';
|
||||||
require_once '../www-header.php';
|
require_once '../www-header.php';
|
||||||
|
|
||||||
/* Service creation: only useful services are created */
|
$limit = 30;
|
||||||
$b2tservice =SemanticScuttle_Service_Factory::get('Bookmark2Tag');
|
$beginsWith = null;
|
||||||
$bookmarkservice =SemanticScuttle_Service_Factory::get('Tag');
|
$currentUserId = $userservice->getCurrentUserId();
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
{identifier:"tag",
|
|
||||||
items: [
|
|
||||||
<?php
|
|
||||||
$listTags = $b2tservice->getAdminTags(1000, $userservice->getCurrentUserId());
|
|
||||||
foreach($listTags as $t) {
|
|
||||||
echo "{tag: \"".$t['tag']."\"},";
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
]}
|
|
||||||
|
|
||||||
|
|
||||||
|
if (isset($_GET['limit']) && is_numeric($_GET['limit'])) {
|
||||||
|
$limit = (int)$_GET['limit'];
|
||||||
|
}
|
||||||
|
if (isset($_GET['beginsWith']) && strlen(trim($_GET['beginsWith']))) {
|
||||||
|
$beginsWith = trim($_GET['beginsWith']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$listTags = SemanticScuttle_Service_Factory::get('Bookmark2Tag')->getAdminTags(
|
||||||
|
$limit, $currentUserId, null, $beginsWith
|
||||||
|
);
|
||||||
|
$tags = array();
|
||||||
|
foreach ($listTags as $t) {
|
||||||
|
$tags[] = $t['tag'];
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode($tags);
|
||||||
|
?>
|
@ -1,44 +1,47 @@
|
|||||||
<?php
|
<?php
|
||||||
/***************************************************************************
|
/**
|
||||||
Copyright (C) 2004 - 2006 Scuttle project
|
* Return a json file with list of tags according to current user
|
||||||
http://sourceforge.net/projects/scuttle/
|
* and sorted by popularity.
|
||||||
http://scuttle.org/
|
*
|
||||||
|
* The following GET parameters are accepted:
|
||||||
|
* @param string $beginsWith The tag name shall start with that string.
|
||||||
|
* No default.
|
||||||
|
* @param integer $limit Number of tags to return. Defaults to 1000
|
||||||
|
*
|
||||||
|
* Part of SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Benjamin Huynh-Kim-Bang <mensonge@users.sourceforge.net>
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @author Eric Dane <ericdane@users.sourceforge.net>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
/* Return a json file with list of tags according to current user and sort by popularity*/
|
|
||||||
$httpContentType = 'application/json';
|
$httpContentType = 'application/json';
|
||||||
require_once '../www-header.php';
|
require_once '../www-header.php';
|
||||||
|
|
||||||
/* Service creation: only useful services are created */
|
$limit = 30;
|
||||||
$b2tservice =SemanticScuttle_Service_Factory::get('Bookmark2Tag');
|
$beginsWith = null;
|
||||||
$bookmarkservice =SemanticScuttle_Service_Factory::get('Tag');
|
$currentUserId = $userservice->getCurrentUserId();
|
||||||
|
|
||||||
|
if (isset($_GET['limit']) && is_numeric($_GET['limit'])) {
|
||||||
|
$limit = (int)$_GET['limit'];
|
||||||
|
}
|
||||||
|
if (isset($_GET['beginsWith']) && strlen(trim($_GET['beginsWith']))) {
|
||||||
|
$beginsWith = trim($_GET['beginsWith']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$listTags = SemanticScuttle_Service_Factory::get('Bookmark2Tag')->getContactTags(
|
||||||
|
$currentUserId, $limit, $currentUserId, null, $beginsWith
|
||||||
|
);
|
||||||
|
$tags = array();
|
||||||
|
foreach ($listTags as $t) {
|
||||||
|
$tags[] = $t['tag'];
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode($tags);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
{identifier:"tag",
|
|
||||||
items: [
|
|
||||||
<?php
|
|
||||||
$listTags = $b2tservice->getContactTags($userservice->getCurrentUserId(), 1000, $userservice->getCurrentUserId());
|
|
||||||
foreach($listTags as $t) {
|
|
||||||
echo "{tag: \"".$t['tag']."\"},";
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
]}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,64 +1,142 @@
|
|||||||
<?php
|
<?php
|
||||||
/***************************************************************************
|
/**
|
||||||
Copyright (C) 2004 - 2006 Scuttle project
|
* Returns a list of tags linked to the given one,
|
||||||
http://sourceforge.net/projects/scuttle/
|
* suitable for jsTree consumption.
|
||||||
http://scuttle.org/
|
*
|
||||||
|
* Accepted GET parameters:
|
||||||
This program is free software; you can redistribute it and/or modify
|
*
|
||||||
it under the terms of the GNU General Public License as published by
|
* @param string $tag Tag for which the children tags shall be returned
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
* Multiple tags (separated with space or "+") are
|
||||||
(at your option) any later version.
|
* supported.
|
||||||
|
* If no tag is given, all top-level tags are loaded.
|
||||||
This program is distributed in the hope that it will be useful,
|
* @param integer $uId User ID to fetch the tags for
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* @param boolean $parent Load parent tags
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
*
|
||||||
GNU General Public License for more details.
|
* SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
You should have received a copy of the GNU General Public License
|
* PHP version 5.
|
||||||
along with this program; if not, write to the Free Software
|
*
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* @category Bookmarking
|
||||||
***************************************************************************/
|
* @package SemanticScuttle
|
||||||
|
* @subpackage Templates
|
||||||
/* Return a json file with list of linked tags */
|
* @author Benjamin Huynh-Kim-Bang <mensonge@users.sourceforge.net>
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @author Eric Dane <ericdane@users.sourceforge.net>
|
||||||
|
* @license GPL http://www.gnu.org/licenses/gpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
$httpContentType = 'application/json';
|
$httpContentType = 'application/json';
|
||||||
require_once '../www-header.php';
|
require_once '../www-header.php';
|
||||||
|
|
||||||
/* Service creation: only useful services are created */
|
$tag = isset($_GET['tag']) ? $_GET['tag'] : null;
|
||||||
$b2tservice =SemanticScuttle_Service_Factory::get('Bookmark2Tag');
|
$uId = isset($_GET['uId']) ? (int)$_GET['uId'] : 0;
|
||||||
$bookmarkservice =SemanticScuttle_Service_Factory::get('Tag');
|
$loadParentTags = isset($_GET['parent']) ? (bool)$_GET['parent'] : false;
|
||||||
$tagstatservice =SemanticScuttle_Service_Factory::get('TagStat');
|
|
||||||
|
|
||||||
/* Managing all possible inputs */
|
$tags = explode(' ', trim($tag));
|
||||||
isset($_GET['tag']) ? define('GET_TAG', $_GET['tag']): define('GET_TAG', '');
|
if (count($tags) == 1 && $tags[0] == '') {
|
||||||
isset($_GET['uId']) ? define('GET_UID', $_GET['uId']): define('GET_UID', '');
|
//no tags
|
||||||
|
$tags = array();
|
||||||
|
|
||||||
function displayTag($tag, $uId) {
|
|
||||||
$uId = ($uId==0)?NULL:$uId; // if user is nobody, NULL allows to look for every public tags
|
|
||||||
|
|
||||||
$tag2tagservice =SemanticScuttle_Service_Factory::get('Tag2Tag');
|
|
||||||
$output = '{ id:'.rand().', name:\''.$tag.'\'';
|
|
||||||
|
|
||||||
$linkedTags = $tag2tagservice->getLinkedTags($tag, '>', $uId);
|
|
||||||
if(count($linkedTags) > 0) {
|
|
||||||
$output.= ', children: [';
|
|
||||||
foreach($linkedTags as $linkedTag) {
|
|
||||||
$output.= displayTag($linkedTag, $uId);
|
|
||||||
}
|
|
||||||
$output = substr($output, 0, -1); // remove final comma avoiding IE6 Dojo bug
|
|
||||||
$output.= "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
$output.= '},';
|
|
||||||
return $output;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
{ label: 'name', identifier: 'id', items: [
|
function assembleLinkedTagData(
|
||||||
<?php
|
$tags, $uId, $loadParentTags, SemanticScuttle_Service_Tag2Tag $t2t
|
||||||
$json = displayTag(GET_TAG, intval(GET_UID));
|
) {
|
||||||
$json = substr($json, 0, -1); // remove final comma avoiding IE6 Dojo bug
|
$tagData = array();
|
||||||
echo $json;
|
|
||||||
?>
|
if (count($tags) == 0) {
|
||||||
] }
|
//no tags given -> show the 4 most used top-level tags
|
||||||
|
$orphewTags = $t2t->getOrphewTags('>', $uId, 4, 'nb');
|
||||||
|
#$orphewTags = $t2t->getOrphewTags('>', $uId);
|
||||||
|
foreach ($orphewTags as $orphewTag) {
|
||||||
|
$tags[] = $orphewTag['tag'];
|
||||||
|
}
|
||||||
|
$loadParentTags = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($loadParentTags) {
|
||||||
|
//find parent tags + append the selected tags as children afterwards
|
||||||
|
foreach ($tags as $tag) {
|
||||||
|
$parentTags = $t2t->getLinkedTags($tag, '>', $uId, true);
|
||||||
|
if (count($parentTags) > 0) {
|
||||||
|
foreach ($parentTags as $parentTag) {
|
||||||
|
$ta = createTagArray(
|
||||||
|
$parentTag, true, true, true
|
||||||
|
);
|
||||||
|
//FIXME: find out if there are subtags
|
||||||
|
$tac = createTagArray($tag, true);
|
||||||
|
$ta['children'][] = $tac;
|
||||||
|
$tagData[] = $ta;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//no parent tags -> display it normally
|
||||||
|
//FIXME: find out if there are subtags
|
||||||
|
$tagData[] = createTagArray($tag, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//just find the linked tags
|
||||||
|
foreach ($tags as $tag) {
|
||||||
|
$linkedTags = $t2t->getLinkedTags($tag, '>', $uId);
|
||||||
|
foreach ($linkedTags as $linkedTag) {
|
||||||
|
//FIXME: find out if there are subtags
|
||||||
|
$tagData[] = createTagArray($linkedTag, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tagData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an jsTree json array for the given tag
|
||||||
|
*
|
||||||
|
* @param string $tag Tag name
|
||||||
|
* @param boolean $hasChildren If the tag has subtags (children) or not.
|
||||||
|
* If unsure, set it to "true".
|
||||||
|
* @param boolean $isOpen If the tag has children: Is the tree node open
|
||||||
|
* or closed?
|
||||||
|
* @param boolean $autoParent If the tag is an automatically generated parent tag
|
||||||
|
*
|
||||||
|
* @return array Array to be sent back to the browser as json
|
||||||
|
*/
|
||||||
|
function createTagArray($tag, $hasChildren = true, $isOpen = false, $autoParent = false)
|
||||||
|
{
|
||||||
|
if ($autoParent) {
|
||||||
|
$title = '(' . $tag . ')';
|
||||||
|
} else {
|
||||||
|
$title = $tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ar = array(
|
||||||
|
'data' => array(
|
||||||
|
//<a> attributes
|
||||||
|
'title' => $title,
|
||||||
|
'attr' => array(
|
||||||
|
'href' => createUrl('tags', $tag)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
//<li> attributes
|
||||||
|
'attr' => array(
|
||||||
|
'rel' => $tag,//needed for identifying the tag in html
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if ($hasChildren) {
|
||||||
|
//jstree needs that to show the arrows
|
||||||
|
$ar['state'] = $isOpen ? 'open' : 'closed';
|
||||||
|
}
|
||||||
|
if ($autoParent) {
|
||||||
|
//FIXME: use css class
|
||||||
|
$ar['data']['attr']['style'] = 'color: #AAA';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ar;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$tagData = assembleLinkedTagData(
|
||||||
|
$tags, 0/*$uId*/, $loadParentTags,
|
||||||
|
SemanticScuttle_Service_Factory::get('Tag2Tag')
|
||||||
|
);
|
||||||
|
echo json_encode($tagData);
|
||||||
|
?>
|
@ -22,6 +22,8 @@
|
|||||||
// del.icio.us behavior:
|
// del.icio.us behavior:
|
||||||
// - doesn't include the filtered tag as an attribute on the root element (we do)
|
// - doesn't include the filtered tag as an attribute on the root element (we do)
|
||||||
|
|
||||||
|
//this page here is really not valid in any way
|
||||||
|
$httpContentType = 'text/html';
|
||||||
// Force HTTP authentication first!
|
// Force HTTP authentication first!
|
||||||
require_once 'httpauth.inc.php';
|
require_once 'httpauth.inc.php';
|
||||||
|
|
||||||
|
@ -41,7 +41,6 @@ isset($_POST['address']) ? define('POST_ADDRESS', $_POST['address']): define('PO
|
|||||||
isset($_POST['description']) ? define('POST_DESCRIPTION', $_POST['description']): define('POST_DESCRIPTION', '');
|
isset($_POST['description']) ? define('POST_DESCRIPTION', $_POST['description']): define('POST_DESCRIPTION', '');
|
||||||
isset($_POST['privateNote']) ? define('POST_PRIVATENOTE', $_POST['privateNote']): define('POST_PRIVATENOTE', '');
|
isset($_POST['privateNote']) ? define('POST_PRIVATENOTE', $_POST['privateNote']): define('POST_PRIVATENOTE', '');
|
||||||
isset($_POST['status']) ? define('POST_STATUS', $_POST['status']): define('POST_STATUS', '');
|
isset($_POST['status']) ? define('POST_STATUS', $_POST['status']): define('POST_STATUS', '');
|
||||||
isset($_POST['tags']) ? define('POST_TAGS', $_POST['tags']): define('POST_TAGS', '');
|
|
||||||
isset($_POST['referrer']) ? define('POST_REFERRER', $_POST['referrer']): define('POST_REFERRER', '');
|
isset($_POST['referrer']) ? define('POST_REFERRER', $_POST['referrer']): define('POST_REFERRER', '');
|
||||||
|
|
||||||
isset($_GET['popup']) ? define('GET_POPUP', $_GET['popup']): define('GET_POPUP', '');
|
isset($_GET['popup']) ? define('GET_POPUP', $_GET['popup']): define('GET_POPUP', '');
|
||||||
@ -50,6 +49,10 @@ isset($_POST['popup']) ? define('POST_POPUP', $_POST['popup']): define('POST_POP
|
|||||||
isset($_GET['page']) ? define('GET_PAGE', $_GET['page']): define('GET_PAGE', 0);
|
isset($_GET['page']) ? define('GET_PAGE', $_GET['page']): define('GET_PAGE', 0);
|
||||||
isset($_GET['sort']) ? define('GET_SORT', $_GET['sort']): define('GET_SORT', '');
|
isset($_GET['sort']) ? define('GET_SORT', $_GET['sort']): define('GET_SORT', '');
|
||||||
|
|
||||||
|
if (!isset($_POST['tags'])) {
|
||||||
|
$_POST['tags'] = array();
|
||||||
|
}
|
||||||
|
//echo '<p>' . var_export($_POST, true) . '</p>';die();
|
||||||
|
|
||||||
|
|
||||||
if ((GET_ACTION == "add") && !$userservice->isLoggedOn()) {
|
if ((GET_ACTION == "add") && !$userservice->isLoggedOn()) {
|
||||||
@ -143,7 +146,7 @@ if ($userservice->isLoggedOn() && POST_SUBMITTED != '') {
|
|||||||
$description = trim(POST_DESCRIPTION);
|
$description = trim(POST_DESCRIPTION);
|
||||||
$privateNote = trim(POST_PRIVATENOTE);
|
$privateNote = trim(POST_PRIVATENOTE);
|
||||||
$status = intval(POST_STATUS);
|
$status = intval(POST_STATUS);
|
||||||
$categories = trim(POST_TAGS);
|
$categories = explode(',', $_POST['tags']);
|
||||||
$saved = true;
|
$saved = true;
|
||||||
if ($bookmarkservice->addBookmark($address, $title, $description, $privateNote, $status, $categories)) {
|
if ($bookmarkservice->addBookmark($address, $title, $description, $privateNote, $status, $categories)) {
|
||||||
if (POST_POPUP != '') {
|
if (POST_POPUP != '') {
|
||||||
@ -184,10 +187,10 @@ if ($templatename == 'editbookmark.tpl') {
|
|||||||
'bAddress' => stripslashes(POST_ADDRESS),
|
'bAddress' => stripslashes(POST_ADDRESS),
|
||||||
'bDescription' => stripslashes(POST_DESCRIPTION),
|
'bDescription' => stripslashes(POST_DESCRIPTION),
|
||||||
'bPrivateNote' => stripslashes(POST_PRIVATENOTE),
|
'bPrivateNote' => stripslashes(POST_PRIVATENOTE),
|
||||||
'tags' => (POST_TAGS ? explode(',', stripslashes(POST_TAGS)) : array()),
|
'tags' => ($_POST['tags'] ? $_POST['tags'] : array()),
|
||||||
'bStatus' => $GLOBALS['defaults']['privacy'],
|
'bStatus' => $GLOBALS['defaults']['privacy'],
|
||||||
);
|
);
|
||||||
$tplVars['tags'] = POST_TAGS;
|
$tplVars['tags'] = $_POST['tags'];
|
||||||
} else {
|
} else {
|
||||||
if(GET_COPYOF != '') { //copy from bookmarks page
|
if(GET_COPYOF != '') { //copy from bookmarks page
|
||||||
$tplVars['row'] = $bookmarkservice->getBookmark(intval(GET_COPYOF), true);
|
$tplVars['row'] = $bookmarkservice->getBookmark(intval(GET_COPYOF), true);
|
||||||
|
612
www/js/jquery-ui-1.8.11/jquery.ui.autocomplete.js
vendored
Normal file
@ -0,0 +1,612 @@
|
|||||||
|
/*
|
||||||
|
* jQuery UI Autocomplete 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Autocomplete
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.core.js
|
||||||
|
* jquery.ui.widget.js
|
||||||
|
* jquery.ui.position.js
|
||||||
|
*/
|
||||||
|
(function( $, undefined ) {
|
||||||
|
|
||||||
|
// used to prevent race conditions with remote data sources
|
||||||
|
var requestIndex = 0;
|
||||||
|
|
||||||
|
$.widget( "ui.autocomplete", {
|
||||||
|
options: {
|
||||||
|
appendTo: "body",
|
||||||
|
autoFocus: false,
|
||||||
|
delay: 300,
|
||||||
|
minLength: 1,
|
||||||
|
position: {
|
||||||
|
my: "left top",
|
||||||
|
at: "left bottom",
|
||||||
|
collision: "none"
|
||||||
|
},
|
||||||
|
source: null
|
||||||
|
},
|
||||||
|
|
||||||
|
pending: 0,
|
||||||
|
|
||||||
|
_create: function() {
|
||||||
|
var self = this,
|
||||||
|
doc = this.element[ 0 ].ownerDocument,
|
||||||
|
suppressKeyPress;
|
||||||
|
|
||||||
|
this.element
|
||||||
|
.addClass( "ui-autocomplete-input" )
|
||||||
|
.attr( "autocomplete", "off" )
|
||||||
|
// TODO verify these actually work as intended
|
||||||
|
.attr({
|
||||||
|
role: "textbox",
|
||||||
|
"aria-autocomplete": "list",
|
||||||
|
"aria-haspopup": "true"
|
||||||
|
})
|
||||||
|
.bind( "keydown.autocomplete", function( event ) {
|
||||||
|
if ( self.options.disabled || self.element.attr( "readonly" ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
suppressKeyPress = false;
|
||||||
|
var keyCode = $.ui.keyCode;
|
||||||
|
switch( event.keyCode ) {
|
||||||
|
case keyCode.PAGE_UP:
|
||||||
|
self._move( "previousPage", event );
|
||||||
|
break;
|
||||||
|
case keyCode.PAGE_DOWN:
|
||||||
|
self._move( "nextPage", event );
|
||||||
|
break;
|
||||||
|
case keyCode.UP:
|
||||||
|
self._move( "previous", event );
|
||||||
|
// prevent moving cursor to beginning of text field in some browsers
|
||||||
|
event.preventDefault();
|
||||||
|
break;
|
||||||
|
case keyCode.DOWN:
|
||||||
|
self._move( "next", event );
|
||||||
|
// prevent moving cursor to end of text field in some browsers
|
||||||
|
event.preventDefault();
|
||||||
|
break;
|
||||||
|
case keyCode.ENTER:
|
||||||
|
case keyCode.NUMPAD_ENTER:
|
||||||
|
// when menu is open and has focus
|
||||||
|
if ( self.menu.active ) {
|
||||||
|
// #6055 - Opera still allows the keypress to occur
|
||||||
|
// which causes forms to submit
|
||||||
|
suppressKeyPress = true;
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
//passthrough - ENTER and TAB both select the current element
|
||||||
|
case keyCode.TAB:
|
||||||
|
if ( !self.menu.active ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self.menu.select( event );
|
||||||
|
break;
|
||||||
|
case keyCode.ESCAPE:
|
||||||
|
self.element.val( self.term );
|
||||||
|
self.close( event );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// keypress is triggered before the input value is changed
|
||||||
|
clearTimeout( self.searching );
|
||||||
|
self.searching = setTimeout(function() {
|
||||||
|
// only search if the value has changed
|
||||||
|
if ( self.term != self.element.val() ) {
|
||||||
|
self.selectedItem = null;
|
||||||
|
self.search( null, event );
|
||||||
|
}
|
||||||
|
}, self.options.delay );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.bind( "keypress.autocomplete", function( event ) {
|
||||||
|
if ( suppressKeyPress ) {
|
||||||
|
suppressKeyPress = false;
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.bind( "focus.autocomplete", function() {
|
||||||
|
if ( self.options.disabled ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.selectedItem = null;
|
||||||
|
self.previous = self.element.val();
|
||||||
|
})
|
||||||
|
.bind( "blur.autocomplete", function( event ) {
|
||||||
|
if ( self.options.disabled ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clearTimeout( self.searching );
|
||||||
|
// clicks on the menu (or a button to trigger a search) will cause a blur event
|
||||||
|
self.closing = setTimeout(function() {
|
||||||
|
self.close( event );
|
||||||
|
self._change( event );
|
||||||
|
}, 150 );
|
||||||
|
});
|
||||||
|
this._initSource();
|
||||||
|
this.response = function() {
|
||||||
|
return self._response.apply( self, arguments );
|
||||||
|
};
|
||||||
|
this.menu = $( "<ul></ul>" )
|
||||||
|
.addClass( "ui-autocomplete" )
|
||||||
|
.appendTo( $( this.options.appendTo || "body", doc )[0] )
|
||||||
|
// prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
|
||||||
|
.mousedown(function( event ) {
|
||||||
|
// clicking on the scrollbar causes focus to shift to the body
|
||||||
|
// but we can't detect a mouseup or a click immediately afterward
|
||||||
|
// so we have to track the next mousedown and close the menu if
|
||||||
|
// the user clicks somewhere outside of the autocomplete
|
||||||
|
var menuElement = self.menu.element[ 0 ];
|
||||||
|
if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
|
||||||
|
setTimeout(function() {
|
||||||
|
$( document ).one( 'mousedown', function( event ) {
|
||||||
|
if ( event.target !== self.element[ 0 ] &&
|
||||||
|
event.target !== menuElement &&
|
||||||
|
!$.ui.contains( menuElement, event.target ) ) {
|
||||||
|
self.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// use another timeout to make sure the blur-event-handler on the input was already triggered
|
||||||
|
setTimeout(function() {
|
||||||
|
clearTimeout( self.closing );
|
||||||
|
}, 13);
|
||||||
|
})
|
||||||
|
.menu({
|
||||||
|
focus: function( event, ui ) {
|
||||||
|
var item = ui.item.data( "item.autocomplete" );
|
||||||
|
if ( false !== self._trigger( "focus", event, { item: item } ) ) {
|
||||||
|
// use value to match what will end up in the input, if it was a key event
|
||||||
|
if ( /^key/.test(event.originalEvent.type) ) {
|
||||||
|
self.element.val( item.value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selected: function( event, ui ) {
|
||||||
|
var item = ui.item.data( "item.autocomplete" ),
|
||||||
|
previous = self.previous;
|
||||||
|
|
||||||
|
// only trigger when focus was lost (click on menu)
|
||||||
|
if ( self.element[0] !== doc.activeElement ) {
|
||||||
|
self.element.focus();
|
||||||
|
self.previous = previous;
|
||||||
|
// #6109 - IE triggers two focus events and the second
|
||||||
|
// is asynchronous, so we need to reset the previous
|
||||||
|
// term synchronously and asynchronously :-(
|
||||||
|
setTimeout(function() {
|
||||||
|
self.previous = previous;
|
||||||
|
self.selectedItem = item;
|
||||||
|
}, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( false !== self._trigger( "select", event, { item: item } ) ) {
|
||||||
|
self.element.val( item.value );
|
||||||
|
}
|
||||||
|
// reset the term after the select event
|
||||||
|
// this allows custom select handling to work properly
|
||||||
|
self.term = self.element.val();
|
||||||
|
|
||||||
|
self.close( event );
|
||||||
|
self.selectedItem = item;
|
||||||
|
},
|
||||||
|
blur: function( event, ui ) {
|
||||||
|
// don't set the value of the text field if it's already correct
|
||||||
|
// this prevents moving the cursor unnecessarily
|
||||||
|
if ( self.menu.element.is(":visible") &&
|
||||||
|
( self.element.val() !== self.term ) ) {
|
||||||
|
self.element.val( self.term );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.zIndex( this.element.zIndex() + 1 )
|
||||||
|
// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
|
||||||
|
.css({ top: 0, left: 0 })
|
||||||
|
.hide()
|
||||||
|
.data( "menu" );
|
||||||
|
if ( $.fn.bgiframe ) {
|
||||||
|
this.menu.element.bgiframe();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: function() {
|
||||||
|
this.element
|
||||||
|
.removeClass( "ui-autocomplete-input" )
|
||||||
|
.removeAttr( "autocomplete" )
|
||||||
|
.removeAttr( "role" )
|
||||||
|
.removeAttr( "aria-autocomplete" )
|
||||||
|
.removeAttr( "aria-haspopup" );
|
||||||
|
this.menu.element.remove();
|
||||||
|
$.Widget.prototype.destroy.call( this );
|
||||||
|
},
|
||||||
|
|
||||||
|
_setOption: function( key, value ) {
|
||||||
|
$.Widget.prototype._setOption.apply( this, arguments );
|
||||||
|
if ( key === "source" ) {
|
||||||
|
this._initSource();
|
||||||
|
}
|
||||||
|
if ( key === "appendTo" ) {
|
||||||
|
this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
|
||||||
|
}
|
||||||
|
if ( key === "disabled" && value && this.xhr ) {
|
||||||
|
this.xhr.abort();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_initSource: function() {
|
||||||
|
var self = this,
|
||||||
|
array,
|
||||||
|
url;
|
||||||
|
if ( $.isArray(this.options.source) ) {
|
||||||
|
array = this.options.source;
|
||||||
|
this.source = function( request, response ) {
|
||||||
|
response( $.ui.autocomplete.filter(array, request.term) );
|
||||||
|
};
|
||||||
|
} else if ( typeof this.options.source === "string" ) {
|
||||||
|
url = this.options.source;
|
||||||
|
this.source = function( request, response ) {
|
||||||
|
if ( self.xhr ) {
|
||||||
|
self.xhr.abort();
|
||||||
|
}
|
||||||
|
self.xhr = $.ajax({
|
||||||
|
url: url,
|
||||||
|
data: request,
|
||||||
|
dataType: "json",
|
||||||
|
autocompleteRequest: ++requestIndex,
|
||||||
|
success: function( data, status ) {
|
||||||
|
if ( this.autocompleteRequest === requestIndex ) {
|
||||||
|
response( data );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
if ( this.autocompleteRequest === requestIndex ) {
|
||||||
|
response( [] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
this.source = this.options.source;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
search: function( value, event ) {
|
||||||
|
value = value != null ? value : this.element.val();
|
||||||
|
|
||||||
|
// always save the actual value, not the one passed as an argument
|
||||||
|
this.term = this.element.val();
|
||||||
|
|
||||||
|
if ( value.length < this.options.minLength ) {
|
||||||
|
return this.close( event );
|
||||||
|
}
|
||||||
|
|
||||||
|
clearTimeout( this.closing );
|
||||||
|
if ( this._trigger( "search", event ) === false ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._search( value );
|
||||||
|
},
|
||||||
|
|
||||||
|
_search: function( value ) {
|
||||||
|
this.pending++;
|
||||||
|
this.element.addClass( "ui-autocomplete-loading" );
|
||||||
|
|
||||||
|
this.source( { term: value }, this.response );
|
||||||
|
},
|
||||||
|
|
||||||
|
_response: function( content ) {
|
||||||
|
if ( !this.options.disabled && content && content.length ) {
|
||||||
|
content = this._normalize( content );
|
||||||
|
this._suggest( content );
|
||||||
|
this._trigger( "open" );
|
||||||
|
} else {
|
||||||
|
this.close();
|
||||||
|
}
|
||||||
|
this.pending--;
|
||||||
|
if ( !this.pending ) {
|
||||||
|
this.element.removeClass( "ui-autocomplete-loading" );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
close: function( event ) {
|
||||||
|
clearTimeout( this.closing );
|
||||||
|
if ( this.menu.element.is(":visible") ) {
|
||||||
|
this.menu.element.hide();
|
||||||
|
this.menu.deactivate();
|
||||||
|
this._trigger( "close", event );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_change: function( event ) {
|
||||||
|
if ( this.previous !== this.element.val() ) {
|
||||||
|
this._trigger( "change", event, { item: this.selectedItem } );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_normalize: function( items ) {
|
||||||
|
// assume all items have the right format when the first item is complete
|
||||||
|
if ( items.length && items[0].label && items[0].value ) {
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
return $.map( items, function(item) {
|
||||||
|
if ( typeof item === "string" ) {
|
||||||
|
return {
|
||||||
|
label: item,
|
||||||
|
value: item
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return $.extend({
|
||||||
|
label: item.label || item.value,
|
||||||
|
value: item.value || item.label
|
||||||
|
}, item );
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_suggest: function( items ) {
|
||||||
|
var ul = this.menu.element
|
||||||
|
.empty()
|
||||||
|
.zIndex( this.element.zIndex() + 1 );
|
||||||
|
this._renderMenu( ul, items );
|
||||||
|
// TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
|
||||||
|
this.menu.deactivate();
|
||||||
|
this.menu.refresh();
|
||||||
|
|
||||||
|
// size and position menu
|
||||||
|
ul.show();
|
||||||
|
this._resizeMenu();
|
||||||
|
ul.position( $.extend({
|
||||||
|
of: this.element
|
||||||
|
}, this.options.position ));
|
||||||
|
|
||||||
|
if ( this.options.autoFocus ) {
|
||||||
|
this.menu.next( new $.Event("mouseover") );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_resizeMenu: function() {
|
||||||
|
var ul = this.menu.element;
|
||||||
|
ul.outerWidth( Math.max(
|
||||||
|
ul.width( "" ).outerWidth(),
|
||||||
|
this.element.outerWidth()
|
||||||
|
) );
|
||||||
|
},
|
||||||
|
|
||||||
|
_renderMenu: function( ul, items ) {
|
||||||
|
var self = this;
|
||||||
|
$.each( items, function( index, item ) {
|
||||||
|
self._renderItem( ul, item );
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_renderItem: function( ul, item) {
|
||||||
|
return $( "<li></li>" )
|
||||||
|
.data( "item.autocomplete", item )
|
||||||
|
.append( $( "<a></a>" ).text( item.label ) )
|
||||||
|
.appendTo( ul );
|
||||||
|
},
|
||||||
|
|
||||||
|
_move: function( direction, event ) {
|
||||||
|
if ( !this.menu.element.is(":visible") ) {
|
||||||
|
this.search( null, event );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( this.menu.first() && /^previous/.test(direction) ||
|
||||||
|
this.menu.last() && /^next/.test(direction) ) {
|
||||||
|
this.element.val( this.term );
|
||||||
|
this.menu.deactivate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.menu[ direction ]( event );
|
||||||
|
},
|
||||||
|
|
||||||
|
widget: function() {
|
||||||
|
return this.menu.element;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$.extend( $.ui.autocomplete, {
|
||||||
|
escapeRegex: function( value ) {
|
||||||
|
return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
||||||
|
},
|
||||||
|
filter: function(array, term) {
|
||||||
|
var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
|
||||||
|
return $.grep( array, function(value) {
|
||||||
|
return matcher.test( value.label || value.value || value );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}( jQuery ));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* jQuery UI Menu (not officially released)
|
||||||
|
*
|
||||||
|
* This widget isn't yet finished and the API is subject to change. We plan to finish
|
||||||
|
* it for the next release. You're welcome to give it a try anyway and give us feedback,
|
||||||
|
* as long as you're okay with migrating your code later on. We can help with that, too.
|
||||||
|
*
|
||||||
|
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Menu
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.core.js
|
||||||
|
* jquery.ui.widget.js
|
||||||
|
*/
|
||||||
|
(function($) {
|
||||||
|
|
||||||
|
$.widget("ui.menu", {
|
||||||
|
_create: function() {
|
||||||
|
var self = this;
|
||||||
|
this.element
|
||||||
|
.addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
|
||||||
|
.attr({
|
||||||
|
role: "listbox",
|
||||||
|
"aria-activedescendant": "ui-active-menuitem"
|
||||||
|
})
|
||||||
|
.click(function( event ) {
|
||||||
|
if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// temporary
|
||||||
|
event.preventDefault();
|
||||||
|
self.select( event );
|
||||||
|
});
|
||||||
|
this.refresh();
|
||||||
|
},
|
||||||
|
|
||||||
|
refresh: function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// don't refresh list items that are already adapted
|
||||||
|
var items = this.element.children("li:not(.ui-menu-item):has(a)")
|
||||||
|
.addClass("ui-menu-item")
|
||||||
|
.attr("role", "menuitem");
|
||||||
|
|
||||||
|
items.children("a")
|
||||||
|
.addClass("ui-corner-all")
|
||||||
|
.attr("tabindex", -1)
|
||||||
|
// mouseenter doesn't work with event delegation
|
||||||
|
.mouseenter(function( event ) {
|
||||||
|
self.activate( event, $(this).parent() );
|
||||||
|
})
|
||||||
|
.mouseleave(function() {
|
||||||
|
self.deactivate();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
activate: function( event, item ) {
|
||||||
|
this.deactivate();
|
||||||
|
if (this.hasScroll()) {
|
||||||
|
var offset = item.offset().top - this.element.offset().top,
|
||||||
|
scroll = this.element.attr("scrollTop"),
|
||||||
|
elementHeight = this.element.height();
|
||||||
|
if (offset < 0) {
|
||||||
|
this.element.attr("scrollTop", scroll + offset);
|
||||||
|
} else if (offset >= elementHeight) {
|
||||||
|
this.element.attr("scrollTop", scroll + offset - elementHeight + item.height());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.active = item.eq(0)
|
||||||
|
.children("a")
|
||||||
|
.addClass("ui-state-hover")
|
||||||
|
.attr("id", "ui-active-menuitem")
|
||||||
|
.end();
|
||||||
|
this._trigger("focus", event, { item: item });
|
||||||
|
},
|
||||||
|
|
||||||
|
deactivate: function() {
|
||||||
|
if (!this.active) { return; }
|
||||||
|
|
||||||
|
this.active.children("a")
|
||||||
|
.removeClass("ui-state-hover")
|
||||||
|
.removeAttr("id");
|
||||||
|
this._trigger("blur");
|
||||||
|
this.active = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
next: function(event) {
|
||||||
|
this.move("next", ".ui-menu-item:first", event);
|
||||||
|
},
|
||||||
|
|
||||||
|
previous: function(event) {
|
||||||
|
this.move("prev", ".ui-menu-item:last", event);
|
||||||
|
},
|
||||||
|
|
||||||
|
first: function() {
|
||||||
|
return this.active && !this.active.prevAll(".ui-menu-item").length;
|
||||||
|
},
|
||||||
|
|
||||||
|
last: function() {
|
||||||
|
return this.active && !this.active.nextAll(".ui-menu-item").length;
|
||||||
|
},
|
||||||
|
|
||||||
|
move: function(direction, edge, event) {
|
||||||
|
if (!this.active) {
|
||||||
|
this.activate(event, this.element.children(edge));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var next = this.active[direction + "All"](".ui-menu-item").eq(0);
|
||||||
|
if (next.length) {
|
||||||
|
this.activate(event, next);
|
||||||
|
} else {
|
||||||
|
this.activate(event, this.element.children(edge));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO merge with previousPage
|
||||||
|
nextPage: function(event) {
|
||||||
|
if (this.hasScroll()) {
|
||||||
|
// TODO merge with no-scroll-else
|
||||||
|
if (!this.active || this.last()) {
|
||||||
|
this.activate(event, this.element.children(".ui-menu-item:first"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var base = this.active.offset().top,
|
||||||
|
height = this.element.height(),
|
||||||
|
result = this.element.children(".ui-menu-item").filter(function() {
|
||||||
|
var close = $(this).offset().top - base - height + $(this).height();
|
||||||
|
// TODO improve approximation
|
||||||
|
return close < 10 && close > -10;
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO try to catch this earlier when scrollTop indicates the last page anyway
|
||||||
|
if (!result.length) {
|
||||||
|
result = this.element.children(".ui-menu-item:last");
|
||||||
|
}
|
||||||
|
this.activate(event, result);
|
||||||
|
} else {
|
||||||
|
this.activate(event, this.element.children(".ui-menu-item")
|
||||||
|
.filter(!this.active || this.last() ? ":first" : ":last"));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO merge with nextPage
|
||||||
|
previousPage: function(event) {
|
||||||
|
if (this.hasScroll()) {
|
||||||
|
// TODO merge with no-scroll-else
|
||||||
|
if (!this.active || this.first()) {
|
||||||
|
this.activate(event, this.element.children(".ui-menu-item:last"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var base = this.active.offset().top,
|
||||||
|
height = this.element.height();
|
||||||
|
result = this.element.children(".ui-menu-item").filter(function() {
|
||||||
|
var close = $(this).offset().top - base + height - $(this).height();
|
||||||
|
// TODO improve approximation
|
||||||
|
return close < 10 && close > -10;
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO try to catch this earlier when scrollTop indicates the last page anyway
|
||||||
|
if (!result.length) {
|
||||||
|
result = this.element.children(".ui-menu-item:first");
|
||||||
|
}
|
||||||
|
this.activate(event, result);
|
||||||
|
} else {
|
||||||
|
this.activate(event, this.element.children(".ui-menu-item")
|
||||||
|
.filter(!this.active || this.first() ? ":last" : ":first"));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
hasScroll: function() {
|
||||||
|
return this.element.height() < this.element.attr("scrollHeight");
|
||||||
|
},
|
||||||
|
|
||||||
|
select: function( event ) {
|
||||||
|
this._trigger("selected", event, { item: this.active });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}(jQuery));
|
32
www/js/jquery-ui-1.8.11/jquery.ui.autocomplete.min.js
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* jQuery UI Autocomplete 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Autocomplete
|
||||||
|
*
|
||||||
|
* Depends:
|
||||||
|
* jquery.ui.core.js
|
||||||
|
* jquery.ui.widget.js
|
||||||
|
* jquery.ui.position.js
|
||||||
|
*/
|
||||||
|
(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g=
|
||||||
|
false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=
|
||||||
|
a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};
|
||||||
|
this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&&
|
||||||
|
a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");
|
||||||
|
d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&
|
||||||
|
b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source=
|
||||||
|
this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();
|
||||||
|
this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||
|
||||||
|
b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new d.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var g=this;
|
||||||
|
d.each(b,function(c,f){g._renderItem(a,f)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,
|
||||||
|
"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery);
|
||||||
|
(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
|
||||||
|
-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},
|
||||||
|
deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);
|
||||||
|
e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,
|
||||||
|
g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
|
||||||
|
this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(e){this._trigger("selected",e,{item:this.active})}})})(jQuery);
|
308
www/js/jquery-ui-1.8.11/jquery.ui.core.js
vendored
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
/*!
|
||||||
|
* jQuery UI 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI
|
||||||
|
*/
|
||||||
|
(function( $, undefined ) {
|
||||||
|
|
||||||
|
// prevent duplicate loading
|
||||||
|
// this is only a problem because we proxy existing functions
|
||||||
|
// and we don't want to double proxy them
|
||||||
|
$.ui = $.ui || {};
|
||||||
|
if ( $.ui.version ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$.extend( $.ui, {
|
||||||
|
version: "1.8.11",
|
||||||
|
|
||||||
|
keyCode: {
|
||||||
|
ALT: 18,
|
||||||
|
BACKSPACE: 8,
|
||||||
|
CAPS_LOCK: 20,
|
||||||
|
COMMA: 188,
|
||||||
|
COMMAND: 91,
|
||||||
|
COMMAND_LEFT: 91, // COMMAND
|
||||||
|
COMMAND_RIGHT: 93,
|
||||||
|
CONTROL: 17,
|
||||||
|
DELETE: 46,
|
||||||
|
DOWN: 40,
|
||||||
|
END: 35,
|
||||||
|
ENTER: 13,
|
||||||
|
ESCAPE: 27,
|
||||||
|
HOME: 36,
|
||||||
|
INSERT: 45,
|
||||||
|
LEFT: 37,
|
||||||
|
MENU: 93, // COMMAND_RIGHT
|
||||||
|
NUMPAD_ADD: 107,
|
||||||
|
NUMPAD_DECIMAL: 110,
|
||||||
|
NUMPAD_DIVIDE: 111,
|
||||||
|
NUMPAD_ENTER: 108,
|
||||||
|
NUMPAD_MULTIPLY: 106,
|
||||||
|
NUMPAD_SUBTRACT: 109,
|
||||||
|
PAGE_DOWN: 34,
|
||||||
|
PAGE_UP: 33,
|
||||||
|
PERIOD: 190,
|
||||||
|
RIGHT: 39,
|
||||||
|
SHIFT: 16,
|
||||||
|
SPACE: 32,
|
||||||
|
TAB: 9,
|
||||||
|
UP: 38,
|
||||||
|
WINDOWS: 91 // COMMAND
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// plugins
|
||||||
|
$.fn.extend({
|
||||||
|
_focus: $.fn.focus,
|
||||||
|
focus: function( delay, fn ) {
|
||||||
|
return typeof delay === "number" ?
|
||||||
|
this.each(function() {
|
||||||
|
var elem = this;
|
||||||
|
setTimeout(function() {
|
||||||
|
$( elem ).focus();
|
||||||
|
if ( fn ) {
|
||||||
|
fn.call( elem );
|
||||||
|
}
|
||||||
|
}, delay );
|
||||||
|
}) :
|
||||||
|
this._focus.apply( this, arguments );
|
||||||
|
},
|
||||||
|
|
||||||
|
scrollParent: function() {
|
||||||
|
var scrollParent;
|
||||||
|
if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
|
||||||
|
scrollParent = this.parents().filter(function() {
|
||||||
|
return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
|
||||||
|
}).eq(0);
|
||||||
|
} else {
|
||||||
|
scrollParent = this.parents().filter(function() {
|
||||||
|
return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
|
||||||
|
}).eq(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
|
||||||
|
},
|
||||||
|
|
||||||
|
zIndex: function( zIndex ) {
|
||||||
|
if ( zIndex !== undefined ) {
|
||||||
|
return this.css( "zIndex", zIndex );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( this.length ) {
|
||||||
|
var elem = $( this[ 0 ] ), position, value;
|
||||||
|
while ( elem.length && elem[ 0 ] !== document ) {
|
||||||
|
// Ignore z-index if position is set to a value where z-index is ignored by the browser
|
||||||
|
// This makes behavior of this function consistent across browsers
|
||||||
|
// WebKit always returns auto if the element is positioned
|
||||||
|
position = elem.css( "position" );
|
||||||
|
if ( position === "absolute" || position === "relative" || position === "fixed" ) {
|
||||||
|
// IE returns 0 when zIndex is not specified
|
||||||
|
// other browsers return a string
|
||||||
|
// we ignore the case of nested elements with an explicit value of 0
|
||||||
|
// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
|
||||||
|
value = parseInt( elem.css( "zIndex" ), 10 );
|
||||||
|
if ( !isNaN( value ) && value !== 0 ) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elem = elem.parent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
disableSelection: function() {
|
||||||
|
return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
|
||||||
|
".ui-disableSelection", function( event ) {
|
||||||
|
event.preventDefault();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
enableSelection: function() {
|
||||||
|
return this.unbind( ".ui-disableSelection" );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$.each( [ "Width", "Height" ], function( i, name ) {
|
||||||
|
var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
|
||||||
|
type = name.toLowerCase(),
|
||||||
|
orig = {
|
||||||
|
innerWidth: $.fn.innerWidth,
|
||||||
|
innerHeight: $.fn.innerHeight,
|
||||||
|
outerWidth: $.fn.outerWidth,
|
||||||
|
outerHeight: $.fn.outerHeight
|
||||||
|
};
|
||||||
|
|
||||||
|
function reduce( elem, size, border, margin ) {
|
||||||
|
$.each( side, function() {
|
||||||
|
size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
|
||||||
|
if ( border ) {
|
||||||
|
size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
|
||||||
|
}
|
||||||
|
if ( margin ) {
|
||||||
|
size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn[ "inner" + name ] = function( size ) {
|
||||||
|
if ( size === undefined ) {
|
||||||
|
return orig[ "inner" + name ].call( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.each(function() {
|
||||||
|
$( this ).css( type, reduce( this, size ) + "px" );
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$.fn[ "outer" + name] = function( size, margin ) {
|
||||||
|
if ( typeof size !== "number" ) {
|
||||||
|
return orig[ "outer" + name ].call( this, size );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.each(function() {
|
||||||
|
$( this).css( type, reduce( this, size, true, margin ) + "px" );
|
||||||
|
});
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// selectors
|
||||||
|
function visible( element ) {
|
||||||
|
return !$( element ).parents().andSelf().filter(function() {
|
||||||
|
return $.curCSS( this, "visibility" ) === "hidden" ||
|
||||||
|
$.expr.filters.hidden( this );
|
||||||
|
}).length;
|
||||||
|
}
|
||||||
|
|
||||||
|
$.extend( $.expr[ ":" ], {
|
||||||
|
data: function( elem, i, match ) {
|
||||||
|
return !!$.data( elem, match[ 3 ] );
|
||||||
|
},
|
||||||
|
|
||||||
|
focusable: function( element ) {
|
||||||
|
var nodeName = element.nodeName.toLowerCase(),
|
||||||
|
tabIndex = $.attr( element, "tabindex" );
|
||||||
|
if ( "area" === nodeName ) {
|
||||||
|
var map = element.parentNode,
|
||||||
|
mapName = map.name,
|
||||||
|
img;
|
||||||
|
if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
img = $( "img[usemap=#" + mapName + "]" )[0];
|
||||||
|
return !!img && visible( img );
|
||||||
|
}
|
||||||
|
return ( /input|select|textarea|button|object/.test( nodeName )
|
||||||
|
? !element.disabled
|
||||||
|
: "a" == nodeName
|
||||||
|
? element.href || !isNaN( tabIndex )
|
||||||
|
: !isNaN( tabIndex ))
|
||||||
|
// the element and all of its ancestors must be visible
|
||||||
|
&& visible( element );
|
||||||
|
},
|
||||||
|
|
||||||
|
tabbable: function( element ) {
|
||||||
|
var tabIndex = $.attr( element, "tabindex" );
|
||||||
|
return ( isNaN( tabIndex ) || tabIndex >= 0 ) && $( element ).is( ":focusable" );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// support
|
||||||
|
$(function() {
|
||||||
|
var body = document.body,
|
||||||
|
div = body.appendChild( div = document.createElement( "div" ) );
|
||||||
|
|
||||||
|
$.extend( div.style, {
|
||||||
|
minHeight: "100px",
|
||||||
|
height: "auto",
|
||||||
|
padding: 0,
|
||||||
|
borderWidth: 0
|
||||||
|
});
|
||||||
|
|
||||||
|
$.support.minHeight = div.offsetHeight === 100;
|
||||||
|
$.support.selectstart = "onselectstart" in div;
|
||||||
|
|
||||||
|
// set display to none to avoid a layout bug in IE
|
||||||
|
// http://dev.jquery.com/ticket/4014
|
||||||
|
body.removeChild( div ).style.display = "none";
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
$.extend( $.ui, {
|
||||||
|
// $.ui.plugin is deprecated. Use the proxy pattern instead.
|
||||||
|
plugin: {
|
||||||
|
add: function( module, option, set ) {
|
||||||
|
var proto = $.ui[ module ].prototype;
|
||||||
|
for ( var i in set ) {
|
||||||
|
proto.plugins[ i ] = proto.plugins[ i ] || [];
|
||||||
|
proto.plugins[ i ].push( [ option, set[ i ] ] );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
call: function( instance, name, args ) {
|
||||||
|
var set = instance.plugins[ name ];
|
||||||
|
if ( !set || !instance.element[ 0 ].parentNode ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( var i = 0; i < set.length; i++ ) {
|
||||||
|
if ( instance.options[ set[ i ][ 0 ] ] ) {
|
||||||
|
set[ i ][ 1 ].apply( instance.element, args );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
|
||||||
|
contains: function( a, b ) {
|
||||||
|
return document.compareDocumentPosition ?
|
||||||
|
a.compareDocumentPosition( b ) & 16 :
|
||||||
|
a !== b && a.contains( b );
|
||||||
|
},
|
||||||
|
|
||||||
|
// only used by resizable
|
||||||
|
hasScroll: function( el, a ) {
|
||||||
|
|
||||||
|
//If overflow is hidden, the element might have extra content, but the user wants to hide it
|
||||||
|
if ( $( el ).css( "overflow" ) === "hidden") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
|
||||||
|
has = false;
|
||||||
|
|
||||||
|
if ( el[ scroll ] > 0 ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: determine which cases actually cause this to happen
|
||||||
|
// if the element doesn't have the scroll set, see if it's possible to
|
||||||
|
// set the scroll
|
||||||
|
el[ scroll ] = 1;
|
||||||
|
has = ( el[ scroll ] > 0 );
|
||||||
|
el[ scroll ] = 0;
|
||||||
|
return has;
|
||||||
|
},
|
||||||
|
|
||||||
|
// these are odd functions, fix the API or move into individual plugins
|
||||||
|
isOverAxis: function( x, reference, size ) {
|
||||||
|
//Determines when x coordinate is over "b" element axis
|
||||||
|
return ( x > reference ) && ( x < ( reference + size ) );
|
||||||
|
},
|
||||||
|
isOver: function( y, x, top, left, height, width ) {
|
||||||
|
//Determines when x, y coordinates is over "b" element
|
||||||
|
return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
})( jQuery );
|
17
www/js/jquery-ui-1.8.11/jquery.ui.core.min.js
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*!
|
||||||
|
* jQuery UI 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI
|
||||||
|
*/
|
||||||
|
(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.11",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
|
||||||
|
NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
|
||||||
|
"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
|
||||||
|
if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
|
||||||
|
"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
|
||||||
|
d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
|
||||||
|
c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
|
||||||
|
b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
|
252
www/js/jquery-ui-1.8.11/jquery.ui.position.js
vendored
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
/*
|
||||||
|
* jQuery UI Position 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Position
|
||||||
|
*/
|
||||||
|
(function( $, undefined ) {
|
||||||
|
|
||||||
|
$.ui = $.ui || {};
|
||||||
|
|
||||||
|
var horizontalPositions = /left|center|right/,
|
||||||
|
verticalPositions = /top|center|bottom/,
|
||||||
|
center = "center",
|
||||||
|
_position = $.fn.position,
|
||||||
|
_offset = $.fn.offset;
|
||||||
|
|
||||||
|
$.fn.position = function( options ) {
|
||||||
|
if ( !options || !options.of ) {
|
||||||
|
return _position.apply( this, arguments );
|
||||||
|
}
|
||||||
|
|
||||||
|
// make a copy, we don't want to modify arguments
|
||||||
|
options = $.extend( {}, options );
|
||||||
|
|
||||||
|
var target = $( options.of ),
|
||||||
|
targetElem = target[0],
|
||||||
|
collision = ( options.collision || "flip" ).split( " " ),
|
||||||
|
offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
|
||||||
|
targetWidth,
|
||||||
|
targetHeight,
|
||||||
|
basePosition;
|
||||||
|
|
||||||
|
if ( targetElem.nodeType === 9 ) {
|
||||||
|
targetWidth = target.width();
|
||||||
|
targetHeight = target.height();
|
||||||
|
basePosition = { top: 0, left: 0 };
|
||||||
|
// TODO: use $.isWindow() in 1.9
|
||||||
|
} else if ( targetElem.setTimeout ) {
|
||||||
|
targetWidth = target.width();
|
||||||
|
targetHeight = target.height();
|
||||||
|
basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
|
||||||
|
} else if ( targetElem.preventDefault ) {
|
||||||
|
// force left top to allow flipping
|
||||||
|
options.at = "left top";
|
||||||
|
targetWidth = targetHeight = 0;
|
||||||
|
basePosition = { top: options.of.pageY, left: options.of.pageX };
|
||||||
|
} else {
|
||||||
|
targetWidth = target.outerWidth();
|
||||||
|
targetHeight = target.outerHeight();
|
||||||
|
basePosition = target.offset();
|
||||||
|
}
|
||||||
|
|
||||||
|
// force my and at to have valid horizontal and veritcal positions
|
||||||
|
// if a value is missing or invalid, it will be converted to center
|
||||||
|
$.each( [ "my", "at" ], function() {
|
||||||
|
var pos = ( options[this] || "" ).split( " " );
|
||||||
|
if ( pos.length === 1) {
|
||||||
|
pos = horizontalPositions.test( pos[0] ) ?
|
||||||
|
pos.concat( [center] ) :
|
||||||
|
verticalPositions.test( pos[0] ) ?
|
||||||
|
[ center ].concat( pos ) :
|
||||||
|
[ center, center ];
|
||||||
|
}
|
||||||
|
pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
|
||||||
|
pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
|
||||||
|
options[ this ] = pos;
|
||||||
|
});
|
||||||
|
|
||||||
|
// normalize collision option
|
||||||
|
if ( collision.length === 1 ) {
|
||||||
|
collision[ 1 ] = collision[ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalize offset option
|
||||||
|
offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
|
||||||
|
if ( offset.length === 1 ) {
|
||||||
|
offset[ 1 ] = offset[ 0 ];
|
||||||
|
}
|
||||||
|
offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
|
||||||
|
|
||||||
|
if ( options.at[0] === "right" ) {
|
||||||
|
basePosition.left += targetWidth;
|
||||||
|
} else if ( options.at[0] === center ) {
|
||||||
|
basePosition.left += targetWidth / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( options.at[1] === "bottom" ) {
|
||||||
|
basePosition.top += targetHeight;
|
||||||
|
} else if ( options.at[1] === center ) {
|
||||||
|
basePosition.top += targetHeight / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
basePosition.left += offset[ 0 ];
|
||||||
|
basePosition.top += offset[ 1 ];
|
||||||
|
|
||||||
|
return this.each(function() {
|
||||||
|
var elem = $( this ),
|
||||||
|
elemWidth = elem.outerWidth(),
|
||||||
|
elemHeight = elem.outerHeight(),
|
||||||
|
marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
|
||||||
|
marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
|
||||||
|
collisionWidth = elemWidth + marginLeft +
|
||||||
|
( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
|
||||||
|
collisionHeight = elemHeight + marginTop +
|
||||||
|
( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
|
||||||
|
position = $.extend( {}, basePosition ),
|
||||||
|
collisionPosition;
|
||||||
|
|
||||||
|
if ( options.my[0] === "right" ) {
|
||||||
|
position.left -= elemWidth;
|
||||||
|
} else if ( options.my[0] === center ) {
|
||||||
|
position.left -= elemWidth / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( options.my[1] === "bottom" ) {
|
||||||
|
position.top -= elemHeight;
|
||||||
|
} else if ( options.my[1] === center ) {
|
||||||
|
position.top -= elemHeight / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prevent fractions (see #5280)
|
||||||
|
position.left = Math.round( position.left );
|
||||||
|
position.top = Math.round( position.top );
|
||||||
|
|
||||||
|
collisionPosition = {
|
||||||
|
left: position.left - marginLeft,
|
||||||
|
top: position.top - marginTop
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each( [ "left", "top" ], function( i, dir ) {
|
||||||
|
if ( $.ui.position[ collision[i] ] ) {
|
||||||
|
$.ui.position[ collision[i] ][ dir ]( position, {
|
||||||
|
targetWidth: targetWidth,
|
||||||
|
targetHeight: targetHeight,
|
||||||
|
elemWidth: elemWidth,
|
||||||
|
elemHeight: elemHeight,
|
||||||
|
collisionPosition: collisionPosition,
|
||||||
|
collisionWidth: collisionWidth,
|
||||||
|
collisionHeight: collisionHeight,
|
||||||
|
offset: offset,
|
||||||
|
my: options.my,
|
||||||
|
at: options.at
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if ( $.fn.bgiframe ) {
|
||||||
|
elem.bgiframe();
|
||||||
|
}
|
||||||
|
elem.offset( $.extend( position, { using: options.using } ) );
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$.ui.position = {
|
||||||
|
fit: {
|
||||||
|
left: function( position, data ) {
|
||||||
|
var win = $( window ),
|
||||||
|
over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
|
||||||
|
position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
|
||||||
|
},
|
||||||
|
top: function( position, data ) {
|
||||||
|
var win = $( window ),
|
||||||
|
over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
|
||||||
|
position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
flip: {
|
||||||
|
left: function( position, data ) {
|
||||||
|
if ( data.at[0] === center ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var win = $( window ),
|
||||||
|
over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
|
||||||
|
myOffset = data.my[ 0 ] === "left" ?
|
||||||
|
-data.elemWidth :
|
||||||
|
data.my[ 0 ] === "right" ?
|
||||||
|
data.elemWidth :
|
||||||
|
0,
|
||||||
|
atOffset = data.at[ 0 ] === "left" ?
|
||||||
|
data.targetWidth :
|
||||||
|
-data.targetWidth,
|
||||||
|
offset = -2 * data.offset[ 0 ];
|
||||||
|
position.left += data.collisionPosition.left < 0 ?
|
||||||
|
myOffset + atOffset + offset :
|
||||||
|
over > 0 ?
|
||||||
|
myOffset + atOffset + offset :
|
||||||
|
0;
|
||||||
|
},
|
||||||
|
top: function( position, data ) {
|
||||||
|
if ( data.at[1] === center ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var win = $( window ),
|
||||||
|
over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
|
||||||
|
myOffset = data.my[ 1 ] === "top" ?
|
||||||
|
-data.elemHeight :
|
||||||
|
data.my[ 1 ] === "bottom" ?
|
||||||
|
data.elemHeight :
|
||||||
|
0,
|
||||||
|
atOffset = data.at[ 1 ] === "top" ?
|
||||||
|
data.targetHeight :
|
||||||
|
-data.targetHeight,
|
||||||
|
offset = -2 * data.offset[ 1 ];
|
||||||
|
position.top += data.collisionPosition.top < 0 ?
|
||||||
|
myOffset + atOffset + offset :
|
||||||
|
over > 0 ?
|
||||||
|
myOffset + atOffset + offset :
|
||||||
|
0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// offset setter from jQuery 1.4
|
||||||
|
if ( !$.offset.setOffset ) {
|
||||||
|
$.offset.setOffset = function( elem, options ) {
|
||||||
|
// set position first, in-case top/left are set even on static elem
|
||||||
|
if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
|
||||||
|
elem.style.position = "relative";
|
||||||
|
}
|
||||||
|
var curElem = $( elem ),
|
||||||
|
curOffset = curElem.offset(),
|
||||||
|
curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0,
|
||||||
|
curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0,
|
||||||
|
props = {
|
||||||
|
top: (options.top - curOffset.top) + curTop,
|
||||||
|
left: (options.left - curOffset.left) + curLeft
|
||||||
|
};
|
||||||
|
|
||||||
|
if ( 'using' in options ) {
|
||||||
|
options.using.call( elem, props );
|
||||||
|
} else {
|
||||||
|
curElem.css( props );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.fn.offset = function( options ) {
|
||||||
|
var elem = this[ 0 ];
|
||||||
|
if ( !elem || !elem.ownerDocument ) { return null; }
|
||||||
|
if ( options ) {
|
||||||
|
return this.each(function() {
|
||||||
|
$.offset.setOffset( this, options );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return _offset.call( this );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}( jQuery ));
|
16
www/js/jquery-ui-1.8.11/jquery.ui.position.min.js
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* jQuery UI Position 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Position
|
||||||
|
*/
|
||||||
|
(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
|
||||||
|
left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
|
||||||
|
k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
|
||||||
|
m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
|
||||||
|
d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
|
||||||
|
a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
|
||||||
|
g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
|
262
www/js/jquery-ui-1.8.11/jquery.ui.widget.js
vendored
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
/*!
|
||||||
|
* jQuery UI Widget 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Widget
|
||||||
|
*/
|
||||||
|
(function( $, undefined ) {
|
||||||
|
|
||||||
|
// jQuery 1.4+
|
||||||
|
if ( $.cleanData ) {
|
||||||
|
var _cleanData = $.cleanData;
|
||||||
|
$.cleanData = function( elems ) {
|
||||||
|
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
|
||||||
|
$( elem ).triggerHandler( "remove" );
|
||||||
|
}
|
||||||
|
_cleanData( elems );
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
var _remove = $.fn.remove;
|
||||||
|
$.fn.remove = function( selector, keepData ) {
|
||||||
|
return this.each(function() {
|
||||||
|
if ( !keepData ) {
|
||||||
|
if ( !selector || $.filter( selector, [ this ] ).length ) {
|
||||||
|
$( "*", this ).add( [ this ] ).each(function() {
|
||||||
|
$( this ).triggerHandler( "remove" );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _remove.call( $(this), selector, keepData );
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
$.widget = function( name, base, prototype ) {
|
||||||
|
var namespace = name.split( "." )[ 0 ],
|
||||||
|
fullName;
|
||||||
|
name = name.split( "." )[ 1 ];
|
||||||
|
fullName = namespace + "-" + name;
|
||||||
|
|
||||||
|
if ( !prototype ) {
|
||||||
|
prototype = base;
|
||||||
|
base = $.Widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create selector for plugin
|
||||||
|
$.expr[ ":" ][ fullName ] = function( elem ) {
|
||||||
|
return !!$.data( elem, name );
|
||||||
|
};
|
||||||
|
|
||||||
|
$[ namespace ] = $[ namespace ] || {};
|
||||||
|
$[ namespace ][ name ] = function( options, element ) {
|
||||||
|
// allow instantiation without initializing for simple inheritance
|
||||||
|
if ( arguments.length ) {
|
||||||
|
this._createWidget( options, element );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var basePrototype = new base();
|
||||||
|
// we need to make the options hash a property directly on the new instance
|
||||||
|
// otherwise we'll modify the options hash on the prototype that we're
|
||||||
|
// inheriting from
|
||||||
|
// $.each( basePrototype, function( key, val ) {
|
||||||
|
// if ( $.isPlainObject(val) ) {
|
||||||
|
// basePrototype[ key ] = $.extend( {}, val );
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
basePrototype.options = $.extend( true, {}, basePrototype.options );
|
||||||
|
$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
|
||||||
|
namespace: namespace,
|
||||||
|
widgetName: name,
|
||||||
|
widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
|
||||||
|
widgetBaseClass: fullName
|
||||||
|
}, prototype );
|
||||||
|
|
||||||
|
$.widget.bridge( name, $[ namespace ][ name ] );
|
||||||
|
};
|
||||||
|
|
||||||
|
$.widget.bridge = function( name, object ) {
|
||||||
|
$.fn[ name ] = function( options ) {
|
||||||
|
var isMethodCall = typeof options === "string",
|
||||||
|
args = Array.prototype.slice.call( arguments, 1 ),
|
||||||
|
returnValue = this;
|
||||||
|
|
||||||
|
// allow multiple hashes to be passed on init
|
||||||
|
options = !isMethodCall && args.length ?
|
||||||
|
$.extend.apply( null, [ true, options ].concat(args) ) :
|
||||||
|
options;
|
||||||
|
|
||||||
|
// prevent calls to internal methods
|
||||||
|
if ( isMethodCall && options.charAt( 0 ) === "_" ) {
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isMethodCall ) {
|
||||||
|
this.each(function() {
|
||||||
|
var instance = $.data( this, name ),
|
||||||
|
methodValue = instance && $.isFunction( instance[options] ) ?
|
||||||
|
instance[ options ].apply( instance, args ) :
|
||||||
|
instance;
|
||||||
|
// TODO: add this back in 1.9 and use $.error() (see #5972)
|
||||||
|
// if ( !instance ) {
|
||||||
|
// throw "cannot call methods on " + name + " prior to initialization; " +
|
||||||
|
// "attempted to call method '" + options + "'";
|
||||||
|
// }
|
||||||
|
// if ( !$.isFunction( instance[options] ) ) {
|
||||||
|
// throw "no such method '" + options + "' for " + name + " widget instance";
|
||||||
|
// }
|
||||||
|
// var methodValue = instance[ options ].apply( instance, args );
|
||||||
|
if ( methodValue !== instance && methodValue !== undefined ) {
|
||||||
|
returnValue = methodValue;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.each(function() {
|
||||||
|
var instance = $.data( this, name );
|
||||||
|
if ( instance ) {
|
||||||
|
instance.option( options || {} )._init();
|
||||||
|
} else {
|
||||||
|
$.data( this, name, new object( options, this ) );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnValue;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
$.Widget = function( options, element ) {
|
||||||
|
// allow instantiation without initializing for simple inheritance
|
||||||
|
if ( arguments.length ) {
|
||||||
|
this._createWidget( options, element );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.Widget.prototype = {
|
||||||
|
widgetName: "widget",
|
||||||
|
widgetEventPrefix: "",
|
||||||
|
options: {
|
||||||
|
disabled: false
|
||||||
|
},
|
||||||
|
_createWidget: function( options, element ) {
|
||||||
|
// $.widget.bridge stores the plugin instance, but we do it anyway
|
||||||
|
// so that it's stored even before the _create function runs
|
||||||
|
$.data( element, this.widgetName, this );
|
||||||
|
this.element = $( element );
|
||||||
|
this.options = $.extend( true, {},
|
||||||
|
this.options,
|
||||||
|
this._getCreateOptions(),
|
||||||
|
options );
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
this.element.bind( "remove." + this.widgetName, function() {
|
||||||
|
self.destroy();
|
||||||
|
});
|
||||||
|
|
||||||
|
this._create();
|
||||||
|
this._trigger( "create" );
|
||||||
|
this._init();
|
||||||
|
},
|
||||||
|
_getCreateOptions: function() {
|
||||||
|
return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
|
||||||
|
},
|
||||||
|
_create: function() {},
|
||||||
|
_init: function() {},
|
||||||
|
|
||||||
|
destroy: function() {
|
||||||
|
this.element
|
||||||
|
.unbind( "." + this.widgetName )
|
||||||
|
.removeData( this.widgetName );
|
||||||
|
this.widget()
|
||||||
|
.unbind( "." + this.widgetName )
|
||||||
|
.removeAttr( "aria-disabled" )
|
||||||
|
.removeClass(
|
||||||
|
this.widgetBaseClass + "-disabled " +
|
||||||
|
"ui-state-disabled" );
|
||||||
|
},
|
||||||
|
|
||||||
|
widget: function() {
|
||||||
|
return this.element;
|
||||||
|
},
|
||||||
|
|
||||||
|
option: function( key, value ) {
|
||||||
|
var options = key;
|
||||||
|
|
||||||
|
if ( arguments.length === 0 ) {
|
||||||
|
// don't return a reference to the internal hash
|
||||||
|
return $.extend( {}, this.options );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof key === "string" ) {
|
||||||
|
if ( value === undefined ) {
|
||||||
|
return this.options[ key ];
|
||||||
|
}
|
||||||
|
options = {};
|
||||||
|
options[ key ] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._setOptions( options );
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
_setOptions: function( options ) {
|
||||||
|
var self = this;
|
||||||
|
$.each( options, function( key, value ) {
|
||||||
|
self._setOption( key, value );
|
||||||
|
});
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
_setOption: function( key, value ) {
|
||||||
|
this.options[ key ] = value;
|
||||||
|
|
||||||
|
if ( key === "disabled" ) {
|
||||||
|
this.widget()
|
||||||
|
[ value ? "addClass" : "removeClass"](
|
||||||
|
this.widgetBaseClass + "-disabled" + " " +
|
||||||
|
"ui-state-disabled" )
|
||||||
|
.attr( "aria-disabled", value );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
enable: function() {
|
||||||
|
return this._setOption( "disabled", false );
|
||||||
|
},
|
||||||
|
disable: function() {
|
||||||
|
return this._setOption( "disabled", true );
|
||||||
|
},
|
||||||
|
|
||||||
|
_trigger: function( type, event, data ) {
|
||||||
|
var callback = this.options[ type ];
|
||||||
|
|
||||||
|
event = $.Event( event );
|
||||||
|
event.type = ( type === this.widgetEventPrefix ?
|
||||||
|
type :
|
||||||
|
this.widgetEventPrefix + type ).toLowerCase();
|
||||||
|
data = data || {};
|
||||||
|
|
||||||
|
// copy original event properties over to the new event
|
||||||
|
// this would happen if we could call $.event.fix instead of $.Event
|
||||||
|
// but we don't have a way to force an event to be fixed multiple times
|
||||||
|
if ( event.originalEvent ) {
|
||||||
|
for ( var i = $.event.props.length, prop; i; ) {
|
||||||
|
prop = $.event.props[ --i ];
|
||||||
|
event[ prop ] = event.originalEvent[ prop ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.element.trigger( event, data );
|
||||||
|
|
||||||
|
return !( $.isFunction(callback) &&
|
||||||
|
callback.call( this.element[0], event, data ) === false ||
|
||||||
|
event.isDefaultPrevented() );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
})( jQuery );
|
15
www/js/jquery-ui-1.8.11/jquery.ui.widget.min.js
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*!
|
||||||
|
* jQuery UI Widget 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Widget
|
||||||
|
*/
|
||||||
|
(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
|
||||||
|
a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
|
||||||
|
e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
|
||||||
|
this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
|
||||||
|
widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
|
||||||
|
enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
|
After Width: | Height: | Size: 180 B |
After Width: | Height: | Size: 178 B |
After Width: | Height: | Size: 120 B |
After Width: | Height: | Size: 105 B |
After Width: | Height: | Size: 111 B |
After Width: | Height: | Size: 110 B |
After Width: | Height: | Size: 119 B |
After Width: | Height: | Size: 101 B |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
11
www/js/jquery-ui-1.8.11/themes/base/jquery.ui.all.css
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/*
|
||||||
|
* jQuery UI CSS Framework @VERSION
|
||||||
|
*
|
||||||
|
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Theming
|
||||||
|
*/
|
||||||
|
@import "jquery.ui.base.css";
|
||||||
|
@import "jquery.ui.theme.css";
|
53
www/js/jquery-ui-1.8.11/themes/base/jquery.ui.autocomplete.css
vendored
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* jQuery UI Autocomplete 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Autocomplete#theming
|
||||||
|
*/
|
||||||
|
.ui-autocomplete { position: absolute; cursor: default; }
|
||||||
|
|
||||||
|
/* workarounds */
|
||||||
|
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* jQuery UI Menu 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Menu#theming
|
||||||
|
*/
|
||||||
|
.ui-menu {
|
||||||
|
list-style:none;
|
||||||
|
padding: 2px;
|
||||||
|
margin: 0;
|
||||||
|
display:block;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu {
|
||||||
|
margin-top: -3px;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu-item {
|
||||||
|
margin:0;
|
||||||
|
padding: 0;
|
||||||
|
zoom: 1;
|
||||||
|
float: left;
|
||||||
|
clear: left;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu-item a {
|
||||||
|
text-decoration:none;
|
||||||
|
display:block;
|
||||||
|
padding:.2em .4em;
|
||||||
|
line-height:1.5;
|
||||||
|
zoom:1;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu-item a.ui-state-hover,
|
||||||
|
.ui-menu .ui-menu-item a.ui-state-active {
|
||||||
|
font-weight: normal;
|
||||||
|
margin: -1px;
|
||||||
|
}
|
2
www/js/jquery-ui-1.8.11/themes/base/jquery.ui.base.css
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
@import url("jquery.ui.core.css");
|
||||||
|
@import url("jquery.ui.autocomplete.css");
|
41
www/js/jquery-ui-1.8.11/themes/base/jquery.ui.core.css
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* jQuery UI CSS Framework 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Theming/API
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Layout helpers
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-helper-hidden { display: none; }
|
||||||
|
.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
|
||||||
|
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
|
||||||
|
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
|
||||||
|
.ui-helper-clearfix { display: inline-block; }
|
||||||
|
/* required comment for clearfix to work in Opera \*/
|
||||||
|
* html .ui-helper-clearfix { height:1%; }
|
||||||
|
.ui-helper-clearfix { display:block; }
|
||||||
|
/* end clearfix */
|
||||||
|
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
|
||||||
|
|
||||||
|
|
||||||
|
/* Interaction Cues
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-disabled { cursor: default !important; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Icons
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* states and images */
|
||||||
|
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Misc visuals
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* Overlays */
|
||||||
|
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
252
www/js/jquery-ui-1.8.11/themes/base/jquery.ui.theme.css
vendored
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
/*
|
||||||
|
* jQuery UI CSS Framework 1.8.11
|
||||||
|
*
|
||||||
|
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Theming/API
|
||||||
|
*
|
||||||
|
* To view and modify this theme, visit http://jqueryui.com/themeroller/
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Component containers
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
|
||||||
|
.ui-widget .ui-widget { font-size: 1em; }
|
||||||
|
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
|
||||||
|
.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
|
||||||
|
.ui-widget-content a { color: #222222/*{fcContent}*/; }
|
||||||
|
.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
|
||||||
|
.ui-widget-header a { color: #222222/*{fcHeader}*/; }
|
||||||
|
|
||||||
|
/* Interaction states
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
|
||||||
|
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
|
||||||
|
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
|
||||||
|
.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; }
|
||||||
|
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
|
||||||
|
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
|
||||||
|
.ui-widget :active { outline: none; }
|
||||||
|
|
||||||
|
/* Interaction Cues
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
|
||||||
|
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
|
||||||
|
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
|
||||||
|
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
|
||||||
|
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
|
||||||
|
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
|
||||||
|
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
|
||||||
|
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
|
||||||
|
|
||||||
|
/* Icons
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* states and images */
|
||||||
|
.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
|
||||||
|
.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
|
||||||
|
.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
|
||||||
|
.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
|
||||||
|
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
|
||||||
|
.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
|
||||||
|
.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
|
||||||
|
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
|
||||||
|
|
||||||
|
/* positioning */
|
||||||
|
.ui-icon-carat-1-n { background-position: 0 0; }
|
||||||
|
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
||||||
|
.ui-icon-carat-1-e { background-position: -32px 0; }
|
||||||
|
.ui-icon-carat-1-se { background-position: -48px 0; }
|
||||||
|
.ui-icon-carat-1-s { background-position: -64px 0; }
|
||||||
|
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
||||||
|
.ui-icon-carat-1-w { background-position: -96px 0; }
|
||||||
|
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
||||||
|
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
||||||
|
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
||||||
|
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||||
|
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||||
|
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||||
|
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||||
|
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
||||||
|
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||||
|
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||||
|
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||||
|
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||||
|
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||||
|
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||||
|
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||||
|
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||||
|
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||||
|
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
||||||
|
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||||
|
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||||
|
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||||
|
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||||
|
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||||
|
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||||
|
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||||
|
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
||||||
|
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||||
|
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||||
|
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||||
|
.ui-icon-extlink { background-position: -32px -80px; }
|
||||||
|
.ui-icon-newwin { background-position: -48px -80px; }
|
||||||
|
.ui-icon-refresh { background-position: -64px -80px; }
|
||||||
|
.ui-icon-shuffle { background-position: -80px -80px; }
|
||||||
|
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||||
|
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||||
|
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||||
|
.ui-icon-folder-open { background-position: -16px -96px; }
|
||||||
|
.ui-icon-document { background-position: -32px -96px; }
|
||||||
|
.ui-icon-document-b { background-position: -48px -96px; }
|
||||||
|
.ui-icon-note { background-position: -64px -96px; }
|
||||||
|
.ui-icon-mail-closed { background-position: -80px -96px; }
|
||||||
|
.ui-icon-mail-open { background-position: -96px -96px; }
|
||||||
|
.ui-icon-suitcase { background-position: -112px -96px; }
|
||||||
|
.ui-icon-comment { background-position: -128px -96px; }
|
||||||
|
.ui-icon-person { background-position: -144px -96px; }
|
||||||
|
.ui-icon-print { background-position: -160px -96px; }
|
||||||
|
.ui-icon-trash { background-position: -176px -96px; }
|
||||||
|
.ui-icon-locked { background-position: -192px -96px; }
|
||||||
|
.ui-icon-unlocked { background-position: -208px -96px; }
|
||||||
|
.ui-icon-bookmark { background-position: -224px -96px; }
|
||||||
|
.ui-icon-tag { background-position: -240px -96px; }
|
||||||
|
.ui-icon-home { background-position: 0 -112px; }
|
||||||
|
.ui-icon-flag { background-position: -16px -112px; }
|
||||||
|
.ui-icon-calendar { background-position: -32px -112px; }
|
||||||
|
.ui-icon-cart { background-position: -48px -112px; }
|
||||||
|
.ui-icon-pencil { background-position: -64px -112px; }
|
||||||
|
.ui-icon-clock { background-position: -80px -112px; }
|
||||||
|
.ui-icon-disk { background-position: -96px -112px; }
|
||||||
|
.ui-icon-calculator { background-position: -112px -112px; }
|
||||||
|
.ui-icon-zoomin { background-position: -128px -112px; }
|
||||||
|
.ui-icon-zoomout { background-position: -144px -112px; }
|
||||||
|
.ui-icon-search { background-position: -160px -112px; }
|
||||||
|
.ui-icon-wrench { background-position: -176px -112px; }
|
||||||
|
.ui-icon-gear { background-position: -192px -112px; }
|
||||||
|
.ui-icon-heart { background-position: -208px -112px; }
|
||||||
|
.ui-icon-star { background-position: -224px -112px; }
|
||||||
|
.ui-icon-link { background-position: -240px -112px; }
|
||||||
|
.ui-icon-cancel { background-position: 0 -128px; }
|
||||||
|
.ui-icon-plus { background-position: -16px -128px; }
|
||||||
|
.ui-icon-plusthick { background-position: -32px -128px; }
|
||||||
|
.ui-icon-minus { background-position: -48px -128px; }
|
||||||
|
.ui-icon-minusthick { background-position: -64px -128px; }
|
||||||
|
.ui-icon-close { background-position: -80px -128px; }
|
||||||
|
.ui-icon-closethick { background-position: -96px -128px; }
|
||||||
|
.ui-icon-key { background-position: -112px -128px; }
|
||||||
|
.ui-icon-lightbulb { background-position: -128px -128px; }
|
||||||
|
.ui-icon-scissors { background-position: -144px -128px; }
|
||||||
|
.ui-icon-clipboard { background-position: -160px -128px; }
|
||||||
|
.ui-icon-copy { background-position: -176px -128px; }
|
||||||
|
.ui-icon-contact { background-position: -192px -128px; }
|
||||||
|
.ui-icon-image { background-position: -208px -128px; }
|
||||||
|
.ui-icon-video { background-position: -224px -128px; }
|
||||||
|
.ui-icon-script { background-position: -240px -128px; }
|
||||||
|
.ui-icon-alert { background-position: 0 -144px; }
|
||||||
|
.ui-icon-info { background-position: -16px -144px; }
|
||||||
|
.ui-icon-notice { background-position: -32px -144px; }
|
||||||
|
.ui-icon-help { background-position: -48px -144px; }
|
||||||
|
.ui-icon-check { background-position: -64px -144px; }
|
||||||
|
.ui-icon-bullet { background-position: -80px -144px; }
|
||||||
|
.ui-icon-radio-off { background-position: -96px -144px; }
|
||||||
|
.ui-icon-radio-on { background-position: -112px -144px; }
|
||||||
|
.ui-icon-pin-w { background-position: -128px -144px; }
|
||||||
|
.ui-icon-pin-s { background-position: -144px -144px; }
|
||||||
|
.ui-icon-play { background-position: 0 -160px; }
|
||||||
|
.ui-icon-pause { background-position: -16px -160px; }
|
||||||
|
.ui-icon-seek-next { background-position: -32px -160px; }
|
||||||
|
.ui-icon-seek-prev { background-position: -48px -160px; }
|
||||||
|
.ui-icon-seek-end { background-position: -64px -160px; }
|
||||||
|
.ui-icon-seek-start { background-position: -80px -160px; }
|
||||||
|
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
||||||
|
.ui-icon-seek-first { background-position: -80px -160px; }
|
||||||
|
.ui-icon-stop { background-position: -96px -160px; }
|
||||||
|
.ui-icon-eject { background-position: -112px -160px; }
|
||||||
|
.ui-icon-volume-off { background-position: -128px -160px; }
|
||||||
|
.ui-icon-volume-on { background-position: -144px -160px; }
|
||||||
|
.ui-icon-power { background-position: 0 -176px; }
|
||||||
|
.ui-icon-signal-diag { background-position: -16px -176px; }
|
||||||
|
.ui-icon-signal { background-position: -32px -176px; }
|
||||||
|
.ui-icon-battery-0 { background-position: -48px -176px; }
|
||||||
|
.ui-icon-battery-1 { background-position: -64px -176px; }
|
||||||
|
.ui-icon-battery-2 { background-position: -80px -176px; }
|
||||||
|
.ui-icon-battery-3 { background-position: -96px -176px; }
|
||||||
|
.ui-icon-circle-plus { background-position: 0 -192px; }
|
||||||
|
.ui-icon-circle-minus { background-position: -16px -192px; }
|
||||||
|
.ui-icon-circle-close { background-position: -32px -192px; }
|
||||||
|
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||||
|
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||||
|
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||||
|
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||||
|
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||||
|
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||||
|
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||||
|
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||||
|
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||||
|
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||||
|
.ui-icon-circle-check { background-position: -208px -192px; }
|
||||||
|
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||||
|
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||||
|
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||||
|
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||||
|
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||||
|
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||||
|
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||||
|
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||||
|
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||||
|
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||||
|
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||||
|
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Misc visuals
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* Corner radius */
|
||||||
|
.ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; }
|
||||||
|
.ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
|
||||||
|
.ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
|
||||||
|
.ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
|
||||||
|
.ui-corner-top { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
|
||||||
|
.ui-corner-bottom { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
|
||||||
|
.ui-corner-right { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
|
||||||
|
.ui-corner-left { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
|
||||||
|
.ui-corner-all { -moz-border-radius: 4px/*{cornerRadius}*/; -webkit-border-radius: 4px/*{cornerRadius}*/; border-radius: 4px/*{cornerRadius}*/; }
|
||||||
|
|
||||||
|
/* Overlays */
|
||||||
|
.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
|
||||||
|
.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
|
6240
www/js/jstree-1.0-rc2/jquery-1.4.2.js
vendored
Normal file
154
www/js/jstree-1.0-rc2/jquery-1.4.2.min.js
vendored
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
/*!
|
||||||
|
* jQuery JavaScript Library v1.4.2
|
||||||
|
* http://jquery.com/
|
||||||
|
*
|
||||||
|
* Copyright 2010, John Resig
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* Includes Sizzle.js
|
||||||
|
* http://sizzlejs.com/
|
||||||
|
* Copyright 2010, The Dojo Foundation
|
||||||
|
* Released under the MIT, BSD, and GPL Licenses.
|
||||||
|
*
|
||||||
|
* Date: Sat Feb 13 22:33:48 2010 -0500
|
||||||
|
*/
|
||||||
|
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
|
||||||
|
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
|
||||||
|
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
|
||||||
|
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
|
||||||
|
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
|
||||||
|
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
|
||||||
|
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
|
||||||
|
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
|
||||||
|
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
|
||||||
|
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
|
||||||
|
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
|
||||||
|
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
|
||||||
|
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
|
||||||
|
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
|
||||||
|
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
|
||||||
|
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
|
||||||
|
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
|
||||||
|
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
|
||||||
|
var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
|
||||||
|
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
|
||||||
|
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
|
||||||
|
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
|
||||||
|
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
|
||||||
|
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
|
||||||
|
a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
|
||||||
|
w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
|
||||||
|
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
|
||||||
|
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
|
||||||
|
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
|
||||||
|
this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
|
||||||
|
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
|
||||||
|
c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
|
||||||
|
a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
|
||||||
|
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
|
||||||
|
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
|
||||||
|
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
|
||||||
|
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
|
||||||
|
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
|
||||||
|
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
|
||||||
|
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
|
||||||
|
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
|
||||||
|
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
|
||||||
|
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
|
||||||
|
a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
|
||||||
|
isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
|
||||||
|
{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
|
||||||
|
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
|
||||||
|
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
|
||||||
|
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
|
||||||
|
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
|
||||||
|
!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
|
||||||
|
toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
|
||||||
|
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
|
||||||
|
function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
|
||||||
|
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
||||||
|
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
|
||||||
|
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
|
||||||
|
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
|
||||||
|
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
|
||||||
|
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
|
||||||
|
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
|
||||||
|
relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
|
||||||
|
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
|
||||||
|
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
|
||||||
|
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
|
||||||
|
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
|
||||||
|
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
|
||||||
|
setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
|
||||||
|
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
|
||||||
|
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
|
||||||
|
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
|
||||||
|
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
|
||||||
|
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
|
||||||
|
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
|
||||||
|
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
|
||||||
|
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
|
||||||
|
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
|
||||||
|
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
|
||||||
|
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
|
||||||
|
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
|
||||||
|
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
|
||||||
|
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
|
||||||
|
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
|
||||||
|
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
|
||||||
|
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
|
||||||
|
a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
|
||||||
|
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
|
||||||
|
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
|
||||||
|
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
|
||||||
|
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
|
||||||
|
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
|
||||||
|
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
|
||||||
|
this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
|
||||||
|
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
|
||||||
|
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
|
||||||
|
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
|
||||||
|
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
|
||||||
|
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
|
||||||
|
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
|
||||||
|
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
|
||||||
|
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
|
||||||
|
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
|
||||||
|
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
|
||||||
|
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
|
||||||
|
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
|
||||||
|
serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
|
||||||
|
function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
|
||||||
|
global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
|
||||||
|
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
|
||||||
|
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
|
||||||
|
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
|
||||||
|
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
|
||||||
|
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
|
||||||
|
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
|
||||||
|
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
|
||||||
|
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
|
||||||
|
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
|
||||||
|
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
|
||||||
|
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
|
||||||
|
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
|
||||||
|
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
|
||||||
|
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
|
||||||
|
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
|
||||||
|
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
|
||||||
|
c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
|
||||||
|
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
|
||||||
|
this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
|
||||||
|
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
|
||||||
|
c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
|
||||||
|
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
|
||||||
|
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
|
||||||
|
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
|
||||||
|
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
|
||||||
|
a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
|
||||||
|
c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
|
||||||
|
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
|
||||||
|
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
|
||||||
|
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
|
||||||
|
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
|
3510
www/js/jstree-1.0-rc2/jquery.jstree.js
Normal file
1
www/js/jstree-1.0-rc2/jquery.jstree.min.js
vendored
Normal file
BIN
www/js/jstree-1.0-rc2/themes/apple/bg.jpg
Normal file
After Width: | Height: | Size: 331 B |
BIN
www/js/jstree-1.0-rc2/themes/apple/d.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
www/js/jstree-1.0-rc2/themes/apple/dot_for_ie.gif
Normal file
After Width: | Height: | Size: 43 B |
60
www/js/jstree-1.0-rc2/themes/apple/style.css
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* jsTree apple theme 1.0
|
||||||
|
* Supported features: dots/no-dots, icons/no-icons, focused, loading
|
||||||
|
* Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search
|
||||||
|
*/
|
||||||
|
|
||||||
|
.jstree-apple > ul { background:url("bg.jpg") left top repeat; }
|
||||||
|
.jstree-apple li,
|
||||||
|
.jstree-apple ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }
|
||||||
|
.jstree-apple li { background-position:-90px 0; background-repeat:repeat-y; }
|
||||||
|
.jstree-apple li.jstree-last { background:transparent; }
|
||||||
|
.jstree-apple .jstree-open > ins { background-position:-72px 0; }
|
||||||
|
.jstree-apple .jstree-closed > ins { background-position:-54px 0; }
|
||||||
|
.jstree-apple .jstree-leaf > ins { background-position:-36px 0; }
|
||||||
|
|
||||||
|
.jstree-apple a { border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; text-shadow:1px 1px 1px white; }
|
||||||
|
.jstree-apple .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 3px 0 1px; text-shadow:1px 1px 1px silver; }
|
||||||
|
.jstree-apple .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 3px 0 1px; }
|
||||||
|
.jstree-apple a .jstree-icon { background-position:-56px -20px; }
|
||||||
|
.jstree-apple a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }
|
||||||
|
|
||||||
|
.jstree-apple.jstree-focused { background:white; }
|
||||||
|
|
||||||
|
.jstree-apple .jstree-no-dots li,
|
||||||
|
.jstree-apple .jstree-no-dots .jstree-leaf > ins { background:transparent; }
|
||||||
|
.jstree-apple .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }
|
||||||
|
.jstree-apple .jstree-no-dots .jstree-closed > ins { background-position:0 0; }
|
||||||
|
|
||||||
|
.jstree-apple .jstree-no-icons a .jstree-icon { display:none; }
|
||||||
|
|
||||||
|
.jstree-apple .jstree-search { font-style:italic; }
|
||||||
|
|
||||||
|
.jstree-apple .jstree-no-icons .jstree-checkbox { display:inline-block; }
|
||||||
|
.jstree-apple .jstree-no-checkboxes .jstree-checkbox { display:none !important; }
|
||||||
|
.jstree-apple .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }
|
||||||
|
.jstree-apple .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }
|
||||||
|
.jstree-apple .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }
|
||||||
|
.jstree-apple .jstree-checked > a > .checkbox:hover { background-position:-38px -37px; }
|
||||||
|
.jstree-apple .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }
|
||||||
|
.jstree-apple .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }
|
||||||
|
|
||||||
|
#vakata-dragged.jstree-apple ins { background:transparent !important; }
|
||||||
|
#vakata-dragged.jstree-apple .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }
|
||||||
|
#vakata-dragged.jstree-apple .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }
|
||||||
|
#jstree-marker.jstree-apple { background:url("d.png") -41px -57px no-repeat !important; }
|
||||||
|
|
||||||
|
.jstree-apple a.jstree-search { color:aqua; }
|
||||||
|
|
||||||
|
#vakata-contextmenu.jstree-apple-context,
|
||||||
|
#vakata-contextmenu.jstree-apple-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }
|
||||||
|
#vakata-contextmenu.jstree-apple-context li { }
|
||||||
|
#vakata-contextmenu.jstree-apple-context a { color:black; }
|
||||||
|
#vakata-contextmenu.jstree-apple-context a:hover,
|
||||||
|
#vakata-contextmenu.jstree-apple-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }
|
||||||
|
#vakata-contextmenu.jstree-apple-context li.jstree-contextmenu-disabled a,
|
||||||
|
#vakata-contextmenu.jstree-apple-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }
|
||||||
|
#vakata-contextmenu.jstree-apple-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }
|
||||||
|
#vakata-contextmenu.jstree-apple-context li ul { margin-left:-4px; }
|
||||||
|
|
||||||
|
/* TODO: IE6 support - the `>` selectors */
|