// Modes: // - display // - singleLine Entry // - MultiLine Entry function textControl(initialText,isMultiLineDisabled,isDisabled) { var m_text=initialText; var m_isMultiline=false; var m_mode=isDisabled?"display":"slEntry"; // Initial Mode var m_slEntryControl; var m_mlEntryControl; var m_displayControl; var m_displayDom=document.createElement("span"); // call the constructor only if the argument is given. if (arguments.length>=1) { return(construct()); } else { // if no argument is given then we can only loadXML this.fromXML=fromXML; return(this); } function construct() { m_slEntryControl=createSingleLineEntryControl(); m_displayControl=createDisplayControl(); m_mlEntryControl=createMultiLineEntryControl(); m_displayDom.appendChild(m_slEntryControl); m_displayDom.appendChild(m_mlEntryControl); m_displayDom.appendChild(m_displayControl); m_displayDom.focus=focus; m_displayDom.setDisplayMode=setDisplayMode; m_displayDom.setText=setText; m_displayDom.getText=getText; m_displayDom.toXML=toXML; m_displayDom.fromXML=fromXML; m_displayDom.extends(new Publisher()); changeMode(m_mode); return (m_displayDom); } function focus(){ changeMode(m_mode); } function getText() { return(m_text); } function setText(text) { // stop user form entering empty text. if (text.length>0) { m_text=text; changeMode(m_mode); return(true); } else { return(false); } } function setDisplayMode() { changeMode("display"); } function setSlEntryMode() { if ((m_isMultiline) && (!isMultiLineDisabled)) { changeMode("mlEntry"); } else { changeMode("slEntry"); } } function setMlEntryMode() { changeMode("mlEntry"); } function changeMode(newMode){ m_mode=newMode; // hide all m_slEntryControl.hide(); m_displayControl.hide(); m_mlEntryControl.hide(); // and show the selected one switch(newMode) { case "slEntry": m_slEntryControl.update(); m_slEntryControl.show(); m_slEntryControl.focus(); break; case "mlEntry": m_mlEntryControl.update(); m_mlEntryControl.show(); m_mlEntryControl.focus(); break; case "display": m_displayControl.update(); m_displayControl.show(); m_displayControl.focus(); break; } m_displayDom.notifySubscribers(m_displayDom,"changeMode"); } function createMultiLineEntryControl() { var txtara=document.createElement("textarea"); txtara.appendChild(document.createTextNode(m_text)); txtara.onclick=onClickTextArea; txtara.onkeyup=updateText; var submit=document.createElement("input"); submit.type="submit"; submit.value="OK"; submit.onclick=onClickOk; var container=document.createElement("span"); container.appendChild(txtara); container.appendChild(submit); container.update=update; container.focus=focus; container.show=show; container.hide=hide; return(container); function onClickTextArea(event) { txtara.focus(); event.stopPropagation(); } function onClickOk(event) { endEdit(); event.stopPropagation(); } function update(){ txtara.value=m_text; } function show(){ container.style.display="inline"; txtara.focus(); } function hide(){ container.style.display="none"; } function focus(){ } function updateText() { m_text = txtara.value; } function endEdit(){ if (txtara.value.indexOf("\n")!=-1) { m_isMultiline=true; } else { m_isMultiline=false; } if (setText(txtara.value)) { setDisplayMode(); } } } function createSingleLineEntryControl() { var container=document.createElement("span"); container.style.whiteSpace="nowrap"; var entry=document.createElement("input"); entry.value=m_text; entry.onkeyup=updateText; entry.onkeydown=fireOnEnter; entry.onchange=endEdit; entry.onclick=onClickSingleLineEntry; var btnML=document.createElement("input"); btnML.type="button"; btnML.value="ML"; btnML.onclick=onClickSwitchMultiline; container.appendChild(entry); if (!isMultiLineDisabled) { container.appendChild(btnML); } container.entry=entry; container.update=update; container.focus=focus; container.show=show; container.hide=hide; return(container); function onClickSingleLineEntry(event){ entry.focus(); event.stopPropagation(); } function onClickSwitchMultiline(event){ switchMultiLine(); event.stopPropagation(); } function hide() { container.style.display="none"; } function show() { container.style.display="inline"; } function update() { entry.value=m_text; } function focus() { entry.focus(); entry.select(); } function updateText() { m_text = entry.value; } function fireOnEnter(evt, frm ) { var keyCode = null; if( evt.which ) { keyCode = evt.which; } else if( evt.keyCode ) { keyCode = evt.keyCode; } if( 13 == keyCode ) { endEdit(); return(false); } return(true); } function endEdit(){ if (setText(entry.value)) { setDisplayMode(); } } function switchMultiLine(){ endEdit(); changeMode("mlEntry"); } } function createDisplayControl() { var container=document.createElement("span"); container.setAttribute("class","boxText"); container.onclick=onClickDisplayControl; container.appendChild(document.createTextNode(m_text)); container.update=update; container.show=show; container.hide=hide; container.focus=focus; return(container); function onClickDisplayControl(event){ if (!isDisabled) { setSlEntryMode(); } event.stopPropagation(); } function hide() { container.style.display="none"; } function show() { container.style.display="block"; } function update(){ container.firstChild.data=m_text; } function focus(){ return(true); } } function toXML(){ var xmlEle=document.createElement('TEXTCONTROL'); xmlEle.setAttribute("ismultiline",(m_isMultiline)?"true":"false"); xmlEle.setAttribute("mode",m_mode); xmlEle.appendChild(document.createTextNode(m_text)); return(xmlEle); } function fromXML(inXML){ m_isMultiline=("true"==inXML.getAttribute("ismultiline")); m_text=inXML.firstChild.nodeValue; m_mode=inXML.getAttribute("mode"); return(construct()); } }