

//generic ajax and event handling functions

function ssAddLoadEvent(func)
{
  var oldonload = window.onload;
  if (typeof window.onload != 'function')
  {
    //window.onload = func;
    ssAddEvent(window, "load", func, false);
  }
  else{
    //window.onload = function(){
    //  func();
    //  oldonload();
    //}
    ssAddEvent(window, "load", func, false);
  }
}

function ssAddEvent(obj, evType, fn, useCapture)
{
  if (obj.addEventListener)
  {
    obj.addEventListener(evType, fn, useCapture);
    return true;
  }
  else if (obj.attachEvent)
  {
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  }
  else
  {
    alert(obj.id +"Handler could not be attached");
  }
}

function ssRemoveEvent(obj, evType, fn, useCapture)
{
  if (obj.ssRemoveEventListener)
  {
    obj.ssRemoveEventListener(evType, fn, useCapture);
    return true;
  }
  else if (obj.detachEvent)
  {
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  }
  else
  {
    alert("Handler could not be removed");
  }
}

function ssExtractEl(e)
{
  var el;
  if (window.event && window.event.srcElement)
  {
    el = window.event.srcElement;
  }
  if (e && e.target)
  {
    el = e.target;
  }
  if(!el)
  {
    return;
  }
  return el;
}

function ssStopTheRest(e)
{
  if (window.event)
  {
    window.event.cancelBubble = true;
    window.event.returnvalue = false;
  }
  if (e && e.stopPropagation && e.preventDefault)
  {
    e.stopPropagation();
    e.preventDefault();
  }
  else{
    return false;
  }
}

function ssGetHTTPObject()
{
  var xhr = false;
  if (window.XMLHttpRequest)
  {
    xhr = new XMLHttpRequest();
  }
  else if (window.ActiveXObject)
  {
    try
    {
      xhr = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e)
    {
      try
      {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(e)
      {
        xhr = false;
      }
    }
  }
  return xhr;
}

//GET functions
function ssGrabFile(destination,file)
{
  //example usage: ssGrabFile('one','Test.asp');
  //always recommended that this is used with divs or spans as the target - i.e. does not seem to always work on ps or other things
  var request = ssGetHTTPObject();
  if (request) {
    request.onreadystatechange = function()
    {
      ssDisplayResponse(destination,request);
    };
    fltRandomNumber = Math.random();
    //add a ?_ if the string does not include a ?
    if(file.search(/\?/i)==-1)
    {
      file = file + "?x=x"
    }
    request.open("GET", file + "&blnAjax=Yes&fltDummy=" + fltRandomNumber, true);
    request.send(null);
  }
}

function ssDisplayResponse(destination,request)
{
  if (request.readyState == 4)
  {
    if (request.status == 200 || request.status == 304)
    {
      document.getElementById(destination).innerHTML = request.responseText;
    }
  }
}

//POST functions
function ssPostForm(destination,strNameOfForm)
{
  var el = document.getElementById(strNameOfForm);
  file = el.action;
  var data = "";
  for (var i=0; i<el.elements.length; i++)
  {
    //only let the types you need through, so things like the submit button do not get sent (and only let a radio through once - i.e. if it is checked)
    if((el.elements[i].type=="hidden") || (el.elements[i].type=="text") || (el.elements[i].type=="textarea") || (el.elements[i].type=="select-one") || (el.elements[i].type=="checkbox") || (el.elements[i].type=="radio") || (el.elements[i].type=="file"))
    {
      //next we exclude unchecked radios (so as not to send two values through), and only pass a checkbox if it is checked
      if(((el.elements[i].type!="radio") || ((el.elements[i].type="radio") && (el.elements[i].checked))) && ((el.elements[i].type!="checkbox") || ((el.elements[i].type="checkbox") && (el.elements[i].checked))) )
      {
        data+= el.elements[i].name;
        data+= "=";
        data+= escape(el.elements[i].value);
        data+= "&";
      }
    }
  }
  data+= "blnAjax=Yes&"
  fltRandomNumber = Math.random();
  data+= "dummy=" + fltRandomNumber + "&"
  //if(document.getElementById("btnSubmit")){
  //  document.getElementById("btnSubmit").disabled="disabled"
  //}
  return !ssSendData(el,destination,file,data,"POST");
}

function ssSendData(source,destination,file,data,requesttype)
{
  var request = ssGetHTTPObject();
  if (request) {
    request.onreadystatechange = function()
    {
      ssParseResponse(source,destination,file,request);
    };
    request.open(requesttype, file, true );
    request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    request.send(data);
    return true;
  }
  else{
    return false;
  }
}

function ssParseResponse(source,destination,file,request)
{
  if (request.readyState == 4)
  {
    if (request.status == 200 || request.status == 304)
    {
      var container = document.getElementById(destination);
      container.innerHTML = request.responseText;
    }
  }
}

function ssGetForm(destination,strNameOfForm)
{
  //this posts a form as GET rather than POST (i.e. it passes query strings)
  var el = document.getElementById(strNameOfForm);
  file = el.action;
  var data = "";
  for (var i=0; i<el.elements.length; i++)
  {
    //only let the types you need through, so things like the submit button do not get sent (and only let a radio through once - i.e. if it is checked)
    if((el.elements[i].type=="hidden") || (el.elements[i].type=="text") || (el.elements[i].type=="textarea") || (el.elements[i].type=="select-one") || (el.elements[i].type=="checkbox") || (el.elements[i].type=="radio") || (el.elements[i].type=="file")){
      //next we exclude unchecked radios (so as not to send two values through), and only pass a checkbox if it is checked
      if(((el.elements[i].type!="radio") || ((el.elements[i].type="radio") && (el.elements[i].checked))) && ((el.elements[i].type!="checkbox") || ((el.elements[i].type="checkbox") && (el.elements[i].checked))) )
      {
        data+= el.elements[i].name;
        data+= "=";
        data+= escape(el.elements[i].value);
        data+= "&";
      }
    }
  }
  data=data.substring(0,data.length-1)
  //if(document.getElementById("btnSubmit")){
  //  document.getElementById("btnSubmit").disabled="disabled"
  //}

  ssGrabFile(destination,file  + "?" + data)
}

//CLASS functions
function ssHasClass(target, classValue)
{
  var pattern = new RegExp("(^| )" + classValue + "( |$)");
  if (target.className.match(pattern))
  {
    return true;
  }
  return false;
}

function ssAddClass(target, classValue)
{
  if (!ssHasClass(target, classValue))
  {
    if (target.className == "")
    {
      target.className = classValue;
    }
    else{
      target.className += " " + classValue;
    }
  }
  return true;
}

function ssRemoveClass(target, classValue)
{
  var removedClass = target.className;
  var pattern = new RegExp("(^| )" + classValue + "( |$)");
  removedClass = removedClass.replace(pattern, "$1");
  removedClass = removedClass.replace(/ $/, "");
  target.className = removedClass;
  return true;
}

function ssGetElementsByClass( searchClass, domNode, tagName)
{
  if (domNode == null) domNode = document;
  if (tagName == null) tagName = '*';
  var el = new Array();
  var tags = domNode.getElementsByTagName(tagName);
  var tcl = " "+searchClass+" ";
  for(i=0,j=0; i<tags.length; i++)
  {
    var test = " " + tags[i].className + " ";
    if (test.indexOf(tcl) != -1)
    {
      el[j++] = tags[i];
    }
  }
  return el;
}



