Browse Source

- roster keyboard navigation x+1th version

pull/16/head
Christine Ho 13 years ago
parent
commit
b2fef1d3b1
  1. 268
      system/Widget/widgets/Roster/roster.js

268
system/Widget/widgets/Roster/roster.js

@ -48,14 +48,22 @@ function incomingPresence(val) {
function focusContact(){
rosterlist = document.querySelector('#rosterlist');
if(rosterlist.querySelector('.focused') == null){
allLi="";
//offline are shown
if(rosterlist.querySelectorAll(".offline").length !=0 && rosterlist.querySelectorAll(".offline").style!=""){
rosterlist.querySelector("li").className += " focused";
if(rosterlist.className!=""){
allLi = rosterlist.querySelectorAll("li");
}
//offline are hidden
else{
rosterlist.querySelector("li:not(.offline)").className += " focused";
allLi = rosterlist.querySelectorAll("li:not(.offline)");
}
for(j=0; j<allLi.length; j++){
if(rosterInArray(allLi[j], allLi)){
allLi[j].className += " focused";
break;
}
}
document.querySelector('#right').scrollTop = 0;
}
else{
@ -64,45 +72,30 @@ function focusContact(){
}
function rosterNextGroup(cgp){
thisGp = gp[0];
while(cgp != thisGp){
thisGp = thisGp.nextSibling;
}
//here thisGp=cgp
if(thisGp.nextSibling.nextSibling != null){
thisGp = thisGp.nextSibling.nextSibling;
if(rosterInArray(thisGp.querySelector("li"), thisGp.querySelectorAll("li"))){//offline are shown
currContact = thisGp.querySelector("li");
console.log(currContact);
if(cgp.nextSibling.nextSibling != null){
cgp = cgp.nextSibling.nextSibling;
while(cgp.className == "" && cgp != gp[gp.length-1]){ //do not read hidden groups
rosterNextGroup(cgp);
}
if(rosterInArray(cgp.querySelector("li"), cgp.querySelectorAll("li"))){
returned = cgp.querySelector("li");
}
else{
rosterNext(thisGp.querySelector("li"));
rosterNext(cgp.querySelector("li"));
}
}
}
function rosterInArray(thing, array){
for(i=0; i<array.length; i++){
if(array[i] == thing){
visibility = thing.currentStyle ? thing.currentStyle.display :
getComputedStyle(thing, null).display;
if(visibility != "none"){
return true;
}
}
}
return false;
}
function rosterNext(currFocus){
currGp = currFocus.parentNode;
viable = false;
gp = rosterlist.querySelectorAll("div:not([class='chat on'])");
//querySelectorAll is used to be able to get nextsiblings
currContact = currGp.querySelectorAll("li")[0];
returned = "";
//Define contact end limit
visible = "";
currentGroupVisible = "";
if(rosterlist.class != ""){//offline are shown
visible = rosterlist.querySelectorAll("li");
currentGroupVisible = currGp.querySelectorAll("li");
@ -114,154 +107,86 @@ function rosterNext(currFocus){
last = visible[visible.length - 1];
if(currFocus != last){
while(currContact.className.lastIndexOf("focused") < 0){
currContact = currContact.nextSibling;
}
//here we have currContact = currFocus
currContact = currContact.nextSibling;
//here currContact can be null, visible, or invisible
if(currContact != null){
//search for currFocused or end of group
if(currFocus.nextSibling != null){ //not end of group
currFocus = currFocus.nextSibling;
//search for the next viable contact or find the end of the group
while(!rosterInArray(currContact, currentGroupVisible) && currContact != null){
currContact = currContact.nextSibling;
}
viable = true;
}
if(currContact == null || (currContact.nextSibling == null && !viable)){//Change groupe
if(currGp != gp[gp.length-1] && currContact == null){
rosterNextGroup(currGp);
}
else{//end of roster
//if(currContact == null)
currContact = currContact.previousSibling;
while(!rosterInArray(currFocus, currentGroupVisible) && currFocus.nextSibling != null){
currFocus = currFocus.nextSibling;
}
if(rosterInArray(currFocus, currentGroupVisible)){
viable = true;
returned = currFocus;
}
}
/*elseif(!end){
//offline are shown
if(rosterlist.className != ""){
while(currContact.style.display.lastIndexOf("none") > (-1) && !end){
if(currContact.nextSibling != null){
currContact = currContact.nextSibling;
}
else{
if(currGp != gp[gp.length-1])
rosterNextGroup(currGp);
else{
end = true;
}
}
}
}
//offline are hidden
else{
if((currContact.className.lastIndexOf("offline") > -1 || currContact.className.lastIndexOf("server") > -1) && !end){
console.log(currContact);
if(currContact != null){
contact = currContact;
}
else{
if(currGp != gp[gp.length-1])
rosterNextGroup(currGp);
else{
end = true;
}
}
}
if(currFocus.nextSibling == null && !viable){//Change groupe
if(currGp != gp[gp.length-1]){
rosterNextGroup(currGp);
}
if(end)
contact = currFocus;
else
contact = currContact;
}
else{
if(end)
contact = currFocus;
}*/
}
else{
currContact = currFocus;
}
}else{returned = currFocus;}
giveFocusTo(currContact);
giveFocusTo(returned);
}
/*function rosterPreviousGroup(cgp){
thisGp = gp[0];
if(cgp != thisGp){ //not first group
while(thisGp.nextSibling != cgp){
thisGp = thisGp.nextSibling;//change group
}
console.log(thisGp.querySelectorAll("li:not([style='display: none;'])")[0]);
while(thisGp.querySelectorAll("li:not([style='display: none;'])").length == 0 && thisGp != firstGroup){
thisGp = thisGp.previousSibling;
}
currGp = thisGp;
first = currGp.querySelector("li");
currContact = thisGp.querySelectorAll("li")[thisGp.querySelectorAll("li").length-1];
console.log(currContact);
function rosterPreviousGroup(cgp){
if(cgp.previousSibling.previousSibling != null){
cgp = cgp.previousSibling.previousSibling;
while(cgp.className == "" && cgp != gp[0]){ //do not read hidden groups
rosterPreviousGroup(cgp);
}
newLi = cgp.querySelectorAll("li");
newLi = newLi[newLi.length - 1];
if(rosterInArray(newLi, cgp.querySelectorAll("li"))){
returned = newLi;
}
else{
rosterPrevious(newLi);
}
}
}*/
}
/*function rosterPrevious(currFocus){
currGp = currFocus.parentNode;
function rosterPrevious(currFocus){
currGp = currFocus.parentNode;
viable = false;
gp = rosterlist.querySelectorAll("div:not([class='chat on'])");
firstGroup = gp[0];
end = false;
firstContact = currGp.querySelector("li");
//begin to read at the end of current group
currContact = currGp.querySelectorAll("li")[currGp.querySelectorAll("li").length -1];
//defining the upper limit
if(rosterlist.className != "")//offline are shown
first = rosterlist.querySelector("li:not([style='display: none;'])");
else
first = rosterlist.querySelector("li:not(.offline), li:not([style='display: none;'])");
returned = "";
visible = "";
currentGroupVisible = "";
//Define contact begin limit
if(rosterlist.class != ""){//offline are shown
visible = rosterlist.querySelectorAll("li");
currentGroupVisible = currGp.querySelectorAll("li");
}
else{
visible = rosterlist.querySelectorAll("li:not(.offline)");
currentGroupVisible = currGp.querySelectorAll("li:not(.offline)");
}
first = visible[0];
if(currFocus != first){
//til the focused is found, read backward
while(currContact.className.lastIndexOf("focused") < 0){
currContact = currContact.previousSibling;
}
console.log(currContact);
currContact = currContact.previousSibling;
if(currGp.querySelector("li") == currFocus){ //first contact of the group
rosterPreviousGroup(currGp);
}
if(currGp.querySelector("li") != currFocus && !end){
//offline are shown
if(rosterlist.querySelector(".offline").style.display != ""){
while(currContact.style.display.lastIndexOf("none") > (-1)){
if(currContact != firstContact){
currContact = currContact.previousSibling;
}
else{
rosterPreviousGroup(currGp);
}
}
if(end)
contact = currFocus;
else
contact = currContact;
//currentFocus' previous can be null, not li or viable
if(currFocus.previousSibling != null){ //not beginning of group
currFocus = currFocus.previousSibling;
//search for the next viable contact or find the end of the group
while(!rosterInArray(currFocus, currentGroupVisible) && currFocus.previousSibling != null){
currFocus = currFocus.previousSibling;
}
if(rosterInArray(currFocus, currentGroupVisible)){
viable = true;
returned = currFocus;
}
//offline are hidden
else{
while((currContact.className.lastIndexOf("offline") > -1 || currContact.className.lastIndexOf("server") > -1) && !end){
if(currContact != firstContact){
currContact = currContact.previousSibling;
}
else{
rosterPreviousGroup(currGp);
}
}
if(end)
contact = currFocus;
else
contact = currContact;
}
if(currFocus.previousSibling == null && !viable){//Change groupe
if(currGp != gp[0]){
rosterPreviousGroup(currGp);
}
}
}
else{
contact = currFocus;
}
}*/
}else{returned = currFocus;}
giveFocusTo(returned);
}
function giveFocusTo(newFocused){
focused = document.querySelector('#rosterlist').querySelector('.focused');
if(newFocused != focused){
@ -323,15 +248,22 @@ function rosterSearch(e){
}
break;
}
/*if(focused.className == (focused.className = focused.className.replace(" focused", "")))
focused.className = focused.className.replace("focused", "");
if(contact.className.lastIndexOf("focused")<0){
contact.className += " focused";
console.log("303");
}*/
}
}
}
function rosterInArray(thing, array){
for(i=0; i<array.length; i++){
if(array[i] == thing){
visibility = thing.currentStyle ? thing.currentStyle.display :
getComputedStyle(thing, null).display;
if(visibility != "none"){
return true;
}
}
}
return false;
}
function rosterToggleGroup(h){
group = document.getElementById(h[0]);

Loading…
Cancel
Save