<%
'=============================================================================
' FILE: editprinter.asp
' PURPOSE: Edit printer information with nested entity creation
' SECURITY: Parameterized queries, HTML encoding, input validation
' UPDATED: 2025-11-10 - Modernized with Bootstrap theme
'=============================================================================
%><!DOCTYPE html>
<html lang="en">
<head>
  <!--#include file="./includes/header.asp"-->
  <!--#include file="./includes/sql.asp"-->
</head>

<%
	theme = Request.Cookies("theme")
	IF theme = "" THEN
		theme="bg-theme1"
	END IF

	' Get and validate all inputs
	Dim printerid, modelid, serialnumber, ipaddress, fqdn, printercsfname, printerwindowsname, printerpin, installpath, machineid, maptop, mapleft
	printerid = Trim(Request.Querystring("printerid"))
	modelid = Trim(Request.Form("modelid"))
	serialnumber = Trim(Request.Form("serialnumber"))
	ipaddress = Trim(Request.Form("ipaddress"))
	fqdn = Trim(Request.Form("fqdn"))
	printercsfname = Trim(Request.Form("printercsfname"))
	printerwindowsname = Trim(Request.Form("printerwindowsname"))
	printerpin = Trim(Request.Form("printerpin"))
	installpath = Trim(Request.Form("installpath"))
	machineid = Trim(Request.Form("machineid"))
	maptop = Trim(Request.Form("maptop"))
	mapleft = Trim(Request.Form("mapleft"))

	' Get form inputs for new model
	Dim newmodelnumber, newvendorid, newmodelnotes, newmodeldocpath
	newmodelnumber = Trim(Request.Form("newmodelnumber"))
	newvendorid = Trim(Request.Form("newvendorid"))
	newmodelnotes = Trim(Request.Form("newmodelnotes"))
	newmodeldocpath = Trim(Request.Form("newmodeldocpath"))

	' Get form inputs for new vendor
	Dim newvendorname
	newvendorname = Trim(Request.Form("newvendorname"))

	' Validate required fields
	If Not IsNumeric(printerid) Or CLng(printerid) < 1 Then
		objConn.Close
		Response.Redirect("displayprinters.asp?error=INVALID_PRINTER_ID")
		Response.End
	End If

	If modelid <> "new" And (Not IsNumeric(modelid)) Then
		objConn.Close
		Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=INVALID_MODEL_ID")
		Response.End
	End If

	If Not IsNumeric(machineid) Then
		objConn.Close
		Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=INVALID_MACHINE_ID")
		Response.End
	End If

	' Validate field lengths
	If Len(serialnumber) > 100 Or Len(fqdn) > 255 Or Len(printercsfname) > 50 Or Len(printerwindowsname) > 255 Or Len(installpath) > 100 Then
		objConn.Close
		Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=FIELD_LENGTH_EXCEEDED")
		Response.End
	End If

	' Handle new model creation
	If modelid = "new" Then
		If Len(newmodelnumber) = 0 Then
			objConn.Close
			Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=MODEL_REQUIRED")
			Response.End
		End If

		If Len(newvendorid) = 0 Then
			objConn.Close
			Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=VENDOR_REQUIRED")
			Response.End
		End If

		If Len(newmodelnumber) > 255 Or Len(newmodelnotes) > 255 Or Len(newmodeldocpath) > 255 Then
			objConn.Close
			Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=MODEL_FIELD_LENGTH_EXCEEDED")
			Response.End
		End If

		' Handle new vendor creation (nested)
		If newvendorid = "new" Then
			If Len(newvendorname) = 0 Then
				objConn.Close
				Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=VENDOR_NAME_REQUIRED")
				Response.End
			End If

			If Len(newvendorname) > 50 Then
				objConn.Close
				Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=VENDOR_NAME_TOO_LONG")
				Response.End
			End If

			' Insert new vendor using parameterized query
			Dim sqlNewVendor
			sqlNewVendor = "INSERT INTO vendors (vendor, isactive, isprinter, ispc, ismachine) VALUES (?, 1, 1, 0, 0)"

			On Error Resume Next
			Dim cmdNewVendor
			Set cmdNewVendor = Server.CreateObject("ADODB.Command")
			cmdNewVendor.ActiveConnection = objConn
			cmdNewVendor.CommandText = sqlNewVendor
			cmdNewVendor.CommandType = 1
			cmdNewVendor.Parameters.Append cmdNewVendor.CreateParameter("@vendor", 200, 1, 50, newvendorname)
			cmdNewVendor.Execute

			If Err.Number <> 0 Then
				objConn.Close
				Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=VENDOR_CREATE_FAILED&msg=" & Server.URLEncode(Err.Description))
				Response.End
			End If

			' Get the newly created vendor ID
			Dim rsNewVendor
			Set rsNewVendor = objConn.Execute("SELECT LAST_INSERT_ID() AS newid")
			newvendorid = 0
			If Not rsNewVendor.EOF Then
				If Not IsNull(rsNewVendor("newid")) Then
					newvendorid = CLng(rsNewVendor("newid"))
				End If
			End If
			rsNewVendor.Close
			Set rsNewVendor = Nothing
			Set cmdNewVendor = Nothing
			On Error Goto 0
		End If

		' Insert new model using parameterized query
		Dim sqlNewModel
		sqlNewModel = "INSERT INTO models (modelnumber, vendorid, notes, documentationpath, isactive) VALUES (?, ?, ?, ?, 1)"

		On Error Resume Next
		Dim cmdNewModel
		Set cmdNewModel = Server.CreateObject("ADODB.Command")
		cmdNewModel.ActiveConnection = objConn
		cmdNewModel.CommandText = sqlNewModel
		cmdNewModel.CommandType = 1
		cmdNewModel.Parameters.Append cmdNewModel.CreateParameter("@modelnumber", 200, 1, 255, newmodelnumber)
		cmdNewModel.Parameters.Append cmdNewModel.CreateParameter("@vendorid", 3, 1, , CLng(newvendorid))
		cmdNewModel.Parameters.Append cmdNewModel.CreateParameter("@notes", 200, 1, 255, newmodelnotes)
		cmdNewModel.Parameters.Append cmdNewModel.CreateParameter("@documentationpath", 200, 1, 255, newmodeldocpath)
		cmdNewModel.Execute

		If Err.Number <> 0 Then
			objConn.Close
			Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=MODEL_CREATE_FAILED&msg=" & Server.URLEncode(Err.Description))
			Response.End
		End If

		' Get the newly created model ID
		Dim rsNewModel
		Set rsNewModel = objConn.Execute("SELECT LAST_INSERT_ID() AS newid")
		modelid = 0
		If Not rsNewModel.EOF Then
			If Not IsNull(rsNewModel("newid")) Then
				modelid = CLng(rsNewModel("newid"))
			End If
		End If
		rsNewModel.Close
		Set rsNewModel = Nothing
		Set cmdNewModel = Nothing
		On Error Goto 0
	End If

	' Handle map coordinates - default to 50 if not provided
	Dim maptopValue, mapleftValue
	If maptop <> "" And IsNumeric(maptop) Then
		maptopValue = CLng(maptop)
	Else
		maptopValue = 50
	End If

	If mapleft <> "" And IsNumeric(mapleft) Then
		mapleftValue = CLng(mapleft)
	Else
		mapleftValue = 50
	End If

	' Handle optional PIN - use NULL if not provided
	Dim printerpinValue
	If printerpin <> "" Then
		printerpinValue = printerpin
	Else
		printerpinValue = Null
	End If

	' Update printer using parameterized query
	Dim strSQL
	strSQL = "UPDATE printers SET modelid = ?, serialnumber = ?, ipaddress = ?, fqdn = ?, " & _
	         "printercsfname = ?, printerwindowsname = ?, printerpin = ?, installpath = ?, machineid = ?, maptop = ?, mapleft = ? " & _
	         "WHERE printerid = ?"

	On Error Resume Next
	Dim cmdUpdate
	Set cmdUpdate = Server.CreateObject("ADODB.Command")
	cmdUpdate.ActiveConnection = objConn
	cmdUpdate.CommandText = strSQL
	cmdUpdate.CommandType = 1

	' Add parameters in order
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@modelid", 3, 1, , CLng(modelid))
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@serialnumber", 200, 1, 100, serialnumber)
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@ipaddress", 200, 1, 50, ipaddress)
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@fqdn", 200, 1, 255, fqdn)
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@printercsfname", 200, 1, 50, printercsfname)
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@printerwindowsname", 200, 1, 255, printerwindowsname)
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@printerpin", 200, 1, 10, printerpinValue)
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@installpath", 200, 1, 100, installpath)
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@machineid", 3, 1, , CLng(machineid))
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@maptop", 3, 1, , maptopValue)
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@mapleft", 3, 1, , mapleftValue)
	cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@printerid", 3, 1, , CLng(printerid))

	cmdUpdate.Execute

	If Err.Number <> 0 Then
		Set cmdUpdate = Nothing
		objConn.Close
		Response.Redirect("displayprinter.asp?printerid=" & printerid & "&error=UPDATE_FAILED&msg=" & Server.URLEncode(Err.Description))
		Response.End
	End If

	Set cmdUpdate = Nothing
	On Error Goto 0

	objConn.Close

	' Success - redirect to displayprinter
	Response.Redirect("./displayprinter.asp?printerid=" & printerid & "&success=1")
%>

<body class="bg-theme <%=theme%>">
<!-- start loader -->
   <div id="pageloader-overlay" class="visible incoming"><div class="loader-wrapper-outer"><div class="loader-wrapper-inner" ><div class="loader"></div></div></div></div>
   <!-- end loader -->
<!-- Start wrapper-->
 <div id="wrapper">
  <!--#include file="./includes/leftsidebar.asp"-->
<!--Start topbar header-->
  <!--#include file="./includes/topbarheader.asp"-->
<!--End topbar header-->
<div class="clearfix"></div>

  <div class="content-wrapper">
    <div class="container-fluid">
      <div class="row mt-3">
        <div class="col-12">
          <div class="card">
            <div class="card-body text-center">
              <i class="zmdi zmdi-check-circle text-success" style="font-size: 48px;"></i>
              <h4 class="mt-3">Redirecting...</h4>
              <p>If you are not redirected automatically, <a href="./displayprinter.asp?printerid=<%=printerid%>">click here</a>.</p>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
 </div>
</body>
</html>
