// ==UserScript==
// @name        Salon25
// @namespace   http://juljas.net/
// @description Rozszerzenia do Salonu 3, v1.00
// @copyrights  (C) greasemonkey & follow
// @include     http://*.salon24.pl/*
// @exclude     http://*http://*.salon24.pl/*
//

/*
ver 1.0
- poprawia 'link do komentarza' (right-mouse-click -> Copy Link Location)
- dodaje 'skasuj' do moich i u mnie komentarzy
- dodaje link 'obserwuj' do górnego menu i usuwa 'start' i 'katalog blogów'
- pole odpowiedzi pod komentarz na który odpowiadam
- obserwowane w menu - ile nowych?
- nowa PW w skrzynce (link w menu)

BUGS
- autorefresh (i wczytywanie nie częściej niż!) do obserwowanych i nowej poczty
- po przesunięciu pola odpowiedzi na komentarz -  przycisk 'Skomentuj' pod notką nie przywraca pola

TODO

*/

$state = {
  my_domain : undefined,
  blog_domain : undefined,
  //runtime
  commentblock : undefined,
  commentblocklink : undefined,
  
  watched_new_answers : -1,
  watched_link : undefined,

  newmails : 0,
  newmails_li : undefined,
};

function main() {
  get_my_info();
  get_account_info();
  update_menu();
  update_comments();
}

main();


function get_my_info() {
  var cookies = document.cookie.split(' ');
//  GM_log(document.cookie);

  $state.blog_domain = document.domain.replace(/^www\./,'');
  GM_log('blog domain: ' + $state.blog_domain);

  for(c=0;c<cookies.length;c++) {
    cookies[c] = cookies[c].replace(/;$/,'');
    //GM_log('cookie: ' + cookies[c]);
  }

  for(c=0;c<cookies.length;c++) {
    cookie = cookies[c].split('=');
    if(cookie[0] == 's_us_name') {
      $state.my_domain = cookie[1];
      GM_log('my domain: ' + $state.my_domain);
    }
  }

}

function update_watch_page_info(responseDetails) {
  responseXML = new DOMParser().parseFromString(responseDetails.responseText, 'text/xml')
  //GM_log(responseXML);
  tds = getElementsByClass('new_items', responseXML, 'td');
  $state.watched_new_answers = 0;
  for(t=0;t<tds.length;t++)
    $state.watched_new_answers += parseInt(tds[t].innerHTML);

  GM_log('new answers: ' + $state.watched_new_answers);
  update_watched();

  tds = getElementsByClass('new_mails', responseXML, 'span');
  $state.newmails = tds.length;

  GM_log('new mails: ' + $state.newmails);
  update_newmails();

}

function get_account_info() {
  GM_log('get_account_info');
  loadPage('http://admin.salon24.pl/posts-comments-watch/', update_watch_page_info);

}



//// salon 2.0 import
function getElementsByCondition(condition,container,tag) {
  container = container||document;
  tag = tag||'*';
  var all = container.all||container.getElementsByTagName(tag);
  var arr = [];
  for(var k=0;k<all.length;k++) {
    var elm = all[k];
    if(condition(elm,k)) arr[arr.length] = elm;
  }
  return arr;
} 

function getElementsByClass(classname, container, tag) {
  var re = new RegExp('\\b'+classname+'\\b');
  return getElementsByCondition(function(el){if(el.className && el.className.match(re)) return el;}, container, tag);
}

function getElementByClass(classname, container, tag) {
  var re = new RegExp('\\b'+classname+'\\b');
  var ret = getElementsByCondition(function(el){if(el.className && el.className.match(re)) return el;}, container, tag);
  if(ret.length>0) return ret[0];
}
function addEvent(obj, evType, fn) {
  if(!obj) return false;
  if (obj.addEventListener) {
    obj.addEventListener(evType, fn, false);
    return true;
  } else if (obj.attachEvent) {
    var r = obj.attachEvent("on" + evType, fn);
    return r;
  } else {
    return false;
  }
}

function loadPage(address, onLoad, onError) {
  GM_xmlhttpRequest({
    method: 'GET',
    url: address,
    headers: {
      'Cookie': document.cookie,
      //'Accept-Charset': 'ISO-8859-2',
      'X-Requested-With': 'XMLHttpRequest',
    },
    onload: function(responseDetails) {
      //GM_log('status:' + responseDetails.status);
      if(responseDetails.status != 200) {
	//hideLoadingInfo();
	GM_log('status:\n' + responseDetails.status);
	GM_log('statustext:\n'+responseDetails.statusText);
	GM_log('responsetext:\n'+responseDetails.responseText);
	return;
      }	

      if(onLoad) onLoad(responseDetails);
    },
    onerror: function(responseDetails) {
      GM_log('status:\n' + responseDetails.status);
      GM_log('statustext:\n'+responseDetails.statusText);
      GM_log('responsetext:\n'+responseDetails.responseText);
      //hideLoadingInfo();
      if(onError) onError(responseDetails);
    }
  });
}


////

function update_watched() {
  if(!$state.watched_link)
    return;
  if($state.watched_new_answers > 0) {
    $state.watched_link.innerHTML = 'obserwowane ('+ $state.watched_new_answers + ')';
    $state.watched_link.style.color='red';
  } else {
    $state.watched_link.innerHTML = 'obserwowane';
    $state.watched_link.style.color='';
  }
}

function update_newmails() {
  if(!$state.newmails_li)
    return;
  if($state.newmails > 0)
    $state.newmails_li.style.display = 'list-item';
  else
    $state.newmails_li.style.display = 'none';
}


function createLink(url, text) {
  a = document.createElement('a');
  a.href = url;
  a.innerHTML = text;
  return a;
}


function update_menu() {

  menu = document.getElementById('service-navi');
  if(!menu) return 1;

  //schowaj 'start' i 'katalog blogów' z menu
  for(i=0; i<menu.childNodes.length; i++) {
    if(!menu.childNodes[i].firstChild) 
      continue;
    if(menu.childNodes[i].firstChild.innerHTML == 'start')
      menu.childNodes[i].style.display = 'none';
    if(menu.childNodes[i].firstChild.innerHTML == 'katalog blogów')
      menu.childNodes[i].style.display = 'none';
    if(menu.childNodes[i].firstChild.innerHTML == 'wyloguj się')
      menu_logout = menu.childNodes[i];
  }

  //dodaj 'obserwowane' do menu
  if($state.my_domain && menu_logout) {
    //deayed add to menu - otherwise endless loop in for
    watched = document.createElement('li');
    watched.style.display = 'list-item';
    $state.watched_link = createLink('http://admin.salon24.pl/posts-comments-watch/', 'obserwowane');
    watched.appendChild($state.watched_link);
    update_watched();

    $state.newmails_li = document.createElement('li');
    $state.newmails_li.style.display = 'list-item';
    link = createLink('http://admin.salon24.pl/mail/', 'nowa poczta');
    link.style.color = 'red';
    $state.newmails_li.appendChild(link);
    update_newmails();

    menu.insertBefore(watched, menu_logout);
    menu.insertBefore($state.newmails_li, menu_logout);
  }
}

function delete_comment(my, comment, link) {
  var id = get_comment_id(comment);

  if(link.style.color!='red') {
    link.innerHTML = 'na pewno skasować?'; 
    link.style.color='red';
    return 0;
  }
 
  var url;
  if(my)
    url = 'http://admin.salon24.pl/comments-my-delete-json/' +id;
  else
    url = 'http://admin.salon24.pl/comments-delete-json/' + id;

  loadPage(url,
      function (responseDetails) { 
	//GM_log('skasowano');
        link.innerHTML = 'skasowany';
	comment.style.display = 'none';
	return 0;
      },
      function (responseDetails) {
        link.innerHTML = 'nie udało się skasować';
	return 0;
      }
 );
}

function get_comment_id(comment) {
  for(f=0;f<comment.childNodes.length;f++) {
    field = comment.childNodes[f];
    if(field.nodeName == "A" && field.name) {
      commentname = field.name;
      u = commentname.indexOf('_');
      commentid = commentname.slice(u+1);
      break;
    }
  }
  return commentid;
}


function comment_answer(comment, to_author) {
  //GM_log('answer to @' + to_author);
  if(!$state.commentblock) {
    $state.commentblock = document.getElementById('post-comment-body');
    $state.commentblock.style.marginTop='5px';

  }
  if(!$state.commentblocklink) {
    $state.commentblocklink = $state.commentblock.previousSibling;
    if($state.commentblocklink.nodeName != 'A')
      //some textNode in between
      $state.commentblocklink = $state.commentblocklink.previousSibling;
  }

  $state.commentblock.parentNode.removeChild($state.commentblocklink);
  $state.commentblock.parentNode.removeChild($state.commentblock);

  nextcomment = comment.nextSibling;
  comment.parentNode.insertBefore($state.commentblocklink,comment);
  comment.parentNode.insertBefore($state.commentblock,nextcomment);

}

function update_comments() {

  //linki do kasowania komentarzy
  commentsul = getElementByClass('comments-list',document,'ul');
  if(!commentsul) return 1;

  comments = commentsul.childNodes;
  //GM_log('have ' + comments.length + ' comments');
  for(c=0;c<comments.length;c++) {
    if(comments[c].className != 'comment')
      continue;
    //GM_log('next comment have ' + comments[c].childNodes.length + ' fields');
    for(f=0;f<comments[c].childNodes.length;f++) {
      field = comments[c].childNodes[f];
      //GM_log('name ' + field.nodeName);
      if(field.nodeName == "A" && field.name) {
	commentname = field.name;
	u = commentname.indexOf('_');
	commentid = commentname.slice(u+1);
	//GM_log('comment ' + commentname + ' id ' + commentid);
      }
      if(field.className=='author') {
	nick = getElementByClass('author-nick', field);
	author_domain=nick.host;
	author_nick = nick.innerHTML;
	//d = author_domain.indexOf('.');
	//authordomain = author_domain.slice(0,d);
	//GM_log(author_domain);
      }

      if(field.className=='comment-navi') {
	//GM_log('comment-navi');
	
	clink = canswer = null;
	for(n=0;n<field.childNodes.length;n++) {
	  switch(field.childNodes[n].innerHTML) {
	    case 'link do komentarza': clink = field.childNodes[n]; break;
	    case 'odpowiedz': canswer = field.childNodes[n]; break;
	  }
	}

	//popraw 'link do komentarza'
	if(clink && commentname) {
	  //GM_log(ltc.parentNode.innerHTML);
	  clink.href = clink.parentNode.innerHTML.replace(/.*showLink\('([^']*)'\).*/,'$1@').split("@",1)[0];
	  //clink.href = '#' + commentname;
	  clink.title = commentid;
	}

	var adel = null;
	if($state.my_domain && author_domain == $state.my_domain && commentid) {
	  //kasowanie własnych komentarzy (gdziekolwiek)
	  adel = createLink('#delete_my_comment_' + commentid, 'skasuj');
	  addEvent(adel, 'click', function(e) { delete_comment(true,this.parentNode.parentNode,this); e.preventDefault(); } );
	} else if($state.blog_domain == $state.my_domain) {
	  //kasowanie cudzych komentarzy na mim blogu
	  adel = createLink('#delete_comment_' + commentid, 'skasuj');
	  addEvent(adel, 'click', function(e) { delete_comment(false,this.parentNode.parentNode,this); e.preventDefault(); } );
	}
	if(adel && canswer) {
	  field.insertBefore(adel, canswer);
	  field.insertBefore(document.createTextNode(' '), canswer);
	}

	if(canswer) {
	  //aans = createLink('#mycomment', 'odp');
	  //aans.setAttribute('author_nick', author_nick);
	  //addEvent(aans, 'click', function(e) { comment_answer( this.parentNode.parentNode, this.getAttribute('author_nick')); e.preventDefault(); } );
	  //field.appendChild(document.createTextNode(' '));
	  //field.appendChild(aans);
	  canswer.setAttribute('author_nick', author_nick);
	  addEvent(canswer, 'click', function(e) { comment_answer( this.parentNode.parentNode, this.getAttribute('author_nick')); e.preventDefault(); } );
	}

      }
    }
  }
}

