דלג לתוכן
2000) return null;
var ids={}, i;
for(i=0;i(cur.updatedAt||0)){ store.drafts[store.drafts.indexOf(cur)]=d; have[d.id]=d; updated++; }
});
var fhave={}; folders().forEach(function(f){ fhave[f.id]=f; });
inc.folders.forEach(function(f){ if(f&&drSafeId(f.id)&&!fhave[f.id]){ store.folders.push(f); fhave[f.id]=f; } });
store.drafts.forEach(function(d){ if(d.folderId&&!fhave[d.folderId]) d.folderId=null; });
inc.patients.forEach(function(p){
if(!p||typeof p.name!=="string") return;
var cur=drFindPatient(p.name);
if(!cur){ if(!drSafeId(p.id)) p.id=uid(); drPatients().push(p); }
else if((parseInt(p.next,10)||0)>(parseInt(cur.next,10)||0)){ cur.next=String(p.next); }
});
var a=activeDraft(); store.activeId=a.id; state=a.data;
persistStore(); renderAll(); renderDrafts(); drRenderRegs();
toast("הגיבוי נוסף: "+(added===1?"טיוטה חדשה אחת":added+" טיוטות חדשות")+(updated?(", "+(updated===1?"טיוטה אחת עודכנה":updated+" טיוטות עודכנו")):"")+". שום דבר לא נמחק.");
}
function drRestoreChoice(inc){
var ov=h("div",{class:"drModalOv",onclick:function(e){ if(e.target===ov) close(); }});
var box=h("div",{class:"drModal",role:"dialog","aria-modal":"true","aria-labelledby":"rsTitle"});
box.appendChild(h("div",{class:"drModalHead"},h("h3",{id:"rsTitle"},"טעינת גיבוי")));
box.appendChild(h("p",{class:"rsTxt"},"בגיבוי "+drPlural(inc.drafts.length,"טיוטה אחת","שתי טיוטות","טיוטות")+". במכשיר הזה יש כבר "+drPlural(store.drafts.length,"טיוטה אחת","שתי טיוטות","טיוטות")+"."));
var add=h("button",{type:"button",class:"rsBtn pri"},"הוספה לטיוטות הקיימות (מומלץ)");
add.appendChild(h("small",null,"שום דבר לא נמחק. טיוטה שקיימת בשני המקומות נשארת בגרסה העדכנית יותר."));
var rep=h("button",{type:"button",class:"rsBtn"},"החלפת הכול בגיבוי");
rep.appendChild(h("small",null,"הטיוטות שבמכשיר יימחקו ויוחלפו בגיבוי."));
var no=h("button",{type:"button",class:"rsBtn lnk"},"ביטול");
box.appendChild(add); box.appendChild(rep); box.appendChild(no);
function close(){ ov.classList.remove("on"); setTimeout(function(){ if(ov.parentNode) ov.remove(); },160); }
add.addEventListener("click",function(){ close(); drMerge(inc); });
rep.addEventListener("click",function(){
/* שלב אישור בתוך אותו חלון: החלפה מוחקת את הטיוטות שבמכשיר, לכן לא מבצעים בלחיצה אחת */
box.innerHTML="";
box.appendChild(h("div",{class:"drModalHead"},h("h3",{id:"rsTitle"},"להחליף את כל הטיוטות?")));
box.appendChild(h("p",{class:"rsTxt"},""+drPlural(store.drafts.length,"הטיוטה האחת שבמכשיר הזה תימחק","שתי הטיוטות שבמכשיר הזה יימחקו","טיוטות שבמכשיר הזה יימחקו")+" ויוחלפו ב"+drPlural(inc.drafts.length,"טיוטה אחת","שתי טיוטות","טיוטות")+" מהגיבוי. אי אפשר לבטל את זה אחר כך."));
var yes=h("button",{type:"button",class:"rsBtn",id:"rsConfirmRep"},"כן, להחליף הכול");
var back=h("button",{type:"button",class:"rsBtn pri",id:"rsConfirmNo"},"ביטול - לא לשנות כלום");
box.appendChild(back); box.appendChild(yes);
yes.addEventListener("click",function(){ close(); drApplyRestored(inc,inc.drafts.length); });
back.addEventListener("click",close);
setTimeout(function(){ back.focus(); },30);
});
no.addEventListener("click",close);
ov.addEventListener("keydown",function(e){ if(e.key==="Escape"){ e.stopPropagation(); close(); } });
ov.appendChild(box); document.body.appendChild(ov);
requestAnimationFrame(function(){ ov.classList.add("on"); });
setTimeout(function(){ add.focus(); },40);
}
function drRestoreFile(file){
if(!file) return;
if(file.size>25*1024*1024){ toast("הקובץ גדול מדי כדי להיות גיבוי של הכלי.","err"); return; }
var rd=new FileReader();
rd.onload=function(){
var obj=drParseBackupText(rd.result);
var ns=drCleanBackup(obj);
if(!ns){ toast("הקובץ הזה אינו גיבוי תקין של הכלי. לא שונה כלום.","err"); return; }
closeDrawer(); closeSettings();
if(drOnlyBlank()) drApplyRestored(ns,ns.drafts.length); else drRestoreChoice(ns);
};
rd.onerror=function(){ toast("לא הצלחנו לקרוא את הקובץ.","err"); };
rd.readAsText(file);
}
/* ---- מצב כתיבה נקי ---- */
function drCleanOn(){ return document.body.classList.contains("cleanMode"); }
function drCleanSync(){ var s=document.getElementById("cleanSw"); if(s){ s.checked=drCleanOn(); s.setAttribute("aria-checked",s.checked?"true":"false"); } }
function drCleanEnter(){
if(drCleanOn()) return;
document.body.classList.add("cleanMode"); drCleanSync();
var bar=h("div",{class:"cleanBar",id:"cleanBar",role:"region","aria-label":"כתיבה נקייה"});
bar.appendChild(icon("pencil",16)); bar.appendChild(h("span",null,"כתיבה נקייה - רק הדיאלוג"));
var x=h("button",{type:"button"},"יציאה"); x.addEventListener("click",drCleanExit); bar.appendChild(x);
var root=document.getElementById("root"); root.insertBefore(bar,root.firstChild);
window.scrollTo(0,0);
setTimeout(function(){ x.focus(); },30);
}
function drCleanExit(){
if(!drCleanOn()) return;
document.body.classList.remove("cleanMode"); drCleanSync();
var b=document.getElementById("cleanBar"); if(b) b.remove();
var d=document.getElementById("cleanSw"); if(!d||!d.getClientRects().length) d=document.getElementById("draftsBtn"); if(d) d.focus();
}
document.addEventListener("keydown",function(e){
if(e.key==="Escape"&&drCleanOn()&&!drawerEl&&!document.querySelector(".drModalOv,[role=dialog][aria-modal=true]")) drCleanExit();
});
/* ---- בלי חיבור ---- */
var offEl=null, offWas=false;
function drOffSync(){
var off=navigator.onLine===false;
if(off&&!offEl){
offEl=h("div",{id:"offNote",class:"offNote",role:"status"});
offEl.appendChild(icon("warn",17));
offEl.appendChild(h("span",null,"אין חיבור לאינטרנט. אפשר להמשיך לכתוב - הטיוטה נשמרת במכשיר. ניתוח ה-AI יחזור כשהחיבור יחזור."));
var root=document.getElementById("root"); root.insertBefore(offEl,root.firstChild);
requestAnimationFrame(function(){ if(offEl) offEl.classList.add("on"); });
offWas=true;
} else if(!off&&offEl){
var o=offEl; offEl=null; o.classList.remove("on"); setTimeout(function(){ if(o.parentNode) o.remove(); },200);
if(offWas){ offWas=false; toast("החיבור חזר."); }
}
}
window.addEventListener("offline",drOffSync); window.addEventListener("online",drOffSync);
/* ---- הגדרות במגירה ---- */
window.__drawerSettings=window.__drawerSettings||[];
/* שורת התקנה קבועה בהגדרות - דרך נקודת ההרחבה בלבד */
window.__drawerSettings.push(function(extra){
if(isStandalone()) return;
if(!deferredInstall&&!isTouchDevice()) return;
var r=h("button",{type:"button",class:"drawerSetRow",id:"setInstallRow"});
var tx=h("span",{class:"drawerSetTxt"}); tx.appendChild(icon("download",15)); tx.appendChild(document.createTextNode(" הוספה למסך הבית"));
r.appendChild(tx); r.appendChild(icon("chevron",15));
r.addEventListener("click",function(){ closeSettings(); setTimeout(function(){ if(!nativeInstall()) openInstallSheet(); },260); }); // P-03: השורה יושבת בהגדרות, לא במגירת הטיוטות
extra.appendChild(r);
});
function drBuildMySub(box){
var blk=h("div",{class:"subBlock",id:"mySubBlock"});
var l=h("div",{class:"setLbl"}); l.appendChild(icon("shield",15)); l.appendChild(document.createTextNode(" המנוי שלי")); blk.appendChild(l);
var body=h("div",{class:"subRows"}); blk.appendChild(body);
if(accessCode()){ var subLo=h("button",{type:"button",class:"gxLnk gxBlock",id:"subLogout"},"התנתקות"); subLo.addEventListener("click",function(){ closeSettings(); setTimeout(gglLogout,260); }); blk.appendChild(subLo); } // 18.10: התנתקות גם למי שנכנס בקוד
function row(k,v){ var r=h("div",{class:"subRow"}); r.appendChild(h("span",{class:"subK"},k)); r.appendChild(h("span",{class:"subV"},v)); body.appendChild(r); }
function unknown(){ body.textContent=""; body.appendChild(h("p",{class:"subNote"},"פרטי המנוי יופיעו כשיש חיבור לאינטרנט.")); }
function fill(d){
body.textContent="";
subRememberPlan(code,d);
row("סוג",SUB_PLAN_NAMES[d.plan]||"מנוי");
var dt=d.expires_at?new Date(d.expires_at):null;
row("בתוקף עד",dt&&!isNaN(dt.getTime())?dt.toLocaleDateString("he-IL",{day:"numeric",month:"long",year:"numeric"}):"ללא הגבלת זמן");
row("דוחות",d.remaining==null?"ללא הגבלה":quotaLeftText(d.remaining,d.max_uses,"דוח אחד","דוחות"));
if(d.aiRemaining!=null) row("ניתוחי AI",quotaLeftText(d.aiRemaining,d.aiCap,"ניתוח AI אחד","ניתוחי AI")); // aiCap: כשהשרת יחזיר אותו (היום לא) - "מתוך 1" יופיע לבד
if(d.plan==="trial"){ var buy=h("button",{type:"button",class:"gxLnk gxBlock",id:"subBuy"},"רכישת מנוי"); buy.addEventListener("click",function(){ closeSettings(); setTimeout(function(){ showTrialEndModal({buy:true}); },260); }); body.appendChild(buy); } // 18.10 (אורי): קנייה לפני שהניסיון נגמר
var am=d.aiMonth;
if(am&&am.cap>0) row("ניתוחי AI",aiMonthRowText(am));
else if(am&&am.cap===0){
row("ניתוחי AI","לא כלולים במסלול");
var up=h("button",{type:"button",class:"gxLnk gxBlock"},"שדרוג עם ניתוחי AI");
up.addEventListener("click",function(){ closeSettings(); setTimeout(function(){ showTrialEndModal({upgrade:true}); },260); }); // P-03
body.appendChild(up);
}
}
var code=accessCode();
if(CONFIG.previewBypass||!CONFIG.consumeUrl||!code){ unknown(); }
else{
body.appendChild(h("p",{class:"subNote"},"טוען..."));
fetchT(CONFIG.consumeUrl,{method:"POST",headers:{"content-type":"application/json"},body:consumeBody({code:code,check:true})})
.then(function(r){ return r.json(); })
.then(function(d){
if(d&&d.ok) fill(d);
else if(d&&d.reason==="expired"){ body.textContent=""; row("מצב","פג תוקף"); }
else if(d&&d.reason==="limit_reached"){ body.textContent=""; row("דוחות","לא נשארו דוחות לייצוא"); }
else if(d&&d.reason==="rate_limited"){ body.textContent=""; body.appendChild(h("p",{class:"subNote"},d.error||"יותר מדי ניסיונות כרגע. נסו שוב מאוחר יותר.")); }
else if(d&&(d.reason==="email_required"||d.reason==="email_mismatch"||d.reason==="invalid"||d.reason==="retired")){ unknown(); closeSettings(); setTimeout(function(){ accessRejected(d.reason,d); },260); }
else unknown(); })
.catch(unknown);
}
var lk=h("div",{class:"subLinks"});
lk.appendChild(h("a",{href:"/terms.html",target:"_blank",rel:"noopener"},"תנאי שימוש"));
lk.appendChild(h("a",{href:"/accessibility.html",target:"_blank",rel:"noopener"},"הצהרת נגישות"));
blk.appendChild(lk);
box.appendChild(blk);
}
function drBuildSettings(box){
try{ drBuildMySub(box); }catch(e){}
/* גודל טקסט */
var ts=h("div",{class:"setBlock"}); ts.appendChild(h("div",{class:"setLbl",id:"tsLbl"},"גודל טקסט"));
var seg=h("div",{class:"setSeg",role:"group","aria-labelledby":"tsLbl"});
var cur=parseInt(drSettings().textSize,10)||0;
[["רגיל",0],["גדול",1],["גדול מאוד",2]].forEach(function(o,i){
var b=h("button",{type:"button","aria-pressed":cur===o[1]?"true":"false",class:cur===o[1]?"on":"","data-ts":String(o[1])},o[0]);
b.style.fontSize=(14+i*2)+"px";
b.addEventListener("click",function(){
drSettings().textSize=o[1]; persistStore(); drApplyTextSize();
[].forEach.call(seg.querySelectorAll("button"),function(x){ var on=x===b; x.className=on?"on":""; x.setAttribute("aria-pressed",on?"true":"false"); });
});
seg.appendChild(b);
});
ts.appendChild(seg); box.appendChild(ts);
/* עזרה בניסוח */
try{ box.appendChild(helpSettingRow()); }catch(e){}
/* גיבוי והעברה */
var bk=h("div",{class:"bkBlock"});
var bl=h("div",{class:"setLbl"}); bl.appendChild(icon("shield",15)); bl.appendChild(document.createTextNode(" גיבוי והעברה למכשיר אחר")); bk.appendChild(bl);
var note=h("p",{class:"bkNote"},drBackupText());
var b1=h("button",{type:"button",class:"bkPri",id:"bkSend"}); b1.appendChild(icon("download",16)); b1.appendChild(document.createTextNode("שליחת גיבוי לעצמי")); b1.addEventListener("click",function(){ drBackupSave(note); });
bk.appendChild(b1);
bk.appendChild(h("p",{class:"bkExp"},"הטיוטות עוברות לבד בין המכשירים שנכנסים עם הקוד שלכם. הגיבוי הוא קובץ אחד לשמירה אצלכם, ליתר ביטחון."));
bk.appendChild(note);
if(drBkRemindDue()){
var rm=h("div",{class:"bkRemind",id:"bkRemind",role:"note"});
rm.appendChild(h("span",null,"יש לכם כמה טיוטות ואין גיבוי מהשבועיים האחרונים. כדאי לשלוח אחד לעצמכם."));
var rx=h("button",{type:"button","aria-label":"סגירת התזכורת"},"×");
rx.addEventListener("click",function(){ try{ localStorage.setItem(DR_BKREM_KEY,String(Date.now())); }catch(e){} rm.remove(); });
rm.appendChild(rx); bk.appendChild(rm);
}
var b2=h("button",{type:"button",class:"bkLnk"},"טעינת גיבוי");
var fi=h("input",{type:"file",accept:".html,.json,text/html,application/json",class:"srOnly",id:"bkFile",tabindex:"-1","aria-hidden":"true","aria-label":"קובץ גיבוי לשחזור"}); // A6-24
fi.addEventListener("change",function(){ var f=fi.files&&fi.files[0]; fi.value=""; drRestoreFile(f); });
b2.addEventListener("click",function(){ fi.click(); });
bk.appendChild(b2); bk.appendChild(fi);
box.appendChild(bk);
/* נקודת הרחבה לאזורים אחרים (למשל שורת ההתקנה) */
var extra=h("div",{id:"drawerSetExtra"});
window.__drawerSettings.forEach(function(fn){ try{ fn(extra); }catch(e){} });
box.appendChild(extra);
/* קוד הגישה: הכניסה לטופס בלבד, הטופס עצמו לא השתנה */
var myCode=h("button",{type:"button",class:"drawerSetRow",id:"setMyCode"});
var mcL=h("span",{class:"drawerSetTxt"}); mcL.appendChild(icon("key",15)); mcL.appendChild(document.createTextNode(" שינוי קוד הגישה שלי"));
myCode.appendChild(mcL); myCode.appendChild(icon("chevron",15));
myCode.addEventListener("click",function(){ closeSettings(); setTimeout(openSetCodeForm,260); });
box.appendChild(myCode);
/* החשבון: כל מי שנכנס (Google או קוד) רואה עם איזה מייל, ויכול להתנתק (אייפון אורי 18.10: בקוד לא הייתה התנתקות) */
try{ if(gglIsUser()||accessCode()){
var who="", gb=h("div",{class:"setBlock gglSet",id:"setGoogle"});
try{ who=localStorage.getItem("ani_ata_email")||""; }catch(e){}
gb.appendChild(h("div",{class:"setLbl"},"החשבון"));
if(who) gb.appendChild(h("p",null,"החשבון המחובר: ",h("b",null,who)));
var lo=h("button",{type:"button",class:"drawerSetRow",id:"setLogout"});
lo.appendChild(h("span",{class:"drawerSetTxt"},"התנתקות")); lo.appendChild(icon("chevron",15));
lo.addEventListener("click",function(){ closeSettings(); setTimeout(gglLogout,260); });
gb.appendChild(lo); box.appendChild(gb);
} }catch(e){}
}
/* ---- אתחול ---- */
drApplyTextSize();
drMountTag();
drOffSync();
try{ drVerSnap(activeDraft(),"open"); }catch(e){}
// ==== AREA:end ====
renderAll(); maybeGate();
// הקישור "בחירת קוד אישי" במייל שהלקוח מקבל מפנה לכתובת עם #mycode.
try{ if(location.hash==="#mycode" && accessCode()) setTimeout(openSetCodeForm,400); }catch(e){}