зеркало из https://github.com/mozilla/byob.git
Merge branch 'bug-538888-bookmark-folders'
This commit is contained in:
Коммит
26ca43cc6f
|
@ -8,7 +8,9 @@
|
||||||
|
|
||||||
## v1.1.0
|
## v1.1.0
|
||||||
|
|
||||||
|
* Separate repack editor tabs into application-internal modules
|
||||||
* Split LMO_Utils module up into individual bits, like plugindir
|
* Split LMO_Utils module up into individual bits, like plugindir
|
||||||
|
* Make customization fully modular - eg. tabs are encapsulated mini-MVCs
|
||||||
|
|
||||||
## v1.2.0
|
## v1.2.0
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,13 @@
|
||||||
/**
|
/**
|
||||||
* Configuration for auth profiles
|
* Configuration for auth profiles
|
||||||
*/
|
*/
|
||||||
$config['secret'] = 'c2Vzc2lvbl9pZHxzOjMyOiJkNmY5NTUw';
|
$config['secret'] = 'c2Vzc2lvbl9pZHxzOjMyOiJkNmY5NTUw';
|
||||||
$config['home_url'] = 'profiles/%1$s/';
|
$config['home_url'] = 'profiles/%1$s/';
|
||||||
$config['cookie_name'] = 'byob_auth_profiles';
|
$config['cookie_name'] = 'byob_auth_profiles';
|
||||||
$config['cookie_path'] = '/';
|
$config['cookie_path'] = '/';
|
||||||
|
$config['cookie_domain'] = '';
|
||||||
|
$config['cookie_secure'] = false;
|
||||||
|
$config['cookie_httponly'] = true;
|
||||||
|
|
||||||
$config['base_anonymous_role'] = 'guest';
|
$config['base_anonymous_role'] = 'guest';
|
||||||
$config['base_login_role'] = 'member';
|
$config['base_login_role'] = 'member';
|
||||||
|
|
|
@ -176,13 +176,10 @@ class Repack_Model extends ManagedORM
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'bookmarks':
|
case 'bookmarks':
|
||||||
$data->add_callbacks('bookmarks_toolbar', array($this, 'extractBookmarks'));
|
$data->add_callbacks('bookmarks', array($this, 'extractBookmarks'));
|
||||||
$data->add_callbacks('bookmarks_menu', array($this, 'extractBookmarks'));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'collections':
|
case 'collections':
|
||||||
// $data->add_rules('addons', 'is_array');
|
|
||||||
// $data->add_callbacks('addons', array($this, 'addonsAreKnown'));
|
|
||||||
$data->add_rules('addons_collection_url', 'length[0,255]', 'url');
|
$data->add_rules('addons_collection_url', 'length[0,255]', 'url');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -197,7 +194,6 @@ class Repack_Model extends ManagedORM
|
||||||
|
|
||||||
$is_valid = $data->validate();
|
$is_valid = $data->validate();
|
||||||
|
|
||||||
|
|
||||||
if (!$set) {
|
if (!$set) {
|
||||||
foreach ($data->field_names() as $name) {
|
foreach ($data->field_names() as $name) {
|
||||||
$data[$name] = $this->{$name};
|
$data[$name] = $this->{$name};
|
||||||
|
@ -316,66 +312,150 @@ class Repack_Model extends ManagedORM
|
||||||
/**
|
/**
|
||||||
* Extract bookmarks from form data.
|
* Extract bookmarks from form data.
|
||||||
*/
|
*/
|
||||||
public function extractBookmarks($valid, $prefix)
|
public function extractBookmarks($valid, $field)
|
||||||
{
|
{
|
||||||
|
// We switched to bookmark folders with Bug 538888, so make sure to
|
||||||
|
// convert any older sets of bookmarks over before doing anything.
|
||||||
|
$this->convertOlderBookmarks();
|
||||||
|
|
||||||
if ('post' != request::method()) {
|
if ('post' != request::method()) {
|
||||||
|
|
||||||
// If not a POST, just pass along the object property.
|
// If not a POST, just pass along the object property.
|
||||||
return $valid[$prefix] = $this->{$prefix};
|
$valid[$field] = $this->bookmarks;
|
||||||
|
return $valid[$field];
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
$data = json_decode($valid['bookmarks_json'], true);
|
||||||
|
if (!$data) {
|
||||||
|
return $valid->add_error($field, 'bookmarks_json_invalid');
|
||||||
|
}
|
||||||
|
|
||||||
$new_bookmarks = array();
|
$new_bookmarks = array();
|
||||||
|
$errors = array();
|
||||||
|
|
||||||
if (!empty($valid[$prefix . '_type'])) {
|
foreach (array('toolbar', 'menu') as $kind) {
|
||||||
$types = $valid[$prefix . '_type'];
|
$new_bookmarks[$kind] = array();
|
||||||
|
|
||||||
// Copy the bookmark data arrays from validator so
|
$items_in = $data[$kind];
|
||||||
// array_shift() works in the next loop
|
if (empty($items_in)) {
|
||||||
$bm_data = array();
|
continue;
|
||||||
foreach (self::$type_fields as $type=>$fields) {
|
|
||||||
foreach ($fields as $name=>$label) {
|
|
||||||
$n = "{$prefix}_{$name}";
|
|
||||||
if (!empty($valid[$n]))
|
|
||||||
$bm_data[$n] = $valid[$n];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
list($items_out, $errors_out) =
|
||||||
// Now, iterate through all the types listed in the form, which
|
$this->acceptBookmarks($items_in);
|
||||||
// also happens to correspond to the whole set of bookmarks in
|
$new_bookmarks[$kind] = $items_out;
|
||||||
// form
|
if (!empty($errors_out)) {
|
||||||
foreach ($types as $idx => $type) {
|
$errors += $errors_out;
|
||||||
|
|
||||||
// Extract properties for the current bookmark from the form
|
|
||||||
// according to type.
|
|
||||||
$bm = array('type'=>$type);
|
|
||||||
$fields = self::$type_fields[$type];
|
|
||||||
foreach ($fields as $name => $label) {
|
|
||||||
$bm[$name] = array_shift($bm_data["{$prefix}_{$name}"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the bookmark and flag any errors.
|
|
||||||
$is_valid = $this->validateBookmark($bm);
|
|
||||||
if (!$is_valid) {
|
|
||||||
foreach ($bm->errors() as $key => $val) {
|
|
||||||
$valid->add_error("{$prefix}_{$key}[{$idx}]", $val);
|
|
||||||
}
|
|
||||||
$valid->add_error("{$prefix}", 'invalid');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the extracted properties to the list of bookmarks.
|
|
||||||
$new_bookmarks[] = $bm->as_array();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count($new_bookmarks) > self::$bookmark_limits[$prefix]) {
|
$this->bookmarks = $new_bookmarks;
|
||||||
$valid->add_error("{$prefix}", 'limit');
|
$valid['bookmarks'] = $new_bookmarks;
|
||||||
}
|
|
||||||
|
|
||||||
return $valid[$prefix] = $new_bookmarks;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accept and validate a set of bookmark items, recursing into subfolders.
|
||||||
|
*/
|
||||||
|
public function acceptBookmarks($items_in) {
|
||||||
|
$expected_fields = array(
|
||||||
|
'id', 'type',
|
||||||
|
'title', 'link', 'description',
|
||||||
|
'feedLink', 'siteLink'
|
||||||
|
);
|
||||||
|
|
||||||
|
$errors = array();
|
||||||
|
$items_out = array();
|
||||||
|
|
||||||
|
foreach ($items_in as $item_in) {
|
||||||
|
$item_out = array();
|
||||||
|
|
||||||
|
foreach ($expected_fields as $field) {
|
||||||
|
if (empty($item_in[$field])) continue;
|
||||||
|
$item_out[$field] = $item_in[$field];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($item_in['type']) && 'folder' == $item_in['type'] &&
|
||||||
|
!empty($item_in['items'])) {
|
||||||
|
list($sub_items_out, $sub_errors) =
|
||||||
|
$this->acceptBookmarks($item_in['items']);
|
||||||
|
$item_out['items'] = $sub_items_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
$items_out[] = $item_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
return array($items_out, $errors);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* There was once a simpler representation of bookmarks, replaced in Bug 538888
|
||||||
|
* with a structure that accounted for folders. This function converts the
|
||||||
|
* old to new, if necessary.
|
||||||
|
*/
|
||||||
|
public function convertOlderBookmarks()
|
||||||
|
{
|
||||||
|
// Map from old item types to new
|
||||||
|
$type_map = array(
|
||||||
|
'normal' => 'bookmark',
|
||||||
|
'live' => 'livemark'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Map from old item fields to new by type
|
||||||
|
$field_map = array(
|
||||||
|
'bookmark' => array(
|
||||||
|
'title' => 'title',
|
||||||
|
'location' => 'link',
|
||||||
|
'description' => 'description',
|
||||||
|
),
|
||||||
|
'livemark' => array(
|
||||||
|
'title' => 'title',
|
||||||
|
'feed' => 'feedLink',
|
||||||
|
'location' => 'siteLink'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Iterate through both known sets of bookmarks.
|
||||||
|
$new_bookmarks = array();
|
||||||
|
foreach (array('toolbar', 'menu') as $kind) {
|
||||||
|
|
||||||
|
// Check to see if there are bookmarks of this kind.
|
||||||
|
$old_bookmarks = $this->{"bookmarks_$kind"};
|
||||||
|
if (empty($old_bookmarks)) continue;
|
||||||
|
|
||||||
|
// Start accumulating new-format items for this set.
|
||||||
|
$new_bookmarks[$kind] = array();
|
||||||
|
foreach ($old_bookmarks as $item) {
|
||||||
|
|
||||||
|
// Convert to the new item type naming.
|
||||||
|
$type = isset($type_map[$item['type']]) ?
|
||||||
|
$type_map[$item['type']] : 'bookmark';
|
||||||
|
|
||||||
|
// Start with an empty new bookmark
|
||||||
|
$new_bookmark = array( 'type' => $type );
|
||||||
|
|
||||||
|
// Run through the field map appropriate for this type of item,
|
||||||
|
// copy the renamed fields over to the new bookmark.
|
||||||
|
foreach ($field_map[$type] as $old_name => $new_name) {
|
||||||
|
if (!empty($item[$old_name]))
|
||||||
|
$new_bookmark[$new_name] = $item[$old_name];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the new bookmark item.
|
||||||
|
$new_bookmarks[$kind][] = $new_bookmark;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Discard the old set of bookmarks.
|
||||||
|
unset($this->attrs["bookmarks_$kind"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we've accumulated any new bookmarks, save the data.
|
||||||
|
if (!empty($new_bookmarks)) {
|
||||||
|
$this->bookmarks = $new_bookmarks;
|
||||||
|
$this->save();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -133,10 +133,12 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<?=html::script(array(
|
<?=html::script(array(
|
||||||
'js/jquery-1.3.2.min.js',
|
'js/json2.js',
|
||||||
'js/jquery-ui-1.7.custom.min.js',
|
'js/jquery-1.4.2.min.js',
|
||||||
|
'js/jquery-ui-1.8rc3.custom.min.js',
|
||||||
'js/jquery.cookies.2.0.1.min.js',
|
'js/jquery.cookies.2.0.1.min.js',
|
||||||
'js/jquery.simplemodal-1.3.min.js',
|
'js/jquery.simplemodal-1.3.min.js',
|
||||||
|
'js/jquery.cloneTemplate.js',
|
||||||
'js/jquery.input-hint.js',
|
'js/jquery.input-hint.js',
|
||||||
'js/byob/main.js',
|
'js/byob/main.js',
|
||||||
//'js/byob/'.Router::$controller.'.js'
|
//'js/byob/'.Router::$controller.'.js'
|
||||||
|
|
|
@ -124,3 +124,4 @@
|
||||||
|
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
<?= form::close() ?>
|
<?= form::close() ?>
|
||||||
|
<?=slot::get('after_form')?>
|
||||||
|
|
|
@ -1,21 +1,93 @@
|
||||||
|
<?php
|
||||||
|
$bookmarks_json = json_encode(form::value('bookmarks'));
|
||||||
|
?>
|
||||||
|
<?php slot::start('body_end') ?>
|
||||||
|
<?=html::script(array(
|
||||||
|
'js/byob/repacks/edit/bookmarks.js'
|
||||||
|
))?>
|
||||||
|
<script type="text/javascript">
|
||||||
|
BYOB_Repacks_Edit_Bookmarks.loadData(<?=$bookmarks_json?>);
|
||||||
|
</script>
|
||||||
|
<?php slot::end() ?>
|
||||||
<div class="intro">
|
<div class="intro">
|
||||||
<p>You can add up to 5 custom bookmarks to your browser's bookmark menu.</p>
|
<p>You can add up to 5 custom bookmarks to your browser's bookmark menu.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="pane">
|
<div class="pane">
|
||||||
<div>
|
|
||||||
<?php
|
|
||||||
View::factory('repacks/elements/edit_bookmarks', array(
|
|
||||||
'prefix' => 'bookmarks_menu'
|
|
||||||
))->render(true);
|
|
||||||
?>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
<div class="bookmarks-editor" id="editor1">
|
||||||
<p>You can add up to 3 custom bookmarks to your browser's link toolbar.</p>
|
<ul class="folders">
|
||||||
<?php
|
<li id="editor1-toolbar" class="folder root folder-toolbar">
|
||||||
View::factory('repacks/elements/edit_bookmarks', array(
|
<span class="title">Bookmark Toolbar</span>
|
||||||
'prefix' => 'bookmarks_toolbar'
|
<ul id="sub-toolbar" class="subfolders">
|
||||||
))->render(true);
|
</ul>
|
||||||
?>
|
</li>
|
||||||
</div>
|
<li id="editor1-menu" class="folder root folder-menu">
|
||||||
|
<span class="title">Bookmark Menu</span>
|
||||||
|
<ul id="sub-menu" class="subfolders">
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="folder template">
|
||||||
|
<span class="title">subfolder</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="bookmarks clearfix">
|
||||||
|
<li class="bookmark template">
|
||||||
|
<span class="title"></span>
|
||||||
|
<!--<span class="link"></span>-->
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="controls clearfix">
|
||||||
|
<li class="new-folder"><a href="#">+ New Folder</a></li>
|
||||||
|
<li class="new-bookmark"><a href="#">+ New Bookmark</a></li>
|
||||||
|
<li class="delete-selected"><a href="#">x Delete Selected</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<textarea id="bookmarks_json" name="bookmarks_json"></textarea>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<?php slot::start('after_form') ?>
|
||||||
|
<div id="bookmark_editor">
|
||||||
|
<form class="bookmark">
|
||||||
|
<input type="hidden" name="id" value="" />
|
||||||
|
<input type="hidden" name="type" value="bookmark" />
|
||||||
|
<ul class="editor_fields">
|
||||||
|
<li class="field_type">
|
||||||
|
<label for="type">Type</label>
|
||||||
|
<button class="type_bookmark" name="type_bookmark">Bookmark</button>
|
||||||
|
<button class="type_livemark" name="type_livemark">Livemark</button>
|
||||||
|
</li>
|
||||||
|
<li class="field_title required">
|
||||||
|
<label for="title">Title</label>
|
||||||
|
<input class="text" type="text" name="title" />
|
||||||
|
</li>
|
||||||
|
<li class="field_link required">
|
||||||
|
<label for="link">URL</label>
|
||||||
|
<input class="text" type="text" name="link" />
|
||||||
|
</li>
|
||||||
|
<li class="field_description">
|
||||||
|
<label for="description">Description</label>
|
||||||
|
<input class="text" type="text" name="description" />
|
||||||
|
</li>
|
||||||
|
<li class="field_feedlink required">
|
||||||
|
<label for="feedLink">Feed URL</label>
|
||||||
|
<input class="text" type="text" name="feedLink" />
|
||||||
|
</li>
|
||||||
|
<li class="field_sitelink">
|
||||||
|
<label for="siteLink">Site URL</label>
|
||||||
|
<input class="text" type="text" name="siteLink" />
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<ul class="errors">
|
||||||
|
<li class="error template">...</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button class="cancel">Cancel</button>
|
||||||
|
<button class="save">Save</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<?php slot::end() ?>
|
||||||
|
|
|
@ -1,13 +1,8 @@
|
||||||
<?php if ('live' == $bookmark['type']): ?>
|
<?php foreach (array('type', 'title', 'link', 'description', 'siteLink', 'feedLink') as $field_name): ?>
|
||||||
item.<?= $idx ?>.type=livemark
|
<?php if (!empty($bookmark[$field_name])):?>
|
||||||
item.<?= $idx ?>.title=<?= $bookmark['title'] . "\n" ?>
|
item.<?=$idx?>.<?=$field_name?>=<?=$bookmark[$field_name]."\n"?>
|
||||||
item.<?= $idx ?>.siteLink=<?= $bookmark['location'] . "\n" ?>
|
|
||||||
item.<?= $idx ?>.feedLink=<?= $bookmark['feed'] . "\n" ?>
|
|
||||||
<?php else: ?>
|
|
||||||
item.<?= $idx ?>.type=bookmark
|
|
||||||
item.<?= $idx ?>.title=<?= $bookmark['title'] . "\n" ?>
|
|
||||||
item.<?= $idx ?>.link=<?= $bookmark['location'] . "\n" ?>
|
|
||||||
<?php if (!empty($bookmark['description'])): ?>
|
|
||||||
item.<?= $idx ?>.description=<?= $bookmark['description'] . "\n" ?>
|
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
<?php endforeach ?>
|
||||||
|
<?php if ('folder' == $bookmark['type'] && !empty($bookmark['items'])): ?>
|
||||||
|
item.<?=$idx?>.folderId=<?=$bookmark['id']."\n"?>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
|
|
@ -26,27 +26,15 @@ startup.homepage_welcome_url="<?= $firstrun_url ?>"
|
||||||
extensions.personas.initial="<?= addslashes($r->persona->json) ?>"
|
extensions.personas.initial="<?= addslashes($r->persona->json) ?>"
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
|
||||||
<?php if (!empty($r->bookmarks_menu)): ?>
|
<?php foreach (array('menu', 'toolbar') as $kind): ?>
|
||||||
[BookmarksMenu]
|
<?php if (!empty($r->bookmarks[$kind])): ?>
|
||||||
<?php
|
<?php
|
||||||
foreach ($r->bookmarks_menu as $idx=>$bookmark) {
|
View::factory('repacks/ini/bookmarks', array(
|
||||||
View::factory('repacks/ini/bookmark', array(
|
'set_id' => ucfirst($kind),
|
||||||
'idx' => $idx, 'bookmark' => $bookmark
|
'bookmarks' => $r->bookmarks[$kind]
|
||||||
))->render(TRUE);
|
))->render(TRUE);
|
||||||
}
|
|
||||||
?>
|
|
||||||
<?php endif ?>
|
|
||||||
|
|
||||||
<?php $r->bookmarks_toolbar = $r->bookmarks_toolbar; ?>
|
|
||||||
<?php if (!empty($r->bookmarks_toolbar)): ?>
|
|
||||||
[BookmarksToolbar]
|
|
||||||
<?php
|
|
||||||
foreach ($r->bookmarks_toolbar as $idx=>$bookmark) {
|
|
||||||
View::factory('repacks/ini/bookmark', array(
|
|
||||||
'idx' => $idx, 'bookmark' => $bookmark
|
|
||||||
))->render(TRUE);
|
|
||||||
}
|
|
||||||
?>
|
?>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
<?php endforeach ?>
|
||||||
|
|
||||||
# <? # do not edit this line, or add newlines after it ?>
|
# <? # do not edit this line, or add newlines after it ?>
|
||||||
|
|
|
@ -136,7 +136,7 @@
|
||||||
}
|
}
|
||||||
.ctrl_repacks_act_edit #wizard .pane fieldset.addon-dependent {
|
.ctrl_repacks_act_edit #wizard .pane fieldset.addon-dependent {
|
||||||
padding: 0 0 0 0;
|
padding: 0 0 0 0;
|
||||||
margin: -1.5em 0.5em 1.5em 2.5em;
|
margin: -0.5em 0.5em 1.5em 2.5em;
|
||||||
}
|
}
|
||||||
.ctrl_repacks_act_edit #wizard .pane fieldset legend {
|
.ctrl_repacks_act_edit #wizard .pane fieldset legend {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
@ -255,6 +255,7 @@
|
||||||
margin: 0.5em 0 1em 1em;
|
margin: 0.5em 0 1em 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
.ctrl_repacks_act_edit #content ul.bookmarks {
|
.ctrl_repacks_act_edit #content ul.bookmarks {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
@ -341,7 +342,7 @@
|
||||||
.ctrl_repacks_act_edit #content .bookmark-add-live a.add {
|
.ctrl_repacks_act_edit #content .bookmark-add-live a.add {
|
||||||
background-image: url(../img/livemark-item.png);
|
background-image: url(../img/livemark-item.png);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
.ctrl_repacks_act_edit .popup #content .sections li.locales {
|
.ctrl_repacks_act_edit .popup #content .sections li.locales {
|
||||||
float: left;
|
float: left;
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
|
@ -471,3 +472,195 @@
|
||||||
margin-left: 3.5em;
|
margin-left: 3.5em;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.section-bookmarks .bookmarks-editor {
|
||||||
|
border: 1px solid #666;
|
||||||
|
background: #fff;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
#content .section-bookmarks .bookmarks-editor ul.folders {
|
||||||
|
float: left;
|
||||||
|
width: 28ex;
|
||||||
|
padding: 0.5em 0.5em 0.5em 1em;
|
||||||
|
text-indent: 0;
|
||||||
|
margin: 0;
|
||||||
|
list-style-type: none;
|
||||||
|
background-color: #dfe4ec;
|
||||||
|
border-right: 1px solid #333;
|
||||||
|
min-height: 225px;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders .ui-sortable-placeholder.bookmark {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders .ui-sortable-placeholder.type-folder {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.folder {
|
||||||
|
background: transparent url(../img/bookmark-icons/folder.png) no-repeat 4px 1px;
|
||||||
|
line-height: 18px;
|
||||||
|
margin: 0.125em 0 0.125em 0;
|
||||||
|
padding: 0 0 0 24px;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.folder-empty {
|
||||||
|
background: transparent;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.folder-toolbar {
|
||||||
|
background-image: url(../img/bookmark-icons/bookmarksToolbar.png);
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.folder-menu {
|
||||||
|
background-image: url(../img/bookmark-icons/bookmarksMenu.png);
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.root {
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.folder .title {
|
||||||
|
display: block;
|
||||||
|
padding: 2px 2px;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.selected .title {
|
||||||
|
background-color: #7b86a8;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.selected li.folder .title {
|
||||||
|
background-color: transparent;
|
||||||
|
color: #000;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.even {
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.hover .title {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.hover li.folder .title {
|
||||||
|
border: none;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
#content .section-bookmarks .bookmarks-editor ul.folders .root .subfolders {
|
||||||
|
list-style-type: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 0 0.5em 0;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.folders li.hover .subfolders .title {
|
||||||
|
}
|
||||||
|
#content .section-bookmarks .bookmarks-editor ul.bookmarks {
|
||||||
|
margin-left: 31ex;
|
||||||
|
list-style-type: none;
|
||||||
|
padding: 0.75em 0 0 0em;
|
||||||
|
}
|
||||||
|
#content .section-bookmarks .bookmarks-editor ul.bookmarks li.bookmark {
|
||||||
|
margin: 0;
|
||||||
|
padding: 4px 0 4px 36px;
|
||||||
|
background: transparent url(../img/bookmark-icons/item.png) no-repeat 14px 2px;
|
||||||
|
}
|
||||||
|
#content .section-bookmarks .bookmarks-editor ul.bookmarks li.type-bookmark {
|
||||||
|
background-image: url(../img/bookmark-icons/item.png);
|
||||||
|
}
|
||||||
|
#content .section-bookmarks .bookmarks-editor ul.bookmarks li.type-livemark {
|
||||||
|
background-image: url(../img/bookmark-icons/livemarkItem.png);
|
||||||
|
}
|
||||||
|
#content .section-bookmarks .bookmarks-editor ul.bookmarks li.type-folder {
|
||||||
|
background-image: url(../img/bookmark-icons/folder.png);
|
||||||
|
}
|
||||||
|
#content .section-bookmarks .bookmarks-editor ul.bookmarks li.selected {
|
||||||
|
background-color: #785cb2;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor table.bookmarks {
|
||||||
|
width: 100%;
|
||||||
|
border: 1px solid #333;
|
||||||
|
}
|
||||||
|
#content .section-bookmarks .bookmarks-editor ul.controls {
|
||||||
|
border-top: 1px solid #333;
|
||||||
|
margin: 0 0 0 0;
|
||||||
|
padding: 0 0 0 0;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.controls li {
|
||||||
|
list-style-type: none;
|
||||||
|
float: left;
|
||||||
|
margin: 0 0 0 0;
|
||||||
|
padding: 0 0 0 0;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.controls li.new-folder {
|
||||||
|
width: 31ex;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.controls li a {
|
||||||
|
display: block;
|
||||||
|
padding: 0.5em 1em 0.5em 1em;
|
||||||
|
}
|
||||||
|
.section-bookmarks .bookmarks-editor ul.controls li a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: #666;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.section-bookmarks #bookmarks_json {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor {
|
||||||
|
border: 1px solid #333;
|
||||||
|
width: 425px;
|
||||||
|
font-size: 0.85em;
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
background: #525252;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor ul.editor_fields {
|
||||||
|
list-style-type: none;
|
||||||
|
margin: 0.75em;
|
||||||
|
padding: 0;
|
||||||
|
text-indent: 0;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor ul.editor_fields li {
|
||||||
|
padding: 0.25em 0 0.25em 0;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor ul.editor_fields li label {
|
||||||
|
float: left;
|
||||||
|
width: 12ex;
|
||||||
|
padding: 0 0 0 0;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor ul.editor_fields li.required label {
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor ul.editor_fields li.error label {
|
||||||
|
color: #f33;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor ul.editor_fields li.required label:after {
|
||||||
|
content: " *";
|
||||||
|
color: #f33;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor ul.editor_fields li input.text {
|
||||||
|
width: 50ex;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor .bookmark {
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor button.type_bookmark,
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor button.type_livemark {
|
||||||
|
background: #ddd;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #525252;
|
||||||
|
padding: 0.25em;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor .bookmark button.type_bookmark,
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor .livemark button.type_livemark {
|
||||||
|
background: #fff;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor .bookmark .field_feedlink,
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor .bookmark .field_sitelink {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor .livemark {
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor .bookmark {
|
||||||
|
}
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor .livemark .field_description,
|
||||||
|
.ctrl_repacks_act_edit #bookmark_editor .livemark .field_link {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 673 B |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 353 B |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 405 B |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 320 B |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 403 B |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 634 B |
|
@ -1,8 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* BYOB main JS enhancements
|
* BYOB main JS enhancements
|
||||||
*/
|
*/
|
||||||
if ('undefined' == typeof(window.BYOB_Main)) window.BYOB_Main = {};
|
|
||||||
|
|
||||||
BYOB_Main = function() {
|
BYOB_Main = function() {
|
||||||
var $this = {
|
var $this = {
|
||||||
|
|
||||||
|
@ -33,7 +31,6 @@ BYOB_Main = function() {
|
||||||
// Wire up the UI for the repack editing page.
|
// Wire up the UI for the repack editing page.
|
||||||
$('.save_buttons').hide();
|
$('.save_buttons').hide();
|
||||||
$this.wireUpSaveAndConfirm();
|
$this.wireUpSaveAndConfirm();
|
||||||
$this.wireUpRepackBookmarks();
|
|
||||||
$this.wireUpRepackLocales();
|
$this.wireUpRepackLocales();
|
||||||
$this.wireUpWizardTabs();
|
$this.wireUpWizardTabs();
|
||||||
$this.wireUpAddonDependent();
|
$this.wireUpAddonDependent();
|
||||||
|
@ -182,58 +179,6 @@ BYOB_Main = function() {
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* Wire up bookmark management UI.
|
|
||||||
*/
|
|
||||||
wireUpRepackBookmarks: function() {
|
|
||||||
|
|
||||||
// TODO: Put this somewhere more central.
|
|
||||||
var item_limits = {
|
|
||||||
'bookmarks_menu_item': 5,
|
|
||||||
'bookmarks_toolbar_item': 3
|
|
||||||
};
|
|
||||||
|
|
||||||
// Set up drag and drop sorting for bookmarks
|
|
||||||
$('.bookmarks').sortable();
|
|
||||||
|
|
||||||
// Wire up add links to insert cloned new bookmarks
|
|
||||||
$('.bookmark-add .add').click(function() {
|
|
||||||
|
|
||||||
// Clone a new bookmark from template.
|
|
||||||
var new_bm = $(this).next().find('li:first')
|
|
||||||
.clone().removeClass('template');
|
|
||||||
|
|
||||||
// Find the destination list relative to this link.
|
|
||||||
var dest_list = $(this).parent().parent().prev();
|
|
||||||
|
|
||||||
// Check and enforce bookmark limits.
|
|
||||||
var allow_add = true;
|
|
||||||
$.each(item_limits, function(name, limit) {
|
|
||||||
if (new_bm.hasClass(name)) {
|
|
||||||
var existing_items = dest_list.find('.'+name);
|
|
||||||
if (existing_items.length >= limit) {
|
|
||||||
allow_add = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Only add the cloned item if allowed...
|
|
||||||
if (allow_add) new_bm.appendTo(dest_list);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Event delegation for delete links on bookmarks
|
|
||||||
$('.bookmarks').click(function(ev) {
|
|
||||||
var t = $(ev.target);
|
|
||||||
if (t.hasClass('delete')) {
|
|
||||||
t.parent().remove();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wire up the submission tabs for the wizard
|
* Wire up the submission tabs for the wizard
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,699 @@
|
||||||
|
/**
|
||||||
|
* BYOB bookmarks editor
|
||||||
|
*/
|
||||||
|
BYOB_Repacks_Edit_Bookmarks = (function () {
|
||||||
|
var $this = {
|
||||||
|
|
||||||
|
// Is the editor ready yet?
|
||||||
|
is_ready: false,
|
||||||
|
|
||||||
|
selected_items: null,
|
||||||
|
selected_item: null,
|
||||||
|
selected_folder: null,
|
||||||
|
|
||||||
|
// Data model for the bookmark editor.
|
||||||
|
bookmarks: {
|
||||||
|
menu: [ ],
|
||||||
|
toolbar: [ ]
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Package initialization
|
||||||
|
*/
|
||||||
|
init: function() {
|
||||||
|
$(document).ready($this.ready);
|
||||||
|
return $this;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Page ready
|
||||||
|
*/
|
||||||
|
ready: function() {
|
||||||
|
$this.is_ready = true;
|
||||||
|
|
||||||
|
$this.editor = $('.bookmarks-editor');
|
||||||
|
$this.editor_id = $this.editor.attr('id');
|
||||||
|
|
||||||
|
$this.injectIds();
|
||||||
|
|
||||||
|
$this.wireUpFolders();
|
||||||
|
$this.wireUpBookmarks();
|
||||||
|
$this.wireUpBookmarkEditor();
|
||||||
|
|
||||||
|
$this.updateFolders();
|
||||||
|
$this.selectFolder($this.editor_id + '-toolbar');
|
||||||
|
$this.updateBookmarksJSON();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accept bookmark data, presumably as part of page load.
|
||||||
|
*/
|
||||||
|
loadData: function (data) {
|
||||||
|
$.each($this.bookmarks, function (name, items) {
|
||||||
|
$this.bookmarks[name] = (data[name]) ?
|
||||||
|
data[name] : [];
|
||||||
|
});
|
||||||
|
if ($this.is_ready) { $this.refresh(); }
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the bookmarks data form field for later submission.
|
||||||
|
*/
|
||||||
|
updateBookmarksJSON: function() {
|
||||||
|
var data = JSON.stringify($this.bookmarks, null, ' ');
|
||||||
|
$('#bookmarks_json').val(data);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the folder pane DOM with the current folder structure.
|
||||||
|
*/
|
||||||
|
updateFolders: function () {
|
||||||
|
|
||||||
|
$.each($this.bookmarks, function (root_name, bookmarks) {
|
||||||
|
|
||||||
|
var root_el = $this.editor.find('.folders > .folder-' + root_name),
|
||||||
|
tmpl_el = $this.editor.find('.folders > .folder.template'),
|
||||||
|
par_el = root_el.find('.subfolders');
|
||||||
|
|
||||||
|
par_el.find('li:not(.template)').remove();
|
||||||
|
|
||||||
|
$.each(bookmarks, function (j, item) {
|
||||||
|
if ('folder' !== item.type) { return; }
|
||||||
|
tmpl_el.cloneTemplate({
|
||||||
|
'@id': 'fl-' + item.id,
|
||||||
|
'.title': item.title
|
||||||
|
}).appendTo(par_el);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
$this.editor.find('.folders').sortable('refresh');
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the bookmark pane DOM with a list of bookmarks.
|
||||||
|
*/
|
||||||
|
updateBookmarks: function (items) {
|
||||||
|
//var bm_root_el = $this.editor.find('.bookmarks tbody'),
|
||||||
|
var bm_root_el = $this.editor.find('.bookmarks'),
|
||||||
|
tmpl_el = $this.editor.find('.bookmark.template');
|
||||||
|
|
||||||
|
if (null == items) {
|
||||||
|
items = $this.selected_items;
|
||||||
|
} else {
|
||||||
|
$this.selected_items = items;
|
||||||
|
}
|
||||||
|
|
||||||
|
bm_root_el.find('li:not(.template)').remove();
|
||||||
|
|
||||||
|
$.each(items, function (i, item) {
|
||||||
|
tmpl_el.cloneTemplate({
|
||||||
|
'@id': item.id,
|
||||||
|
'@class': 'bookmark type-' + item.type,
|
||||||
|
'.title': item.title,
|
||||||
|
'.link': item.link || item.feedLink
|
||||||
|
}).appendTo(bm_root_el);
|
||||||
|
});
|
||||||
|
|
||||||
|
bm_root_el.sortable('refresh');
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refresh the current view from data model.
|
||||||
|
*/
|
||||||
|
refresh: function () {
|
||||||
|
$this.updateFolders();
|
||||||
|
$this.selectFolder();
|
||||||
|
$this.updateBookmarksJSON();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wire up the UI handlers for the folders pane.
|
||||||
|
*/
|
||||||
|
wireUpFolders: function () {
|
||||||
|
|
||||||
|
var folders = $this.editor.find('.folders');
|
||||||
|
|
||||||
|
// Wire up the folders as clickable to populate bookmarks pane.
|
||||||
|
folders.click(function (ev) {
|
||||||
|
var target = $(ev.target);
|
||||||
|
if (target.hasClass('title')) { target = target.parent(); }
|
||||||
|
if (!target.hasClass('folder')) { return; }
|
||||||
|
$this.selectFolder(target.attr('id'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Wire up the root subfolder containers as sortables.
|
||||||
|
$.each($this.bookmarks, function (root_name) {
|
||||||
|
var folder = folders
|
||||||
|
.find('.folder-'+root_name+' > .subfolders');
|
||||||
|
folder.sortable({
|
||||||
|
appendTo: 'body',
|
||||||
|
cursor: 'move',
|
||||||
|
axis: 'y',
|
||||||
|
items: 'li:not(.template)',
|
||||||
|
stop: $this.performFolderMove
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Connect all the root folder sortables to each other.
|
||||||
|
$.each($this.bookmarks, function (from_name) {
|
||||||
|
var from_id = '#'+$this.editor_id+' .folder-'+from_name+' > .subfolders',
|
||||||
|
to_ids = [];
|
||||||
|
$.each($this.bookmarks, function (to_name) {
|
||||||
|
if (from_name === to_name) { return; }
|
||||||
|
to_ids.push('#'+$this.editor_id+' .folder-'+to_name+' > .subfolders');
|
||||||
|
});
|
||||||
|
$(from_id).sortable('option', 'connectWith', to_ids);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Wire up root folders themselves as drop targets.
|
||||||
|
folders.find('.root .title').droppable({
|
||||||
|
'tolerance': 'pointer',
|
||||||
|
'over': function (ev, ui) {
|
||||||
|
// Only pay attention to elements from bookmark pane.
|
||||||
|
if (ui.draggable.hasClass('folder')) { return; }
|
||||||
|
$(this).parent().addClass('hover');
|
||||||
|
},
|
||||||
|
'out': function (ev, ui) {
|
||||||
|
// Only pay attention to elements from bookmark pane.
|
||||||
|
if (ui.draggable.hasClass('folder')) { return; }
|
||||||
|
$(this).parent().removeClass('hover');
|
||||||
|
},
|
||||||
|
'drop': function (ev, ui) {
|
||||||
|
// Only pay attention to elements from bookmark pane.
|
||||||
|
if (ui.draggable.hasClass('folder')) { return; }
|
||||||
|
|
||||||
|
var bm_item = $this.findById(ui.draggable.attr('id')),
|
||||||
|
parts = $(this).parent().attr('id').split('-'),
|
||||||
|
dest = $this.bookmarks[parts[1]];
|
||||||
|
|
||||||
|
// Ignore an attempt to drop the item where it already is.
|
||||||
|
if (-1 != dest.indexOf(bm_item.bookmark)) { return; }
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
// HACK: Schedule the data model change and view refresh
|
||||||
|
// until after jQuery UI has had a chance to finish up.
|
||||||
|
bm_item.parent.splice(bm_item.index, 1);
|
||||||
|
dest.push(bm_item.bookmark);
|
||||||
|
$this.refresh();
|
||||||
|
}, 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler to perform a folder move at the data model level.
|
||||||
|
*/
|
||||||
|
performFolderMove: function (ev, ui) {
|
||||||
|
// Find the moved item, remove it from its context.
|
||||||
|
var bm_item = $this.findById(ui.item.attr('id').replace('fl-',''));
|
||||||
|
bm_item.parent.splice(bm_item.index, 1);
|
||||||
|
|
||||||
|
// Update the data model to reflect the change in DOM structure
|
||||||
|
var id, bm_dest = null;
|
||||||
|
if ( id = ui.item.prev('li.folder').attr('id') ) {
|
||||||
|
// Use the previous DOM node as context for data model move.
|
||||||
|
bm_dest = $this.findById(id.replace('fl-',''));
|
||||||
|
bm_dest.parent.splice(bm_dest.index + 1, 0, bm_item.bookmark);
|
||||||
|
} else if ( id = ui.item.next('li.folder').attr('id') ) {
|
||||||
|
// Use the next DOM node as context for data model move.
|
||||||
|
bm_dest = $this.findById(id.replace('fl-',''));
|
||||||
|
bm_dest.parent.splice(bm_dest.index, 0, bm_item.bookmark);
|
||||||
|
} else {
|
||||||
|
// Node was dropped into previously empty list, so just push.
|
||||||
|
var parts = ui.item.parent().parent().attr('id')
|
||||||
|
.replace('fl-','').split('-');
|
||||||
|
$this.bookmarks[parts[1]].unshift(bm_item.bookmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Refresh selected folder and the serialized data.
|
||||||
|
$this.selectFolder();
|
||||||
|
$this.updateBookmarksJSON();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wire up the UI handlers for the bookmarks pane.
|
||||||
|
*/
|
||||||
|
wireUpBookmarks: function () {
|
||||||
|
|
||||||
|
$this.editor.find('.bookmarks')
|
||||||
|
.click($this.selectBookmark)
|
||||||
|
.dblclick($this.editBookmark)
|
||||||
|
.sortable({
|
||||||
|
appendTo: 'body',
|
||||||
|
cursor: 'move',
|
||||||
|
items: 'li:not(.template)',
|
||||||
|
sort: $this.updateItemFeedback,
|
||||||
|
stop: $this.performItemMove
|
||||||
|
}).end();
|
||||||
|
|
||||||
|
// Connect the bookmark pane to all the folder sortables
|
||||||
|
var from_id = '#'+$this.editor_id+' .bookmarks',
|
||||||
|
to_ids = [];
|
||||||
|
$.each($this.bookmarks, function (to_name) {
|
||||||
|
to_ids.push('#'+$this.editor_id+
|
||||||
|
' .folder-'+to_name+' > .subfolders');
|
||||||
|
});
|
||||||
|
$(from_id).sortable('option', 'connectWith', to_ids);
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select a bookmark on single click.
|
||||||
|
*/
|
||||||
|
selectBookmark: function (ev) {
|
||||||
|
var target = $(ev.target);
|
||||||
|
if (!target.hasClass('bookmark')) { target = target.parent(); }
|
||||||
|
if (!target.hasClass('bookmark')) { return; }
|
||||||
|
|
||||||
|
var bm_item = $this.findById(target.attr('id'));
|
||||||
|
$this.selected_item = bm_item;
|
||||||
|
|
||||||
|
target.parent().find('.bookmark').removeClass('selected');
|
||||||
|
target.addClass('selected');
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open the bookmark editor for an item on double click.
|
||||||
|
*/
|
||||||
|
editBookmark: function (ev) {
|
||||||
|
var target = $(ev.target);
|
||||||
|
if (!target.hasClass('bookmark')) { target = target.parent(); }
|
||||||
|
if (!target.hasClass('bookmark')) { return; }
|
||||||
|
|
||||||
|
var bm_item = $this.findById(target.attr('id'));
|
||||||
|
if ('folder' === bm_item.bookmark.type) {
|
||||||
|
$this.summonFolderRename(bm_item.bookmark.id);
|
||||||
|
} else {
|
||||||
|
$this.summonBookmarkEditor(bm_item.bookmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update feedback in sortable lists while item being dragged.
|
||||||
|
*/
|
||||||
|
updateItemFeedback: function (ev, ui) {
|
||||||
|
var bm_item = $this.findById(ui.item.attr('id'));
|
||||||
|
if ('folder' === bm_item.bookmark.type) {
|
||||||
|
// No-op
|
||||||
|
} else {
|
||||||
|
ui.placeholder.prev('.folder').each(function () {
|
||||||
|
$this.editor.find('.hover').removeClass('hover');
|
||||||
|
$(this).addClass('hover');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler to perform a folder move at the data model level.
|
||||||
|
*
|
||||||
|
* This is kind of gnarly, since it involves drops into both the folder
|
||||||
|
* sidebar and the item pane. Since only one level of folder is allowed,
|
||||||
|
* folders and items have to be treated differently for drag gestures
|
||||||
|
* that imply reordering versus structure changes.
|
||||||
|
*/
|
||||||
|
performItemMove: function (ev, ui) {
|
||||||
|
$this.editor.find('.hover').removeClass('hover');
|
||||||
|
|
||||||
|
// Find the data item for the dragged node.
|
||||||
|
var bm_item = $this.findById(ui.item.attr('id'));
|
||||||
|
bm_item.parent.splice(bm_item.index, 1);
|
||||||
|
|
||||||
|
// Update the data model to reflect the change in DOM structure
|
||||||
|
var id, root_parent, bm_dest = null;
|
||||||
|
if (id = ui.item.prev('.folder').attr('id')) {
|
||||||
|
// This is a drop after a folder in the folder pane...
|
||||||
|
ui.item.remove();
|
||||||
|
bm_dest = $this.findById(id.replace('fl-',''));
|
||||||
|
if ('folder' === bm_item.bookmark.type) {
|
||||||
|
// Folder dropped after a folder in folder pane.
|
||||||
|
bm_dest.parent.splice(bm_dest.index + 1, 0, bm_item.bookmark);
|
||||||
|
} else {
|
||||||
|
// Bookmark item dropped into a folder in folder pane.
|
||||||
|
bm_dest.bookmark.items.push(bm_item.bookmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (id = ui.item.next('.folder').attr('id')) {
|
||||||
|
// This is a drop in front of a folder in the folder pane...
|
||||||
|
ui.item.remove();
|
||||||
|
bm_dest = $this.findById(id.replace('fl-',''));
|
||||||
|
if ('folder' === bm_item.bookmark.type) {
|
||||||
|
// Folder dropped in front of a folder in folder pane.
|
||||||
|
bm_dest.parent.splice(bm_dest.index, 0, bm_item.bookmark);
|
||||||
|
} else {
|
||||||
|
// Bookmark item dropped into a root folder in folder pane.
|
||||||
|
bm_dest.parent.unshift(bm_item.bookmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if ( id = ui.item.prev('.bookmark').attr('id') ) {
|
||||||
|
// This drop moves an item/folder after another item.
|
||||||
|
bm_dest = $this.findById(id);
|
||||||
|
bm_dest.parent.splice(bm_dest.index + 1, 0, bm_item.bookmark);
|
||||||
|
|
||||||
|
} else if ( id = ui.item.next('.bookmark').attr('id') ) {
|
||||||
|
// This drop moves an item/folder before another item.
|
||||||
|
bm_dest = $this.findById(id);
|
||||||
|
bm_dest.parent.splice(bm_dest.index, 0, bm_item.bookmark);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Seems not to be a valid drop, so restore the item.
|
||||||
|
bm_item.parent.splice(bm_item.index, 0, bm_item.bookmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this.refresh();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select a folder by ID and populate the bookmarks pane with its
|
||||||
|
* items.
|
||||||
|
*/
|
||||||
|
selectFolder: function (folder_id) {
|
||||||
|
if (!folder_id) {
|
||||||
|
// If no folder ID supplied, use the last selected one.
|
||||||
|
folder_id = $this.selected_folder;
|
||||||
|
} else {
|
||||||
|
// Remember the supplied folder ID as last selected.
|
||||||
|
$this.selected_folder = folder_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
var folder_el = $('#'+folder_id), items;
|
||||||
|
if (folder_el.hasClass('root')) {
|
||||||
|
// HACK: If this is a root folder, find the root name from ID
|
||||||
|
// naming convention.
|
||||||
|
var id_parts = folder_id.split('-');
|
||||||
|
items = $this.bookmarks[id_parts[1]];
|
||||||
|
} else {
|
||||||
|
// Find the folder bookmark by ID, use its items.
|
||||||
|
items = $this.findById(folder_id.replace('fl-','')).bookmark.items || [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deselect all folders, select this one.
|
||||||
|
$this.editor.find('.folder').removeClass('selected');
|
||||||
|
folder_el.addClass('selected');
|
||||||
|
|
||||||
|
// Update the bookmarks pane from this folder.
|
||||||
|
$this.updateBookmarks(items);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wire up events and handlers to support the bookmark editor
|
||||||
|
*/
|
||||||
|
wireUpBookmarkEditor: function () {
|
||||||
|
var bm_editor = $('#bookmark_editor');
|
||||||
|
|
||||||
|
$this.editor
|
||||||
|
.find('.new-bookmark').click($this.newBookmark).end()
|
||||||
|
.find('.new-folder').click($this.newFolder).end()
|
||||||
|
.find('.delete-selected').click($this.deleteSelectedItem).end();
|
||||||
|
|
||||||
|
bm_editor
|
||||||
|
.find('form').submit(function () { return false; }).end()
|
||||||
|
.find('.cancel').click(function(ev) { bm_editor.hide(); }).end()
|
||||||
|
.find('.save').click($this.saveBookmark).end();
|
||||||
|
|
||||||
|
$.each(['bookmark','livemark'], function (i, type) {
|
||||||
|
bm_editor.find('button[name=type_'+type+']')
|
||||||
|
.click(function (ev) {
|
||||||
|
bm_editor
|
||||||
|
.find('form').attr('class', type).end()
|
||||||
|
.find('input[name=type]').val(type).end();
|
||||||
|
}).end();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to delete the current selected item in bookmark pane.
|
||||||
|
*/
|
||||||
|
deleteSelectedItem: function (ev) {
|
||||||
|
if (!$this.selected_item) { return; }
|
||||||
|
|
||||||
|
var item = $this.selected_item;
|
||||||
|
item.parent.splice(item.index, 1);
|
||||||
|
$this.selected_item = null;
|
||||||
|
|
||||||
|
$this.refresh();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Summon the bookmark editor for new bookmark creation.
|
||||||
|
*/
|
||||||
|
newBookmark: function (ev) {
|
||||||
|
$this.summonBookmarkEditor({});
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Summon and populate the bookmark editor.
|
||||||
|
*/
|
||||||
|
summonBookmarkEditor: function (item) {
|
||||||
|
var new_bm_link = $this.editor.find('.new-bookmark'),
|
||||||
|
bm_editor = $('#bookmark_editor'),
|
||||||
|
pos = new_bm_link.offset(),
|
||||||
|
l_h = new_bm_link.height(),
|
||||||
|
e_h = bm_editor.height();
|
||||||
|
|
||||||
|
if (!item.type) {
|
||||||
|
item.type = 'bookmark';
|
||||||
|
}
|
||||||
|
|
||||||
|
bm_editor
|
||||||
|
.css({
|
||||||
|
left: pos.left - 24,
|
||||||
|
top: pos.top - e_h - 12
|
||||||
|
})
|
||||||
|
.find('item_id').val('').end()
|
||||||
|
.find('form').attr('class', item.type).end()
|
||||||
|
.find('.error').removeClass('error').end()
|
||||||
|
.find('input[name=type]').val(item.type).end()
|
||||||
|
.find('input[type=hidden]').val('').end()
|
||||||
|
.find('input[type=text]').val('').end()
|
||||||
|
.show();
|
||||||
|
|
||||||
|
$.each(item, function(name, val) {
|
||||||
|
bm_editor.find('input[name='+name+']').val(val);
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
bm_editor.find('input[name=title]').focus().end()
|
||||||
|
}, 0.1);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to save a new or existing bookmark from the editor form.
|
||||||
|
*/
|
||||||
|
saveBookmark: function (ev) {
|
||||||
|
var bm_editor = $('#bookmark_editor'),
|
||||||
|
data = { title: '', type: '', link: '', feedLink: '' },
|
||||||
|
errors = [];
|
||||||
|
|
||||||
|
bm_editor.find('input').each(function (i) {
|
||||||
|
var el = $(this),
|
||||||
|
name = el.attr('name');
|
||||||
|
if (name) { data[name] = el.val(); }
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!data.title)
|
||||||
|
errors.push('title');
|
||||||
|
if ('bookmark' == data.type && !data.link)
|
||||||
|
errors.push('link');
|
||||||
|
if ('livemark' == data.type && !data.feedLink)
|
||||||
|
errors.push('feedlink');
|
||||||
|
|
||||||
|
bm_editor.removeClass('error');
|
||||||
|
$.each(errors, function (i, error) {
|
||||||
|
bm_editor.find('.field_'+error).addClass('error');
|
||||||
|
});
|
||||||
|
|
||||||
|
if (errors.length > 0) { return; }
|
||||||
|
|
||||||
|
var item = {
|
||||||
|
id: data.id || $this.generateId(),
|
||||||
|
type: data.type,
|
||||||
|
title: data.title,
|
||||||
|
link: '',
|
||||||
|
feedLink: '',
|
||||||
|
siteLink: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
if ('bookmark' == data.type) {
|
||||||
|
item.link = data.link;
|
||||||
|
item.description = data.description;
|
||||||
|
} else if ('livemark' == data.type) {
|
||||||
|
item.feedLink = data.feedLink;
|
||||||
|
item.siteLink = data.siteLink;
|
||||||
|
}
|
||||||
|
|
||||||
|
var orig_item = $this.findById(data.id);
|
||||||
|
if (!orig_item) {
|
||||||
|
$this.selected_items.push(item);
|
||||||
|
} else {
|
||||||
|
$.each(item, function (name, val) {
|
||||||
|
orig_item.bookmark[name] = val;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$this.updateBookmarks();
|
||||||
|
$this.updateBookmarksJSON();
|
||||||
|
|
||||||
|
bm_editor.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a new folder.
|
||||||
|
*/
|
||||||
|
newFolder: function (ev) {
|
||||||
|
// Only allow new folders to be created in one of the roots.
|
||||||
|
if (!$('#'+$this.selected_folder).hasClass('root')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var new_folder = {
|
||||||
|
id: $this.generateId(),
|
||||||
|
type: 'folder',
|
||||||
|
title: 'New Folder',
|
||||||
|
items: []
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($this.selected_item) {
|
||||||
|
// Insert the new folder after a selected item.
|
||||||
|
$this.selected_item.parent
|
||||||
|
.splice($this.selected_item.index + 1, 0, new_folder);
|
||||||
|
} else if ($this.selected_items) {
|
||||||
|
// Append the new folder to the end of selected items.
|
||||||
|
$this.selected_items.push(new_folder);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this.refresh();
|
||||||
|
$this.summonFolderRename(new_folder.id);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bring up a text field to accept a new name for a folder.
|
||||||
|
*
|
||||||
|
* Only works for folders visible in the bookmark pane.
|
||||||
|
*/
|
||||||
|
summonFolderRename: function (fl_id) {
|
||||||
|
var folder_el = $('#'+fl_id),
|
||||||
|
folder_pos = folder_el.offset(),
|
||||||
|
folder_item = $this.findById(fl_id),
|
||||||
|
editor = $('<input type="text" />');
|
||||||
|
|
||||||
|
var accept = function () {
|
||||||
|
folder_item.bookmark.title = editor.val();
|
||||||
|
editor.remove();
|
||||||
|
$this.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
var reject = function () {
|
||||||
|
editor.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
editor
|
||||||
|
.appendTo('body')
|
||||||
|
.css({
|
||||||
|
position: 'absolute',
|
||||||
|
left: folder_pos.left + 34,
|
||||||
|
top: folder_pos.top,
|
||||||
|
width: '60ex',
|
||||||
|
zIndex: 1000
|
||||||
|
})
|
||||||
|
.val(folder_item.bookmark.title)
|
||||||
|
.select()
|
||||||
|
.focus()
|
||||||
|
.blur(accept)
|
||||||
|
.keyup(function (ev) {
|
||||||
|
switch (ev.keyCode) {
|
||||||
|
case 13: accept(); break;
|
||||||
|
case 27: reject(); break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a unique ID for a bookmark.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
generateId: function () {
|
||||||
|
return 'bm-' + (new Date()).getTime() + '-' + (++($this.last_id));
|
||||||
|
},
|
||||||
|
last_id: 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inject unique IDs into all bookmarks.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
injectIds: function (bookmarks) {
|
||||||
|
if (!bookmarks) {
|
||||||
|
// If no list of bookmarks, iterate through root folders.
|
||||||
|
$.each($this.bookmarks, function (k,v) {
|
||||||
|
$this.injectIds(v);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Recursively inject IDs into each bookmark in the folder.
|
||||||
|
$.each(bookmarks, function (idx, bookmark) {
|
||||||
|
if (!bookmark.id) {
|
||||||
|
bookmark.id = $this.generateId();
|
||||||
|
}
|
||||||
|
if (bookmark.items) {
|
||||||
|
$this.injectIds(bookmark.items);
|
||||||
|
} else {
|
||||||
|
if ('folder' == bookmark.type) {
|
||||||
|
// HACK: If somehow this folder-type item doesn't
|
||||||
|
// have an empty list already, give it one.
|
||||||
|
bookmark.items = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search recursively for a bookmark by ID with parent list context.
|
||||||
|
*/
|
||||||
|
findById: function (id, bookmarks) {
|
||||||
|
if (!bookmarks) {
|
||||||
|
// No list of bookmarks, so start looking from root folders.
|
||||||
|
var rv = null;
|
||||||
|
$.each($this.bookmarks, function (root_name, bookmarks) {
|
||||||
|
if (null !== rv)
|
||||||
|
return; // Found a result, so stop looking.
|
||||||
|
rv = $this.findById(id, bookmarks);
|
||||||
|
});
|
||||||
|
return rv;
|
||||||
|
} else {
|
||||||
|
// Got a list of bookmarks, so start searching through it.
|
||||||
|
var rv = null;
|
||||||
|
$.each(bookmarks, function (idx, bookmark) {
|
||||||
|
if (null !== rv)
|
||||||
|
return; // Found a result, so stop looking.
|
||||||
|
if (bookmark.id == id) {
|
||||||
|
// Found the bookmark, so build the result.
|
||||||
|
rv = {
|
||||||
|
bookmark: bookmark,
|
||||||
|
parent: bookmarks,
|
||||||
|
index: bookmarks.indexOf(bookmark)
|
||||||
|
};
|
||||||
|
} else if (bookmark.items) {
|
||||||
|
// This bookmark has children, so try recursing.
|
||||||
|
rv = $this.findById(id, bookmark.items);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
EOF:null
|
||||||
|
};
|
||||||
|
return $this.init();
|
||||||
|
}());
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -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);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,66 @@
|
||||||
|
/**
|
||||||
|
* jQuery cloneTemplate plugin, v0.0
|
||||||
|
* lorchard@mozilla.com
|
||||||
|
*
|
||||||
|
* Clone template elements and populate them from a data object.
|
||||||
|
*
|
||||||
|
* The data object keys of which are assumed to be CSS selectors. Each
|
||||||
|
* selector may end with an @-prefixed name to identify an attribute.
|
||||||
|
*
|
||||||
|
* An element or attribute matched by the selector will have its
|
||||||
|
* content replaced by the value of the data object for the selector.
|
||||||
|
*/
|
||||||
|
jQuery.fn.extend( {
|
||||||
|
|
||||||
|
cloneTemplate: function (data) {
|
||||||
|
var clones = [];
|
||||||
|
|
||||||
|
this.each(function (i) {
|
||||||
|
|
||||||
|
// Create the clone, squirrel it away.
|
||||||
|
var tmpl = $(this).clone().removeClass('template');
|
||||||
|
clones.push(tmpl[0]);
|
||||||
|
|
||||||
|
// Iterate through all the data keys...
|
||||||
|
for (key in data) { if (data.hasOwnProperty(key)) {
|
||||||
|
|
||||||
|
var value = data[key],
|
||||||
|
at_pos = -1,
|
||||||
|
attr_name = false;
|
||||||
|
|
||||||
|
// Skip populating values that are false or undefined
|
||||||
|
if (false === value || 'undefined' == typeof value) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the key ends with an @attr name, strip it.
|
||||||
|
if (-1 !== (at_pos = key.indexOf('@'))) {
|
||||||
|
attr_name = key.substring(at_pos + 1);
|
||||||
|
key = key.substring(0, at_pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to find the placeholder by selector
|
||||||
|
var el = (key) ? tmpl.find(key) : tmpl;
|
||||||
|
if (!el.length) { continue; }
|
||||||
|
|
||||||
|
if (attr_name) {
|
||||||
|
// Set the attribute, if we had an attribute name.
|
||||||
|
el.attr(attr_name, value);
|
||||||
|
} else {
|
||||||
|
if ('string' === typeof value) {
|
||||||
|
// Strings work as HTML replacements.
|
||||||
|
el.html(value);
|
||||||
|
} else if ('undefined' != typeof value.nodeType) {
|
||||||
|
// Elements become content replacements.
|
||||||
|
el.empty().append(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return this.pushStack(clones, 'cloneTemplate', this.selector);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,482 @@
|
||||||
|
/*
|
||||||
|
http://www.JSON.org/json2.js
|
||||||
|
2010-03-20
|
||||||
|
|
||||||
|
Public Domain.
|
||||||
|
|
||||||
|
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
||||||
|
|
||||||
|
See http://www.JSON.org/js.html
|
||||||
|
|
||||||
|
|
||||||
|
This code should be minified before deployment.
|
||||||
|
See http://javascript.crockford.com/jsmin.html
|
||||||
|
|
||||||
|
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
|
||||||
|
NOT CONTROL.
|
||||||
|
|
||||||
|
|
||||||
|
This file creates a global JSON object containing two methods: stringify
|
||||||
|
and parse.
|
||||||
|
|
||||||
|
JSON.stringify(value, replacer, space)
|
||||||
|
value any JavaScript value, usually an object or array.
|
||||||
|
|
||||||
|
replacer an optional parameter that determines how object
|
||||||
|
values are stringified for objects. It can be a
|
||||||
|
function or an array of strings.
|
||||||
|
|
||||||
|
space an optional parameter that specifies the indentation
|
||||||
|
of nested structures. If it is omitted, the text will
|
||||||
|
be packed without extra whitespace. If it is a number,
|
||||||
|
it will specify the number of spaces to indent at each
|
||||||
|
level. If it is a string (such as '\t' or ' '),
|
||||||
|
it contains the characters used to indent at each level.
|
||||||
|
|
||||||
|
This method produces a JSON text from a JavaScript value.
|
||||||
|
|
||||||
|
When an object value is found, if the object contains a toJSON
|
||||||
|
method, its toJSON method will be called and the result will be
|
||||||
|
stringified. A toJSON method does not serialize: it returns the
|
||||||
|
value represented by the name/value pair that should be serialized,
|
||||||
|
or undefined if nothing should be serialized. The toJSON method
|
||||||
|
will be passed the key associated with the value, and this will be
|
||||||
|
bound to the value
|
||||||
|
|
||||||
|
For example, this would serialize Dates as ISO strings.
|
||||||
|
|
||||||
|
Date.prototype.toJSON = function (key) {
|
||||||
|
function f(n) {
|
||||||
|
// Format integers to have at least two digits.
|
||||||
|
return n < 10 ? '0' + n : n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.getUTCFullYear() + '-' +
|
||||||
|
f(this.getUTCMonth() + 1) + '-' +
|
||||||
|
f(this.getUTCDate()) + 'T' +
|
||||||
|
f(this.getUTCHours()) + ':' +
|
||||||
|
f(this.getUTCMinutes()) + ':' +
|
||||||
|
f(this.getUTCSeconds()) + 'Z';
|
||||||
|
};
|
||||||
|
|
||||||
|
You can provide an optional replacer method. It will be passed the
|
||||||
|
key and value of each member, with this bound to the containing
|
||||||
|
object. The value that is returned from your method will be
|
||||||
|
serialized. If your method returns undefined, then the member will
|
||||||
|
be excluded from the serialization.
|
||||||
|
|
||||||
|
If the replacer parameter is an array of strings, then it will be
|
||||||
|
used to select the members to be serialized. It filters the results
|
||||||
|
such that only members with keys listed in the replacer array are
|
||||||
|
stringified.
|
||||||
|
|
||||||
|
Values that do not have JSON representations, such as undefined or
|
||||||
|
functions, will not be serialized. Such values in objects will be
|
||||||
|
dropped; in arrays they will be replaced with null. You can use
|
||||||
|
a replacer function to replace those with JSON values.
|
||||||
|
JSON.stringify(undefined) returns undefined.
|
||||||
|
|
||||||
|
The optional space parameter produces a stringification of the
|
||||||
|
value that is filled with line breaks and indentation to make it
|
||||||
|
easier to read.
|
||||||
|
|
||||||
|
If the space parameter is a non-empty string, then that string will
|
||||||
|
be used for indentation. If the space parameter is a number, then
|
||||||
|
the indentation will be that many spaces.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
text = JSON.stringify(['e', {pluribus: 'unum'}]);
|
||||||
|
// text is '["e",{"pluribus":"unum"}]'
|
||||||
|
|
||||||
|
|
||||||
|
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
|
||||||
|
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
||||||
|
|
||||||
|
text = JSON.stringify([new Date()], function (key, value) {
|
||||||
|
return this[key] instanceof Date ?
|
||||||
|
'Date(' + this[key] + ')' : value;
|
||||||
|
});
|
||||||
|
// text is '["Date(---current time---)"]'
|
||||||
|
|
||||||
|
|
||||||
|
JSON.parse(text, reviver)
|
||||||
|
This method parses a JSON text to produce an object or array.
|
||||||
|
It can throw a SyntaxError exception.
|
||||||
|
|
||||||
|
The optional reviver parameter is a function that can filter and
|
||||||
|
transform the results. It receives each of the keys and values,
|
||||||
|
and its return value is used instead of the original value.
|
||||||
|
If it returns what it received, then the structure is not modified.
|
||||||
|
If it returns undefined then the member is deleted.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
// Parse the text. Values that look like ISO date strings will
|
||||||
|
// be converted to Date objects.
|
||||||
|
|
||||||
|
myData = JSON.parse(text, function (key, value) {
|
||||||
|
var a;
|
||||||
|
if (typeof value === 'string') {
|
||||||
|
a =
|
||||||
|
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
|
||||||
|
if (a) {
|
||||||
|
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
|
||||||
|
+a[5], +a[6]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
});
|
||||||
|
|
||||||
|
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
|
||||||
|
var d;
|
||||||
|
if (typeof value === 'string' &&
|
||||||
|
value.slice(0, 5) === 'Date(' &&
|
||||||
|
value.slice(-1) === ')') {
|
||||||
|
d = new Date(value.slice(5, -1));
|
||||||
|
if (d) {
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
This is a reference implementation. You are free to copy, modify, or
|
||||||
|
redistribute.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*jslint evil: true, strict: false */
|
||||||
|
|
||||||
|
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
||||||
|
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
||||||
|
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
||||||
|
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
||||||
|
test, toJSON, toString, valueOf
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Create a JSON object only if one does not already exist. We create the
|
||||||
|
// methods in a closure to avoid creating global variables.
|
||||||
|
|
||||||
|
if (!this.JSON) {
|
||||||
|
this.JSON = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
function f(n) {
|
||||||
|
// Format integers to have at least two digits.
|
||||||
|
return n < 10 ? '0' + n : n;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof Date.prototype.toJSON !== 'function') {
|
||||||
|
|
||||||
|
Date.prototype.toJSON = function (key) {
|
||||||
|
|
||||||
|
return isFinite(this.valueOf()) ?
|
||||||
|
this.getUTCFullYear() + '-' +
|
||||||
|
f(this.getUTCMonth() + 1) + '-' +
|
||||||
|
f(this.getUTCDate()) + 'T' +
|
||||||
|
f(this.getUTCHours()) + ':' +
|
||||||
|
f(this.getUTCMinutes()) + ':' +
|
||||||
|
f(this.getUTCSeconds()) + 'Z' : null;
|
||||||
|
};
|
||||||
|
|
||||||
|
String.prototype.toJSON =
|
||||||
|
Number.prototype.toJSON =
|
||||||
|
Boolean.prototype.toJSON = function (key) {
|
||||||
|
return this.valueOf();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||||
|
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||||
|
gap,
|
||||||
|
indent,
|
||||||
|
meta = { // table of character substitutions
|
||||||
|
'\b': '\\b',
|
||||||
|
'\t': '\\t',
|
||||||
|
'\n': '\\n',
|
||||||
|
'\f': '\\f',
|
||||||
|
'\r': '\\r',
|
||||||
|
'"' : '\\"',
|
||||||
|
'\\': '\\\\'
|
||||||
|
},
|
||||||
|
rep;
|
||||||
|
|
||||||
|
|
||||||
|
function quote(string) {
|
||||||
|
|
||||||
|
// If the string contains no control characters, no quote characters, and no
|
||||||
|
// backslash characters, then we can safely slap some quotes around it.
|
||||||
|
// Otherwise we must also replace the offending characters with safe escape
|
||||||
|
// sequences.
|
||||||
|
|
||||||
|
escapable.lastIndex = 0;
|
||||||
|
return escapable.test(string) ?
|
||||||
|
'"' + string.replace(escapable, function (a) {
|
||||||
|
var c = meta[a];
|
||||||
|
return typeof c === 'string' ? c :
|
||||||
|
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||||
|
}) + '"' :
|
||||||
|
'"' + string + '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function str(key, holder) {
|
||||||
|
|
||||||
|
// Produce a string from holder[key].
|
||||||
|
|
||||||
|
var i, // The loop counter.
|
||||||
|
k, // The member key.
|
||||||
|
v, // The member value.
|
||||||
|
length,
|
||||||
|
mind = gap,
|
||||||
|
partial,
|
||||||
|
value = holder[key];
|
||||||
|
|
||||||
|
// If the value has a toJSON method, call it to obtain a replacement value.
|
||||||
|
|
||||||
|
if (value && typeof value === 'object' &&
|
||||||
|
typeof value.toJSON === 'function') {
|
||||||
|
value = value.toJSON(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we were called with a replacer function, then call the replacer to
|
||||||
|
// obtain a replacement value.
|
||||||
|
|
||||||
|
if (typeof rep === 'function') {
|
||||||
|
value = rep.call(holder, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// What happens next depends on the value's type.
|
||||||
|
|
||||||
|
switch (typeof value) {
|
||||||
|
case 'string':
|
||||||
|
return quote(value);
|
||||||
|
|
||||||
|
case 'number':
|
||||||
|
|
||||||
|
// JSON numbers must be finite. Encode non-finite numbers as null.
|
||||||
|
|
||||||
|
return isFinite(value) ? String(value) : 'null';
|
||||||
|
|
||||||
|
case 'boolean':
|
||||||
|
case 'null':
|
||||||
|
|
||||||
|
// If the value is a boolean or null, convert it to a string. Note:
|
||||||
|
// typeof null does not produce 'null'. The case is included here in
|
||||||
|
// the remote chance that this gets fixed someday.
|
||||||
|
|
||||||
|
return String(value);
|
||||||
|
|
||||||
|
// If the type is 'object', we might be dealing with an object or an array or
|
||||||
|
// null.
|
||||||
|
|
||||||
|
case 'object':
|
||||||
|
|
||||||
|
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
||||||
|
// so watch out for that case.
|
||||||
|
|
||||||
|
if (!value) {
|
||||||
|
return 'null';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make an array to hold the partial results of stringifying this object value.
|
||||||
|
|
||||||
|
gap += indent;
|
||||||
|
partial = [];
|
||||||
|
|
||||||
|
// Is the value an array?
|
||||||
|
|
||||||
|
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
||||||
|
|
||||||
|
// The value is an array. Stringify every element. Use null as a placeholder
|
||||||
|
// for non-JSON values.
|
||||||
|
|
||||||
|
length = value.length;
|
||||||
|
for (i = 0; i < length; i += 1) {
|
||||||
|
partial[i] = str(i, value) || 'null';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Join all of the elements together, separated with commas, and wrap them in
|
||||||
|
// brackets.
|
||||||
|
|
||||||
|
v = partial.length === 0 ? '[]' :
|
||||||
|
gap ? '[\n' + gap +
|
||||||
|
partial.join(',\n' + gap) + '\n' +
|
||||||
|
mind + ']' :
|
||||||
|
'[' + partial.join(',') + ']';
|
||||||
|
gap = mind;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the replacer is an array, use it to select the members to be stringified.
|
||||||
|
|
||||||
|
if (rep && typeof rep === 'object') {
|
||||||
|
length = rep.length;
|
||||||
|
for (i = 0; i < length; i += 1) {
|
||||||
|
k = rep[i];
|
||||||
|
if (typeof k === 'string') {
|
||||||
|
v = str(k, value);
|
||||||
|
if (v) {
|
||||||
|
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Otherwise, iterate through all of the keys in the object.
|
||||||
|
|
||||||
|
for (k in value) {
|
||||||
|
if (Object.hasOwnProperty.call(value, k)) {
|
||||||
|
v = str(k, value);
|
||||||
|
if (v) {
|
||||||
|
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Join all of the member texts together, separated with commas,
|
||||||
|
// and wrap them in braces.
|
||||||
|
|
||||||
|
v = partial.length === 0 ? '{}' :
|
||||||
|
gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
|
||||||
|
mind + '}' : '{' + partial.join(',') + '}';
|
||||||
|
gap = mind;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the JSON object does not yet have a stringify method, give it one.
|
||||||
|
|
||||||
|
if (typeof JSON.stringify !== 'function') {
|
||||||
|
JSON.stringify = function (value, replacer, space) {
|
||||||
|
|
||||||
|
// The stringify method takes a value and an optional replacer, and an optional
|
||||||
|
// space parameter, and returns a JSON text. The replacer can be a function
|
||||||
|
// that can replace values, or an array of strings that will select the keys.
|
||||||
|
// A default replacer method can be provided. Use of the space parameter can
|
||||||
|
// produce text that is more easily readable.
|
||||||
|
|
||||||
|
var i;
|
||||||
|
gap = '';
|
||||||
|
indent = '';
|
||||||
|
|
||||||
|
// If the space parameter is a number, make an indent string containing that
|
||||||
|
// many spaces.
|
||||||
|
|
||||||
|
if (typeof space === 'number') {
|
||||||
|
for (i = 0; i < space; i += 1) {
|
||||||
|
indent += ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the space parameter is a string, it will be used as the indent string.
|
||||||
|
|
||||||
|
} else if (typeof space === 'string') {
|
||||||
|
indent = space;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there is a replacer, it must be a function or an array.
|
||||||
|
// Otherwise, throw an error.
|
||||||
|
|
||||||
|
rep = replacer;
|
||||||
|
if (replacer && typeof replacer !== 'function' &&
|
||||||
|
(typeof replacer !== 'object' ||
|
||||||
|
typeof replacer.length !== 'number')) {
|
||||||
|
throw new Error('JSON.stringify');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make a fake root object containing our value under the key of ''.
|
||||||
|
// Return the result of stringifying the value.
|
||||||
|
|
||||||
|
return str('', {'': value});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// If the JSON object does not yet have a parse method, give it one.
|
||||||
|
|
||||||
|
if (typeof JSON.parse !== 'function') {
|
||||||
|
JSON.parse = function (text, reviver) {
|
||||||
|
|
||||||
|
// The parse method takes a text and an optional reviver function, and returns
|
||||||
|
// a JavaScript value if the text is a valid JSON text.
|
||||||
|
|
||||||
|
var j;
|
||||||
|
|
||||||
|
function walk(holder, key) {
|
||||||
|
|
||||||
|
// The walk method is used to recursively walk the resulting structure so
|
||||||
|
// that modifications can be made.
|
||||||
|
|
||||||
|
var k, v, value = holder[key];
|
||||||
|
if (value && typeof value === 'object') {
|
||||||
|
for (k in value) {
|
||||||
|
if (Object.hasOwnProperty.call(value, k)) {
|
||||||
|
v = walk(value, k);
|
||||||
|
if (v !== undefined) {
|
||||||
|
value[k] = v;
|
||||||
|
} else {
|
||||||
|
delete value[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return reviver.call(holder, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Parsing happens in four stages. In the first stage, we replace certain
|
||||||
|
// Unicode characters with escape sequences. JavaScript handles many characters
|
||||||
|
// incorrectly, either silently deleting them, or treating them as line endings.
|
||||||
|
|
||||||
|
text = String(text);
|
||||||
|
cx.lastIndex = 0;
|
||||||
|
if (cx.test(text)) {
|
||||||
|
text = text.replace(cx, function (a) {
|
||||||
|
return '\\u' +
|
||||||
|
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// In the second stage, we run the text against regular expressions that look
|
||||||
|
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
||||||
|
// because they can cause invocation, and '=' because it can cause mutation.
|
||||||
|
// But just to be safe, we want to reject all unexpected forms.
|
||||||
|
|
||||||
|
// We split the second stage into 4 regexp operations in order to work around
|
||||||
|
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
||||||
|
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
||||||
|
// replace all simple value tokens with ']' characters. Third, we delete all
|
||||||
|
// open brackets that follow a colon or comma or that begin the text. Finally,
|
||||||
|
// we look to see that the remaining characters are only whitespace or ']' or
|
||||||
|
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
||||||
|
|
||||||
|
if (/^[\],:{}\s]*$/.
|
||||||
|
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
|
||||||
|
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
|
||||||
|
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
||||||
|
|
||||||
|
// In the third stage we use the eval function to compile the text into a
|
||||||
|
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
||||||
|
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
||||||
|
// in parens to eliminate the ambiguity.
|
||||||
|
|
||||||
|
j = eval('(' + text + ')');
|
||||||
|
|
||||||
|
// In the optional fourth stage, we recursively walk the new structure, passing
|
||||||
|
// each name/value pair to a reviver function for possible transformation.
|
||||||
|
|
||||||
|
return typeof reviver === 'function' ?
|
||||||
|
walk({'': j}, '') : j;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
||||||
|
|
||||||
|
throw new SyntaxError('JSON.parse');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}());
|
|
@ -61,7 +61,10 @@ class authprofiles_Core
|
||||||
)),
|
)),
|
||||||
$user_name,
|
$user_name,
|
||||||
time() + $duration,
|
time() + $duration,
|
||||||
Kohana::config('auth_profiles.cookie_path')
|
Kohana::config('auth_profiles.cookie_path'),
|
||||||
|
Kohana::config('auth_profiles.cookie_domain'),
|
||||||
|
Kohana::config('auth_profiles.cookie_secure'),
|
||||||
|
Kohana::config('auth_profiles.cookie_httponly')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче