<?php
declare(strict_types=1);
require_once __DIR__.'/config.php';
if (session_status() !== PHP_SESSION_ACTIVE) {
  session_set_cookie_params(['lifetime'=>2592000,'path'=>'/','secure'=>true,'httponly'=>true,'samesite'=>'Lax']);
  session_start();
}
$langs=['en','vi','ko','zh-CN','zh-TW','ru','fr','de'];
function owner_lang(array $supported): array {
  $raw=(string)($_GET['lang'] ?? $_COOKIE['owner_lang'] ?? '');
  $source=isset($_GET['lang'])?'url':(isset($_COOKIE['owner_lang'])?'saved':'browser');
  if(!$raw){$raw=(string)($_SERVER['HTTP_ACCEPT_LANGUAGE']??'en');}
  $raw=str_replace('_','-',trim(explode(',',$raw)[0]));
  foreach($supported as $x){if(strcasecmp($raw,$x)===0 || strcasecmp(substr($raw,0,2),substr($x,0,2))===0){return [$x,$source];}}
  return ['en','fallback'];
}
[$lang,$langSource]=owner_lang($langs);
setcookie('owner_lang',$lang,['expires'=>time()+31536000,'path'=>'/','secure'=>true,'httponly'=>false,'samesite'=>'Lax']);
if(empty($_SESSION['owner_csrf'])) $_SESSION['owner_csrf']=bin2hex(random_bytes(24));
function jout(array $v,int $code=200): never {http_response_code($code);header('Content-Type: application/json; charset=utf-8');header('Cache-Control: no-store');echo json_encode($v,JSON_UNESCAPED_UNICODE|JSON_INVALID_UTF8_SUBSTITUTE);exit;}
function body(): array {$v=json_decode(file_get_contents('php://input'),true);return is_array($v)?$v:$_POST;}
function phone_norm(string $s): string {$n=preg_replace('/[^0-9+]/','',$s);if(str_starts_with($n,'00'))$n='+'.substr($n,2);return $n;}
function dev(): string {$u=strtolower($_SERVER['HTTP_USER_AGENT']??'');return preg_match('/mobile|android|iphone/',$u)?'mobile':'desktop';}
function csrf(array $d): void {if(!hash_equals($_SESSION['owner_csrf']??'',(string)($d['csrf']??($_SERVER['HTTP_X_CSRF_TOKEN']??''))))jout(['ok'=>false,'error'=>'Session expired. Refresh and try again.'],419);}
function event(PDO $db,string $name,array $ids=[],array $context=[]): void {$s=$db->prepare("INSERT INTO owner_events(event_name,lead_id,owner_id,property_id,inquiry_id,language,ab_variant,context_json) VALUES(?,?,?,?,?,?,?,?)");$s->execute([$name,$ids['lead']??null,$ids['owner']??null,$ids['property']??null,$ids['inquiry']??null,$ids['language']??null,$ids['variant']??null,json_encode($context)]);}
function attr(array $d): array {$keys=['utm_source','utm_medium','utm_campaign','utm_content','utm_term','gclid'];$a=[];foreach($keys as $k)$a[$k]=substr((string)($d[$k]??''),0,255);return $a;}

$action=$_GET['action']??'';
if($action){
  $db=get_db(); $d=body();
  if($action==='buildings'){
    $q=trim((string)($_GET['q']??''));if(mb_strlen($q)<2)jout(['ok'=>true,'items'=>[]]);
    $s=$db->prepare("SELECT title,address,COUNT(*) n FROM scrapy WHERE (title LIKE ? OR address LIKE ?) AND location_city LIKE '%Nẵng%' GROUP BY title,address ORDER BY n DESC LIMIT 12");$like='%'.$q.'%';$s->execute([$like,$like]);
    jout(['ok'=>true,'items'=>$s->fetchAll()]);
  }
  csrf($d);
  if($action==='event'){ $allowed=['owner_page_view','owner_funnel_started','owner_question_form_opened'];$n=(string)($d['event']??'');if(in_array($n,$allowed,true))event($db,$n,['language'=>$lang,'variant'=>$d['ab_variant']??null]);jout(['ok'=>true]);}
  if($action==='contact'){
    $name=trim((string)($d['name']??''));$phone=trim((string)($d['phone']??''));$pn=phone_norm($phone);
    if(mb_strlen($name)<2 || strlen(preg_replace('/\\D/','',$pn))<7)jout(['ok'=>false,'error'=>'Please enter your name and a valid mobile number.'],422);
    $a=attr($d);$db->beginTransaction();
    $s=$db->prepare("SELECT id FROM owner_contacts WHERE phone_normalized=? LIMIT 1 FOR UPDATE");$s->execute([$pn]);$oid=$s->fetchColumn();
    if($oid){$db->prepare("UPDATE owner_contacts SET name=?,phone=?,whatsapp=?,preferred_language=?,last_activity=NOW() WHERE id=?")->execute([$name,$phone,!empty($d['whatsapp']),$lang,$oid]);}
    else{$db->prepare("INSERT INTO owner_contacts(name,phone,phone_normalized,whatsapp,preferred_language,source,campaign) VALUES(?,?,?,?,?,?,?)")->execute([$name,$phone,$pn,!empty($d['whatsapp']),$lang,$a['utm_source']?:'direct',$a['utm_campaign']]);$oid=$db->lastInsertId();}
    $linked=$db->prepare("UPDATE owner_inquiries SET owner_id=?,status='CONVERTED_TO_OWNER' WHERE phone_normalized=? AND owner_id IS NULL");$linked->execute([$oid,$pn]);
    if($linked->rowCount())event($db,'owner_question_converted_to_signup',['owner'=>$oid,'language'=>$lang,'variant'=>$d['ab_variant']??'A']);
    $existing=$db->prepare("SELECT id,resume_token FROM owner_leads WHERE owner_id=? AND property_id IS NULL AND status='ACTIVE' AND created_at>=DATE_SUB(NOW(),INTERVAL 10 MINUTE) ORDER BY id DESC LIMIT 1");$existing->execute([$oid]);$prior=$existing->fetch();
    if($prior){$db->commit();$_SESSION['owner_resume']=$prior['resume_token'];jout(['ok'=>true,'lead_id'=>(int)$prior['id'],'owner_id'=>(int)$oid,'resume_token'=>$prior['resume_token'],'stage'=>2,'deduplicated'=>true]);}
    $token=bin2hex(random_bytes(24));$first=json_encode($d['first_touch']??$a);$last=json_encode($a);
    $db->prepare("INSERT INTO owner_leads(resume_token,owner_id,funnel_stage,language,language_source,browser_language,campaign_language,utm_source,utm_medium,utm_campaign,utm_content,utm_term,gclid,referring_url,landing_page,device,ab_variant,first_touch_json,last_touch_json) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")->execute([$token,$oid,1,$lang,$langSource,substr($_SERVER['HTTP_ACCEPT_LANGUAGE']??'',0,100),$d['campaign_language']??null,$a['utm_source'],$a['utm_medium'],$a['utm_campaign'],$a['utm_content'],$a['utm_term'],$a['gclid'],substr((string)($d['referrer']??''),0,1500),substr((string)($d['landing_page']??''),0,1500),dev(),$d['ab_variant']??'A',$first,$last]);
    $lid=$db->lastInsertId(); event($db,'owner_contact_submitted',['lead'=>$lid,'owner'=>$oid,'language'=>$lang,'variant'=>$d['ab_variant']??'A']);$db->commit();
    $_SESSION['owner_resume']=$token;jout(['ok'=>true,'lead_id'=>(int)$lid,'owner_id'=>(int)$oid,'resume_token'=>$token,'stage'=>2]);
  }
  $lead=null;
  if($action!=='inquiry'){
    $token=(string)($d['resume_token']??$_SESSION['owner_resume']??'');$s=$db->prepare("SELECT * FROM owner_leads WHERE resume_token=? LIMIT 1");$s->execute([$token]);$lead=$s->fetch();
    if(!$lead)jout(['ok'=>false,'error'=>'Your saved session could not be found. Please start again.'],404);
  }
  if($action==='property'){
    $building=trim((string)($d['building']??''));if(!$building)jout(['ok'=>false,'error'=>'Please enter a building or residence.'],422);
    if($lead['property_id']){$pid=$lead['property_id'];$db->prepare("UPDATE owner_properties SET building=?,unit=?,address=? WHERE id=? AND owner_id=?")->execute([$building,trim($d['unit']??''),trim($d['address']??''),$pid,$lead['owner_id']]);}
    else{$pt=bin2hex(random_bytes(16));$db->prepare("INSERT INTO owner_properties(owner_id,public_token,building,unit,address) VALUES(?,?,?,?,?)")->execute([$lead['owner_id'],$pt,$building,trim($d['unit']??''),trim($d['address']??'')]);$pid=$db->lastInsertId();$db->prepare("UPDATE owner_leads SET property_id=? WHERE id=?")->execute([$pid,$lead['id']]);}
    $db->prepare("UPDATE owner_leads SET funnel_stage=2,last_activity=NOW() WHERE id=?")->execute([$lead['id']]);event($db,'owner_building_selected',['lead'=>$lead['id'],'owner'=>$lead['owner_id'],'property'=>$pid,'language'=>$lead['language']]);jout(['ok'=>true,'property_id'=>(int)$pid,'stage'=>3]);
  }
  if($action==='details'){
    if(!$lead['property_id'])jout(['ok'=>false,'error'=>'Complete property information first.'],422);
    $fields=['property_type','bedrooms','bathrooms','size_sqm','monthly_rent','furnished','available_from','rental_preference','owner_intent','relationship_type'];
    $vals=[];foreach($fields as $f)$vals[]=$d[$f]!==''?($d[$f]??null):null;$vals[]=$lead['property_id'];$vals[]=$lead['owner_id'];
    $db->prepare("UPDATE owner_properties SET property_type=?,bedrooms=?,bathrooms=?,size_sqm=?,monthly_rent=?,furnished=?,available_from=?,rental_preference=?,owner_intent=?,relationship_type=?,listing_status='PHOTOS_REQUIRED' WHERE id=? AND owner_id=?")->execute($vals);
    $db->prepare("UPDATE owner_contacts SET classification=?,last_activity=NOW() WHERE id=?")->execute([$d['relationship_type']??null,$lead['owner_id']]);
    $db->prepare("UPDATE owner_leads SET funnel_stage=3,last_activity=NOW() WHERE id=?")->execute([$lead['id']]);event($db,'owner_property_details_completed',['lead'=>$lead['id'],'owner'=>$lead['owner_id'],'property'=>$lead['property_id'],'language'=>$lead['language']]);jout(['ok'=>true,'stage'=>4]);
  }
  if($action==='photo'){
    if(!$lead['property_id']||empty($_FILES['photo']))jout(['ok'=>false,'error'=>'No photo received.'],422);
    $f=$_FILES['photo'];if($f['error']!==UPLOAD_ERR_OK||$f['size']>12*1024*1024)jout(['ok'=>false,'error'=>'Upload failed or image exceeds 12MB.'],422);
    $mime=(new finfo(FILEINFO_MIME_TYPE))->file($f['tmp_name']);$ext=['image/jpeg'=>'jpg','image/png'=>'png','image/webp'=>'webp','image/avif'=>'avif'][$mime]??null;if(!$ext)jout(['ok'=>false,'error'=>'Please upload JPG, PNG, WebP or AVIF images.'],422);
    $dir=__DIR__.'/img/owner-uploads/'.date('Y/m');if(!is_dir($dir)&&!mkdir($dir,0750,true))jout(['ok'=>false,'error'=>'Photo storage unavailable.'],500);
    $name=bin2hex(random_bytes(16)).'.'.$ext;if(!move_uploaded_file($f['tmp_name'],$dir.'/'.$name))jout(['ok'=>false,'error'=>'Photo could not be stored. Retry.'],500);
    $rel=date('Y/m').'/'.$name;$db->prepare("INSERT INTO owner_photos(property_id,stored_name,original_name,mime_type,file_size,sort_order) VALUES(?,?,?,?,?,(SELECT COALESCE(MAX(x.sort_order),-1)+1 FROM owner_photos x WHERE x.property_id=?))")->execute([$lead['property_id'],$rel,substr(basename($f['name']),0,255),$mime,$f['size'],$lead['property_id']]);
    event($db,'owner_photo_uploaded',['lead'=>$lead['id'],'owner'=>$lead['owner_id'],'property'=>$lead['property_id'],'language'=>$lead['language']]);jout(['ok'=>true,'photo_id'=>(int)$db->lastInsertId()]);
  }
  if($action==='photos_order'){foreach(($d['ids']??[]) as $i=>$id)$db->prepare("UPDATE owner_photos SET sort_order=? WHERE id=? AND property_id=?")->execute([$i,(int)$id,$lead['property_id']]);jout(['ok'=>true]);}
  if($action==='photo_delete'){$s=$db->prepare("SELECT stored_name FROM owner_photos WHERE id=? AND property_id=?");$s->execute([(int)$d['photo_id'],$lead['property_id']]);if($p=$s->fetchColumn()){$db->prepare("UPDATE owner_photos SET upload_status='DELETED' WHERE id=?")->execute([(int)$d['photo_id']]);@unlink(__DIR__.'/img/owner-uploads/'.$p);}jout(['ok'=>true]);}
  if($action==='complete'){
    $count=(int)$db->query("SELECT COUNT(*) FROM owner_photos WHERE upload_status='READY' AND property_id=".(int)$lead['property_id'])->fetchColumn();$status=$count?'AWAITING_REVIEW':'PHOTOS_REQUIRED';
    $db->prepare("UPDATE owner_properties SET listing_status=? WHERE id=?")->execute([$status,$lead['property_id']]);$db->prepare("UPDATE owner_leads SET funnel_stage=5,status='COMPLETED',completed_at=NOW(),last_activity=NOW() WHERE id=?")->execute([$lead['id']]);event($db,'owner_submission_completed',['lead'=>$lead['id'],'owner'=>$lead['owner_id'],'property'=>$lead['property_id'],'language'=>$lead['language']]);jout(['ok'=>true,'stage'=>5,'property_token'=>$db->query("SELECT public_token FROM owner_properties WHERE id=".(int)$lead['property_id'])->fetchColumn()]);
  }
  if($action==='another'){$token=bin2hex(random_bytes(24));$db->prepare("INSERT INTO owner_leads(resume_token,owner_id,funnel_stage,language,status,first_touch_json,last_touch_json) SELECT ?,owner_id,1,language,'ACTIVE',first_touch_json,last_touch_json FROM owner_leads WHERE id=?")->execute([$token,$lead['id']]);$_SESSION['owner_resume']=$token;jout(['ok'=>true,'resume_token'=>$token,'stage'=>2]);}
  if($action==='inquiry'){
    $name=trim((string)($d['name']??''));$phone=trim((string)($d['phone']??''));$question=trim((string)($d['question']??''));$pn=phone_norm($phone);if(mb_strlen($name)<2||strlen(preg_replace('/\\D/','',$pn))<7||mb_strlen($question)<5)jout(['ok'=>false,'error'=>'Please complete your name, phone and question.'],422);
    $a=attr($d);$s=$db->prepare("SELECT id FROM owner_contacts WHERE phone_normalized=? LIMIT 1");$s->execute([$pn]);$oid=$s->fetchColumn()?:null;
    $db->prepare("INSERT INTO owner_inquiries(owner_id,name,phone,phone_normalized,whatsapp,email,question,language,utm_source,utm_medium,utm_campaign,utm_content,utm_term,gclid,referring_url,landing_page,device,ab_variant) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")->execute([$oid,$name,$phone,$pn,!empty($d['whatsapp']),filter_var($d['email']??'',FILTER_VALIDATE_EMAIL)?:null,$question,$lang,$a['utm_source'],$a['utm_medium'],$a['utm_campaign'],$a['utm_content'],$a['utm_term'],$a['gclid'],substr($d['referrer']??'',0,1500),substr($d['landing_page']??'',0,1500),dev(),$d['ab_variant']??'A']);
    $iid=$db->lastInsertId();event($db,'owner_question_submitted',['owner'=>$oid,'inquiry'=>$iid,'language'=>$lang,'variant'=>$d['ab_variant']??'A']);jout(['ok'=>true]);
  }
  jout(['ok'=>false,'error'=>'Unknown request.'],404);
}
$copy=[
'en'=>['hero'=>'Have a property to rent in Da Nang?','sub'=>'List your property FREE and reach renters searching across Vietnam.','list'=>'LIST MY PROPERTY — FREE','ask'=>'I HAVE A QUESTION','free'=>'FREE TO LIST','no_fee'=>'NO UPFRONT LISTING FEE','simple'=>'SIMPLE SIGNUP','contact'=>'Contact','property'=>'Property','details'=>'Details','photos'=>'Photos','done'=>'Done'],
'vi'=>['hero'=>'Bạn có bất động sản cho thuê tại Đà Nẵng?','sub'=>'Đăng tin MIỄN PHÍ và tiếp cận người thuê đang tìm kiếm trên khắp Việt Nam.','list'=>'ĐĂNG BẤT ĐỘNG SẢN — MIỄN PHÍ','ask'=>'TÔI CÓ CÂU HỎI','free'=>'ĐĂNG MIỄN PHÍ','no_fee'=>'KHÔNG PHÍ TRẢ TRƯỚC','simple'=>'ĐĂNG KÝ ĐƠN GIẢN','contact'=>'Liên hệ','property'=>'Bất động sản','details'=>'Chi tiết','photos'=>'Hình ảnh','done'=>'Hoàn tất'],
'ko'=>['hero'=>'다낭에 임대할 부동산이 있으신가요?','sub'=>'무료로 등록하고 베트남 전역의 임차인에게 소개하세요.','list'=>'무료로 매물 등록','ask'=>'질문이 있어요','free'=>'무료 등록','no_fee'=>'선불 등록비 없음','simple'=>'간편한 등록','contact'=>'연락처','property'=>'부동산','details'=>'상세','photos'=>'사진','done'=>'완료'],
'zh-CN'=>['hero'=>'您在岘港有房产出租吗？','sub'=>'免费发布房源，触达越南各地正在找房的租客。','list'=>'免费发布我的房产','ask'=>'我有问题','free'=>'免费发布','no_fee'=>'无预付发布费','simple'=>'轻松登记','contact'=>'联系方式','property'=>'房产','details'=>'详情','photos'=>'照片','done'=>'完成'],
'zh-TW'=>['hero'=>'您在峴港有房產出租嗎？','sub'=>'免費刊登房源，接觸越南各地正在找房的租客。','list'=>'免費刊登我的房產','ask'=>'我有問題','free'=>'免費刊登','no_fee'=>'無預付刊登費','simple'=>'輕鬆登記','contact'=>'聯絡方式','property'=>'房產','details'=>'詳情','photos'=>'照片','done'=>'完成'],
'ru'=>['hero'=>'Есть недвижимость для аренды в Дананге?','sub'=>'Разместите бесплатно и найдите арендаторов по всему Вьетнаму.','list'=>'РАЗМЕСТИТЬ БЕСПЛАТНО','ask'=>'У МЕНЯ ЕСТЬ ВОПРОС','free'=>'БЕСПЛАТНО','no_fee'=>'БЕЗ ПРЕДОПЛАТЫ','simple'=>'ПРОСТАЯ РЕГИСТРАЦИЯ','contact'=>'Контакт','property'=>'Объект','details'=>'Детали','photos'=>'Фото','done'=>'Готово'],
'fr'=>['hero'=>'Un bien à louer à Da Nang ?','sub'=>'Publiez gratuitement et touchez des locataires dans tout le Vietnam.','list'=>'PUBLIER GRATUITEMENT','ask'=>'J’AI UNE QUESTION','free'=>'ANNONCE GRATUITE','no_fee'=>'AUCUN FRAIS INITIAL','simple'=>'INSCRIPTION SIMPLE','contact'=>'Contact','property'=>'Bien','details'=>'Détails','photos'=>'Photos','done'=>'Terminé'],
'de'=>['hero'=>'Eine Immobilie in Da Nang zu vermieten?','sub'=>'Kostenlos inserieren und Mieter in ganz Vietnam erreichen.','list'=>'KOSTENLOS INSERIEREN','ask'=>'ICH HABE EINE FRAGE','free'=>'KOSTENLOS','no_fee'=>'KEINE VORAUSZAHLUNG','simple'=>'EINFACHE ANMELDUNG','contact'=>'Kontakt','property'=>'Immobilie','details'=>'Details','photos'=>'Fotos','done'=>'Fertig']];
$t=$copy[$lang];$rtl=false;
$social='Reach renters searching for properties across Vietnam.';try{$s=get_db()->prepare("SELECT setting_value FROM owner_settings WHERE setting_key='social_proof' AND is_verified=1");$s->execute();$social=$s->fetchColumn()?:$social;}catch(Throwable $e){}
$variant=$_COOKIE['owner_ab']??'';if(!in_array($variant,['A','B','C','D'],true)){$variant=['A','B','C','D'][random_int(0,3)];setcookie('owner_ab',$variant,['expires'=>time()+2592000,'path'=>'/','secure'=>true,'samesite'=>'Lax']);}
$headlines=['A'=>$t['hero'],'B'=>'Get More Tenants for Your Da Nang Property','C'=>'List Your Da Nang Property FREE','D'=>'What Could Your Da Nang Property Rent For?'];
if($lang!=='en')$headlines[$variant]=$t['hero'];
?>
<!doctype html><html lang="<?=htmlspecialchars($lang)?>"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><title><?=htmlspecialchars($t['hero'])?> | Da Nang Beachfront</title><meta name="description" content="<?=htmlspecialchars($t['sub'])?>"><link rel="canonical" href="https://danangbeachfront.com/owners"><link rel="preload" as="image" href="/city-da-nang.avif" type="image/avif" fetchpriority="high"><?php foreach($langs as $l):?><link rel="alternate" hreflang="<?=$l?>" href="https://danangbeachfront.com/owners?lang=<?=urlencode($l)?>"><?php endforeach?><style>
:root{--ink:#122a35;--sea:#007f82;--gold:#d9aa55;--mist:#f3f7f5;--white:#fff}*{box-sizing:border-box}body{margin:0;color:var(--ink);font:16px/1.55 system-ui,-apple-system,Segoe UI,sans-serif;background:#fff}button,input,select,textarea{font:inherit}.top{position:absolute;z-index:2;width:100%;display:flex;justify-content:space-between;align-items:center;padding:20px max(5vw,20px);color:white}.brand{font-weight:800;letter-spacing:.04em}.lang{background:#ffffff18;border:1px solid #ffffff70;color:white;border-radius:30px;padding:10px}.hero{min-height:680px;display:grid;place-items:center;color:white;text-align:center;padding:110px 20px 70px;background:linear-gradient(100deg,#071e2bd9,#07545bbd),url('/city-da-nang.avif') center/cover}.hero h1{font:800 clamp(2.4rem,7vw,5.2rem)/1.02 Georgia,serif;max-width:900px;margin:.2em auto}.hero p{font-size:clamp(1.1rem,2vw,1.4rem);max-width:680px;margin:22px auto}.badges{display:flex;justify-content:center;gap:10px;flex-wrap:wrap;margin:24px 0}.badges span{border:1px solid #ffffff80;padding:8px 13px;border-radius:30px;font-size:.78rem;font-weight:800}.actions{display:flex;justify-content:center;gap:12px;flex-wrap:wrap}.btn{min-height:54px;border:0;border-radius:8px;padding:15px 24px;font-weight:800;cursor:pointer}.primary{background:var(--gold);color:#17242a}.secondary{background:white;color:var(--ink)}section{padding:76px max(5vw,20px)}.soft{background:var(--mist)}h2{font:700 clamp(2rem,4vw,3.2rem)/1.1 Georgia,serif;text-align:center;margin:0 0 35px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;max-width:1100px;margin:auto}.card{background:white;border:1px solid #dce7e3;border-radius:14px;padding:26px;box-shadow:0 8px 30px #16352b0c}.card b{display:block;color:var(--sea);margin-bottom:8px}.network{text-align:center;font-size:1.15rem}.network strong{display:inline-block;margin:10px 16px}.question{text-align:center}.faq{max-width:850px;margin:auto}.faq details{border-bottom:1px solid #ddd;padding:16px}.faq summary{font-weight:700;cursor:pointer}.modal{position:fixed;inset:0;background:#071c27d9;z-index:20;display:none;align-items:center;justify-content:center;padding:12px}.modal.open{display:flex}.panel{width:min(760px,100%);max-height:96vh;overflow:auto;background:white;border-radius:18px;padding:clamp(20px,5vw,42px);position:relative}.close{position:absolute;right:15px;top:12px;background:none;border:0;font-size:28px}.progress{display:grid;grid-template-columns:repeat(5,1fr);gap:4px;margin:18px 0 30px}.progress span{font-size:.7rem;text-align:center;border-top:4px solid #d6e0dd;padding-top:5px}.progress span.on{border-color:var(--sea);color:var(--sea);font-weight:800}.step{display:none}.step.on{display:block}label{font-weight:700;display:block;margin:14px 0 5px}input,select,textarea{width:100%;min-height:50px;padding:12px;border:1px solid #b8c9c6;border-radius:8px;background:white}textarea{min-height:110px}.row{display:grid;grid-template-columns:1fr 1fr;gap:13px}.form-actions{display:flex;gap:10px;margin-top:24px}.error{color:#a52020;font-weight:700}.success{text-align:center;padding:30px 0}.drop{border:2px dashed #9bbab5;padding:25px;text-align:center;border-radius:12px}.previews{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:12px}.preview{position:relative;background:#eee;min-height:90px;border-radius:8px;overflow:hidden}.preview img{width:100%;height:110px;object-fit:cover}.preview button{position:absolute;right:3px;top:3px;border:0;border-radius:50%}.privacy{font-size:.8rem;color:#53666b}footer{padding:30px;text-align:center;background:#102b36;color:#cfdddd}@media(max-width:700px){.grid{grid-template-columns:1fr}.hero{min-height:620px}.row{grid-template-columns:1fr}.panel{border-radius:14px}.form-actions{position:sticky;bottom:-1px;background:white;padding:10px 0}.btn{width:100%}.previews{grid-template-columns:repeat(2,1fr)}}
</style><style>
:root{--navy:#06243D;--navy2:#071B2E;--gold:#D99A28;--gold2:#E7B84B;--paper:#F7F7F4;--text:#10243A}.top{position:sticky;top:0;background:#fff;color:var(--text);padding:10px max(4vw,18px);box-shadow:0 1px 12px #06243d12}.top img{display:block;width:auto;height:42px;max-width:235px}.brand{display:flex;align-items:center}.desktop-nav{display:flex;gap:22px;align-items:center;margin-left:auto}.desktop-nav a{color:var(--text);font-size:.87rem;text-decoration:none;font-weight:650}.top .lang{background:#fff;color:var(--text);border-color:#dce2e5;padding:8px;margin-left:18px}.top .btn{min-height:40px;padding:10px 14px;font-size:.76rem;margin-left:12px}.menu-button{display:none;background:transparent;border:0;color:var(--navy);font-size:25px}.mobile-menu{display:none}.hero{min-height:620px;text-align:left;place-items:stretch;padding:72px max(6vw,20px);background:linear-gradient(90deg,#071b2ef5 0%,#06243dda 53%,#06243d55 100%),url('/city-da-nang.avif') center/cover}.hero-inner{width:min(1200px,100%);margin:auto;display:grid;grid-template-columns:minmax(0,1.15fr) minmax(320px,.85fr);gap:64px;align-items:center}.eyebrow{color:var(--gold2);font-weight:800;font-size:.77rem;letter-spacing:.13em}.hero h1{margin:12px 0 18px;max-width:720px;font-size:clamp(2.65rem,5.1vw,4.8rem)}.hero p{margin:0 0 23px;max-width:650px}.benefit-row{display:flex;flex-wrap:wrap;gap:8px}.benefit-row span{font-size:.75rem;border:1px solid #ffffff60;padding:8px 10px;border-radius:5px;font-weight:750}.hero-card{background:#fff;color:var(--text);padding:28px;border-radius:14px;box-shadow:0 25px 60px #0005}.hero-card h2{font:700 1.65rem/1.15 Georgia,serif;text-align:left;margin:0 0 7px}.hero-card p{font-size:.92rem;color:#52616a;margin-bottom:13px}.hero-card label{font-size:.86rem;margin-top:11px}.hero-card input{min-height:46px}.hero-card .privacy{margin:10px 0}.hero-card .btn{width:100%}.quick-error{color:#9c1b1b;font-weight:700;font-size:.85rem;margin-top:7px}.soft{background:var(--paper)}section{padding:80px max(5vw,20px)}h2{color:var(--navy)}.card{border:0;box-shadow:0 10px 32px #06243d0e}.card b{color:var(--gold)}.network{background:var(--navy);color:white}.network h2{color:white}.question{background:var(--paper)}footer{background:var(--navy2)}.mobile-only{display:none}@media(max-width:850px){.top{position:sticky}.top img{height:36px;max-width:195px}.desktop-nav,.top>.btn{display:none}.top .lang{margin-left:auto;margin-right:7px;font-size:.78rem}.menu-button{display:block;padding:7px;min-height:38px}.mobile-menu.open{display:block;position:absolute;top:100%;left:0;right:0;padding:18px;background:#fff;box-shadow:0 14px 24px #0002}.mobile-menu a{display:block;padding:13px;color:var(--text);text-decoration:none;font-weight:700}.mobile-menu .btn{width:100%;margin-top:8px}.hero{padding:0 0 32px;min-height:0;background:var(--navy2)}.hero:before{content:\"\";display:block;height:190px;background:linear-gradient(#06243d22,#06243d99),url('/city-da-nang.avif') center/cover}.hero-inner{display:block;padding:26px 20px 0}.hero h1{font-size:clamp(2.2rem,10vw,3.2rem);margin-top:10px}.hero-copy>p{font-size:1.03rem}.benefit-row{display:grid;grid-template-columns:1fr 1fr 1fr}.benefit-row span{text-align:center;padding:8px 4px;font-size:.62rem}.hero-card{margin-top:24px;padding:20px;border-radius:12px}.mobile-only{display:block}.hero-card .row{gap:8px}.hero-card .row input{min-width:0}.hero-card h2{font-size:1.35rem}.hero-card .privacy{font-size:.73rem}.hero .actions{justify-content:flex-start}.hero .actions .btn{width:100%}.grid{gap:14px}}</style></head><body>
<style>@media(max-width:850px){.top{padding:14px max(4vw,18px)}}</style><header class="top"><a class="brand" href="/" aria-label="Da Nang Beachfront home"><img src="/assets/logo.png" alt="Da Nang Beachfront"></a><nav class="desktop-nav" aria-label="Owner page"><a href="#why">Why List With Us</a><a href="#process">How It Works</a><a href="#owners">For Property Owners</a><a href="#about">About</a><a href="#contact">Contact</a></nav><select class="lang" aria-label="Language" onchange="switchLang(this.value)"><?php foreach($langs as $l):?><option value="<?=$l?>" <?=$l===$lang?'selected':''?>><?=$l?></option><?php endforeach?></select><button class="btn primary" onclick="openFunnel()">LIST YOUR PROPERTY</button><button class="menu-button" aria-label="Open menu" aria-expanded="false" onclick="toggleMenu(this)">☰</button><nav class="mobile-menu" id="mobileMenu" aria-label="Mobile navigation"><a href="#why" onclick="closeMenu()">Why List With Us</a><a href="#process" onclick="closeMenu()">How It Works</a><a href="#owners" onclick="closeMenu()">For Property Owners</a><a href="#about" onclick="closeMenu()">About</a><a href="#contact" onclick="closeMenu()">Contact</a><button class="btn primary" onclick="closeMenu();openFunnel()">LIST MY PROPERTY — FREE</button></nav></header>
 <main><section class="hero"><div class="hero-inner"><div class="hero-copy"><div class="eyebrow">FOR DA NANG PROPERTY OWNERS</div><h1><strong>1,000’s</strong><span class="hero-daily">ENQUIRIES DAILY.</span><span class="hero-offer">List your property <em>for FREE</em></span></h1><p>Our network receives 1,000s of enquiries daily across Vietnam. List your apartment, villa or house with Danang Beachfront for free and put it in front of people looking for rentals.</p><div class="benefit-row" aria-label="Owner listing benefits"><div class="benefit-card"><span class="benefit-icon" aria-hidden="true"><svg viewBox="0 0 24 24" focusable="false"><path d="M12 3v18M3 12h18"/></svg></span><strong>FREE TO LIST</strong><small>List your property completely free.</small></div><div class="benefit-card"><span class="benefit-icon" aria-hidden="true"><svg viewBox="0 0 24 24" focusable="false"><circle cx="12" cy="12" r="8.5"/><path d="M12 7v10M9.5 9.5c.4-1 1.2-1.5 2.5-1.5 1.4 0 2.4.7 2.4 1.8 0 2.5-4.8 1.2-4.8 3.7 0 1.1 1 2 2.5 2 1.2 0 2.1-.5 2.6-1.6"/></svg></span><strong>NO UPFRONT<br>LISTING FEE</strong><small>Pay nothing upfront, ever.</small></div><div class="benefit-card"><span class="benefit-icon" aria-hidden="true"><svg viewBox="0 0 24 24" focusable="false"><circle cx="9" cy="9" r="3"/><circle cx="16.5" cy="8.5" r="2.2"/><path d="M3.5 19c.3-3 2.2-4.7 5.5-4.7s5.2 1.7 5.5 4.7M14 14.6c2.8-.5 5.2 1 6 3.8"/></svg></span><strong>REACH RENTERS<br>SEARCHING IN DA NANG</strong><small>Connect with active renters daily.</small></div></div><div class="actions"><button class="btn primary" onclick="openFunnel()"><span class="cta-leading-icon" aria-hidden="true"><svg viewBox="0 0 24 24" focusable="false"><path d="m4 11 8-7 8 7v9H4z"/><path d="M9 20v-5h6v5"/></svg></span><span>LIST MY PROPERTY — FREE</span><span class="cta-arrow" aria-hidden="true">→</span></button><button class="btn secondary" onclick="openQuestion()"><span class="cta-leading-icon" aria-hidden="true"><svg viewBox="0 0 24 24" focusable="false"><path d="M5 5h14v10H9l-4 4z"/><path d="M8 9h8M8 12h5"/></svg></span><span>I HAVE A QUESTION</span><span class="cta-arrow" aria-hidden="true">→</span></button></div></div><style>.quick-contact{display:none}.hero-card.contact .quick-contact{display:block}.hero-card.contact #quickBuilding{background:#f4f7f6}</style><aside class="hero-card" id="heroCard" aria-label="Start your free property listing"><div class="form-mark">FREE LISTING</div><h2 id="quickTitle">Where is your property?</h2><p id="quickSubcopy">Start with a building, residence or area in Da Nang.</p><form id="heroQuick" data-phase="location" onsubmit="quickStart();return false"><label for="quickBuilding">Where is your property located? *</label><input id="quickBuilding" name="building" list="buildings" autocomplete="street-address" placeholder="Building, residence or area" required oninput="suggest(this.value)"><div class="quick-contact" aria-hidden="true"><div class="row"><div><label for="quickName">Your name *</label><input id="quickName" name="name" autocomplete="name" required disabled></div><div><label for="quickPhone">Mobile number *</label><input id="quickPhone" name="phone" type="tel" autocomplete="tel" required disabled></div></div><label><input style="width:auto;min-height:auto" name="whatsapp" type="checkbox" value="1" disabled> Available on WhatsApp</label><p class="privacy">By continuing, you ask us to contact you about this property submission.</p></div><div class="quick-error" aria-live="polite"></div><button class="btn primary" id="quickButton" type="submit">CONTINUE</button></form></aside></div></section>
<style>.section-kicker{color:#D99A28;font-size:.76rem;font-weight:800;letter-spacing:.12em;text-align:center}.section-sub{max-width:580px;text-align:center;margin:-18px auto 38px;color:#5a6971}.process-list{max-width:1120px;margin:auto;display:grid;gap:18px}.process-card{display:grid;grid-template-columns:48% 1fr;overflow:hidden;background:#fff;border:1px solid #e0e5e4;border-radius:12px;min-height:210px}.process-card img{width:100%;height:100%;object-fit:cover}.process-copy{padding:28px 34px;align-self:center}.step-no{color:#D99A28;font-weight:800;letter-spacing:.12em}.process-copy h3{font:700 1.5rem Georgia,serif;color:#06243D;margin:7px 0}.why-layout{max-width:1120px;margin:auto;display:grid;grid-template-columns:1fr 1fr;gap:55px;align-items:center}.why-photo{min-height:560px;overflow:hidden;border-radius:12px;position:relative}.why-photo img{width:100%;height:100%;object-fit:cover;position:absolute}.why-rows{display:grid;gap:0}.why-row{display:grid;grid-template-columns:42px 1fr;gap:14px;padding:18px 0;border-bottom:1px solid #dfe5e3}.why-icon{color:#D99A28;font-weight:800;font-size:1rem;padding-top:2px}.why-row h3{font-size:1rem;margin:0 0 4px;color:#06243D}.why-row p{margin:0;color:#5b6970}.property-showcase{background:#06243D;color:white;padding:0;overflow:hidden}.property-showcase-inner{max-width:1300px;margin:auto;display:grid;grid-template-columns:1.15fr .85fr;align-items:center}.property-showcase figure{margin:0;min-height:420px}.property-showcase img{width:100%;height:100%;min-height:420px;object-fit:cover}.property-copy{padding:55px}.property-copy h2{color:white;text-align:left;margin:0 0 18px}.property-copy p{font-size:1.15rem;max-width:440px}.property-copy .btn{margin-top:15px}@media(max-width:850px){.process-card{grid-template-columns:1fr}.process-card img{height:190px}.process-copy{padding:22px}.why-layout,.property-showcase-inner{grid-template-columns:1fr;gap:0}.why-photo{min-height:270px;border-radius:0}.why-row{padding:15px 0}.property-showcase figure,.property-showcase img{min-height:260px}.property-copy{padding:38px 20px}.section-sub{margin-bottom:28px}}</style>
<section class="soft" id="why"><div class="section-kicker">FOR PROPERTY OWNERS</div><h2>WHY LIST WITH DANANG BEACHFRONT?</h2><p class="section-sub">More exposure. A simpler process. No upfront listing fee.</p><div class="why-layout"><figure class="why-photo"><img src="/img/beach-skyline.jpg" loading="lazy" decoding="async" alt="Da Nang beachfront skyline and apartments"></figure><div class="why-rows"><div class="why-row"><span class="why-icon">01</span><div><h3>FREE TO LIST</h3><p>No upfront listing fee to submit your property.</p></div></div><div class="why-row"><span class="why-icon">02</span><div><h3>REACH ACTIVE RENTERS</h3><p>Be seen by people actively searching in Da Nang.</p></div></div><div class="why-row"><span class="why-icon">03</span><div><h3>PROFESSIONAL PRESENTATION</h3><p>Share the details and photos that help tenants understand your property.</p></div></div><div class="why-row"><span class="why-icon">04</span><div><h3>WIDER EXPOSURE</h3><p>Eligible listings may be considered for selected network destinations.</p></div></div><div class="why-row"><span class="why-icon">05</span><div><h3>SIMPLE OWNER PROCESS</h3><p>Start with your location, then complete the details at your pace.</p></div></div></div></div></section>
<section id="process"><div class="section-kicker">HOW IT WORKS</div><h2>THREE SIMPLE STEPS</h2><p class="section-sub">List your property without the hassle.</p><div class="process-list"><article class="process-card"><img src="/img/modern-apt-interior.jpg" loading="lazy" decoding="async" alt="Modern Da Nang apartment interior"><div class="process-copy"><span class="step-no">01</span><h3>Tell Us Where Your Property Is</h3><p>Start with a building, residence or area. It takes only a moment.</p></div></article><article class="process-card"><img src="/img/luxury-complex.jpg" loading="lazy" decoding="async" alt="Modern Da Nang residential complex"><div class="process-copy"><span class="step-no">02</span><h3>Tell Us About Your Property</h3><p>Add the practical details and photos when you are ready.</p></div></article><article class="process-card"><img src="/img/coastal-resort.jpg" loading="lazy" decoding="async" alt="Coastal Da Nang rental property"><div class="process-copy"><span class="step-no">03</span><h3>We Review &amp; Promote Your Listing</h3><p>Our team reviews the information before any eligible promotion.</p></div></article></div></section>
<section class="property-showcase"><div class="property-showcase-inner"><figure><img src="/img/condotel.jpg" loading="lazy" decoding="async" alt="Da Nang coastal condotel property"></figure><div class="property-copy"><div class="eyebrow">A CLEARER WAY TO PRESENT</div><h2>SEE HOW YOUR PROPERTY CAN BE PRESENTED.</h2><p>YOUR PROPERTY. PRESENTED PROFESSIONALLY. Clear details, considered imagery, and a listing that helps the right renters understand what you offer.</p><button class="btn primary" onclick="openFunnel()">LIST MY PROPERTY — FREE</button></div></div></section>
 <section class="soft network" id="about"><div class="section-kicker">OUR NETWORK</div><h2>ONE PROPERTY. WIDER EXPOSURE.</h2><p>Our network receives 1,000s of enquiries daily across Vietnam. Your property starts with <b>DanangBeachfront</b> and may be considered for additional exposure across selected network destinations after review.</p><div class="network-sites" aria-label="DanangBeachfront network sites"><a href="https://danangbeachfront.com/" target="_blank" rel="noopener"><img src="/assets/logo.png" alt="Da Nang Beachfront"></a><a href="https://rentalsvietnam.com/?utm_source=danangbeachfront&utm_medium=referral&utm_campaign=partner_network" target="_blank" rel="noopener"><img src="https://rentalsvietnam.com/assets/rentalsvietnam-logo.png" alt="RentalsVietnam"></a><a href="https://vietnamforrent.com/?utm_source=danangbeachfront&utm_medium=referral&utm_campaign=partner_network" target="_blank" rel="noopener"><img src="https://vietnamforrent.com/assets/vietnamforrent-logo.png" alt="Vietnam for Rent"></a><a href="https://buysaigon.com/?utm_source=danangbeachfront&utm_medium=referral&utm_campaign=partner_network" target="_blank" rel="noopener"><img src="https://buysaigon.com/assets/brand/buysaigon-logo-v20260823.png" alt="BuySaigon"></a><a href="https://apartmentsvietnam.com/?utm_source=danangbeachfront&utm_medium=referral&utm_campaign=partner_network" target="_blank" rel="noopener"><img src="https://apartmentsvietnam.com/assets/logo.png" alt="ApartmentsVietnam"></a></div><p><small>Publication destinations are selected after review and are not automatic.</small></p></section>
<section class="question" id="owners"><div class="section-kicker">LIST WITH CONFIDENCE</div><h2>YOUR PROPERTY DESERVES TO BE SEEN.</h2><p>Get more exposure for your Da Nang property. List your property with DanangBeachfront for FREE.</p><button class="btn primary" onclick="openFunnel()">LIST MY PROPERTY — FREE</button><p><button class="btn secondary" onclick="openQuestion()">I HAVE A QUESTION</button></p></section>
<section class="soft"><h2>Frequently asked questions</h2><div class="faq"><?php $faqs=[['Is listing really free?','Yes. There is no upfront listing fee. Any optional future service will be explained before you choose it.'],['How does listing work?','Share your contact and property details. Our team reviews the submission and may ask for clarification.'],['How quickly can my property go live?','Timing depends on completeness and verification. We do not promise publication before review.'],['Do I need professional photos?','No. Phone photos are welcome, and you may add them later.'],['Can I list multiple properties?','Yes. You do not need to register again.'],['Can I update rent or remove my property?','Yes. Contact our team to request corrections, updates, or removal.'],['Do you work with agents or foreign owners?','Yes. We record whether you are an owner, authorized representative, or property manager.'],['Where can my property be advertised?','Eligible properties may be approved for selected network destinations; publication is not automatic.'],['How is my information used?','We use it to review your property, contact you about your request, prevent duplicates, and administer the listing. Private contact details are not publicly displayed by this form.']];foreach($faqs as $f):?><details><summary><?=htmlspecialchars($f[0])?></summary><p><?=htmlspecialchars($f[1])?></p></details><?php endforeach?></div></section></main>
<footer id="contact">© <?=date('Y')?> Da Nang Beachfront · <a href="/privacy-policy.php" style="color:white">Privacy</a></footer>
<div class="modal" id="funnel"><div class="panel"><button class="close" onclick="closeModal('funnel')">×</button><div class="progress" id="progress"><?php foreach([$t['contact'],$t['property'],$t['details'],$t['photos'],$t['done']] as $i=>$x):?><span data-p="<?=$i+1?>"><?=$i+1?> <?=$x?></span><?php endforeach?></div>
<form id="ownerForm" onsubmit="return false"><input type="hidden" name="resume_token"><div class="step" data-step="1"><h2><?=$t['contact']?></h2><label>Name *</label><input name="name" autocomplete="name" required><label>Mobile number *</label><input name="phone" type="tel" autocomplete="tel" required><label><input style="width:auto;min-height:auto" name="whatsapp" type="checkbox" value="1"> Available on WhatsApp</label><p class="privacy">By continuing, you ask us to contact you about this property submission. Your details are handled under our privacy policy.</p><div class="error"></div><div class="form-actions"><button class="btn primary" onclick="saveContact()">CONTINUE — IT'S FREE</button></div></div>
<div class="step" data-step="2"><h2><?=$t['property']?></h2><label>Building / residence *</label><input name="building" list="buildings" required oninput="suggest(this.value)"><datalist id="buildings"></datalist><div class="row"><div><label>Apartment / unit</label><input name="unit"></div><div><label>Address</label><input name="address"></div></div><div class="error"></div><div class="form-actions"><button class="btn primary" onclick="saveProperty()">CONTINUE</button></div></div>
<div class="step" data-step="3"><h2><?=$t['details']?></h2><div class="row"><div><label>Property type</label><select name="property_type"><option>Apartment</option><option>House</option><option>Villa</option><option>Studio</option><option>Other</option></select></div><div><label>Bedrooms</label><input name="bedrooms" type="number" min="0" max="30" step=".5"></div><div><label>Bathrooms</label><input name="bathrooms" type="number" min="0" max="30" step=".5"></div><div><label>Approx. size (m²)</label><input name="size_sqm" type="number" min="1"></div><div><label>Monthly asking rent (VND)</label><input name="monthly_rent" type="number" min="0"></div><div><label>Available from</label><input name="available_from" type="date"></div><div><label>Furnishing</label><select name="furnished"><option value="">Select</option><option>Furnished</option><option>Part-furnished</option><option>Unfurnished</option></select></div><div><label>Rental preference</label><select name="rental_preference"><option>Long-term</option><option>Short-term</option><option>Either</option></select></div><div><label>Your goal</label><select name="owner_intent"><option>Find a tenant</option><option>Advertise my property</option><option>Find a long-term tenant</option><option>Find an expat tenant</option><option>Property management</option><option>Sell my property</option><option>Other</option></select></div><div><label>Your relationship</label><select name="relationship_type"><option>Property owner</option><option>Authorized representative</option><option>Agent/property manager</option></select></div></div><div class="error"></div><div class="form-actions"><button class="btn primary" onclick="saveDetails()">CONTINUE TO PHOTOS</button></div></div>
<div class="step" data-step="4"><h2><?=$t['photos']?></h2><p>Add 3+ photos if possible. You can skip and return later.</p><div class="drop"><input id="photo" type="file" accept="image/*" capture="environment" multiple onchange="uploadPhotos(this.files)"><p id="uploadStatus"></p></div><div class="previews" id="previews"></div><div class="error"></div><div class="form-actions"><button class="btn secondary" onclick="complete()">SKIP FOR NOW</button><button class="btn primary" onclick="complete()">SUBMIT PROPERTY</button></div></div>
<div class="step" data-step="5"><div class="success"><h2>YOUR FREE PROPERTY LISTING HAS BEEN SUBMITTED!</h2><p>Our team will review it and may request clarification. Missing information or photos can be added later. Network promotion may follow approval.</p><button class="btn primary" onclick="alert('Your submission is awaiting review.')">VIEW MY PROPERTY</button><button class="btn secondary" onclick="another()">ADD ANOTHER PROPERTY</button></div></div></form></div></div>
<div class="modal" id="question"><div class="panel"><button class="close" onclick="closeModal('question')">×</button><h2>Have a question?</h2><form id="questionForm" onsubmit="sendQuestion();return false"><label>Name *</label><input name="name" required><label>Phone / WhatsApp *</label><input name="phone" type="tel" required><label>Email (optional)</label><input name="email" type="email"><label>Your question *</label><textarea name="question" required></textarea><label><input style="width:auto;min-height:auto" name="whatsapp" type="checkbox" value="1"> Available on WhatsApp</label><p class="privacy">By sending, you ask our team to contact you about your question.</p><div class="error"></div><button class="btn primary" type="submit">SEND MY QUESTION</button></form></div></div>
<script>
const CSRF=<?=json_encode($_SESSION['owner_csrf'])?>, LANG=<?=json_encode($lang)?>, VARIANT=<?=json_encode($variant)?>, form=document.getElementById('ownerForm');let stage=1,photos=[];
const params=new URLSearchParams(location.search), keys=['utm_source','utm_medium','utm_campaign','utm_content','utm_term','gclid'];let touch={};keys.forEach(k=>{touch[k]=params.get(k)||localStorage.getItem('owner_'+k)||'';if(touch[k])localStorage.setItem('owner_'+k,touch[k])});if(!localStorage.owner_first_touch)localStorage.owner_first_touch=JSON.stringify(touch);
function payload(f){let x=Object.fromEntries(new FormData(f));return {...x,...touch,csrf:CSRF,ab_variant:VARIANT,landing_page:location.href,referrer:document.referrer,first_touch:JSON.parse(localStorage.owner_first_touch||'{}')}}
async function api(action,data,fd){let o={method:'POST',headers:{'X-CSRF-Token':CSRF}};if(fd)o.body=fd;else{o.headers['Content-Type']='application/json';o.body=JSON.stringify(data)}let r=await fetch('/owners.php?action='+action,o),j=await r.json();if(!r.ok||!j.ok)throw Error(j.error||'Please try again.');return j}
function show(n){stage=n;document.querySelectorAll('.step').forEach(x=>x.classList.toggle('on',+x.dataset.step===n));document.querySelectorAll('.progress span').forEach(x=>x.classList.toggle('on',+x.dataset.p<=n));localStorage.owner_stage=n;localStorage.owner_form=JSON.stringify(Object.fromEntries(new FormData(form)))}
function err(e){document.querySelector('.step.on .error').textContent=e.message}
function openFunnel(){document.getElementById('funnel').classList.add('open');api('event',{csrf:CSRF,event:'owner_funnel_started',ab_variant:VARIANT}).catch(()=>{});show(+localStorage.owner_stage||1)}
function openQuestion(){document.getElementById('question').classList.add('open');api('event',{csrf:CSRF,event:'owner_question_form_opened',ab_variant:VARIANT}).catch(()=>{})}
function closeModal(id){document.getElementById(id).classList.remove('open')}
function toggleMenu(button){let menu=document.getElementById('mobileMenu'),open=menu.classList.toggle('open');button.setAttribute('aria-expanded',String(open));if(open)menu.querySelector('a,button').focus()}
function closeMenu(){let menu=document.getElementById('mobileMenu');menu.classList.remove('open');document.querySelector('.menu-button').setAttribute('aria-expanded','false')}
async function quickStart(){let q=document.getElementById('heroQuick'),e=q.querySelector('.quick-error'),card=document.getElementById('heroCard');e.textContent='';if(q.dataset.phase==='location'){if(!q.elements.building.value.trim()){e.textContent='Please enter a building, residence or area.';q.elements.building.focus();return}q.dataset.phase='contact';card.classList.add('contact');q.querySelector('.quick-contact').setAttribute('aria-hidden','false');for(const n of ['name','phone','whatsapp'])q.elements[n].disabled=false;document.getElementById('quickTitle').textContent='A few contact details';document.getElementById('quickSubcopy').textContent='So our property team can follow up about your free listing.';document.getElementById('quickButton').textContent='CONTINUE — IT’S FREE';q.elements.name.focus();return}for(const k of ['building','name','phone'])form.elements[k].value=q.elements[k].value;form.elements.whatsapp.checked=q.elements.whatsapp.checked;document.getElementById('funnel').classList.add('open');try{let j=await api('contact',payload(form));form.resume_token.value=j.resume_token;localStorage.owner_resume=j.resume_token;await api('property',payload(form));show(3)}catch(x){show(1);e.textContent=x.message}}
async function saveContact(){try{let j=await api('contact',payload(form));form.resume_token.value=j.resume_token;localStorage.owner_resume=j.resume_token;show(2)}catch(e){err(e)}}
async function saveProperty(){try{await api('property',payload(form));show(3)}catch(e){err(e)}}
async function saveDetails(){try{await api('details',payload(form));show(4)}catch(e){err(e)}}
async function suggest(q){if(q.length<2)return;let j=await fetch('/owners.php?action=buildings&q='+encodeURIComponent(q)).then(r=>r.json());document.getElementById('buildings').innerHTML=j.items.map(x=>'<option value=\"'+x.title.replaceAll('\"','&quot;')+'\">').join('')}
async function uploadPhotos(files){document.getElementById('uploadStatus').textContent='Uploading…';for(const f of files){let box=document.createElement('div');box.className='preview';box.draggable=true;box.innerHTML='<img src=\"'+URL.createObjectURL(f)+'\"><small>Uploading…</small>';previews.append(box);box.addEventListener('dragstart',()=>box.classList.add('dragging'));box.addEventListener('dragend',()=>{box.classList.remove('dragging');saveOrder()});let fd=new FormData();fd.append('photo',f);fd.append('resume_token',form.resume_token.value);fd.append('csrf',CSRF);try{let j=await api('photo',null,fd);box.dataset.id=j.photo_id;box.querySelector('small').textContent='Uploaded · drag to reorder';box.insertAdjacentHTML('beforeend','<button type=\"button\" onclick=\"removePhoto(this)\">×</button>');photos.push(j.photo_id)}catch(e){box.querySelector('small').textContent='Failed';let retry=document.createElement('button');retry.type='button';retry.textContent='↻';retry.title='Retry upload';retry.onclick=()=>{box.remove();uploadPhotos([f])};box.append(retry)}}document.getElementById('uploadStatus').textContent='Uploads complete'}
previews.addEventListener('dragover',e=>{e.preventDefault();let moving=previews.querySelector('.dragging');if(!moving)return;let after=[...previews.querySelectorAll('.preview:not(.dragging)')].find(x=>e.clientY<x.getBoundingClientRect().top+x.offsetHeight/2);previews.insertBefore(moving,after||null)});
async function saveOrder(){let ids=[...previews.children].map(x=>+x.dataset.id).filter(Boolean);if(ids.length)await api('photos_order',{csrf:CSRF,resume_token:form.resume_token.value,ids})}
async function removePhoto(b){let box=b.parentElement;await api('photo_delete',{csrf:CSRF,resume_token:form.resume_token.value,photo_id:box.dataset.id});box.remove()}
async function complete(){try{await api('complete',payload(form));show(5)}catch(e){err(e)}}
async function another(){let j=await api('another',payload(form));form.reset();form.resume_token.value=j.resume_token;localStorage.owner_resume=j.resume_token;show(2)}
async function sendQuestion(){let q=document.getElementById('questionForm');try{await api('inquiry',payload(q));q.innerHTML='<div class=\"success\"><h2>Thank you</h2><p>Our team received your question and will contact you.</p></div>'}catch(e){q.querySelector('.error').textContent=e.message}}
function switchLang(l){localStorage.owner_form=JSON.stringify(Object.fromEntries(new FormData(form)));let u=new URL(location.href);u.searchParams.set('lang',l);location.href=u}
try{let s=JSON.parse(localStorage.owner_form||'{}');for(const[k,v]of Object.entries(s))if(form.elements[k]){if(form.elements[k].type==='checkbox')form.elements[k].checked=!!v;else form.elements[k].value=v}if(localStorage.owner_resume)form.resume_token.value=localStorage.owner_resume}catch(e){}
 addEventListener('popstate',()=>{if(document.getElementById('funnel').classList.contains('open'))show(Math.max(1,stage-1))});document.querySelector('.actions .primary')?.setAttribute('onclick','openFunnel()');api('event',{csrf:CSRF,event:'owner_page_view',ab_variant:VARIANT}).catch(()=>{});
 </script><style>
 /* Final visual pass: preserve the existing funnel and backend contract while
    giving the owner page a more editorial, property-led rhythm. */
 :root{--owner-navy:#06243d;--owner-navy-deep:#071b2e;--owner-gold:#d99a28;--owner-cream:#f7f7f4;--owner-line:#dce5e3}
 body{font-family:Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;background:#fff}
 .top{min-height:68px;padding:11px max(4vw,20px);background:rgba(255,255,255,.97);backdrop-filter:blur(10px)}
 .top img{height:42px;max-width:230px;object-fit:contain}
 .desktop-nav a{letter-spacing:.01em}
 .hero{background:linear-gradient(90deg,rgba(7,27,46,.97) 0%,rgba(6,36,61,.88) 43%,rgba(6,36,61,.22) 100%),url('/city-da-nang.avif') center/cover}
 .hero-inner{width:min(1240px,100%);gap:clamp(32px,6vw,88px)}
 .hero-copy{padding:8px 0}
 .eyebrow,.section-kicker{font-family:Inter,ui-sans-serif,system-ui,sans-serif}
 .hero h1{font-family:Georgia,"Times New Roman",serif;font-weight:400;letter-spacing:-.035em;line-height:.98}
 .hero h1 strong{display:block;color:#fff;font-weight:700;font-size:1.2em;letter-spacing:-.055em}
 .hero h1 span{display:block;margin-top:.12em;color:#fff;font-size:.62em;font-weight:400;letter-spacing:-.02em}
 .hero h1 .hero-daily{font-size:.67em;letter-spacing:-.025em}
 .hero h1 .hero-offer{font-size:.58em;line-height:1.05;text-transform:none}
 .hero h1 .hero-offer em{color:var(--owner-gold);font-weight:700}
 .hero-copy>p{max-width:610px;font-size:1.04rem;color:#eef5f4}
 .benefit-row{gap:8px;margin:22px 0 26px}
 .benefit-row{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));align-items:stretch}
 .benefit-card{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;min-width:0;padding:13px 9px 12px;border:1px solid rgba(255,255,255,.5);border-radius:9px;background:#fff;color:var(--owner-navy);text-align:center;box-shadow:0 10px 24px rgba(0,0,0,.12)}
 .benefit-card strong{font-size:.67rem;line-height:1.18;letter-spacing:.02em}
 .benefit-card small{margin-top:8px;color:#5a6971;font-size:.64rem;line-height:1.25}
 .benefit-icon{display:grid;place-items:center;width:38px;height:38px;margin-bottom:9px;border-radius:50%;background:#e7f5f6;color:#168ec1}
 .benefit-icon svg,.cta-leading-icon svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
 .actions .btn{display:flex;align-items:center;justify-content:center;gap:12px}
 .actions .primary{min-width:280px}
 .actions .secondary{min-width:230px}
 .cta-leading-icon{display:grid;place-items:center;flex:0 0 auto}
 .cta-arrow{margin-left:auto;font-size:1.55rem;font-weight:400;line-height:1}
 .btn{border-radius:6px;transition:transform .18s ease,box-shadow .18s ease}
 .btn:hover{transform:translateY(-1px)}
 .primary{background:var(--owner-gold);box-shadow:0 10px 22px rgba(217,154,40,.18)}
 .hero-card{border-top:4px solid var(--owner-gold);box-shadow:0 24px 70px rgba(2,18,32,.32);padding:30px}
 .form-mark{display:inline-block;color:var(--owner-gold);font:800 .68rem/1 Inter,ui-sans-serif,system-ui,sans-serif;letter-spacing:.16em;margin-bottom:12px}
 .hero-card h2{font-family:Georgia,"Times New Roman",serif;font-weight:400;letter-spacing:-.02em}
 .hero-card input{border-color:#ccd9d6;border-radius:6px}
 .hero-card input:focus,.hero-card select:focus,.hero-card textarea:focus{outline:3px solid rgba(217,154,40,.22);border-color:var(--owner-gold)}
 section{padding-top:clamp(60px,7vw,92px);padding-bottom:clamp(60px,7vw,92px)}
 h2{font-family:Georgia,"Times New Roman",serif;font-weight:400;letter-spacing:-.025em}
 .process-list{grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
 .process-card{display:block;min-height:0;border:1px solid var(--owner-line);box-shadow:0 14px 36px rgba(6,36,61,.08);transition:transform .2s ease,box-shadow .2s ease}
 .process-card:hover{transform:translateY(-3px);box-shadow:0 20px 44px rgba(6,36,61,.13)}
 .process-card img{display:block;height:190px;aspect-ratio:16/10}
 .process-copy{padding:22px 24px 26px}
 .process-copy h3{font-family:Georgia,"Times New Roman",serif;font-weight:400;letter-spacing:-.015em}
 .why-photo{box-shadow:0 20px 50px rgba(6,36,61,.14)}
 .why-row{padding:19px 0}
 .why-icon,.step-no{color:var(--owner-gold)}
 .property-showcase{background:var(--owner-navy-deep)}
 .property-copy h2{font-size:clamp(2rem,4vw,3.3rem)}
 .network{background:var(--owner-navy);padding-top:72px;padding-bottom:72px}
 .network .section-kicker{color:#f0c86d}
 .network h2{max-width:760px;margin-left:auto;margin-right:auto}
 .network>p{max-width:760px;margin-left:auto;margin-right:auto;color:#edf5f4}
 .network-sites{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:10px 12px;max-width:920px;margin:28px auto 22px}
 .network-sites span{padding:11px 15px;border:1px solid rgba(255,255,255,.23);border-radius:999px;color:#fff;background:rgba(255,255,255,.07);font-size:.82rem;font-weight:700;letter-spacing:.015em}
 .network-sites a{display:flex;align-items:center;justify-content:center;width:176px;height:64px;padding:11px 16px;border:1px solid rgba(255,255,255,.2);border-radius:10px;background:#fff;box-shadow:0 8px 22px rgba(0,0,0,.12);transition:transform .18s ease,box-shadow .18s ease}
 .network-sites a:hover{transform:translateY(-2px);box-shadow:0 12px 28px rgba(0,0,0,.18)}
 .network-sites img{display:block;max-width:100%;max-height:40px;width:auto;height:auto;object-fit:contain}
 .network small{color:#b8c9ca}
 .question{background:var(--owner-cream)}
 footer{padding:28px 20px}
 @media(max-width:850px){
   .top{min-height:68px;padding:14px max(4vw,18px)}
   .top img{height:37px;max-width:190px}
   .hero{background:linear-gradient(90deg,rgba(5,31,53,.98) 0%,rgba(5,31,53,.88) 48%,rgba(5,31,53,.26) 100%),url('/city-da-nang.avif') 62% top/cover no-repeat}
   .hero:before{display:none}
   .hero-inner{padding-top:30px}
   .hero h1{font-size:clamp(2.15rem,10vw,3.25rem);line-height:.99}
   .hero h1 strong{font-size:1.18em}
   .hero h1 span{font-size:.63em;margin-top:.16em}
   .hero h1 .hero-daily{font-size:.67em}
   .hero h1 .hero-offer{font-size:.61em;line-height:1.08}
   .hero-copy>p{font-size:1rem;line-height:1.5}
   .benefit-row{margin:19px 0 22px}
   .benefit-card{padding:11px 6px 10px;min-height:146px}
   .benefit-card strong{font-size:.61rem}
   .benefit-card small{font-size:.59rem}
   .benefit-icon{width:35px;height:35px;margin-bottom:8px}
   .actions{display:grid;grid-template-columns:1fr;width:100%}
   .actions .btn{width:100%;min-width:0;min-height:56px}
   .hero-card{padding:22px 20px;margin-top:22px}
   .process-list{grid-template-columns:1fr;gap:16px}
   .process-card img{height:auto;max-height:188px}
   .process-copy{padding:19px 20px 22px}
   .network-sites{gap:8px;margin-top:22px}
   .network-sites a{width:calc(50% - 4px);height:58px;padding:9px 10px}
   .network-sites img{max-height:34px}
   .network-sites span{font-size:.7rem;padding:9px 11px}
 }
 @media(max-width:380px){
   .top img{max-width:165px}
   .hero-inner{padding-left:17px;padding-right:17px}
   .hero h1{font-size:2.05rem}
   .benefit-card{padding-left:4px;padding-right:4px}
   .benefit-card strong{font-size:.56rem}
   .benefit-card small{font-size:.54rem}
 }
 /* Exact mobile reference pass. The hero artwork includes all headline copy. */
 @media(max-width:850px){
   .top{min-height:68px;padding:10px 18px}
   .top img{height:36px;max-width:180px}
   .top .lang{height:44px;min-width:128px;padding:7px 13px;margin-left:auto;margin-right:5px;border-radius:24px}
   .menu-button{font-size:28px;padding:4px 6px}
   .hero{display:block;min-height:0;padding:0 0 24px;background:var(--owner-navy-deep)}
   .hero:before{content:"";display:block;width:100%;height:auto;aspect-ratio:691/429;background:url('/assets/danangbeachfront_owner_hero_reference.jpg') center/contain no-repeat}
   .hero-inner{display:block;padding:0 20px}
   .hero-copy{padding:0}
   .hero-copy>.eyebrow,.hero-copy>h1,.hero-copy>p{display:none}
   .benefit-row{position:relative;z-index:1;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px;margin:-8px 0 11px}
   .benefit-card{min-height:140px;padding:9px 5px 8px;border-radius:8px;box-shadow:0 7px 16px rgba(0,0,0,.2)}
   .benefit-card strong{font-size:.59rem;line-height:1.14}
   .benefit-card small{margin-top:6px;font-size:.55rem;line-height:1.2}
   .benefit-icon{width:36px;height:36px;margin-bottom:7px}
   .benefit-icon svg{width:23px;height:23px}
   .actions{display:grid;grid-template-columns:1fr;gap:9px;width:100%}
   .actions .btn{width:100%;min-width:0;min-height:52px;padding:10px 15px;border-radius:8px;font-size:.91rem}
   .actions .primary{background:linear-gradient(180deg,#f2bd48,#dfa01d)}
   .actions .secondary{border:1px solid #dce4e6}
   .cta-leading-icon{width:31px;height:31px;border:1px solid currentColor;border-radius:50%}
   .cta-leading-icon svg{width:18px;height:18px}
   .cta-arrow{padding-left:14px;border-left:1px solid rgba(6,36,61,.14)}
   .hero-card{padding:17px 18px 18px;margin-top:11px;border-radius:10px;border-top-width:3px;box-shadow:0 12px 30px rgba(2,18,32,.22)}
   .hero-card .form-mark{display:none}
   .hero-card h2{font-size:1.35rem;margin-bottom:3px}
   .hero-card>p{font-size:.76rem;margin:0 0 8px}
   .hero-card form>label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
   .hero-card input{min-height:42px;font-size:.82rem}
   .hero-card .btn{min-height:40px;padding:9px 15px;margin-top:7px}
 }
 @media(max-width:380px){
   .top{padding-left:14px;padding-right:12px}
   .top img{max-width:150px;height:32px}
   .top .lang{min-width:112px}
   .hero-inner{padding-left:16px;padding-right:16px}
   .benefit-card strong{font-size:.54rem}
   .benefit-card small{font-size:.51rem}
 }
 /* Approved final desktop composition: hero first, then cards, CTAs, and form. */
 main>section:not(.hero),footer{display:none}
 .benefit-card:first-child .benefit-icon svg{display:none}
 .benefit-card:first-child .benefit-icon:before{content:"";display:block;width:25px;height:25px;background:center/contain no-repeat url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23168ec1' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6v6.2L11.8 20 20 11.8 12.2 4H6a2 2 0 0 0-2 2Z'/%3E%3Ccircle cx='8.5' cy='8.5' r='1.2'/%3E%3C/svg%3E")}
 @media(min-width:851px){
   .top{min-height:72px;padding:10px max(4vw,28px)}
   .top img{width:180px;height:50px;max-width:180px}
   .desktop-nav{gap:25px}
   .desktop-nav a{white-space:nowrap;font-size:.78rem}
   .top .lang{margin-left:auto;min-width:88px}
   .top>.btn{margin-left:13px;white-space:nowrap}
   .hero{display:block;min-height:0;padding:0 0 30px;background:#fff;color:var(--owner-navy)}
   .hero-inner{display:block;width:min(1280px,calc(100% - 64px));margin:auto}
   .hero-copy{position:relative;display:block;min-height:485px;padding:48px 10px 0;overflow:visible}
   .hero-copy:before{content:"";position:absolute;z-index:0;top:0;left:50%;width:100vw;height:410px;transform:translateX(-50%);background:linear-gradient(90deg,rgba(5,28,50,.98) 0%,rgba(5,28,50,.88) 34%,rgba(5,28,50,.18) 63%,rgba(5,28,50,0) 100%),url('/assets/danangbeachfront_owner_beachfront.png') center/cover no-repeat}
   .hero-copy>*{position:relative;z-index:1}
   .hero-copy .eyebrow{font-size:.72rem;letter-spacing:.15em;color:#f0c86d}
   .hero h1{max-width:560px;margin:16px 0 0;font-size:clamp(3.1rem,5.3vw,5rem);line-height:.96}
   .hero h1 strong{font-size:1.13em;color:#f0bd4e}
   .hero h1 span{font-size:.57em}
   .hero h1 .hero-daily{font-size:.61em}
   .hero h1 .hero-offer{font-size:.56em;line-height:1.08}
   .hero h1 .hero-offer em{display:block;color:#f0bd4e}
   .hero-copy>p{display:none}
   .benefit-row{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px;margin:39px 0 16px}
   .benefit-card{min-height:108px;padding:14px 13px 12px;border:1px solid #e0e5e4;border-radius:9px;box-shadow:0 8px 22px rgba(6,36,61,.13)}
   .benefit-card strong{font-size:.69rem}
   .benefit-card small{font-size:.65rem;line-height:1.25}
   .benefit-icon{width:42px;height:42px;margin-bottom:8px}
   .actions{display:grid;grid-template-columns:1fr 1fr;gap:14px;width:100%}
   .actions .btn{width:100%;min-width:0;min-height:56px}
   .hero-card{position:relative;z-index:1;display:grid;grid-template-columns:360px minmax(0,1fr);grid-template-rows:auto auto;column-gap:26px;align-items:center;width:100%;margin:0;padding:18px 24px;border:1px solid #e0e5e4;border-top:3px solid var(--owner-gold);border-radius:10px;box-shadow:0 10px 28px rgba(6,36,61,.1)}
   .hero-card .form-mark{display:none}
   .hero-card h2{grid-column:1;grid-row:1;font-size:1.55rem;margin:0 0 2px}
   .hero-card>p{grid-column:1;grid-row:2;font-size:.84rem;margin:0}
   .hero-card form{position:relative;display:grid;grid-column:2;grid-row:1/3;grid-template-columns:minmax(0,1fr) 165px;gap:0 14px;align-items:end}
   .hero-card form>label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
   .hero-card form>#quickBuilding{grid-column:1;grid-row:1}
   .hero-card form>.quick-error{grid-column:1/-1;grid-row:2}
   .hero-card form>#quickButton{grid-column:2;grid-row:1;min-height:46px;margin:0}
 }
 </style></body></html>