Merge with 1.4
1410
src/ajax.js
299
src/ajax.php
|
|
@ -33,15 +33,42 @@ elseif(isset($_GET['loadTasks']))
|
|||
stop_gpc($_GET);
|
||||
$listId = (int)_get('list');
|
||||
check_read_access($listId);
|
||||
$sqlWhere = ' AND list_id='. $listId;
|
||||
$sqlWhere = " AND {$db->prefix}todolist.list_id=". $listId;
|
||||
if(_get('compl') == 0) $sqlWhere .= ' AND compl=0';
|
||||
$inner = '';
|
||||
|
||||
$tag = trim(_get('t'));
|
||||
if($tag != '') {
|
||||
$tag_id = get_tag_id($tag, $listId);
|
||||
$inner = "INNER JOIN {$db->prefix}tag2task ON id=task_id";
|
||||
$sqlWhere .= " AND tag_id=$tag_id ";
|
||||
if($tag != '')
|
||||
{
|
||||
$at = explode(',', $tag);
|
||||
$tagIds = array();
|
||||
$tagExIds = array();
|
||||
foreach($at as $i=>$atv) {
|
||||
$atv = trim($atv);
|
||||
if($atv == '' || $atv == '^') continue;
|
||||
if(substr($atv,0,1) == '^') {
|
||||
$tagExIds[] = getTagId(substr($atv,1));
|
||||
} else {
|
||||
$tagIds[] = getTagId($atv);
|
||||
}
|
||||
}
|
||||
|
||||
if(sizeof($tagIds) > 1) {
|
||||
$inner = "INNER JOIN (SELECT task_id, COUNT(tag_id) AS c FROM {$db->prefix}tag2task WHERE list_id=$listId AND tag_id IN (".
|
||||
implode(',',$tagIds). ") GROUP BY task_id) ON id=task_id";
|
||||
$sqlWhere = " AND c=". sizeof($tagIds); //overwrite sqlWhere!
|
||||
}
|
||||
elseif($tagIds) {
|
||||
$inner = "INNER JOIN {$db->prefix}tag2task ON id=task_id";
|
||||
$sqlWhere .= " AND tag_id = ". $tagIds[0];
|
||||
}
|
||||
|
||||
if($tagExIds) {
|
||||
$sqlWhere .= " AND id NOT IN (SELECT DISTINCT task_id FROM {$db->prefix}tag2task WHERE list_id=$listId AND tag_id IN (".
|
||||
implode(',',$tagExIds). "))"; //DISTINCT ?
|
||||
}
|
||||
}
|
||||
|
||||
$s = trim(_get('s'));
|
||||
if($s != '') $sqlWhere .= " AND (title LIKE ". $db->quoteForLike("%%%s%%",$s). " OR note LIKE ". $db->quoteForLike("%%%s%%",$s). ")";
|
||||
$sort = (int)_get('sort');
|
||||
|
|
@ -97,14 +124,15 @@ elseif(isset($_GET['newTask']))
|
|||
if(Config::get('autotz')==0 || $tz<-720 || $tz>720 || $tz%30!=0 ) $tz = round(date('Z')/60);
|
||||
$ow = 1 + (int)$db->sq("SELECT MAX(ow) FROM {$db->prefix}todolist WHERE list_id=$listId AND compl=0");
|
||||
$db->ex("BEGIN");
|
||||
$db->dq("INSERT INTO {$db->prefix}todolist (list_id,title,d_created,ow,prio) VALUES ($listId,?,?,$ow,$prio)", array($title, time()));
|
||||
$db->dq("INSERT INTO {$db->prefix}todolist (uuid,list_id,title,d_created,d_edited,ow,prio) VALUES (?,?,?,?,?,?,?)",
|
||||
array(generateUUID(), $listId, $title, time(), time(), $ow, $prio) );
|
||||
$id = $db->last_insert_id();
|
||||
if($tags)
|
||||
if($tags != '')
|
||||
{
|
||||
$tag_ids = prepare_tags($tags, $listId);
|
||||
if($tag_ids) {
|
||||
update_task_tags($id, $tag_ids);
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET tags=? WHERE id=$id", $tags);
|
||||
$aTags = prepareTags($tags);
|
||||
if($aTags) {
|
||||
addTaskTags($id, $aTags['ids'], $listId);
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET tags=?,tags_ids=? WHERE id=$id", array(implode(',',$aTags['tags']), implode(',',$aTags['ids'])));
|
||||
}
|
||||
}
|
||||
$db->ex("COMMIT");
|
||||
|
|
@ -136,16 +164,16 @@ elseif(isset($_GET['fullNewTask']))
|
|||
$tz = (int)_post('tz');
|
||||
if( Config::get('autotz')==0 || $tz<-720 || $tz>720 || $tz%30!=0 ) $tz = round(date('Z')/60);
|
||||
$ow = 1 + (int)$db->sq("SELECT MAX(ow) FROM {$db->prefix}todolist WHERE list_id=$listId AND compl=0");
|
||||
if(is_null($duedate)) $duedate = 'NULL'; else $duedate = $db->quote($duedate);
|
||||
$db->ex("BEGIN");
|
||||
$db->dq("INSERT INTO {$db->prefix}todolist (list_id,title,d_created,ow,prio,note,duedate) VALUES($listId,?,?,$ow,$prio,?,$duedate)", array($title,time(),$note));
|
||||
$db->dq("INSERT INTO {$db->prefix}todolist (uuid,list_id,title,d_created,d_edited,ow,prio,note,duedate) VALUES(?,?,?,?,?,?,?,?,?)",
|
||||
array(generateUUID(), $listId, $title, time(), time(), $ow, $prio, $note, $duedate) );
|
||||
$id = $db->last_insert_id();
|
||||
if($tags)
|
||||
if($tags != '')
|
||||
{
|
||||
$tag_ids = prepare_tags($tags, $listId);
|
||||
if($tag_ids) {
|
||||
update_task_tags($id, $tag_ids);
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET tags=? WHERE id=$id", $tags);
|
||||
$aTags = prepareTags($tags);
|
||||
if($aTags) {
|
||||
addTaskTags($id, $aTags['ids'], $listId);
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET tags=?,tags_ids=? WHERE id=$id", array(implode(',',$aTags['tags']), implode(',',$aTags['ids'])));
|
||||
}
|
||||
}
|
||||
$db->ex("COMMIT");
|
||||
|
|
@ -157,7 +185,7 @@ elseif(isset($_GET['fullNewTask']))
|
|||
}
|
||||
elseif(isset($_GET['deleteTask']))
|
||||
{
|
||||
$id = (int)$_GET['deleteTask'];
|
||||
$id = (int)_post('id');
|
||||
$deleted = deleteTask($id);
|
||||
$t = array();
|
||||
$t['total'] = $deleted;
|
||||
|
|
@ -168,14 +196,15 @@ elseif(isset($_GET['deleteTask']))
|
|||
elseif(isset($_GET['completeTask']))
|
||||
{
|
||||
check_write_access();
|
||||
$id = (int)$_GET['completeTask'];
|
||||
$compl = _get('compl') ? 1 : 0;
|
||||
$id = (int)_post('id');
|
||||
$compl = _post('compl') ? 1 : 0;
|
||||
$listId = (int)$db->sq("SELECT list_id FROM {$db->prefix}todolist WHERE id=$id");
|
||||
if($compl) $ow = 1 + (int)$db->sq("SELECT MAX(ow) FROM {$db->prefix}todolist WHERE list_id=$listId AND compl=1");
|
||||
else $ow = 1 + (int)$db->sq("SELECT MAX(ow) FROM {$db->prefix}todolist WHERE list_id=$listId AND compl=0");
|
||||
$dateCompleted = $compl ? time() : 0;
|
||||
$db->dq("UPDATE {$db->prefix}todolist SET compl=$compl,ow=$ow,d_completed=? WHERE id=$id", array($dateCompleted));
|
||||
$tz = (int)_get('tz');
|
||||
$db->dq("UPDATE {$db->prefix}todolist SET compl=$compl,ow=$ow,d_completed=?,d_edited=? WHERE id=$id",
|
||||
array($dateCompleted, time()) );
|
||||
$tz = (int)_post('tz');
|
||||
if(Config::get('autotz')==0 || $tz<-720 || $tz>720 || $tz%30!=0) $tz = round(date('Z')/60);
|
||||
$t = array();
|
||||
$t['total'] = 1;
|
||||
|
|
@ -186,10 +215,10 @@ elseif(isset($_GET['completeTask']))
|
|||
elseif(isset($_GET['editNote']))
|
||||
{
|
||||
check_write_access();
|
||||
$id = (int)$_GET['editNote'];
|
||||
$id = (int)_post('id');
|
||||
stop_gpc($_POST);
|
||||
$note = str_replace("\r\n", "\n", trim(_post('note')));
|
||||
$db->dq("UPDATE {$db->prefix}todolist SET note=? WHERE id=$id", $note);
|
||||
$db->dq("UPDATE {$db->prefix}todolist SET note=?,d_edited=? WHERE id=$id", array($note, time()) );
|
||||
$t = array();
|
||||
$t['total'] = 1;
|
||||
$t['list'][] = array('id'=>$id, 'note'=>nl2br(escapeTags($note)), 'noteText'=>(string)$note);
|
||||
|
|
@ -199,7 +228,7 @@ elseif(isset($_GET['editNote']))
|
|||
elseif(isset($_GET['editTask']))
|
||||
{
|
||||
check_write_access();
|
||||
$id = (int)$_GET['editTask'];
|
||||
$id = (int)_post('id');
|
||||
stop_gpc($_POST);
|
||||
$listId = (int)_post('list');
|
||||
$title = trim(_post('title'));
|
||||
|
|
@ -214,22 +243,19 @@ elseif(isset($_GET['editTask']))
|
|||
echo json_encode($t);
|
||||
exit;
|
||||
}
|
||||
$tags = trim(_post('tags'));
|
||||
$tz = (int)_post('tz');
|
||||
if( Config::get('autotz')==0 || $tz<-720 || $tz>720 || $tz%30!=0 ) $tz = round(date('Z')/60);
|
||||
$tags = trim(_post('tags'));
|
||||
$db->ex("BEGIN");
|
||||
$tag_ids = prepare_tags($tags, $listId);
|
||||
$cur_ids = get_task_tags($id);
|
||||
if($cur_ids) {
|
||||
$ids = implode(',', $cur_ids);
|
||||
$db->ex("DELETE FROM {$db->prefix}tag2task WHERE task_id=$id");
|
||||
$db->dq("UPDATE {$db->prefix}tags SET tags_count=tags_count-1 WHERE id IN ($ids)");
|
||||
$db->ex("DELETE FROM {$db->prefix}tag2task WHERE task_id=$id");
|
||||
$aTags = prepareTags($tags);
|
||||
if($aTags) {
|
||||
$tags = implode(',', $aTags['tags']);
|
||||
$tags_ids = implode(',',$aTags['ids']);
|
||||
addTaskTags($id, $aTags['ids'], $listId);
|
||||
}
|
||||
if($tag_ids) {
|
||||
update_task_tags($id, $tag_ids);
|
||||
}
|
||||
if(is_null($duedate)) $duedate = 'NULL'; else $duedate = $db->quote($duedate);
|
||||
$db->dq("UPDATE {$db->prefix}todolist SET title=?,note=?,prio=?,tags=?,duedate=$duedate WHERE id=$id", array($title,$note,$prio,$tags));
|
||||
$db->dq("UPDATE {$db->prefix}todolist SET title=?,note=?,prio=?,tags=?,tags_ids=?,duedate=?,d_edited=? WHERE id=$id",
|
||||
array($title, $note, $prio, $tags, $tags_ids, $duedate, time()) );
|
||||
$db->ex("COMMIT");
|
||||
$r = $db->sqa("SELECT * FROM {$db->prefix}todolist WHERE id=$id");
|
||||
if($r) {
|
||||
|
|
@ -257,7 +283,7 @@ elseif(isset($_GET['changeOrder']))
|
|||
foreach($ad as $diff=>$ids) {
|
||||
if($diff >=0) $set = "ow=ow+".$diff;
|
||||
else $set = "ow=ow-".abs($diff);
|
||||
$db->dq("UPDATE {$db->prefix}todolist SET $set WHERE id IN (".implode(',',$ids).")");
|
||||
$db->dq("UPDATE {$db->prefix}todolist SET $set,d_edited=? WHERE id IN (".implode(',',$ids).")", array(time()) );
|
||||
}
|
||||
$db->ex("COMMIT");
|
||||
$t['total'] = 1;
|
||||
|
|
@ -297,7 +323,8 @@ elseif(isset($_GET['suggestTags']))
|
|||
$begin = trim(_get('q'));
|
||||
$limit = (int)_get('limit');
|
||||
if($limit<1) $limit = 8;
|
||||
$q = $db->dq("SELECT name,id FROM {$db->prefix}tags WHERE list_id=$listId AND name LIKE ". $db->quoteForLike('%s%%',$begin). " AND tags_count>0 ORDER BY name LIMIT $limit");
|
||||
$q = $db->dq("SELECT name,id FROM {$db->prefix}tags INNER JOIN {$db->prefix}tag2task ON id=tag_id WHERE list_id=$listId AND name LIKE ".
|
||||
$db->quoteForLike('%s%%',$begin) ." GROUP BY tag_id ORDER BY name LIMIT $limit");
|
||||
$s = '';
|
||||
while($r = $q->fetch_row()) {
|
||||
$s .= "$r[0]|$r[1]\n";
|
||||
|
|
@ -312,7 +339,7 @@ elseif(isset($_GET['setPrio']))
|
|||
$prio = (int)_get('prio');
|
||||
if($prio < -1) $prio = -1;
|
||||
elseif($prio > 2) $prio = 2;
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET prio=$prio WHERE id=$id");
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET prio=$prio,d_edited=? WHERE id=$id", array(time()) );
|
||||
$t = array();
|
||||
$t['total'] = 1;
|
||||
$t['list'][] = array('id'=>$id, 'prio'=>$prio);
|
||||
|
|
@ -323,31 +350,38 @@ elseif(isset($_GET['tagCloud']))
|
|||
{
|
||||
$listId = (int)_get('list');
|
||||
check_read_access($listId);
|
||||
$a = array();
|
||||
$q = $db->dq("SELECT name,tags_count FROM {$db->prefix}tags WHERE list_id=$listId AND tags_count>0 ORDER BY tags_count ASC");
|
||||
while($r = $q->fetch_row()) {
|
||||
$a[$r[0]] = $r[1];
|
||||
|
||||
$q = $db->dq("SELECT name,tag_id,COUNT(tag_id) AS tags_count FROM {$db->prefix}tag2task INNER JOIN {$db->prefix}tags ON tag_id=id ".
|
||||
"WHERE list_id=$listId GROUP BY (tag_id) ORDER BY tags_count ASC");
|
||||
$at = array();
|
||||
$ac = array();
|
||||
while($r = $q->fetch_assoc()) {
|
||||
$at[] = array('name'=>$r['name'], 'id'=>$r['tag_id']);
|
||||
$ac[] = $r['tags_count'];
|
||||
}
|
||||
|
||||
$t = array();
|
||||
$t['total'] = 0;
|
||||
$count = sizeof($a);
|
||||
$count = sizeof($at);
|
||||
if(!$count) {
|
||||
echo json_encode($t);
|
||||
exit;
|
||||
}
|
||||
$qmax = max(array_values($a));
|
||||
$qmin = min(array_values($a));
|
||||
|
||||
$qmax = max($ac);
|
||||
$qmin = min($ac);
|
||||
if($count >= 10) $grades = 10;
|
||||
else $grades = $count;
|
||||
$step = ($qmax - $qmin)/$grades;
|
||||
foreach($a as $tag=>$q) {
|
||||
$t['cloud'][] = array('tag'=>htmlarray($tag), 'w'=> tag_size($qmin,$q,$step) );
|
||||
foreach($at as $i=>$tag)
|
||||
{
|
||||
$t['cloud'][] = array('tag'=>htmlarray($tag['name']), 'id'=>(int)$tag['id'], 'w'=> tag_size($qmin,$ac[$i],$step) );
|
||||
}
|
||||
$t['total'] = $count;
|
||||
echo json_encode($t);
|
||||
exit;
|
||||
}
|
||||
elseif(isset($_POST['addList']))
|
||||
elseif(isset($_GET['addList']))
|
||||
{
|
||||
check_write_access();
|
||||
stop_gpc($_POST);
|
||||
|
|
@ -355,7 +389,8 @@ elseif(isset($_POST['addList']))
|
|||
$t['total'] = 0;
|
||||
$name = str_replace(array('"',"'",'<','>','&'),array('','','','',''),trim(_post('name')));
|
||||
$ow = 1 + (int)$db->sq("SELECT MAX(ow) FROM {$db->prefix}lists");
|
||||
$db->dq("INSERT INTO {$db->prefix}lists (name,ow) VALUES (?,?)", array($name,$ow));
|
||||
$db->dq("INSERT INTO {$db->prefix}lists (uuid,name,ow,d_created,d_edited) VALUES (?,?,?,?,?)",
|
||||
array(generateUUID(), $name, $ow, time(), time()) );
|
||||
$id = $db->last_insert_id();
|
||||
$t['total'] = 1;
|
||||
$r = $db->sqa("SELECT * FROM {$db->prefix}lists WHERE id=$id");
|
||||
|
|
@ -363,35 +398,33 @@ elseif(isset($_POST['addList']))
|
|||
echo json_encode($t);
|
||||
exit;
|
||||
}
|
||||
elseif(isset($_POST['renameList']))
|
||||
elseif(isset($_GET['renameList']))
|
||||
{
|
||||
check_write_access();
|
||||
stop_gpc($_POST);
|
||||
$t = array();
|
||||
$t['total'] = 0;
|
||||
$id = (int)_post('id');
|
||||
$id = (int)_post('list');
|
||||
$name = str_replace(array('"',"'",'<','>','&'),array('','','','',''),trim(_post('name')));
|
||||
$db->dq("UPDATE {$db->prefix}lists SET name=? WHERE id=$id", array($name));
|
||||
$db->dq("UPDATE {$db->prefix}lists SET name=?,d_edited=? WHERE id=$id", array($name, time()) );
|
||||
$t['total'] = $db->affected();
|
||||
$r = $db->sqa("SELECT * FROM {$db->prefix}lists WHERE id=$id");
|
||||
$t['list'][] = prepareList($r);
|
||||
echo json_encode($t);
|
||||
exit;
|
||||
}
|
||||
elseif(isset($_POST['deleteList']))
|
||||
elseif(isset($_GET['deleteList']))
|
||||
{
|
||||
check_write_access();
|
||||
stop_gpc($_POST);
|
||||
$t = array();
|
||||
$t['total'] = 0;
|
||||
$id = (int)_post('id');
|
||||
$id = (int)_post('list');
|
||||
$db->ex("BEGIN");
|
||||
$db->ex("DELETE FROM {$db->prefix}lists WHERE id=$id");
|
||||
$t['total'] = $db->affected();
|
||||
if($t['total']) {
|
||||
$db->ex("DELETE FROM {$db->prefix}tags WHERE list_id=$id");
|
||||
# sqlite doesnt support DELETE FROM INNNER JOIN
|
||||
$db->ex("DELETE FROM {$db->prefix}tag2task WHERE task_id IN (SELECT id FROM {$db->prefix}todolist WHERE list_id=$id)");
|
||||
$db->ex("DELETE FROM {$db->prefix}tag2task WHERE list_id=$id");
|
||||
$db->ex("DELETE FROM {$db->prefix}todolist WHERE list_id=$id");
|
||||
}
|
||||
$db->ex("COMMIT");
|
||||
|
|
@ -404,7 +437,7 @@ elseif(isset($_GET['setSort']))
|
|||
$listId = (int)_post('list');
|
||||
$sort = (int)_post('sort');
|
||||
if($sort < 0 || $sort > 2) $sort = 0;
|
||||
$db->ex("UPDATE {$db->prefix}lists SET sorting=$sort WHERE id=$listId");
|
||||
$db->ex("UPDATE {$db->prefix}lists SET sorting=$sort,d_edited=? WHERE id=$listId", array(time()));
|
||||
echo json_encode(array('total'=>1));
|
||||
exit;
|
||||
}
|
||||
|
|
@ -413,7 +446,7 @@ elseif(isset($_GET['publishList']))
|
|||
check_write_access();
|
||||
$listId = (int)_post('list');
|
||||
$publish = (int)_post('publish');
|
||||
$db->ex("UPDATE {$db->prefix}lists SET published=? WHERE id=$listId", array($publish ? 1 : 0));
|
||||
$db->ex("UPDATE {$db->prefix}lists SET published=?,d_created=? WHERE id=$listId", array($publish ? 1 : 0, time()));
|
||||
echo json_encode(array('total'=>1));
|
||||
exit;
|
||||
}
|
||||
|
|
@ -431,7 +464,7 @@ elseif(isset($_GET['changeListOrder']))
|
|||
{
|
||||
check_write_access();
|
||||
stop_gpc($_POST);
|
||||
$order = (array)_post('list');
|
||||
$order = (array)_post('order');
|
||||
$t = array();
|
||||
$t['total'] = 0;
|
||||
if($order)
|
||||
|
|
@ -444,7 +477,8 @@ elseif(isset($_GET['changeListOrder']))
|
|||
$setCase .= "WHEN id=$id THEN $ow\n";
|
||||
}
|
||||
$ids = implode($a, ',');
|
||||
$db->dq("UPDATE {$db->prefix}lists SET ow = CASE\n $setCase END WHERE id IN ($ids)");
|
||||
$db->dq("UPDATE {$db->prefix}lists SET d_edited=?, ow = CASE\n $setCase END WHERE id IN ($ids)",
|
||||
array(time()) );
|
||||
$t['total'] = 1;
|
||||
}
|
||||
echo json_encode($t);
|
||||
|
|
@ -475,22 +509,10 @@ elseif(isset($_GET['clearCompletedInList']))
|
|||
$t = array();
|
||||
$t['total'] = 0;
|
||||
$listId = (int)_post('list');
|
||||
$setCase = '';
|
||||
$aId = array();
|
||||
$q = $db->dq("SELECT tag_id,COUNT(task_id) FROM {$db->prefix}tag2task INNER JOIN {$db->prefix}todolist ON task_id=id WHERE list_id=$listId AND compl=1 GROUP BY tag_id");
|
||||
while($r = $q->fetch_row()) {
|
||||
$aId[] = $r[0];
|
||||
$setCase .= "WHEN id=$r[0] THEN $r[1]\n";
|
||||
}
|
||||
$db->ex("BEGIN");
|
||||
if($aId) {
|
||||
$ids = implode(',', $aId);
|
||||
$db->ex("UPDATE {$db->prefix}tags SET tags_count=tags_count - CASE\n $setCase END WHERE id IN ($ids)");
|
||||
$db->ex("DELETE FROM {$db->prefix}tag2task WHERE task_id IN (SELECT id FROM {$db->prefix}todolist WHERE list_id=$listId AND compl=1)");
|
||||
}
|
||||
$db->ex("DELETE FROM {$db->prefix}tag2task WHERE task_id IN (SELECT id FROM {$db->prefix}todolist WHERE list_id=? and compl=1)", array($listId));
|
||||
$db->ex("DELETE FROM {$db->prefix}todolist WHERE list_id=$listId and compl=1");
|
||||
$t['total'] = $db->affected();
|
||||
$db->ex("DELETE FROM {$db->prefix}tags WHERE tags_count < 1");
|
||||
$db->ex("COMMIT");
|
||||
echo json_encode($t);
|
||||
exit;
|
||||
|
|
@ -502,23 +524,34 @@ function prepareTaskRow($r, $tz)
|
|||
{
|
||||
global $lang;
|
||||
$dueA = prepare_duedate($r['duedate'], $tz);
|
||||
$formatCreatedInline = $formatCompletedInline = 'M d';
|
||||
if(date('Y') != date('Y',$r['d_created'])) $formatCreatedInline = 'M Y';
|
||||
if($r['d_completed'] && date('Y') != date('Y',$r['d_completed'])) $formatCompletedInline = 'M Y';
|
||||
|
||||
$dCreated = timestampToDatetime($r['d_created'], $tz);
|
||||
$dCompleted = $r['d_completed'] ? timestampToDatetime($r['d_completed'], $tz) : '';
|
||||
|
||||
return array(
|
||||
'id' => $r['id'],
|
||||
'title' => escapeTags($r['title']),
|
||||
'date' => htmlarray($dCreated),
|
||||
'dateInline' => htmlarray(sprintf($lang->get('taskdate_inline'), $dCreated)),
|
||||
'dateCompleted' => $r['d_completed'] ? htmlarray(timestampToDatetime($r['d_completed'], $tz)) : '',
|
||||
'dateInline' => htmlarray(formatTime($formatCreatedInline, $r['d_created'], $tz)),
|
||||
'dateInlineTitle' => htmlarray(sprintf($lang->get('taskdate_inline_created'), $dCreated)),
|
||||
'dateCompleted' => htmlarray($dCompleted),
|
||||
'dateCompletedInline' => $r['d_completed'] ? htmlarray(formatTime($formatCompletedInline, $r['d_completed'], $tz)) : '',
|
||||
'dateCompletedInlineTitle' => htmlarray(sprintf($lang->get('taskdate_inline_completed'), $dCompleted)),
|
||||
'compl' => (int)$r['compl'],
|
||||
'prio' => $r['prio'],
|
||||
'note' => nl2br(escapeTags($r['note'])),
|
||||
'noteText' => (string)$r['note'],
|
||||
'ow' => (int)$r['ow'],
|
||||
'tags' => htmlarray($r['tags']),
|
||||
'tags_ids' => htmlarray($r['tags_ids']),
|
||||
'duedate' => $dueA['formatted'],
|
||||
'dueClass' => $dueA['class'],
|
||||
'dueStr' => htmlarray($dueA['str']),
|
||||
'dueStr' => htmlarray($r['compl'] && $dueA['timestamp'] ? formatTime($formatCompletedInline, $dueA['timestamp'], $tz) : $dueA['str']),
|
||||
'dueInt' => date2int($r['duedate']),
|
||||
'dueTitle' => htmlarray(sprintf($lang->get('taskdate_inline_duedate'), $dueA['formatted'])),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -549,41 +582,57 @@ function check_write_access()
|
|||
exit;
|
||||
}
|
||||
|
||||
function prepare_tags(&$tags_str, $listId)
|
||||
function inputTaskParams()
|
||||
{
|
||||
$tag_ids = array();
|
||||
$tag_names = array();
|
||||
$tags = explode(',', $tags_str);
|
||||
foreach($tags as $v)
|
||||
{
|
||||
# remove duplicate tags?
|
||||
$tag = str_replace(array('"',"'",'<','>','&'),array('','','','',''),trim($v));
|
||||
$a = array(
|
||||
'id' => _post('id'),
|
||||
'title'=> trim(_post('title')),
|
||||
'note' => str_replace("\r\n", "\n", trim(_post('note'))),
|
||||
'prio' => (int)_post('prio'),
|
||||
'duedate' => '',
|
||||
'tags' => trim(_post('tags')),
|
||||
'listId' => (int)_post('list'),
|
||||
|
||||
);
|
||||
if($a['prio'] < -1) $a['prio'] = -1;
|
||||
elseif($a['prio'] > 2) $a['prio'] = 2;
|
||||
return $a;
|
||||
}
|
||||
|
||||
function prepareTags($tagsStr)
|
||||
{
|
||||
$tags = explode(',', $tagsStr);
|
||||
if(!$tags) return 0;
|
||||
|
||||
$aTags = array('tags'=>array(), 'ids'=>array());
|
||||
foreach($tags as $tag)
|
||||
{
|
||||
$tag = str_replace(array('"',"'",'<','>','&','/','\\','^'),'',trim($tag));
|
||||
if($tag == '') continue;
|
||||
list($tag_id,$tag_name) = get_or_create_tag($tag, $listId);
|
||||
if($tag_id && !in_array($tag_id, $tag_ids)) {
|
||||
$tag_ids[] = $tag_id;
|
||||
$tag_names[] = $tag_name;
|
||||
|
||||
$aTag = getOrCreateTag($tag);
|
||||
if($aTag && !in_array($aTag['id'], $aTags['ids'])) {
|
||||
$aTags['tags'][] = $aTag['name'];
|
||||
$aTags['ids'][] = $aTag['id'];
|
||||
}
|
||||
}
|
||||
$tags_str = implode(',', $tag_names);
|
||||
return $tag_ids;
|
||||
return $aTags;
|
||||
}
|
||||
|
||||
function get_or_create_tag($name, $listId)
|
||||
function getOrCreateTag($name)
|
||||
{
|
||||
global $db;
|
||||
$tag = $db->sq("SELECT id,name FROM {$db->prefix}tags WHERE list_id=? AND name=?", array($listId, $name));
|
||||
if($tag) return $tag;
|
||||
$tagId = $db->sq("SELECT id FROM {$db->prefix}tags WHERE name=?", array($name));
|
||||
if($tagId) return array('id'=>$tagId, 'name'=>$name);
|
||||
|
||||
# need to create tag
|
||||
$db->ex("INSERT INTO {$db->prefix}tags (name,list_id) VALUES (?,?)", array($name,$listId));
|
||||
return array($db->last_insert_id(), $name);
|
||||
$db->ex("INSERT INTO {$db->prefix}tags (name) VALUES (?)", array($name));
|
||||
return array('id'=>$db->last_insert_id(), 'name'=>$name);
|
||||
}
|
||||
|
||||
function get_tag_id($tag, $listId)
|
||||
function getTagId($tag)
|
||||
{
|
||||
global $db;
|
||||
$id = $db->sq("SELECT id FROM {$db->prefix}tags WHERE list_id=? AND name=?", array($listId, $tag));
|
||||
$id = $db->sq("SELECT id FROM {$db->prefix}tags WHERE name=?", array($tag));
|
||||
return $id ? $id : 0;
|
||||
}
|
||||
|
||||
|
|
@ -598,13 +647,15 @@ function get_task_tags($id)
|
|||
return $a;
|
||||
}
|
||||
|
||||
function update_task_tags($id, $tag_ids)
|
||||
|
||||
function addTaskTags($taskId, $tagIds, $listId)
|
||||
{
|
||||
global $db;
|
||||
foreach($tag_ids as $v) {
|
||||
$db->ex("INSERT INTO {$db->prefix}tag2task (task_id,tag_id) VALUES ($id,$v)");
|
||||
if(!$tagIds) return;
|
||||
foreach($tagIds as $tagId)
|
||||
{
|
||||
$db->ex("INSERT INTO {$db->prefix}tag2task (task_id,tag_id,list_id) VALUES (?,?,?)", array($taskId,$tagId,$listId));
|
||||
}
|
||||
$db->ex("UPDATE {$db->prefix}tags SET tags_count=tags_count+1 WHERE id IN (". implode(',', $tag_ids). ")");
|
||||
}
|
||||
|
||||
function parse_smartsyntax($title)
|
||||
|
|
@ -677,12 +728,13 @@ function prepare_duedate($duedate, $tz)
|
|||
{
|
||||
global $lang;
|
||||
|
||||
$a = array( 'class'=>'', 'str'=>'', 'formatted'=>'' );
|
||||
$a = array( 'class'=>'', 'str'=>'', 'formatted'=>'', 'timestamp'=>0 );
|
||||
if($duedate == '') {
|
||||
return $a;
|
||||
}
|
||||
$ad = explode('-', $duedate);
|
||||
$at = explode('-', gmdate('Y-m-d', time() + $tz*60));
|
||||
$a['timestamp'] = gmmktime(0,0,0,$ad[1],$ad[2],$ad[0]) + $tz*60;
|
||||
$diff = mktime(0,0,0,$ad[1],$ad[2],$ad[0]) - mktime(0,0,0,$at[1],$at[2],$at[0]);
|
||||
|
||||
if($diff < -604800 && $ad[0] == $at[0]) { $a['class'] = 'past'; $a['str'] = formatDate3(Config::get('dateformatshort'), (int)$ad[0], (int)$ad[1], (int)$ad[2], $lang); }
|
||||
|
|
@ -739,9 +791,10 @@ function myErrorHandler($errno, $errstr, $errfile, $errline)
|
|||
function myExceptionHandler($e)
|
||||
{
|
||||
if(-1 == $e->getCode()) {
|
||||
echo $e->getMessage(); exit;
|
||||
echo $e->getMessage()."\n". $e->getTraceAsString();
|
||||
exit;
|
||||
}
|
||||
echo 'Exception: \''. $e->getMessage() .'\' in '. $e->getFile() .':'. $e->getLine();
|
||||
echo 'Exception: \''. $e->getMessage() .'\' in '. $e->getFile() .':'. $e->getLine(); //."\n". $e->getTraceAsString();
|
||||
exit;
|
||||
}
|
||||
|
||||
|
|
@ -749,14 +802,9 @@ function deleteTask($id)
|
|||
{
|
||||
check_write_access();
|
||||
global $db;
|
||||
$tags = get_task_tags($id);
|
||||
$db->ex("BEGIN");
|
||||
if($tags) {
|
||||
$s = implode(',', $tags);
|
||||
$db->ex("DELETE FROM {$db->prefix}tag2task WHERE task_id=$id");
|
||||
$db->ex("UPDATE {$db->prefix}tags SET tags_count=tags_count-1 WHERE id IN ($s)");
|
||||
$db->ex("DELETE FROM {$db->prefix}tags WHERE tags_count < 1"); # slow on large amount of tags
|
||||
}
|
||||
$db->ex("DELETE FROM {$db->prefix}tag2task WHERE task_id=$id");
|
||||
//TODO: delete unused tags?
|
||||
$db->dq("DELETE FROM {$db->prefix}todolist WHERE id=$id");
|
||||
$affected = $db->affected();
|
||||
$db->ex("COMMIT");
|
||||
|
|
@ -767,23 +815,20 @@ function moveTask($id, $listId)
|
|||
{
|
||||
check_write_access();
|
||||
global $db;
|
||||
|
||||
// Check task exists and not in target list
|
||||
$r = $db->sqa("SELECT * FROM {$db->prefix}todolist WHERE id=?", array($id));
|
||||
if(!$r || $listId == $r['list_id']) return false;
|
||||
|
||||
// Check target list exists
|
||||
if(!$db->sq("SELECT COUNT(*) FROM {$db->prefix}lists WHERE id=?", $listId))
|
||||
return false;
|
||||
|
||||
$ow = 1 + (int)$db->sq("SELECT MAX(ow) FROM {$db->prefix}todolist WHERE list_id=? AND compl=?", array($listId, $r['compl']?1:0));
|
||||
$tags = get_task_tags($id);
|
||||
|
||||
$db->ex("BEGIN");
|
||||
if($tags)
|
||||
{
|
||||
$s = implode(',', $tags);
|
||||
$db->ex("DELETE FROM {$db->prefix}tag2task WHERE task_id=?", $id);
|
||||
$db->ex("UPDATE {$db->prefix}tags SET tags_count=tags_count-1 WHERE id IN ($s)");
|
||||
$db->ex("DELETE FROM {$db->prefix}tags WHERE tags_count < 1"); #slow
|
||||
update_task_tags($id, prepare_tags($r['tags'], $listId));
|
||||
}
|
||||
$db->dq("UPDATE {$db->prefix}todolist SET list_id=?, ow=? WHERE id=?", array($listId, $ow, $id));
|
||||
$db->ex("UPDATE {$db->prefix}tag2task SET list_id=? WHERE task_id=?", array($listId, $id));
|
||||
$db->dq("UPDATE {$db->prefix}todolist SET list_id=?, ow=?, d_edited=? WHERE id=?", array($listId, $ow, time(), $id));
|
||||
$db->ex("COMMIT");
|
||||
return true;
|
||||
}
|
||||
|
|
@ -797,7 +842,7 @@ function prepareList($row)
|
|||
'sort' => (int)$row['sorting'],
|
||||
'published' => $row['published'] ? 1 :0,
|
||||
'showCompl' => $taskview & 1 ? 1 : 0,
|
||||
// 'showNotes' => $taskview & 2 ? 1 : 0,
|
||||
'showNotes' => $taskview & 2 ? 1 : 0,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ class Database_Mysql
|
|||
}
|
||||
$query = "";
|
||||
for($i=0; $i<sizeof($m)-1; $i++) {
|
||||
$query .= $m[$i]. $this->quote($p[$i]);
|
||||
$query .= $m[$i]. (is_null($p[$i]) ? 'NULL' : $this->quote($p[$i]));
|
||||
}
|
||||
$query .= $m[$i];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ class Database_Sqlite3
|
|||
}
|
||||
$query = "";
|
||||
for($i=0; $i<sizeof($m)-1; $i++) {
|
||||
$query .= $m[$i]. $this->quote($p[$i]);
|
||||
$query .= $m[$i]. (is_null($p[$i]) ? 'NULL' : $this->quote($p[$i]));
|
||||
}
|
||||
$query .= $m[$i];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -165,4 +165,16 @@ function escapeTags($s)
|
|||
return $s;
|
||||
}
|
||||
|
||||
/* found in comments on http://www.php.net/manual/en/function.uniqid.php#94959 */
|
||||
function generateUUID()
|
||||
{
|
||||
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
|
||||
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff),
|
||||
mt_rand(0, 0x0fff) | 0x4000,
|
||||
mt_rand(0, 0x3fff) | 0x8000,
|
||||
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
25
src/feed.php
|
|
@ -21,12 +21,27 @@ if(!$listData) {
|
|||
die("No such list");
|
||||
}
|
||||
|
||||
$listData['_feed_title'] = sprintf($lang->get('feed_title'), $listData['name']);
|
||||
$listData['_feed_descr'] = sprintf($lang->get('feed_description'), $listData['name']);
|
||||
$feedType = _get('feed');
|
||||
$sqlWhere = '';
|
||||
if($feedType == 'completed') {
|
||||
$listData['_uid_field'] = 'd_completed';
|
||||
$listData['_feed_descr'] = $lang->get('feed_completed_tasks');
|
||||
$sqlWhere = 'AND compl=1';
|
||||
}
|
||||
elseif($feedType == 'modified') {
|
||||
$listData['_uid_field'] = 'd_edited';
|
||||
$listData['_feed_descr'] = $lang->get('feed_modified_tasks');
|
||||
}
|
||||
else {
|
||||
$listData['_uid_field'] = 'd_created';
|
||||
$listData['_feed_descr'] = $lang->get('feed_new_tasks');
|
||||
}
|
||||
|
||||
$listData['_feed_title'] = sprintf($lang->get('feed_title'), $listData['name']) . ' - '. $listData['_feed_descr'];
|
||||
htmlarray_ref($listData);
|
||||
|
||||
$data = array();
|
||||
$q = $db->dq("SELECT * FROM {$db->prefix}todolist WHERE list_id=$listId ORDER BY d_created DESC LIMIT 100");
|
||||
$q = $db->dq("SELECT * FROM {$db->prefix}todolist WHERE list_id=$listId $sqlWhere ORDER BY ". $listData['_uid_field'] ." DESC LIMIT 100");
|
||||
while($r = $q->fetch_assoc($q))
|
||||
{
|
||||
if($r['prio'] > 0) $r['prio'] = '+'.$r['prio'];
|
||||
|
|
@ -57,8 +72,8 @@ function printRss($listData, $data)
|
|||
|
||||
foreach($data as $v)
|
||||
{
|
||||
$d = gmdate('r', $v['d_created']);
|
||||
$guid = $listData['id'].'-'.$v['id'].'-'.$v['d_created'];
|
||||
$d = gmdate('r', $v[$listData['_uid_field']]);
|
||||
$guid = $listData['id'].'-'.$v['id'].'-'.$v[$listData['_uid_field']];
|
||||
|
||||
$s .= "<item>\n<title><![CDATA[". str_replace("]]>", "]]]]><![CDATA[>", $v['title']). "]]></title>\n".
|
||||
"<link>$link</link>\n".
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ if($needAuth && !isset($dontStartSession))
|
|||
{
|
||||
if(Config::get('session') == 'files')
|
||||
{
|
||||
session_save_path(MTTPATH. 'tmp/sessions/');
|
||||
session_save_path(MTTPATH. 'tmp/sessions');
|
||||
ini_set('session.gc_maxlifetime', '1209600'); # 14 days session file minimum lifetime
|
||||
ini_set('session.gc_probability', 1);
|
||||
ini_set('session.gc_divisor', 10);
|
||||
|
|
|
|||
19
src/jquery/jquery-1.3.2.min.js
vendored
154
src/jquery/jquery-1.4.2.min.js
vendored
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
/*!
|
||||
* jQuery JavaScript Library v1.4.2
|
||||
* http://jquery.com/
|
||||
*
|
||||
* Copyright 2010, John Resig
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* http://sizzlejs.com/
|
||||
* Copyright 2010, The Dojo Foundation
|
||||
* Released under the MIT, BSD, and GPL Licenses.
|
||||
*
|
||||
* Date: Sat Feb 13 22:33:48 2010 -0500
|
||||
*/
|
||||
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
|
||||
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
|
||||
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
|
||||
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
|
||||
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
|
||||
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
|
||||
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
|
||||
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
|
||||
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
|
||||
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
|
||||
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
|
||||
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
|
||||
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
|
||||
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
|
||||
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
|
||||
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
|
||||
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
|
||||
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
|
||||
var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
|
||||
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
|
||||
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
|
||||
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
|
||||
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
|
||||
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
|
||||
a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
|
||||
w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
|
||||
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
|
||||
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
|
||||
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
|
||||
this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
|
||||
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
|
||||
c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
|
||||
a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
|
||||
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
|
||||
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
|
||||
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
|
||||
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
|
||||
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
|
||||
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
|
||||
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
|
||||
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
|
||||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
|
||||
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
|
||||
a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
|
||||
isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
|
||||
{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
|
||||
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
|
||||
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
|
||||
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
|
||||
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
|
||||
!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
|
||||
toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
|
||||
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
|
||||
function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
|
||||
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
||||
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
|
||||
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
|
||||
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
|
||||
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
|
||||
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
|
||||
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
|
||||
relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
|
||||
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
|
||||
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
|
||||
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
|
||||
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
|
||||
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
|
||||
setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
|
||||
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
|
||||
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
|
||||
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
|
||||
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
|
||||
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
|
||||
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
|
||||
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
|
||||
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
|
||||
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
|
||||
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
|
||||
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
|
||||
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
|
||||
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
|
||||
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
|
||||
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
|
||||
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
|
||||
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
|
||||
a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
|
||||
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
|
||||
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
|
||||
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
|
||||
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
|
||||
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
|
||||
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
|
||||
this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
|
||||
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
|
||||
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
|
||||
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
|
||||
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
|
||||
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
|
||||
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
|
||||
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
|
||||
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
|
||||
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
|
||||
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
|
||||
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
|
||||
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
|
||||
serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
|
||||
function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
|
||||
global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
|
||||
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
|
||||
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
|
||||
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
|
||||
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
|
||||
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
|
||||
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
|
||||
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
|
||||
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
|
||||
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
|
||||
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
|
||||
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
|
||||
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
|
||||
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
|
||||
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
|
||||
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
|
||||
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
|
||||
c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
|
||||
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
|
||||
this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
|
||||
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
|
||||
c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
|
||||
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
|
||||
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
|
||||
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
|
||||
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
|
||||
a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
|
||||
c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
|
||||
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
|
||||
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
|
||||
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
|
||||
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
|
||||
839
src/jquery/jquery.autocomplete-1.1.js
Normal file
|
|
@ -0,0 +1,839 @@
|
|||
/*
|
||||
* jQuery Autocomplete plugin 1.1
|
||||
*
|
||||
* Copyright (c) 2009 Jörn Zaefferer
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
|
||||
*/
|
||||
|
||||
/*
|
||||
* Changes for myTinyTodo, www.mytinytodo.net
|
||||
* Copyright (c) 2010 Max Pozdeev
|
||||
* Dual licensed under the MIT and GPL licenses
|
||||
*/
|
||||
|
||||
;(function($) {
|
||||
|
||||
$.fn.extend({
|
||||
autocomplete: function(urlOrData, options) {
|
||||
var isUrl = typeof urlOrData == "string";
|
||||
var isFunc = typeof urlOrData == "function";
|
||||
options = $.extend({}, $.Autocompleter.defaults, {
|
||||
url: isUrl ? urlOrData : null,
|
||||
data: !isUrl && !isFunc ? urlOrData : null,
|
||||
func: isFunc ? urlOrData : null,
|
||||
delay: isUrl ? $.Autocompleter.defaults.delay : 10,
|
||||
max: options && !options.scroll ? 10 : 150
|
||||
}, options);
|
||||
|
||||
// if highlight is set to false, replace it with a do-nothing function
|
||||
options.highlight = options.highlight || function(value) { return value; };
|
||||
|
||||
// if the formatMatch option is not specified, then use formatItem for backwards compatibility
|
||||
options.formatMatch = options.formatMatch || options.formatItem;
|
||||
|
||||
return this.each(function() {
|
||||
new $.Autocompleter(this, options);
|
||||
});
|
||||
},
|
||||
result: function(handler) {
|
||||
return this.bind("result", handler);
|
||||
},
|
||||
search: function(handler) {
|
||||
return this.trigger("search", [handler]);
|
||||
},
|
||||
flushCache: function() {
|
||||
return this.trigger("flushCache");
|
||||
},
|
||||
setOptions: function(options){
|
||||
return this.trigger("setOptions", [options]);
|
||||
},
|
||||
unautocomplete: function() {
|
||||
return this.trigger("unautocomplete");
|
||||
}
|
||||
});
|
||||
|
||||
$.Autocompleter = function(input, options) {
|
||||
|
||||
var KEY = {
|
||||
UP: 38,
|
||||
DOWN: 40,
|
||||
DEL: 46,
|
||||
TAB: 9,
|
||||
RETURN: 13,
|
||||
ESC: 27,
|
||||
COMMA: 188,
|
||||
PAGEUP: 33,
|
||||
PAGEDOWN: 34,
|
||||
BACKSPACE: 8
|
||||
};
|
||||
|
||||
// Create $ object for input element
|
||||
var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
|
||||
|
||||
var timeout;
|
||||
var previousValue = "";
|
||||
var cache = $.Autocompleter.Cache(options);
|
||||
var hasFocus = 0;
|
||||
var lastKeyPressCode;
|
||||
var config = {
|
||||
mouseDownOnSelect: false
|
||||
};
|
||||
var select = $.Autocompleter.Select(options, input, selectCurrent, config);
|
||||
|
||||
var blockSubmit;
|
||||
|
||||
// prevent form submit in opera when selecting with return key
|
||||
$.browser.opera && $(input.form).bind("submit.autocomplete", function() {
|
||||
if (blockSubmit) {
|
||||
blockSubmit = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
// only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
|
||||
$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
|
||||
// a keypress means the input has focus
|
||||
// avoids issue where input had focus before the autocomplete was applied
|
||||
hasFocus = 1;
|
||||
// track last key pressed
|
||||
lastKeyPressCode = event.keyCode;
|
||||
switch(event.keyCode) {
|
||||
|
||||
case KEY.UP:
|
||||
event.preventDefault();
|
||||
if ( select.visible() ) {
|
||||
select.prev();
|
||||
} else {
|
||||
onChange(0, true);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.DOWN:
|
||||
event.preventDefault();
|
||||
if ( select.visible() ) {
|
||||
select.next();
|
||||
} else {
|
||||
onChange(0, true);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.PAGEUP:
|
||||
event.preventDefault();
|
||||
if ( select.visible() ) {
|
||||
select.pageUp();
|
||||
} else {
|
||||
onChange(0, true);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.PAGEDOWN:
|
||||
event.preventDefault();
|
||||
if ( select.visible() ) {
|
||||
select.pageDown();
|
||||
} else {
|
||||
onChange(0, true);
|
||||
}
|
||||
break;
|
||||
|
||||
// matches also semicolon
|
||||
case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
|
||||
case KEY.TAB:
|
||||
case KEY.RETURN:
|
||||
if( selectCurrent() ) {
|
||||
// stop default to prevent a form submit, Opera needs special handling
|
||||
event.preventDefault();
|
||||
blockSubmit = true;
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.ESC:
|
||||
select.hide();
|
||||
break;
|
||||
|
||||
default:
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(onChange, options.delay);
|
||||
break;
|
||||
}
|
||||
}).focus(function(){
|
||||
// track whether the field has focus, we shouldn't process any
|
||||
// results if the field no longer has focus
|
||||
hasFocus++;
|
||||
}).blur(function() {
|
||||
hasFocus = 0;
|
||||
if (!config.mouseDownOnSelect) {
|
||||
hideResults();
|
||||
}
|
||||
}).click(function() {
|
||||
// show select when clicking in a focused field
|
||||
if ( hasFocus++ > 1 && !select.visible() ) {
|
||||
onChange(0, true);
|
||||
}
|
||||
}).bind("search", function() {
|
||||
// TODO why not just specifying both arguments?
|
||||
var fn = (arguments.length > 1) ? arguments[1] : null;
|
||||
function findValueCallback(q, data) {
|
||||
var result;
|
||||
if( data && data.length ) {
|
||||
for (var i=0; i < data.length; i++) {
|
||||
if( data[i].result.toLowerCase() == q.toLowerCase() ) {
|
||||
result = data[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( typeof fn == "function" ) fn(result);
|
||||
else $input.trigger("result", result && [result.data, result.value]);
|
||||
}
|
||||
$.each(trimWords($input.val()), function(i, value) {
|
||||
request(value, findValueCallback, findValueCallback);
|
||||
});
|
||||
}).bind("flushCache", function() {
|
||||
cache.flush();
|
||||
}).bind("setOptions", function() {
|
||||
$.extend(options, arguments[1]);
|
||||
// if we've updated the data, repopulate
|
||||
if ( "data" in arguments[1] )
|
||||
cache.populate();
|
||||
}).bind("unautocomplete", function() {
|
||||
select.unbind();
|
||||
$input.unbind();
|
||||
$(input.form).unbind(".autocomplete");
|
||||
});
|
||||
|
||||
|
||||
function selectCurrent() {
|
||||
var selected = select.selected();
|
||||
if( !selected )
|
||||
return false;
|
||||
|
||||
var v = selected.result;
|
||||
previousValue = v;
|
||||
|
||||
if ( options.multiple ) {
|
||||
var words = trimWords($input.val());
|
||||
if ( words.length > 1 ) {
|
||||
var seperator = options.multipleSeparator.length;
|
||||
var cursorAt = $(input).selection().start;
|
||||
var wordAt, progress = 0;
|
||||
$.each(words, function(i, word) {
|
||||
progress += word.length;
|
||||
if (cursorAt <= progress) {
|
||||
wordAt = i;
|
||||
return false;
|
||||
}
|
||||
progress += seperator;
|
||||
});
|
||||
words[wordAt] = v;
|
||||
// TODO this should set the cursor to the right position, but it gets overriden somewhere
|
||||
//$.Autocompleter.Selection(input, progress + seperator, progress + seperator);
|
||||
v = words.join( options.multipleSeparator );
|
||||
}
|
||||
v += options.multipleSeparator;
|
||||
}
|
||||
|
||||
$input.val(v);
|
||||
hideResultsNow();
|
||||
$input.trigger("result", [selected.data, selected.value]);
|
||||
return true;
|
||||
}
|
||||
|
||||
function onChange(crap, skipPrevCheck) {
|
||||
if( lastKeyPressCode == KEY.DEL ) {
|
||||
select.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
var currentValue = $input.val();
|
||||
|
||||
if ( !skipPrevCheck && currentValue == previousValue )
|
||||
return;
|
||||
|
||||
previousValue = currentValue;
|
||||
|
||||
currentValue = lastWord(currentValue);
|
||||
if ( currentValue.length >= options.minChars) {
|
||||
$input.addClass(options.loadingClass);
|
||||
if (!options.matchCase)
|
||||
currentValue = currentValue.toLowerCase();
|
||||
request(currentValue, receiveData, hideResultsNow);
|
||||
} else {
|
||||
stopLoading();
|
||||
select.hide();
|
||||
}
|
||||
};
|
||||
|
||||
function trimWords(value) {
|
||||
if (!value)
|
||||
return [""];
|
||||
if (!options.multiple)
|
||||
return [$.trim(value)];
|
||||
return $.map(value.split(options.multipleSeparator), function(word) {
|
||||
return $.trim(value).length ? $.trim(word) : null;
|
||||
});
|
||||
}
|
||||
|
||||
function lastWord(value) {
|
||||
if ( !options.multiple )
|
||||
return value;
|
||||
var words = trimWords(value);
|
||||
if (words.length == 1)
|
||||
return words[0];
|
||||
var cursorAt = $(input).selection().start;
|
||||
if (cursorAt == value.length) {
|
||||
words = trimWords(value)
|
||||
} else {
|
||||
words = trimWords(value.replace(value.substring(cursorAt), ""));
|
||||
}
|
||||
return words[words.length - 1];
|
||||
}
|
||||
|
||||
// fills in the input box w/the first match (assumed to be the best match)
|
||||
// q: the term entered
|
||||
// sValue: the first matching result
|
||||
function autoFill(q, sValue){
|
||||
// autofill in the complete box w/the first match as long as the user hasn't entered in more data
|
||||
// if the last user key pressed was backspace, don't autofill
|
||||
if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
|
||||
// fill in the value (keep the case the user has typed)
|
||||
$input.val($input.val() + sValue.substring(lastWord(previousValue).length));
|
||||
// select the portion of the value not typed by the user (so the next character will erase)
|
||||
$(input).selection(previousValue.length, previousValue.length + sValue.length);
|
||||
}
|
||||
};
|
||||
|
||||
function hideResults() {
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(hideResultsNow, 200);
|
||||
};
|
||||
|
||||
function hideResultsNow() {
|
||||
var wasVisible = select.visible();
|
||||
select.hide();
|
||||
clearTimeout(timeout);
|
||||
stopLoading();
|
||||
if (options.mustMatch) {
|
||||
// call search and run callback
|
||||
$input.search(
|
||||
function (result){
|
||||
// if no value found, clear the input box
|
||||
if( !result ) {
|
||||
if (options.multiple) {
|
||||
var words = trimWords($input.val()).slice(0, -1);
|
||||
$input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
|
||||
}
|
||||
else {
|
||||
$input.val( "" );
|
||||
$input.trigger("result", null);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
function receiveData(q, data) {
|
||||
if ( data && data.length && hasFocus ) {
|
||||
stopLoading();
|
||||
select.display(data, q);
|
||||
autoFill(q, data[0].value);
|
||||
select.show();
|
||||
} else {
|
||||
hideResultsNow();
|
||||
}
|
||||
};
|
||||
|
||||
function request(term, success, failure) {
|
||||
if (!options.matchCase)
|
||||
term = term.toLowerCase();
|
||||
var data = cache.load(term);
|
||||
// recieve the cached data
|
||||
if (data && data.length) {
|
||||
success(term, data);
|
||||
}
|
||||
// if function was supplied
|
||||
else if(options.func)
|
||||
{
|
||||
var extraParams = {
|
||||
timestamp: +new Date()
|
||||
};
|
||||
$.each(options.extraParams, function(key, param) {
|
||||
extraParams[key] = typeof param == "function" ? param() : param;
|
||||
});
|
||||
|
||||
options.func({
|
||||
data: $.extend({
|
||||
q: lastWord(term),
|
||||
limit: options.max
|
||||
}, extraParams)},
|
||||
function(data){
|
||||
var parsed = options.parse && options.parse(data) || parse(data);
|
||||
cache.add(term, parsed)
|
||||
success(term, parsed);
|
||||
}
|
||||
);
|
||||
}
|
||||
// if an AJAX url has been supplied, try loading the data now
|
||||
else if( (typeof options.url == "string") && (options.url.length > 0) ){
|
||||
|
||||
var extraParams = {
|
||||
timestamp: +new Date()
|
||||
};
|
||||
$.each(options.extraParams, function(key, param) {
|
||||
extraParams[key] = typeof param == "function" ? param() : param;
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
// try to leverage ajaxQueue plugin to abort previous requests
|
||||
mode: "abort",
|
||||
// limit abortion to this input
|
||||
port: "autocomplete" + input.name,
|
||||
dataType: options.dataType,
|
||||
url: options.url,
|
||||
data: $.extend({
|
||||
q: lastWord(term),
|
||||
limit: options.max
|
||||
}, extraParams),
|
||||
success: function(data) {
|
||||
var parsed = options.parse && options.parse(data) || parse(data);
|
||||
cache.add(term, parsed);
|
||||
success(term, parsed);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
|
||||
select.emptyList();
|
||||
failure(term);
|
||||
}
|
||||
};
|
||||
|
||||
function parse(data) {
|
||||
var parsed = [];
|
||||
var rows = data.split("\n");
|
||||
for (var i=0; i < rows.length; i++) {
|
||||
var row = $.trim(rows[i]);
|
||||
if (row) {
|
||||
row = row.split("|");
|
||||
parsed[parsed.length] = {
|
||||
data: row,
|
||||
value: row[0],
|
||||
result: options.formatResult && options.formatResult(row, row[0]) || row[0]
|
||||
};
|
||||
}
|
||||
}
|
||||
return parsed;
|
||||
};
|
||||
|
||||
function stopLoading() {
|
||||
$input.removeClass(options.loadingClass);
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
$.Autocompleter.defaults = {
|
||||
inputClass: "ac_input",
|
||||
resultsClass: "ac_results",
|
||||
loadingClass: "ac_loading",
|
||||
minChars: 1,
|
||||
delay: 400,
|
||||
matchCase: false,
|
||||
matchSubset: true,
|
||||
matchContains: false,
|
||||
cacheLength: 10,
|
||||
max: 100,
|
||||
mustMatch: false,
|
||||
extraParams: {},
|
||||
selectFirst: true,
|
||||
formatItem: function(row) { return row[0]; },
|
||||
formatMatch: null,
|
||||
autoFill: false,
|
||||
width: 0,
|
||||
multiple: false,
|
||||
multipleSeparator: ", ",
|
||||
highlight: function(value, term) {
|
||||
return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
|
||||
},
|
||||
scroll: true,
|
||||
scrollHeight: 180
|
||||
};
|
||||
|
||||
$.Autocompleter.Cache = function(options) {
|
||||
|
||||
var data = {};
|
||||
var length = 0;
|
||||
|
||||
function matchSubset(s, sub) {
|
||||
if (!options.matchCase)
|
||||
s = s.toLowerCase();
|
||||
var i = s.indexOf(sub);
|
||||
if (options.matchContains == "word"){
|
||||
i = s.toLowerCase().search("\\b" + sub.toLowerCase());
|
||||
}
|
||||
if (i == -1) return false;
|
||||
return i == 0 || options.matchContains;
|
||||
};
|
||||
|
||||
function add(q, value) {
|
||||
if (length > options.cacheLength){
|
||||
flush();
|
||||
}
|
||||
if (!data[q]){
|
||||
length++;
|
||||
}
|
||||
data[q] = value;
|
||||
}
|
||||
|
||||
function populate(){
|
||||
if( !options.data ) return false;
|
||||
// track the matches
|
||||
var stMatchSets = {},
|
||||
nullData = 0;
|
||||
|
||||
// no url was specified, we need to adjust the cache length to make sure it fits the local data store
|
||||
if( !options.url && !options.func ) options.cacheLength = 1;
|
||||
|
||||
// track all options for minChars = 0
|
||||
stMatchSets[""] = [];
|
||||
|
||||
// loop through the array and create a lookup structure
|
||||
for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
|
||||
var rawValue = options.data[i];
|
||||
// if rawValue is a string, make an array otherwise just reference the array
|
||||
rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
|
||||
|
||||
var value = options.formatMatch(rawValue, i+1, options.data.length);
|
||||
if ( value === false )
|
||||
continue;
|
||||
|
||||
var firstChar = value.charAt(0).toLowerCase();
|
||||
// if no lookup array for this character exists, look it up now
|
||||
if( !stMatchSets[firstChar] )
|
||||
stMatchSets[firstChar] = [];
|
||||
|
||||
// if the match is a string
|
||||
var row = {
|
||||
value: value,
|
||||
data: rawValue,
|
||||
result: options.formatResult && options.formatResult(rawValue) || value
|
||||
};
|
||||
|
||||
// push the current match into the set list
|
||||
stMatchSets[firstChar].push(row);
|
||||
|
||||
// keep track of minChars zero items
|
||||
if ( nullData++ < options.max ) {
|
||||
stMatchSets[""].push(row);
|
||||
}
|
||||
};
|
||||
|
||||
// add the data items to the cache
|
||||
$.each(stMatchSets, function(i, value) {
|
||||
// increase the cache size
|
||||
options.cacheLength++;
|
||||
// add to the cache
|
||||
add(i, value);
|
||||
});
|
||||
}
|
||||
|
||||
// populate any existing data
|
||||
setTimeout(populate, 25);
|
||||
|
||||
function flush(){
|
||||
data = {};
|
||||
length = 0;
|
||||
}
|
||||
|
||||
return {
|
||||
flush: flush,
|
||||
add: add,
|
||||
populate: populate,
|
||||
load: function(q) {
|
||||
if (!options.cacheLength || !length)
|
||||
return null;
|
||||
/*
|
||||
* if dealing w/local data and matchContains than we must make sure
|
||||
* to loop through all the data collections looking for matches
|
||||
*/
|
||||
if( (!options.url && !options.func) && options.matchContains ){
|
||||
// track all matches
|
||||
var csub = [];
|
||||
// loop through all the data grids for matches
|
||||
for( var k in data ){
|
||||
// don't search through the stMatchSets[""] (minChars: 0) cache
|
||||
// this prevents duplicates
|
||||
if( k.length > 0 ){
|
||||
var c = data[k];
|
||||
$.each(c, function(i, x) {
|
||||
// if we've got a match, add it to the array
|
||||
if (matchSubset(x.value, q)) {
|
||||
csub.push(x);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return csub;
|
||||
} else
|
||||
// if the exact item exists, use it
|
||||
if (data[q]){
|
||||
return data[q];
|
||||
} else
|
||||
if (options.matchSubset) {
|
||||
for (var i = q.length - 1; i >= options.minChars; i--) {
|
||||
var c = data[q.substr(0, i)];
|
||||
if (c) {
|
||||
var csub = [];
|
||||
$.each(c, function(i, x) {
|
||||
if (matchSubset(x.value, q)) {
|
||||
csub[csub.length] = x;
|
||||
}
|
||||
});
|
||||
return csub;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
$.Autocompleter.Select = function (options, input, select, config) {
|
||||
var CLASSES = {
|
||||
ACTIVE: "ac_over"
|
||||
};
|
||||
|
||||
var listItems,
|
||||
active = -1,
|
||||
data,
|
||||
term = "",
|
||||
needsInit = true,
|
||||
element,
|
||||
list;
|
||||
|
||||
// Create results
|
||||
function init() {
|
||||
if (!needsInit)
|
||||
return;
|
||||
element = $("<div/>")
|
||||
.hide()
|
||||
.addClass(options.resultsClass)
|
||||
.css("position", "absolute")
|
||||
.appendTo(document.body);
|
||||
|
||||
list = $("<ul/>").appendTo(element).mouseover( function(event) {
|
||||
if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
|
||||
active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
|
||||
$(target(event)).addClass(CLASSES.ACTIVE);
|
||||
}
|
||||
}).click(function(event) {
|
||||
$(target(event)).addClass(CLASSES.ACTIVE);
|
||||
select();
|
||||
// TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
|
||||
input.focus();
|
||||
return false;
|
||||
}).mousedown(function() {
|
||||
config.mouseDownOnSelect = true;
|
||||
}).mouseup(function() {
|
||||
config.mouseDownOnSelect = false;
|
||||
});
|
||||
|
||||
if( options.width > 0 )
|
||||
element.css("width", options.width);
|
||||
|
||||
needsInit = false;
|
||||
}
|
||||
|
||||
function target(event) {
|
||||
var element = event.target;
|
||||
while(element && element.tagName.toUpperCase() != "LI")
|
||||
element = element.parentNode;
|
||||
// more fun with IE, sometimes event.target is empty, just ignore it then
|
||||
if(!element)
|
||||
return [];
|
||||
return element;
|
||||
}
|
||||
|
||||
function moveSelect(step) {
|
||||
listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
|
||||
movePosition(step);
|
||||
var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
|
||||
if(options.scroll) {
|
||||
var offset = 0;
|
||||
listItems.slice(0, active).each(function() {
|
||||
offset += this.offsetHeight;
|
||||
});
|
||||
if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
|
||||
list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
|
||||
} else if(offset < list.scrollTop()) {
|
||||
list.scrollTop(offset);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function movePosition(step) {
|
||||
active += step;
|
||||
if (active < 0) {
|
||||
active = listItems.size() - 1;
|
||||
} else if (active >= listItems.size()) {
|
||||
active = 0;
|
||||
}
|
||||
}
|
||||
|
||||
function limitNumberOfItems(available) {
|
||||
return options.max && options.max < available
|
||||
? options.max
|
||||
: available;
|
||||
}
|
||||
|
||||
function fillList() {
|
||||
list.empty();
|
||||
var max = limitNumberOfItems(data.length);
|
||||
for (var i=0; i < max; i++) {
|
||||
if (!data[i])
|
||||
continue;
|
||||
var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
|
||||
if ( formatted === false )
|
||||
continue;
|
||||
var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
|
||||
$.data(li, "ac_data", data[i]);
|
||||
}
|
||||
listItems = list.find("li");
|
||||
if ( options.selectFirst ) {
|
||||
listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
|
||||
active = 0;
|
||||
}
|
||||
// apply bgiframe if available
|
||||
if ( $.fn.bgiframe )
|
||||
list.bgiframe();
|
||||
}
|
||||
|
||||
return {
|
||||
display: function(d, q) {
|
||||
init();
|
||||
data = d;
|
||||
term = q;
|
||||
fillList();
|
||||
},
|
||||
next: function() {
|
||||
moveSelect(1);
|
||||
},
|
||||
prev: function() {
|
||||
moveSelect(-1);
|
||||
},
|
||||
pageUp: function() {
|
||||
if (active != 0 && active - 8 < 0) {
|
||||
moveSelect( -active );
|
||||
} else {
|
||||
moveSelect(-8);
|
||||
}
|
||||
},
|
||||
pageDown: function() {
|
||||
if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
|
||||
moveSelect( listItems.size() - 1 - active );
|
||||
} else {
|
||||
moveSelect(8);
|
||||
}
|
||||
},
|
||||
hide: function() {
|
||||
element && element.hide();
|
||||
listItems && listItems.removeClass(CLASSES.ACTIVE);
|
||||
active = -1;
|
||||
},
|
||||
visible : function() {
|
||||
return element && element.is(":visible");
|
||||
},
|
||||
current: function() {
|
||||
return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
|
||||
},
|
||||
show: function() {
|
||||
var offset = $(input).offset();
|
||||
element.css({
|
||||
width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
|
||||
top: offset.top + input.offsetHeight,
|
||||
left: offset.left
|
||||
}).show();
|
||||
if(options.scroll) {
|
||||
list.scrollTop(0);
|
||||
list.css({
|
||||
maxHeight: options.scrollHeight,
|
||||
overflow: 'auto'
|
||||
});
|
||||
|
||||
if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
|
||||
var listHeight = 0;
|
||||
listItems.each(function() {
|
||||
listHeight += this.offsetHeight;
|
||||
});
|
||||
var scrollbarsVisible = listHeight > options.scrollHeight;
|
||||
list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
|
||||
if (!scrollbarsVisible) {
|
||||
// IE doesn't recalculate width when scrollbar disappears
|
||||
listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
selected: function() {
|
||||
var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
|
||||
return selected && selected.length && $.data(selected[0], "ac_data");
|
||||
},
|
||||
emptyList: function (){
|
||||
list && list.empty();
|
||||
},
|
||||
unbind: function() {
|
||||
element && element.remove();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
$.fn.selection = function(start, end) {
|
||||
if (start !== undefined) {
|
||||
return this.each(function() {
|
||||
if( this.createTextRange ){
|
||||
var selRange = this.createTextRange();
|
||||
if (end === undefined || start == end) {
|
||||
selRange.move("character", start);
|
||||
selRange.select();
|
||||
} else {
|
||||
selRange.collapse(true);
|
||||
selRange.moveStart("character", start);
|
||||
selRange.moveEnd("character", end);
|
||||
selRange.select();
|
||||
}
|
||||
} else if( this.setSelectionRange ){
|
||||
this.setSelectionRange(start, end);
|
||||
} else if( this.selectionStart ){
|
||||
this.selectionStart = start;
|
||||
this.selectionEnd = end;
|
||||
}
|
||||
});
|
||||
}
|
||||
var field = this[0];
|
||||
if ( field.createTextRange ) {
|
||||
var range = document.selection.createRange(),
|
||||
orig = field.value,
|
||||
teststring = "<->",
|
||||
textLength = range.text.length;
|
||||
range.text = teststring;
|
||||
var caretAt = field.value.indexOf(teststring);
|
||||
field.value = orig;
|
||||
this.selection(caretAt, caretAt + textLength);
|
||||
return {
|
||||
start: caretAt,
|
||||
end: caretAt + textLength
|
||||
}
|
||||
} else if( field.selectionStart !== undefined ){
|
||||
return {
|
||||
start: field.selectionStart,
|
||||
end: field.selectionEnd
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
15
src/jquery/jquery.autocomplete.min.js
vendored
|
|
@ -36,9 +36,12 @@ class DefaultLang
|
|||
'advanced_add' => "Advanced",
|
||||
'searching' => "Searching for",
|
||||
'tasks' => "Tasks",
|
||||
'taskdate_inline' => "added at %s",
|
||||
'taskdate_created' => "Date of creation",
|
||||
'taskdate_completed' => "Date of completion",
|
||||
'taskdate_inline_created' => "Created: %s",
|
||||
'taskdate_inline_completed' => "Completed: %s",
|
||||
'taskdate_inline_duedate' => "Due: %s",
|
||||
'taskdate_created' => "Created",
|
||||
'taskdate_completed' => "Completed",
|
||||
'go_back' => "<< Back",
|
||||
'edit_task' => "Edit Task",
|
||||
'add_task' => "New Task",
|
||||
'priority' => "Priority",
|
||||
|
|
@ -83,13 +86,18 @@ class DefaultLang
|
|||
'list_publish' => "Publish list",
|
||||
'list_showcompleted' => "Show completed tasks",
|
||||
'list_clearcompleted' => "Clear completed tasks",
|
||||
'list_select' => "Select list",
|
||||
'list_exportcsv' => "Export to CSV",
|
||||
'list_rssfeed' => "RSS Feed",
|
||||
'alltags' => "All tags:",
|
||||
'alltags_show' => "Show all",
|
||||
'alltags_hide' => "Hide all",
|
||||
'a_settings' => "Settings",
|
||||
'rss_feed' => "RSS Feed",
|
||||
'feed_title' => "%s",
|
||||
'feed_description' => "New tasks in %s",
|
||||
'feed_completed_tasks' => "Completed tasks",
|
||||
'feed_modified_tasks' => "Modified tasks",
|
||||
'feed_new_tasks' => "New tasks",
|
||||
|
||||
/* Settings */
|
||||
'set_header' => "Settings",
|
||||
|
|
@ -147,8 +155,17 @@ class DefaultLang
|
|||
$t = array();
|
||||
foreach($this->get('months_long') as $v) { $t[] = '"'.str_replace('"','\\"',$v).'"'; }
|
||||
$a[] = "monthsLong: [". implode(',', $t). "]";
|
||||
$a[] = "tags: \"". str_replace('"','\\"',$this->get('tags')). "\"";
|
||||
return "lang = {\n". implode(",\n", $a). "\n};";
|
||||
$a[] = $this->_2js('tags');
|
||||
$a[] = $this->_2js('tasks');
|
||||
$a[] = $this->_2js('f_past');
|
||||
$a[] = $this->_2js('f_today');
|
||||
$a[] = $this->_2js('f_soon');
|
||||
return "{\n". implode(",\n", $a). "\n}";
|
||||
}
|
||||
|
||||
function _2js($v)
|
||||
{
|
||||
return "$v: \"". str_replace('"','\\"',$this->get($v)). "\"";
|
||||
}
|
||||
|
||||
function get($key)
|
||||
|
|
|
|||
|
|
@ -38,9 +38,12 @@ class Lang extends DefaultLang
|
|||
'advanced_add' => "Advanced",
|
||||
'searching' => "Searching for",
|
||||
'tasks' => "Tasks",
|
||||
'taskdate_inline' => "added at %s",
|
||||
'taskdate_created' => "Date of creation",
|
||||
'taskdate_completed' => "Date of completion",
|
||||
'taskdate_inline_created' => "Created: %s",
|
||||
'taskdate_inline_completed' => "Completed: %s",
|
||||
'taskdate_inline_duedate' => "Due: %s",
|
||||
'taskdate_created' => "Created",
|
||||
'taskdate_completed' => "Completed",
|
||||
'go_back' => "<< Back",
|
||||
'edit_task' => "Edit Task",
|
||||
'add_task' => "New Task",
|
||||
'priority' => "Priority",
|
||||
|
|
@ -85,13 +88,18 @@ class Lang extends DefaultLang
|
|||
'list_publish' => "Publish list",
|
||||
'list_showcompleted' => "Show completed tasks",
|
||||
'list_clearcompleted' => "Clear completed tasks",
|
||||
'list_select' => "Select list",
|
||||
'list_exportcsv' => "Export to CSV",
|
||||
'list_rssfeed' => "RSS Feed",
|
||||
'alltags' => "All tags:",
|
||||
'alltags_show' => "Show all",
|
||||
'alltags_hide' => "Hide all",
|
||||
'a_settings' => "Settings",
|
||||
'rss_feed' => "RSS Feed",
|
||||
'feed_title' => "%s",
|
||||
'feed_description' => "New tasks in %s",
|
||||
'feed_completed_tasks' => "Completed tasks",
|
||||
'feed_modified_tasks' => "Modified tasks",
|
||||
'feed_new_tasks' => "New tasks",
|
||||
|
||||
/* Settings */
|
||||
'set_header' => "Settings",
|
||||
|
|
|
|||
1936
src/mytinytodo.js
Normal file
168
src/mytinytodo_ajax_storage.js
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
This file is a part of myTinyTodo.
|
||||
(C) Copyright 2010 Max Pozdeev <maxpozdeev@gmail.com>
|
||||
Licensed under the GNU GPL v3 license. See file COPYRIGHT for details.
|
||||
*/
|
||||
|
||||
// AJAX myTinyTodo Storage
|
||||
|
||||
(function(){
|
||||
|
||||
var mtt;
|
||||
|
||||
function mytinytodoStorageAjax(amtt)
|
||||
{
|
||||
this.mtt = mtt = amtt;
|
||||
}
|
||||
|
||||
window.mytinytodoStorageAjax = mytinytodoStorageAjax;
|
||||
|
||||
mytinytodoStorageAjax.prototype =
|
||||
{
|
||||
/* required method */
|
||||
request:function(action, params, callback)
|
||||
{
|
||||
if(!this[action]) throw "Unknown storage action: "+action;
|
||||
|
||||
this[action](params, function(json){
|
||||
if(json.denied) mtt.errorDenied();
|
||||
if(callback) callback.call(mtt, json)
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
loadLists: function(params, callback)
|
||||
{
|
||||
$.getJSON(this.mtt.mttUrl+'ajax.php?loadLists'+'&rnd='+Math.random(), callback);
|
||||
},
|
||||
|
||||
|
||||
loadTasks: function(params, callback)
|
||||
{
|
||||
var q = '';
|
||||
if(params.search && params.search != '') q += '&s='+encodeURIComponent(params.search);
|
||||
if(params.tag && params.tag != '') q += '&t='+encodeURIComponent(params.tag);
|
||||
if(params.setCompl && params.setCompl != 0) q += '&setCompl=1';
|
||||
q += '&rnd='+Math.random();
|
||||
|
||||
/* $.getJSON(mtt.mttUrl+'ajax.php?loadTasks&list='+params.list+'&compl='+params.compl+'&sort='+params.sort+'&tz='+params.tz+q, function(json){
|
||||
callback.call(mtt, json);
|
||||
})
|
||||
*/
|
||||
|
||||
$.getJSON(this.mtt.mttUrl+'ajax.php?loadTasks&list='+params.list+'&compl='+params.compl+'&sort='+params.sort+'&tz='+params.tz+q, callback);
|
||||
},
|
||||
|
||||
|
||||
newTask: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?newTask',
|
||||
{ list:params.list, title: params.title, tz:params.tz, tag:params.tag }, callback, 'json');
|
||||
},
|
||||
|
||||
|
||||
fullNewTask: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?fullNewTask',
|
||||
{ list:params.list, tz:params.tz, title:params.title, note:params.note, prio:params.prio, tags:params.tags, duedate:params.duedate },
|
||||
callback, 'json');
|
||||
},
|
||||
|
||||
|
||||
editTask: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?editTask='+params.id,
|
||||
{ id:params.id, list:params.list, tz:params.tz, title:params.title, note:params.note, prio:params.prio, tags:params.tags, duedate:params.duedate },
|
||||
callback, 'json');
|
||||
},
|
||||
|
||||
|
||||
editNote: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?editNote='+params.id, {id:params.id, note: params.note}, callback, 'json');
|
||||
},
|
||||
|
||||
|
||||
completeTask: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?completeTask='+params.id, { id:params.id, compl:params.compl, tz:params.tz }, callback, 'json');
|
||||
},
|
||||
|
||||
|
||||
deleteTask: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?deleteTask='+params.id, { id:params.id }, callback, 'json');
|
||||
},
|
||||
|
||||
|
||||
setPrio: function(params, callback)
|
||||
{
|
||||
$.getJSON(this.mtt.mttUrl+'ajax.php?setPrio='+params.id+'&prio='+params.prio+'&rnd='+Math.random(), callback);
|
||||
},
|
||||
|
||||
|
||||
setSort: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?setSort', { list:params.list, sort:params.sort }, callback, 'json');
|
||||
},
|
||||
|
||||
changeOrder: function(params, callback)
|
||||
{
|
||||
var order = '';
|
||||
for(var i in params.order) {
|
||||
order += params.order[i].id +'='+ params.order[i].diff + '&';
|
||||
}
|
||||
$.post(this.mtt.mttUrl+'ajax.php?changeOrder', { order:order }, callback, 'json');
|
||||
},
|
||||
|
||||
tagCloud: function(params, callback)
|
||||
{
|
||||
$.getJSON(this.mtt.mttUrl+'ajax.php?tagCloud&list='+params.list+'&rnd='+Math.random(), callback);
|
||||
},
|
||||
|
||||
moveTask: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?moveTask', { id:params.id, from:params.from, to:params.to }, callback, 'json');
|
||||
},
|
||||
|
||||
parseTaskStr: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?parseTaskStr', { list:params.list, title:params.title, tz:params.tz, tag:params.tag }, callback, 'json');
|
||||
},
|
||||
|
||||
|
||||
// Lists
|
||||
addList: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?addList', { name:params.name }, callback, 'json');
|
||||
|
||||
},
|
||||
|
||||
renameList: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?renameList', { list:params.list, name:params.name }, callback, 'json');
|
||||
},
|
||||
|
||||
deleteList: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?deleteList', { list:params.list }, callback, 'json');
|
||||
},
|
||||
|
||||
publishList: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?publishList', { list:params.list, publish:params.publish }, callback, 'json');
|
||||
},
|
||||
|
||||
changeListOrder: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?changeListOrder', { order:params.order }, callback, 'json');
|
||||
},
|
||||
|
||||
clearCompletedInList: function(params, callback)
|
||||
{
|
||||
$.post(this.mtt.mttUrl+'ajax.php?clearCompletedInList', { list:params.list }, callback, 'json');
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
})();
|
||||
|
|
@ -7,6 +7,6 @@ require_once(MTTPATH. 'lang/class.default.php');
|
|||
require_once(MTTPATH. 'lang/'. $config['lang']. '.php');
|
||||
|
||||
header('Content-type: text/javascript');
|
||||
echo Lang::instance()->makeJS();
|
||||
echo "mytinytodo.lang.init(". Lang::instance()->makeJS() .");";
|
||||
|
||||
?>
|
||||
|
|
@ -12,7 +12,7 @@ $lang = Lang::instance();
|
|||
|
||||
if($needAuth && !is_logged())
|
||||
{
|
||||
die("Access denied!<br> Disable password protection or Log in.");
|
||||
die("Access denied!<br/> Disable password protection or Log in.");
|
||||
}
|
||||
|
||||
if(isset($_POST['save']))
|
||||
|
|
@ -67,120 +67,122 @@ function selectOptions($a, $value, $default=null)
|
|||
$s = '';
|
||||
if($default !== null && !isset($a[$value])) $value = $default;
|
||||
foreach($a as $k=>$v) {
|
||||
$s .= '<option value="'.htmlspecialchars($k).'" '.($k===$value?'selected':'').'>'.htmlspecialchars($v).'</option>';
|
||||
$s .= '<option value="'.htmlspecialchars($k).'" '.($k===$value?'selected="selected"':'').'>'.htmlspecialchars($v).'</option>';
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<div><a href="#" class="mtt-back-button"><?php _e('go_back');?></a></div>
|
||||
|
||||
<h3><?php _e('set_header');?></h3>
|
||||
|
||||
<div id="settings_msg" style="display:none"></div>
|
||||
|
||||
<form method="post" action="settings.php" onSubmit="saveSettings(this);return false;">
|
||||
<form id="settings_form" method="post" action="settings.php">
|
||||
|
||||
<table class="mtt-settings-table">
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_title');?>:<br><span class="descr"><?php _e('set_title_descr');?></span></th>
|
||||
<td> <input name="title" value="<?php echo htmlspecialchars(_c('title'));?>" class="in350"> </td>
|
||||
<th><?php _e('set_title');?>:<br/><span class="descr"><?php _e('set_title_descr');?></span></th>
|
||||
<td> <input name="title" value="<?php echo htmlspecialchars(_c('title'));?>" class="in350" /> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_language');?>:</th>
|
||||
<td> <SELECT name="lang"><?php $langs = getLangs(); echo selectOptions($langs, _c('lang')); ?></SELECT> </td>
|
||||
<td> <select name="lang"><?php $langs = getLangs(); echo selectOptions($langs, _c('lang')); ?></select> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_protection');?>:</th>
|
||||
<td>
|
||||
<label><input type="radio" name="allowpassword" value="1" <?php if(_c('password')!='') echo "checked"; ?> onClick='$(this.form).find("input[name=password]").attr("disabled",false)'><?php _e('set_enabled');?></label> <br>
|
||||
<label><input type="radio" name="allowpassword" value="0" <?php if(_c('password')=='') echo "checked"; ?> onClick='$(this.form).find("input[name=password]").attr("disabled","disabled")'><?php _e('set_disabled');?></label> <br>
|
||||
<label><input type="radio" name="allowpassword" value="1" <?php if(_c('password')!='') echo 'checked="checked"'; ?> onclick='$(this.form).find("input[name=password]").attr("disabled",false)' /><?php _e('set_enabled');?></label> <br/>
|
||||
<label><input type="radio" name="allowpassword" value="0" <?php if(_c('password')=='') echo 'checked="checked"'; ?> onclick='$(this.form).find("input[name=password]").attr("disabled","disabled")' /><?php _e('set_disabled');?></label> <br/>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_newpass');?>:<br><span class="descr"><?php _e('set_newpass_descr');?></span></th>
|
||||
<td> <input type="password" name="password" <?php if(_c('password')=='') echo "disabled"; ?>> </td>
|
||||
<th><?php _e('set_newpass');?>:<br/><span class="descr"><?php _e('set_newpass_descr');?></span></th>
|
||||
<td> <input type="password" name="password" <?php if(_c('password')=='') echo "disabled"; ?> /> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_smartsyntax');?>:<br><span class="descr"><?php _e('set_smartsyntax_descr');?></span></th>
|
||||
<th><?php _e('set_smartsyntax');?>:<br/><span class="descr"><?php _e('set_smartsyntax_descr');?></span></th>
|
||||
<td>
|
||||
<label><input type="radio" name="smartsyntax" value="1" <?php if(_c('smartsyntax')) echo "checked"; ?>><?php _e('set_enabled');?></label> <br>
|
||||
<label><input type="radio" name="smartsyntax" value="0" <?php if(!_c('smartsyntax')) echo "checked"; ?>><?php _e('set_disabled');?></label>
|
||||
<label><input type="radio" name="smartsyntax" value="1" <?php if(_c('smartsyntax')) echo 'checked="checked"'; ?> /><?php _e('set_enabled');?></label> <br/>
|
||||
<label><input type="radio" name="smartsyntax" value="0" <?php if(!_c('smartsyntax')) echo 'checked="checked"'; ?> /><?php _e('set_disabled');?></label>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_autotz');?>:<br><span class="descr"><?php _e('set_autotz_descr');?></span></th>
|
||||
<th><?php _e('set_autotz');?>:<br/><span class="descr"><?php _e('set_autotz_descr');?></span></th>
|
||||
<td>
|
||||
<label><input type="radio" name="autotz" value="1" <?php if(_c('autotz')) echo "checked"; ?>><?php _e('set_enabled');?></label> <br>
|
||||
<label><input type="radio" name="autotz" value="0" <?php if(!_c('autotz')) echo "checked"; ?>><?php _e('set_disabled');?></label>
|
||||
<label><input type="radio" name="autotz" value="1" <?php if(_c('autotz')) echo 'checked="checked"'; ?> /><?php _e('set_enabled');?></label> <br/>
|
||||
<label><input type="radio" name="autotz" value="0" <?php if(!_c('autotz')) echo 'checked="checked"'; ?> /><?php _e('set_disabled');?></label>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_autotag');?>:<br><span class="descr"><?php _e('set_autotag_descr');?></span></th>
|
||||
<th><?php _e('set_autotag');?>:<br/><span class="descr"><?php _e('set_autotag_descr');?></span></th>
|
||||
<td>
|
||||
<label><input type="radio" name="autotag" value="1" <?php if(_c('autotag')) echo "checked"; ?>><?php _e('set_enabled');?></label> <br>
|
||||
<label><input type="radio" name="autotag" value="0" <?php if(!_c('autotag')) echo "checked"; ?>><?php _e('set_disabled');?></label>
|
||||
<label><input type="radio" name="autotag" value="1" <?php if(_c('autotag')) echo 'checked="checked"'; ?> /><?php _e('set_enabled');?></label> <br/>
|
||||
<label><input type="radio" name="autotag" value="0" <?php if(!_c('autotag')) echo 'checked="checked"'; ?> /><?php _e('set_disabled');?></label>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_sessions');?>:</th>
|
||||
<td>
|
||||
<label><input type="radio" name="session" value="default" <?php if(_c('session')=='default') echo "checked"; ?>><?php _e('set_sessions_php');?></label> <br>
|
||||
<label><input type="radio" name="session" value="files" <?php if(_c('session')=='files') echo "checked"; ?>><?php _e('set_sessions_files');?></label> <span class="descr">(<mytinytodo_dir>/tmp/sessions)</span>
|
||||
<label><input type="radio" name="session" value="default" <?php if(_c('session')=='default') echo 'checked="checked"'; ?> /><?php _e('set_sessions_php');?></label> <br/>
|
||||
<label><input type="radio" name="session" value="files" <?php if(_c('session')=='files') echo 'checked="checked"'; ?> /><?php _e('set_sessions_files');?></label> <span class="descr">(<mytinytodo_dir>/tmp/sessions)</span>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_firstdayofweek');?>:</th>
|
||||
<td>
|
||||
<SELECT name="firstdayofweek"><?php echo selectOptions(__('days_long'), _c('firstdayofweek')); ?></SELECT>
|
||||
<select name="firstdayofweek"><?php echo selectOptions(__('days_long'), _c('firstdayofweek')); ?></select>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_duedate');?>:</th>
|
||||
<td>
|
||||
<SELECT name="duedateformat"><?php echo selectOptions(array(1=>'yyyy-mm-dd ('.date('Y-m-d').')', 2=>'m/d/yyyy ('.date('n/j/Y').')', 3=>'dd.mm.yyyy ('.date('d.m.Y').')', 4=>'dd/mm/yyyy ('.date('d/m/Y').')'), _c('duedateformat')); ?></SELECT>
|
||||
<select name="duedateformat"><?php echo selectOptions(array(1=>'yyyy-mm-dd ('.date('Y-m-d').')', 2=>'m/d/yyyy ('.date('n/j/Y').')', 3=>'dd.mm.yyyy ('.date('d.m.Y').')', 4=>'dd/mm/yyyy ('.date('d/m/Y').')'), _c('duedateformat')); ?></select>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_date');?>:</th>
|
||||
<td>
|
||||
<input name="dateformat" value="<?php echo htmlspecialchars(_c('dateformat'));?>">
|
||||
<SELECT onChange="if(this.value!=0) this.form.dateformat.value=this.value;">
|
||||
<input name="dateformat" value="<?php echo htmlspecialchars(_c('dateformat'));?>" />
|
||||
<select onchange="if(this.value!=0) this.form.dateformat.value=this.value;">
|
||||
<?php echo selectOptions(array('F j, Y'=>formatTime('F j, Y'), 'M d, Y'=>formatTime('M d, Y'), 'j M Y'=>formatTime('j M Y'), 'd F Y'=>formatTime('d F Y'),
|
||||
'n/j/Y'=>formatTime('n/j/Y'), 'd.m.Y'=>formatTime('d.m.Y'), 'j. F Y'=>formatTime('j. F Y'), 0=>'Custom'), _c('dateformat'), 0); ?>
|
||||
</SELECT>
|
||||
</select>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_shortdate');?>:</th>
|
||||
<td>
|
||||
<input name="dateformatshort" value="<?php echo htmlspecialchars(_c('dateformatshort'));?>">
|
||||
<SELECT onChange="if(this.value!=0) this.form.dateformatshort.value=this.value;">
|
||||
<input name="dateformatshort" value="<?php echo htmlspecialchars(_c('dateformatshort'));?>" />
|
||||
<select onchange="if(this.value!=0) this.form.dateformatshort.value=this.value;">
|
||||
<?php echo selectOptions(array('M d'=>formatTime('M d'), 'j M'=>formatTime('j M'), 'n/j'=>formatTime('n/j'), 'd.m'=>formatTime('d.m'), 0=>'Custom'), _c('dateformatshort'), 0); ?>
|
||||
</SELECT>
|
||||
</select>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_clock');?>:</th>
|
||||
<td>
|
||||
<SELECT name="clock"><?php echo selectOptions(array(12=>__('set_12hour').' ('.date('g:i A').')', 24=>__('set_24hour').' ('.date('H:i').')'), _c('clock')); ?></SELECT>
|
||||
<select name="clock"><?php echo selectOptions(array(12=>__('set_12hour').' ('.date('g:i A').')', 24=>__('set_24hour').' ('.date('H:i').')'), _c('clock')); ?></select>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<th><?php _e('set_showdate');?>:</th>
|
||||
<td>
|
||||
<label><input type="radio" name="showdate" value="1" <?php if(_c('showdate')) echo "checked"; ?>><?php _e('set_enabled');?></label> <br>
|
||||
<label><input type="radio" name="showdate" value="0" <?php if(!_c('showdate')) echo "checked"; ?>><?php _e('set_disabled');?></label>
|
||||
<label><input type="radio" name="showdate" value="1" <?php if(_c('showdate')) echo 'checked="checked"'; ?> /><?php _e('set_enabled');?></label> <br/>
|
||||
<label><input type="radio" name="showdate" value="0" <?php if(!_c('showdate')) echo 'checked="checked"'; ?> /><?php _e('set_disabled');?></label>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr><td colspan="2" class="form-buttons">
|
||||
|
||||
<input type="submit" value="<?php _e('set_submit');?>">
|
||||
<input type="button" value="<?php _e('set_cancel');?>" onClick="closeSettings()">
|
||||
<input type="submit" value="<?php _e('set_submit');?>" />
|
||||
<input type="button" class="mtt-back-button" value="<?php _e('set_cancel');?>" />
|
||||
|
||||
</td></tr>
|
||||
</table>
|
||||
|
|
|
|||
337
src/setup.php
|
|
@ -6,6 +6,8 @@
|
|||
Licensed under the GNU GPL v3 license. See file COPYRIGHT for details.
|
||||
*/
|
||||
|
||||
set_exception_handler('myExceptionHandler');
|
||||
|
||||
# Check old config file (prior v1.3)
|
||||
require_once('./db/config.php');
|
||||
if(!isset($config['db']))
|
||||
|
|
@ -42,7 +44,7 @@ else
|
|||
$dbtype = '';
|
||||
}
|
||||
|
||||
$lastVer = '1.3.1';
|
||||
$lastVer = '1.4';
|
||||
echo '<html><head><meta name="robots" content="noindex,nofollow"><title>myTinyTodo @VERSION Setup</title></head><body>';
|
||||
echo "<big><b>myTinyTodo @VERSION Setup</b></big><br><br>";
|
||||
|
||||
|
|
@ -91,111 +93,136 @@ if(!$ver)
|
|||
{
|
||||
try
|
||||
{
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}lists (
|
||||
`id` INT UNSIGNED NOT NULL auto_increment,
|
||||
`uuid` CHAR(36) NOT NULL default '',
|
||||
`ow` INT NOT NULL default 0,
|
||||
`name` VARCHAR(50) NOT NULL default '',
|
||||
`d_created` INT UNSIGNED NOT NULL default 0,
|
||||
`d_edited` INT UNSIGNED NOT NULL default 0,
|
||||
`sorting` TINYINT UNSIGNED NOT NULL default 0,
|
||||
`published` TINYINT UNSIGNED NOT NULL default 0,
|
||||
`taskview` INT UNSIGNED NOT NULL default 0,
|
||||
PRIMARY KEY(`id`),
|
||||
UNIQUE KEY(`uuid`)
|
||||
) CHARSET=utf8 ");
|
||||
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}todolist (
|
||||
`id` INT UNSIGNED NOT NULL auto_increment,
|
||||
`uuid` CHAR(36) NOT NULL default '',
|
||||
`list_id` INT UNSIGNED NOT NULL default 0,
|
||||
`d_created` INT UNSIGNED NOT NULL default 0, /* time() timestamp */
|
||||
`d_completed` INT UNSIGNED NOT NULL default 0, /* time() timestamp */
|
||||
`d_created` INT UNSIGNED NOT NULL default 0, /* time() timestamp */
|
||||
`d_completed` INT UNSIGNED NOT NULL default 0, /* time() timestamp */
|
||||
`d_edited` INT UNSIGNED NOT NULL default 0, /* time() timestamp */
|
||||
`compl` TINYINT UNSIGNED NOT NULL default 0,
|
||||
`title` VARCHAR(250) NOT NULL,
|
||||
`note` TEXT,
|
||||
`prio` TINYINT NOT NULL default 0, /* priority -,0,+ */
|
||||
`ow` INT NOT NULL default 0, /* order weight */
|
||||
`tags` VARCHAR(250) NOT NULL default '', /* denormalization - for fast access to task tags */
|
||||
`tags` VARCHAR(600) NOT NULL default '', /* for fast access to task tags */
|
||||
`tags_ids` VARCHAR(250) NOT NULL default '', /* no more than 22 tags (x11 chars) */
|
||||
`duedate` DATE default NULL,
|
||||
PRIMARY KEY(`id`),
|
||||
KEY(`list_id`)
|
||||
KEY(`list_id`),
|
||||
UNIQUE KEY(`uuid`)
|
||||
) CHARSET=utf8 ");
|
||||
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}tags (
|
||||
`id` INT UNSIGNED NOT NULL auto_increment,
|
||||
`name` VARCHAR(50) NOT NULL,
|
||||
`tags_count` INT default 0,
|
||||
`list_id` INT UNSIGNED NOT NULL default 0,
|
||||
PRIMARY KEY(`id`),
|
||||
UNIQUE KEY `listid_nmae` (`list_id`,`name`)
|
||||
UNIQUE KEY `name` (`name`)
|
||||
) CHARSET=utf8 ");
|
||||
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}tag2task (
|
||||
`tag_id` INT UNSIGNED NOT NULL,
|
||||
`task_id` INT UNSIGNED NOT NULL,
|
||||
`list_id` INT UNSIGNED NOT NULL,
|
||||
KEY(`tag_id`),
|
||||
KEY(`task_id`)
|
||||
KEY(`task_id`),
|
||||
KEY(`list_id`) /* for tagcloud */
|
||||
) CHARSET=utf8 ");
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}lists (
|
||||
`id` INT UNSIGNED NOT NULL auto_increment,
|
||||
`ow` INT NOT NULL default 0,
|
||||
`name` VARCHAR(50) NOT NULL default '',
|
||||
`d_created` INT UNSIGNED NOT NULL default 0,
|
||||
`sorting` TINYINT UNSIGNED NOT NULL default 0,
|
||||
`published` TINYINT UNSIGNED NOT NULL default 0,
|
||||
`taskview` INT UNSIGNED NOT NULL default 0,
|
||||
PRIMARY KEY(`id`)
|
||||
) CHARSET=utf8 ");
|
||||
|
||||
} catch (Exception $e) {
|
||||
exitMessage("<b>Error:</b> ". htmlarray($e->getMessage()));
|
||||
}
|
||||
}
|
||||
else
|
||||
else #sqlite
|
||||
{
|
||||
try
|
||||
{
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}todolist (
|
||||
id INTEGER PRIMARY KEY,
|
||||
list_id INTEGER UNSIGNED NOT NULL default 0,
|
||||
d_created INTEGER UNSIGNED NOT NULL default 0,
|
||||
d_completed INTEGER UNSIGNED NOT NULL default 0,
|
||||
compl TINYINT UNSIGNED NOT NULL default 0,
|
||||
title VARCHAR(250) NOT NULL,
|
||||
note TEXT,
|
||||
prio TINYINT NOT NULL default 0,
|
||||
ow INTEGER NOT NULL default 0,
|
||||
tags VARCHAR(250) NOT NULL default '',
|
||||
duedate DATE default NULL
|
||||
) ");
|
||||
$db->ex("CREATE INDEX list_id ON {$db->prefix}todolist (list_id)");
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}tags (
|
||||
id INTEGER PRIMARY KEY,
|
||||
name VARCHAR(50) NOT NULL,
|
||||
tags_count INTEGER default 0,
|
||||
list_id INTEGER UNSIGNED NOT NULL default 0
|
||||
) ");
|
||||
$db->ex("CREATE UNIQUE INDEX tags_listid_name ON {$db->prefix}tags (list_id,name COLLATE NOCASE)");
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}tag2task (
|
||||
tag_id INTEGER NOT NULL,
|
||||
task_id INTEGER NOT NULL
|
||||
) ");
|
||||
$db->ex("CREATE INDEX tag_id ON {$db->prefix}tag2task (tag_id)");
|
||||
$db->ex("CREATE INDEX task_id ON {$db->prefix}tag2task (task_id)");
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}lists (
|
||||
id INTEGER PRIMARY KEY,
|
||||
uuid CHAR(36) NOT NULL,
|
||||
ow INTEGER NOT NULL default 0,
|
||||
name VARCHAR(50) NOT NULL,
|
||||
d_created INTEGER UNSIGNED NOT NULL default 0,
|
||||
d_edited INTEGER UNSIGNED NOT NULL default 0,
|
||||
sorting TINYINT UNSIGNED NOT NULL default 0,
|
||||
published TINYINT UNSIGNED NOT NULL default 0,
|
||||
taskview INTEGER UNSIGNED NOT NULL default 0
|
||||
) ");
|
||||
|
||||
$db->ex("CREATE UNIQUE INDEX lists_uuid ON {$db->prefix}lists (uuid)");
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}todolist (
|
||||
id INTEGER PRIMARY KEY,
|
||||
uuid CHAR(36) NOT NULL,
|
||||
list_id INTEGER UNSIGNED NOT NULL default 0,
|
||||
d_created INTEGER UNSIGNED NOT NULL default 0,
|
||||
d_completed INTEGER UNSIGNED NOT NULL default 0,
|
||||
d_edited INTEGER UNSIGNED NOT NULL default 0,
|
||||
compl TINYINT UNSIGNED NOT NULL default 0,
|
||||
title VARCHAR(250) NOT NULL,
|
||||
note TEXT,
|
||||
prio TINYINT NOT NULL default 0,
|
||||
ow INTEGER NOT NULL default 0,
|
||||
tags VARCHAR(600) NOT NULL default '',
|
||||
tags_ids VARCHAR(250) NOT NULL default '',
|
||||
duedate DATE default NULL
|
||||
) ");
|
||||
$db->ex("CREATE INDEX todo_list_id ON {$db->prefix}todolist (list_id)");
|
||||
$db->ex("CREATE UNIQUE INDEX todo_uuid ON {$db->prefix}todolist (uuid)");
|
||||
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}tags (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name VARCHAR(50) NOT NULL COLLATE NOCASE
|
||||
) ");
|
||||
$db->ex("CREATE UNIQUE INDEX tags_name ON {$db->prefix}tags (name COLLATE NOCASE)");
|
||||
|
||||
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}tag2task (
|
||||
tag_id INTEGER NOT NULL,
|
||||
task_id INTEGER NOT NULL,
|
||||
list_id INTEGER NOT NULL
|
||||
) ");
|
||||
$db->ex("CREATE INDEX tag2task_tag_id ON {$db->prefix}tag2task (tag_id)");
|
||||
$db->ex("CREATE INDEX tag2task_task_id ON {$db->prefix}tag2task (task_id)");
|
||||
$db->ex("CREATE INDEX tag2task_list_id ON {$db->prefix}tag2task (list_id)"); /* for tagcloud */
|
||||
|
||||
} catch (Exception $e) {
|
||||
exitMessage("<b>Error:</b> ". htmlarray($e->getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
# create default list
|
||||
$db->ex("INSERT INTO {$db->prefix}lists (uuid,name,d_created) VALUES (?,?,?)", array(generateUUID(), 'Todo', time()));
|
||||
|
||||
createDefaultList($db);
|
||||
}
|
||||
elseif($ver == $lastVer)
|
||||
{
|
||||
|
|
@ -203,7 +230,7 @@ elseif($ver == $lastVer)
|
|||
}
|
||||
else
|
||||
{
|
||||
if(!in_array($ver, array('1.1','1.2','1.3.0'))) {
|
||||
if(!in_array($ver, array('1.1','1.2','1.3.0','1.3.1'))) {
|
||||
exitMessage("Can not update. Unsupported database version ($ver).");
|
||||
}
|
||||
if(!isset($_POST['update'])) {
|
||||
|
|
@ -214,20 +241,27 @@ else
|
|||
}
|
||||
|
||||
# update process
|
||||
if($ver == '1.3.1')
|
||||
{
|
||||
update_131_14($db, $dbtype);
|
||||
}
|
||||
if($ver == '1.3.0')
|
||||
{
|
||||
update_130_131($db, $dbtype);
|
||||
update_131_14($db, $dbtype);
|
||||
}
|
||||
if($ver == '1.2')
|
||||
{
|
||||
update_12_13($db, $dbtype);
|
||||
update_130_131($db, $dbtype);
|
||||
update_131_14($db, $dbtype);
|
||||
}
|
||||
elseif($ver == '1.1')
|
||||
{
|
||||
update_11_12($db, $dbtype);
|
||||
update_12_13($db, $dbtype);
|
||||
update_130_131($db, $dbtype);
|
||||
update_131_14($db, $dbtype);
|
||||
}
|
||||
}
|
||||
echo "Done<br><br> <b>Attention!</b> Delete this file for security reasons.";
|
||||
|
|
@ -255,6 +289,12 @@ function get_ver($db, $dbtype)
|
|||
if(!has_field_sqlite($db, $db->prefix.'todolist', 'd_completed')) return $v;
|
||||
}
|
||||
$v = '1.3.1';
|
||||
if($dbtype == 'mysql') {
|
||||
if(!has_field_mysql($db, $db->prefix.'todolist', 'd_edited')) return $v;
|
||||
} else {
|
||||
if(!has_field_sqlite($db, $db->prefix.'todolist', 'd_edited')) return $v;
|
||||
}
|
||||
$v = '1.4';
|
||||
return $v;
|
||||
}
|
||||
|
||||
|
|
@ -316,6 +356,14 @@ function testConnect(&$error)
|
|||
return 1;
|
||||
}
|
||||
|
||||
function myExceptionHandler($e)
|
||||
{
|
||||
echo '<br><b>Fatal Error:</b> \''. $e->getMessage() .'\' in <i>'. $e->getFile() .':'. $e->getLine() . '</i>'.
|
||||
"\n<pre>". $e->getTraceAsString() . "</pre>\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
### 1.1-1.2 ##########
|
||||
function update_11_12($db, $dbtype)
|
||||
{
|
||||
|
|
@ -431,20 +479,15 @@ function update_12_13($db, $dbtype)
|
|||
$db->ex("DROP TABLE tags_backup");
|
||||
}
|
||||
$db->ex("COMMIT");
|
||||
|
||||
$db->ex("INSERT INTO lists (name,d_created) VALUES (?,?)", array('Todo', time()));
|
||||
$db->ex("UPDATE todolist SET list_id=1");
|
||||
|
||||
createDefaultList($db);
|
||||
}
|
||||
|
||||
function createDefaultList($db)
|
||||
{
|
||||
$db->ex("INSERT INTO {$db->prefix}lists (name,d_created) VALUES (?,?)", array('Todo', time()));
|
||||
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET list_id=1");
|
||||
$db->ex("UPDATE {$db->prefix}tags SET list_id=1");
|
||||
}
|
||||
|
||||
### end 1.2-1.3 #####
|
||||
|
||||
|
||||
### 1.3.0 to 1.3.1 ##########
|
||||
function update_130_131($db, $dbtype)
|
||||
{
|
||||
|
|
@ -558,4 +601,170 @@ function update_130_131($db, $dbtype)
|
|||
|
||||
### end of 1.3.0 to 1.3.1 ##########
|
||||
|
||||
### update v1.3.1 to v1.4 ##########
|
||||
function update_131_14($db, $dbtype)
|
||||
{
|
||||
$db->ex("BEGIN");
|
||||
if($dbtype=='mysql')
|
||||
{
|
||||
$db->ex("DROP TABLE {$db->prefix}tags");
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}tags (
|
||||
`id` INT UNSIGNED NOT NULL auto_increment,
|
||||
`name` VARCHAR(50) NOT NULL,
|
||||
PRIMARY KEY(`id`),
|
||||
UNIQUE KEY `name` (`name`)
|
||||
) CHARSET=utf8 ");
|
||||
|
||||
$db->ex("ALTER TABLE {$db->prefix}todolist CHANGE `tags` `tags` VARCHAR(600) NOT NULL default ''");
|
||||
$db->ex("ALTER TABLE {$db->prefix}todolist ADD `tags_ids` VARCHAR(250) NOT NULL default ''");
|
||||
$db->ex("ALTER TABLE {$db->prefix}todolist ADD `uuid` CHAR(36) NOT NULL default ''");
|
||||
$db->ex("ALTER TABLE {$db->prefix}todolist ADD `d_edited` INT UNSIGNED NOT NULL default 0");
|
||||
|
||||
$db->ex("ALTER TABLE {$db->prefix}tag2task ADD `list_id` INT UNSIGNED NOT NULL");
|
||||
$db->ex("ALTER TABLE {$db->prefix}tag2task ADD KEY(`list_id`)");
|
||||
|
||||
$db->ex("ALTER TABLE {$db->prefix}lists ADD `uuid` CHAR(36) NOT NULL default ''");
|
||||
$db->ex("ALTER TABLE {$db->prefix}lists ADD `d_edited` INT UNSIGNED NOT NULL default 0");
|
||||
|
||||
}
|
||||
else #sqlite
|
||||
{
|
||||
# changes in tags table: fully new
|
||||
$db->ex("DROP TABLE {$db->prefix}tags"); //index will be deleted too
|
||||
$db->ex(
|
||||
"CREATE TABLE {$db->prefix}tags (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name VARCHAR(50) NOT NULL COLLATE NOCASE
|
||||
) ");
|
||||
$db->ex("CREATE UNIQUE INDEX tags_name ON {$db->prefix}tags (name COLLATE NOCASE)");
|
||||
|
||||
# changes in todolist table: uuid, d_edited, tags, tags_ids
|
||||
$db->ex(
|
||||
"CREATE TABLE todolist_new (
|
||||
id INTEGER PRIMARY KEY,
|
||||
uuid CHAR(36) NOT NULL default '',
|
||||
list_id INTEGER UNSIGNED NOT NULL default 0,
|
||||
d_created INTEGER UNSIGNED NOT NULL default 0,
|
||||
d_completed INTEGER UNSIGNED NOT NULL default 0,
|
||||
d_edited INTEGER UNSIGNED NOT NULL default 0,
|
||||
compl TINYINT UNSIGNED NOT NULL default 0,
|
||||
title VARCHAR(250) NOT NULL,
|
||||
note TEXT,
|
||||
prio TINYINT NOT NULL default 0,
|
||||
ow INTEGER NOT NULL default 0,
|
||||
tags VARCHAR(600) NOT NULL default '',
|
||||
tags_ids VARCHAR(250) NOT NULL default '',
|
||||
duedate DATE default NULL
|
||||
) ");
|
||||
$db->ex("INSERT INTO todolist_new (id,list_id,d_created,d_completed,compl,title,note,prio,ow,tags,duedate)".
|
||||
" SELECT id,list_id,d_created,d_completed,compl,title,note,prio,ow,tags,duedate FROM {$db->prefix}todolist");
|
||||
$db->ex("DROP TABLE {$db->prefix}todolist");
|
||||
$db->ex("ALTER TABLE todolist_new RENAME TO {$db->prefix}todolist");
|
||||
$db->ex("CREATE INDEX todo_list_id ON {$db->prefix}todolist (list_id)"); #1st index of 2
|
||||
|
||||
# changes in tag2task table: new column and index, new names of indexes
|
||||
$db->ex("ALTER TABLE {$db->prefix}tag2task ADD list_id INTEGER NOT NULL default 0");
|
||||
$db->ex("DROP INDEX tag_id");
|
||||
$db->ex("DROP INDEX task_id ");
|
||||
$db->ex("CREATE INDEX tag2task_tag_id ON {$db->prefix}tag2task (tag_id)");
|
||||
$db->ex("CREATE INDEX tag2task_task_id ON {$db->prefix}tag2task (task_id)");
|
||||
$db->ex("CREATE INDEX tag2task_list_id ON {$db->prefix}tag2task (list_id)");
|
||||
|
||||
# changes in lists table: uuid, d_edited
|
||||
$db->ex("ALTER TABLE {$db->prefix}lists ADD uuid CHAR(36) NOT NULL default ''");
|
||||
$db->ex("ALTER TABLE {$db->prefix}lists ADD d_edited INTEGER UNSIGNED NOT NULL default 0");
|
||||
|
||||
}
|
||||
|
||||
# recreate tags
|
||||
$db->ex("DELETE FROM {$db->prefix}tag2task");
|
||||
|
||||
$q = $db->dq("SELECT id,list_id,tags FROM {$db->prefix}todolist WHERE tags != ''");
|
||||
while($r = $q->fetch_assoc())
|
||||
{
|
||||
$aTags = v14_prepareTags($r['tags']);
|
||||
if($aTags)
|
||||
{
|
||||
v14_addTaskTags($r['id'], $aTags['ids'], $r['list_id']);
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET tags=?,tags_ids=? WHERE id=".$r['id'],
|
||||
array(implode(',',$aTags['tags']), implode(',',$aTags['ids'])) );
|
||||
}
|
||||
}
|
||||
|
||||
# fix bug with empty lists.d_created
|
||||
$db->ex("UPDATE {$db->prefix}lists SET d_created=?", time());
|
||||
|
||||
# init d_edited
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET d_edited=d_created");
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET d_edited=d_completed WHERE d_completed > d_edited");
|
||||
$db->ex("UPDATE {$db->prefix}lists SET d_edited=d_created");
|
||||
|
||||
# add UUID
|
||||
$q = $db->dq("SELECT id FROM {$db->prefix}todolist");
|
||||
while($r = $q->fetch_assoc()) {
|
||||
$db->ex("UPDATE {$db->prefix}todolist SET uuid=? WHERE id=".$r['id'], array(generateUUID()) );
|
||||
}
|
||||
$q = $db->dq("SELECT id FROM {$db->prefix}lists");
|
||||
while($r = $q->fetch_assoc()) {
|
||||
$db->ex("UPDATE {$db->prefix}lists SET uuid=? WHERE id=".$r['id'], array(generateUUID()) );
|
||||
}
|
||||
|
||||
# create unique indexes for UUID
|
||||
if($dbtype=='mysql')
|
||||
{
|
||||
$db->ex("ALTER TABLE {$db->prefix}lists ADD UNIQUE KEY (`uuid`)");
|
||||
$db->ex("ALTER TABLE {$db->prefix}todolist ADD UNIQUE KEY (`uuid`)");
|
||||
}
|
||||
else
|
||||
{
|
||||
$db->ex("CREATE UNIQUE INDEX lists_uuid ON {$db->prefix}lists (uuid)");
|
||||
$db->ex("CREATE UNIQUE INDEX todo_uuid ON {$db->prefix}todolist (uuid)");
|
||||
}
|
||||
|
||||
$db->ex("COMMIT");
|
||||
}
|
||||
|
||||
function v14_prepareTags($tagsStr)
|
||||
{
|
||||
$tags = explode(',', $tagsStr);
|
||||
if(!$tags) return 0;
|
||||
|
||||
$aTags = array('tags'=>array(), 'ids'=>array());
|
||||
foreach($tags as $tag)
|
||||
{
|
||||
$tag = str_replace(array('"',"'",'<','>','&','/','\\','^'),'',trim($tag));
|
||||
if($tag == '') continue;
|
||||
|
||||
$aTag = v14_getOrCreateTag($tag);
|
||||
if($aTag && !in_array($aTag['id'], $aTags['ids'])) {
|
||||
$aTags['tags'][] = $aTag['name'];
|
||||
$aTags['ids'][] = $aTag['id'];
|
||||
}
|
||||
}
|
||||
return $aTags;
|
||||
}
|
||||
|
||||
function v14_getOrCreateTag($name)
|
||||
{
|
||||
global $db;
|
||||
$tagId = $db->sq("SELECT id FROM {$db->prefix}tags WHERE name=?", array($name));
|
||||
if($tagId) return array('id'=>$tagId, 'name'=>$name);
|
||||
|
||||
$db->ex("INSERT INTO {$db->prefix}tags (name) VALUES (?)", array($name));
|
||||
return array('id'=>$db->last_insert_id(), 'name'=>$name);
|
||||
}
|
||||
|
||||
function v14_addTaskTags($taskId, $tagIds, $listId)
|
||||
{
|
||||
global $db;
|
||||
if(!$tagIds) return;
|
||||
foreach($tagIds as $tagId)
|
||||
{
|
||||
$db->ex("INSERT INTO {$db->prefix}tag2task (task_id,tag_id,list_id) VALUES (?,?,?)", array($taskId,$tagId,$listId));
|
||||
}
|
||||
}
|
||||
### end of 1.4 #####
|
||||
|
||||
|
||||
?>
|
||||
|
|
@ -1,8 +1,13 @@
|
|||
Image files (page_white_edit_bw.png, feed_bw.png) are based on icons from Silk Icons set,
|
||||
and icons page_white_text.png, page_white_edit.png and calendar.png are part of Silk Icons set
|
||||
by Mark James (http://www.famfamfam.com/lab/icons/silk/), licensed under the
|
||||
Creative Commons Attribution 2.5 License (http://creativecommons.org/licenses/by/2.5/).
|
||||
Image files page_white_text.png and calendar.png and some icons in buttons.png
|
||||
are (or based on) icons from Silk Icons set by Mark James (http://www.famfamfam.com/lab/icons/silk/),
|
||||
licensed under the Creative Commons Attribution 2.5 License (http://creativecommons.org/licenses/by/2.5/).
|
||||
|
||||
bullet_plus.png is based on "Silk Companion 1" icons set by Damien Guard
|
||||
Some icons in buttons.png are based on "Silk Companion 1" icons set by Damien Guard
|
||||
(http://damieng.com/creative/icons/silk-companion-1-icons), licensed under the
|
||||
Creative Commons Attribution 2.5 License (http://creativecommons.org/licenses/by/2.5/).
|
||||
|
||||
Icons in mzl.png are (or based on) icons from Mozilla Source Code,
|
||||
(http://www.mozilla.org/MPL/#source-code), licensed under the terms
|
||||
of tri-license (MPL 1.1/GPL 2.0/LGPL 2.1).
|
||||
|
||||
Other images in this directory were made by Max Pozdeev and licensed under the terms of GNU GPL v3.
|
||||
BIN
src/themes/default/images/arrdown2.gif
Normal file
|
After Width: | Height: | Size: 52 B |
|
Before Width: | Height: | Size: 483 B |
BIN
src/themes/default/images/buttons.png
Executable file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
src/themes/default/images/closetag.gif
Normal file
|
After Width: | Height: | Size: 67 B |
|
Before Width: | Height: | Size: 691 B |
|
Before Width: | Height: | Size: 714 B |
|
Before Width: | Height: | Size: 299 B After Width: | Height: | Size: 330 B |
BIN
src/themes/default/images/mzl.png
Executable file
|
After Width: | Height: | Size: 1 KiB |
|
Before Width: | Height: | Size: 618 B |
|
Before Width: | Height: | Size: 550 B |
|
|
@ -1,76 +1,54 @@
|
|||
<?php
|
||||
|
||||
function datepickerformat()
|
||||
{
|
||||
if(Config::get('duedateformat') == 2) $duedateformat = 'm/d/yy';
|
||||
elseif(Config::get('duedateformat') == 3) $duedateformat = 'dd.mm.yy';
|
||||
elseif(Config::get('duedateformat') == 4) $duedateformat = 'dd/mm/yy';
|
||||
else $duedateformat = 'yy-mm-dd';
|
||||
return $duedateformat;
|
||||
}
|
||||
|
||||
?>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<HEAD>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title><?php mttinfo('title'); ?></title>
|
||||
<link rel="stylesheet" type="text/css" href="<?php mttinfo('template_url'); ?>style.css?v=@VERSION" media="all">
|
||||
<link rel="stylesheet" type="text/css" href="<?php mttinfo('template_url'); ?>style.css?v=@VERSION" media="all" />
|
||||
<?php if(Config::get('rtl')): ?>
|
||||
<link rel="stylesheet" type="text/css" href="<?php mttinfo('template_url'); ?>style_rtl.css?v=@VERSION" media="all">
|
||||
<link rel="stylesheet" type="text/css" href="<?php mttinfo('template_url'); ?>style_rtl.css?v=@VERSION" media="all" />
|
||||
<?php endif; ?>
|
||||
<?php if(isset($_GET['pda'])): ?>
|
||||
<meta name="viewport" id="viewport" content="width=device-width">
|
||||
<link rel="stylesheet" type="text/css" href="<?php mttinfo('template_url'); ?>pda.css?v=@VERSION" media="all">
|
||||
<meta name="viewport" id="viewport" content="width=device-width" />
|
||||
<link rel="stylesheet" type="text/css" href="<?php mttinfo('template_url'); ?>pda.css?v=@VERSION" media="all" />
|
||||
<?php else: ?>
|
||||
<link rel="stylesheet" type="text/css" href="<?php mttinfo('template_url'); ?>print.css?v=@VERSION" media="print">
|
||||
<link rel="stylesheet" type="text/css" href="<?php mttinfo('template_url'); ?>print.css?v=@VERSION" media="print" />
|
||||
<?php endif; ?>
|
||||
</HEAD>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<script type="text/javascript" src="<?php mttinfo('mtt_url'); ?>jquery/jquery-1.3.2.min.js"></script>
|
||||
<script type="text/javascript" src="<?php mttinfo('mtt_url'); ?>jquery/jquery-1.4.2.min.js"></script>
|
||||
<script type="text/javascript" src="<?php mttinfo('mtt_url'); ?>jquery/jquery-ui-1.7.2.custom.min.js"></script>
|
||||
<script type="text/javascript" src="<?php mttinfo('mtt_url'); ?>ajax.lang.php?v=@VERSION"></script>
|
||||
<script type="text/javascript" src="<?php mttinfo('mtt_url'); ?>ajax.js?v=@VERSION"></script>
|
||||
<script type="text/javascript" src="<?php mttinfo('mtt_url'); ?>jquery/jquery.autocomplete.min.js"></script>
|
||||
<script type="text/javascript" src="<?php mttinfo('mtt_url'); ?>jquery/jquery.autocomplete-1.1.js"></script>
|
||||
<script type="text/javascript" src="<?php mttinfo('mtt_url'); ?>mytinytodo.js?v=@VERSION"></script>
|
||||
<script type="text/javascript" src="<?php mttinfo('mtt_url'); ?>mytinytodo_lang.php?v=@VERSION"></script>
|
||||
<script type="text/javascript" src="<?php mttinfo('mtt_url'); ?>mytinytodo_ajax_storage.js?v=@VERSION"></script>
|
||||
<script type="text/javascript" src="<?php mttinfo('template_url'); ?>functions.js?v=@VERSION"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
$().ready(function(){
|
||||
|
||||
<?php if(isset($_GET['pda'])): ?>
|
||||
|
||||
$('body').width(screen.width);
|
||||
$(window).resize(function() {
|
||||
$('body').width(screen.width);
|
||||
});
|
||||
|
||||
<?php endif; ?>
|
||||
|
||||
mytinytodo.mttUrl = "<?php mttinfo('mtt_url'); ?>";
|
||||
$("#tasklist").sortable({cancel:'span,input,a,textarea', delay: 150, update:orderChanged, start:sortStart, items:'> :not(.task-completed)'});
|
||||
$("#tasklist").bind("click", tasklistClick);
|
||||
$("#edittags").autocomplete('ajax.php?suggestTags', {scroll: false, multiple: true, selectFirst:false, max:8, extraParams:{list:function(){return curList.id}}});
|
||||
$("#priopopup").mouseleave(function(){$(this).hide()});
|
||||
<?php
|
||||
if($needAuth)
|
||||
{
|
||||
echo "\tflag.needAuth = true;\n";
|
||||
if(is_logged()) echo "\tflag.isLogged = true;\n";
|
||||
}
|
||||
if(Config::get('autotag')) echo "\tflag.autoTag = true;\n";
|
||||
if(isset($_GET['list'])) echo "\tmytinytodo.setOptions({openList:". (int)$_GET['list']. "});\n";
|
||||
echo "\tloadLists(1, 1);\n";
|
||||
?>
|
||||
$("#duedate").datepicker({dateFormat: '<?php echo datepickerformat(); ?>', firstDay: <?php echo Config::get('firstdayofweek'); ?>,
|
||||
showOn: 'button', buttonImage: '<?php mttinfo('template_url'); ?>images/calendar.png', buttonImageOnly: true, changeMonth:true,
|
||||
changeYear:true, constrainInput: false, duration:'', nextText:'>', prevText:'<', dayNamesMin:lang.daysMin,
|
||||
dayNames:lang.daysLong, monthNamesShort:lang.monthsLong });
|
||||
<?php if(!isset($_GET['pda'])): ?>
|
||||
$("#page_taskedit").draggable({ handle:'h3', stop: function(e,ui){ flag.windowTaskEditMoved=true; tmp.editformpos=[$(this).css('left'),$(this).css('top')]; } });
|
||||
$("#page_taskedit").resizable({ minWidth:$("#page_taskedit").width(), minHeight:220, start:function(ui,e){editFormResize(1)}, resize:function(ui,e){editFormResize(0,e)}, stop:function(ui,e){editFormResize(2,e)} });
|
||||
<?php else: ?>
|
||||
flag.pda = true;
|
||||
<?php endif; ?>
|
||||
<?php if(isset($_GET['singletab'])): ?>
|
||||
mytinytodo.addAction('listsLoaded', tplSingleTabLoaded);
|
||||
mytinytodo.addAction('listRenamed', tplSingleTabRenamed);
|
||||
mytinytodo.addAction('listAdded', tplSingleTabAdded);
|
||||
<?php endif; ?>
|
||||
<?php if(!isset($_GET['singletab']) && !isset($_GET['pda'])): ?>
|
||||
$("#lists ul").sortable({delay:150, update:listOrderChanged});
|
||||
<?php endif; ?>
|
||||
mytinytodo.templateUrl = "<?php mttinfo('template_url'); ?>";
|
||||
mytinytodo.db = new mytinytodoStorageAjax(mytinytodo);
|
||||
mytinytodo.init({
|
||||
needAuth: <?php echo $needAuth ? "true" : "false"; ?>,
|
||||
isLogged: <?php echo ($needAuth && is_logged()) ? "true" : "false"; ?>,
|
||||
showdate: <?php echo (Config::get('showdate') && !isset($_GET['pda'])) ? "true" : "false"; ?>,
|
||||
singletab: <?php echo (isset($_GET['singletab']) || isset($_GET['pda'])) ? "true" : "false"; ?>,
|
||||
duedateformat: <?php echo (int)Config::get('duedateformat'); ?>,
|
||||
autotag: <?php echo Config::get('autotag') ? "true" : "false"; ?>
|
||||
<?php if(isset($_GET['list'])) echo ",openList: ". (int)$_GET['list']; ?>
|
||||
}).loadLists(1);
|
||||
});
|
||||
</script>
|
||||
|
||||
|
|
@ -80,50 +58,78 @@ $().ready(function(){
|
|||
|
||||
<h2><?php mttinfo('title'); ?></h2>
|
||||
|
||||
<div id="loading"><img src="<?php mttinfo('template_url'); ?>images/loading1.gif"></div>
|
||||
<div id="loading"></div>
|
||||
|
||||
<div id="bar">
|
||||
<div id="msg"><span class="msg-text" onClick="toggleMsgDetails()"></span><div class="msg-details"></div></div>
|
||||
<div id="msg"><span class="msg-text"></span><div class="msg-details"></div></div>
|
||||
<div class="bar-menu">
|
||||
<span class="menu-owner">
|
||||
<a href="#settings" onClick="showSettings();return false;"><?php _e('a_settings');?></a>
|
||||
<span class="menu-owner" style="display:none">
|
||||
<a href="#settings" id="settings"><?php _e('a_settings');?></a>
|
||||
</span>
|
||||
<span class="bar-delim" style="display:none"> | </span>
|
||||
<span id="bar_auth">
|
||||
<span id="bar_public" style="display:none"><?php _e('public_tasks');?> |</span>
|
||||
<span id="bar_login"><a href="#login" class="nodecor" onClick="showAuth(this);return false;"><u><?php _e('a_login');?></u> <img src="<?php mttinfo('template_url'); ?>images/arrdown.gif" border=0></a></span>
|
||||
<a href="#logout" id="bar_logout" onClick="logout();return false"><?php _e('a_logout');?></a>
|
||||
<a href="#login" id="bar_login" class="nodecor"><u><?php _e('a_login');?></u> <span class="arrdown"></span></a>
|
||||
<a href="#logout" id="bar_logout"><?php _e('a_logout');?></a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<br clear="all">
|
||||
<br clear="all" />
|
||||
|
||||
<div id="page_tasks" style="display:none" class="<?php if(Config::get('showdate')) echo "show-inline-date"; ?>">
|
||||
<div id="page_tasks" style="display:none">
|
||||
|
||||
<div id="lists">
|
||||
<ul class="mtt-tabs <?php if(isset($_GET['singletab'])) echo "mtt-tabs-only-one"; ?>"></ul>
|
||||
<div class="mtt-tabs-add-button" onClick="addList();return false;" title="<?php _e('list_new'); ?>"><span></span></div>
|
||||
<ul class="mtt-tabs"></ul>
|
||||
<div id="tabs_buttons">
|
||||
<div class="mtt-tabs-add-button mtt-tabs-button" title="<?php _e('list_new'); ?>"><span></span></div>
|
||||
<div class="mtt-tabs-select-button mtt-tabs-button" title="<?php _e('list_select'); ?>"><span></span></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="toolbar" class="mtt-htabs">
|
||||
<span id="rss_icon"><a href="#" title="<?php _e('rss_feed');?>"><img src="<?php mttinfo('template_url'); ?>images/feed_bw.png" onMouseOver="this.src='<?php mttinfo('template_url'); ?>images/feed.png'" onMouseOut="this.src='<?php mttinfo('template_url'); ?>images/feed_bw.png'"></a></span>
|
||||
<span id="htab_newtask"><?php _e('htab_newtask');?>
|
||||
<form onSubmit="return submitNewTask(this)"><input type="text" name="task" value="" maxlength="250" id="task"> <input type="submit" value="<?php _e('btn_add');?>"></form>
|
||||
<a href="#" onClick="showEditForm(1);return false;" title="<?php _e('advanced_add');?>"><img src="<?php mttinfo('template_url'); ?>images/page_white_edit_bw.png" onMouseOver="this.src='<?php mttinfo('template_url'); ?>images/page_white_edit.png'" onMouseOut="this.src='<?php mttinfo('template_url'); ?>images/page_white_edit_bw.png'"></a>
|
||||
| <a href="#" class="htab-toggle" onClick="addsearchToggle(1);this.blur();return false;"><?php _e('htab_search');?></a>
|
||||
</span>
|
||||
<span id="htab_search" style="display:none"><?php _e('htab_search');?>
|
||||
<form onSubmit="return searchTasks()"><input type="text" name="search" value="" maxlength="250" id="search" onKeyUp="timerSearch()" autocomplete="off"> <input type="submit" value="<?php _e('btn_search');?>"></form>
|
||||
| <a href="#" class="htab-toggle" onClick="addsearchToggle(0);this.blur();return false;"><?php _e('htab_newtask');?></a>
|
||||
<div id="searchbar"><?php _e('searching');?> <span id="searchbarkeyword"></span></div>
|
||||
</span>
|
||||
|
||||
<div id="htab_search">
|
||||
<table class="mtt-searchbox"><tr><td>
|
||||
<div class="mtt-searchbox-c">
|
||||
<input type="text" name="search" value="" maxlength="250" id="search" autocomplete="off" />
|
||||
<div class="mtt-searchbox-icon mtt-icon-search"></div>
|
||||
<div id="search_close" class="mtt-searchbox-icon mtt-icon-cancelsearch"></div>
|
||||
</div>
|
||||
</td></tr></table>
|
||||
</div>
|
||||
|
||||
<div id="htab_newtask">
|
||||
<table class="mtt-taskbox"><tr><td class="mtt-tb-cell">
|
||||
<div class="mtt-tb-c">
|
||||
<form id="newtask_form" method="post">
|
||||
<label id="task_placeholder" class="placeholding" for="task">
|
||||
<input type="text" name="task" value="" maxlength="250" id="task" autocomplete="off" />
|
||||
<span><?php _e('htab_newtask');?></span>
|
||||
</label>
|
||||
<div id="newtask_submit" class="mtt-taskbox-icon mtt-icon-submittask" title="<?php _e('btn_add');?>"></div>
|
||||
</form>
|
||||
</div>
|
||||
</td>
|
||||
<td><a href="#" id="newtask_adv" class="mtt-img-button" title="<?php _e('advanced_add');?>"><span></span></a></td>
|
||||
</tr></table>
|
||||
</div>
|
||||
|
||||
<div id="searchbar" style="display:none"><?php _e('searching');?> <span id="searchbarkeyword"></span></div>
|
||||
|
||||
<div style="clear:both"></div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<h3>
|
||||
<span id="taskview" onClick="btnMenu(this);return false;" class="mtt-btnmenu"><span class="btnstr"><?php _e('tasks');?></span> (<span id="total">0</span>) <img src="<?php mttinfo('template_url'); ?>images/arrdown.gif"></span>
|
||||
<span id="tagcloudbtn" onClick="showTagCloud(this);"><span class="btnstr"><?php _e('tags');?></span> <img src="<?php mttinfo('template_url'); ?>images/arrdown.gif"></span>
|
||||
<span class="mtt-notes-showhide"><?php _e('notes');?> <a href="#" onClick="toggleAllNotes(1);this.blur();return false;"><?php _e('notes_show');?></a> / <a href="#" onClick="toggleAllNotes(0);this.blur();return false;"><?php _e('notes_hide');?></a></span>
|
||||
<span id="taskview" class="mtt-menu-button"><span class="btnstr"><?php _e('tasks');?></span> (<span id="total">0</span>) <span class="arrdown"></span></span>
|
||||
<span class="mtt-notes-showhide"><?php _e('notes');?> <a href="#" id="mtt-notes-show"><?php _e('notes_show');?></a> / <a href="#" id="mtt-notes-hide"><?php _e('notes_hide');?></a></span>
|
||||
<span id="mtt_filters"></span>
|
||||
<span id="tagcloudbtn" class="mtt-menu-button"><?php _e('tags');?> <span class="arrdown2"></span></span>
|
||||
</h3>
|
||||
|
||||
<div id="taskcontainer">
|
||||
|
|
@ -135,82 +141,98 @@ $().ready(function(){
|
|||
|
||||
<div id="page_taskedit" style="display:none">
|
||||
|
||||
<div><a href="#" class="mtt-back-button"><?php _e('go_back');?></a></div>
|
||||
|
||||
<h3 class="mtt-inadd"><?php _e('add_task');?></h3>
|
||||
<h3 class="mtt-inedit">
|
||||
<h3 class="mtt-inedit"><?php _e('edit_task');?>
|
||||
<div id="taskedit-date" class="mtt-inedit">
|
||||
<span class="date-created" title="<?php _e('taskdate_created');?>"><span></span></span>
|
||||
<span class="date-completed" title="<?php _e('taskdate_completed');?>"> / <span></span></span>
|
||||
(<span class="date-created" title="<?php _e('taskdate_created');?>"><span></span></span><span class="date-completed" title="<?php _e('taskdate_completed');?>"> — <span></span></span>)
|
||||
</div>
|
||||
<?php _e('edit_task');?>
|
||||
</h3>
|
||||
|
||||
<form onSubmit="return saveTask(this)" name="edittask">
|
||||
<input type="hidden" name="isadd" value="0">
|
||||
<input type="hidden" name="id" value="">
|
||||
<div class="form-row form-row-short"><span class="h"><?php _e('priority');?></span> <SELECT name="prio"><option value="2">+2</option><option value="1">+1</option><option value="0" selected>±0</option><option value="-1">−1</option></SELECT></div>
|
||||
<div class="form-row form-row-short"><span class="h"><?php _e('due');?> </span> <input name="duedate" id="duedate" value="" class="in100" title="Y-M-D, M/D/Y, D.M.Y, M/D, D.M" autocomplete="off"></div>
|
||||
<form id="taskedit_form" name="edittask" method="post">
|
||||
<input type="hidden" name="isadd" value="0" />
|
||||
<input type="hidden" name="id" value="" />
|
||||
<div class="form-row form-row-short">
|
||||
<span class="h"><?php _e('priority');?></span>
|
||||
<select name="prio">
|
||||
<option value="2">+2</option><option value="1">+1</option><option value="0" selected="selected">±0</option><option value="-1">−1</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row form-row-short">
|
||||
<span class="h"><?php _e('due');?> </span>
|
||||
<input name="duedate" id="duedate" value="" class="in100" title="Y-M-D, M/D/Y, D.M.Y, M/D, D.M" autocomplete="off" />
|
||||
</div>
|
||||
<div class="form-row-short-end"></div>
|
||||
<div class="form-row"><div class="h"><?php _e('task');?></div> <input type="text" name="task" value="" class="in500" maxlength="250"></div>
|
||||
<div class="form-row"><div class="h"><?php _e('task');?></div> <input type="text" name="task" value="" class="in500" maxlength="250" /></div>
|
||||
<div class="form-row"><div class="h"><?php _e('note');?></div> <textarea name="note" class="in500"></textarea></div>
|
||||
<div class="form-row"><div class="h"><?php _e('tags');?></div>
|
||||
<table cellspacing="0" cellpadding="0" width="100%"><tr>
|
||||
<td><input type="text" name="tags" id="edittags" value="" class="in500" maxlength="250"></td>
|
||||
<td><input type="text" name="tags" id="edittags" value="" class="in500" maxlength="250" /></td>
|
||||
<td class="alltags-cell">
|
||||
<a href="#" id="alltags_show" onClick="toggleEditAllTags(1);return false;"><?php _e('alltags_show');?></a>
|
||||
<a href="#" id="alltags_hide" onClick="toggleEditAllTags(0);return false;" style="display:none"><?php _e('alltags_hide');?></a></td>
|
||||
<a href="#" id="alltags_show"><?php _e('alltags_show');?></a>
|
||||
<a href="#" id="alltags_hide" style="display:none"><?php _e('alltags_hide');?></a></td>
|
||||
</tr></table>
|
||||
</div>
|
||||
<div class="form-row" id="alltags" style="display:none;"><?php _e('alltags');?> <span class="tags-list"></span></div>
|
||||
<div class="form-row form-bottom-buttons"><input type="submit" value="<?php _e('save');?>" onClick="this.blur()"> <input type="button" value="<?php _e('cancel');?>" onClick="cancelEdit();this.blur();return false"></div>
|
||||
<div class="form-row form-bottom-buttons">
|
||||
<input type="submit" value="<?php _e('save');?>" />
|
||||
<input type="button" id="mtt_edit_cancel" class="mtt-back-button" value="<?php _e('cancel');?>" />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div> <!-- end of page_taskedit -->
|
||||
|
||||
|
||||
<div id="authform" style="display:none">
|
||||
<form onSubmit="doAuth(this);return false;">
|
||||
<div class="h"><?php _e('password');?></div><div><input type="password" name="password" id="password"></div><div><input type="submit" value="<?php _e('btn_login');?>"></div>
|
||||
<form id="login_form">
|
||||
<div class="h"><?php _e('password');?></div>
|
||||
<div><input type="password" name="password" id="password" /></div>
|
||||
<div><input type="submit" value="<?php _e('btn_login');?>" /></div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="priopopup" style="display:none">
|
||||
<span class="prio-neg prio-neg-1" onClick="prioClick(-1,this)">−1</span>
|
||||
<span class="prio-zero" onClick="prioClick(0,this)">±0</span>
|
||||
<span class="prio-pos prio-pos-1" onClick="prioClick(1,this)">+1</span>
|
||||
<span class="prio-pos prio-pos-2" onClick="prioClick(2,this)">+2</span>
|
||||
<span class="prio-neg prio-neg-1">−1</span>
|
||||
<span class="prio-zero">±0</span>
|
||||
<span class="prio-pos prio-pos-1">+1</span>
|
||||
<span class="prio-pos prio-pos-2">+2</span>
|
||||
</div>
|
||||
|
||||
<div id="taskviewcontainer" class="mtt-btnmenu-container" style="display:none">
|
||||
<div id="taskviewcontainer" class="mtt-menu-container" style="display:none">
|
||||
<ul>
|
||||
<li onClick="setTaskview(0)"><span id="view_tasks"><?php _e('tasks');?></span> (<span id="cnt_total">0</span>)</li>
|
||||
<li onClick="setTaskview('past')"><span id="view_past"><?php _e('f_past');?></span> (<span id="cnt_past">0</span>)</li>
|
||||
<li onClick="setTaskview('today')"><span id="view_today"><?php _e('f_today');?></span> (<span id="cnt_today">0</span>)</li>
|
||||
<li onClick="setTaskview('soon')"><span id="view_soon"><?php _e('f_soon');?></span> (<span id="cnt_soon">0</span>)</li>
|
||||
<li id="view_tasks"><?php _e('tasks');?> (<span id="cnt_total">0</span>)</li>
|
||||
<li id="view_past"><?php _e('f_past');?> (<span id="cnt_past">0</span>)</li>
|
||||
<li id="view_today"><?php _e('f_today');?> (<span id="cnt_today">0</span>)</li>
|
||||
<li id="view_soon"><?php _e('f_soon');?> (<span id="cnt_soon">0</span>)</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="tagcloud" style="display:none">
|
||||
<div id="tagcloudcancel" onClick="cancelTagFilter();tagCloudClose();"><?php _e('tagfilter_cancel');?></div>
|
||||
<div id="tagcloudload"><img src="<?php mttinfo('template_url'); ?>images/loading1_24.gif"></div>
|
||||
<a id="tagcloudcancel" class="mtt-img-button"><span></span></a>
|
||||
<div id="tagcloudload"></div>
|
||||
<div id="tagcloudcontent"></div>
|
||||
</div>
|
||||
|
||||
<div id="mylistscontainer" class="mtt-btnmenu-container mtt-menu-has-images" style="display:none">
|
||||
|
||||
<div id="mylistscontainer" class="mtt-menu-container" style="display:none">
|
||||
<ul>
|
||||
<li class="mtt-need-list" id="btnRenameList"><?php _e('list_rename');?></li>
|
||||
<li class="mtt-need-list" id="btnDeleteList"><?php _e('list_delete');?></li>
|
||||
<li class="mtt-need-list" id="btnClearCompleted"><?php _e('list_clearcompleted');?></li>
|
||||
<li class="mtt-btnmenu-delimiter"></li>
|
||||
<li class="mtt-need-list" id="btnExportCSV"><?php _e('list_exportcsv');?></li>
|
||||
<li class="mtt-need-list" id="btnRssFeed"><div class="menu-icon"></div><?php _e('list_rssfeed');?></li>
|
||||
<li class="mtt-menu-delimiter"></li>
|
||||
<li class="mtt-need-list" id="btnPublish"><div class="menu-icon"></div><?php _e('list_publish');?></li>
|
||||
<li class="mtt-need-list" id="btnShowCompleted"><div class="menu-icon"></div><?php _e('list_showcompleted');?></li>
|
||||
<li class="mtt-btnmenu-delimiter"></li>
|
||||
<li class="mtt-menu-delimiter"></li>
|
||||
<li class="mtt-need-list sort-item" id="sortByHand"><div class="menu-icon"></div><?php _e('sortByHand');?></li>
|
||||
<li class="mtt-need-list sort-item" id="sortByPrio"><div class="menu-icon"></div><?php _e('sortByPriority');?></li>
|
||||
<li class="mtt-need-list sort-item" id="sortByDueDate"><div class="menu-icon"></div><?php _e('sortByDueDate');?></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="taskcontextcontainer" class="mtt-btnmenu-container mtt-menu-has-images mtt-menu-has-submenu" style="display:none">
|
||||
<div id="taskcontextcontainer" class="mtt-menu-container" style="display:none">
|
||||
<ul>
|
||||
<li id="cmenu_edit"><b><?php _e('action_edit');?></b></li>
|
||||
<li id="cmenu_note"><?php _e('action_note');?></li>
|
||||
|
|
@ -220,7 +242,7 @@ $().ready(function(){
|
|||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="priocontainer" class="mtt-btnmenu-container mtt-menu-has-images" style="display:none">
|
||||
<div id="priocontainer" class="mtt-menu-container" style="display:none">
|
||||
<ul>
|
||||
<li id="cmenu_prio:2">+2</li>
|
||||
<li id="cmenu_prio:1">+1</li>
|
||||
|
|
@ -229,7 +251,12 @@ $().ready(function(){
|
|||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="listsmenucontainer" class="mtt-btnmenu-container mtt-menu-has-images" style="display:none">
|
||||
<div id="listsmenucontainer" class="mtt-menu-container" style="display:none">
|
||||
<ul>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="slmenucontainer" class="mtt-menu-container" style="display:none">
|
||||
<ul>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
body { margin:0px; }
|
||||
h2 { margin:0; margin-bottom:2px; font-size:18px; }
|
||||
body { margin:0px; font-size:100%; }
|
||||
h2 { margin:0; margin-bottom:2px; font-size:1em; }
|
||||
h3 { margin-bottom:4px; padding:4px 0; }
|
||||
#body { margin-left:1px; margin-right:1px; padding:1px; padding-bottom:12px;}
|
||||
#bar_login, #bar_logout { padding-right:1px; }
|
||||
|
|
@ -7,9 +7,16 @@ h3 { margin-bottom:4px; padding:4px 0; }
|
|||
#tabs ul { margin-top:0px; }
|
||||
#tabs ul li { width:70px; margin-right: 1px; }
|
||||
.tab-content { padding:4px; }
|
||||
#task, #search { color:#444444; width:65%; max-width:300px; }
|
||||
|
||||
#tasklist li { padding:4px 1px; overflow:hidden; }
|
||||
#htab_search { width:40%; max-width:190px; }
|
||||
.mtt-searchbox { float:right; }
|
||||
.mtt-searchbox td { width:40%; }
|
||||
#toolbar.mtt-intask #htab_search { display:none; }
|
||||
#toolbar.mtt-insearch #htab_newtask { display:none; }
|
||||
#toolbar.mtt-insearch #htab_search { width:100%; }
|
||||
#toolbar.mtt-insearch .mtt-searchbox td { width:40%; }
|
||||
|
||||
#tasklist li { padding:0.5em 3px; overflow:hidden; }
|
||||
.task-actions { display:none; }
|
||||
.task-date { display:none; }
|
||||
.task-note-actions { display:block; padding-top:8px; }
|
||||
|
|
@ -26,6 +33,7 @@ h3 { margin-bottom:4px; padding:4px 0; }
|
|||
#tasklist li.clicked .task-through { white-space:normal; display:inline; }
|
||||
#tasklist li.clicked.task-has-note .task-note-block { display:block; }
|
||||
/*#tasklist li.clicked.task-has-note .task-toggle { background-position:-48px 0; } */
|
||||
#tasklist li.clicked.doubleclicked.task-has-note .task-note-block { display:none; }
|
||||
.task-toggle { display:none; }
|
||||
.task-middle { margin-left:25px; }
|
||||
|
||||
|
|
|
|||
|
|
@ -21,10 +21,11 @@ div.task-note-block { border-left:1px solid #777777; background:none; padding-le
|
|||
#tasklist li.today, #tasklist li.past { background-color:#ffffff; border-color:#dedede; }
|
||||
.task-prio { font-weight:bold; }
|
||||
|
||||
li.task-completed { opacity:1; }
|
||||
|
||||
#footer_content { border-top:1px solid #777777; background:none; }
|
||||
#footer_content a { text-decoration:none; color:#000000; }
|
||||
|
||||
#tagcloudbtn { display:none; }
|
||||
.mtt-notes-showhide { display:none; }
|
||||
.mtt-btnmenu { border:none; }
|
||||
#taskview img { display:none; }
|
||||
|
|
@ -1,18 +1,28 @@
|
|||
body, td, th, input,textarea,select { font-family: arial; font-size:10pt; }
|
||||
html { height:100%; }
|
||||
body { margin:0px; padding:0px; height:100%; min-height:100%; background-color:#fff; }
|
||||
/*
|
||||
This file is a part of myTinyTodo.
|
||||
Copyright 2009-2010 Max Pozdeev <maxpozdeev@gmail.com>
|
||||
*/
|
||||
|
||||
/* default style */
|
||||
|
||||
html { height:100%; overflow-y:scroll; }
|
||||
body { margin:0px; padding:0px; height:100%; min-height:100%; background-color:#fff; font-family:arial; font-size:10pt; }
|
||||
#wrapper { margin:0px auto; max-width:950px; height:100%; }
|
||||
#container { height:auto !important;height:100%;min-height:100%; }
|
||||
#body { padding:8px; padding-bottom:16px; }
|
||||
|
||||
|
||||
td, th, input, textarea, select { font-family:arial; font-size:1em; }
|
||||
form { display: inline; }
|
||||
h2,h3 { margin:0; }
|
||||
h2 { font-size:15pt; float:left; padding-right:10px; background-color:#ffffff; }
|
||||
h3 { border-bottom:2px solid #B5D5FF; margin-bottom:10px; padding:6px 0; font-size:11pt; }
|
||||
h2 { font-size:1.5em; float:left; padding-right:10px; background-color:#ffffff; }
|
||||
h3 { border-bottom:2px solid #B5D5FF; margin-bottom:10px; padding:6px 0; font-size:1.1em; }
|
||||
#page_tasks h3 { padding-left:4px; padding-right:4px; }
|
||||
a { color:#0000ff; }
|
||||
a { color:#0000ff; cursor:pointer; text-decoration:underline; }
|
||||
|
||||
#space { height:30px; }
|
||||
#footer { height:30px; margin-top:-30px; }
|
||||
#footer_content { background-color:#b5d5ff; padding:5px; font-size:8pt; }
|
||||
#footer_content { background-color:#b5d5ff; padding:5px; font-size:0.8em; }
|
||||
#footer_content a { color:#000000; }
|
||||
|
||||
#bar { border-bottom:1px solid #b5d5ff; padding-bottom:5px; height:15px; }
|
||||
|
|
@ -23,36 +33,7 @@ a { color:#0000ff; }
|
|||
#authform { overflow: hidden; z-index:100; background-color:#f9f9f9; border:1px solid #cccccc; padding:5px; width:160px; }
|
||||
#authform div { padding:2px 0px; }
|
||||
#authform div.h { font-weight:bold; }
|
||||
|
||||
.mtt-tabs { list-style:none; padding:0; margin:0; }
|
||||
.mtt-tabs li { margin:1px 3px 0 0; float:left; max-width:199px; border-left:1px solid #ededed; background:#fbfbfb url(images/tab_hover.gif) no-repeat top right; }
|
||||
.mtt-tabs a { position:relative; margin:0; font-size:9pt; font-weight:bold; text-decoration:none; text-align:center; white-space:nowrap; color:#444444; display:block; height:21px; padding:6px 6px 0px 2px; outline:none; vertical-align:top; }
|
||||
.mtt-tabs a span { display:inline-block; min-width:75px; cursor:pointer; padding:0; overflow:hidden; }
|
||||
.mtt-tabs .list-action { display:none; float:left; position:absolute; top:6px; right:5px; width:15px; height:15px; background:#fff url(images/icons.gif) 0 0 no-repeat; }
|
||||
.mtt-tabs .list-action:hover, .mtt-tabs .list-action.mtt-menu-button-active { background-position:-16px 0; cursor:pointer; }
|
||||
.mtt-tabs li.mtt-tabs-selected span { margin-right:16px; }
|
||||
.mtt-tabs li.mtt-tabs-selected .list-action { display:block; }
|
||||
.mtt-tabs li.mtt-tabs-selected { background:#ededed url(images/corner_right.gif) no-repeat top right; border-left:1px solid #ededed; }
|
||||
.mtt-tabs li:hover a { color: #888888; }
|
||||
.mtt-tabs.mtt-tabs-only-one li { display:none; }
|
||||
.mtt-tabs.mtt-tabs-only-one li.mtt-tabs-selected { display:block; }
|
||||
#page_tasks.readonly .list-action { display:none; }
|
||||
#page_tasks.readonly li.mtt-tabs-selected span { margin-right:0; }
|
||||
|
||||
.mtt-tabs-add-button { float:left; margin-top:1px; padding:6px 2px 0px 2px; font-size:9pt; width:16px; border-left:1px solid #ededed; background:#fbfbfb url(images/tab_hover.gif) no-repeat top right; }
|
||||
.mtt-tabs-add-button:hover { cursor:pointer; }
|
||||
.mtt-tabs-add-button span { display:block; height:21px; background:url(images/bullet_plus.png) 0 0 no-repeat; }
|
||||
.mtt-tabs-add-button:hover span { background-position:-16px 0; }
|
||||
#page_tasks.readonly .mtt-tabs-add-button { display:none; }
|
||||
|
||||
#page_tasks.readonly #htab_search a.htab-toggle { color:#444; }
|
||||
.mtt-htabs { clear:both; padding:8px; border-bottom:2px solid #DEDEDE; background:url(images/corner_right.gif) no-repeat top right #ededed; }
|
||||
#htab_newtask a>img { border:none; vertical-align:text-top; }
|
||||
#loading { float:left; padding-top:5px; background-color:#ffffff; display:none; padding-right:6px;}
|
||||
#task, #search { color:#444444; width:300px; }
|
||||
.small-bar{ font-size:8pt; color:#999999; font-weight:normal;}
|
||||
#searchbar { font-size:10pt; font-weight:normal; display:none; margin-top:5px; }
|
||||
#searchbarkeyword { font-weight:bold; }
|
||||
#loading { float:left; padding-top:5px; background-color:#ffffff; display:none; padding-right:6px; width:16px; height:16px; background:url(images/loading1.gif) no-repeat; }
|
||||
|
||||
#msg { float:left; }
|
||||
#msg .msg-text { padding:1px 4px; font-weight:bold; cursor:pointer; }
|
||||
|
|
@ -62,37 +43,144 @@ a { color:#0000ff; }
|
|||
#msg.mtt-info .msg-text { background-color:#EFC300; }
|
||||
#msg.mtt-info .msg-details { border:1px solid #EFC300;}
|
||||
|
||||
.mtt-notes-showhide { font-size:8pt; font-weight:normal; margin-left:2px; margin-right:2px; }
|
||||
#rss_icon { float:right;margin-top:4px; }
|
||||
#rss_icon img { border:none; }
|
||||
.mtt-tabs { list-style:none; padding:0; margin:0; }
|
||||
.mtt-tabs li { margin:1px 3px 0 0; float:left; border-left:1px solid #ededed; background:#fbfbfb url(images/tab_hover.gif) no-repeat top right; }
|
||||
.mtt-tabs a { position:relative; margin:0; font-size:0.9em; font-weight:bold; text-decoration:none; text-align:center; white-space:nowrap; color:#444444; display:block; height:21px; padding:6px 6px 0px 2px; outline:none; vertical-align:top; }
|
||||
.mtt-tabs a span { display:inline-block; min-width:75px; max-width:195px; cursor:pointer; padding:0; overflow:hidden; }
|
||||
.mtt-tabs .list-action { display:none; float:left; position:absolute; top:6px; right:5px; width:15px; height:15px; background:transparent url(images/icons.gif) 0 0 no-repeat; cursor:pointer; }
|
||||
.mtt-tabs .list-action:hover, .mtt-tabs .list-action.mtt-menu-button-active { background-position:-16px 0; }
|
||||
.mtt-tabs li.mtt-tabs-selected span { margin-right:16px; }
|
||||
.mtt-tabs li.mtt-tabs-selected .list-action { display:block; }
|
||||
.mtt-tabs li.mtt-tabs-selected { background:#ededed url(images/corner_right.gif) no-repeat top right; border-left:1px solid #ededed; }
|
||||
.mtt-tabs li:hover a { color: #888888; }
|
||||
.mtt-tabs.mtt-tabs-only-one li { display:none; }
|
||||
.mtt-tabs.mtt-tabs-only-one li.mtt-tabs-selected { display:block; }
|
||||
#page_tasks.readonly .list-action { display:none; }
|
||||
#page_tasks.readonly li.mtt-tabs-selected span { margin-right:0; }
|
||||
|
||||
#tabs_buttons {
|
||||
float:right;
|
||||
padding-top:4px;
|
||||
padding-bottom:3px;
|
||||
padding-left:2px;
|
||||
padding-right:2px;
|
||||
border:1px solid #ededed;
|
||||
border-bottom:none;
|
||||
-moz-border-radius-topleft:5px; -webkit-border-top-left-radius:5px; border-top-left-radius:5px;
|
||||
-moz-border-radius-topright:5px; -webkit-border-top-right-radius:5px; border-top-right-radius:5px;
|
||||
}
|
||||
|
||||
.mtt-tabs-button {
|
||||
float:left;
|
||||
font-size:0.9em;
|
||||
padding:1px; /* makes button bigger */
|
||||
border:1px solid transparent; /* preallocate space for :hover border */
|
||||
}
|
||||
|
||||
.mtt-tabs-button span {
|
||||
display:block;
|
||||
width:16px;
|
||||
height:16px;
|
||||
}
|
||||
|
||||
.mtt-tabs-button:hover, .mtt-tabs-button.mtt-menu-button-active {
|
||||
border:1px solid #ccc; -moz-border-radius:3px; -webkit-border-radius:3px; border-radius:3px;
|
||||
}
|
||||
|
||||
.mtt-tabs-add-button>span { background:url(images/buttons.png) 0 0 no-repeat; }
|
||||
.mtt-tabs-add-button:hover>span { background-position:-16px 0; }
|
||||
.mtt-tabs-select-button>span { background:url(images/icons.gif) -64px 0 no-repeat; }
|
||||
.mtt-tabs-select-button:hover>span, .mtt-tabs-select-button.mtt-menu-button-active>span { background-position:-80px 0; }
|
||||
|
||||
.mtt-htabs { clear:both; padding:8px; border-bottom:2px solid #DEDEDE; background:#ededed; }
|
||||
|
||||
.mtt-img-button { width:16px; height:16px; padding:2px; border:1px solid transparent; display:inline-block; }
|
||||
.mtt-img-button:hover { border:1px solid #ccc; -moz-border-radius:3px; -webkit-border-radius:3px; border-radius:3px; }
|
||||
.mtt-img-button span { display:inline-block; width:16px; height:16px; }
|
||||
|
||||
.arrdown { display:inline-block; height:7px; width:9px; background:url(images/arrdown.gif); }
|
||||
.arrdown2 { display:inline-block; height:7px; width:7px; background:url(images/arrdown2.gif); }
|
||||
|
||||
|
||||
/* Quick Task Add */
|
||||
|
||||
.mtt-taskbox td.mtt-tb-cell { padding:0px; width:350px; }
|
||||
.mtt-tb-c { position:relative; padding-left:22px; /*input padding+border*/ }
|
||||
#task { color:#444444; background:#fff; height:1.35em; padding:2px; padding-right:18px; border:1px inset #F0F0F0; width:100%; margin-left:-22px; }
|
||||
#task_placeholder span { display:none; color:#ccc; position:absolute; left:0; top:0; height:1.35em; line-height:1.35em; padding:3px; /*input top and left padding+border*/ }
|
||||
#task_placeholder.placeholding span { display:inline-block; }
|
||||
|
||||
.mtt-taskbox-icon { width:16px; height:16px; position:absolute; top:50%; margin-top:-8px; }
|
||||
.mtt-taskbox-icon.mtt-icon-submittask { background:url(images/mzl.png) 0px -32px no-repeat; right:4px; }
|
||||
|
||||
#newtask_adv span { background:url(images/buttons.png) 0 -48px no-repeat; }
|
||||
#newtask_adv:hover span { background-position:-16px -48px; }
|
||||
|
||||
|
||||
/* Live Search */
|
||||
#htab_search { float:right; }
|
||||
#search {
|
||||
color:#444444; background:#fff; height:1.35em; padding:2px 18px; width:100%; margin-left:-38px; /*padding+border*/
|
||||
border:1px inset #F0F0F0; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px;
|
||||
}
|
||||
#search_close { display:none; }
|
||||
|
||||
.mtt-searchbox td { padding:0px; width:180px; }
|
||||
.mtt-searchbox-c { position:relative; padding-left:38px; /*input padding+border*/ }
|
||||
.mtt-searchbox-icon { width:16px; height:16px; position:absolute; top:50%; margin-top:-8px; }
|
||||
|
||||
.mtt-searchbox-icon.mtt-icon-search { background:url(images/mzl.png) 0px -16px no-repeat; left:4px; }
|
||||
.mtt-searchbox-icon.mtt-icon-cancelsearch { background:url(images/mzl.png) 0px 0px no-repeat; right:4px; }
|
||||
|
||||
#searchbar { font-size:1em; font-weight:normal; display:none; margin-top:5px; }
|
||||
#searchbarkeyword { font-weight:bold; }
|
||||
|
||||
|
||||
/* */
|
||||
.mtt-notes-showhide { font-size:0.8em; font-weight:normal; margin-left:2px; margin-right:2px; }
|
||||
.mtt-notes-showhide a { text-decoration:none; border-bottom:1px dotted; }
|
||||
|
||||
#mtt_filters { font-size:0.8em; font-weight:normal; }
|
||||
.tag-filter { margin-left:3px; margin-right:3px; }
|
||||
.tag-filter-exclude { text-decoration:line-through; }
|
||||
.mtt-filter-header { font-weight:bold; margin-right:.33em; }
|
||||
.mtt-filter-close { cursor:pointer; position:relative; top:2px; margin-left:3px; display:inline-block; width:10px; height:10px; background:url(images/closetag.gif) 0 0 no-repeat; }
|
||||
|
||||
.task-left { float:left; }
|
||||
.task-toggle { visibility:hidden; margin-top:2px; cursor:pointer; width:15px; height:15px; float:left; background:url(images/icons.gif) -32px 0 no-repeat; }
|
||||
.task-toggle { visibility:hidden; margin-top:2px; cursor:pointer; width:15px; height:15px; float:left; background:url(images/icons.gif) -64px -16px no-repeat; }
|
||||
li.task-has-note .task-toggle { visibility:visible; }
|
||||
li.task-expanded .task-toggle { background-position:-48px 0; }
|
||||
li.task-expanded .task-toggle { background-position:-80px -16px; }
|
||||
.task-middle { margin-left:40px; margin-right:25px; }
|
||||
#tasklist { list-style-type: none; margin: 0; padding: 0;}
|
||||
#tasklist li { padding:6px 2px 6px 6px; border-bottom:1px solid #DEDEDE; min-height:18px; margin-bottom:1px; background-color:#fff; }
|
||||
#tasklist li:hover { background-color:#f6f6f6; }
|
||||
.task-actions { float:right; width:25px; text-align:right; }
|
||||
.task-date { color:#999999; font-size:8pt; margin-left:4px; display:none; }
|
||||
.task-date { display:inline-block; min-width:55px; color:#999999; margin-right:10px; display:none; }
|
||||
.task-date-completed { color:#999999; display:none; margin-left:5px; }
|
||||
.show-inline-date .task-date { display:inline; }
|
||||
.show-inline-date li.task-completed .task-date-completed { display:inline; }
|
||||
.task-through { overflow:hidden; }
|
||||
.task-through-right { float:right; }
|
||||
.task-title a { color:#000000; }
|
||||
.task-title a:hover { color:#af0000; }
|
||||
#page_tasks.readonly #tasklist li .task-actions { display:none; }
|
||||
.task-tags { padding:0px 2px; }
|
||||
.task-tags .tag { font-size:8pt; font-weight:bold; color:#333333; text-decoration:underline; }
|
||||
.task-tags .tag { font-size:0.8em; font-weight:bold; color:#333333; text-decoration:underline; }
|
||||
.task-tags .tag:hover { }
|
||||
.duedate { color:#333333; border-bottom:1px dotted #333333; padding:0px; padding-left:1px; margin-left:5px; float:right; }
|
||||
#tasklist li.soon .duedate { color:#008000; border-color:#008000; }
|
||||
#tasklist li.today .duedate { color:#FF0000; border-color:#FF0000; }
|
||||
#tasklist li.past .duedate { color:#A52A2A; border-color:#A52A2A; }
|
||||
li.task-completed .task-through { text-decoration:line-through; color:#777777; }
|
||||
li.task-completed .task-title a { color:#777777; }
|
||||
#tasklist li.task-completed .duedate { color:#777777; border-color:#777777; }
|
||||
li.task-completed { opacity:0.8; }
|
||||
li.task-completed .task-toggle { opacity:0.8; }
|
||||
.duedate { color:#333333; padding:0px; padding-left:1px; margin-left:5px; }
|
||||
li.task-completed .duedate { /*font-size:0.8em;*/ display:none; }
|
||||
#tasklist li.soon .duedate { color:#008000; }
|
||||
#tasklist li.today .duedate { color:#FF0000; }
|
||||
#tasklist li.past .duedate { color:#A52A2A; }
|
||||
li.task-completed .task-middle { text-decoration:line-through; color:#777777;}
|
||||
li.task-completed .task-date, li.task-completed .task-date-completed, li.task-completed .task-title a { color:#777777; }
|
||||
li.task-completed { opacity:0.7; filter: alpha(opacity=70); }
|
||||
li.not-in-tagpreview { opacity:0.1; filter: alpha(opacity=10); }
|
||||
#tasklist li.mtt-task-placeholder {
|
||||
min-height:0px; padding:0px; height:18px; line-height:18px;
|
||||
background-color:#ddd; border:1px solid #aaa;
|
||||
-moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;
|
||||
}
|
||||
|
||||
a.taskactionbtn { display:block; float:right; height:15px; width:15px; text-decoration:none; background:url(images/icons.gif) 0 0 no-repeat; }
|
||||
li:hover a.taskactionbtn, a.taskactionbtn.mtt-menu-button-active { background-position:-16px 0; }
|
||||
|
|
@ -106,7 +194,7 @@ li.task-expanded .task-note-block { display:block; }
|
|||
li.task-completed .task-note-block .task-note { text-decoration:line-through; }
|
||||
.task-note-area { display:none; margin-bottom:5px; }
|
||||
.task-note-area textarea { color:#999999; width:100%; display:block; height:65px; }
|
||||
.task-note-actions { font-size:8pt; }
|
||||
.task-note-actions { font-size:0.8em; }
|
||||
.hidden { display:none; }
|
||||
.invisible { visibility:hidden; }
|
||||
.in500 { width:500px; color:#444444; }
|
||||
|
|
@ -114,7 +202,7 @@ li.task-completed .task-note-block .task-note { text-decoration:line-through; }
|
|||
.task-note span a { color:#777777; }
|
||||
.task-note span a:hover { color:#af0000; }
|
||||
|
||||
.task-prio { padding-left:2px; padding-right:2px; margin-left:0px; margin-right:4px; cursor:default; }
|
||||
.task-prio { padding-left:2px; padding-right:2px; margin-left:0px; margin-right:5px; cursor:default; }
|
||||
.prio-neg { background-color:#3377ff; color:#ffffff; }
|
||||
.prio-pos { background-color:#ff3333; color:#ffffff; }
|
||||
.prio-pos-1 { background-color:#ff7700; color:#ffffff; }
|
||||
|
|
@ -124,18 +212,19 @@ li.task-completed .task-note-block .task-note { text-decoration:line-through; }
|
|||
.form-row { margin-top:8px; }
|
||||
.form-row .h { font-weight:bold; color:#333333; }
|
||||
.form-row-short-end { clear:both; }
|
||||
#overlay { position:fixed; z-index:200; background-color:#111111; display:none; top:0px; left:0px; width:100%; height:100%; }
|
||||
#page_taskedit { position:fixed; z-index:201; background-color:#fdfdfd; padding:8px; border:1px solid #cccccc; width:510px; }
|
||||
#page_taskedit .form-row { max-width:700px; }
|
||||
#page_taskedit .form-row .in500 { width:99%; }
|
||||
#page_taskedit .form-row textarea.in500 { height:130px; /*resize:none;*/ }
|
||||
#page_taskedit .form-row textarea.in500 { height:200px; /*resize:none;*/ }
|
||||
#page_taskedit .form-row-short { float:left; margin-right:12px; }
|
||||
.ui-icon-gripsmall-diagonal-se { background:url(images/icons.gif) 0 -16px; }
|
||||
#page_taskedit .form-bottom-buttons { text-align:center; }
|
||||
#alltags .tag { font-weight:bold; color:#333333; }
|
||||
#alltags .tag:hover { background-color:#999988; color:white; }
|
||||
.alltags-cell { width:1%; white-space:nowrap; padding-left:5px; }
|
||||
#page_taskedit.mtt-inadd .mtt-inedit { display:none; }
|
||||
#page_taskedit.mtt-inedit .mtt-inadd { display:none; }
|
||||
#taskedit-date { font-size:10pt; font-weight:normal; text-align:right; float:right; color:#777; }
|
||||
#taskedit-date { font-size:1em; font-weight:normal; display:inline; color:#777; margin-left:8px; }
|
||||
|
||||
a.mtt-back-button { font-size:0.8em; }
|
||||
|
||||
/* autocomplete */
|
||||
.ac_results { padding:0px; border:1px solid #cccccc; background-color:#f9f9f9; overflow:hidden; z-index:99999; -moz-box-shadow:1px 2px 5px rgba(0,0,0,0.5); -webkit-box-shadow:1px 2px 5px rgba(0,0,0,0.5); }
|
||||
|
|
@ -150,11 +239,13 @@ li.task-completed .task-note-block .task-note { text-decoration:line-through; }
|
|||
#priopopup .prio-pos:hover { border-color:#ff3333; }
|
||||
#priopopup .prio-pos-1:hover { border-color:#ff7700; }
|
||||
|
||||
#tagcloudbtn { margin-left:2px; margin-right:2px; font-size:8pt; font-weight:normal; border-bottom:1px dashed #ccc; padding:2px; cursor:pointer; -moz-user-select:none; -webkit-user-select: none; }
|
||||
#tagcloudbtn:hover { border-bottom:1px solid #bbb; }
|
||||
#tagcloudbtn .tag { font-weight:bold; }
|
||||
#tagcloudload { display:none; }
|
||||
#tagcloud { overflow: hidden; z-index:100; background-color:#f9f9f9; border:1px solid #cccccc; padding:5px; width:400px; text-align:center; -moz-box-shadow:1px 2px 5px rgba(0,0,0,0.5); -webkit-box-shadow:1px 2px 5px rgba(0,0,0,0.5); }
|
||||
#tagcloudbtn { margin-right:2px; font-size:0.8em; font-weight:normal; padding:2px; float:right; }
|
||||
#tagcloudload { display:none; height:24px; background:url(images/loading1_24.gif) center no-repeat; }
|
||||
#tagcloud {
|
||||
overflow: hidden; z-index:100; background-color:#f9f9f9; border:1px solid #cccccc; padding:5px;
|
||||
width:100%; max-width:450px; margin:0px 7px 7px 7px; text-align:center;
|
||||
-moz-box-shadow:1px 2px 5px rgba(0,0,0,0.5); -webkit-box-shadow:1px 2px 5px rgba(0,0,0,0.5);
|
||||
}
|
||||
#tagcloud .tag { margin:1px 0px; padding:2px; line-height:140%; color:black; }
|
||||
#tagcloud .tag:hover { background-color:#999988; color:white; }
|
||||
#tagcloud .w0 { font-size:80%; }
|
||||
|
|
@ -167,59 +258,74 @@ li.task-completed .task-note-block .task-note { text-decoration:line-through; }
|
|||
#tagcloud .w7 { font-size:150%; }
|
||||
#tagcloud .w8 { font-size:160%; }
|
||||
#tagcloud .w9 { font-size:170%; }
|
||||
#tagcloudcancel { border:1px solid #cccccc; padding:2px; margin-bottom:4px; cursor:pointer; background-color:#fdfdfd; }
|
||||
#tagcloudcancel:hover { border-color:#aaaaaa; }
|
||||
|
||||
#taskview { padding:1px 2px; }
|
||||
#tagcloudcancel { float:right; }
|
||||
#tagcloudcancel span { background:url(images/buttons.png) 0 -32px no-repeat; }
|
||||
#tagcloudcancel span:hover { background-position:-16px -32px; }
|
||||
|
||||
.ui-datepicker { width:180px; z-index:202; border: 1px solid #cccccc; background: #ffffff; display:none; padding:2px; }
|
||||
#taskview { padding:2px; }
|
||||
|
||||
.ui-datepicker { width:190px; z-index:202; border: 1px solid #cccccc; background: #ffffff; display:none; padding:2px;
|
||||
-moz-box-shadow:1px 2px 5px rgba(0,0,0,0.5); -webkit-box-shadow:1px 2px 5px rgba(0,0,0,0.5); box-shadow:1px 2px 5px rgba(0,0,0,0.5);
|
||||
-moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;
|
||||
}
|
||||
.ui-datepicker-trigger { cursor:pointer; vertical-align:text-bottom; margin-left:1px; }
|
||||
.ui-datepicker-calendar { width:100%; border-collapse:collapse; }
|
||||
.ui-datepicker-calendar thead th { text-align:center; padding:0px; font-size:9pt; }
|
||||
.ui-datepicker-calendar thead th { text-align:center; padding:0px; font-size:0.9em; }
|
||||
.ui-datepicker-calendar tbody td { text-align:right; padding:1px; }
|
||||
.ui-datepicker-calendar td a { display:block; text-decoration:none; color:#444444; border:1px solid #cccccc; background-color:#f9f9f9; color:#111; padding:0px 1px; }
|
||||
.ui-datepicker-calendar td.ui-datepicker-today a { color:#666666; background-color:#fff; }
|
||||
.ui-datepicker-calendar td a { display:block; text-decoration:none; color:#444444; border:1px solid #cccccc; background-color:#f9f9f9; color:#111; padding:1px; }
|
||||
.ui-datepicker-calendar td.ui-datepicker-current-day a { background-color:#EAF5FF; color:#222222; border-color:#5980FF; }
|
||||
.ui-datepicker-calendar td a:hover { color:#5980FF; }
|
||||
.ui-datepicker-calendar td.ui-datepicker-today a { color:#fff; background-color:#ccc; }
|
||||
.ui-datepicker-calendar td a:hover { border-color:#5980FF; }
|
||||
.ui-datepicker-header { padding:3px 0px; }
|
||||
.ui-datepicker-prev { position:absolute; left:2px;}
|
||||
.ui-datepicker-next { position:absolute; right:2px;}
|
||||
.ui-datepicker-title { text-align:center; }
|
||||
.ui-datepicker-prev, .ui-datepicker-next { cursor:pointer; padding:0px 3px; }
|
||||
.ui-datepicker-prev { position:absolute; left:2px; height:20px; text-decoration:none; }
|
||||
.ui-datepicker-next { position:absolute; right:2px; height:20px; text-decoration:none; }
|
||||
.ui-datepicker-title { text-align:center; line-height:20px; }
|
||||
.ui-icon { width:16px; height:16px; text-indent:-99999px; overflow:hidden; }
|
||||
.ui-datepicker .ui-icon-circle-triangle-w { display:block; position:absolute; top:50%; margin-top:-8px; left:50%; background:url(images/icons.gif) -48px -16px no-repeat; }
|
||||
.ui-datepicker .ui-icon-circle-triangle-e { display:block; position:absolute; top:50%; margin-top:-8px; right:50%; background:url(images/icons.gif) -32px -16px no-repeat; }
|
||||
|
||||
.ui-resizable { position:relative;}
|
||||
.ui-resizable-handle { position:absolute; font-size:0.1px; z-index:99999; display:block;}
|
||||
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display:none; }
|
||||
.ui-resizable-s { cursor:s-resize; height:7px; width:100%; bottom:-5px; left:0px; }
|
||||
.ui-resizable-e { cursor:e-resize; width:7px; right:-5px; top:0px; height:100%; }
|
||||
.ui-resizable-se { cursor:se-resize; width:12px; height:12px; right:1px; bottom:1px; }
|
||||
.mtt-menu-button {
|
||||
-moz-user-select:none; -webkit-user-select: none;
|
||||
cursor:pointer;
|
||||
border:1px solid transparent;
|
||||
}
|
||||
.mtt-menu-button:hover, .mtt-menu-button.mtt-menu-button-active {
|
||||
border:1px solid #ccc; -moz-border-radius:3px; -webkit-border-radius:3px; border-radius:3px;
|
||||
}
|
||||
|
||||
.mtt-btnmenu { border-bottom:1px dashed #ccc; padding:2px 2px; -moz-user-select:none; -webkit-user-select: none; }
|
||||
.mtt-btnmenu:hover { cursor:pointer; border-bottom:1px solid #bbb; }
|
||||
|
||||
.mtt-btnmenu-container {
|
||||
.mtt-menu-container {
|
||||
overflow:hidden; z-index:100;
|
||||
background-color:#f9f9f9; border:1px solid #cccccc; padding:2px;
|
||||
-moz-box-shadow:1px 2px 5px rgba(0,0,0,0.5); -webkit-box-shadow:1px 2px 5px rgba(0,0,0,0.5); margin:0px 7px 7px 0px;
|
||||
background-color:#f9f9f9; border:1px solid #cccccc; padding:2px 0px;
|
||||
-moz-box-shadow:1px 2px 5px rgba(0,0,0,0.5); -webkit-box-shadow:1px 2px 5px rgba(0,0,0,0.5); box-shadow:1px 2px 5px rgba(0,0,0,0.5);
|
||||
-moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;
|
||||
margin:0px 7px 7px 0px; /* for shadows */
|
||||
}
|
||||
.mtt-btnmenu-container ul { list-style: none; padding:0; margin:0; }
|
||||
.mtt-btnmenu-container li { margin:1px 0px; padding:2px 3px; cursor:pointer; color:#000; white-space:nowrap; }
|
||||
.mtt-btnmenu-container li:hover, .mtt-btnmenu-container li.mtt-menu-item-active { background-color:#316AC5; color:white; }
|
||||
.mtt-btnmenu-container li.mtt-disabled { color:#ACA899; }
|
||||
.mtt-btnmenu-container a { display:block; text-decoration:none; outline:none; color:#000; }
|
||||
.mtt-btnmenu-container li:hover a { color:white; }
|
||||
.mtt-btnmenu-container.mtt-menu-has-images li { padding-left:18px; }
|
||||
.mtt-btnmenu-container li.mtt-btnmenu-delimiter { height:0px; line-height:0; border-bottom:1px solid #cccccc; margin:2px -1px; padding:0px; font-size:0px; }
|
||||
li.mtt-item-checked .menu-icon { float:left; width:16px; height:16px; margin-left:-18px; background:url(images/icons.gif) -16px -16px; }
|
||||
.mtt-btnmenu-container.mtt-menu-has-submenu li { padding-right:18px; }
|
||||
.mtt-menu-container ul { list-style: none; padding:0; margin:0; }
|
||||
.mtt-menu-container li { margin:1px 0px; cursor:default; color:#000; white-space:nowrap; padding:0.15em 0px; padding-left:24px; padding-right:18px; position:relative; }
|
||||
.mtt-menu-container li:hover, .mtt-menu-container li.mtt-menu-item-active {
|
||||
background-color:#316AC5;
|
||||
color:white;
|
||||
background:-moz-linear-gradient(#5373fc, #3157f4);
|
||||
background:-webkit-gradient(linear, left top, left bottom, from(#5373fc), to(#3157f4));
|
||||
}
|
||||
.mtt-menu-container li.mtt-disabled { color:#ACA899; }
|
||||
.mtt-menu-container a { display:block; cursor:default; text-decoration:none; outline:none; color:#000; }
|
||||
.mtt-menu-container li:hover a { color:white; }
|
||||
.mtt-menu-container li.mtt-menu-delimiter { height:0px; line-height:0; border-bottom:1px solid #cccccc; margin:2px -1px; padding:0px; font-size:0px; }
|
||||
.mtt-menu-container .menu-icon { width:16px; height:16px; position:absolute; left:4px; top:50%; margin-top:-8px; }
|
||||
li.mtt-item-checked .menu-icon { background:url(images/icons.gif) -16px -16px; }
|
||||
li.mtt-menu-indicator .submenu-icon {
|
||||
/*float:right; margin-right:-18px;*/ position:absolute; right:2px; /* specially for IE7 */
|
||||
position:absolute; right:2px; top:50%; margin-top:-8px;
|
||||
width:16px; height:16px; background:url(images/icons.gif) -32px -16px no-repeat;
|
||||
}
|
||||
|
||||
#btnRssFeed .menu-icon { background:url(images/buttons.png) -16px -64px no-repeat; }
|
||||
#btnRssFeed.mtt-disabled .menu-icon { background:url(images/buttons.png) 0px -64px no-repeat; }
|
||||
|
||||
.mtt-settings-table { width:100%; border-collapse:collapse; }
|
||||
.mtt-settings-table th, .mtt-settings-table td { border-bottom:1px solid #dedede; padding:8px; vertical-align:top; }
|
||||
.mtt-settings-table .form-buttons { border-bottom:none; text-align:center; }
|
||||
.mtt-settings-table th { text-align:left; width:210px; padding-left:8px; }
|
||||
.mtt-settings-table .descr { font-size:8pt; font-weight:normal; color:#222; }
|
||||
.mtt-settings-table .descr { font-size:0.8em; font-weight:normal; color:#222; }
|
||||
.mtt-settings-table .in350 { min-width:350px; }
|
||||
|
|
|
|||
|
|
@ -1,12 +1,21 @@
|
|||
body { direction:rtl; }
|
||||
h2 { float:right; }
|
||||
h2 { float:right; padding-left:10px; padding-right:0px; }
|
||||
.bar-menu { float:left; }
|
||||
#loading { float:right; }
|
||||
#lists .mtt-tabs { float:right; }
|
||||
#rss_icon { float:left; }
|
||||
.mtt-tabs li { float:right; margin:1px 0 0 3px; border-left:none; border-right:1px solid #ededed; background:#fbfbfb url(images/tab_hover.gif) no-repeat top left; }
|
||||
.mtt-tabs li.mtt-tabs-selected { border-left:none; border-right:1px solid #ededed; background:#ededed url(images/corner_left.gif) no-repeat top left; }
|
||||
.mtt-htabs { background:url(images/corner_left.gif) no-repeat top left #ededed; }
|
||||
|
||||
#tabs_buttons { float:left; }
|
||||
.mtt-tabs-button { float:right; }
|
||||
#tagcloudbtn { float:left; }
|
||||
|
||||
#htab_search { float:left; }
|
||||
#task { padding: 2px 2px 2px 18px; }
|
||||
#task_placeholder span { right:0px; left:auto; }
|
||||
.mtt-taskbox-icon.mtt-icon-submittask { left:4px; right:auto; }
|
||||
.mtt-searchbox-icon.mtt-icon-search { right:4px; left:auto; }
|
||||
.mtt-searchbox-icon.mtt-icon-cancelsearch { left:4px; right:auto; }
|
||||
|
||||
.task-actions { float:left; text-align:left; width:15px; }
|
||||
.task-left { float:right; }
|
||||
|
|
@ -14,6 +23,10 @@ h2 { float:right; }
|
|||
.task-middle { margin-right:40px; margin-left:25px; }
|
||||
.task-date { margin-right:4px; }
|
||||
.duedate { float:left; margin-left:0; margin-right:5px; }
|
||||
.duedate-arrow { display:none; }
|
||||
.duedate:before { content:'\2190'; }
|
||||
.task-through-right { float:left; }
|
||||
|
||||
#taskedit-date { float:left; }
|
||||
#page_taskedit .form-row-short { float:right; margin-left:12px; margin-right:0; }
|
||||
.task-prio { float:right; margin-left:4px; margin-right:0; }
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
1.3.6
|
||||
1.4a
|
||||