﻿// (Some of) these functions are used by both server and client.

function GetSettingsTag(strSettings, strTag) {
	var strResult = "";
	if (strSettings != undefined) {
	  var nAt = strSettings.indexOf(";" + strTag + "=");
	  if (nAt > -1) {
		  var strRest = strSettings.substring(nAt + strTag.length + 2);
		  nAt = strRest.indexOf(";");
		  if (nAt > -1)
			  strResult = strRest.substring(0, nAt);
	  }
	}
	return strResult;
}

function jsGetIntSetting(strSettings, strTag, nDefault) {
	var strValue = GetSettingsTag(strSettings, strTag);
	if (strValue == "")
		return nDefault;
	else
		return parseInt(strValue, 10);
}

function jsGetStringSetting(strSettings, strTag, strDefault) {
	var strValue = GetSettingsTag(strSettings, strTag);
	if (strValue == "")
		return strDefault;
	else
		return strValue;
}

function jsGetNumFloorsFromXML(strXML)
{
	// Count the number of floors:
	var nFloors = 0;
	var strTemp = strXML;
	
	var bAgain = true;
	while (bAgain) {
	  var strOneFloor = GetXMLTag(strTemp, "FLOOR");
	  if (strOneFloor == "")
		  bAgain = false;
	  else {
		  var nAt = strTemp.indexOf("</FLOOR>");
		  if (nAt > -1) {
			  strTemp = strTemp.substring(nAt + 8);
			  nFloors++;
		  }
		  else
			  bAgain = false;
	  }
	}
	
	return nFloors;
}

function jsIsPremium(strSettings, strLogoSettings)
{
  return jsGetIntSetting(strSettings, "fp", 0) > 0 
		              || jsGetIntSetting(strSettings, "wb", 0) > 0 
		              || jsGetIntSetting(strSettings, "wsd", 0) > 0 
		              || jsGetIntSetting(strSettings, "is", 0) > 0 
		              || jsGetIntSetting(strSettings, "ts", 0) > 0 
		              || jsGetIntSetting(strLogoSettings, "lgt", 0) > 0;
}

function jsIsTrial(objConn, strSerial)
{
  // For temporary backward compatibility:
  return jsIsStandardTrial(objConn, strSerial);
}

function jsIsStandardTrial(objConn, strSerial)
{
  // Check if this is a standard edition trial
  var bIsTrial = false;
  
  if (alltrim(strSerial) != "DEMO") {
    var objRS = Server.CreateObject("ADODB.Recordset");
    objRS.Open("SELECT PublisherFirstUsed FROM tma.dbo.auth WHERE SoftSerial = '" + strSerial + "' AND deactivated = 0", objConn);

    var dtFirstUsed = objRS("PublisherFirstUsed").Value;
    
    // Check trial status:
    var dt14 = jsDateAddDays(new Date(dtFirstUsed), 14);
    bIsTrial = (dtFirstUsed == null || dt14 >= new Date());

    objRS.Close();
  }
  
  return bIsTrial;
}

function jsLookUpAccount(objConn, nAccountID, strEmail)
{
  // Requires crc16.js to be loaded by the calling page.
  //
  // Supply either the accountID or email address to look up.
  // Return the accountID.
  var nResult = 0;
  
  var strWhere = (nAccountID > 0) ? "acctID = " + nAccountID : "acctEmail = '" + jsNoQuotes(alltrim(strEmail)) + "'"; 
  
  objRS = Server.CreateObject("ADODB.Recordset");
  objRS.Open("SELECT acctID, acctPassword, acctPasswordHash, acctEmail FROM accounts WHERE " + strWhere, objConn);
  
  if (!objRS.EOF) {
    var strPassword = alltrim(objRS("acctPassword").Value); // This is for backward compatibility only. After a month or so, should remove all references to acctPassword.
    var strPasswordHash = alltrim(objRS("acctPasswordHash").Value);
    
    if (Request.Cookies("tmapublisher_password").Item == Hash32(strPassword) || Request.Cookies("tmapublisher_password").Item == Hash32(strPasswordHash)) {
      // They match, we can log them straight in.
      // Refresh their cookies, so they don't run out for another 30 days.
      var strEmail = alltrim(objRS("acctEmail").Value);
      if (strEmail.substring(0, 1) == "(")
        strEmail = "";  // Shouldn't happen though!
      
      jsAddCookie("tmapublisher_email", strEmail, 30);
      jsAddCookie("tmapublisher_password", Hash32(strPasswordHash), 30);
      jsAddCookie("tmapublisher_autologin", "on", 30);
      
      nResult = objRS("acctID").Value;
      Session("publisher_accountid") = nResult;
      Session("publisher_email") = strEmail;
      Session("publisher_loggedin") = 1;
    }
  }
  
  objRS.Close();
  
  return nResult;
}

function jsGetAddThemes(nEnterpriseID)
{
  var strEditOne = jsNoQuotes(jsSessionToString("pubadmin_editstyle"));
  
  objRS.Open("SELECT estyleName, estyleSettings, estyleLogoHash, estyleLogoSettings FROM enterprisestyles WHERE estyleEnterpriseID = " + nEnterpriseID 
              + (strEditOne == "" ? "" : " AND estyleID = " + strEditOne)
              + " ORDER BY estyleOrder, estyleName", objConn);
  if (objRS.EOF) {
    objRS.Close();
    objRS.Open("SELECT estyleName, estyleSettings, estyleLogoHash, estyleLogoSettings FROM enterprisestyles WHERE estyleEnterpriseID = 0 ORDER BY estyleOrder, estyleName", objConn);
  }
  
  var strAddThemes = "";
  
  while (!objRS.EOF) {
    var strSettings = objRS("estyleSettings").Value;
    if (objRS("estyleLogoHash").Value != null) {
      strSettings += "/LH:" + objRS("estyleLogoHash").Value + "/LS:" + objRS("estyleLogoSettings").Value;
    }
    strAddThemes += "jsAddOneTheme(\"" + objRS("estyleName").Value + "\",		\"" + strSettings + "\");\r\n";
    objRS.MoveNext();
  }
  objRS.Close();
  
  if (nLockStyle == 1)
    strAddThemes += "cnThemeCustom = 1000;\r\n";
  
  return strAddThemes;
}

function getAccountValue(strColumn, nAccountID, objConn) {
  return getTableValue("accounts", "acctID", strColumn, nAccountID, objConn);
}

function getPlanValue(strColumn, nPlanID, objConn) {
  return getTableValue("plans", "planID", strColumn, nPlanID, objConn);
}

function getSaveDescription(nAllFloors, nDPI, fltWidth, fltHeight, strFormat) {
  var strWidth = fltWidth.toFixed(2).toString();
  var strHeight = fltHeight.toFixed(2).toString();

  if (strWidth.substr(strWidth.length - 3, 3) == ".00")
    strWidth = strWidth.substr(0, strWidth.length - 3);

  if (strHeight.substr(strHeight.length - 3, 3) == ".00")
    strHeight = strHeight.substr(0, strHeight.length - 3);

  if (nDPI != 96 && nDPI != 300)
    nDPI = 96;

  var strUnits = (nDPI == 96) ? "px" : "in";

  strFormat = strFormat.toUpperCase();

  if (strFormat != "PNG" && strFormat != "JPG" && strFormat != "WMF" && strFormat != "HMV" && strFormat != "PDF")
    strFormat = "PNG";

  strUnits = strUnits.toLowerCase();
  if (strUnits != "px" && strUnits != "in" && strUnits != "pt")
    strUnits = "px";

  if (nDPI == 96 && (strFormat == "WMF" || strFormat == "HMV")) {
    // 300dpi WMFs are converted to 96dpi.
    // For description purposes only, convert them back to 300.
    if (strWidth == "1056" && strHeight == "768") {
      strWidth = "11";
      strHeight = "8";
      strUnits = "in";
      nDPI = 300;
    }
    else if (strWidth == "768" && strHeight == "1056") {
      strWidth = "8";
      strHeight = "11";
      strUnits = "in";
      nDPI = 300;
    }
    else if (strWidth == "768" && strHeight == "768") {
      strWidth = "8";
      strHeight = "8";
      strUnits = "in";
      nDPI = 300;
    }
    else if (strWidth == "768" && strHeight == "576") {
      strWidth = "8";
      strHeight = "6";
      strUnits = "in";
      nDPI = 300;
    }
    else if (strWidth == "384" && strHeight == "384") {
      strWidth = "4";
      strHeight = "4";
      strUnits = "in";
      nDPI = 300;
    }
    else if (strWidth == "768" && strHeight == "384") {
      strWidth = "8";
      strHeight = "4";
      strUnits = "in";
      nDPI = 300;
    }
  }

  var strUnitDescr;
  if (strUnits == "in")
    strUnitDescr = " inches";
  else if (strUnits == "pt")
    strUnitDescr = " points";
  else
    strUnitDescr = " pixels";

  var strSize = "";

  if (strWidth == "0") {
    if (strHeight == "0")
      strSize += "any size";
    else
      strSize += strHeight + strUnitDescr + " high, auto-width";
  }
  else if (strHeight == "0") {
    strSize += strWidth + strUnitDescr + " wide, auto-height";
  }
  else {
    strSize += strWidth + "x" + strHeight + strUnitDescr;
  }

  return {  ShortFloors: (nAllFloors == 1 ? "All floors" : "Individual floors"), 
            LongFloors: (nAllFloors == 1 ? "All floors on a single image" : "Each floor saved as a separate image"), 
            Size: strSize,
            DPI: nDPI + "dpi",
            Quality: (nDPI == 96 ? "Web quality" : "Print quality"),
            ShortFormat: strFormat,
            LongFormat: (strFormat == "HMV" ? "HomeView WMF" : strFormat)
            };
}

function StringToSettings(strSettings) {
  var strBaseSettings = strSettings;
  if (strBaseSettings.substr(0, 1) == ";") {
    strBaseSettings = strBaseSettings.substr(1);
  }

  if (right(strBaseSettings, 1) == ";") {
    strBaseSettings = strBaseSettings.substr(0, strBaseSettings.length - 1);
  }

  var aTemp = strBaseSettings.split(";");
  var aSettings = new Array();
  for (var i = 0; i < aTemp.length; i++) {
    var aParts = aTemp[i].split("=");
    aSettings[aParts[0]] = aParts[1];
  }

  return aSettings;
}

function getSettingsArray(strTheme) {
  return { theme: strTheme,
    wf: "Black-#000,Red-#9f2500,Green-#009f00,Blue-#00009f,Dark grey-#444444,Light grey-#888888,White-#fff,Custom...-#999",
    fc: "Gold-#f3d58f," +
        "White-#ffffff," +
        "Pink-#f38fb9," +
        "Green-#95ff5b," +
        "Mauve-#b484f0," +
        "Blue-#8fb9f3," +
        "Multi-/pubimg/multi.png," +
        "By room-/pubimg/byroom.png," +
        "Custom...-#ffffff-fc=8;cfc=#666666",
    tsz: "25%,33%,66%,75%,100%,125%,150%,175%,200%,250%,300%,400%",
    tf: "Arial,Arial Black,Comic Sans,Georgia,Impact,Lucida,Palatino,Tahoma,Times New Roman,Trebuchet,Verdana",
    sa: "Grand Total,Floor by Floor,Off",
    fp: "None," +
        "Horizontal-/pubimg/pattern_horiz.png," +
        "Vertical-/pubimg/pattern_vert.png," +
        "Forward-/pubimg/pattern_forward.png," +
        "Backward-/pubimg/pattern_backward.png," +
        "Cross-/pubimg/pattern_cross.png," +
        "Diag cross-/pubimg/pattern_diag.png",
    lgt: "None,Settings...",
    fl: "Black-#000,Red-#9f2500,Green-#009f00,Blue-#00009f,Dark grey-#444444,Light grey-#888888,White-#fff,Custom...-#999",
    wo: "Auto-#000,Black-#000,Dark Red-#481b16,Dark Green-#004800,Dark Blue-#000048,Custom...-#999",
    wb: "None,Small,Medium,Large",
    wsd: "None,Right-/pubimg/shadow_right.png,Down-/pubimg/shadow_down.png,Inwards-/pubimg/shadow_inward.png",
    wss: "Short-/pubimg/shadow_short.png,Medium-/pubimg/shadow_medium.png,Long-/pubimg/shadow_long.png",
    wsl: "Lightest-#ccc,Light-#aaa,Medium-#999,Dark-#777,Darkest-#555",
    is: "None,Short-/pubimg/shadow_short.png,Medium-/pubimg/shadow_medium.png,Long-/pubimg/shadow_long.png",
    ts: "None,Short-/pubimg/shadow_short.png,Medium-/pubimg/shadow_medium.png,Long-/pubimg/shadow_long.png",
    lgs: "Centred (movable),Tiled,Stretch across,Stretch down,Below plan",
    lgz: "Under walls,Over walls",
    lgo: "Inside only,Allow outside"
  };
}

function jsUpdatePlanStyle(nPlanID, nStyleID, objConn) {
  // Update the given plan to the given style ID.
  if (jsSafeInt(getSQLValue("SELECT styleID FROM sets WHERE planID = " + jsSafeInt(nPlanID), objConn)) != nStyleID) {
    var nSetID = jsSafeInt(getSQLValue("UPDATE sets SET styleID = " + jsSafeInt(nStyleID) + " OUTPUT inserted.setID WHERE planID = " + jsSafeInt(nPlanID), objConn));
    if (nSetID == 0) {
      objConn.Execute("INSERT INTO sets (planID, styleID) VALUES (" + jsSafeInt(nPlanID) + ", " + jsSafeInt(nStyleID) + ")");
    }
    else {
      //== Delete any old images for this plan ==//
      objConn.Execute("DELETE FROM images WHERE setID = " + nSetID);
    }
  }
}

