// copyright 2006 (c) Richard 'Sorki' Marko
// please let me know if youre usin' something of this
// it will be presented as independent project with examples, comments and server side code soon
//
//    /\
//   /__\ 
//  /    \ jax  part
// TODO: documentation, reorganize
// QUESTION: overall compatibility?

// a what, b - before what
function insertAfter(of,a,b) {
  of.insertBefore(a,b);
  of.insertBefore(b,a);
  }
function insertHTMLAfter(base,html,element) {
  var ehtml = document.createElement('div');
  ehtml.innerHTML = html;
  insertAfter(base,ehtml,element);
  }
function insertHTMLAfterNamedInput(base,html,inputname) {
  var ehtml = document.createElement('div');
  ehtml.innerHTML = html;
  var inputs = document.getElementsByTagName('input');
  var i_i = inputs.length;
  while(i_i--) {
    if(inputs[i_i].name == inputname) { var input = inputs[i_i]; break; }    
    }
  var inputs = document.getElementsByTagName('textarea');
  var i_i = inputs.length;
  while(i_i--) {
    if(inputs[i_i].name == inputname) { var input = inputs[i_i]; break; }    
    }
  insertAfter(input.parentNode,ehtml,input);
  }
function insertULAfterNamedInput(base,ULelement,inputname) {
  var frmNodes = base.getElementsByTagName('input');
  var i_i = frmNodes.length;
  while(i_i--) {
    if(frmNodes[i_i].name == inputname) { var input = frmNodes[i_i]; break; }    
    }
  var inputs = document.getElementsByTagName('textarea');
  var i_i = inputs.length;
  while(i_i--) {
    if(inputs[i_i].name == inputname) { var input = inputs[i_i]; break; }    
    }
  insertAfter(input.parentNode,ULelement,input);
  }
function filterTrash(from) {
  var uls = from.getElementsByTagName('ul');
  var i_i = uls.length;
  while(i_i--) {
    uls[i_i].parentNode.removeChild(uls[i_i]);
    }
  var respdivs = document.getElementsByTagName('div');
  i_i = respdivs.length;
  while(i_i--) {
    if(respdivs[i_i].className == 'responsebDiv' || respdivs[i_i].className == 'responseaDiv') {
      respdivs[i_i].parentNode.removeChild(respdivs[i_i]);
      }
    }
  }
function divIDGet(from,id) {
  var respdivs = document.getElementsByTagName('div');
  var i_i = respdivs.length;
  while(i_i--) {
    if(respdivs[i_i].id == id) {
      return respdivs[i_i]; break;
      }
    }
  return 0;
  }
function replaceForm(form,replacewith) {
  var replacer = document.createElement('div');
  replacer.innerHTML = replacewith;
  form.parentNode.replaceChild(replacer,form);
  }
function beforeForm(form,data) {
  var before = document.createElement('div');
  before.innerHTML = data;
  form.parentNode.insertBefore(before,form);
  }
function resultBeforeForm(form,data) {
  var before = document.createElement('div');
  before.innerHTML = data;
  before.className = 'responsebDiv';
  var respdivs = document.getElementsByTagName('div');
  var i_i = respdivs.length;
  while(i_i--) {
    if(respdivs[i_i].className == before.className) {
      respdivs[i_i].parentNode.removeChild(respdivs[i_i]);
      }
    }
  form.parentNode.insertBefore(before,form);
  }
function afterForm(form,data) {
  var after = document.createElement('div');
  after.innerHTML = data;
  insertAfter(form.parentNode,after,form);
  }
function resultAfterForm(form,data) {
  var after = document.createElement('div');
  after.innerHTML = data;
  after.className = 'responseaDiv';
  var respdivs = document.getElementsByTagName('div');
  var i_i = respdivs.length;
  while(i_i--) {
    if(respdivs[i_i].className == after.className) {
      respdivs[i_i].parentNode.removeChild(respdivs[i_i]);
      }
    }
  insertAfter(form.parentNode,after,form);
  }
function disableSubmits(form) {
  var submits = document.getElementsByTagName('input');
  var s_i = submits.length;
  while(s_i--) {
    if(submits[s_i].type.match(/\bsubmit\b/) && submits[s_i].form == form) { submits[s_i].disabled = true; }    
    }
  }
function enableSubmits(form) {
  var submits = document.getElementsByTagName('input');
  var s_i = submits.length;
  while(s_i--) {
    if(submits[s_i].type == 'submit' && submits[s_i].form == form) { submits[s_i].disabled = false; }  
    }
  }
function URLencode(what)
{
	return encodeURIComponent(what);
  };


var xstep = 0;

function startFade(r, g, b, steps, forClass) {
  xstep = 0;
  ered = r; egrn = g; eblu = b; 
  inc = steps;
  faderRoutine(forClass);
  }
function getStepColor(step) {
  var diff
  var newcolor=new Array(3);
  for(var i=0;i<3;i++) {
    diff = (startcolor[i]-endcolor[i]);
    if(diff > 0) {
      newcolor[i] = startcolor[i]-(Math.round((diff/maxsteps))*step);
      } else {
      newcolor[i] = startcolor[i]+(Math.round((Math.abs(diff)/maxsteps))*step);
      }
      }
  return ("rgb(" + newcolor[0] + ", " + newcolor[1] + ", " + newcolor[2] + ")");
  }
function faderRoutine(setForClass) {
  var elem = document.getElementsByTagName('ul');
  for (var i = 0; i < elem.length; i++) {
    if (elem[i].className == setForClass) {
      var lis = elem[i].getElementsByTagName('li');
      for(var j = 0; j<lis.length; j++) {
        lis[j].style.color = getStepColor(xstep)
        }
      }
    }
  if ( xstep < maxsteps ) {
    setTimeout('faderRoutine(\''+setForClass+'\')',delay); 
    }
  xstep++;
  }




function ifrDoc(iframe_el){
  var doc = iframe_el.contentDocument ||((iframe_el.contentWindow)&&(iframe_el.contentWindow.document)) || ((iframe_el.name)&&(document.frames[iframe_el.name])&&(document.frames[iframe_el.name].document)) || null;
  return doc;
  }
var initcalled = false;
function initajax() {
  if(!initcalled) {
    if (!Sarissa || !document.getElementById) return;
    var formElements = document.getElementsByTagName('form');
    for (var i = 0; i < formElements.length; i++) {
      if (formElements[i].className.match(/\bajaxme\b/)) {
        addEvent(formElements[i], 'submit', submitFrm, false);
        var submits = document.getElementsByTagName('input');
        for (var x = 0; x < submits.length; x++) {
          if (submits[x].type == 'submit') {
            addEvent(submits[x], 'click', addProperty, false);
            }
          if (submits[x].type == 'file') {
            var tmp = submits[x];
            var ifrm = document.createElement('iframe');
            // TODO: add support for files and image maps/images
            //var ifrmd = ifrDoc(ifrm);
            var txt = document.createElement('div');
            txt.innerHTML = 'FILES not supported yet';
            ///ifrmd.appendChild(txt);
            ifrm.frameBorder = 0;
            tmp.parentNode.replaceChild(txt,tmp);
            
            }
          }
        }
      }
    initcalled = true;
    }
  
  }
function reajax() {
  //alert('xxx');
  //if (!Sarissa || !document.getElementById) return;
  var formElements = document.getElementsByTagName('form');
  //alert('reajax on '+formElements.length+' elems');
  for (var i = 0; i < formElements.length; i++) {
    if (formElements[i].className.match(/\bajaxme\b/)) {
      removeEvent(formElements[i], 'submit', submitFrm);
      addEvent(formElements[i], 'submit', submitFrm, false);
      var submits = formElements[i].getElementsByTagName('input');
      for (var x = 0; x < submits.length; x++) {
        if (submits[x].type == 'submit') {
          removeEvent(submits[x], 'click', addProperty);
          addEvent(submits[x], 'click', addProperty, false);
          }
        }
      }
    
    }
  
  }

function addProperty(e) {
  
  var btn = window.event ? window.event.srcElement : e ? e.target : null;
  var x = btn;
  while(!x.parentNode.nodeName.match(/form/i) && x.parentNode != document) {
    x = x.parentNode;
    }
  x.parentNode.pressedSubmit = btn;
  //this.form.pressedSubmit // not supported by IE 
  }
function submitFrm(e) {
  
  killEvent(e);
  var target = window.event ? window.event.srcElement : e ? e.target : null;
  if (!target) return;
  
  var xmlhttp =  new XMLHttpRequest();
  var mez = '';
  if(window.location.href.match(/\?/)) {
    mez = '&'; 
    } else {
    // nasty mod_rewrite hacks
    if(!window.location.href.match(new RegExp('(/a/|/adm/|/admin/|/administ/|/administrator/|/administration/)'))) {
      mez = '';
      } else {
      mez = '?';
      }
      }
    
    xmlhttp.open('POST', window.location.href+mez+'givmeajax='+target.id, true);
    
    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState == 4) {
        if (xmlhttp.status == 200)
          if(xmlhttp.responseXML) {feedback(xmlhttp.responseXML, target); }
        else
          target.submit();
          }
      }
    /* Send the POST request */
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    var inps = target.elements;
    var cn = inps.length;
    var query = 'pressed='+target.pressedSubmit.value;
    query += '&'+target.pressedSubmit.name+'='+target.pressedSubmit.value;
    for(var i=0; i<cn; i++) {
      if(target.elements[i].nodeName != 'FIELDSET' && target.elements[i].type != 'submit' && target.elements[i].type != 'reset' && target.elements[i].type != 'button') {
        if(target.elements[i].type == 'checkbox' || target.elements[i].type == 'radio') {
          if(target.elements[i].checked == true) query += '&'+target.elements[i].name+'='+URLencode(target.elements[i].value);
          } else {
          if(target.elements[i].type == 'select-multiple') {
            var selected = '';
            for (var l=0; l < target.elements[i].length; l++) {
              if (target.elements[i][l].selected) {
                selected += target.elements[i][l].value + '||';
                }
              }
            query += '&'+target.elements[i].name+'='+URLencode(selected);
            } else {
            query += '&'+target.elements[i].name+'='+URLencode(target.elements[i].value);
            }
            }
          }
      }
    //if(debug) trace(query);
    xmlhttp.send(query);
    disableSubmits(target);
    var loadingImg = document.createElement('img');
    loadingImg.src = wImg;
    loadingImg.className = 'lImg';
    insertAfter(target.pressedSubmit.parentNode,loadingImg,target.pressedSubmit);
    }
var captchalink = '';
function reloadCaptchas() {
  var Imgs = document.getElementsByTagName('img');
  var i = Imgs.length;
  while(i--) {
    if(Imgs[i].className == 'captcha') {
      captchalink = Imgs[i].src;
      Imgs[i].src = wImg;
      }
    }
  setTimeout('newCaptchas()',1000);
  }
function newCaptchas() {
  var Imgs = document.getElementsByTagName('img');
  var i = Imgs.length;
  while(i--) {
    if(Imgs[i].className == 'captcha') {
      Imgs[i].src = captchalink+'&'+Math.round(100*Math.random())+'a'+Math.round(100*Math.random());
      }
    }
  }
function feedback(responseXML, target) {
  //if(debug) trace(Sarissa.serialize(responseXML));
  var bug = document.getElementById('home')
  if(bug) {
    bug.style.display='none';
    }
  var Imgs = document.getElementsByTagName('img');
  var i = Imgs.length;
  var limgs = 0;
  var loadingImgs = new Array();
  var cps = 0;
  var captchas = new Array();
  
  while(i--) {
    if(Imgs[i].className == 'lImg') {
      loadingImgs[limgs++] = Imgs[i];
      }
    }
  // find out which image has parent equal to target
  //limgs = loadingImgs.length;
  while(limgs--) {
    var x = loadingImgs[limgs];
    while(x.parentNode != target && x.parentNode != document) {
      x = x.parentNode;
      }
    if(x.parentNode == target) { var loadingImg = loadingImgs[limgs]; break; }
    }
  var action = responseXML.getElementsByTagName('action')[0].firstChild.data;
  filterTrash(target);
  var actions = action.length;
  var current = '';
  var replace = true;
  if(action.charAt(actions-1) == 'R') { replace = true; } else { replace = false; }
  for(var cur=0;cur<actions;cur++) {
    current = action.charAt(cur);
    switch(current) {
      case 'E':
      var errorlist = responseXML.getElementsByTagName('errorlist')[0];
      var errors = errorlist.getElementsByTagName('err');
      i = errors.length;
      while(i--) {
        var element = errors[i].getElementsByTagName('field')[0].firstChild.data;
        var msgs = errors[i].getElementsByTagName('msg');
        var m = msgs.length;
        var ul = document.createElement('ul');
        ul.className = 'ertext';
        while(m--) {
          var LIelement = document.createElement('li');
          LIelement.appendChild(document.createTextNode(msgs[m].firstChild.data));
          ul.appendChild(LIelement);
          }
        insertULAfterNamedInput(target,ul,element);
        }
      startFade(0xFF,0xFF,0xFF, 10, 'ertext');
      break;
      case 'W':
      replaceForm(target,responseXML.getElementsByTagName('data')[0].firstChild.data);
      break;
      case 'B':
      if(replace) {
        resultBeforeForm(target,responseXML.getElementsByTagName('data')[0].firstChild.data);
        } else {
        beforeForm(target,responseXML.getElementsByTagName('data')[0].firstChild.data);
        }
        break;
        case 'A':
        if(replace) {
          resultAfterForm(target,responseXML.getElementsByTagName('data')[0].firstChild.data);
          } else {
          afterForm(target,responseXML.getElementsByTagName('data')[0].firstChild.data);
          }
          break;
          case 'D':
          if(replace) {
            var data = responseXML.getElementsByTagName('rdata')[0];
            var rd = data.getElementsByTagName('rdiv');
            i = rd.length;
            //if(debug) { trace('elements:' + i); }
            while(i--) {
              var id = rd[i].getElementsByTagName('id')[0].firstChild.data;
              var indata = rd[i].getElementsByTagName('in')[0].firstChild.data;
              //if(debug) { trace(id); trace(indata); } 
              //var div = document.getElementById(id);
              //var ndiv = document.createElement('div');
              //ndiv.innerHTML = indata;
              var div = divIDGet(target,id);
              if(div) div.innerHTML = indata;
              
              }
            } else {
            var data = responseXML.getElementsByTagName('rdata')[0];
            var rd = data.getElementsByTagName('rdiv');
            i = rd.length;
            //if(debug) { trace('elements:' + i); }
            while(i--) {
              var id = rd[i].getElementsByTagName('id')[0].firstChild.data;
              var indata = rd[i].getElementsByTagName('in')[0].firstChild.data;
              //if(debug) { trace(id); trace(indata); } 
              var div = document.getElementById(id);
              if(div && indata != '') { div.innerHTML += indata; }
              }
            }
            break;
            case 'S':
            window.scrollTo(0,0);
            break;
            case 'O':
            if(replace) {
              var data = responseXML.getElementsByTagName('rdata')[0];
              var rd = data.getElementsByTagName('elem');
              var id = rd[0].getElementsByTagName('id')[0].firstChild.data;
              var indata = rd[0].getElementsByTagName('set')[0].firstChild.data;
              //var div = divIDGet(target,id);
              var elem = document.getElementById(id)
              if(elem) elem.innerHTML = indata;
              
              } else {
              var data = responseXML.getElementsByTagName('rdata')[0];
              var rd = data.getElementsByTagName('elem');
              var id = rd[0].getElementsByTagName('id')[0].firstChild.data;
              var indata = rd[0].getElementsByTagName('set')[0].firstChild.data;
              //var div = divIDGet(target,id);
              var elem = document.getElementById(id)
              if(elem) elem.innerHTML += indata;
              }
              break;
              case 'X':
              replaceForm(target,'Transfering ...');
              var data = responseXML.getElementsByTagName('data')[0].firstChild.data;
              if(data != ' ') {
                var where = data; 
                } else {
                var where = window.location.href;
                }
                window.location.href= where;
                break;
                }
    
    }
  
  reloadCaptchas();
  loadingImg.parentNode.removeChild(loadingImg);
  enableSubmits(target);
  reajax();
  stripe();
  }       
function addEvent(element, eventType, lamdaFunction, useCapture) {
  if (element.addEventListener) {
    element.addEventListener(eventType, lamdaFunction, useCapture);
    return true;
    } else if (element.attachEvent) {
    var r = element.attachEvent('on' + eventType, lamdaFunction);
    return r;
    } else {
    return false;
    }
    }
function removeEvent(element, type, fn) {
  if (element.detachEvent) {
    element.detachEvent( 'on'+type, fn );
    } else
  element.removeEventListener(type, fn, false);
  }
function killEvent(eventObject) {
  if (eventObject && eventObject.stopPropagation) {
    eventObject.stopPropagation();
    }
  if (window.event && window.event.cancelBubble ) {
    window.event.cancelBubble = true;
    }
  
  if (eventObject && eventObject.preventDefault) {
    eventObject.preventDefault();
    }
  if (window.event) {
    window.event.returnValue = false;
    }
  }

////// simple Session KeepAlive //////
/// --- (c) Richard "sorki" Marko 
/// --- feel free to use


//  var pattern = ".+'\"'+.,.+'\"'+.,";
//  var replace = "                  ";
var pattern = "|||||||||||||||||";
var replace = "                 ";
var timeout = 5000;
var start = pattern.length;

function keepalive(cnt) {
  
  if (Sarissa && document.getElementById) {
    
    var status = document.getElementById("ck_stat");
    if(status != null) {
      if(cnt == 0) {
        status.innerHTML = pattern.substr(0,cnt)+replace.substr(cnt,start-cnt);
        var mez = '';
        if(window.location.href.match(/\?/)) {
          mez = '&'; 
          } else {
          mez = '?';
          }
          var keep =  new XMLHttpRequest();
          keep.open('GET', window.location.href+mez+'connection_keep_alive=true', true);
          keep.onreadystatechange = function() {
            if (keep.readyState == 4) {
              if (keep.status == 200) {
                if(keep.responseText) { setTimeout('keepalive('+start+')',100); }
                }
              }
            }
          keep.send('?keepalive');  // use die() in script when this passed
          
          
          } else { status.innerHTML = pattern.substr(0,cnt)+replace.substr(cnt,start-cnt); cnt--; setTimeout('keepalive('+cnt+')',timeout); }
          }
    }
  }
//   SSS
//  S
//   SSS
//      S
//  SSSS  triped tables
// for original version see www.alistapart.com .. i've made many modifications that may not help you

// this function is need to work around 
// a bug in IE related to element attributes
function hasClass(obj) {
  var result = false;
  if (obj.getAttributeNode("class") != null) {
    result = obj.getAttributeNode("class").value;
    }
  return result;
  }   

function stripe() {
  var even = false;
  var tables = document.getElementsByTagName('table');
  if (! tables) { return; }
  for (var k = 0; k < tables.length; k++) {
    if (tables[k].className.match(/\bstripe\b/)) {
      var tbodies = tables[k].getElementsByTagName("tbody");
      for (var h = 0; h < tbodies.length; h++) {
        var trs = tbodies[h].getElementsByTagName("tr");
        for (var i = 0; i < trs.length; i++) {
          if (!hasClass(trs[i]) && ! trs[i].style.backgroundColor) {
            var tds = trs[i].getElementsByTagName("td");
            for (var j = 0; j < tds.length; j++) {
              var mytd = tds[j];
              //mytd.className = even ? evenStyle : oddStyle; // class not workin' well in OP
              mytd.style.backgroundColor = even ? evenColor : oddColor;
              }
            }
          // flip from odd to even, or vice-versa
          even =  ! even;
          }
        }
      }
    }
  }
/////// DropDown menus ///////
function ddMenus() {
  if (document.getElementById) {
    navRootV = document.getElementById("navV");
    if(navRootV != null) {
      var lnodes = navRootV.childNodes;
      }
    if(lnodes) {
      for (i=0; i<lnodes.length; i++) {
        node = lnodes[i];
        if (node.nodeName=="LI") {
          node.onmouseover=function() {
            this.className+=" over";
            }
          node.onmouseout=function() {
            this.className=this.className.replace(" over", "");
            }
          }
        }
      }
    }
  }
/////// OTHER //////
function shCh(el) {
  div = document.getElementById(el);
  div.style.display = (div.style.display == 'none' || div.style.display == '') ? 'block' : 'none';
  }
/// Extern links ///
function blankLinks() {
  if (!document.getElementsByTagName) return;
  var anchors = document.getElementsByTagName("a");
  for (var i=0; i<anchors.length; i++) {
    var anchor = anchors[i];
    if (anchor.getAttribute("href") &&
        anchor.getAttribute("rel") == "e")
    anchor.target = "_blank";
    }
  }
function move_home() {
  var c = document.getElementById('products');
  var h = document.getElementById('home');
  if(h) {
    insertAfter(c,h,document.getElementById('discussion'));
    h.style.display='block';
    }
  var sub = document.getElementById('about');
  var l = document.getElementById('left_menu');
  var p = document.getElementById('page')
 if(sub) {
    insertAfter(p, sub, l);
    sub.style.display='block';
    }
  
  }
/// search box background ///
function init_search_box() {
  var elem = document.getElementById('srchf0');
  if(elem) {
    var b = function() {
      if (elem.value == '') {
        elem.style.background = '#BBCCEE  url(http://astronom.sk/img/v2/sboxbg.gif) left no-repeat';
        }
      };
    var f = function() {
      elem.style.background = '#BBCCEE';
      };
    elem.onfocus = f;
    elem.onblur = b;
    b();
    }
  }
function apod_rollovers() {
  var elem = document.getElementById('rollover');
  if(elem) {
    var elem2 = document.getElementById('rollover_over');
    imgon  = new Image(); imgon.src = elem2.src; 
    imgout = new Image(); imgout.src = elem.src;
    var over = function() {
      elem.src = imgon.src;
      }
    var out = function() {
      elem.src = imgout.src;
      }
    elem.onmouseover = over;
    elem.onmouseout = out;
    }
  }
var objects = document.getElementsByTagName("object");

function eolas(i)
{
    objects[i].outerHTML = objects[i].outerHTML;
}

for (var i=0; i<objects.length; i++)
    window.setTimeout("eolas(" + i + ")", 1);

/// massive onload ///
function multiload() {
  move_home();
  blankLinks();
  initajax();
  ddMenus();
  stripe();
  init_search_box();
  keepalive(start);
  apod_rollovers();
  }

addEvent(window, 'load', multiload, false);
