

//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 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("btn_Submit")){
  //  document.getElementById("btn_Submit").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("btn_Submit")){
  //  document.getElementById("btn_Submit").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;
}


/*RDT Functions*/

  if (parent.document.getElementById("Frame1")){
    ssAddEvent(window,'load',initialiseChangeHeight);
    ssAddEvent(window,'load',initialiseScrollDown);
    ssAddEvent(window,'load',initialiseViewAllScrolling);
    ssAddEvent(window,'load',initialiseFrameClearer);
    ssAddEvent(window,'resize',initialiseChangeHeight);
    ssAddEvent(window,'load',initialiseTargetChange);
    ssAddEvent(window,'load',initialiseAddiFrames);

  }

  function initialiseChangeHeight(){
    changeHeight(intCurrentiFrame);
  }

  function initialiseScrollDown(){
    doScrollDown(intCurrentiFrame);
  }
  function initialiseViewAllScrolling(){
    doScrollOfViewAll(intCurrentiFrame);
  }


  function initialiseFrameClearer(){
    clearFrames(intCurrentiFrame);
  }

  function initialiseTargetChange(){
    changeTarget(intCurrentiFrame);
  }

  function initialiseAddiFrames(){
    addiFrames(intCurrentiFrame);
  }



  function changeHeight(intCurrentiFrame){
    if(document.getElementById("bottomOfPage")){

      parent.document.getElementById("Frame"+intCurrentiFrame).height=document.getElementById("bottomOfPage").offsetTop+10*1;
    }
  }

  function clearFrames(intCurrentiFrame){
    //clear any frames below
    for (i = intCurrentiFrame+1;i != 100;i++){
      strFrameName = 'Frame' + i
      if(parent.document.getElementById(strFrameName)){
        if (parent.document.getElementById(strFrameName).height!=0){
          parent.document.getElementById(strFrameName).height=0;
          parent.document.getElementById(strFrameName).src="";
        }
      }
    }
  }

  function changeTarget(intCurrentiFrame){
    var bodys = document.getElementsByTagName("body");
    if ((ssHasClass(bodys[0],"edit")) || (ssHasClass(bodys[0],"new")) || (ssHasClass(bodys[0],"datagrid")) || (ssHasClass(bodys[0],"file"))){
      //set the target of the form to be the next iFrame, unless its the parent of a subprocess
      var forms = document.getElementsByTagName("form");
      if (document.getElementById("subprocesstag")){
      }
      else{
        for (var i=0; i!=forms.length; i++){
          if (parent.document.getElementById("FrameContainer1")){
            var objTemp = forms[i].setAttribute("target","Frame"+(intCurrentiFrame+1));
          }
        }
      }
    }
  }

  function addiFrames(intCurrentiFrame){
    var bodys = document.getElementsByTagName("body");
    if ((ssHasClass(bodys[0],"edit")) || (ssHasClass(bodys[0],"new")) || (ssHasClass(bodys[0],"datagrid")) || (ssHasClass(bodys[0],"file"))){
      //add extra iFrames if they are not yet present
      if (parent.document.getElementById("FrameContainer" + (intCurrentiFrame+2))){
      }
      else{
        if (window.parent.al && window.parent.bl){
          window.parent.al(intCurrentiFrame+2);
          window.parent.bl(intCurrentiFrame+2);
        }
      }
    }
  }

  function doScrollDown(intCurrentiFrame){
    var bodys = document.getElementsByTagName("body");
    if ((ssHasClass(bodys[0],"edit")) || (ssHasClass(bodys[0],"new")) || (ssHasClass(bodys[0],"datagrid")) || (ssHasClass(bodys[0],"file"))){

      if (parent.document.getElementById("FrameContainer1")){
      //scroll to bottom
        self.setTimeout("window.parent.intelligentScrollDown(" + intCurrentiFrame + ");",20)
      }
    }
  }

  function doScrollOfViewAll(intCurrentiFrame){
    var bodys = document.getElementsByTagName("body");
    if (ssHasClass(bodys[0],"viewall")) {
      if (intCurrentiFrame==1){


        //for (i=1;i!=301;i++){
        //  top.window.scrollBy(0,-1);

        //}

        self.setTimeout("window.parent.intelligentViewAllScrollDown(" + intCurrentiFrame + ");",20)




      }
      else{
		//it is a view all page in a subprocess - no tested yet
        for (i=1;i!=301;i++){
          top.window.scrollBy(0,5);
        }
	  }
    }
  }



