/* This notice must be untouched at all times.

Copyright (c) 2008 Albrecht Stoecklein. All rights reserved.

This program is made available in the hope that it will be useful,
but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License
at http://www.gnu.org/copyleft/gpl.html for more details.
*/

function XMLExtract(ProcessStr, Tag) {
  ProcessStr = " " + ProcessStr;
	A = ProcessStr.split('<' + Tag + '>')[1];
  Value = A.split('</' + Tag + '>')[0];
  return Value;
}

function ParseXML(k) { // Calls the algorithm creator, inserts the insulation R-values and evaluates the term 
  if (MyConstrXML[k] != ''){
    MyString = CreateAlgorithm(MyConstrXML[k], k);
//  alert(MyString);
    document.getElementById("idTxtConstrR_" + k).value = Math.round(eval(MyString)*100)/100;
  } else {
    document.getElementById("idTxtConstrR_" + k).value = 0;
  }
  // DOMImgThisR.style.left = (eval(MyString)*(207+180)/5)-207;
}

function CreateAlgorithm(ThisConstrXML, k) {
  ThisString = ThisConstrXML.split("</Details>")[0];
  ThisString = ReplaceAll(ThisString, '> ', '>');
  ThisString = ThisString.split("<Details>")[1];
  ThisString = RemoveLineBreaks(ThisString);
  ThisString = RemoveTexts (ThisString, ' name="', '"');
  ThisString = RemoveTexts (ThisString, '<Hint>', '</Hint>');
  ThisString = Replace(ThisString, '<VentLayer>', '+0.5*(');
  ThisString = Replace(ThisString, '</VentLayer>', ')');
  ThisString = Replace(ThisString, '<Layer>', '+(');
  ThisString = Replace(ThisString, '</Layer>', ')');
  ThisString = Replace(ThisString, '<Process>', '');
  ThisString = Replace(ThisString, '</Process>', '');
  ThisString = Replace(ThisString, '<Composite>', '1/(');
  ThisString = Replace(ThisString, '</Composite>', ')');
  ThisString = Replace(ThisString, '<Component>', '+(');
  ThisString = Replace(ThisString, '</Component>', '))');
  ThisString = Replace(ThisString, '<R>', '');
  ThisString = Replace(ThisString, '</R>', '');
  ThisString = Replace(ThisString, '<A>', '(');
  ThisString = Replace(ThisString, '</A>', '/100)/(');
  ThisString = Replace(ThisString, '<Hint>', '');
  ThisString = Replace(ThisString, '</Hint>', '');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptSolidTimber', 'SolidTimberR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptSolidMasonry', 'SolidMasonryR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptICF', 'ICFR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptRoofing', 'RoofingR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptCladding', 'CladdingR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptAirBarrier', 'AirBarrierR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptVeneer', 'VeneerR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptFloorLining', 'FloorLiningR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptRoofLining', 'RoofLiningR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptWallLining', 'WallLiningR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptFloorAirgap', 'FloorAirgapR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptRoofAirgap', 'RoofAirgapR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptWallAirgap', 'WallAirgapR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptFlooring', 'FlooringR','');
  ThisString = ProcessInnerElementOptR(ThisString, k, 'OptThermalBreak', 'ThermalBreakR','');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptFloorFrame', 'FloorFrameA', 'A', '');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptFloorFrame', 'FloorFrameR', 'R', '');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptFloorFrame', 'FloorCavA', 'A', '100-');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptRoofFrame', 'RoofFrameA', 'A', '');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptRoofFrame', 'RoofFrameR', 'R', '');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptRoofFrame', 'RoofCavA', 'A', '100-');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptWallFrame', 'WallFrameA', 'A', '');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptWallFrame', 'WallFrameR', 'R', '');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptWallFrame', 'WallCavA', 'A', '100-');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptStrapping', 'StrappingA', 'A', '');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptStrapping', 'StrappingR', 'R', '');
  ThisString = ProcessInnerElementOptAR(ThisString, k, 'OptStrapping', 'StrappingCavA', 'A', '100-'); 
  ThisString = ProcessInnerElementSubR(ThisString, k);
  ThisString = ProcessInnerElementSlabR(ThisString, k);
  ThisString = ProcessInnerElementDownlight(ThisString, k);
//  ThisString = ProcessInnerElementCustomSFR(ThisString, k);
  ThisString = ProcessInnerElementInsR(ThisString, k);

  // Note that all id names have to be unique and can not contain substrings which are names of other id's! Example: "StrappingCavityA" is not allowed.
  //alert(ThisString);
  ThisString = ThisString.split(' ').join('');
  return ThisString;
}

function Replace(ProcessStr, SearchStr, ReplStr) {
  var A = new Array();
	A = ProcessStr.split(SearchStr);
  MergeStr = A.join(ReplStr);
  return MergeStr
};

function ReplaceProp(ProcessStr, Type, SearchStr, ReplStr) {
  switch(Type) {
    case 'R':
      var Front = '<br><font class=\'FontR\' style=\'font-style:italic\' >&nbsp R-value: ';
      var Back = '&nbsp </font>';
      break;
    case 'A':
      var Front = '<font class=\'FontArea\' style=\'font-style:italic; text-align:center\' >';
      var Back = '%&nbsp </font>';
      break
    default:
      var Front = '';
      var Back = '';    
  }      
  var A = new Array();
	A = ProcessStr.split('<' + Type + '>' + SearchStr + '</' + Type + '>');
  MergeStr = A.join(Front + ReplStr + Back);
  return MergeStr
};

function ReplaceAll(ProcessStr, SearchStr, ReplStr) {
  var A = new Array();
	A = ProcessStr.split(SearchStr);
  while (A.length > 1) {
	  ProcessStr = A.join(ReplStr);
  	A = ProcessStr.split(SearchStr);
	}
	MergeStr = ProcessStr;
  return MergeStr
}

function RemoveLineBreaks(ProcessStr) {
	var A = new Array();
	A = ProcessStr.split("\r\n");
	ProcessStr = A.join(""); // ProcessStr = A.join("\n");
	A = ProcessStr.split("\r");
	ProcessStr = A.join(""); // ProcessStr = A.join("\n");
  return ProcessStr;
}

function RemoveTexts(ProcessStr, StartTag, EndTag) {
  var A = new Array();
	A = ProcessStr.split(StartTag);
  var MergeStr = A[0];
  for (i=1; i<(A.length); i++) {
    MergeStr = MergeStr + A[i].split(EndTag)[1];
  };
  return MergeStr
};

function ProcessInnerElementOptR(Str, k, Opt, ResTxt, Operator){
	if (document.getElementById('id' + ResTxt + '_' + k)) {
	  DOMResTxt = document.getElementById('id' + ResTxt + '_' + k);
	  DOMOpt = document.getElementById('id' + Opt + '_' + k);
		DOMResTxt.innerHTML = eval(Operator + DOMOpt.value);
    NewStr = Replace(Str, ResTxt, '(' + Operator + DOMOpt.value + '+0)');
	} else {
    NewStr = Str;
	}
	return NewStr	
}

function ProcessInnerElementOptAR(Str, k, Opt, ResTxt, Tag, Operator){
	if (document.getElementById('id' + ResTxt + '_' + k)) {
    DOMResTxt = document.getElementById('id' + ResTxt + '_' + k);
    DOMOpt = document.getElementById('id' + Opt + '_' + k);
    DOMResTxt.innerHTML = eval(Operator + XMLExtract(DOMOpt.value, Tag));
    if (Tag=='R') {
      NewStr = Replace(Str, ResTxt, '(' + Operator + XMLExtract(DOMOpt.value, Tag) + '+1E-8)'); // To avoid divide by 0 error when framing area is 0
    } else {
      NewStr = Replace(Str, ResTxt, '(' + Operator + XMLExtract(DOMOpt.value, Tag) + '+0)');
    }
	} else {
    NewStr = Str;
	}
	return NewStr	
}

function ProcessInnerElementInsR(Str, k){
  NewStr = Str;
  for(i=0; i<5; i++) {
    if (document.getElementById('TxtInsulation' + i + 'R_' + k) != null) {
// Now part of the wall airgap calculation...      if (document.getElementById('TxtInsulation' + i + 'R_' + k).value > 0) {
    	  InTxt = eval(document.getElementById('TxtInsulation' + i + 'R_' + k).value*1.0);
        if(document.getElementById('TxtDownLightDownrating' + i + 'R_' + k)) {
          DownLTxt = eval(document.getElementById('TxtDownLightDownrating' + i + 'R_' + k).value*1.0);
        } else {
          DownLTxt = '0';
        }  
     		NewStr = Replace(NewStr, 'Insulation' + i + 'R', InTxt + '+1E-8-' + DownLTxt);
//    	} else {
//    		NewStr = Replace(NewStr, 'Insulation' + i + 'R', '0.17+0');
//    	}  
  	}
  }
  return NewStr	
}

function ProcessInnerElementSubR(Str, k){
  if (document.getElementById('idTxtASusFloor_' + k)) {
	  ASusFloor = 1 * eval(1 * document.getElementById('idTxtASusFloor_' + k).value);  
	  HPerimSusFloor = 1 * eval(1 * document.getElementById('idTxtHPerimSusFloor_' + k).value);  
	  LPerimSusFloor = 1 * eval(1 * document.getElementById('idTxtLPerimSusFloor_' + k).value);
    APerimSusFloor = 1 * HPerimSusFloor * LPerimSusFloor;
    if (APerimSusFloor != 0) {
      AovPA = ASusFloor / APerimSusFloor;
    } else {
      AovPA = 0;
    }  
    SubRVal = AovPA * document.getElementById('idPerimType_' + k).value;   
//alert(ASusFloor + ' ' + HPerimSusFloor + ' ' +  LPerimSusFloor + ' ' +  APerimSusFloor + ' ' +  document.getElementById("idPerimType").value + ' ' +  SubRVal);
		document.getElementById('idSubR_' + k).innerHTML = Math.round(eval(SubRVal)*100)/100;
    NewStr = Replace(Str, 'SubR', '(' + SubRVal + '+0)');
	} else {
		NewStr = Str;
	}
  return NewStr	
}

function ProcessInnerElementSlabR(Str, k){
  var BaseEdgeR = 0.06;
  var BaseSlabR = 0.8;
  var SlabPerimCoreFract = 0.6;

  var EdgeSlabFraction = new Array(3);
  EdgeSlabFraction['internal'] = 0.025;
  EdgeSlabFraction['external'] = 0.04;
  EdgeSlabFraction['none'] = EdgeSlabFraction['external'];

  var Offset = new Array(3);
  Offset['internal'] = 0.611;
  Offset['external'] = 0.536;
  Offset['none'] = Offset['external'];

  var a = new Array(3);
  a['internal'] = 0.21;
  a['external'] = 2.25;
  a['none'] = a['external'];

  var b = new Array(3);
  b['internal'] = 0.15;
  b['external'] = 0.93;
  b['none'] = b['external'];

  if (document.getElementById('idTxtASlabFloor_' + k)) {
	  ASlabFloor = 1 * eval(1 * document.getElementById('idTxtASlabFloor_' + k).value);  
	  LPerimSlabFloor = 1 * eval(1 * document.getElementById('idTxtLPerimSlabFloor_' + k).value);
	  ExtWallT = 1 * eval(0.001 * document.getElementById('idTxtExtWallT_' + k).value);
	  SoilCond = 1 * eval(1 * document.getElementById('idTxtSoilCond_' + k).value);

    UnderSlabInsType = document.getElementById('idUnderSlabInsType_' + k).value;
	  UnderSlabInsR = 1 * eval(1 * document.getElementById('TxtInsulation0R_' + k).value); 
    if (document.getElementById('TxtPileNo_' + k)) { // for backward compatibility
      var PileArea = Number(document.getElementById('TxtPileNo_' + k).value) * Math.pow(Number(document.getElementById('TxtPileDiam_' + k).value)/2., 2) * Math.PI / 1000000;
    } else {
      var PileArea = 0;
      }  
    if (PileArea > 0 && ASlabFloor > 0) {
      var PileFrac = PileArea/ASlabFloor;
      UnderSlabInsR = 1 / ((1-PileFrac)/UnderSlabInsR + PileFrac/0.06);
    } 
    SlabEdgeInsType = document.getElementById('idSlabEdgeInsType_' + k).value;
	  SlabEdgeInsR = 1 * eval(1 * document.getElementById('TxtInsulation1R_' + k).value); 
    if (ASlabFloor != 0 && ExtWallT != 0 && LPerimSlabFloor != 0 && SoilCond != 0) {
      x = (2.0 * ASlabFloor) / (ExtWallT * LPerimSlabFloor);
      RNoIns = (Math.PI * ASlabFloor) / (SoilCond * LPerimSlabFloor * Math.log((1 + x) * Math.pow((1 + 1 / x), x)));
      if (SlabEdgeInsType == 'none') {
        SlabEdgeInsR = 0;
      }
      TotalEdgeR = BaseEdgeR + SlabEdgeInsR;
      switch(UnderSlabInsType) {
        case 'none':
          UnderSlabInsR12 = 0;
          UnderSlabInsRCore = 0;
          break;
        case 'perim':
          UnderSlabInsR12 = UnderSlabInsR;
          UnderSlabInsRCore = 0;
          break;
        case 'total':
          UnderSlabInsR12 = UnderSlabInsR;
          UnderSlabInsRCore = UnderSlabInsR;
          break;
        default:
          UnderSlabInsR12 = 0;
          UnderSlabInsRCore = 0;
        }
      TotalSlabR = 1/(SlabPerimCoreFract/(BaseSlabR+UnderSlabInsR12) + (1-SlabPerimCoreFract)/(BaseSlabR+UnderSlabInsRCore)); 
      EffInsR = 1/(EdgeSlabFraction[SlabEdgeInsType]/TotalEdgeR + (1-EdgeSlabFraction[SlabEdgeInsType])/TotalSlabR) - Offset[SlabEdgeInsType];
      SlabRVal = RNoIns + Math.log(1 + EffInsR * a[SlabEdgeInsType]) / b[SlabEdgeInsType];
    } else {
      SlabRVal = 0;
    }  
		document.getElementById('idSlabR_' + k).innerHTML = Math.round(eval(SlabRVal)*100)/100;
    NewStr = Replace(Str, 'SlabR', '(' + SlabRVal + '+0)');
	} else {
		NewStr = Str;
	}
  return NewStr	
}

function ProcessInnerElementDownlight(Str, k){
  if (document.getElementById('idTxtDownlightCount_' + k)) {
	  ADLCeiling = 1 * eval(document.getElementById('idTxtADownlightCeiling_' + k).value * 1.0);
	  DLCount = 1 * eval(document.getElementById('idTxtDownlightCount_' + k).value * 1.0);
	  DLClearance = 1 * eval(document.getElementById('idTxtDownlightClearance_' + k).value * 1.0);
	  ADL = DLCount * Math.pow(0.05 + DLClearance, 2) * Math.PI;
    for (i=0; i<=5; i++) {
      if ((document.getElementById('TxtInsulation' + i + 'R_' + k) != null) && (ADLCeiling > 0)) {
        pDL =  ADL / ADLCeiling;
        pIns = 1.0 - pDL;
        Ins = eval(document.getElementById('TxtInsulation' + i + 'R_' + k).value * 1.0);
        if (Ins > 0) {
          CombinedR = 1 / ((pIns/Ins) + (pDL/0.25));
        } else {
          CombinedR = Ins;
        }  
        Downrating = Ins - CombinedR;
        document.getElementById('TxtDownLightDownrating' + i + 'R_' + k).value = Downrating;
      }
    }
    NewStr = Str;     
 	} else {
 		NewStr = Str;
 	}
   return NewStr	
}


/*
function ProcessInnerElementCustomSFR(Str, k){
  SteelGauge = 1 * eval(1 * document.getElementById('idTxtSteelGauge_' + k).value);  
  Flange = 1 * eval(1 * document.getElementById('idTxtFlange_' + k).value);  
  InsulationT = 1 * eval(1 * document.getElementById('idTxtInsulationT_' + k).value);
  if (SteelGauge > 0) {
    RVal = Flange / SteelGauge * InsulationT / 50 / 1000 + 0.06; //0.06 for contact resistance
  } else {
    RVal = 0;
  }
	document.getElementById('idCustomSFR_' + k).innerHTML = Math.round(eval(RVal)*100)/100;
  NewStr = Replace(Str, 'CustomSFR', '(' + RVal + '+0)');
  return NewStr	
}
*/

