diff options
author | Marc Englund <marc.englund@itmill.com> | 2006-11-28 14:42:16 +0000 |
---|---|---|
committer | Marc Englund <marc.englund@itmill.com> | 2006-11-28 14:42:16 +0000 |
commit | faa3e21134907796b606f31dbaf3b0ca3d54c227 (patch) | |
tree | 507d796940b323ac77494c44f0039b0618d96f29 /WebContent | |
parent | e0e97d5a07c313ba11915daa3790135c1632e57a (diff) | |
download | vaadin-framework-faa3e21134907796b606f31dbaf3b0ca3d54c227.tar.gz vaadin-framework-faa3e21134907796b606f31dbaf3b0ca3d54c227.zip |
Total rearrange of functions
svn changeset:120/svn branch:toolkit
Diffstat (limited to 'WebContent')
-rw-r--r-- | WebContent/themes/default/theme.js | 7697 |
1 files changed, 3847 insertions, 3850 deletions
diff --git a/WebContent/themes/default/theme.js b/WebContent/themes/default/theme.js index 7b96bf93b3..c84d5ede1e 100644 --- a/WebContent/themes/default/theme.js +++ b/WebContent/themes/default/theme.js @@ -1,3851 +1,3848 @@ - -// IE DOM Node support -if(document.all) { - Node = new Object(); - Node.ELEMENT_NODE = 1; - Node.ATTRIBUTE_NODE = 2; - Node.TEXT_NODE = 3; - Node.CDATA_SECTION_NODE = 4; - Node.ENTITY_REFERENCE_NODE = 5; - Node.ENTITY_NODE = 6; - Node.PROCESSING_INSTRUCTION_NODE = 7; - Node.COMMENT_NODE = 8; - Node.DOCUMENT_NODE = 9; - Node.DOCUMENT_TYPE_NODE = 10; - Node.DOCUMENT_FRAGMENT_NODE = 11; - Node.NOTATION_NODE = 12; -} - - -/** Default theme constructor. - * - * @param themeRoot The base URL for theme resources. - * @constructor - * - */ -function DefaultTheme(themeRoot) { - this.themeName = "DefaultTheme"; - - // Store the the root URL - this.root = themeRoot; -} - - -/** Register all renderers to a ajax client. - * - * @param client The ajax client instance. - */ -DefaultTheme.prototype.registerTo = function(client) { - - // This hides all integer, string, etc. variables - client.registerRenderer(this,"integer",null,function() {}); - client.registerRenderer(this,"string",null,function() {}); - // and special tags - client.registerRenderer(this,"description",null,function() {}); - client.registerRenderer(this,"error",null,function() {}); - client.registerRenderer(this,"actions",null,function() {}); - - - // Register renderer functions - client.registerRenderer(this,"component",null,this.renderComponent); - client.registerRenderer(this,"label",null,this.renderLabel); - client.registerRenderer(this,"data",null,this.renderData); - client.registerRenderer(this,"pre",null,this.renderData); - client.registerRenderer(this,"link",null,this.renderLink); - client.registerRenderer(this,"button",null,this.renderButton); - client.registerRenderer(this,"textfield",null,this.renderTextField); - client.registerRenderer(this,"datefield",null,this.renderDateField); - client.registerRenderer(this,"datefield","calendar",this.renderDateFieldCalendar); - client.registerRenderer(this,"select",null,this.renderSelect); - client.registerRenderer(this,"select","optiongroup",this.renderSelectOptionGroup); - client.registerRenderer(this,"upload",null,this.renderUpload); - client.registerRenderer(this,"embedded",null,this.renderEmbedded); - - client.registerRenderer(this,"window",null,this.renderWindow); - client.registerRenderer(this,"framewindow",null,this.renderFramewindow); - client.registerRenderer(this,"open",null,this.renderOpen); - - client.registerRenderer(this,"panel",null,this.renderPanel); - client.registerRenderer(this,"orderedlayout",null,this.renderOrderedLayout); - client.registerRenderer(this,"customlayout",null,this.renderCustomLayout); - client.registerRenderer(this,"gridlayout",null,this.renderGridLayout); - client.registerRenderer(this,"tabsheet",null,this.renderTabSheet); - - client.registerRenderer(this,"table",null,this.renderScrollTable); - client.registerRenderer(this,"tree",null,this.renderTree); - client.registerRenderer(this,"tree","coolmenu",this.renderTreeMenu); - //client.registerRenderer(this,"tree","menu",this.renderTreeMenu); -}; - -DefaultTheme.prototype.renderComponent = function(renderer,uidl,target,layoutInfo) { - - // Create containing element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Render default header - renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - // Render children to div - renderer.theme.renderChildNodes(renderer, uidl, div); -} - -DefaultTheme.prototype.renderWindow = function(renderer,uidl,target,layoutInfo) { - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - var theme = renderer.theme; - - theme.addHidePopupListener(theme,renderer.client,div,"click",true); - // Render children to div - theme.renderChildNodes(renderer, uidl, div); - - // Apply width and height - theme.applyWidthAndHeight(uidl,div); - - // Focusing - var focused = theme.getVariableElement(uidl,"string","focused"); - var focusid = theme.getVariableElementValue(focused); - if (focusid) { - var found = false; - var els = div.getElementsByTagName("input"); - var len = (els?els.length:0); - for (var i=0;i<len;i++) { - var el = els[i]; - if (focusid == el["focusid"]) { - el.focus(); - found = true; - break; - } - } - if (!found) { - els = div.getElementsByTagName("select"); - var len = (els?els.length:0); - for (var i=0;i<len;i++) { - var el = els[i]; - if (focusid == el["focusid"]) { - el.focus(); - found = true; - break; - } - } - } - if (!found) { - els = div.getElementsByTagName("textarea"); - var len = (els?els.length:0); - for (var i=0;i<len;i++) { - var el = els[i]; - if (focusid == el["focusid"]) { - el.focus(); - found = true; - break; - } - } - } - } -} - -DefaultTheme.prototype.renderOpen = function(renderer,uidl,target,layoutInfo) { - // Shortcuts - var theme = renderer.theme; - - var src = uidl.getAttribute("src"); - var name = uidl.getAttribute("name"); - - if (name) { - window.open(src,name); - } else { - var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo); - div.innerHTML = "<IFRAME name=\""+name+"\" id=\""+name+"\" width=100% height=100% style=\"border:none;margin:0px;padding:0px;background:none;\" src=\""+src+"\"></IFRAME>"; - } -} - -DefaultTheme.prototype.renderFramewindow = function(renderer,uidl,target,layoutInfo) { - - var theme = renderer.theme; - var client = renderer.client; - - // TODO: Should we unregister all previous child windows? - - // We just reinitialize the window - var win = target.ownerDocument.ownerWindow; - client.initializeNewWindow(win,uidl,theme); -} - -DefaultTheme.prototype.renderCustomLayout = function(renderer,uidl,target,layoutInfo) { - // Shortcuts - var theme = renderer.theme; - - // Get style - var style = uidl.getAttribute("style"); - if (style == null) return null; - - // Load the layout - var url = theme.root + style; - var text = renderer.client.loadDocument(url,false); - if (text == null) { - client.debug("CustomLayout " + style + " NOT FOUND @ "+ url); - return null; - } - - // Create containing element - var main = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - var locations = new Object(); - var unused = new Object(); - var cN = uidl.childNodes; - var len = cN.length; - for (var j=0; j < len; j++) { - var c = cN.item(j); - if (c.nodeType == Node.ELEMENT_NODE - && c.nodeName == "location" - && c.getAttribute("name")) { - - locations[c.getAttribute("name")] = c; - unused[c.getAttribute("name")] = c; - } - } - - - var n = theme.createElementTo(main, "div"); - n.setAttribute("id",uidl.getAttribute("id")); - n.innerHTML=text; - var divs = n.getElementsByTagName("div"); - for (var i=0; i<divs.length; i++) { - var div = divs.item(i); - var name = div.getAttribute("location"); - if (name != null) { - var c = locations[name]; - if (c && c.getAttribute("name") == name) { - delete unused[name]; - for (var k=0; k<c.childNodes.length; k++) { - var cc = c.childNodes.item(k); - if (cc.nodeType == Node.ELEMENT_NODE) { - var parent = div.parentNode; - // TODO - if (parent != null) { - theme.removeAllChildNodes(div); - var newNode = renderer.client.renderUIDL(cc,div); - } - } - } - } else { - client.warn("Location " + name + " NOT USED in CustomLayout " + style); - } - } - } - if (unused.length>0) { - for (var k in usedLocations) { - client.error("Location " + k + " NOT FOUND in CustomLayout " + style); - } - } - -} - -DefaultTheme.prototype.renderOrderedLayout = function(renderer,uidl,target,layoutInfo) { - // Shortcuts - var theme = renderer.theme; - - // Create containing element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Render all children to table - var vertical = uidl.getAttribute("orientation") != "horizontal"; - var table = null; - var tr = null; - var td = null; - var style = uidl.getAttribute("style"); - var form = style == "form"; - - for (var i=0; i<uidl.childNodes.length; i++) { - var childUIDL = uidl.childNodes.item(i); - td = null; - if (childUIDL.nodeType == Node.ELEMENT_NODE) { - - // Ensure TABLE and TR - if (tr == null || vertical) { - if (table == null) { - table = renderer.theme.createElementTo(div,"table","orderedlayout"); - //table.width="100%"; - renderer.theme.addCSSClass(table,"layout"); - table = renderer.theme.createElementTo(table,"tbody","layout"); - } - tr = renderer.theme.createElementTo(table,"tr","layout"); - } - - // Create extra TD for form style captions - var layoutInfo = null; - if (form) { - layoutInfo = new Object() - td = renderer.theme.createElementTo(tr,"td","layout"); - layoutInfo.captionNode = td; - } - - // Force new TD for each child rendered - td = renderer.theme.createElementTo(tr,"td","layout"); - - // Render the component to TD - renderer.client.renderUIDL(childUIDL,td, null, layoutInfo); - - } - } -} - - -DefaultTheme.prototype.renderGridLayout = function(renderer,uidl,target,layoutInfo) { - // NOTE TODO indenting might be off - // Shortcuts - var theme = renderer.theme; - - var h = uidl.getAttribute("h"); - var w = uidl.getAttribute("w"); - // Create component element - var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - //var width = (div.offsetWidth||div.clientWidth)-20; - //var px = Math.floor(width/parseInt(w)); - - var table = theme.createElementTo(div,"table", "layout"); - //table.width = "100%"; - table = renderer.theme.createElementTo(table,"tbody","layout"); - var tr = null; - var td = null; - for (var y=0; y<uidl.childNodes.length; y++) { - var rowUidl = uidl.childNodes[y]; - - if (rowUidl.nodeType == Node.ELEMENT_NODE || rowUidl.nodeName == "gr") { - - tr = theme.createElementTo(table,"tr","layout"); - tr.style.verticalAlign = "top"; - td = null; - - for (var x=0; x<rowUidl.childNodes.length; x++) { - var cellUidl = rowUidl.childNodes[x]; - - // Add colspan and rowspan - if (cellUidl.nodeType == Node.ELEMENT_NODE && cellUidl.nodeName == "gc") { - // Create new TD for each child rendered - td = renderer.theme.createElementTo(tr,"td","layout"); - - var w = cellUidl.getAttribute('w'); - var h = cellUidl.getAttribute('h'); - //var cont = renderer.theme.createElementTo(td,"div"); - //cont.style.width = ((w?w:1)*px)+"px"; - if (w != null) { - td.setAttribute('colspan',w); - } - if (h != null) { - td.setAttribute('rowspan',h); - } - // Render the component(s) to TD - if (cellUidl.childNodes != null && cellUidl.childNodes.length >0) { - var len = cellUidl.childNodes.length; - for (var c=0;c<len;c++) { - var el = cellUidl.childNodes[c]; - if (el.nodeType == Node.ELEMENT_NODE) { - renderer.client.renderUIDL(el,td); - } - } - //cont.style.width = ""; - } - } - } - } - } -} - -DefaultTheme.prototype.renderPanel = function(renderer,uidl,target,layoutInfo) { - // Supports styles "light" and "none" - - // Shortcuts - var theme = renderer.theme; - - var style = uidl.getAttribute("style"); - - // Create component element - var outer = theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - if ("none"!=style) { - theme.addCSSClass(div,"outset"); - } - if ("light"==style) { - theme.addCSSClass(div,"light"); - } - - // Create extra DIV for visual layout - var div = theme.createElementTo(outer,"div"); - if ("none"!=style) { - theme.setCSSClass(div,"border"); - } - - // Create default header - var caption = theme.renderDefaultComponentHeader(renderer,uidl,div); - theme.addCSSClass(caption,"pad"); - if ("light"==style) { - theme.addCSSClass(caption,"lightcap"); - } - - // Create content DIV - var content = theme.createElementTo(div,"div"); - theme.setCSSClass(content,"content"); - - // Render children to div - theme.renderChildNodes(renderer, uidl, content); - - // Apply width and height - theme.applyWidthAndHeight(uidl,outer); - -} - -DefaultTheme.prototype.renderTabSheet = function(renderer,uidl,target,layoutInfo) { - - var theme = renderer.theme; - - // Create container element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Create default header - var caption = renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - theme.createElementTo(div,"br"); - - // Render tabs - var tabs = theme.createElementTo(div,"div","tabs"); - var varId = theme.getVariableElement(uidl,"string","selected").getAttribute("id"); - - var tabNodes = theme.getChildElements(uidl,"tabs"); - if (tabNodes != null && tabNodes.length >0) tabNodes = theme.getChildElements(tabNodes[0],"tab"); - var selectedTabNode = null; - if (tabNodes != null && tabNodes.length >0) { - for (var i=0; i< tabNodes.length;i++) { - var tabNode = tabNodes[i]; - var tab = theme.createElementTo(tabs,"div"); - var key = tabNode.getAttribute("key"); - var iconUrl = tabNode.getAttribute("icon"); - if (iconUrl && iconUrl.indexOf("theme://") == 0) { - iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root) - + iconUrl.substring(8); - } - if (tabNode.getAttribute("selected") == "true") { - theme.addCSSClass(tab,"tab-on inline"); - selectedTabNode = tabNode; - } else if (tabNode.getAttribute("disabled") == "true") { - theme.setCSSClass(tab,"tab disabled inline"); - } else { - theme.setCSSClass(tab,"tab clickable inline"); - theme.addAddClassListener(theme,client,tab,"mouseover","over",tab); - theme.addRemoveClassListener(theme,client,tab,"mouseout","over",tab); - theme.addSetVarListener(theme,client,tab,"click",varId,key,true); - } - // Extra div in tab - tab = theme.createElementTo(tab,"div","caption border pad inline"); - - // Icon - if (iconUrl) { - tab.innerHTML = "<IMG src=\""+iconUrl+"\" class=\"icon\" />"+tabNode.getAttribute("caption"); - //var icon = theme.createElementTo(tab,"img","icon"); - //icon.src = iconUrl; - } else { - tab.innerHTML = tabNode.getAttribute("caption"); - } - - // Caption - //theme.createTextNodeTo(tab,tabNode.getAttribute("caption")); - - } - } - - // Render content - var content = theme.createElementTo(div,"div","outset"); - content = theme.createElementTo(content,"div","content border"); - if (selectedTabNode != null) { - theme.renderChildNodes(renderer,selectedTabNode, content); - } -} - -DefaultTheme.prototype.renderTree = function(renderer,uidl,target,layoutInfo) { - - var theme = renderer.theme; - - // Create container element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Get tree attributes - var style = uidl.getAttribute("style"); - var immediate = ("true" == uidl.getAttribute("immediate")); - var disabled = ("true" == uidl.getAttribute("disabled")); - var readonly = ("true" == uidl.getAttribute("readonly")); - var selectMode = uidl.getAttribute("selectmode"); - var selectable = selectMode == "multi" || selectMode == "single"; - var selected; - if (selectable) { - selected = new Object(); - } - var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected")); - var expandVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","expand")); - var collapseVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","collapse")); - - var actions = null; - var actionVar = null; - var alNode = theme.getFirstElement(uidl,"actions") - if (alNode) { - actionVar = theme.createVariableElementTo(div,theme.getVariableElement(alNode,"string","action")); - actions = new Object(); - var ak = alNode.getElementsByTagName("action"); - for (var i=0;i<ak.length;i++) { - actions[ak[i].getAttribute("key")] = ak[i].getAttribute("caption"); - } - } - delete alNode; - - // Create default header - var caption = renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - // Content DIV - var content = theme.createElementTo(div,"div","content"); - - // Iterate all nodes - for (var i = 0; i< uidl.childNodes.length;i++) { - var node = uidl.childNodes[i]; - if (node.nodeName == "node" || node.nodeName == "leaf") { - theme.renderTreeNode(renderer,node,content,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly); - } - } -} - -DefaultTheme.prototype.renderTreeNode = function(renderer,node,target,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly) { - - var theme = renderer.theme; - var client = renderer.client; - - var n = theme.createElementTo(target,"div","node clickable"); - - // Expand/collapse/spacer button - var img = theme.createElementTo(n,"img","icon"); - var key = node.getAttribute("key"); - var icon = node.getAttribute("icon"); - if (icon) { - var iconurl = theme.root+icon.split("theme:")[1]; - var iimg = theme.createElementTo(n,"img","icon"); - iimg.src = iconurl; - } - - // Caption - var cap = theme.createElementTo(n,"div","caption inline"); - theme.createTextNodeTo(n,node.getAttribute("caption")); - - // Hover effects - if (!disabled&&!readonly) { - theme.addAddClassListener(theme,client,n,"mouseover","over",n); - theme.addRemoveClassListener(theme,client,n,"mouseout","over",n); - } - - // Server-side selection - if (selectable && node.getAttribute("selected") == "true") { - theme.addCSSClass(n,"selected"); - selected[key] = n; - } - - // Indicate selection - if (theme.listContainsInt(selectionVariable.value,key)) { - theme.addCSSClass(n, "selected"); - } - - // Selection listeners - if (selectable && !disabled) { - if (!readonly) { - if (selectMode == "single") { - theme.addAddClassListener(theme,client,n,"click","selected",n,selected); - theme.addSetVarListener(theme,client,n,"click",selectionVariable,key,immediate); - - } else if (selectMode == "multi") { - theme.addToggleClassListener(theme,client,n,"click","selected"); - theme.addToggleVarListener(theme,client,n,"click",selectionVariable,key,immediate); - - } - } - } - - // Actions - if (!disabled && !readonly) { - for (var i = 0; i< node.childNodes.length;i++) { - var childNode = node.childNodes[i]; - if (childNode.nodeName == "al" ) { - theme.renderActionPopup(renderer,childNode,n,actions,actionVar,key); // TODO check - } - } - } - - // Render all sub-nodes - if (node.nodeName == "node") { - var subnodes = theme.createElementTo(target,"div","nodes"); - if (node.childNodes != null && node.childNodes.length >0) { - img.src = theme.root + "img/tree/on.gif"; - img.expanded = "true"; - } else { - img.src = theme.root + "img/tree/off.gif"; - img.expanded = "false"; - } - for (var i = 0; i< node.childNodes.length;i++) { - var childNode = node.childNodes[i]; - if (childNode.nodeName == "node" || childNode.nodeName == "leaf") { - theme.renderTreeNode(renderer,childNode,subnodes,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly); - } - } - - // Add event listener - if (!disabled) { - var target = (selectable&&!readonly?img:n); - theme.addToggleClassListener(theme,client,target,"mouseup","hidden",subnodes); - theme.addExpandNodeListener(theme,client,img,"mouseup",subnodes,expandVariable,collapseVariable,key,immediate,target); - theme.addStopListener(theme,client,target,"mouseup"); - theme.addStopListener(theme,client,target,"click"); - } - - } else { - img.src = theme.root + "img/tree/empty.gif"; - } - -} - -DefaultTheme.prototype.renderTextField = function(renderer,uidl,target, layoutInfo) { - - var client = renderer.client; - var theme = renderer.theme; - var immediate = uidl.getAttribute("immediate") == "true"; - var readonly = uidl.getAttribute("readonly") == "true"; - var multiline = uidl.getAttribute("multiline") == "true"; - var secret = uidl.getAttribute("secret") == "true"; - var cols = uidl.getAttribute("cols"); - var rows = uidl.getAttribute("rows"); - var disabled = uidl.getAttribute("disabled") == "true"; - var focusid = uidl.getAttribute("focusid"); - var tabindex = uidl.getAttribute("tabindex"); - - // Create containing element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Render default header - renderer.theme.renderDefaultComponentHeader(renderer,uidl,div, layoutInfo); - - // Create border - var border = renderer.theme.createElementTo(div,"div","border"); - - // Create input - var input = null; - if (multiline) { - input = renderer.theme.createElementTo(border,"textarea"); - input.wrap = "off"; - if (focusid) { - input.focusid = focusid; - } - } else { - input = renderer.theme.createInputElementTo(border,(secret?"password":"text"),null,focusid); - - } - if (tabindex) input.tabIndex = tabindex; - if (disabled||readonly) { - input.disabled = "true"; - } - - - // Assign cols and rows - if (cols >0) { - if (multiline) { - input.cols = cols; - } else { - input.size = cols; - } - } - if (rows >0) { - input.rows = rows; - } - - // Find variable node - var strNode = theme.getVariableElement(uidl,"string","text"); - var inputId = strNode.getAttribute("id"); - input.id = inputId; - - // Assign value - strNode= theme.getFirstTextNode(strNode); - if (strNode != null && strNode.data != null) { - input.value = strNode.data; - } - - // Listener - theme.addSetVarListener(theme,client,input,"change",inputId,input,immediate); -} - -DefaultTheme.prototype.renderDateField = function(renderer,uidl,target,layoutInfo) { - // TODO needs simplification - // - jscalendar supports time! but not resolution? - // - dynamic .js loading! - - var theme = renderer.theme; - - // Create containing element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - /* Styles: - * time - only time selection (no date) - */ - var style = uidl.getAttribute("style"); - - var immediate = uidl.getAttribute("immediate") == "true"; - var disabled = uidl.getAttribute("disabled") == "true"; - var readonly = uidl.getAttribute("readonly") == "true"; - - /* locale, translate UI */ - var locale = uidl.getAttribute("locale") - if (locale && !disabled && !readonly) { - locale = locale.toLowerCase().split("_")[0]; - var lang = renderer.client.loadDocument(theme.root+"jscalendar/lang/calendar-"+locale+".js",false); - if (lang) { - try { - window.eval(lang); - } catch (e) { - client.error("Could not eval DateField lang ("+locale+"):"+e ); - } - } - } - - // Render default header - renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - var yearVar = theme.getVariableElement(uidl,"integer","year"); - var monthVar = theme.getVariableElement(uidl,"integer","month"); - var dayVar = theme.getVariableElement(uidl,"integer","day"); - var hourVar = theme.getVariableElement(uidl,"integer","hour"); - var minVar = theme.getVariableElement(uidl,"integer","min"); - var secVar = theme.getVariableElement(uidl,"integer","sec"); - var msecVar = theme.getVariableElement(uidl,"integer","msec"); - - var year = null; - var month = null; - var day = null; - var hour = null; - var min = null; - var sec = null; - var msec = null; - var text = null; - - var inputId = yearVar.getAttribute("id") + "_input"; - var buttonId = yearVar.getAttribute("id") + "_button"; - - // Assign the value to textfield - var yearValue = yearVar != null? yearVar.getAttribute("value"): null; - var monthValue = monthVar != null? monthVar.getAttribute("value"): null; - var dayValue = dayVar != null? dayVar.getAttribute("value"): null; - var hourValue = hourVar != null? hourVar.getAttribute("value"): null; - var minValue = minVar != null? minVar.getAttribute("value"): null; - var secValue = secVar != null? secVar.getAttribute("value"): null; - var msecValue = msecVar != null? msecVar.getAttribute("value"): null; - - if (style != "time") { - if (dayValue) { - // Using calendar - create textfield - if (readonly) { - text = theme.createTextNodeTo(div,dayValue+"."+monthValue+"."+yearValue); - } else { - text = theme.createInputElementTo(div,"text"); - text.id = inputId; - text.size = "10"; - if (disabled) { - text.disabled = true; - } - if (yearValue >0 && monthValue >0 && dayValue >0) { - text.value = dayValue+"."+monthValue+"."+yearValue; - } else { - text.value =""; - } - } - - // Create button - var button = theme.createInputElementTo(div,"button"); - button.id =buttonId; - button.value = "..."; - if (disabled||readonly) { - button.disabled = true; - } - } else { - if (yearVar) { - // Year select - if (readonly) { - theme.createTextNodeTo(div,yearValue); - } else { - var year = theme.createElementTo(div,"select"); - year.options[0] = new Option("",-1); - for (var i=0;i<2000;i++) { - year.options[i+1] = new Option(i+1900,i+1900); - if (yearValue == (i+1900)) { - year.options[i+1].selected = true; - } - } - if (disabled) { - year.disabled = true; - } - if (!readonly) theme.addSetVarListener(theme,client,year,"change",yearVar.getAttribute("id"),year,immediate); - } - } - if (monthVar) { - // Month select - if (readonly) { - theme.createTextNodeTo(div,"."+monthValue); - } else { - month = theme.createElementTo(div,"select"); - month.options[0] = new Option("",-1); - for (var i=0;i<12;i++) { - month.options[i+1] = new Option(i+2,i+2); - if (monthValue == i+2) { - month.options[i+1].selected = true; - } - } - if (disabled) { - month.disabled = true; - } - if (!readonly) theme.addSetVarListener(theme,client,month,"change",monthVar.getAttribute("id"),month,immediate); - } - } - } - } - if (hourVar) { - if (readonly) { - theme.createTextNodeTo(div," "+(hourValue<10?"0"+hourValue:hourValue)); - } else { - hour = theme.createElementTo(div,"select"); - hour.options[0] = new Option("",-1); - for (var i=0;i<24;i++) { - var cap = (i+1<10?"0"+(i+1):(i+1)); - if (!minVar) { - // Append anyway, makes it easier to recognize as time - cap = cap + ":00"; - } - hour.options[i+1] = new Option(cap,i+1); - if (hourValue == i+1) { - hour.options[i+1].selected = true; - } - } - if (disabled) { - hour.disabled = true; - } - if (!readonly) theme.addSetVarListener(theme,client,hour,"change",hourVar.getAttribute("id"),hour,immediate); - } - } - if (minVar) { - // Minute select - if (readonly) { - theme.createTextNodeTo(div,":"+(minValue<10?"0"+minValue:minValue)); - } else { - theme.createTextNodeTo(div,":"); - min = theme.createElementTo(div,"select"); - min.options[0] = new Option("",-1); - for (var i=0;i<60;i++) { - min.options[i+1] = new Option((i<10?"0"+(i):(i)),i); - if (minValue == i) { - min.options[i+1].selected = true; - } - } - if (disabled) { - min.disabled = true; - } - if (!readonly) theme.addSetVarListener(theme,client,min,"change",minVar.getAttribute("id"),min,immediate); - } - } - if (secVar) { - // Second select - if (readonly) { - theme.createTextNodeTo(div,":"+(secValue<10?"0"+secValue:secValue)); - } else { - theme.createTextNodeTo(div,":"); - sec = theme.createElementTo(div,"select"); - sec.options[0] = new Option("",-1); - for (var i=0;i<60;i++) { - sec.options[i+1] = new Option((i<10?"0"+(i):(i)),i); - if (secValue == i) { - sec.options[i+1].selected = true; - } - } - if (disabled) { - sec.disabled = true; - } - if (!readonly) theme.addSetVarListener(theme,client,sec,"change",secVar.getAttribute("id"),sec,immediate); - } - } - if (msecVar) { - // Millisecond select - if (readonly) { - var cap = msecValue; - if (i+1 < 100) { - cap = "0"+cap; - } - if (i+1 < 10) { - cap = "0"+cap; - } - theme.createTextNodeTo(div,"."+cap); - } else { - theme.createTextNodeTo(div,"."); - msec = theme.createElementTo(div,"select"); - msec.options[0] = new Option("",-1); - for (var i=0;i<1000;i++) { - var cap = i; - if (i < 100) { - cap = "0"+cap; - } - if (i < 10) { - cap = "0"+cap; - } - msec.options[i+1] = new Option(cap,i); - if (msecValue == i) { - msec.options[i+1].selected = true; - } - } - if (disabled) { - msec.disabled = true; - } - if (!readonly) theme.addSetVarListener(theme,client,msec,"change",msecVar.getAttribute("id"),msec,immediate); - } - } - - if (!readonly) { - if (msec) theme.addDateFieldNullListener(client,msec,text,msec,sec,min,hour,day,month,year,yearVar,immediate); - if (sec) theme.addDateFieldNullListener(client,sec,text,msec,sec,min,hour,day,month,year,yearVar,immediate); - if (min) theme.addDateFieldNullListener(client,min,text,msec,sec,min,hour,day,month,year,yearVar,immediate); - if (hour) theme.addDateFieldNullListener(client,hour,text,msec,sec,min,hour,day,month,year,yearVar,immediate); - if (day) theme.addDateFieldNullListener(client,day,text,msec,sec,min,hour,day,month,year,yearVar,immediate); - if (month) theme.addDateFieldNullListener(client,month,text,msec,sec,min,hour,day,month,year,yearVar,immediate); - if (year) theme.addDateFieldNullListener(client,year,text,msec,sec,min,hour,day,month,year,yearVar,immediate); - - } - - var nullFunc = function () { - // TODO wierd when un-nulling - // -> serverside, examine - // + nulls in dropdowns! - text.value = ""; - if (msec) { - msec.options[0].selected = true; - //client.changeVariable(msecVar.getAttribute("id"), -1, false); - } - if (sec) { - sec.options[0].selected = true; - //client.changeVariable(secVar.getAttribute("id"), -1, false); - } - if (min) { - min.options[0].selected = true; - //client.changeVariable(minVar.getAttribute("id"), -1, false); - } - if (hour) { - hour.options[0].selected = true; - //client.changeVariable(hourVar.getAttribute("id"), -1, false); - } - //client.changeVariable(dayVar.getAttribute("id"), -1, false); - //client.changeVariable(monthVar.getAttribute("id"), -1, false); - client.changeVariable(yearVar.getAttribute("id"), -1, immediate); - } - - // Function that updates the datefield - var updateFunc = function (event) { - if (text.value == null || text.value == "") { - nullFunc(); - return; - } - if (dayVar) { - var d = text.value.split(".")[0]; - if (d == null || d < 1 || d > 31 ) alert("Error"); - client.changeVariable(dayVar.getAttribute("id"), d, false); - } - if (monthVar) { - var m = text.value.split(".")[1]; - if (m == null || m < 1 || m > 12) alert("Error"); - client.changeVariable(monthVar.getAttribute("id"), m, false); - } - var y = text.value.split(".")[2]; - if (y == null || y < 0 || y > 5000) alert("Error"); - client.changeVariable(yearVar.getAttribute("id"), y, immediate); - - - }; - - if (!readonly && !disabled && style != "time" && dayVar) { - // Create a unique temporary variable - // Dont know if all this is needed, but its purpose is to avoid - // javascript problems with event handlers scopes. - var temp = "datefield_" + (new Date()).getTime();; - eval (temp + " = new Object();"); - (eval (temp)).update = function () { updateFunc() }; - var st = "Calendar.setup({onUpdate : function () { " + temp + - ".update(); } ,inputField : '"+inputId+"', firstDay : 1,"+ - " ifFormat : '%d.%m.%Y', button : '"+buttonId+"'});"; - - // Assign update function to textfield - text.onchange = updateFunc; - - // TODO externalize: - // Assign initialization to button mouseover (lazy initialization) - client.addEventListener(button, "mouseover", function(event) { - if (!eval(temp).initialized) { - eval(temp).initialized =true; - eval(st); - } - } - ); - } -} -DefaultTheme.prototype.addDateFieldNullListener = function (client,elm,text,msec,sec,min,hour,day,month,year,yearVar,immediate) { - client.addEventListener(elm, "change", function(event) { - - if ( !elm || elm.value != -1) return; - - - if (text) text.value = ""; - - if (msec) { - msec.options[0].selected = true; - //client.changeVariable(msecVar.getAttribute("id"), -1, false); - } - if (sec) { - sec.options[0].selected = true; - //client.changeVariable(secVar.getAttribute("id"), -1, false); - } - if (min) { - min.options[0].selected = true; - //client.changeVariable(minVar.getAttribute("id"), -1, false); - } - if (hour) { - hour.options[0].selected = true; - //client.changeVariable(hourVar.getAttribute("id"), -1, false); - } - if (day) { - hour.options[0].selected = true; - //client.changeVariable(hourVar.getAttribute("id"), -1, false); - } - if (month) { - hour.options[0].selected = true; - //client.changeVariable(hourVar.getAttribute("id"), -1, false); - } - if (year) { - hour.options[0].selected = true; - //client.changeVariable(hourVar.getAttribute("id"), -1, false); - } - //client.changeVariable(dayVar.getAttribute("id"), -1, false); - //client.changeVariable(monthVar.getAttribute("id"), -1, false); - client.changeVariable(yearVar.getAttribute("id"), -1, immediate); - }); -} - - - -DefaultTheme.prototype.renderDateFieldCalendar = function(renderer,uidl,target,layoutInfo) { - - var theme = renderer.theme; - - // Create containing element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Render default header - renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - var immediate = uidl.getAttribute("immediate") == "true"; - var enabled = uidl.getAttribute("enabled") == "true"; - var readonly = uidl.getAttribute("readonly") == "true"; - var yearVar = theme.getVariableElement(uidl,"integer","year"); - var monthVar = theme.getVariableElement(uidl,"integer","month"); - var dayVar = theme.getVariableElement(uidl,"integer","day"); - var hourVar = theme.getVariableElement(uidl,"integer","hour"); - var minVar = theme.getVariableElement(uidl,"integer","minutes"); - var secVar = theme.getVariableElement(uidl,"integer","seconds"); - var msecVar = theme.getVariableElement(uidl,"integer","millseconds"); - - var showTime = hourVar != null; - var inputId = yearVar.getAttribute("id") + "_input"; - - // Create container DIV - var calDiv = theme.createElementTo(div,"div"); - calDiv.id = inputId; - - // Assign the value to textfield - var yearValue = yearVar != null? yearVar.getAttribute("value"): -1; - var monthValue = monthVar != null? monthVar.getAttribute("value"): -1; - var dayValue = dayVar != null? dayVar.getAttribute("value"): -1; - var hourValue = hourVar != null? hourVar.getAttribute("value"): -1; - var minValue = minVar != null? minVar.getAttribute("value"): -1; - var secValue = secVar != null? secVar.getAttribute("value"): -1; - var msecValue = msecVar != null? msecVar.getAttribute("value"): -1; - if (yearValue >0 && monthValue >0 && dayValue >0) { - //TODO Assign date - } else { - //TODO Assign date - } - - - // Create a unique temporary variable - // Dont know if all this is needed, but its purpose is to avoid - // javascript problems with event handlers scopes. - var temp = "datefield_" + (new Date()).getTime();; - eval (temp + " = new Object();"); - - // Function that updates the datefield - var dateChanged = function (cal) { - var y = cal.date.getFullYear(); - var m = cal.date.getMonth(); - var d = cal.date.getDate(); - if (d == null || y == null || m == null || d < 1 || - d > 31 || m < 1 || m > 12 || y < 0 || y > 5000) alert("Error"); - client.changeVariable(dayVar.getAttribute("id"), d, false); - client.changeVariable(monthVar.getAttribute("id"), m, false); - client.changeVariable(yearVar.getAttribute("id"), y, immediate); - }; - - // Calendar setup code - (eval (temp)).update = dateChanged; - var st = "Calendar.setup({flatCallback : function (cal) { " + temp + - ".update(cal); } ,showsTime: "+showTime+", flat: '"+inputId+"', firstDay : 1,"+ - " ifFormat : '%d.%m.%Y'});"; - - - // Assign initialization to button mouseover (lazy initialization) - client.addEventListener(div, "mouseover", function(event) { - if (!eval(temp).initialized) { - eval(temp).initialized =true; - eval(st); - - } - } - ); - -} - - -DefaultTheme.prototype.renderUpload = function(renderer,uidl,target,layoutInfo) { - - var theme = renderer.theme; - var client = renderer.client; - var varNode = theme.getVariableElement(uidl,"uploadstream","stream"); - - // Create containing element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Render default header - renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - // Unique name for iframes - var frameName = "upload_"+varNode.getAttribute("id")+"_iframe"; - - var iframe = theme.createElementTo(div, "iframe"); - iframe.style.width = '300px'; - iframe.style.height = '30px'; - iframe.id = frameName; - iframe.name = frameName; - iframe.src = 'about:blank'; - iframe.style.border = 'none'; - iframe.style.margin = '0px'; - iframe.style.padding = '0px'; - iframe.style.background = 'none'; - - - // Get the window object of the iframe - var ifr = window.frames[frameName]; - - // TODO: FF fix. The above does not work in FF, so we - // have to work our way around it. Iterate all frames. - if (ifr == null) { - var fi = 0; - while (fi < window.frames.length) { - if (window.frames[fi].frameElement != null && window.frames[fi].frameElement.name == frameName) { - ifr = window.frames[fi]; - } - fi++; - } - } - - if (ifr != null) { - - // TODO: Put some initial content to IFRAME. - // Nasty, but without this the browsers fail - // to create any elements into window. - var code="<HTML>"+"<BODY STYLE=\" overflow: hidden; border: none; margin: 0px; padding: 0px;\"><\/BODY><\/HTML>"; - ifr.document.open(); - ifr.document.write(code); - ifr.document.close(); - - - // Ok. Now we are ready render the actual upload form and - // inputs. - var form = ifr.document.createElement('form'); - form.setAttribute("action",client.ajaxAdapterServletUrl); - form.setAttribute("method", "post"); - form.setAttribute("enctype", "multipart/form-data"); - if (document.all) { - form = ifr.document.createElement('<form action="'+client.ajaxAdapterServletUrl+'" method="post" enctype="multipart/form-data">'); - } - var upload = theme.createInputElementTo(form, "file"); - upload.id = varNode.getAttribute("id"); - upload.name = varNode.getAttribute("id"); - var submit = theme.createInputElementTo(form, "submit"); - submit.value = "Send"; - ifr.document.body.appendChild(form); - - // Attach event listeners for processing the chencges after upload. - if (document.all) { - iframe.onreadystatechange = function() { - if (iframe.readyState == "complete") { - //TODO: Is there a better way? Cannot figure out a - // way to take the changes out of iframes document in IE. - // FF seems to be working, but IE just renders the - // XML as highlight HTML and looses the original XML. - //div.ownerDocument.location.reload(); - div.ownerDocument.location.href = div.ownerDocument.location.href; - } - }; - } else { - iframe.onload = function() { - if (ifr.document != null && (ifr.document.contentType == "application/xml")) { - // TODO: Damn. This would be nice but seems to be unreliable: - //client.processUpdates(ifr.document); - //div.ownerDocument.location.reload(); - div.ownerDocument.location.href = div.ownerDocument.location.href; - - } - }; - } - - } -} - -DefaultTheme.prototype.renderEmbedded = function(renderer,uidl,target,layoutInfo) { - - var theme = renderer.theme; - - // Create containing element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Render default header - renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - if (uidl.getAttribute("type") == "image") { - - // Image mode - var img = renderer.theme.createElementTo(div,"img","embedded"); - - // SRC - var val = uidl.getAttribute("src"); - if (val != null) img.src = val; - - // Width - val = uidl.getAttribute("width"); - if (val != null && val > 0) img.width = val; - - // Height - val = uidl.getAttribute("height"); - if (val != null && val > 0) img.height = val; - - // ALT-attribute - img.alt = theme.getElementContent(uidl,"description"); - } else { - - /* - // Object mode - var embedded = renderer.theme.createElementTo(div,"object","embedded"); - // SRC - var val = uidl.getAttribute("src"); - if (val) embedded.src = val; - - - // Width - val = uidl.getAttribute("width"); - if (val != null && val > 0) embedded.width = val; - - // Height - val = uidl.getAttribute("height"); - if (val != null && val > 0) embedded.height = val; - - // Codebase - val = uidl.getAttribute("codebase"); - if (val != null) embedded.codebase = val; - - // Standby - val = uidl.getAttribute("standby"); - if (val != null) embedded.codebase = val; - */ - - var html = "<object "; - var val = uidl.getAttribute("src"); - if (val) html += " data=\""+val+"\" "; - - val = uidl.getAttribute("width"); - if (val) html += " width=\""+val+"\" "; - - val = uidl.getAttribute("height"); - if (val) html += " height=\""+val+"\" "; - - val = uidl.getAttribute("codebase"); - if (val) html += " codebase=\""+val+"\" "; - - val = uidl.getAttribute("standby"); - if (val) html += " standby=\""+val+"\" "; - - html += ">"; - - // Add all parameters - var params = theme.getChildElements(uidl,"embeddedparams"); - if (params != null) { - var len = params.length; - for (var i=0;i<len;i++) { - html += "<param name=\""+params[i].getAttribute("name")+"\" value=\""+params[i].getAttribute("name")+"\" />" - } - } - - html += "</object>"; - - div.innerHTML = html; - } -} - -DefaultTheme.prototype.renderLink = function(renderer,uidl,target,layoutInfo) { - // Shortcut variables - var theme = renderer.theme; - var client = renderer.client; - - var immediate = "true"==uidl.getAttribute("immediate"); - var disabled = "true"==uidl.getAttribute("disabled"); - var readonly = "true"==uidl.getAttribute("readonly"); - - var targetName = uidl.getAttribute("name"); - var width = uidl.getAttribute("width"); - var height = uidl.getAttribute("height"); - var border = uidl.getAttribute("border"); - var src = uidl.getAttribute("src"); - if (src && src.indexOf("theme://") == 0) { - src = theme.root + src.substring(8); - } - - // Create containing element - var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - var link = theme.createElementTo(div,"div", "link pad clickable"); - - if (!disabled&&!readonly) { - theme.addAddClassListener(theme,client,div,"mouseover","over"); - theme.addRemoveClassListener(theme,client,div,"mouseout","over"); - - var feat; - switch (border) { - case "minimal": - feat = "menubar=yes,location=no,status=no"; - break; - case "none": - feat = "menubar=no,location=no,status=no"; - break; - default: - feat = "menubar=yes,location=yes,scrollbars=yes,status=yes"; - break; - } - if (width||height) { - feat += ",resizable=no"; - feat += (width?",width="+width:""); - feat += (height?",height="+height:""); - } else { - feat += ",resizable=yes"; - } - theme.addLinkOpenWindowListener(theme,client,div,"click",src,targetName,feat); - } - /* - with(props) { - client.addEventListener(div,"mouseover", function(e) { - theme.addCSSClass(div,"over"); - } - ); - client.addEventListener(div,"mouseout", function(e) { - theme.removeCSSClass(div,"over"); - } - ); - client.addEventListener(div,"click", function(e) { - theme.hidePopup(); - if (!target) { - window.location = src; - } else { - var feat; - switch (border) { - case "minimal": - feat = "menubar=yes,location=no,status=no"; - break; - case "none": - feat = "menubar=no,location=no,status=no"; - break; - default: - feat = "menubar=yes,location=yes,scrollbars=yes,status=yes"; - break; - } - if (width||height) { - feat += ",resizable=no" - } else { - feat += ",resizable=yes" - } - var win = window.open(src, target, - feat - +(width?",width="+width:"") - +(height?",height="+height:"") - ); - win.focus(); - } - } - ); - } - */ - //var inner = theme.createElementTo(div,"div", "border pad"); - - // Render default header - theme.renderDefaultComponentHeader(renderer,uidl,link); - - // Description under link - var descriptionText = theme.getElementContent(uidl,"description"); - if (descriptionText) { - var desc = theme.createElementTo(link,"div", "description"); - theme.createTextNodeTo(desc,descriptionText); - } -} -DefaultTheme.prototype.addLinkOpenWindowListener = function(theme,client,element,event,url,target,features) { - client.addEventListener(element,(event=="rightclick"?"click":event), function(e) { - var evt = client.getEvent(e); - if (event=="rightclick"&&!evt.rightclick) return; - if (!target) { - window.location = url; - } else { - var win = window.open(url, target, features); - win.focus(); - } - } - ); -} -DefaultTheme.prototype.renderTable = function(renderer,uidl,target,layoutInfo) { - // Shortcut variables - var theme = renderer.theme; - var client = renderer.client; - - // Create containing DIV - var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - if ("list"==uidl.getAttribute("style")) { - theme.removeCSSClass(div,"table"); - theme.addCSSClass(div,"list"); - } - // Create default header - var caption = theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - // Get table attributes - var rowheaders = ("true"==uidl.getAttribute("rowheaders")); - var totalrows = parseInt(uidl.getAttribute("totalrows")); - var pagelength = parseInt(uidl.getAttribute("pagelength")); - var rowCount = parseInt(uidl.getAttribute("rows")); - var firstvisible = theme.getVariableElementValue(theme.getVariableElement(uidl,"integer","firstvisible"))||1; - var firstvisibleVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"integer","firstvisible")); - var immediate = ("true" == uidl.getAttribute("immediate")); - var selectMode = uidl.getAttribute("selectmode"); - var selectable = selectMode == "multi" || selectMode == "single"; - var selected; // Selected map - if (selectable) { - selected = new Array(); - } - var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected")); - var visibleCols = theme.getFirstElement(uidl,"visiblecolumns"); - var collapseVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","collapsedcolumns")); - var sortcolVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"string","sortcolumn")); - var sortkey = theme.getVariableElementValue(theme.getVariableElement(uidl,"string","sortcolumn")); - var sortasc = theme.getVariableElement(uidl,"boolean","sortascending"); - var sortascVar = theme.createVariableElementTo(div,sortasc); - sortasc = sortasc != null && "true"==sortasc.getAttribute("value"); - - var actions = null; - var actionVar = null; - var alNode = theme.getFirstElement(uidl,"actions") - if (alNode) { - actionVar = theme.createVariableElementTo(div,theme.getVariableElement(alNode,"string","action")); - actions = new Object(); - var ak = alNode.getElementsByTagName("action"); - for (var i=0;i<ak.length;i++) { - actions[ak[i].getAttribute("key")] = ak[i].getAttribute("caption"); - } - } - delete alNode; - - // Create table for content - div = theme.createElementTo(div,"div","outset"); - div = theme.createElementTo(div,"div","content border"); - - var table = theme.createElementTo(div,"table"); - table = theme.createElementTo(table,"tbody"); - table.setAttribute("cellpadding","0"); - table.setAttribute("cellspacing","0"); - var tr = null; - var td = null; - - - // Column headers - var cols = theme.getFirstElement(uidl,"cols"); - if (cols != null) { - cols = cols.getElementsByTagName("ch"); - } - if (cols != null && cols.length >0) { - tr = theme.createElementTo(table,"tr","header"); - if (rowheaders) { - theme.createElementTo(tr,"td","empty"); - } - for (var i=0; i<cols.length;i++) { - var sortable = cols[i].getAttribute("sortable"); - td = theme.createElementTo(tr,"td","cheader bg"); - // Sorting - var key = cols[i].getAttribute("cid"); - if (sortable=="true") { - theme.addCSSClass(td,"clickable"); - // Sorting always immediate - theme.addSetVarListener(theme,client,td,"click",sortascVar,(key==sortkey?!sortasc:sortasc),false); - theme.addSetVarListener(theme,client,td,"click",sortcolVar,key,true); - - } - var ch = cols[i].getAttribute("caption"); - var cap = theme.createElementTo(td,"div","caption"); - theme.createTextNodeTo(cap,ch != null? ch : ""); - if (sortkey==key) { - var icon = theme.createElementTo(cap,"IMG","icon"); - icon.src = theme.root+"img/table/"+(sortasc?"asc.gif":"desc.gif"); - } - } - - // Collapsing - td = theme.createElementTo(tr,"td","cheader scroll bg"); - if (visibleCols) { - var iconDiv = theme.createElementTo(td,"div"); - var icon = theme.createElementTo(iconDiv,"img","icon"); - icon.src = theme.root+"/img/table/colsel.gif"; - var popup = theme.createElementTo(td,"div","outset popup hide"); - var inner = theme.createElementTo(popup,"div","border"); - // empty row to allow closing: - var row = theme.createElementTo(inner,"div","item clickable pad border"); - - theme.addHidePopupListener(theme,client,row,"click"); - theme.addToggleClassListener(theme,client,row,"mouseover","over"); - theme.addToggleClassListener(theme,client,row,"mouseout","over"); - theme.addTogglePopupListener(theme,client,iconDiv,"click",popup); - - var cols = visibleCols.getElementsByTagName("column"); - for (var i=0;i<cols.length;i++) { - var row = theme.createElementTo(inner,"div","item clickable pad border"); - var collapsed = "true"==cols[i].getAttribute("collapsed"); - icon = theme.createElementTo(row,"img","icon"); - icon.src = theme.root+"/img/table/"+(collapsed?"off.gif":"on.gif"); - theme.createTextNodeTo(row,cols[i].getAttribute("caption")); - - theme.addToggleClassListener(theme,client,row,"mouseover","over"); - theme.addToggleClassListener(theme,client,row,"mouseout","over"); - theme.addToggleVarListener(theme,client,row,"click",collapseVariable,cols[i].getAttribute("cid"),true); - } - delete cols; - } - } - delete cols; - - // Table rows - var rows = theme.getFirstElement(uidl,"rows"); - if (rows != null) { - rows = theme.getChildElements(rows,"tr"); - } - if (rows != null && rows.length >0) { - for (var i=0; i<rows.length;i++) { - tr = theme.createElementTo(table,"tr"); - // TODO rowheader - theme.setCSSClass(tr, (i % 2 == 0?"even":"odd")); - - if (selectable) theme.addCSSClass(tr, "clickable"); - var key = rows[i].getAttribute("key"); - - if (selectable&&"true"==rows[i].getAttribute("selected")) { - theme.addCSSClass(tr, "selected"); - selected[selected.length] = tr; - } - - if (selectable) { - if (selectMode == "multi") { - theme.addToggleClassListener(theme,client,tr,"click","selected"); - theme.addToggleVarListener(theme,client,tr,"click",selectionVariable,key,immediate); - } else { - theme.addAddClassListener(theme,client,tr,"click","selected",tr,selected); - theme.addSetVarListener(theme,client,tr,"click",selectionVariable,key,immediate); - } - } - - if (rowheaders) { - var td = theme.createElementTo(tr,"td","rheader bg"); - var caption = theme.createElementTo(td,"div","caption"); - theme.createTextNodeTo(caption,rows[i].getAttribute("caption")); - } - if (rows[i].childNodes != null && rows[i].childNodes.length >0) { - var al = null; - for (var j=0; j<rows[i].childNodes.length;j++) { - if (rows[i].childNodes[j].nodeName == "al") { - al = rows[i].childNodes[j]; - } else if (rows[i].childNodes[j].nodeType == Node.ELEMENT_NODE) { - td = theme.createElementTo(tr,"td"); - renderer.client.renderUIDL(rows[i].childNodes[j],td); - if (al) { - theme.renderActionPopup(renderer,al,td,actions,actionVar,key); - } - } - } - } - // SCROLLBAR - if (i==0) { - td = theme.createElementTo(tr,"td", "scroll border"); - // TODO: - //theme.tableAddScrollEvents(theme,td); - - td.setAttribute("rowSpan",rows.length); - var inner = theme.createElementTo(td,"div", "scroll"); - } - } - } - delete rows; - - var paging = theme.createElementTo(div,"div","nav pad"); - var button = theme.createElementTo(paging,"div","pad caption inline"); - if (firstvisible > 1) { - theme.addCSSClass(button,"clickable"); - theme.addAddClassListener(theme,client,button,"mouseover","bg"); - theme.addRemoveClassListener(theme,client,button,"mouseout","bg"); - theme.addSetVarListener(theme,client,button,"click",firstvisibleVar,(parseInt(firstvisible)-parseInt(pagelength)),true); - } else { - theme.addCSSClass(button,"disabled"); - } - theme.createTextNodeTo(button,"<<"); - - button = theme.createElementTo(paging,"div","small pad inline"); - theme.createTextNodeTo(button,firstvisible+" - "+(firstvisible-1+parseInt(rowCount))+ " / " + totalrows); - - button = theme.createElementTo(paging,"div","pad caption inline"); - if (parseInt(firstvisible)+parseInt(pagelength)<=parseInt(totalrows)) { - theme.addCSSClass(button,"clickable"); - theme.addAddClassListener(theme,client,button,"mouseover","bg"); - theme.addRemoveClassListener(theme,client,button,"mouseout","bg"); - theme.addSetVarListener(theme,client,button,"click",firstvisibleVar,(parseInt(firstvisible)+parseInt(pagelength)),true); - } else { - theme.addCSSClass(button,"disabled"); - } - theme.createTextNodeTo(button,">>"); -} - -DefaultTheme.prototype.renderScrollTable = function(renderer,uidl,target,layoutInfo) { - // Shortcut variables - var theme = renderer.theme; - var client = renderer.client; - var colWidths; - if (target.colWidths) { - colWidths = target.colWidths; - } else { - colWidths = new Object(); - } - var wholeWidth = target.wholeWidth; - var scrolledLeft = target.scrolledLeft; - - // Get attributes - var pid = uidl.getAttribute("id"); - var immediate = uidl.getAttribute("immediate")||false; - var selectmode = uidl.getAttribute("selectmode"); - var cols = parseInt(uidl.getAttribute("cols")); - var rows = parseInt(uidl.getAttribute("rows")); - var totalrows = parseInt(uidl.getAttribute("totalrows")); - var pagelength = uidl.getAttribute("pagelength"); - var colheaders = uidl.getAttribute("colheaders")||false; - var rowheaders = uidl.getAttribute("rowheaders")||false; - var visiblecols = theme.getFirstElement(uidl,"visiblecolumns"); - var sortkey = theme.getVariableElementValue(theme.getVariableElement(uidl,"string","sortcolumn")); - - var colorder = new Array(); - var fv = parseInt(theme.getVariableElementValue(theme.getVariableElement(uidl,"integer","firstvisible"))||1); - var selected; // Selected map - if (selectmode) { - selected = new Array(); - } - - // Create containing DIV - var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo); - div.colWidths = colWidths; - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Variables - var fvVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"integer","firstvisible")); - var ccVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","collapsedcolumns")); - var coVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","columnorder")); - var selVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected")); - var sortVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"string","sortcolumn")); - var sortasc = theme.getVariableElement(uidl,"boolean","sortascending"); - var sortascVar = theme.createVariableElementTo(div,sortasc); - sortasc = (sortasc != null && "true"==sortasc.getAttribute("value")); - - // Create default header - var caption = theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - // column collapsing - - // main div - var inner = theme.createElementTo(div,"div","border"); - inner.innerHTML = "<TABLE width=\"100%\"><TR><TD></TD></TR></TABLE>"; - if (!wholeWidth) { - wholeWidth = inner.offsetWidth||inner.clientWidth||300; - wholeWidth -= 2; // Leave room for border, TODO: more dynamic - if (wholeWidth<200) wholeWidth = 300; - } - div.wholeWidth = wholeWidth; - var offsetLeft = client.getElementPosition(inner).x; - - // Actions - var actions = null; - var actionVar = null; - var alNode = theme.getFirstElement(uidl,"actions") - if (alNode) { - actionVar = theme.createVariableElementTo(div,theme.getVariableElement(alNode,"string","action")); - actions = new Object(); - var ak = alNode.getElementsByTagName("action"); - for (var i=0;i<ak.length;i++) { - actions[ak[i].getAttribute("key")] = ak[i].getAttribute("caption"); - } - } - delete alNode; - - inner.innerHTML = "<DIV id=\""+pid+"status\" align=\"center\" class=\"abs border pad\" style=\"width:"+(wholeWidth/2)+"px;background-color:white;display:none;\"></DIV><TABLE cellpadding=0 cellspacing=0 border=0 width=100%><TBODY><TR valign=top class=bg><TD></TD><TD width=16></TD></TR></TBODY></TABLE><TABLE>"; - //inner.style.width = wholeWidth+"px"; - var vcols = inner.childNodes[1].firstChild.firstChild.childNodes[1]; - if (visiblecols) { - vcols.innerHTML = "<IMG class=\"bg icon\" src=\""+theme.root+"/img/table/colsel.gif\"/>"; - var icon = vcols.firstChild; - vcols.id = pid+"vcols"; - var popup = theme.createElementTo(div,"div","border popup hide"); - theme.addTogglePopupListener(theme,client,icon,"click",popup); - theme.addStopListener(theme,client,icon,"mouseover"); - theme.addStopListener(theme,client,icon,"mouseout"); - var row = theme.createElementTo(popup,"div","item clickable pad border"); - theme.addHidePopupListener(theme,client,row,"click"); - var cols = visiblecols.getElementsByTagName("column"); - for (var i=0;i<cols.length;i++) { - var row = theme.createElementTo(popup,"div","item clickable pad border"); - var collapsed = "true"==cols[i].getAttribute("collapsed"); - icon = theme.createElementTo(row,"img","icon"); - icon.src = theme.root+"/img/table/"+(collapsed?"off.gif":"on.gif"); - theme.createTextNodeTo(row,cols[i].getAttribute("caption")); - theme.addAddClassListener(theme,client,row,"mouseover","over"); - theme.addRemoveClassListener(theme,client,row,"mouseout","over"); - theme.addToggleVarListener(theme,client,row,"click",ccVar,cols[i].getAttribute("cid"),true); - } - delete cols; - } - - - // FIRST render the table - var alignments = new Array(); - - // headers - var hout = theme.createElementTo(inner.childNodes[1].firstChild.firstChild.firstChild,"div","bg"); - hout.style.width = (wholeWidth-16)+"px"; - hout.style.paddingRight = "0px"; - hout.id = pid+"hout"; - hout.style.overflow = "hidden"; - var html = "<TABLE id=\""+pid+"hin\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><TBODY><TR>"; - if (rowheaders) { - html += "<TD "; - if (colWidths["heh"]) { - html += "width=\""+colWidths["heh"]+"\" "; - } - html += "style=\"overflow:hidden\" cid=\"heh\" id=\""+pid+"heh\"><DIV class=\"padnr\" style=\""; - if (colWidths["heh"]) { - html += "width:"+colWidths["heh"]+"px;"; - } - html += "overflow:hidden;height:100%;white-space:nowrap;border-right:1px solid gray;\"><IMG id=\""+pid+"hah\" align=\"right\" src=\""+theme.root+"/img/table/handle.gif\" border=\"0\" style=\"height:100%;width:2px;cursor:w-resize;\"></DIV></TD>"; - } - var chs = theme.getFirstElement(uidl, "cols").getElementsByTagName("ch"); - var len = chs.length; - for (var i=0;i<len;i++) { - var col = chs[i]; - var cap = col.getAttribute("caption")||(visiblecols?"":""); - var sort = col.getAttribute("sortable"); - var cid = col.getAttribute("cid"); - var iconUrl = col.getAttribute("icon"); - if (iconUrl && iconUrl.indexOf("theme://") == 0) { - iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root) - + iconUrl.substring(8); - } - alignments[i] = col.getAttribute("align"); - colorder[i] = cid; - html += "<TD "; - if (colWidths[cid]) { - html += "width=\""+colWidths[cid]+"\" "; - } - if (sortkey == cid) { - html += "sorted=\"true\" "; - } - html += "style=\"overflow:hidden\" cid=\""+cid+"\" id=\""+pid+"he"+i+"\" >" - html += "<DIV class=\"padnr\" "; - if (alignments[i]) { - switch (alignments[i]) { - case "e": - html += "align=\"right\""; - break; - case "c": - html += "align=\"center\""; - break; - default: - } - } - html += " style=\""; - if (colWidths[cid]) { - html += "width:"+colWidths[cid]+"px;"; - } - html += "overflow:hidden;font-weight:bold;height:100%;white-space:nowrap;border-right:1px solid gray;\"><IMG id=\""+pid+"ha"+cid+"\" align=\"right\" src=\""+theme.root+"/img/table/handle.gif\" border=\"0\" style=\"height:100%;width:4px;cursor:w-resize;\">"; - html += (iconUrl?"<IMG src=\""+iconUrl+"\" class=\"icon\">":"")+cap+"</DIV></TD>"; - } - html += "</TR></TBODY></TABLE>"; - hout.innerHTML = html; - - // content - // scroll padding calculations - // TODO these need to be calculated better, perhaps updated after rendering content - var prePad = (fv==1?1:fv*22); - var postPad = (totalrows-fv-rows+1)*22; - // html - cout = theme.createElementTo(inner,"div"); - cout.style.width = wholeWidth+"px"; - cout.style.height = (18*rows)+"px"; - cout.id = pid+"cout"; - cout.style.overflow = "scroll"; - html = "<TABLE border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\""+pid+"cin\"><TBODY><TR height=\""+prePad+"\"></TR>"; - var trs = theme.getFirstElement(uidl, "rows").getElementsByTagName("tr"); - len = trs.length; - if (len==0) { - html += "<TR id=\""+pid+"firstrow\"><TD style=\"overflow:hidden\">"; - html += "<DIV class=\"pad\" style=\"overflow:hidden;height:100%;white-space:nowrap;border-right:1px solid gray;\"></DIV></TD></TR>"; - } - for (var i=0;i<len;i++) { - var row = trs[i]; - var cap = row.getAttribute("caption"); - var key = row.getAttribute("key"); - var seld = row.getAttribute("selected"); - var iconUrl = row.getAttribute("icon"); - html += "<TR "+(i==0?"id=\""+pid+"firstrow\"":""); - html += " key=\""+key+"\""; - if (seld) { - html += " selected=\"true\" class=\"selected\" "; - } - html += ">"; - if (rowheaders) { - html += "<TD "; - if (colWidths["heh"]) { - html += "width=\""+colWidths["heh"]+"\" "; - } - html += "style=\"overflow:hidden\"><DIV class=\"padnr\" style=\""; - if (colWidths["heh"]) { - html += "width:"+colWidths["heh"]+"px;"; - } - html += "overflow:hidden;height:100%;white-space:nowrap;border-right:1px solid gray;\">"; - if (iconUrl) { - if (iconUrl.indexOf("theme://") == 0) { - iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root) - + iconUrl.substring(8); - } - html += "<IMG src=\""+iconUrl+"\" class=\"icon\" />"; - } - html += row.getAttribute("caption")+"</DIV></TD>"; - } - var comps = row.childNodes; - var l = comps.length; - if (l==0) { - html += "<TD><DIV class=\"padnr\" style=\"overflow:hidden;height:100%;white-space:nowrap;border-right:1px solid gray;\"></DIV></TD>"; - } - - var colNum = -1; - for (j=0;j<l;j++) { - var comp = comps[j]; - if (comp.nodeName == "al"||comp.nodeName == "#text") continue; - colNum++; - // Placeholder TD, we'll render the content later - html += "<TD " - if (colWidths[colorder[colNum]]) { - html += "width=\""+colWidths[colorder[colNum]]+"\" "; - } - if (alignments[colNum]) { - switch (alignments[colNum]) { - case "e": - html += " align=\"right\" "; - break; - case "c": - html += " align=\"center\" "; - break; - default: - } - } - html += "style=\"overflow:hidden\"><DIV class=\"padnr\" style=\""; - if (colWidths[colorder[colNum]]) { - html += "width:"+colWidths[colorder[colNum]]+"px;"; - } - html += "overflow:hidden;height:100%;white-space:nowrap;border-right:1px solid gray;\"></DIV></TD>"; - } - html += "</TR>"; - } - html += "<TR id=\""+pid+"lastrow\" height=\""+postPad+"\"></TR></TBODY></TABLE>"; - cout.innerHTML = html; - - // SECOND render the sub-components (TD content) - var trs = cout.firstChild.firstChild.childNodes; - var utrs = theme.getFirstElement(uidl, "rows").getElementsByTagName("tr"); - for (var i=0;i<len;i++) { - var tr = trs[i+1]; - var key = tr.getAttribute("key"); - var comps = utrs[i].childNodes; - var l = comps.length; - var currentCol = (rowheaders?1:0); - var al = null; - for (j=0;j<l;j++) { - var comp = comps[j]; - if (comp.nodeName == "#text") continue; - if (comp.nodeName == "al") { - al = comp; - continue; - } - var trg = tr.childNodes[currentCol++].firstChild; - client.renderUIDL(comp, trg); - } - - if (al&&tr.firstChild) { - theme.renderActionPopup(renderer,al,tr,actions,actionVar,key,"rightclick"); - } - - // selection - if (selectmode) { - selected[selected.length] = tr; - theme.addCSSClass(tr,"clickable"); - theme.addToggleClassListener(theme,client,tr,"mouseover","selectable"); - theme.addToggleClassListener(theme,client,tr,"mouseout","selectable"); - if (selectmode == "multi") { - theme.addToggleClassListener(theme,client,tr,"click","selected"); - theme.addToggleVarListener(theme,client,tr,"click",selVar,key,immediate); - } else { - theme.addAddClassListener(theme,client,tr,"click","selected",tr,selected); - theme.addSetVarListener(theme,client,tr,"click",selVar,key,immediate); - } - } - } - - // THIRD do some initial sizing and scrolling - var fr = target.ownerDocument.getElementById(pid+"firstrow").offsetTop; - var lr = target.ownerDocument.getElementById(pid+"lastrow").offsetTop; - cout.style.height = (lr-fr+20)+"px"; - cout.scrollTop = (fv>totalrows-rows?cout.scrollHeight:fr); - div.recalc = theme.scrollTableRecalc; - div.initialWidth = wholeWidth; - div.recalc(pid,target); - cout.scrollLeft = scrolledLeft; - hout.scrollLeft = scrolledLeft; - - var status = target.ownerDocument.getElementById(pid+"status"); - var p = client.getElementPosition(inner); - status.style.top = (p.y + p.h/2) + "px"; - status.style.left = (p.x + p.w/2 - wholeWidth/4) +"px"; - theme.scrollTableAddScrollHandler(client,theme,cout,div,status,lr,fr,rows,totalrows,fv,fvVar,immediate); - theme.scrollTableAddScrollListener(theme,div,pid,lr,fr,rows,totalrows,fv); - - - // Column order drag & drop - var hin = target.ownerDocument.getElementById(pid+"hin"); - var h = hin.getElementsByTagName("td"); - var dragOrderGroup = new Object(); - for (var i = 0;i<h.length;i++) { - var id = h[i].getAttribute("id"); - if (id==pid+"heh") { - var handle = target.ownerDocument.getElementById(pid+"hah"); - if (handle) { - theme.tableAddWidthListeners(client,theme,handle,"heh",div,pid); - } - } - if (!id||id.indexOf(pid+"he")<0) { - continue; - } - var cid = h[i].getAttribute("cid"); - var handle = target.ownerDocument.getElementById(pid+"ha"+cid); - if (handle) { - theme.tableAddWidthListeners(client,theme,handle,cid,div,pid); - } - if (coVar||sortVar) { - theme.addCSSClass(h[i],"clickable"); - theme.addToDragOrderGroup(client,theme,h[i],dragOrderGroup,coVar,sortVar,sortascVar,sortasc); - } - } - - var hin = target.ownerDocument.getElementById(pid+"hin"); - var cin = target.ownerDocument.getElementById(pid+"cin"); - theme.scrollTableRegisterLF(client,theme,div,inner,cout,hout,cin,hin); -} -// Header order drag & drop -DefaultTheme.prototype.tableAddWidthListeners = function(client,theme,element,cid,table,pid) { - - var colWidths = table.colWidths; - - var mouseDragListener = function (e) { - var evt = client.getEvent(e); - evt.stop(); - element.ownerDocument.onselectstart = function(e) {return false;} - var target = element.target; - var div = target.parentNode; - var td = div.parentNode; - //target.style.position = "relative"; - target.style.zIndex = "99999"; - var offset = -(target.origX-evt.mouseX+10); - var w = (target.origW+offset); - if (w < 7) w = 7; - try { - target.style.left = offset+"px"; - td.width = w; - td.style.width = w+"px"; - td.firstChild.style.width = w+"px"; - colWidths[cid] = w; - } catch (err) { - client.debug("Failed: d&d target.style.left="+ offset+"px"); - } - - } - - var mouseUpListener = function(e) { - client.removeEventListener(element.ownerDocument.body,"mousemove",mouseDragListener); - client.removeEventListener(element.ownerDocument.body,"mouseup",arguments.callee); - client.removeEventListener(element.ownerDocument.body,"drag",stopListener); - var evt = client.getEvent(e); - evt.stop(); - element.ownerDocument.onselectstart = null; - element.dragging = false; - // TODO apply for all rows - table.recalc(pid,table); - return false; - }; - - var stopListener = function (e) { - var evt = client.getEvent(e); - evt.stop(); - return false; - } - - client.addEventListener(element,"mousedown", function(e) { - var evt = client.getEvent(e); - evt.stop(); - element.dragging = true; - element.moved = false; - element.target = evt.target; - evt.target.origX = evt.mouseX; - evt.target.origW = evt.target.parentNode.offsetWidth; - client.addEventListener(element.ownerDocument.body,"mousemove", mouseDragListener); - client.addEventListener(element.ownerDocument.body,"mouseup", mouseUpListener); - client.addEventListener(element.ownerDocument.body,"drag",stopListener); - }); -} - -DefaultTheme.prototype.scrollTableRegisterLF = function(client,theme,paintableElement,inner,cout,hout,cin,hin) { - client.registerLayoutFunction(paintableElement,function() { - var w = (inner.offsetWidth-2) +"px"; - cout.style.width = w; - //cin.style.width = w; - //hout.style.width = w; - //hin.style.width = w; - hout.style.width = hout.offsetParent.offsetWidth + "px"; - //div.recalc(); - }); -} - -DefaultTheme.prototype.scrollTableAddScrollListener = function (theme,target,pid,lr,fr,rows,totalrows,fv) { - var hout = target.ownerDocument.getElementById(pid+"hout"); - var cout = target.ownerDocument.getElementById(pid+"cout"); - client.addEventListener(cout,"scroll", function (e) { - if (cout.scrollTimeout) { - clearTimeout(cout.scrollTimeout); - } - hout.scrollLeft = cout.scrollLeft; - target.scrolledLeft = cout.scrollLeft; - var status = target.ownerDocument.getElementById(pid+"status"); - var d = theme.scrollTableGetFV(cout,lr,fr,rows,totalrows,fv); - if (d!=fv) { - status.innerHTML = d + "-" + (d+rows-1) + " / " + totalrows; - status.style.display = ""; - } - cout.scrollTimeout = setTimeout(function () { - var cout = target.ownerDocument.getElementById(pid+"cout"); - cout.scrollHandler(); - },500) - }); -} -DefaultTheme.prototype.scrollTableGetFV = function(cout,lr,fr,rows,totalrows,fv) { - var rh = (lr-fr)/rows; - if (cout.scrollTop >= (fr+rh/2) || cout.scrollTop <= (fr-rh/2)) { - var d = Math.round((cout.scrollTop-fr)/rh); - d = (fv+d); - if (d<1) d=1; // scrolled past begin - if (d>(totalrows-rows+1)) d=(totalrows-rows+1); // scrolled past last page - return d; - } else { - return fv; - } - } -DefaultTheme.prototype.scrollTableAddScrollHandler = function(client,theme,cout,target,status,lr,fr,rows,totalrows,fv,fvVar,immediate) { - cout.scrollHandler = function () { - var rh = (lr-fr)/rows; - var d = theme.scrollTableGetFV(cout,lr,fr,rows,totalrows,fv); - if (d!=fv) { - // only submit if firstvisible changed - status.innerHTML = d + "-" + (d+rows-1) + " / " + totalrows + "..."; - status.style.display = ""; - // always immediate - theme.setVariable(client, fvVar, d, true); - } else { - // else realign - status.style.display = "none"; - cout.scrollTop = fr; - } - }; -} -DefaultTheme.prototype.scrollTableRecalc = function(pid,target) { - var defPad = 7; - var div = target.ownerDocument.getElementById(pid); - var wholeWidth = div.initialWidth; - var colWidths = div.colWidths; - if (!colWidths) { - colWidths = new Object(); - div.colWidths = colWidths; - } - var hout = target.ownerDocument.getElementById(pid+"hout"); - var cout = target.ownerDocument.getElementById(pid+"cout"); - var hin = target.ownerDocument.getElementById(pid+"hin"); - var cin = target.ownerDocument.getElementById(pid+"cin"); - var h = hin.getElementsByTagName("td"); - var c = cin.getElementsByTagName("td"); - var whole = 0; - var col = -1; - for (var i = 0;i<h.length;i++) { - if (!h[i].getAttribute||!h[i].getAttribute("id")||h[i].getAttribute("id").indexOf(pid+"he")<0) { - continue; - } - col++; - // colWidth, or whole width if only one column - var cw = (h.length>1?colWidths[h[i].getAttribute("cid")]:hout.clientWidth-20); - var w1 = h[i].firstChild.clientWidth + defPad; - var w2 = (c[col]?c[col].firstChild.clientWidth + defPad:0); - - var w = parseInt((cw?cw:(w1>w2?w1:w2))); - h[i].width = w; - h[i].style.width = w+"px"; - h[i].firstChild.style.width = w+"px"; - var rows = c.length/h.length; - for (var j=0;j<rows;j++) { - var idx = j*h.length+col; - if (c[idx]) { - c[idx].width = w; - c[idx].firstChild.style.width = w+"px"; - c[idx].style.width = w+"px"; - colWidths[h[i].getAttribute("cid")] = w; - } - } - whole += parseInt(w); - } -} -// Header order drag & drop -DefaultTheme.prototype.addToDragOrderGroup = function (client,theme,element,group,variable,sortVar,sortascVar,sortasc) { - element.dragGroup = group; - if (!group.elements) { - group.elements = new Array(); - } - var idx = group.elements.length; - group.elements[idx] = element; - - var mouseDragListener = function (e) { - var evt = client.getEvent(e); - evt.stop(); - element.ownerDocument.onselectstart = function() {return false;} - var target = element.target; - target.style.position = "relative"; - target.style.top = "5px"; - try { - target.style.left = -(target.origX-evt.mouseX+10)+"px"; - } catch (err) { - client.error("Failed: d&d target.style.left="+ (-(target.origX-evt.mouseX+10)+"px")); - } - var dragGroup = element.dragGroup; - dragGroup.moved = true; - var els = dragGroup.elements; - for (var i=0;i<els.length;i++) { - if (i==element.idx) continue; - var el = els[i]; - var p = client.getElementPosition(el); - if (i!=dragGroup.origIdx&&i-1!=dragGroup.origIdx&&p.x < evt.mouseX && p.x+p.w/2 > evt.mouseX) { - dragGroup.targetIdx = i; - el.style.borderLeft = "1px solid black"; - el.style.borderRight = ""; - break; - } else if (i!=dragGroup.origIdx&&i+1!=dragGroup.origIdx && p.x+p.w/2 < evt.mouseX && p.x+p.w > evt.mouseX) { - dragGroup.targetIdx = i+1; - el.style.borderRight = "1px solid black"; - el.style.borderLeft = ""; - break; - } else { - dragGroup.targetIdx = dragGroup.origIdx; - el.style.borderRight = ""; - el.style.borderLeft = ""; - } - } - } - - var mouseUpListener = function(e) { - client.removeEventListener(element.ownerDocument.body,"mousemove",mouseDragListener); - client.removeEventListener(element.ownerDocument.body,"mouseup",arguments.callee); - var evt = client.getEvent(e); - evt.stop(); - element.ownerDocument.onselectstart = null; - element.target.style.background = ""; - element.dragGroup.dragging = false; - if (element.dragGroup.dragTM) { - clearTimeout(element.dragGroup.dragTM); - } - if (!element.dragGroup.moved) { - if (sortVar) { - var cid = element.getAttribute("cid"); - var sorted = element.getAttribute("sorted"); - //alert("sorting "+element.getAttribute("cid") + " " + sorted + " " + sortasc); - if (sorted) { - theme.setVariable(client, sortascVar, !sortasc, true); - } else { - theme.setVariable(client, sortVar, cid, true); - } - } - } - var origIdx = element.dragGroup.origIdx; - var targetIdx = element.dragGroup.targetIdx; - if (origIdx != targetIdx) { - var els = element.dragGroup.elements; - var neworder = new Array(); - for (var i=0;i<els.length;i++) { - if (i==origIdx) continue; - if (i==targetIdx) { - neworder[neworder.length] = els[origIdx].getAttribute("cid"); - } - neworder[neworder.length] = els[i].getAttribute("cid"); - } - theme.setVariable(client, variable, neworder, true); - } else { - element.target.style.left = "0px"; - element.target.style.top = "0px"; - } - }; - - client.addEventListener(element,"mousedown", function(e) { - var evt = client.getEvent(e); - evt.stop(); - element.dragGroup.dragging = true; - element.dragGroup.moved = false; - element.dragGroup.origIdx = idx; - element.dragGroup.targetIdx = idx; - element.target = evt.target; - evt.target.dragGroup = element.dragGroup; - evt.target.origX = evt.mouseX; - evt.target.idx = idx; - if (element.dragGroup.dragTM) { - clearTimeout(element.dragGroup.dragTM); - } - client.addEventListener(element.ownerDocument.body,"mouseup", mouseUpListener); - if (variable) { - // column reordering allowed - group.dragTM = setTimeout(function () { - if(element.dragGroup.dragging) { - evt.target.style.background = "white"; - client.addEventListener(element.ownerDocument.body,"mousemove",mouseDragListener); - } - },100); - } - }); - //client.addEventListener(element,"mouseup", mouseUpListener); -} - -DefaultTheme.prototype.renderSelect = function(renderer,uidl,target,layoutInfo) { - - var theme = renderer.theme; - var client = renderer.client; - - // Create containing element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Create selection variable - var selectMode = uidl.getAttribute("selectmode"); - var selectable = selectMode == "multi" || selectMode == "single"; - var immediate = ("true" == uidl.getAttribute("immediate")); - var disabled = ("true" == uidl.getAttribute("disabled")); - var readonly = ("true" == uidl.getAttribute("readonly")); - var newitem = ("true" == uidl.getAttribute("allownewitem")); - var focusid = uidl.getAttribute("focusid"); - var tabindex = uidl.getAttribute("tabindex"); - - var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected")); - - // Render default header - theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - // Create select input - var select = theme.createElementTo(div,"select"); - if (focusid) select.focusid = focusid; - if (tabindex) select.tabIndex = tabindex; - if (selectMode == "multi") { - select.setAttribute("multiple", "true"); - if (newitem) { - theme.createElementTo(div,"br"); - } - } else { - if (newitem) { - theme.addCSSClass(div,"nobr"); - } - } - var options = theme.getFirstElement(uidl,"options"); - if (options != null) { - options = options.getElementsByTagName("so"); - } - if (disabled||readonly) { - select.disabled = "true"; - } else { - // Add change listener - theme.addSetVarListener(theme,client,select,"change",selectionVariable,select,immediate); - } - // Empty selection for WA compatibility - var optionNode = theme.createElementTo(select,"option"); - theme.createTextNodeTo(optionNode,"-"); - - // Selected options - if (options != null && options.length >0) { - for (var i=0; i<options.length;i++) { - var optionNode = theme.createElementTo(select,"option"); - optionNode.setAttribute("value", options[i].getAttribute("key")); - if (options[i].getAttribute("selected") == "true") { - optionNode.selected="true"; - } - theme.createTextNodeTo(optionNode,options[i].getAttribute("caption")); - } - } - - if (newitem) { - var input = theme.createInputElementTo(div,"text"); - var button = theme.createElementTo(div,"button"); - theme.createTextNodeTo(button,"+"); - var newitemVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"string","newitem")); - theme.addSetVarListener(theme,client,input,"change",newitemVariable,input,immediate); - } -} - - -DefaultTheme.prototype.renderSelectOptionGroup = function(renderer,uidl,target,layoutInfo) { - // TODO: - // - newitem currently always immediate, change - // - optiongrouphorizontal style - - var theme = renderer.theme; - var client = renderer.client; - - // Create containing element - var div = theme.createPaintableElement(renderer,uidl,target); - - // Create selection variable - var selectMode = uidl.getAttribute("selectmode"); - var selectable = selectMode == "multi" || selectMode == "single"; - var immediate = ("true" == uidl.getAttribute("immediate")); - var disabled = ("true" == uidl.getAttribute("disabled")); - var readonly = ("true" == uidl.getAttribute("readonly")); - var newitem = ("true" == uidl.getAttribute("allownewitem")); - var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected")); - - // Render default header - theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - // Create select input - var select = theme.createElementTo(div,"div"); - var options = theme.getFirstElement(uidl,"options"); - if (options != null) { - options = options.getElementsByTagName("so"); - } - - // Selected options - if (options != null && options.length >0) { - for (var i=0; i<options.length;i++) { - var optionUidl = options[i]; - var iconUrl = optionUidl.getAttribute("icon"); - var div = theme.createElementTo(select,"div", "nobr"); - var key = optionUidl.getAttribute("key"); - - // Create input - var inputName = "input"+uidl.getAttribute("id"); - var inputId = inputName+i; - var input = null; - var caption = optionUidl.getAttribute("caption"); - var html; - if (selectMode == "multi") { - html = "<input type=checkbox name=\""+inputName+"\" id=\""+inputId+"\" "; - } else { - html = "<input type=radio name=\""+inputName+"\" id=\""+inputId+"\" "; - } - if (disabled||readonly) html += " disabled=\"true\" " - if (optionUidl.getAttribute("selected") == "true") { - html += " checked=\"true\" " - } - html += " ><label class=\"clickable\" for=\""+inputId+"\">"; - if (caption) html += caption; - if (iconUrl) { - if (iconUrl.indexOf("theme://") == 0) { - iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root) - + iconUrl.substring(8); - } - html += "<IMG src=\""+iconUrl+"\" class=\"icon\">"; - } - html += "</label>"; - - div.innerHTML = html; - if (!(disabled||readonly)) { - var input = div.firstChild; - if (selectMode == "multi") { - theme.addToggleVarListener(theme,client,input,"click",selectionVariable,key,immediate); - } else { - theme.addSetVarListener(theme,client,input,"click",selectionVariable,key,immediate); - } - } - } - } - if (newitem) { - theme.createElementTo(div,"br"); - var input = theme.createInputElementTo(div,"text"); - var button = theme.createElementTo(div,"button"); - theme.createTextNodeTo(button,"+"); - var newitemVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"string","newitem")); - theme.addSetVarListener(theme,client,input,"change",newitemVariable,input,true); - } -} - -DefaultTheme.prototype.renderLabel = function(renderer,uidl,target,layoutInfo) { - - // Create container element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Create default header - var caption = renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - // Render children to div - if (uidl.childNodes.length>0) { - div = renderer.theme.createElementTo(div,"div"); - renderer.theme.renderChildNodes(renderer, uidl, div); - } - if (div.innerHTML == "") div.innerHTML = " "; -} - -DefaultTheme.prototype.renderData = function(renderer,uidl,target) { - - var html = ""; - for (var i=0; i<uidl.childNodes.length; i++) { - var child = uidl.childNodes.item(i); - if (child.nodeType == Node.ELEMENT_NODE) { - html += renderer.theme.nodeToString(child,true); - } if (child.nodeType == Node.TEXT_NODE && child.data != null) { - html += child.data; - } - } - target.innerHTML = html; - -} - -DefaultTheme.prototype.renderPre = function(renderer,uidl,target) { - - // Create pre node - var pre = renderer.theme.createElementTo(target,"pre"); - - var html = ""; - for (var i=0; i<uidl.childNodes.length; i++) { - var child = uidl.childNodes.item(i); - if (child.nodeType == Node.ELEMENT_NODE) { - html += renderer.theme.nodeToString(child,true); - } if (child.nodeType == Node.TEXT_NODE && child.data != null) { - html += child.data; - } - } - pre.innerHTML = html; -} - - -DefaultTheme.prototype.renderButton = function(renderer,uidl,target,layoutInfo) { - // Branch for checkbox - - if (uidl.getAttribute("type") == "switch") { - return renderer.theme.renderCheckBox(renderer,uidl,target,layoutInfo); - } - - // Shortcuts - var theme = renderer.theme; - var client = renderer.client; - - var disabled = "true"==uidl.getAttribute("disabled"); - var readonly = "true"==uidl.getAttribute("readonly"); - var immediate = "true"==uidl.getAttribute("immediate"); - var tabindex = uidl.getAttribute("tabindex"); - - var linkStyle = "link"==uidl.getAttribute("style"); - - var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - div = renderer.theme.createElementTo(div,"div",(linkStyle?"link clickable":"outset clickable"));; - var inner = renderer.theme.createElementTo(div,"div",(linkStyle?"pad":"border pad bg")); - - var caption = theme.renderDefaultComponentHeader(renderer,uidl,inner); - theme.addTabtoHandlers(client,theme,caption,div,tabindex,("default"==uidl.getAttribute("style"))); - - if (!disabled&&!readonly) { - // Handlers - var v = theme.getVariableElement(uidl,"boolean", "state"); - if (v != null) { - var varId = v.getAttribute("id"); - theme.addSetVarListener(theme,client,div,"click",varId,"true",immediate); - theme.addAddClassListener(theme,client,div,"mouseover","over",div); - theme.addRemoveClassListener(theme,client,div,"mouseout","over",div); - } - } - -} - -DefaultTheme.prototype.renderCheckBox = function(renderer,uidl,target,layoutInfo) { - // Shortcuts - var theme = renderer.theme; - var client = renderer.client; - - var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - var immediate = (uidl.getAttribute("immediate") == "true"); - var disabled = (uidl.getAttribute("disabled") == "true"); - var readonly = (uidl.getAttribute("readonly") == "true"); - var tabindex = uidl.getAttribute("tabindex"); - - // Create input - var div = theme.createElementTo(div,"div","nocappad nobr"); - var input = theme.createInputElementTo(div,"checkbox"); - input.setAttribute("id", "input"+uidl.getAttribute("id")); - if (tabindex) input.tabIndex = tabindex; - if (disabled||readonly) { - input.disabled = "true"; - } - - // Create label - var label = theme.createElementTo(div,"label", "clickable"); - var cap = theme.renderDefaultComponentHeader(renderer,uidl,label); - theme.addCSSClass(cap,"inline"); - label.setAttribute("for","input"+uidl.getAttribute("id")); - // Value - var v = theme.getVariableElement(uidl,"boolean", "state"); - if ( v!= null) { - var varId = v.getAttribute("id"); - input.checked = (v.getAttribute("value") == "true"); - // Attach listener - theme.addSetVarListener(theme,client,input,(immediate?"click":"change"),varId,input,immediate); - } -} - -DefaultTheme.prototype.renderChildNodes = function(renderer, uidl, to) { - for (var i=0; i<uidl.childNodes.length; i++) { - var child = uidl.childNodes.item(i); - if (child.nodeType == Node.ELEMENT_NODE) { - renderer.client.renderUIDL(child,to); - } else if (child.nodeType == Node.TEXT_NODE) { - to.appendChild(to.ownerDocument.createTextNode(child.data)); - } - } -} - -DefaultTheme.prototype.renderActionPopup = function(renderer, uidl, to, actions, actionVar, id, popupEvent) { - // Shortcuts - var theme = renderer.theme; - var client = renderer.client; - var evtName = popupEvent||"rightclick"; - - var ak = uidl.getElementsByTagName("ak"); - var len = ak.length; - if (len < 1) return; - - var popup = theme.createElementTo((to.nodeName=="TR"?to.firstChild:to),"div", "popup outset hide"); - theme.addHidePopupListener(theme,client,popup,"click"); - theme.addStopListener(theme,client,popup,"click"); - - var inner = theme.createElementTo(popup,"div", "border"); - var item = theme.createElementTo(inner,"div", "item pad clickable"); - - for (var k=0;k<len;k++) { - var key = theme.getFirstTextNode(ak[k]).data; - var item = theme.createElementTo(inner,"div", "item pad clickable"); - theme.createTextNodeTo(item,actions[key]); - item.style.color = "black"; - theme.addAddClassListener(theme,client,item,"mouseover","over"); - theme.addRemoveClassListener(theme,client,item,"mouseout","over"); - theme.addSetVarListener(theme,client,item,"click",actionVar,id+","+key,true); - theme.addHidePopupListener(theme,client,item,"click"); - theme.addStopListener(theme,client,item,"click"); - } - theme.addStopListener(theme,client,to,"contextmenu"); - //theme.addStopListener(theme,client,to,evtName); - theme.addTogglePopupListener(theme,client,to,evtName,popup); -} - - -DefaultTheme.prototype.createElementTo = function (target, tagName, cssClass) { - - if (target == null) return null; - - // Create the requested element - var e = target.ownerDocument.createElement(tagName); - - // Set CSS class if specified - if (cssClass) { - this.setCSSClass(e,cssClass); - } - - // Append to parent - target.appendChild(e); - - return e; -} - -DefaultTheme.prototype.createTextNodeTo = function (target,text) { - - // Sanity check - if (text == null || target == null) return null; - - // Create DIV as container - var tn = target.ownerDocument.createTextNode(text); - - // Append to parent - target.appendChild(tn); - - return tn; -} - -DefaultTheme.prototype.createPaintableElement = function (renderer, uidl, target,layoutInfo) { - - // And create DIV as container - var div = null; - var pid = uidl.getAttribute("id"); - var li = layoutInfo||target.layoutInfo; - if (pid != null && target.getAttribute("id") == pid){ - div = target; - } else { - //TODO: Remove this if the statement below works. - // div = renderer.theme.createElementTo(target,"div"); - div = renderer.client.createPaintableElement(uidl,target); - } - div.layoutInfo = li; - - // Remove possible previous content from target - while (div.firstChild != null) { - div.removeChild(div.firstChild); - } - - // Assign CSS class - this.setCSSDefaultClass(renderer,div,uidl); - if ("true"==uidl.getAttribute("disabled")) { - this.addCSSClass(div,"disabled"); - } - if (this.getFirstElement(uidl,"error")) { - this.addCSSClass(div,"error"); - } - - // Return reference to newly created div - return div; -} - -DefaultTheme.prototype.addCSSClass = function(element, className) { - if (element == null) return element; - if (element.className) { - var classArray = element.className.split(" "); - for (var i in classArray) { - if (classArray[i]==className) { - // allready in className - return element; - } - } - } - element.className = (element.className?element.className:"") + " " + className; - return element; -} - -DefaultTheme.prototype.removeCSSClass = function(element, className) { - if (element == null) return element; - var classArray = new Array(); - if (element.className) { - classArray = element.className.split(" "); - } - var newArray = new Array(); - for (var i in classArray) { - if (classArray[i]!=className) { - newArray[newArray.length] = classArray[i]; - } - } - element.className = newArray.join(" "); - return element; -} -DefaultTheme.prototype.toggleCSSClass = function(element, className) { - if (element == null) return element; - - var classArray = new Array(); - if (element.className) { - classArray = element.className.split(" "); - } - for (var i=0;i<classArray.length;i++) { - if (classArray[i]==className) { - this.removeCSSClass(element, className); - return; - } - } - this.addCSSClass(element, className); - - return element; -} - - -DefaultTheme.prototype.setCSSClass = function(element, className) { - if (element == null) return element; - element.className = className; - return element; -} - -DefaultTheme.prototype.getFirstElement = function(parent, elementName) { - if (parent && parent.childNodes) { - for (var i=0;i<parent.childNodes.length;i++) { - if (parent.childNodes[i].nodeName == elementName) { - return parent.childNodes[i]; - } - } - } - return null; -} - -DefaultTheme.prototype.getFirstTextNode = function(parent) { - if (parent == null || parent.childNodes == null) return null; - - var cns = parent.childNodes; - var len = cns.length; - for (var i=0; i<len; i++) { - var child = cns[i]; - if (child.nodeType == Node.TEXT_NODE) { - return child; - } - } - -} - -/** - * Removes all children of an element an element. - * - * @param element Remove children of this element. - * - * @return the element with children removed - */ -DefaultTheme.prototype.removeAllChildNodes = function(element) { - //TODO event listener leakage prevention, verify - // MOVED to client - //this.removeAllEventListeners(element); - while (element.childNodes&&element.childNodes.length > 0) { - element.removeChild(element.childNodes[0]); - } - return element; -} - -DefaultTheme.prototype.getElementContent = function(parent, elementName) { - if (elementName != null) { - // Find element and return its content - var n = this.getFirstElement(parent,elementName); - if (n == null) return null; - var tn = this.getFirstTextNode(n); - if (tn != null && tn.data != null) { - return tn.data; - } - return ""; - } else { - // If no element name is given return - // content of parent - var tn = this.getFirstTextNode(parent); - if (tn != null && tn.data != null) { - return tn.data; - } - return ""; - } -} - -DefaultTheme.prototype.setCSSDefaultClass = function(renderer,element,uidl) { - if (element == null) return element; - var cn = this.styleToCSSClass(renderer.tag,uidl.getAttribute("style")); - element.className = cn; - return element; -} - -DefaultTheme.prototype.renderDefaultComponentHeader = function(renderer,uidl,target, layoutInfo) { - var theme = renderer.theme; - var doc = renderer.doc; - - var captionText = uidl.getAttribute("caption"); - var error = this.getFirstElement(uidl,"error"); - var descriptionText = this.getElementContent(uidl,"description"); - var icon = uidl.getAttribute("icon"); - - if (!captionText && !error && !descriptionText && !icon) { - return null; - } - - if (!layoutInfo) { - layoutInfo = target.layoutInfo; - } - - // If layout info contains caption node, use it as caption position - if (layoutInfo != null && layoutInfo.captionNode) { - target = layoutInfo.captionNode; - target.innerHTML = ""; - } - - // Caption container - var caption = this.createElementTo(target,"div"); - // Create debug-mode UIDL div - if (renderer.client.debugEnabled) { - var uidlDebug = this.createElementTo(caption,"div","uidl minimized"); - renderer.client.renderHTML(uidl,uidlDebug); - var t = this; - client.addEventListener(uidlDebug,"click", function (e) { - if (uidlDebug.className.indexOf("minimized") >=0) { - t.removeCSSClass(uidlDebug,"minimized"); - } else { - t.addCSSClass(uidlDebug,"minimized"); - } - } - ); - } - if (captionText||error||descriptionText||icon) { - this.addCSSClass(caption,"caption"); - } else { - return caption; - } - if (descriptionText || error) { - this.addCSSClass(caption,"clickable"); - } - - if (error||descriptionText) { - var popup = this.renderDescriptionPopup(renderer,uidl,(captionText?caption:target)); - } - - var iconUrl = uidl.getAttribute("icon"); - - if (error) { - var icon = this.createElementTo(caption,"img","icon"); - icon.src = theme.root+"/img/icon/error-mini.gif"; - if (iconUrl) { - /* overlay icon */ - this.setCSSClass(icon,"overlay"); - } else { - this.setCSSClass(icon,"error"); - } - } else if (descriptionText) { - var icon = this.createElementTo(caption,"img","icon"); - icon.src = theme.root+"/img/icon/info-mini.gif"; - if (iconUrl) { - /* overlay icon */ - this.setCSSClass(icon,"overlay"); - } else { - this.setCSSClass(icon,"error"); - } - } - - if (iconUrl) { - if (iconUrl.indexOf("theme://") == 0) { - iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root) - + iconUrl.substring(8); - } - var icon = this.createElementTo(caption,"img","icon"); - icon.src = iconUrl; - } - // Caption text - this.createTextNodeTo(caption,captionText); - - return caption; -} - -// TODO move generalized func: -/** -* Adds a hidden button with a tabindex; adds .over to hoverTarget when focused -*/ -DefaultTheme.prototype.addTabtoHandlers = function(client,theme,target,hoverTarget,tabindex,defaultButton) { - - var d = this.createElementTo(target,"div"); - d.style.border = "none"; - d.style.background = "none"; - d.style.padding = "0px"; - d.style.margin = "0px;" - d.style.width = "0px"; - d.style.height = "0px"; - d.style.overflow = "hidden"; - - var b = this.createInputElementTo(d,(defaultButton?"submit":"button")); - - if (tabindex) b.tabIndex = tabindex; - - client.addEventListener(b,"focus", function() { - theme.addCSSClass(hoverTarget,"over"); - }); - client.addEventListener(b,"blur", function() { - theme.removeCSSClass(hoverTarget,"over"); - }); -} - - -DefaultTheme.prototype.renderDescriptionPopup = function (renderer,uidl,target) { - var theme = renderer.theme; - var doc = renderer.doc; - - var captionText = uidl.getAttribute("caption"); - var desc = this.getFirstElement(uidl,"description"); - - var error = this.getFirstElement(uidl,"error"); - var iconUrl = uidl.getAttribute("icon"); - if (!iconUrl&&desc) { - iconUrl = theme.root+"/img/icon/info.gif"; - } - - // Caption container - var popup = this.createElementTo(target,"div","outset popup hide"); - var inner = this.createElementTo(popup,"table","border pad"); - inner = this.createElementTo(inner,"tbody"); - var tr = this.createElementTo(inner,"tr"); - var td = this.createElementTo(tr,"td"); - if (iconUrl) { - if (iconUrl.indexOf("theme://") == 0) { - iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root) - + iconUrl.substring(8); - } - var icon = this.createElementTo(td,"img","icon"); - icon.src = iconUrl; - } - td = this.createElementTo(tr,"td"); - var caption = this.createElementTo(td,"div","caption"); - this.createTextNodeTo(caption,captionText); - - if (desc) { - var description = this.createElementTo(td,"div","content"); - description.innerHTML = renderer.client.getXMLtext(desc); - description.style.whiteSpace ="normal"; - } - if (error) { - tr = this.createElementTo(inner,"tr"); - td = this.createElementTo(tr,"td"); - icon = this.createElementTo(td,"img","icon"); - icon.src = theme.root+"/img/icon/error.gif"; - td = this.createElementTo(tr,"td"); - var errorDiv = this.createElementTo(td,"div","error pad"); - this.renderData(renderer,error,errorDiv); - var ew = errorDiv.ownerDocument.getElementById("error-window"); - if (ew) { - ew.innerHTML += "<DIV><B>"+captionText+":</B> "+errorDiv.innerHTML+"</DIV><BR/>"; - ew.style.display = "inline"; - } - } - if (desc||error) { - this.addTogglePopupListener(theme,client,target,"mouseover",popup,1000,500,target); - //theme.addTogglePopupListener(theme,client,target,"click",popup,0,500); - this.addHidePopupListener(theme,client,popup,"click",popup); - this.addHidePopupListener(theme,client,target,"mouseout",popup); - this.addHidePopupListener(theme,client,popup,"mouseout",popup); - } - - return popup; -} - -DefaultTheme.prototype.styleToCSSClass = function(prefix,style) { - - var s = ""; - if (prefix != null) { - s = prefix; - } - if (style != null) { - if (s.length > 0) { - s = s + "-"; - } - s = s + style; - } - return s -} - -DefaultTheme.prototype.getChildElements = function(parent, tagName) { - - if (parent == null || parent.childNodes == null || tagName == null) return null; - - // Iterate all child nodes - var res = new Array(); - for (var i=0; i < parent.childNodes.length; i++) { - var n = parent.childNodes[i]; - if (n.nodeType == Node.ELEMENT_NODE && n.nodeName == tagName) { - res[res.length++] = n; - } - } - return res; -} - -DefaultTheme.prototype.getVariableElement = function(uidl,type,name) { - - if (uidl == null) return; - - var nodes = this.getChildElements(uidl,type); - if (nodes != null) { - for (var i=0; i < nodes.length; i++) { - if (nodes[i].getAttribute("name") == name) { - return nodes[i]; - } - } - } - return null; -} - - -DefaultTheme.prototype.applyWidthAndHeight = function(uidl,target) { - if (target == null || uidl == null) return; - - - // Width - var widthEl = this.getVariableElement(uidl,"integer","width"); - if (widthEl) { - var w = widthEl.getAttribute("value"); - if (w > 0) { - target.style.width = ""+w+"px"; - } - } - - // Height - var heightEl = this.getVariableElement(uidl,"integer","height"); - if (heightEl) { - var h = heightEl.getAttribute("value"); - if (h > 0) { - target.style.height = ""+h+"px"; - } - } -} - -DefaultTheme.prototype.createInputElementTo = function(target,type,className,focusid) { - - var input = null; - if (document.all) { - // IE only - input = this.createElementTo(target,"<input type='"+type+"'>"); - } else { - // Other browsers - input = this.createElementTo(target,"input"); - input.type = type; - } - - // Assign class - if (className != null && className != "") { - this.setCSSClass(input,className); - } - - if (focusid) input.focusid = focusid; - - return input; -} - -DefaultTheme.prototype.createVariableElementTo = function(target,variableElement) { - if (!variableElement) { - return null; - } - var input = this.createInputElementTo(target,"hidden"); - input.variableId = variableElement.getAttribute("id"); - input.variableName = variableElement.getAttribute("name"); - if (variableElement.nodeName == "array") { - input.variableId = "array:"+input.variableId; - input.value = this.arrayToList(variableElement); - } else if (variableElement.nodeName == "string") { - var node = this.getFirstTextNode(variableElement); - input.value = (node?node.data:""); - } else { - input.value = variableElement.getAttribute("value"); - } - return input; -} - -DefaultTheme.prototype.getVariableElementValue = function(variableElement) { - if ( variableElement == null) { - return null; - } - - if (variableElement.nodeName == "array") { - return this.arrayToList(variableElement); - } else if (variableElement.nodeName == "string") { - var node = this.getFirstTextNode(variableElement); - return (node?node.data:""); - } else { - return variableElement.getAttribute("value"); - } - return null; -} -DefaultTheme.prototype.setVariable = function(client, variableNode, newValue, immediate) { - if (variableNode == null) return; - variableNode.value = newValue; - client.changeVariable(variableNode.variableId, newValue, immediate); -} -DefaultTheme.prototype.addArrayVariable = function(client, variableNode, newValue, immediate) { - if (variableNode == null) return; - variableNode.value = this.listAddInt(variableNode.value,newValue); - client.changeVariable(variableNode.variableId, variableNode.value, immediate); -} -DefaultTheme.prototype.toggleArrayVariable = function(client, variableNode, value, immediate) { - if (variableNode == null) return; - if (this.listContainsInt(variableNode.value,value)) { - variableNode.value = this.listRemoveInt(variableNode.value,value); - } else { - variableNode.value = this.listAddInt(variableNode.value,value); - } - client.changeVariable(variableNode.variableId, variableNode.value, immediate); -} -DefaultTheme.prototype.removeArrayVariable = function(client, variableNode, value, immediate) { - if (variableNode == null) return; - variableNode.value = this.listRemoveInt(variableNode.value,value); - client.changeVariable(variableNode.variableId, variableNode.value, immediate); -} - -DefaultTheme.prototype.arrayToList = function(arrayVariableElement) { - - var list = ""; - if (arrayVariableElement == null || arrayVariableElement.childNodes == null) return list; - - var items = arrayVariableElement.getElementsByTagName("ai"); - if (items == null) return list; - - for (var i=0; i <items.length;i++) { - var v = this.getFirstTextNode(items[i]); - if (v != null && v.data != null) { - if (list.length >0) list += ","; - list += v.data; - } - } - - return list; -} - -/** - * Check if integer list contains a number. - * - * @param list Comma separated list of integers - * @param number Number to be tested - * - * @return true iff the number can be found in the list - */ - -DefaultTheme.prototype.listContainsInt = function(list,number) { - if (!list) return false; - a = list.split(","); - - for (i=0;i<a.length;i++) { - if (a[i] == number) return true; - } - - return false; -} - - -/** Add number to integer list, if it does not exit before. - * - * - * @param list Comma separated list of integers - * @param number Number to be added - * - * @return new list - */ - -DefaultTheme.prototype.listAddInt = function(list,number) { - - if (this.listContainsInt(list,number)) - return list; - - if (list == "") return number; - else return list + "," + number; -} - - -/** Remove number from integer list. - * - * @param list Comma separated list of integers - * @param number Number to be removed - * - * @return new list - */ -DefaultTheme.prototype.listRemoveInt = function(list,number) { - if (!list) return ""; - retval = ""; - a = list.split(','); - - for (i=0;i<a.length;i++) { - if (a[i] != number) { - if (i == 0) retval += a[i]; - else retval += "," + a[i]; - } - } - return retval; -} - - -/** Show popup at specified position. - * Hides previous popup. - * - * @param popup The element to popup - * @param x horizontal popup position - * @param y vertical popup position - * @param delay delay before popping up - * @param defWidth (optional) default width for the popup - * - */ -DefaultTheme.prototype.showPopup = function(client,popup, x, y, delay, defWidth) { - if (this.popupTimeout) { - clearTimeout(this.popupTimeout); - delete this.popupTimeout; - } - if (!popup) { - var popup = this.popup; - this.popupShowing = true; - var scrollTop = (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop); - var scrollLeft = (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft); - var docWidth = document.body.clientWidth; - var docHeight = document.body.clientHeight; - this.removeCSSClass(popup,"hide"); - - var ua = navigator.userAgent.toLowerCase(); - if (ua.indexOf("msie")>=0) { - var sels = popup.ownerDocument.getElementsByTagName("select"); - if (sels) { - var len = sels.length; - var hidden = new Array(); - for (var i=0;i<len;i++) { - var sel = sels[i]; - if (sel.style&&sel.style.display!="none") { - sel.style.visibility = "hidden"; - hidden[hidden.length] = sel; - } - } - this.popupSelectsHidden = hidden; - } - } - /* TODO fix popup width & position */ - return; - } - if (!delay) var delay = 0; - if (this.popup && this.popup != popup) { - this.hidePopup(); - } - this.popup = popup; - popup.style.left = 0+"px"; - popup.style.top = 0+"px"; - this.removeCSSClass(popup,"hide"); - var p = client.getElementPosition(popup); - this.addCSSClass(popup,"hide"); - // TODOO!!! width not working properly - if (p.w > document.body.clientWidth/2) { - popup.style.width = Math.round(document.body.clientWidth/2)+"px"; - p.w = Math.round(document.body.clientWidth/2); - } - - var posX = x||p.x; - var posY = y||p.y; - if (posX+p.w>document.body.clientWidth) { - posX = document.body.clientWidth-p.w; - if (posX<0) posX=0; - } - if (posY+p.h>document.body.clientHeight) { - posY = document.body.clientHeight-p.h; - if (posY < 0) posY =0; - } - - if (p.h > document.body.clientHeight -20) { - popup.style.height = document.body.clientHeight -20 + "px"; - popup.style.overflow = "auto"; - posX -= 20; - } - - - popup.style.left = posX+"px"; - popup.style.top = posY+"px"; - - if (delay > 0) { - with ({theme:this}) { - theme.popupTimeout = setTimeout(function(){ - theme.showPopup(client); - }, delay); - } - } else { - this.showPopup(client); - } -} -/** Hides previous popup. - */ -DefaultTheme.prototype.hidePopup = function() { - if (this.popupSelectsHidden) { - var len = this.popupSelectsHidden.length; - for (var i=0;i<len;i++) { - var sel = this.popupSelectsHidden[i]; - sel.style.visibility = "visible"; - } - this.popupSelectsHidden = null; - } - - if (this.popup) { - this.addCSSClass(this.popup,"hide"); - this.popupShowing = false; - } - if (this.popupTimeout) { - clearTimeout(this.popupTimeout); - delete this.popupTimeout; - } -} -/** Shows the popup if it's not currently shown, - * hides the popup otherwise. - * Hides previous popup. - * - * @param popup The element to popup - * @param x horizontal popup position - * @param y vertical popup position - * @param delay delay before popping up - * @param defWidth (optional) default width for the popup - * - */ -DefaultTheme.prototype.togglePopup = function(popup, x, y, delay, defWidth) { - if (this.popup == popup && this.popupShowing) { - this.hidePopup(); - } else { - this.showPopup(client,popup,x,y,delay,defWidth); - } -} - -DefaultTheme.prototype.nodeToString = function(node, deep) { - - if (node == null) { - return ""; - } else if (node.nodeType == Node.TEXT_NODE) { - // Render text nodes. - if (node.data) { - return node.data; - } else { - return ""; - } - - } else if (node.nodeType == Node.ELEMENT_NODE) { - - // Renderer element nodes. - var txt = "<" + node.nodeName; - if (node.attributes.length > 0) - for(var i=0; i<node.attributes.length; i++) { - var a = node.attributes.item(i); - txt += " " + a.name + "=\"" + a.value+"\""; - } - if (deep && node.childNodes != null && node.childNodes.length >0) { - txt += ">"; - for (var i=0; i<node.childNodes.length; i++) { - var c = node.childNodes.item(i); - txt += this.nodeToString(c,deep); - } - txt += "</"+node.nodeName+">"; - } else { - txt += "/>"; - } - return txt; - } - - return ""+node.nodeName + "-node"; -} - - -// EVENTS -DefaultTheme.prototype.addAddClassListener = function(theme,client,element,event,className,target,current) { - client.addEventListener(element,event, function(e) { - if (current) { - if (current.length) { - var length = current.length; - while (length--) { - theme.removeCSSClass(current[length],className); - delete current[length]; - } - } else { - for (e in current) { - theme.removeCSSClass(current[e],className); - delete current[e]; - } - } - } - theme.addCSSClass((target?target:element),className); - if (current) { - current[current.length] = (target?target:element); - } - } - ); -} -DefaultTheme.prototype.addRemoveClassListener = function(theme,client,element,event,className,target) { - client.addEventListener(element,event, function(e) { - theme.removeCSSClass((target?target:element),className); - } - ); -} -DefaultTheme.prototype.addToggleClassListener = function(theme,client,element,event,className,target) { - client.addEventListener(element,event, function(e) { - theme.toggleCSSClass((target?target:element),className); - } - ); -} -DefaultTheme.prototype.addStopListener = function(theme,client,element,event) { - client.addEventListener(element, event, function(e) { - var evt = client.getEvent(e); - evt.stop(); - return false; - } - ); -} -DefaultTheme.prototype.addSetVarListener = function(theme,client,element,event,variable,key,immediate) { - client.addEventListener(element,event, function(e) { - var value = ""; - if (typeof(key)=="string") { - value = key; - } else if (key.type=="checkbox"||key.type=="radio") { - value = key.checked; - } else if (key.type=="select-multiple") { - var s = new Array(); - for (var i = 0; i < key.options.length; i++) { - if (key.options[i].selected) { - s[s.length] = key.options[i].value; - } - } - value = s.join(','); - } else { - value = key.value; - } - if (typeof(variable) == "string") { - client.changeVariable(variable,value,immediate); - } else { - theme.setVariable(client,variable,value,immediate); - } - } - ); -} -DefaultTheme.prototype.addRemoveVarListener = function(theme,client,element,event,variable,key,immediate) { - client.addEventListener(element,event, function(e) { - theme.removeArrayVariable(client,variable,key,immediate); - } - ); -} -DefaultTheme.prototype.addAddVarListener = function(theme,client,element,event,variable,key,immediate) { - client.addEventListener(element,event, function(e) { - theme.addArrayVariable(client,variable,key,immediate); - } - ); -} -DefaultTheme.prototype.addToggleVarListener = function(theme,client,element,event,variable,key,immediate) { - client.addEventListener(element,event, function(e) { - theme.toggleArrayVariable(client,variable,key,immediate); - } - ); -} -DefaultTheme.prototype.addExpandNodeListener = function(theme,client,img,event,subnodes,expandVariable,collapseVariable,key,immediate,target) { - client.addEventListener((target?target:img), event, function(e) { - if (img.expanded == "true") { - theme.removeArrayVariable(client,expandVariable,key,false); - theme.addArrayVariable(client,collapseVariable,key,immediate); - img.src = theme.root + "img/tree/off.gif"; - img.expanded = "false"; - } else { - theme.removeArrayVariable(client,collapseVariable,key,false); - theme.addArrayVariable(client,expandVariable,key,immediate || - !img.expanded || !subnodes.childNodes || subnodes.childNodes.length <= 0); - img.src = theme.root + "img/tree/on.gif"; - img.expanded = "true"; - } - } - ); -} - -DefaultTheme.prototype.addTogglePopupListener = function(theme,client,element,event,popup,delay,defWidth,popupAt) { - client.addEventListener(element,(event=="rightclick"?"mouseup":event), function(e) { - var evt = client.getEvent(e); - if (event=="rightclick"&&!evt.rightclick) return; - if(evt.target.nodeName == "INPUT" || evt.target.nodeName == "SELECT") return; - if (evt.alt) return; - if (popupAt) { - var p = client.getElementPosition(popupAt); - theme.togglePopup(popup,p.x,(p.y+p.h),(delay?delay:0),(defWidth?defWidth:100)); - } else { - theme.togglePopup(popup,evt.mouseX,evt.mouseY,(delay?delay:0),(defWidth?defWidth:100)); - } - evt.stop(); - } - ); -} -DefaultTheme.prototype.addShowPopupListener = function(theme,client,element,event,popup,delay,defWidth) { - client.addEventListener(element,(event=="rightclick"?"click":event), function(e) { - var evt = client.getEvent(e); - if (event=="rightclick"&&!evt.rightclick) return; - - theme.showPopup(client,popup,evt.mouseX,evt.mouseY,(delay?delay:0),(defWidth?defWidth:100)); - evt.stop(); - } - ); -} -// TODO dontstop -> stop in all listeners -DefaultTheme.prototype.addHidePopupListener = function(theme,client,element,event,dontstop) { - client.addEventListener(element,(event=="rightclick"?"click":event), function(e) { - var evt = client.getEvent(e); - if (evt.alt) return; - if (event=="rightclick"&&!evt.rightclick) return; - theme.hidePopup(); - if (!dontstop) { - evt.stop(); - } - } - ); -} - - - -/////// - -/** - * Render tree as a menubar. - * NOTE: - * First level nodes are not selectable - menu opens with click. - * If style == "coolmenu", immediate is forced. - * - */ - -DefaultTheme.prototype.renderTreeMenu = function(renderer,uidl,target,layoutInfo) { - - var theme = renderer.theme; - - // Create container element - var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); - if (uidl.getAttribute("invisible")) return; // Don't render content if invisible - - // Get tree attributes - var style = uidl.getAttribute("style"); - var immediate = ("true" == uidl.getAttribute("immediate")||style=="coolmenu"); - var disabled = ("true" == uidl.getAttribute("disabled")); - var readonly = ("true" == uidl.getAttribute("readonly")); - var selectMode = uidl.getAttribute("selectmode"); - var selectable = selectMode == "multi" || selectMode == "single"; - var selected; - if (selectable) { - selected = new Object(); - } - var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected")); - var expandVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","expand")); - var collapseVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","collapse")); - - var actions = null; - var actionVar = null; - var alNode = theme.getFirstElement(uidl,"actions") - if (alNode) { - actionVar = theme.createVariableElementTo(div,theme.getVariableElement(alNode,"string","action")); - actions = new Object(); - var ak = alNode.getElementsByTagName("action"); - for (var i=0;i<ak.length;i++) { - actions[ak[i].getAttribute("key")] = ak[i].getAttribute("caption"); - } - } - delete alNode; - - // Create default header - var caption = renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo); - - // Content DIV - var content = theme.createElementTo(div,"div","content menu"); - - // Iterate all nodes - for (var i = 0; i< uidl.childNodes.length;i++) { - var node = uidl.childNodes[i]; - if (node.nodeName == "node" || node.nodeName == "leaf") { - theme.renderTreeMenuNode(renderer,node,content,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly,0); - } - } -} - -DefaultTheme.prototype.renderTreeMenuNode = function(renderer,node,target,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly,level) { - - var theme = renderer.theme; - var client = renderer.client; - - var n = theme.createElementTo(target,"div",(level==0?"inline clickable":"clickable")); - - - // Caption - var cap = theme.createElementTo(n,"div","inline caption pad"); - theme.createTextNodeTo(cap,node.getAttribute("caption")); - - // Expand/collapse/spacer button - var img = theme.createElementTo(n,"img","icon"); - img.align = "absbottom"; - var key = node.getAttribute("key"); - var icon = node.getAttribute("icon"); - if (icon) { - var iconurl = theme.root+icon.split("theme:")[1]; - var iimg = theme.createElementTo(n,"img","icon"); - iimg.src = iconurl; - } - - - // Hover effects - if (!disabled&&!readonly) { - theme.addAddClassListener(theme,client,n,"mouseover","selected",n); - theme.addRemoveClassListener(theme,client,n,"mouseout","selected",n); - } - - // Server-side selection - if (selectable && node.getAttribute("selected") == "true") { - theme.addCSSClass(n,"selected"); - selected[key] = n; - } - - // Indicate selection - if (theme.listContainsInt(selectionVariable.value,key)) { - theme.addCSSClass(n, "selected"); - } - - // Selection listeners - if (selectable && !disabled && (level != 0 || node.nodeName == "leaf")) { - if (!readonly) { - if (selectMode == "single") { - theme.addAddClassListener(theme,client,n,"click","selected",n,selected); - theme.addSetVarListener(theme,client,n,"click",selectionVariable,key,immediate); - - } else if (selectMode == "multi") { - theme.addToggleClassListener(theme,client,n,"click","selected"); - theme.addToggleVarListener(theme,client,n,"click",selectionVariable,key,immediate); - - } - } - } - - // Actions - if (!disabled && !readonly) { - for (var i = 0; i< node.childNodes.length;i++) { - var childNode = node.childNodes[i]; - if (childNode.nodeName == "al" ) { - theme.renderActionPopup(renderer,childNode,n,actions,actionVar,key,1); // TODO check - } - } - } - - // Render all sub-nodes - if (node.nodeName == "node") { - var subnodes = theme.createElementTo(target,"div","hide popup"); - var inner = theme.createElementTo(subnodes,"div","border"); - theme.addTogglePopupListener(theme,client,n,(level==0?"click":"mouseover"),subnodes,0,null,n); - //theme.addToggleClassListener(theme,client,n,(level==0?"click":"mouseover"),"hide",subnodes) - if (node.childNodes != null && node.childNodes.length >0) { - img.src = theme.root + "img/tree/empty.gif"; - img.expanded = "true"; - } else { - img.src = theme.root + "img/tree/empty.gif"; - img.expanded = "false"; - } - for (var i = 0; i< node.childNodes.length;i++) { - var childNode = node.childNodes[i]; - if (childNode.nodeName == "node" || childNode.nodeName == "leaf") { - theme.renderTreeMenuNode(renderer,childNode,inner,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly,level+1); - } - } - - // Add event listener - if (!disabled&&level!=0) { - var target = (selectable&&!readonly?img:n); - theme.addToggleClassListener(theme,client,target,"mouseup","hidden",subnodes); - theme.addExpandNodeListener(theme,client,img,"mouseup",subnodes,expandVariable,collapseVariable,key,immediate,target); - theme.addStopListener(theme,client,target,"mouseup"); - theme.addStopListener(theme,client,target,"click"); - } - - } else { - img.src = theme.root + "img/tree/empty.gif"; - } -} - - - -/** -* 5.6.2006 - Jouni Koivuviita -* New innerHTML components -* RENAMED for testing both - marc -*/ - -DefaultTheme.prototype.renderNewPanel = function(renderer,uidl,target,layoutInfo) { - // Shortcuts - var theme = renderer.theme; - var style = uidl.getAttribute("style"); - // Create component element - var div = theme.createPaintableElement(renderer,uidl,target); - - /* New panel theme, 8.6.2006 - Jouni Koivuviita */ - div.innerHTML = "<div class=\"top\"><div class=\"right\"></div><div class=\"left\"><div class=\"title\"></div></div></div><div class=\"middle\"></div><div class=\"bottom\"><div class=\"right\"></div><div class=\"left\"></div></div>"; - var cap = div.firstChild.firstChild.nextSibling.firstChild; - var content = div.childNodes[1]; - theme.applyWidthAndHeight(uidl,div.childNodes[1],"height"); - theme.applyWidthAndHeight(uidl,div,"width"); - - /* - div.innerHTML = "<TABLE width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><TR height=\"35\"><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-left.png\"></TD><TD style=\"background: url('"+theme.root+"img/top.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/top.png', sizingMethod='scale');\"></TD><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-right.png\"></TD></TR><TR><TD style=\"background: url('"+theme.root+"img/left.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/left.png', sizingMethod='scale');\"></TD><TD bgcolor=white></TD><TD style=\"background: url('"+theme.root+"img/right.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/right.png', sizingMethod='scale');\"></TD></TR><TR height=\"12\"><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-left.png\"></TD><TD style=\"background: url('"+theme.root+"img/bottom.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/bottom.png', sizingMethod='scale');\"></TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-right.png\"></TD></TR></TABLE>"; - var cap = div.firstChild.firstChild.firstChild.childNodes[1]; - var content = div.firstChild.firstChild.childNodes[1].childNodes[1]; - */ - - theme.renderDefaultComponentHeader(renderer,uidl,cap); - theme.renderChildNodes(renderer, uidl, content); -} - -DefaultTheme.prototype.renderNewPanelModal = function(renderer,uidl,target,layoutInfo,alignment) { - // Shortcuts - var theme = renderer.theme; - //var parentTheme = theme.parent; - // Create component element - var div = theme.createPaintableElement(renderer,uidl,target); - var html = "<IFRAME frameborder=\"0\" style=\"border:none;z-index:9997;position:absolute;top:0px;left:0px;width:100%;height:100%;background-color:white;filter: alpha(opacity=80);opacity:0.8;\"></IFRAME>"; - html += "<DIV align=\"center\" style=\"position:absolute;top:0px;width:100%;left:0px;z-index:9999;filter: alpha(opacity=100);opacity:1;\"><TABLE cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><TR height=\"35\"><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-left.png\"></TD><TD style=\"background: url('"+theme.root+"img/top.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/top.png', sizingMethod='scale');\"></TD><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-right.png\"></TD></TR><TR><TD style=\"background: url('"+theme.root+"img/left.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/left.png', sizingMethod='scale');\"></TD><TD bgcolor=white ></TD><TD style=\"background: url('"+theme.root+"img/right.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/right.png', sizingMethod='scale');\"></TD></TR><TR height=\"12\"><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-left.png\"></TD><TD style=\"background: url('"+theme.root+"img/bottom.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/bottom.png', sizingMethod='scale');\"></TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-right.png\"></TD></TR></TABLE><DIV>"; - div.innerHTML = html; - var overlay = div.firstChild; - overlay.style.width = div.ownerDocument.body.offsetWidth + "px"; - overlay.style.height = div.ownerDocument.body.offsetHeight + "px"; - var table = div.childNodes[1].firstChild; - var cap = table.firstChild.firstChild.childNodes[1]; - var content = table.firstChild.childNodes[1].childNodes[1]; - - theme.renderDefaultComponentHeader(renderer,uidl,cap); - theme.renderChildNodes(renderer, uidl, content); - - var ifrdiv = theme.createElementTo(div,"div"); - - html = "<IFRAME frameborder=\"0\" style=\"border:none;z-index:9998;position:absolute;top:"+(div.childNodes[1].offsetTop+5)+"px;left:"+(table.offsetLeft+5)+"px;width:"+(table.offsetWidth-7)+"px;height:"+(table.offsetHeight-7)+"px;background-color:white;filter: alpha(opacity=100);opacity:1;\"></IFRAME>"; - ifrdiv.innerHTML += html; -} - -DefaultTheme.prototype.renderNewPanelLight = function(renderer,uidl,target,layoutInfo) { - // Shortcuts - var theme = renderer.theme; - var style = uidl.getAttribute("style"); - // Create component element - var div = theme.createPaintableElement(renderer,uidl,target); - - div.innerHTML = "<TABLE width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><TR><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-left-lite.png\"></TD><TD style=\"background: url('"+theme.root+"img/top-lite.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/top-lite.png', sizingMethod='scale');\"></TD><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-right-lite.png\"></TD></TR><TR><TD style=\"background: url('"+theme.root+"img/left.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/left.png', sizingMethod='scale');\"></TD><TD bgcolor=white></TD><TD style=\"background: url('"+theme.root+"img/right.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/right.png', sizingMethod='scale');\"></TD></TR><TR><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-left.png\"></TD><TD style=\"background: url('"+theme.root+"img/bottom.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/bottom.png', sizingMethod='scale');\"></TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-right.png\"></TD></TR></TABLE>"; - - var content = div.firstChild.firstChild.childNodes[1].childNodes[1]; - - theme.renderDefaultComponentHeader(renderer,uidl,content); - theme.renderChildNodes(renderer, uidl, content); -} - -DefaultTheme.prototype.renderNewPanelNone = function(renderer,uidl,target,layoutInfo) { - // Shortcuts - var theme = renderer.theme; - var style = uidl.getAttribute("style"); - // Create component element - var div = theme.createPaintableElement(renderer,uidl,target); - - var content = theme.createElementTo(div,"div"); - - theme.renderDefaultComponentHeader(renderer,uidl,content); - theme.renderChildNodes(renderer, uidl, content); -} - -DefaultTheme.prototype.renderNewTabSheet = function(renderer,uidl,target,layoutInfo) { - // Shortcuts - var theme = renderer.theme; - - // Create component element - var div = theme.createPaintableElement(renderer,uidl,target); - if (uidl.getAttribute("invisible")) return; - - var style = uidl.getAttribute("style"); - var disabled = ("true"==uidl.getAttribute("disabled")); - - var cdiv = theme.createElementTo(div,"div"); - var caption = theme.renderDefaultComponentHeader(renderer,uidl,cdiv,layoutInfo); - div = theme.createElementTo(div,"div"); - - // Tabs - var tabNodes = theme.getChildElements(uidl,"tabs"); - if (tabNodes != null && tabNodes.length >0) tabNodes = theme.getChildElements(tabNodes[0],"tab"); - var selectedTabNode = null; - if (tabNodes != null && tabNodes.length >0) { - var html = "<TABLE width=\"100%\" class=\"tabsheet-table\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><TBODY>"; - html += "<TR valign=\"bottom\"><TD></TD>"; - - var posttabs = "<TR valign=\"top\"><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/top-left-lite.png\"/></TD>"; - var len = tabNodes.length; - for (var i=0; i<len;i++) { - var tab = tabNodes[i]; - var caption = tab.getAttribute("caption"); - var icon = tab.getAttribute("icon"); - if (icon) icon = theme.root+icon.split("theme://")[1]; - var selected = ("true"==tab.getAttribute("selected")); - var disabled = ("true"==tab.getAttribute("disabled")); - var offset = (selected?6:4); - - var variant = ""; - if (disabled) { - variant = "-dis"; - } else if (selected) { - variant = "-on"; - } - - if (selected) selectedTabNode = tab; - - html += "<TD width=\"1\" align=\"right\"><IMG onload=\"png(this);\" onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/top-left"+variant+".png\"/></TD><TD class=\""+(disabled?"caption":"caption clickable")+"\" style=\"background-image: url('"+theme.root+"img/tabsheet/top"+variant+".png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/top"+variant+".png', sizingMethod='scale');\">" - html += "<DIV style=\"padding-top:0.5em;\" class=\"caption"+(selected&&!disabled?"":" clickable")+"\">"; - if (icon) html += "<IMG onload=\"png(this);\" class=\"icon\" src=\""+icon+"\"/>"; - html += caption+"</DIV>"; - html += "</TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/top-right"+variant+".png\"/></TD>"; - - - // POSTTABS - posttabs += "<TD align=\"right\" style=\"background-image: url('"+theme.root+"img/tabsheet/top-lite.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/top-lite.png', sizingMethod='scale');\"><IMG onload=\"png(this);\" height=\""+(selected?6:4)+"\" width=\"8\" src=\""+theme.root+"img/tabsheet/tab-left.png\"/></TD><TD "+(selected?"bgcolor=\"white\"":"style=\"background-image: url('"+theme.root+"img/tabsheet/top-lite.png') !important;background: white;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/top-lite.png', sizingMethod='scale');\"")+"></TD><TD style=\"background-image: url('"+theme.root+"img/tabsheet/top-lite.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/top-lite.png', sizingMethod='scale');\"><IMG onload=\"png(this);\" height=\""+(selected?6:4)+"\" width=\"8\" src=\""+theme.root+"img/tabsheet/tab-right.png\"/></TD>"; - } - html += "<TD width=\"100%\"></TD></TR>"+posttabs+"<TD style=\"background-image: url('"+theme.root+"img/tabsheet/top-lite.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/top-lite.png', sizingMethod='scale');\" ></TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/top-right-lite.png\"/></TD></TR>"; - - //Content - html +="</TBODY></TABLE><TABLE width=\"100%\" class=\"tabsheet-table\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><TBODY><TR valign=\"top\"><TD style=\"width:12px;background-image: url('"+theme.root+"img/tabsheet/left.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/left.png', sizingMethod='scale');\"></TD><TD style=\"width:100% !important;width:auto;\" class=\"tabsheet-content\" bgcolor=\"white\" colspan=\""+(len*3+1)+"\"><DIV></DIV></TD><TD width=\"12\" style=\"background-image: url('"+theme.root+"img/tabsheet/right.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/right.png', sizingMethod='scale');\"></TD></TR>"; - html += "<TR height=\"12\" valign=\"top\"><TD width=\"8\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/bottom-left.png\"></TD><TD style=\"background-image: url('"+theme.root+"img/tabsheet/bottom.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/bottom.png', sizingMethod='scale');\" colspan=\""+(len*3+1)+"\"></TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/bottom-right.png\"></TD></TR></TBODY></TABLE>"; - div.innerHTML = html; - - // TODO click listeners - - if (!disabled) { - var varId = theme.getVariableElement(uidl,"string","selected").getAttribute("id"); - for (var i=0; i<len;i++) { - var tabNode = tabNodes[i]; - if (tabNode == selectedTabNode||("true"==tabNode.getAttribute("disabled"))) continue; - var key = tabNode.getAttribute("key"); - var tab = div.firstChild.firstChild.firstChild.childNodes[2+i*3]; - theme.addAddClassListener(theme,client,tab,"mouseover","over",tab); - theme.addRemoveClassListener(theme,client,tab,"mouseout","over",tab); - theme.addSetVarListener(theme,client,tab,"click",varId,key,true); - } - } - - var content = div.childNodes[1].firstChild.firstChild.childNodes[1]; - if (selectedTabNode) { - theme.renderChildNodes(renderer,selectedTabNode, content); - } - - } - +// IE DOM Node support
+if(document.all) {
+ Node = new Object();
+ Node.ELEMENT_NODE = 1;
+ Node.ATTRIBUTE_NODE = 2;
+ Node.TEXT_NODE = 3;
+ Node.CDATA_SECTION_NODE = 4;
+ Node.ENTITY_REFERENCE_NODE = 5;
+ Node.ENTITY_NODE = 6;
+ Node.PROCESSING_INSTRUCTION_NODE = 7;
+ Node.COMMENT_NODE = 8;
+ Node.DOCUMENT_NODE = 9;
+ Node.DOCUMENT_TYPE_NODE = 10;
+ Node.DOCUMENT_FRAGMENT_NODE = 11;
+ Node.NOTATION_NODE = 12;
+}
+
+/** Default theme constructor.
+ *
+ * @param themeRoot The base URL for theme resources.
+ * @constructor
+ *
+ */
+function DefaultTheme(themeRoot) {
+ this.themeName = "DefaultTheme";
+
+ // Store the the root URL
+ this.root = themeRoot;
+}
+
+/** Register all renderers to a ajax client.
+ *
+ * @param client The ajax client instance.
+ */
+DefaultTheme.prototype.registerTo = function(client) {
+
+ // This hides all integer, string, etc. variables
+ client.registerRenderer(this,"integer",null,function() {});
+ client.registerRenderer(this,"string",null,function() {});
+ // and special tags
+ client.registerRenderer(this,"description",null,function() {});
+ client.registerRenderer(this,"error",null,function() {});
+ client.registerRenderer(this,"actions",null,function() {});
+
+
+ // Register renderer functions
+ client.registerRenderer(this,"component",null,this.renderComponent);
+ client.registerRenderer(this,"label",null,this.renderLabel);
+ client.registerRenderer(this,"data",null,this.renderData);
+ client.registerRenderer(this,"pre",null,this.renderData);
+ client.registerRenderer(this,"link",null,this.renderLink);
+ client.registerRenderer(this,"button",null,this.renderButton);
+ client.registerRenderer(this,"textfield",null,this.renderTextField);
+ client.registerRenderer(this,"datefield",null,this.renderDateField);
+ client.registerRenderer(this,"datefield","calendar",this.renderDateFieldCalendar);
+ client.registerRenderer(this,"select",null,this.renderSelect);
+ client.registerRenderer(this,"select","optiongroup",this.renderSelectOptionGroup);
+ client.registerRenderer(this,"upload",null,this.renderUpload);
+ client.registerRenderer(this,"embedded",null,this.renderEmbedded);
+
+ client.registerRenderer(this,"window",null,this.renderWindow);
+ client.registerRenderer(this,"framewindow",null,this.renderFramewindow);
+ client.registerRenderer(this,"open",null,this.renderOpen);
+
+ client.registerRenderer(this,"panel",null,this.renderPanel);
+ client.registerRenderer(this,"orderedlayout",null,this.renderOrderedLayout);
+ client.registerRenderer(this,"customlayout",null,this.renderCustomLayout);
+ client.registerRenderer(this,"gridlayout",null,this.renderGridLayout);
+ client.registerRenderer(this,"tabsheet",null,this.renderTabSheet);
+
+ client.registerRenderer(this,"table",null,this.renderScrollTable);
+ client.registerRenderer(this,"tree",null,this.renderTree);
+ client.registerRenderer(this,"tree","coolmenu",this.renderTreeMenu);
+ //client.registerRenderer(this,"tree","menu",this.renderTreeMenu);
+};
+
+/*
+#### DOM functions ########################################################
+*/
+
+DefaultTheme.prototype.createElementTo = function (target, tagName, cssClass) {
+
+ if (target == null) return null;
+
+ // Create the requested element
+ var e = target.ownerDocument.createElement(tagName);
+
+ // Set CSS class if specified
+ if (cssClass) {
+ this.setCSSClass(e,cssClass);
+ }
+
+ // Append to parent
+ target.appendChild(e);
+
+ return e;
+}
+
+DefaultTheme.prototype.createTextNodeTo = function (target,text) {
+
+ // Sanity check
+ if (text == null || target == null) return null;
+
+ // Create DIV as container
+ var tn = target.ownerDocument.createTextNode(text);
+
+ // Append to parent
+ target.appendChild(tn);
+
+ return tn;
+}
+
+DefaultTheme.prototype.getFirstElement = function(parent, elementName) {
+ if (parent && parent.childNodes) {
+ for (var i=0;i<parent.childNodes.length;i++) {
+ if (parent.childNodes[i].nodeName == elementName) {
+ return parent.childNodes[i];
+ }
+ }
+ }
+ return null;
+}
+
+DefaultTheme.prototype.getFirstTextNode = function(parent) {
+ if (parent == null || parent.childNodes == null) return null;
+
+ var cns = parent.childNodes;
+ var len = cns.length;
+ for (var i=0; i<len; i++) {
+ var child = cns[i];
+ if (child.nodeType == Node.TEXT_NODE) {
+ return child;
+ }
+ }
+
+}
+
+/**
+ * Removes all children of an element an element.
+ *
+ * @param element Remove children of this element.
+ *
+ * @return the element with children removed
+ */
+DefaultTheme.prototype.removeAllChildNodes = function(element) {
+ //TODO event listener leakage prevention, verify
+ // MOVED to client
+ //this.removeAllEventListeners(element);
+ while (element.childNodes&&element.childNodes.length > 0) {
+ element.removeChild(element.childNodes[0]);
+ }
+ return element;
+}
+
+DefaultTheme.prototype.getElementContent = function(parent, elementName) {
+ if (elementName != null) {
+ // Find element and return its content
+ var n = this.getFirstElement(parent,elementName);
+ if (n == null) return null;
+ var tn = this.getFirstTextNode(n);
+ if (tn != null && tn.data != null) {
+ return tn.data;
+ }
+ return "";
+ } else {
+ // If no element name is given return
+ // content of parent
+ var tn = this.getFirstTextNode(parent);
+ if (tn != null && tn.data != null) {
+ return tn.data;
+ }
+ return "";
+ }
+}
+
+DefaultTheme.prototype.getChildElements = function(parent, tagName) {
+
+ if (parent == null || parent.childNodes == null || tagName == null) return null;
+
+ // Iterate all child nodes
+ var res = new Array();
+ for (var i=0; i < parent.childNodes.length; i++) {
+ var n = parent.childNodes[i];
+ if (n.nodeType == Node.ELEMENT_NODE && n.nodeName == tagName) {
+ res[res.length++] = n;
+ }
+ }
+ return res;
+}
+DefaultTheme.prototype.nodeToString = function(node, deep) {
+
+ if (node == null) {
+ return "";
+ } else if (node.nodeType == Node.TEXT_NODE) {
+ // Render text nodes.
+ if (node.data) {
+ return node.data;
+ } else {
+ return "";
+ }
+
+ } else if (node.nodeType == Node.ELEMENT_NODE) {
+
+ // Renderer element nodes.
+ var txt = "<" + node.nodeName;
+ if (node.attributes.length > 0)
+ for(var i=0; i<node.attributes.length; i++) {
+ var a = node.attributes.item(i);
+ txt += " " + a.name + "=\"" + a.value+"\"";
+ }
+ if (deep && node.childNodes != null && node.childNodes.length >0) {
+ txt += ">";
+ for (var i=0; i<node.childNodes.length; i++) {
+ var c = node.childNodes.item(i);
+ txt += this.nodeToString(c,deep);
+ }
+ txt += "</"+node.nodeName+">";
+ } else {
+ txt += "/>";
+ }
+ return txt;
+ }
+
+ return ""+node.nodeName + "-node";
+}
+DefaultTheme.prototype.createInputElementTo = function(target,type,className,focusid) {
+
+ var input = null;
+ if (document.all) {
+ // IE only
+ input = this.createElementTo(target,"<input type='"+type+"'>");
+ } else {
+ // Other browsers
+ input = this.createElementTo(target,"input");
+ input.type = type;
+ }
+
+ // Assign class
+ if (className != null && className != "") {
+ this.setCSSClass(input,className);
+ }
+
+ if (focusid) input.focusid = focusid;
+
+ return input;
+}
+
+
+
+/*
+#### CSS functions ######################################################
+*/
+
+DefaultTheme.prototype.addCSSClass = function(element, className) {
+ if (element == null) return element;
+ if (element.className) {
+ var classArray = element.className.split(" ");
+ for (var i in classArray) {
+ if (classArray[i]==className) {
+ // allready in className
+ return element;
+ }
+ }
+ }
+ element.className = (element.className?element.className:"") + " " + className;
+ return element;
+}
+
+DefaultTheme.prototype.removeCSSClass = function(element, className) {
+ if (element == null) return element;
+ var classArray = new Array();
+ if (element.className) {
+ classArray = element.className.split(" ");
+ }
+ var newArray = new Array();
+ for (var i in classArray) {
+ if (classArray[i]!=className) {
+ newArray[newArray.length] = classArray[i];
+ }
+ }
+ element.className = newArray.join(" ");
+ return element;
+}
+DefaultTheme.prototype.toggleCSSClass = function(element, className) {
+ if (element == null) return element;
+
+ var classArray = new Array();
+ if (element.className) {
+ classArray = element.className.split(" ");
+ }
+ for (var i=0;i<classArray.length;i++) {
+ if (classArray[i]==className) {
+ this.removeCSSClass(element, className);
+ return;
+ }
+ }
+ this.addCSSClass(element, className);
+
+ return element;
+}
+DefaultTheme.prototype.setCSSClass = function(element, className) {
+ if (element == null) return element;
+ element.className = className;
+ return element;
+}
+DefaultTheme.prototype.setCSSDefaultClass = function(renderer,element,uidl) {
+ if (element == null) return element;
+ var cn = this.styleToCSSClass(renderer.tag,uidl.getAttribute("style"));
+ element.className = cn;
+ return element;
+}
+DefaultTheme.prototype.styleToCSSClass = function(prefix,style) {
+
+ var s = "";
+ if (prefix != null) {
+ s = prefix;
+ }
+ if (style != null) {
+ if (s.length > 0) {
+ s = s + "-";
+ }
+ s = s + style;
+ }
+ return s
+}
+
+/*
+#### Generic JS helpers ##################################################
+*/
+
+/**
+ * Check if integer list contains a number.
+ *
+ * @param list Comma separated list of integers
+ * @param number Number to be tested
+ *
+ * @return true iff the number can be found in the list
+ */
+
+DefaultTheme.prototype.listContainsInt = function(list,number) {
+ if (!list) return false;
+ a = list.split(",");
+
+ for (i=0;i<a.length;i++) {
+ if (a[i] == number) return true;
+ }
+
+ return false;
+}
+/** Add number to integer list, if it does not exit before.
+ *
+ *
+ * @param list Comma separated list of integers
+ * @param number Number to be added
+ *
+ * @return new list
+ */
+
+DefaultTheme.prototype.listAddInt = function(list,number) {
+
+ if (this.listContainsInt(list,number))
+ return list;
+
+ if (list == "") return number;
+ else return list + "," + number;
+}
+/** Remove number from integer list.
+ *
+ * @param list Comma separated list of integers
+ * @param number Number to be removed
+ *
+ * @return new list
+ */
+DefaultTheme.prototype.listRemoveInt = function(list,number) {
+ if (!list) return "";
+ retval = "";
+ a = list.split(',');
+
+ for (i=0;i<a.length;i++) {
+ if (a[i] != number) {
+ if (i == 0) retval += a[i];
+ else retval += "," + a[i];
+ }
+ }
+ return retval;
+}
+/*
+#### Variable helpers #############################################
+*/
+DefaultTheme.prototype.getVariableElement = function(uidl,type,name) {
+
+ if (uidl == null) return;
+
+ var nodes = this.getChildElements(uidl,type);
+ if (nodes != null) {
+ for (var i=0; i < nodes.length; i++) {
+ if (nodes[i].getAttribute("name") == name) {
+ return nodes[i];
+ }
+ }
+ }
+ return null;
+}
+DefaultTheme.prototype.createVariableElementTo = function(target,variableElement) {
+ if (!variableElement) {
+ return null;
+ }
+ var input = this.createInputElementTo(target,"hidden");
+ input.variableId = variableElement.getAttribute("id");
+ input.variableName = variableElement.getAttribute("name");
+ if (variableElement.nodeName == "array") {
+ input.variableId = "array:"+input.variableId;
+ input.value = this.arrayToList(variableElement);
+ } else if (variableElement.nodeName == "string") {
+ var node = this.getFirstTextNode(variableElement);
+ input.value = (node?node.data:"");
+ } else {
+ input.value = variableElement.getAttribute("value");
+ }
+ return input;
+}
+DefaultTheme.prototype.getVariableElementValue = function(variableElement) {
+ if ( variableElement == null) {
+ return null;
+ }
+
+ if (variableElement.nodeName == "array") {
+ return this.arrayToList(variableElement);
+ } else if (variableElement.nodeName == "string") {
+ var node = this.getFirstTextNode(variableElement);
+ return (node?node.data:"");
+ } else {
+ return variableElement.getAttribute("value");
+ }
+ return null;
+}
+DefaultTheme.prototype.setVariable = function(client, variableNode, newValue, immediate) {
+ if (variableNode == null) return;
+ variableNode.value = newValue;
+ client.changeVariable(variableNode.variableId, newValue, immediate);
+}
+DefaultTheme.prototype.addArrayVariable = function(client, variableNode, newValue, immediate) {
+ if (variableNode == null) return;
+ variableNode.value = this.listAddInt(variableNode.value,newValue);
+ client.changeVariable(variableNode.variableId, variableNode.value, immediate);
+}
+DefaultTheme.prototype.toggleArrayVariable = function(client, variableNode, value, immediate) {
+ if (variableNode == null) return;
+ if (this.listContainsInt(variableNode.value,value)) {
+ variableNode.value = this.listRemoveInt(variableNode.value,value);
+ } else {
+ variableNode.value = this.listAddInt(variableNode.value,value);
+ }
+ client.changeVariable(variableNode.variableId, variableNode.value, immediate);
+}
+DefaultTheme.prototype.removeArrayVariable = function(client, variableNode, value, immediate) {
+ if (variableNode == null) return;
+ variableNode.value = this.listRemoveInt(variableNode.value,value);
+ client.changeVariable(variableNode.variableId, variableNode.value, immediate);
+}
+DefaultTheme.prototype.arrayToList = function(arrayVariableElement) {
+
+ var list = "";
+ if (arrayVariableElement == null || arrayVariableElement.childNodes == null) return list;
+
+ var items = arrayVariableElement.getElementsByTagName("ai");
+ if (items == null) return list;
+
+ for (var i=0; i <items.length;i++) {
+ var v = this.getFirstTextNode(items[i]);
+ if (v != null && v.data != null) {
+ if (list.length >0) list += ",";
+ list += v.data;
+ }
+ }
+
+ return list;
+}
+
+
+/*
+#### Generic component functions #############################################
+*/
+DefaultTheme.prototype.renderChildNodes = function(renderer, uidl, to) {
+ for (var i=0; i<uidl.childNodes.length; i++) {
+ var child = uidl.childNodes.item(i);
+ if (child.nodeType == Node.ELEMENT_NODE) {
+ renderer.client.renderUIDL(child,to);
+ } else if (child.nodeType == Node.TEXT_NODE) {
+ to.appendChild(to.ownerDocument.createTextNode(child.data));
+ }
+ }
+}
+DefaultTheme.prototype.applyWidthAndHeight = function(uidl,target) {
+ if (target == null || uidl == null) return;
+
+ // Width
+ var widthEl = this.getVariableElement(uidl,"integer","width");
+ if (widthEl) {
+ var w = widthEl.getAttribute("value");
+ if (w > 0) {
+ target.style.width = ""+w+"px";
+ }
+ }
+
+ // Height
+ var heightEl = this.getVariableElement(uidl,"integer","height");
+ if (heightEl) {
+ var h = heightEl.getAttribute("value");
+ if (h > 0) {
+ target.style.height = ""+h+"px";
+ }
+ }
+}
+DefaultTheme.prototype.createPaintableElement = function (renderer, uidl, target,layoutInfo) {
+
+ // And create DIV as container
+ var div = null;
+ var pid = uidl.getAttribute("id");
+ var li = layoutInfo||target.layoutInfo;
+ if (pid != null && target.getAttribute("id") == pid){
+ div = target;
+ } else {
+ //TODO: Remove this if the statement below works.
+ // div = renderer.theme.createElementTo(target,"div");
+ div = renderer.client.createPaintableElement(uidl,target);
+ }
+ div.layoutInfo = li;
+
+ // Remove possible previous content from target
+ while (div.firstChild != null) {
+ div.removeChild(div.firstChild);
+ }
+
+ // Assign CSS class
+ this.setCSSDefaultClass(renderer,div,uidl);
+ if ("true"==uidl.getAttribute("disabled")) {
+ this.addCSSClass(div,"disabled");
+ }
+ if (this.getFirstElement(uidl,"error")) {
+ this.addCSSClass(div,"error");
+ }
+
+ // Return reference to newly created div
+ return div;
+}
+
+DefaultTheme.prototype.renderDefaultComponentHeader = function(renderer,uidl,target, layoutInfo) {
+ var theme = renderer.theme;
+ var doc = renderer.doc;
+
+ var captionText = uidl.getAttribute("caption");
+ var error = this.getFirstElement(uidl,"error");
+ var descriptionText = this.getElementContent(uidl,"description");
+ var icon = uidl.getAttribute("icon");
+
+ if (!captionText && !error && !descriptionText && !icon) {
+ return null;
+ }
+
+ if (!layoutInfo) {
+ layoutInfo = target.layoutInfo;
+ }
+
+ // If layout info contains caption node, use it as caption position
+ if (layoutInfo != null && layoutInfo.captionNode) {
+ target = layoutInfo.captionNode;
+ target.innerHTML = "";
+ }
+
+ // Caption container
+ var caption = this.createElementTo(target,"div");
+ // Create debug-mode UIDL div
+ if (renderer.client.debugEnabled) {
+ var uidlDebug = this.createElementTo(caption,"div","uidl minimized");
+ renderer.client.renderHTML(uidl,uidlDebug);
+ var t = this;
+ client.addEventListener(uidlDebug,"click", function (e) {
+ if (uidlDebug.className.indexOf("minimized") >=0) {
+ t.removeCSSClass(uidlDebug,"minimized");
+ } else {
+ t.addCSSClass(uidlDebug,"minimized");
+ }
+ }
+ );
+ }
+ if (captionText||error||descriptionText||icon) {
+ this.addCSSClass(caption,"caption");
+ } else {
+ return caption;
+ }
+ if (descriptionText || error) {
+ this.addCSSClass(caption,"clickable");
+ }
+
+ if (error||descriptionText) {
+ var popup = this.renderDescriptionPopup(renderer,uidl,(captionText?caption:target));
+ }
+
+ var iconUrl = uidl.getAttribute("icon");
+
+ if (error) {
+ var icon = this.createElementTo(caption,"img","icon");
+ icon.src = theme.root+"/img/icon/error-mini.gif";
+ if (iconUrl) {
+ /* overlay icon */
+ this.setCSSClass(icon,"overlay");
+ } else {
+ this.setCSSClass(icon,"error");
+ }
+ } else if (descriptionText) {
+ var icon = this.createElementTo(caption,"img","icon");
+ icon.src = theme.root+"/img/icon/info-mini.gif";
+ if (iconUrl) {
+ /* overlay icon */
+ this.setCSSClass(icon,"overlay");
+ } else {
+ this.setCSSClass(icon,"error");
+ }
+ }
+
+ if (iconUrl) {
+ if (iconUrl.indexOf("theme://") == 0) {
+ iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root)
+ + iconUrl.substring(8);
+ }
+ var icon = this.createElementTo(caption,"img","icon");
+ icon.src = iconUrl;
+ }
+ // Caption text
+ this.createTextNodeTo(caption,captionText);
+
+ return caption;
+}
+
+DefaultTheme.prototype.renderActionPopup = function(renderer, uidl, to, actions, actionVar, id, popupEvent) {
+ // Shortcuts
+ var theme = renderer.theme;
+ var client = renderer.client;
+ var evtName = popupEvent||"rightclick";
+
+ var ak = uidl.getElementsByTagName("ak");
+ var len = ak.length;
+ if (len < 1) return;
+
+ var popup = theme.createElementTo((to.nodeName=="TR"?to.firstChild:to),"div", "popup outset hide");
+ theme.addHidePopupListener(theme,client,popup,"click");
+ theme.addStopListener(theme,client,popup,"click");
+
+ var inner = theme.createElementTo(popup,"div", "border");
+ var item = theme.createElementTo(inner,"div", "item pad clickable");
+
+ for (var k=0;k<len;k++) {
+ var key = theme.getFirstTextNode(ak[k]).data;
+ var item = theme.createElementTo(inner,"div", "item pad clickable");
+ theme.createTextNodeTo(item,actions[key]);
+ item.style.color = "black";
+ theme.addAddClassListener(theme,client,item,"mouseover","over");
+ theme.addRemoveClassListener(theme,client,item,"mouseout","over");
+ theme.addSetVarListener(theme,client,item,"click",actionVar,id+","+key,true);
+ theme.addHidePopupListener(theme,client,item,"click");
+ theme.addStopListener(theme,client,item,"click");
+ }
+ theme.addStopListener(theme,client,to,"contextmenu");
+ //theme.addStopListener(theme,client,to,evtName);
+ theme.addTogglePopupListener(theme,client,to,evtName,popup);
+}
+
+DefaultTheme.prototype.renderDescriptionPopup = function (renderer,uidl,target) {
+ var theme = renderer.theme;
+ var doc = renderer.doc;
+
+ var captionText = uidl.getAttribute("caption");
+ var desc = this.getFirstElement(uidl,"description");
+
+ var error = this.getFirstElement(uidl,"error");
+ var iconUrl = uidl.getAttribute("icon");
+ if (!iconUrl&&desc) {
+ iconUrl = theme.root+"/img/icon/info.gif";
+ }
+
+ // Caption container
+ var popup = this.createElementTo(target,"div","outset popup hide");
+ var inner = this.createElementTo(popup,"table","border pad");
+ inner = this.createElementTo(inner,"tbody");
+ var tr = this.createElementTo(inner,"tr");
+ var td = this.createElementTo(tr,"td");
+ if (iconUrl) {
+ if (iconUrl.indexOf("theme://") == 0) {
+ iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root)
+ + iconUrl.substring(8);
+ }
+ var icon = this.createElementTo(td,"img","icon");
+ icon.src = iconUrl;
+ }
+ td = this.createElementTo(tr,"td");
+ var caption = this.createElementTo(td,"div","caption");
+ this.createTextNodeTo(caption,captionText);
+
+ if (desc) {
+ var description = this.createElementTo(td,"div","content");
+ description.innerHTML = renderer.client.getXMLtext(desc);
+ description.style.whiteSpace ="normal";
+ }
+ if (error) {
+ tr = this.createElementTo(inner,"tr");
+ td = this.createElementTo(tr,"td");
+ icon = this.createElementTo(td,"img","icon");
+ icon.src = theme.root+"/img/icon/error.gif";
+ td = this.createElementTo(tr,"td");
+ var errorDiv = this.createElementTo(td,"div","error pad");
+ this.renderData(renderer,error,errorDiv);
+ var ew = errorDiv.ownerDocument.getElementById("error-window");
+ if (ew) {
+ ew.innerHTML += "<DIV><B>"+captionText+":</B> "+errorDiv.innerHTML+"</DIV><BR/>";
+ ew.style.display = "inline";
+ }
+ }
+ if (desc||error) {
+ this.addTogglePopupListener(theme,client,target,"mouseover",popup,1000,500,target);
+ //theme.addTogglePopupListener(theme,client,target,"click",popup,0,500);
+ this.addHidePopupListener(theme,client,popup,"click",popup);
+ this.addHidePopupListener(theme,client,target,"mouseout",popup);
+ this.addHidePopupListener(theme,client,popup,"mouseout",popup);
+ }
+
+ return popup;
+}
+
+/** Show popup at specified position.
+ * Hides previous popup.
+ *
+ * @param popup The element to popup
+ * @param x horizontal popup position
+ * @param y vertical popup position
+ * @param delay delay before popping up
+ * @param defWidth (optional) default width for the popup
+ *
+ */
+DefaultTheme.prototype.showPopup = function(client,popup, x, y, delay, defWidth) {
+ if (this.popupTimeout) {
+ clearTimeout(this.popupTimeout);
+ delete this.popupTimeout;
+ }
+ if (!popup) {
+ var popup = this.popup;
+ this.popupShowing = true;
+ var scrollTop = (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
+ var scrollLeft = (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
+ var docWidth = document.body.clientWidth;
+ var docHeight = document.body.clientHeight;
+ this.removeCSSClass(popup,"hide");
+
+ var ua = navigator.userAgent.toLowerCase();
+ if (ua.indexOf("msie")>=0) {
+ var sels = popup.ownerDocument.getElementsByTagName("select");
+ if (sels) {
+ var len = sels.length;
+ var hidden = new Array();
+ for (var i=0;i<len;i++) {
+ var sel = sels[i];
+ if (sel.style&&sel.style.display!="none") {
+ sel.style.visibility = "hidden";
+ hidden[hidden.length] = sel;
+ }
+ }
+ this.popupSelectsHidden = hidden;
+ }
+ }
+ /* TODO fix popup width & position */
+ return;
+ }
+ if (!delay) var delay = 0;
+ if (this.popup && this.popup != popup) {
+ this.hidePopup();
+ }
+ this.popup = popup;
+ popup.style.left = 0+"px";
+ popup.style.top = 0+"px";
+ this.removeCSSClass(popup,"hide");
+ var p = client.getElementPosition(popup);
+ this.addCSSClass(popup,"hide");
+ // TODOO!!! width not working properly
+ if (p.w > document.body.clientWidth/2) {
+ popup.style.width = Math.round(document.body.clientWidth/2)+"px";
+ p.w = Math.round(document.body.clientWidth/2);
+ }
+
+ var posX = x||p.x;
+ var posY = y||p.y;
+ if (posX+p.w>document.body.clientWidth) {
+ posX = document.body.clientWidth-p.w;
+ if (posX<0) posX=0;
+ }
+ if (posY+p.h>document.body.clientHeight) {
+ posY = document.body.clientHeight-p.h;
+ if (posY < 0) posY =0;
+ }
+
+ if (p.h > document.body.clientHeight -20) {
+ popup.style.height = document.body.clientHeight -20 + "px";
+ popup.style.overflow = "auto";
+ posX -= 20;
+ }
+
+
+ popup.style.left = posX+"px";
+ popup.style.top = posY+"px";
+
+ if (delay > 0) {
+ with ({theme:this}) {
+ theme.popupTimeout = setTimeout(function(){
+ theme.showPopup(client);
+ }, delay);
+ }
+ } else {
+ this.showPopup(client);
+ }
+}
+/** Hides previous popup.
+ */
+DefaultTheme.prototype.hidePopup = function() {
+ if (this.popupSelectsHidden) {
+ var len = this.popupSelectsHidden.length;
+ for (var i=0;i<len;i++) {
+ var sel = this.popupSelectsHidden[i];
+ sel.style.visibility = "visible";
+ }
+ this.popupSelectsHidden = null;
+ }
+
+ if (this.popup) {
+ this.addCSSClass(this.popup,"hide");
+ this.popupShowing = false;
+ }
+ if (this.popupTimeout) {
+ clearTimeout(this.popupTimeout);
+ delete this.popupTimeout;
+ }
+}
+/** Shows the popup if it's not currently shown,
+ * hides the popup otherwise.
+ * Hides previous popup.
+ *
+ * @param popup The element to popup
+ * @param x horizontal popup position
+ * @param y vertical popup position
+ * @param delay delay before popping up
+ * @param defWidth (optional) default width for the popup
+ *
+ */
+DefaultTheme.prototype.togglePopup = function(popup, x, y, delay, defWidth) {
+ if (this.popup == popup && this.popupShowing) {
+ this.hidePopup();
+ } else {
+ this.showPopup(client,popup,x,y,delay,defWidth);
+ }
+}
+
+
+/*
+#### Generic event handlers ######################################################
+*/
+DefaultTheme.prototype.addAddClassListener = function(theme,client,element,event,className,target,current) {
+ client.addEventListener(element,event, function(e) {
+ if (current) {
+ if (current.length) {
+ var length = current.length;
+ while (length--) {
+ theme.removeCSSClass(current[length],className);
+ delete current[length];
+ }
+ } else {
+ for (e in current) {
+ theme.removeCSSClass(current[e],className);
+ delete current[e];
+ }
+ }
+ }
+ theme.addCSSClass((target?target:element),className);
+ if (current) {
+ current[current.length] = (target?target:element);
+ }
+ }
+ );
+}
+DefaultTheme.prototype.addRemoveClassListener = function(theme,client,element,event,className,target) {
+ client.addEventListener(element,event, function(e) {
+ theme.removeCSSClass((target?target:element),className);
+ }
+ );
+}
+DefaultTheme.prototype.addToggleClassListener = function(theme,client,element,event,className,target) {
+ client.addEventListener(element,event, function(e) {
+ theme.toggleCSSClass((target?target:element),className);
+ }
+ );
+}
+DefaultTheme.prototype.addStopListener = function(theme,client,element,event) {
+ client.addEventListener(element, event, function(e) {
+ var evt = client.getEvent(e);
+ evt.stop();
+ return false;
+ }
+ );
+}
+DefaultTheme.prototype.addSetVarListener = function(theme,client,element,event,variable,key,immediate) {
+ client.addEventListener(element,event, function(e) {
+ var value = "";
+ if (typeof(key)=="string") {
+ value = key;
+ } else if (key.type=="checkbox"||key.type=="radio") {
+ value = key.checked;
+ } else if (key.type=="select-multiple") {
+ var s = new Array();
+ for (var i = 0; i < key.options.length; i++) {
+ if (key.options[i].selected) {
+ s[s.length] = key.options[i].value;
+ }
+ }
+ value = s.join(',');
+ } else {
+ value = key.value;
+ }
+ if (typeof(variable) == "string") {
+ client.changeVariable(variable,value,immediate);
+ } else {
+ theme.setVariable(client,variable,value,immediate);
+ }
+ }
+ );
+}
+DefaultTheme.prototype.addRemoveVarListener = function(theme,client,element,event,variable,key,immediate) {
+ client.addEventListener(element,event, function(e) {
+ theme.removeArrayVariable(client,variable,key,immediate);
+ }
+ );
+}
+DefaultTheme.prototype.addAddVarListener = function(theme,client,element,event,variable,key,immediate) {
+ client.addEventListener(element,event, function(e) {
+ theme.addArrayVariable(client,variable,key,immediate);
+ }
+ );
+}
+DefaultTheme.prototype.addToggleVarListener = function(theme,client,element,event,variable,key,immediate) {
+ client.addEventListener(element,event, function(e) {
+ theme.toggleArrayVariable(client,variable,key,immediate);
+ }
+ );
+}
+DefaultTheme.prototype.addExpandNodeListener = function(theme,client,img,event,subnodes,expandVariable,collapseVariable,key,immediate,target) {
+ client.addEventListener((target?target:img), event, function(e) {
+ if (img.expanded == "true") {
+ theme.removeArrayVariable(client,expandVariable,key,false);
+ theme.addArrayVariable(client,collapseVariable,key,immediate);
+ img.src = theme.root + "img/tree/off.gif";
+ img.expanded = "false";
+ } else {
+ theme.removeArrayVariable(client,collapseVariable,key,false);
+ theme.addArrayVariable(client,expandVariable,key,immediate ||
+ !img.expanded || !subnodes.childNodes || subnodes.childNodes.length <= 0);
+ img.src = theme.root + "img/tree/on.gif";
+ img.expanded = "true";
+ }
+ }
+ );
+}
+
+DefaultTheme.prototype.addTogglePopupListener = function(theme,client,element,event,popup,delay,defWidth,popupAt) {
+ client.addEventListener(element,(event=="rightclick"?"mouseup":event), function(e) {
+ var evt = client.getEvent(e);
+ if (event=="rightclick"&&!evt.rightclick) return;
+ if(evt.target.nodeName == "INPUT" || evt.target.nodeName == "SELECT") return;
+ if (evt.alt) return;
+ if (popupAt) {
+ var p = client.getElementPosition(popupAt);
+ theme.togglePopup(popup,p.x,(p.y+p.h),(delay?delay:0),(defWidth?defWidth:100));
+ } else {
+ theme.togglePopup(popup,evt.mouseX,evt.mouseY,(delay?delay:0),(defWidth?defWidth:100));
+ }
+ evt.stop();
+ }
+ );
+}
+DefaultTheme.prototype.addShowPopupListener = function(theme,client,element,event,popup,delay,defWidth) {
+ client.addEventListener(element,(event=="rightclick"?"click":event), function(e) {
+ var evt = client.getEvent(e);
+ if (event=="rightclick"&&!evt.rightclick) return;
+
+ theme.showPopup(client,popup,evt.mouseX,evt.mouseY,(delay?delay:0),(defWidth?defWidth:100));
+ evt.stop();
+ }
+ );
+}
+// TODO dontstop -> stop in all listeners
+DefaultTheme.prototype.addHidePopupListener = function(theme,client,element,event,dontstop) {
+ client.addEventListener(element,(event=="rightclick"?"click":event), function(e) {
+ var evt = client.getEvent(e);
+ if (evt.alt) return;
+ if (event=="rightclick"&&!evt.rightclick) return;
+ theme.hidePopup();
+ if (!dontstop) {
+ evt.stop();
+ }
+ }
+ );
+}
+
+/**
+* Adds a hidden button with a tabindex; adds .over to hoverTarget when focused
+*/
+DefaultTheme.prototype.addTabtoHandlers = function(client,theme,target,hoverTarget,tabindex,defaultButton) {
+
+ var d = this.createElementTo(target,"div");
+ d.style.border = "none";
+ d.style.background = "none";
+ d.style.padding = "0px";
+ d.style.margin = "0px;"
+ d.style.width = "0px";
+ d.style.height = "0px";
+ d.style.overflow = "hidden";
+
+ var b = this.createInputElementTo(d,(defaultButton?"submit":"button"));
+
+ if (tabindex) b.tabIndex = tabindex;
+
+ client.addEventListener(b,"focus", function() {
+ theme.addCSSClass(hoverTarget,"over");
+ });
+ client.addEventListener(b,"blur", function() {
+ theme.removeCSSClass(hoverTarget,"over");
+ });
+}
+
+/*
+#### Component renderers ######################################################
+*/
+DefaultTheme.prototype.renderComponent = function(renderer,uidl,target,layoutInfo) {
+
+ // Create containing element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Render default header
+ renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ // Render children to div
+ renderer.theme.renderChildNodes(renderer, uidl, div);
+}
+
+
+DefaultTheme.prototype.renderWindow = function(renderer,uidl,target,layoutInfo) {
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ var theme = renderer.theme;
+
+ theme.addHidePopupListener(theme,renderer.client,div,"click",true);
+ // Render children to div
+ theme.renderChildNodes(renderer, uidl, div);
+
+ // Apply width and height
+ theme.applyWidthAndHeight(uidl,div);
+
+ // Focusing
+ var focused = theme.getVariableElement(uidl,"string","focused");
+ var focusid = theme.getVariableElementValue(focused);
+ if (focusid) {
+ var found = false;
+ var els = div.getElementsByTagName("input");
+ var len = (els?els.length:0);
+ for (var i=0;i<len;i++) {
+ var el = els[i];
+ if (focusid == el["focusid"]) {
+ el.focus();
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ els = div.getElementsByTagName("select");
+ var len = (els?els.length:0);
+ for (var i=0;i<len;i++) {
+ var el = els[i];
+ if (focusid == el["focusid"]) {
+ el.focus();
+ found = true;
+ break;
+ }
+ }
+ }
+ if (!found) {
+ els = div.getElementsByTagName("textarea");
+ var len = (els?els.length:0);
+ for (var i=0;i<len;i++) {
+ var el = els[i];
+ if (focusid == el["focusid"]) {
+ el.focus();
+ found = true;
+ break;
+ }
+ }
+ }
+ }
+}
+
+DefaultTheme.prototype.renderOpen = function(renderer,uidl,target,layoutInfo) {
+ // Shortcuts
+ var theme = renderer.theme;
+
+ var src = uidl.getAttribute("src");
+ var name = uidl.getAttribute("name");
+
+ if (name) {
+ window.open(src,name);
+ } else {
+ var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ div.innerHTML = "<IFRAME name=\""+name+"\" id=\""+name+"\" width=100% height=100% style=\"border:none;margin:0px;padding:0px;background:none;\" src=\""+src+"\"></IFRAME>";
+ }
+}
+
+DefaultTheme.prototype.renderFramewindow = function(renderer,uidl,target,layoutInfo) {
+
+ var theme = renderer.theme;
+ var client = renderer.client;
+
+ // TODO: Should we unregister all previous child windows?
+
+ // We just reinitialize the window
+ var win = target.ownerDocument.ownerWindow;
+ client.initializeNewWindow(win,uidl,theme);
+}
+
+DefaultTheme.prototype.renderCustomLayout = function(renderer,uidl,target,layoutInfo) {
+ // Shortcuts
+ var theme = renderer.theme;
+
+ // Get style
+ var style = uidl.getAttribute("style");
+ if (style == null) return null;
+
+ // Load the layout
+ var url = theme.root + style;
+ var text = renderer.client.loadDocument(url,false);
+ if (text == null) {
+ client.debug("CustomLayout " + style + " NOT FOUND @ "+ url);
+ return null;
+ }
+
+ // Create containing element
+ var main = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ var locations = new Object();
+ var unused = new Object();
+ var cN = uidl.childNodes;
+ var len = cN.length;
+ for (var j=0; j < len; j++) {
+ var c = cN.item(j);
+ if (c.nodeType == Node.ELEMENT_NODE
+ && c.nodeName == "location"
+ && c.getAttribute("name")) {
+
+ locations[c.getAttribute("name")] = c;
+ unused[c.getAttribute("name")] = c;
+ }
+ }
+
+
+ var n = theme.createElementTo(main, "div");
+ n.setAttribute("id",uidl.getAttribute("id"));
+ n.innerHTML=text;
+ var divs = n.getElementsByTagName("div");
+ for (var i=0; i<divs.length; i++) {
+ var div = divs.item(i);
+ var name = div.getAttribute("location");
+ if (name != null) {
+ var c = locations[name];
+ if (c && c.getAttribute("name") == name) {
+ delete unused[name];
+ for (var k=0; k<c.childNodes.length; k++) {
+ var cc = c.childNodes.item(k);
+ if (cc.nodeType == Node.ELEMENT_NODE) {
+ var parent = div.parentNode;
+ // TODO
+ if (parent != null) {
+ theme.removeAllChildNodes(div);
+ var newNode = renderer.client.renderUIDL(cc,div);
+ }
+ }
+ }
+ } else {
+ client.warn("Location " + name + " NOT USED in CustomLayout " + style);
+ }
+ }
+ }
+ if (unused.length>0) {
+ for (var k in usedLocations) {
+ client.error("Location " + k + " NOT FOUND in CustomLayout " + style);
+ }
+ }
+
+}
+
+DefaultTheme.prototype.renderOrderedLayout = function(renderer,uidl,target,layoutInfo) {
+ // Shortcuts
+ var theme = renderer.theme;
+
+ // Create containing element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Render all children to table
+ var vertical = uidl.getAttribute("orientation") != "horizontal";
+ var table = null;
+ var tr = null;
+ var td = null;
+ var style = uidl.getAttribute("style");
+ var form = style == "form";
+
+ for (var i=0; i<uidl.childNodes.length; i++) {
+ var childUIDL = uidl.childNodes.item(i);
+ td = null;
+ if (childUIDL.nodeType == Node.ELEMENT_NODE) {
+
+ // Ensure TABLE and TR
+ if (tr == null || vertical) {
+ if (table == null) {
+ table = renderer.theme.createElementTo(div,"table","orderedlayout");
+ //table.width="100%";
+ renderer.theme.addCSSClass(table,"layout");
+ table = renderer.theme.createElementTo(table,"tbody","layout");
+ }
+ tr = renderer.theme.createElementTo(table,"tr","layout");
+ }
+
+ // Create extra TD for form style captions
+ var layoutInfo = null;
+ if (form) {
+ layoutInfo = new Object()
+ td = renderer.theme.createElementTo(tr,"td","layout");
+ layoutInfo.captionNode = td;
+ }
+
+ // Force new TD for each child rendered
+ td = renderer.theme.createElementTo(tr,"td","layout");
+
+ // Render the component to TD
+ renderer.client.renderUIDL(childUIDL,td, null, layoutInfo);
+
+ }
+ }
+}
+
+
+DefaultTheme.prototype.renderGridLayout = function(renderer,uidl,target,layoutInfo) {
+ // NOTE TODO indenting might be off
+ // Shortcuts
+ var theme = renderer.theme;
+
+ var h = uidl.getAttribute("h");
+ var w = uidl.getAttribute("w");
+ // Create component element
+ var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+ //var width = (div.offsetWidth||div.clientWidth)-20;
+ //var px = Math.floor(width/parseInt(w));
+
+ var table = theme.createElementTo(div,"table", "layout");
+ //table.width = "100%";
+ table = renderer.theme.createElementTo(table,"tbody","layout");
+ var tr = null;
+ var td = null;
+ for (var y=0; y<uidl.childNodes.length; y++) {
+ var rowUidl = uidl.childNodes[y];
+
+ if (rowUidl.nodeType == Node.ELEMENT_NODE || rowUidl.nodeName == "gr") {
+
+ tr = theme.createElementTo(table,"tr","layout");
+ tr.style.verticalAlign = "top";
+ td = null;
+
+ for (var x=0; x<rowUidl.childNodes.length; x++) {
+ var cellUidl = rowUidl.childNodes[x];
+
+ // Add colspan and rowspan
+ if (cellUidl.nodeType == Node.ELEMENT_NODE && cellUidl.nodeName == "gc") {
+ // Create new TD for each child rendered
+ td = renderer.theme.createElementTo(tr,"td","layout");
+
+ var w = cellUidl.getAttribute('w');
+ var h = cellUidl.getAttribute('h');
+ //var cont = renderer.theme.createElementTo(td,"div");
+ //cont.style.width = ((w?w:1)*px)+"px";
+ if (w != null) {
+ td.setAttribute('colspan',w);
+ }
+ if (h != null) {
+ td.setAttribute('rowspan',h);
+ }
+ // Render the component(s) to TD
+ if (cellUidl.childNodes != null && cellUidl.childNodes.length >0) {
+ var len = cellUidl.childNodes.length;
+ for (var c=0;c<len;c++) {
+ var el = cellUidl.childNodes[c];
+ if (el.nodeType == Node.ELEMENT_NODE) {
+ renderer.client.renderUIDL(el,td);
+ }
+ }
+ //cont.style.width = "";
+ }
+ }
+ }
+ }
+ }
+}
+
+DefaultTheme.prototype.renderPanel = function(renderer,uidl,target,layoutInfo) {
+ // Supports styles "light" and "none"
+
+ // Shortcuts
+ var theme = renderer.theme;
+
+ var style = uidl.getAttribute("style");
+
+ // Create component element
+ var outer = theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ if ("none"!=style) {
+ theme.addCSSClass(div,"outset");
+ }
+ if ("light"==style) {
+ theme.addCSSClass(div,"light");
+ }
+
+ // Create extra DIV for visual layout
+ var div = theme.createElementTo(outer,"div");
+ if ("none"!=style) {
+ theme.setCSSClass(div,"border");
+ }
+
+ // Create default header
+ var caption = theme.renderDefaultComponentHeader(renderer,uidl,div);
+ theme.addCSSClass(caption,"pad");
+ if ("light"==style) {
+ theme.addCSSClass(caption,"lightcap");
+ }
+
+ // Create content DIV
+ var content = theme.createElementTo(div,"div");
+ theme.setCSSClass(content,"content");
+
+ // Render children to div
+ theme.renderChildNodes(renderer, uidl, content);
+
+ // Apply width and height
+ theme.applyWidthAndHeight(uidl,outer);
+
+}
+
+DefaultTheme.prototype.renderTabSheet = function(renderer,uidl,target,layoutInfo) {
+
+ var theme = renderer.theme;
+
+ // Create container element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Create default header
+ var caption = renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+ theme.createElementTo(div,"br");
+
+ // Render tabs
+ var tabs = theme.createElementTo(div,"div","tabs");
+ var varId = theme.getVariableElement(uidl,"string","selected").getAttribute("id");
+
+ var tabNodes = theme.getChildElements(uidl,"tabs");
+ if (tabNodes != null && tabNodes.length >0) tabNodes = theme.getChildElements(tabNodes[0],"tab");
+ var selectedTabNode = null;
+ if (tabNodes != null && tabNodes.length >0) {
+ for (var i=0; i< tabNodes.length;i++) {
+ var tabNode = tabNodes[i];
+ var tab = theme.createElementTo(tabs,"div");
+ var key = tabNode.getAttribute("key");
+ var iconUrl = tabNode.getAttribute("icon");
+ if (iconUrl && iconUrl.indexOf("theme://") == 0) {
+ iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root)
+ + iconUrl.substring(8);
+ }
+ if (tabNode.getAttribute("selected") == "true") {
+ theme.addCSSClass(tab,"tab-on inline");
+ selectedTabNode = tabNode;
+ } else if (tabNode.getAttribute("disabled") == "true") {
+ theme.setCSSClass(tab,"tab disabled inline");
+ } else {
+ theme.setCSSClass(tab,"tab clickable inline");
+ theme.addAddClassListener(theme,client,tab,"mouseover","over",tab);
+ theme.addRemoveClassListener(theme,client,tab,"mouseout","over",tab);
+ theme.addSetVarListener(theme,client,tab,"click",varId,key,true);
+ }
+ // Extra div in tab
+ tab = theme.createElementTo(tab,"div","caption border pad inline");
+
+ // Icon
+ if (iconUrl) {
+ tab.innerHTML = "<IMG src=\""+iconUrl+"\" class=\"icon\" />"+tabNode.getAttribute("caption");
+ //var icon = theme.createElementTo(tab,"img","icon");
+ //icon.src = iconUrl;
+ } else {
+ tab.innerHTML = tabNode.getAttribute("caption");
+ }
+
+ // Caption
+ //theme.createTextNodeTo(tab,tabNode.getAttribute("caption"));
+
+ }
+ }
+
+ // Render content
+ var content = theme.createElementTo(div,"div","outset");
+ content = theme.createElementTo(content,"div","content border");
+ if (selectedTabNode != null) {
+ theme.renderChildNodes(renderer,selectedTabNode, content);
+ }
+}
+
+DefaultTheme.prototype.renderTree = function(renderer,uidl,target,layoutInfo) {
+
+ var theme = renderer.theme;
+
+ // Create container element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Get tree attributes
+ var style = uidl.getAttribute("style");
+ var immediate = ("true" == uidl.getAttribute("immediate"));
+ var disabled = ("true" == uidl.getAttribute("disabled"));
+ var readonly = ("true" == uidl.getAttribute("readonly"));
+ var selectMode = uidl.getAttribute("selectmode");
+ var selectable = selectMode == "multi" || selectMode == "single";
+ var selected;
+ if (selectable) {
+ selected = new Object();
+ }
+ var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected"));
+ var expandVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","expand"));
+ var collapseVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","collapse"));
+
+ var actions = null;
+ var actionVar = null;
+ var alNode = theme.getFirstElement(uidl,"actions")
+ if (alNode) {
+ actionVar = theme.createVariableElementTo(div,theme.getVariableElement(alNode,"string","action"));
+ actions = new Object();
+ var ak = alNode.getElementsByTagName("action");
+ for (var i=0;i<ak.length;i++) {
+ actions[ak[i].getAttribute("key")] = ak[i].getAttribute("caption");
+ }
+ }
+ delete alNode;
+
+ // Create default header
+ var caption = renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ // Content DIV
+ var content = theme.createElementTo(div,"div","content");
+
+ // Iterate all nodes
+ for (var i = 0; i< uidl.childNodes.length;i++) {
+ var node = uidl.childNodes[i];
+ if (node.nodeName == "node" || node.nodeName == "leaf") {
+ theme.renderTreeNode(renderer,node,content,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly);
+ }
+ }
+}
+
+DefaultTheme.prototype.renderTreeNode = function(renderer,node,target,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly) {
+
+ var theme = renderer.theme;
+ var client = renderer.client;
+
+ var n = theme.createElementTo(target,"div","node clickable");
+
+ // Expand/collapse/spacer button
+ var img = theme.createElementTo(n,"img","icon");
+ var key = node.getAttribute("key");
+ var icon = node.getAttribute("icon");
+ if (icon) {
+ var iconurl = theme.root+icon.split("theme:")[1];
+ var iimg = theme.createElementTo(n,"img","icon");
+ iimg.src = iconurl;
+ }
+
+ // Caption
+ var cap = theme.createElementTo(n,"div","caption inline");
+ theme.createTextNodeTo(n,node.getAttribute("caption"));
+
+ // Hover effects
+ if (!disabled&&!readonly) {
+ theme.addAddClassListener(theme,client,n,"mouseover","over",n);
+ theme.addRemoveClassListener(theme,client,n,"mouseout","over",n);
+ }
+
+ // Server-side selection
+ if (selectable && node.getAttribute("selected") == "true") {
+ theme.addCSSClass(n,"selected");
+ selected[key] = n;
+ }
+
+ // Indicate selection
+ if (theme.listContainsInt(selectionVariable.value,key)) {
+ theme.addCSSClass(n, "selected");
+ }
+
+ // Selection listeners
+ if (selectable && !disabled) {
+ if (!readonly) {
+ if (selectMode == "single") {
+ theme.addAddClassListener(theme,client,n,"click","selected",n,selected);
+ theme.addSetVarListener(theme,client,n,"click",selectionVariable,key,immediate);
+
+ } else if (selectMode == "multi") {
+ theme.addToggleClassListener(theme,client,n,"click","selected");
+ theme.addToggleVarListener(theme,client,n,"click",selectionVariable,key,immediate);
+
+ }
+ }
+ }
+
+ // Actions
+ if (!disabled && !readonly) {
+ for (var i = 0; i< node.childNodes.length;i++) {
+ var childNode = node.childNodes[i];
+ if (childNode.nodeName == "al" ) {
+ theme.renderActionPopup(renderer,childNode,n,actions,actionVar,key); // TODO check
+ }
+ }
+ }
+
+ // Render all sub-nodes
+ if (node.nodeName == "node") {
+ var subnodes = theme.createElementTo(target,"div","nodes");
+ if (node.childNodes != null && node.childNodes.length >0) {
+ img.src = theme.root + "img/tree/on.gif";
+ img.expanded = "true";
+ } else {
+ img.src = theme.root + "img/tree/off.gif";
+ img.expanded = "false";
+ }
+ for (var i = 0; i< node.childNodes.length;i++) {
+ var childNode = node.childNodes[i];
+ if (childNode.nodeName == "node" || childNode.nodeName == "leaf") {
+ theme.renderTreeNode(renderer,childNode,subnodes,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly);
+ }
+ }
+
+ // Add event listener
+ if (!disabled) {
+ var target = (selectable&&!readonly?img:n);
+ theme.addToggleClassListener(theme,client,target,"mouseup","hidden",subnodes);
+ theme.addExpandNodeListener(theme,client,img,"mouseup",subnodes,expandVariable,collapseVariable,key,immediate,target);
+ theme.addStopListener(theme,client,target,"mouseup");
+ theme.addStopListener(theme,client,target,"click");
+ }
+
+ } else {
+ img.src = theme.root + "img/tree/empty.gif";
+ }
+
+}
+
+DefaultTheme.prototype.renderTextField = function(renderer,uidl,target, layoutInfo) {
+
+ var client = renderer.client;
+ var theme = renderer.theme;
+ var immediate = uidl.getAttribute("immediate") == "true";
+ var readonly = uidl.getAttribute("readonly") == "true";
+ var multiline = uidl.getAttribute("multiline") == "true";
+ var secret = uidl.getAttribute("secret") == "true";
+ var cols = uidl.getAttribute("cols");
+ var rows = uidl.getAttribute("rows");
+ var disabled = uidl.getAttribute("disabled") == "true";
+ var focusid = uidl.getAttribute("focusid");
+ var tabindex = uidl.getAttribute("tabindex");
+
+ // Create containing element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Render default header
+ renderer.theme.renderDefaultComponentHeader(renderer,uidl,div, layoutInfo);
+
+ // Create border
+ var border = renderer.theme.createElementTo(div,"div","border");
+
+ // Create input
+ var input = null;
+ if (multiline) {
+ input = renderer.theme.createElementTo(border,"textarea");
+ input.wrap = "off";
+ if (focusid) {
+ input.focusid = focusid;
+ }
+ } else {
+ input = renderer.theme.createInputElementTo(border,(secret?"password":"text"),null,focusid);
+
+ }
+ if (tabindex) input.tabIndex = tabindex;
+ if (disabled||readonly) {
+ input.disabled = "true";
+ }
+
+
+ // Assign cols and rows
+ if (cols >0) {
+ if (multiline) {
+ input.cols = cols;
+ } else {
+ input.size = cols;
+ }
+ }
+ if (rows >0) {
+ input.rows = rows;
+ }
+
+ // Find variable node
+ var strNode = theme.getVariableElement(uidl,"string","text");
+ var inputId = strNode.getAttribute("id");
+ input.id = inputId;
+
+ // Assign value
+ strNode= theme.getFirstTextNode(strNode);
+ if (strNode != null && strNode.data != null) {
+ input.value = strNode.data;
+ }
+
+ // Listener
+ theme.addSetVarListener(theme,client,input,"change",inputId,input,immediate);
+}
+
+DefaultTheme.prototype.renderDateField = function(renderer,uidl,target,layoutInfo) {
+ // TODO needs simplification
+ // - jscalendar supports time! but not resolution?
+ // - dynamic .js loading!
+
+ var theme = renderer.theme;
+
+ // Create containing element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ /* Styles:
+ * time - only time selection (no date)
+ */
+ var style = uidl.getAttribute("style");
+
+ var immediate = uidl.getAttribute("immediate") == "true";
+ var disabled = uidl.getAttribute("disabled") == "true";
+ var readonly = uidl.getAttribute("readonly") == "true";
+
+ /* locale, translate UI */
+ var locale = uidl.getAttribute("locale")
+ if (locale && !disabled && !readonly) {
+ locale = locale.toLowerCase().split("_")[0];
+ var lang = renderer.client.loadDocument(theme.root+"jscalendar/lang/calendar-"+locale+".js",false);
+ if (lang) {
+ try {
+ window.eval(lang);
+ } catch (e) {
+ client.error("Could not eval DateField lang ("+locale+"):"+e );
+ }
+ }
+ }
+
+ // Render default header
+ renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ var yearVar = theme.getVariableElement(uidl,"integer","year");
+ var monthVar = theme.getVariableElement(uidl,"integer","month");
+ var dayVar = theme.getVariableElement(uidl,"integer","day");
+ var hourVar = theme.getVariableElement(uidl,"integer","hour");
+ var minVar = theme.getVariableElement(uidl,"integer","min");
+ var secVar = theme.getVariableElement(uidl,"integer","sec");
+ var msecVar = theme.getVariableElement(uidl,"integer","msec");
+
+ var year = null;
+ var month = null;
+ var day = null;
+ var hour = null;
+ var min = null;
+ var sec = null;
+ var msec = null;
+ var text = null;
+
+ var inputId = yearVar.getAttribute("id") + "_input";
+ var buttonId = yearVar.getAttribute("id") + "_button";
+
+ // Assign the value to textfield
+ var yearValue = yearVar != null? yearVar.getAttribute("value"): null;
+ var monthValue = monthVar != null? monthVar.getAttribute("value"): null;
+ var dayValue = dayVar != null? dayVar.getAttribute("value"): null;
+ var hourValue = hourVar != null? hourVar.getAttribute("value"): null;
+ var minValue = minVar != null? minVar.getAttribute("value"): null;
+ var secValue = secVar != null? secVar.getAttribute("value"): null;
+ var msecValue = msecVar != null? msecVar.getAttribute("value"): null;
+
+ if (style != "time") {
+ if (dayValue) {
+ // Using calendar - create textfield
+ if (readonly) {
+ text = theme.createTextNodeTo(div,dayValue+"."+monthValue+"."+yearValue);
+ } else {
+ text = theme.createInputElementTo(div,"text");
+ text.id = inputId;
+ text.size = "10";
+ if (disabled) {
+ text.disabled = true;
+ }
+ if (yearValue >0 && monthValue >0 && dayValue >0) {
+ text.value = dayValue+"."+monthValue+"."+yearValue;
+ } else {
+ text.value ="";
+ }
+ }
+
+ // Create button
+ var button = theme.createInputElementTo(div,"button");
+ button.id =buttonId;
+ button.value = "...";
+ if (disabled||readonly) {
+ button.disabled = true;
+ }
+ } else {
+ if (yearVar) {
+ // Year select
+ if (readonly) {
+ theme.createTextNodeTo(div,yearValue);
+ } else {
+ var year = theme.createElementTo(div,"select");
+ year.options[0] = new Option("",-1);
+ for (var i=0;i<2000;i++) {
+ year.options[i+1] = new Option(i+1900,i+1900);
+ if (yearValue == (i+1900)) {
+ year.options[i+1].selected = true;
+ }
+ }
+ if (disabled) {
+ year.disabled = true;
+ }
+ if (!readonly) theme.addSetVarListener(theme,client,year,"change",yearVar.getAttribute("id"),year,immediate);
+ }
+ }
+ if (monthVar) {
+ // Month select
+ if (readonly) {
+ theme.createTextNodeTo(div,"."+monthValue);
+ } else {
+ month = theme.createElementTo(div,"select");
+ month.options[0] = new Option("",-1);
+ for (var i=0;i<12;i++) {
+ month.options[i+1] = new Option(i+2,i+2);
+ if (monthValue == i+2) {
+ month.options[i+1].selected = true;
+ }
+ }
+ if (disabled) {
+ month.disabled = true;
+ }
+ if (!readonly) theme.addSetVarListener(theme,client,month,"change",monthVar.getAttribute("id"),month,immediate);
+ }
+ }
+ }
+ }
+ if (hourVar) {
+ if (readonly) {
+ theme.createTextNodeTo(div," "+(hourValue<10?"0"+hourValue:hourValue));
+ } else {
+ hour = theme.createElementTo(div,"select");
+ hour.options[0] = new Option("",-1);
+ for (var i=0;i<24;i++) {
+ var cap = (i+1<10?"0"+(i+1):(i+1));
+ if (!minVar) {
+ // Append anyway, makes it easier to recognize as time
+ cap = cap + ":00";
+ }
+ hour.options[i+1] = new Option(cap,i+1);
+ if (hourValue == i+1) {
+ hour.options[i+1].selected = true;
+ }
+ }
+ if (disabled) {
+ hour.disabled = true;
+ }
+ if (!readonly) theme.addSetVarListener(theme,client,hour,"change",hourVar.getAttribute("id"),hour,immediate);
+ }
+ }
+ if (minVar) {
+ // Minute select
+ if (readonly) {
+ theme.createTextNodeTo(div,":"+(minValue<10?"0"+minValue:minValue));
+ } else {
+ theme.createTextNodeTo(div,":");
+ min = theme.createElementTo(div,"select");
+ min.options[0] = new Option("",-1);
+ for (var i=0;i<60;i++) {
+ min.options[i+1] = new Option((i<10?"0"+(i):(i)),i);
+ if (minValue == i) {
+ min.options[i+1].selected = true;
+ }
+ }
+ if (disabled) {
+ min.disabled = true;
+ }
+ if (!readonly) theme.addSetVarListener(theme,client,min,"change",minVar.getAttribute("id"),min,immediate);
+ }
+ }
+ if (secVar) {
+ // Second select
+ if (readonly) {
+ theme.createTextNodeTo(div,":"+(secValue<10?"0"+secValue:secValue));
+ } else {
+ theme.createTextNodeTo(div,":");
+ sec = theme.createElementTo(div,"select");
+ sec.options[0] = new Option("",-1);
+ for (var i=0;i<60;i++) {
+ sec.options[i+1] = new Option((i<10?"0"+(i):(i)),i);
+ if (secValue == i) {
+ sec.options[i+1].selected = true;
+ }
+ }
+ if (disabled) {
+ sec.disabled = true;
+ }
+ if (!readonly) theme.addSetVarListener(theme,client,sec,"change",secVar.getAttribute("id"),sec,immediate);
+ }
+ }
+ if (msecVar) {
+ // Millisecond select
+ if (readonly) {
+ var cap = msecValue;
+ if (i+1 < 100) {
+ cap = "0"+cap;
+ }
+ if (i+1 < 10) {
+ cap = "0"+cap;
+ }
+ theme.createTextNodeTo(div,"."+cap);
+ } else {
+ theme.createTextNodeTo(div,".");
+ msec = theme.createElementTo(div,"select");
+ msec.options[0] = new Option("",-1);
+ for (var i=0;i<1000;i++) {
+ var cap = i;
+ if (i < 100) {
+ cap = "0"+cap;
+ }
+ if (i < 10) {
+ cap = "0"+cap;
+ }
+ msec.options[i+1] = new Option(cap,i);
+ if (msecValue == i) {
+ msec.options[i+1].selected = true;
+ }
+ }
+ if (disabled) {
+ msec.disabled = true;
+ }
+ if (!readonly) theme.addSetVarListener(theme,client,msec,"change",msecVar.getAttribute("id"),msec,immediate);
+ }
+ }
+
+ if (!readonly) {
+ if (msec) theme.addDateFieldNullListener(client,msec,text,msec,sec,min,hour,day,month,year,yearVar,immediate);
+ if (sec) theme.addDateFieldNullListener(client,sec,text,msec,sec,min,hour,day,month,year,yearVar,immediate);
+ if (min) theme.addDateFieldNullListener(client,min,text,msec,sec,min,hour,day,month,year,yearVar,immediate);
+ if (hour) theme.addDateFieldNullListener(client,hour,text,msec,sec,min,hour,day,month,year,yearVar,immediate);
+ if (day) theme.addDateFieldNullListener(client,day,text,msec,sec,min,hour,day,month,year,yearVar,immediate);
+ if (month) theme.addDateFieldNullListener(client,month,text,msec,sec,min,hour,day,month,year,yearVar,immediate);
+ if (year) theme.addDateFieldNullListener(client,year,text,msec,sec,min,hour,day,month,year,yearVar,immediate);
+
+ }
+
+ var nullFunc = function () {
+ // TODO wierd when un-nulling
+ // -> serverside, examine
+ // + nulls in dropdowns!
+ text.value = "";
+ if (msec) {
+ msec.options[0].selected = true;
+ //client.changeVariable(msecVar.getAttribute("id"), -1, false);
+ }
+ if (sec) {
+ sec.options[0].selected = true;
+ //client.changeVariable(secVar.getAttribute("id"), -1, false);
+ }
+ if (min) {
+ min.options[0].selected = true;
+ //client.changeVariable(minVar.getAttribute("id"), -1, false);
+ }
+ if (hour) {
+ hour.options[0].selected = true;
+ //client.changeVariable(hourVar.getAttribute("id"), -1, false);
+ }
+ //client.changeVariable(dayVar.getAttribute("id"), -1, false);
+ //client.changeVariable(monthVar.getAttribute("id"), -1, false);
+ client.changeVariable(yearVar.getAttribute("id"), -1, immediate);
+ }
+
+ // Function that updates the datefield
+ var updateFunc = function (event) {
+ if (text.value == null || text.value == "") {
+ nullFunc();
+ return;
+ }
+ if (dayVar) {
+ var d = text.value.split(".")[0];
+ if (d == null || d < 1 || d > 31 ) alert("Error");
+ client.changeVariable(dayVar.getAttribute("id"), d, false);
+ }
+ if (monthVar) {
+ var m = text.value.split(".")[1];
+ if (m == null || m < 1 || m > 12) alert("Error");
+ client.changeVariable(monthVar.getAttribute("id"), m, false);
+ }
+ var y = text.value.split(".")[2];
+ if (y == null || y < 0 || y > 5000) alert("Error");
+ client.changeVariable(yearVar.getAttribute("id"), y, immediate);
+
+
+ };
+
+ if (!readonly && !disabled && style != "time" && dayVar) {
+ // Create a unique temporary variable
+ // Dont know if all this is needed, but its purpose is to avoid
+ // javascript problems with event handlers scopes.
+ var temp = "datefield_" + (new Date()).getTime();;
+ eval (temp + " = new Object();");
+ (eval (temp)).update = function () { updateFunc() };
+ var st = "Calendar.setup({onUpdate : function () { " + temp +
+ ".update(); } ,inputField : '"+inputId+"', firstDay : 1,"+
+ " ifFormat : '%d.%m.%Y', button : '"+buttonId+"'});";
+
+ // Assign update function to textfield
+ text.onchange = updateFunc;
+
+ // TODO externalize:
+ // Assign initialization to button mouseover (lazy initialization)
+ client.addEventListener(button, "mouseover", function(event) {
+ if (!eval(temp).initialized) {
+ eval(temp).initialized =true;
+ eval(st);
+ }
+ }
+ );
+ }
+}
+DefaultTheme.prototype.addDateFieldNullListener = function (client,elm,text,msec,sec,min,hour,day,month,year,yearVar,immediate) {
+ client.addEventListener(elm, "change", function(event) {
+
+ if ( !elm || elm.value != -1) return;
+
+
+ if (text) text.value = "";
+
+ if (msec) {
+ msec.options[0].selected = true;
+ //client.changeVariable(msecVar.getAttribute("id"), -1, false);
+ }
+ if (sec) {
+ sec.options[0].selected = true;
+ //client.changeVariable(secVar.getAttribute("id"), -1, false);
+ }
+ if (min) {
+ min.options[0].selected = true;
+ //client.changeVariable(minVar.getAttribute("id"), -1, false);
+ }
+ if (hour) {
+ hour.options[0].selected = true;
+ //client.changeVariable(hourVar.getAttribute("id"), -1, false);
+ }
+ if (day) {
+ hour.options[0].selected = true;
+ //client.changeVariable(hourVar.getAttribute("id"), -1, false);
+ }
+ if (month) {
+ hour.options[0].selected = true;
+ //client.changeVariable(hourVar.getAttribute("id"), -1, false);
+ }
+ if (year) {
+ hour.options[0].selected = true;
+ //client.changeVariable(hourVar.getAttribute("id"), -1, false);
+ }
+ //client.changeVariable(dayVar.getAttribute("id"), -1, false);
+ //client.changeVariable(monthVar.getAttribute("id"), -1, false);
+ client.changeVariable(yearVar.getAttribute("id"), -1, immediate);
+ });
+}
+
+DefaultTheme.prototype.renderDateFieldCalendar = function(renderer,uidl,target,layoutInfo) {
+
+ var theme = renderer.theme;
+
+ // Create containing element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Render default header
+ renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ var immediate = uidl.getAttribute("immediate") == "true";
+ var enabled = uidl.getAttribute("enabled") == "true";
+ var readonly = uidl.getAttribute("readonly") == "true";
+ var yearVar = theme.getVariableElement(uidl,"integer","year");
+ var monthVar = theme.getVariableElement(uidl,"integer","month");
+ var dayVar = theme.getVariableElement(uidl,"integer","day");
+ var hourVar = theme.getVariableElement(uidl,"integer","hour");
+ var minVar = theme.getVariableElement(uidl,"integer","minutes");
+ var secVar = theme.getVariableElement(uidl,"integer","seconds");
+ var msecVar = theme.getVariableElement(uidl,"integer","millseconds");
+
+ var showTime = hourVar != null;
+ var inputId = yearVar.getAttribute("id") + "_input";
+
+ // Create container DIV
+ var calDiv = theme.createElementTo(div,"div");
+ calDiv.id = inputId;
+
+ // Assign the value to textfield
+ var yearValue = yearVar != null? yearVar.getAttribute("value"): -1;
+ var monthValue = monthVar != null? monthVar.getAttribute("value"): -1;
+ var dayValue = dayVar != null? dayVar.getAttribute("value"): -1;
+ var hourValue = hourVar != null? hourVar.getAttribute("value"): -1;
+ var minValue = minVar != null? minVar.getAttribute("value"): -1;
+ var secValue = secVar != null? secVar.getAttribute("value"): -1;
+ var msecValue = msecVar != null? msecVar.getAttribute("value"): -1;
+ if (yearValue >0 && monthValue >0 && dayValue >0) {
+ //TODO Assign date
+ } else {
+ //TODO Assign date
+ }
+
+
+ // Create a unique temporary variable
+ // Dont know if all this is needed, but its purpose is to avoid
+ // javascript problems with event handlers scopes.
+ var temp = "datefield_" + (new Date()).getTime();;
+ eval (temp + " = new Object();");
+
+ // Function that updates the datefield
+ var dateChanged = function (cal) {
+ var y = cal.date.getFullYear();
+ var m = cal.date.getMonth();
+ var d = cal.date.getDate();
+ if (d == null || y == null || m == null || d < 1 ||
+ d > 31 || m < 1 || m > 12 || y < 0 || y > 5000) alert("Error");
+ client.changeVariable(dayVar.getAttribute("id"), d, false);
+ client.changeVariable(monthVar.getAttribute("id"), m, false);
+ client.changeVariable(yearVar.getAttribute("id"), y, immediate);
+ };
+
+ // Calendar setup code
+ (eval (temp)).update = dateChanged;
+ var st = "Calendar.setup({flatCallback : function (cal) { " + temp +
+ ".update(cal); } ,showsTime: "+showTime+", flat: '"+inputId+"', firstDay : 1,"+
+ " ifFormat : '%d.%m.%Y'});";
+
+
+ // Assign initialization to button mouseover (lazy initialization)
+ client.addEventListener(div, "mouseover", function(event) {
+ if (!eval(temp).initialized) {
+ eval(temp).initialized =true;
+ eval(st);
+
+ }
+ }
+ );
+
+}
+
+DefaultTheme.prototype.renderUpload = function(renderer,uidl,target,layoutInfo) {
+
+ var theme = renderer.theme;
+ var client = renderer.client;
+ var varNode = theme.getVariableElement(uidl,"uploadstream","stream");
+
+ // Create containing element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Render default header
+ renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ // Unique name for iframes
+ var frameName = "upload_"+varNode.getAttribute("id")+"_iframe";
+
+ var iframe = theme.createElementTo(div, "iframe");
+ iframe.style.width = '300px';
+ iframe.style.height = '30px';
+ iframe.id = frameName;
+ iframe.name = frameName;
+ iframe.src = 'about:blank';
+ iframe.style.border = 'none';
+ iframe.style.margin = '0px';
+ iframe.style.padding = '0px';
+ iframe.style.background = 'none';
+
+
+ // Get the window object of the iframe
+ var ifr = window.frames[frameName];
+
+ // TODO: FF fix. The above does not work in FF, so we
+ // have to work our way around it. Iterate all frames.
+ if (ifr == null) {
+ var fi = 0;
+ while (fi < window.frames.length) {
+ if (window.frames[fi].frameElement != null && window.frames[fi].frameElement.name == frameName) {
+ ifr = window.frames[fi];
+ }
+ fi++;
+ }
+ }
+
+ if (ifr != null) {
+
+ // TODO: Put some initial content to IFRAME.
+ // Nasty, but without this the browsers fail
+ // to create any elements into window.
+ var code="<HTML>"+"<BODY STYLE=\" overflow: hidden; border: none; margin: 0px; padding: 0px;\"><\/BODY><\/HTML>";
+ ifr.document.open();
+ ifr.document.write(code);
+ ifr.document.close();
+
+
+ // Ok. Now we are ready render the actual upload form and
+ // inputs.
+ var form = ifr.document.createElement('form');
+ form.setAttribute("action",client.ajaxAdapterServletUrl);
+ form.setAttribute("method", "post");
+ form.setAttribute("enctype", "multipart/form-data");
+ if (document.all) {
+ form = ifr.document.createElement('<form action="'+client.ajaxAdapterServletUrl+'" method="post" enctype="multipart/form-data">');
+ }
+ var upload = theme.createInputElementTo(form, "file");
+ upload.id = varNode.getAttribute("id");
+ upload.name = varNode.getAttribute("id");
+ var submit = theme.createInputElementTo(form, "submit");
+ submit.value = "Send";
+ ifr.document.body.appendChild(form);
+
+ // Attach event listeners for processing the chencges after upload.
+ if (document.all) {
+ iframe.onreadystatechange = function() {
+ if (iframe.readyState == "complete") {
+ //TODO: Is there a better way? Cannot figure out a
+ // way to take the changes out of iframes document in IE.
+ // FF seems to be working, but IE just renders the
+ // XML as highlight HTML and looses the original XML.
+ //div.ownerDocument.location.reload();
+ div.ownerDocument.location.href = div.ownerDocument.location.href;
+ }
+ };
+ } else {
+ iframe.onload = function() {
+ if (ifr.document != null && (ifr.document.contentType == "application/xml")) {
+ // TODO: Damn. This would be nice but seems to be unreliable:
+ //client.processUpdates(ifr.document);
+ //div.ownerDocument.location.reload();
+ div.ownerDocument.location.href = div.ownerDocument.location.href;
+
+ }
+ };
+ }
+
+ }
+}
+
+DefaultTheme.prototype.renderEmbedded = function(renderer,uidl,target,layoutInfo) {
+
+ var theme = renderer.theme;
+
+ // Create containing element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Render default header
+ renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ if (uidl.getAttribute("type") == "image") {
+
+ // Image mode
+ var img = renderer.theme.createElementTo(div,"img","embedded");
+
+ // SRC
+ var val = uidl.getAttribute("src");
+ if (val != null) img.src = val;
+
+ // Width
+ val = uidl.getAttribute("width");
+ if (val != null && val > 0) img.width = val;
+
+ // Height
+ val = uidl.getAttribute("height");
+ if (val != null && val > 0) img.height = val;
+
+ // ALT-attribute
+ img.alt = theme.getElementContent(uidl,"description");
+ } else {
+
+ /*
+ // Object mode
+ var embedded = renderer.theme.createElementTo(div,"object","embedded");
+ // SRC
+ var val = uidl.getAttribute("src");
+ if (val) embedded.src = val;
+
+
+ // Width
+ val = uidl.getAttribute("width");
+ if (val != null && val > 0) embedded.width = val;
+
+ // Height
+ val = uidl.getAttribute("height");
+ if (val != null && val > 0) embedded.height = val;
+
+ // Codebase
+ val = uidl.getAttribute("codebase");
+ if (val != null) embedded.codebase = val;
+
+ // Standby
+ val = uidl.getAttribute("standby");
+ if (val != null) embedded.codebase = val;
+ */
+
+ var html = "<object ";
+ var val = uidl.getAttribute("src");
+ if (val) html += " data=\""+val+"\" ";
+
+ val = uidl.getAttribute("width");
+ if (val) html += " width=\""+val+"\" ";
+
+ val = uidl.getAttribute("height");
+ if (val) html += " height=\""+val+"\" ";
+
+ val = uidl.getAttribute("codebase");
+ if (val) html += " codebase=\""+val+"\" ";
+
+ val = uidl.getAttribute("standby");
+ if (val) html += " standby=\""+val+"\" ";
+
+ html += ">";
+
+ // Add all parameters
+ var params = theme.getChildElements(uidl,"embeddedparams");
+ if (params != null) {
+ var len = params.length;
+ for (var i=0;i<len;i++) {
+ html += "<param name=\""+params[i].getAttribute("name")+"\" value=\""+params[i].getAttribute("name")+"\" />"
+ }
+ }
+
+ html += "</object>";
+
+ div.innerHTML = html;
+ }
+}
+
+DefaultTheme.prototype.renderLink = function(renderer,uidl,target,layoutInfo) {
+ // Shortcut variables
+ var theme = renderer.theme;
+ var client = renderer.client;
+
+ var immediate = "true"==uidl.getAttribute("immediate");
+ var disabled = "true"==uidl.getAttribute("disabled");
+ var readonly = "true"==uidl.getAttribute("readonly");
+
+ var targetName = uidl.getAttribute("name");
+ var width = uidl.getAttribute("width");
+ var height = uidl.getAttribute("height");
+ var border = uidl.getAttribute("border");
+ var src = uidl.getAttribute("src");
+ if (src && src.indexOf("theme://") == 0) {
+ src = theme.root + src.substring(8);
+ }
+
+ // Create containing element
+ var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ var link = theme.createElementTo(div,"div", "link pad clickable");
+
+ if (!disabled&&!readonly) {
+ theme.addAddClassListener(theme,client,div,"mouseover","over");
+ theme.addRemoveClassListener(theme,client,div,"mouseout","over");
+
+ var feat;
+ switch (border) {
+ case "minimal":
+ feat = "menubar=yes,location=no,status=no";
+ break;
+ case "none":
+ feat = "menubar=no,location=no,status=no";
+ break;
+ default:
+ feat = "menubar=yes,location=yes,scrollbars=yes,status=yes";
+ break;
+ }
+ if (width||height) {
+ feat += ",resizable=no";
+ feat += (width?",width="+width:"");
+ feat += (height?",height="+height:"");
+ } else {
+ feat += ",resizable=yes";
+ }
+ theme.addLinkOpenWindowListener(theme,client,div,"click",src,targetName,feat);
+ }
+ /*
+ with(props) {
+ client.addEventListener(div,"mouseover", function(e) {
+ theme.addCSSClass(div,"over");
+ }
+ );
+ client.addEventListener(div,"mouseout", function(e) {
+ theme.removeCSSClass(div,"over");
+ }
+ );
+ client.addEventListener(div,"click", function(e) {
+ theme.hidePopup();
+ if (!target) {
+ window.location = src;
+ } else {
+ var feat;
+ switch (border) {
+ case "minimal":
+ feat = "menubar=yes,location=no,status=no";
+ break;
+ case "none":
+ feat = "menubar=no,location=no,status=no";
+ break;
+ default:
+ feat = "menubar=yes,location=yes,scrollbars=yes,status=yes";
+ break;
+ }
+ if (width||height) {
+ feat += ",resizable=no"
+ } else {
+ feat += ",resizable=yes"
+ }
+ var win = window.open(src, target,
+ feat
+ +(width?",width="+width:"")
+ +(height?",height="+height:"")
+ );
+ win.focus();
+ }
+ }
+ );
+ }
+ */
+ //var inner = theme.createElementTo(div,"div", "border pad");
+
+ // Render default header
+ theme.renderDefaultComponentHeader(renderer,uidl,link);
+
+ // Description under link
+ var descriptionText = theme.getElementContent(uidl,"description");
+ if (descriptionText) {
+ var desc = theme.createElementTo(link,"div", "description");
+ theme.createTextNodeTo(desc,descriptionText);
+ }
+}
+DefaultTheme.prototype.addLinkOpenWindowListener = function(theme,client,element,event,url,target,features) {
+ client.addEventListener(element,(event=="rightclick"?"click":event), function(e) {
+ var evt = client.getEvent(e);
+ if (event=="rightclick"&&!evt.rightclick) return;
+ if (!target) {
+ window.location = url;
+ } else {
+ var win = window.open(url, target, features);
+ win.focus();
+ }
+ }
+ );
+}
+DefaultTheme.prototype.renderTable = function(renderer,uidl,target,layoutInfo) {
+ // Shortcut variables
+ var theme = renderer.theme;
+ var client = renderer.client;
+
+ // Create containing DIV
+ var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ if ("list"==uidl.getAttribute("style")) {
+ theme.removeCSSClass(div,"table");
+ theme.addCSSClass(div,"list");
+ }
+ // Create default header
+ var caption = theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ // Get table attributes
+ var rowheaders = ("true"==uidl.getAttribute("rowheaders"));
+ var totalrows = parseInt(uidl.getAttribute("totalrows"));
+ var pagelength = parseInt(uidl.getAttribute("pagelength"));
+ var rowCount = parseInt(uidl.getAttribute("rows"));
+ var firstvisible = theme.getVariableElementValue(theme.getVariableElement(uidl,"integer","firstvisible"))||1;
+ var firstvisibleVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"integer","firstvisible"));
+ var immediate = ("true" == uidl.getAttribute("immediate"));
+ var selectMode = uidl.getAttribute("selectmode");
+ var selectable = selectMode == "multi" || selectMode == "single";
+ var selected; // Selected map
+ if (selectable) {
+ selected = new Array();
+ }
+ var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected"));
+ var visibleCols = theme.getFirstElement(uidl,"visiblecolumns");
+ var collapseVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","collapsedcolumns"));
+ var sortcolVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"string","sortcolumn"));
+ var sortkey = theme.getVariableElementValue(theme.getVariableElement(uidl,"string","sortcolumn"));
+ var sortasc = theme.getVariableElement(uidl,"boolean","sortascending");
+ var sortascVar = theme.createVariableElementTo(div,sortasc);
+ sortasc = sortasc != null && "true"==sortasc.getAttribute("value");
+
+ var actions = null;
+ var actionVar = null;
+ var alNode = theme.getFirstElement(uidl,"actions")
+ if (alNode) {
+ actionVar = theme.createVariableElementTo(div,theme.getVariableElement(alNode,"string","action"));
+ actions = new Object();
+ var ak = alNode.getElementsByTagName("action");
+ for (var i=0;i<ak.length;i++) {
+ actions[ak[i].getAttribute("key")] = ak[i].getAttribute("caption");
+ }
+ }
+ delete alNode;
+
+ // Create table for content
+ div = theme.createElementTo(div,"div","outset");
+ div = theme.createElementTo(div,"div","content border");
+
+ var table = theme.createElementTo(div,"table");
+ table = theme.createElementTo(table,"tbody");
+ table.setAttribute("cellpadding","0");
+ table.setAttribute("cellspacing","0");
+ var tr = null;
+ var td = null;
+
+
+ // Column headers
+ var cols = theme.getFirstElement(uidl,"cols");
+ if (cols != null) {
+ cols = cols.getElementsByTagName("ch");
+ }
+ if (cols != null && cols.length >0) {
+ tr = theme.createElementTo(table,"tr","header");
+ if (rowheaders) {
+ theme.createElementTo(tr,"td","empty");
+ }
+ for (var i=0; i<cols.length;i++) {
+ var sortable = cols[i].getAttribute("sortable");
+ td = theme.createElementTo(tr,"td","cheader bg");
+ // Sorting
+ var key = cols[i].getAttribute("cid");
+ if (sortable=="true") {
+ theme.addCSSClass(td,"clickable");
+ // Sorting always immediate
+ theme.addSetVarListener(theme,client,td,"click",sortascVar,(key==sortkey?!sortasc:sortasc),false);
+ theme.addSetVarListener(theme,client,td,"click",sortcolVar,key,true);
+
+ }
+ var ch = cols[i].getAttribute("caption");
+ var cap = theme.createElementTo(td,"div","caption");
+ theme.createTextNodeTo(cap,ch != null? ch : "");
+ if (sortkey==key) {
+ var icon = theme.createElementTo(cap,"IMG","icon");
+ icon.src = theme.root+"img/table/"+(sortasc?"asc.gif":"desc.gif");
+ }
+ }
+
+ // Collapsing
+ td = theme.createElementTo(tr,"td","cheader scroll bg");
+ if (visibleCols) {
+ var iconDiv = theme.createElementTo(td,"div");
+ var icon = theme.createElementTo(iconDiv,"img","icon");
+ icon.src = theme.root+"/img/table/colsel.gif";
+ var popup = theme.createElementTo(td,"div","outset popup hide");
+ var inner = theme.createElementTo(popup,"div","border");
+ // empty row to allow closing:
+ var row = theme.createElementTo(inner,"div","item clickable pad border");
+
+ theme.addHidePopupListener(theme,client,row,"click");
+ theme.addToggleClassListener(theme,client,row,"mouseover","over");
+ theme.addToggleClassListener(theme,client,row,"mouseout","over");
+ theme.addTogglePopupListener(theme,client,iconDiv,"click",popup);
+
+ var cols = visibleCols.getElementsByTagName("column");
+ for (var i=0;i<cols.length;i++) {
+ var row = theme.createElementTo(inner,"div","item clickable pad border");
+ var collapsed = "true"==cols[i].getAttribute("collapsed");
+ icon = theme.createElementTo(row,"img","icon");
+ icon.src = theme.root+"/img/table/"+(collapsed?"off.gif":"on.gif");
+ theme.createTextNodeTo(row,cols[i].getAttribute("caption"));
+
+ theme.addToggleClassListener(theme,client,row,"mouseover","over");
+ theme.addToggleClassListener(theme,client,row,"mouseout","over");
+ theme.addToggleVarListener(theme,client,row,"click",collapseVariable,cols[i].getAttribute("cid"),true);
+ }
+ delete cols;
+ }
+ }
+ delete cols;
+
+ // Table rows
+ var rows = theme.getFirstElement(uidl,"rows");
+ if (rows != null) {
+ rows = theme.getChildElements(rows,"tr");
+ }
+ if (rows != null && rows.length >0) {
+ for (var i=0; i<rows.length;i++) {
+ tr = theme.createElementTo(table,"tr");
+ // TODO rowheader
+ theme.setCSSClass(tr, (i % 2 == 0?"even":"odd"));
+
+ if (selectable) theme.addCSSClass(tr, "clickable");
+ var key = rows[i].getAttribute("key");
+
+ if (selectable&&"true"==rows[i].getAttribute("selected")) {
+ theme.addCSSClass(tr, "selected");
+ selected[selected.length] = tr;
+ }
+
+ if (selectable) {
+ if (selectMode == "multi") {
+ theme.addToggleClassListener(theme,client,tr,"click","selected");
+ theme.addToggleVarListener(theme,client,tr,"click",selectionVariable,key,immediate);
+ } else {
+ theme.addAddClassListener(theme,client,tr,"click","selected",tr,selected);
+ theme.addSetVarListener(theme,client,tr,"click",selectionVariable,key,immediate);
+ }
+ }
+
+ if (rowheaders) {
+ var td = theme.createElementTo(tr,"td","rheader bg");
+ var caption = theme.createElementTo(td,"div","caption");
+ theme.createTextNodeTo(caption,rows[i].getAttribute("caption"));
+ }
+ if (rows[i].childNodes != null && rows[i].childNodes.length >0) {
+ var al = null;
+ for (var j=0; j<rows[i].childNodes.length;j++) {
+ if (rows[i].childNodes[j].nodeName == "al") {
+ al = rows[i].childNodes[j];
+ } else if (rows[i].childNodes[j].nodeType == Node.ELEMENT_NODE) {
+ td = theme.createElementTo(tr,"td");
+ renderer.client.renderUIDL(rows[i].childNodes[j],td);
+ if (al) {
+ theme.renderActionPopup(renderer,al,td,actions,actionVar,key);
+ }
+ }
+ }
+ }
+ // SCROLLBAR
+ if (i==0) {
+ td = theme.createElementTo(tr,"td", "scroll border");
+ // TODO:
+ //theme.tableAddScrollEvents(theme,td);
+
+ td.setAttribute("rowSpan",rows.length);
+ var inner = theme.createElementTo(td,"div", "scroll");
+ }
+ }
+ }
+ delete rows;
+
+ var paging = theme.createElementTo(div,"div","nav pad");
+ var button = theme.createElementTo(paging,"div","pad caption inline");
+ if (firstvisible > 1) {
+ theme.addCSSClass(button,"clickable");
+ theme.addAddClassListener(theme,client,button,"mouseover","bg");
+ theme.addRemoveClassListener(theme,client,button,"mouseout","bg");
+ theme.addSetVarListener(theme,client,button,"click",firstvisibleVar,(parseInt(firstvisible)-parseInt(pagelength)),true);
+ } else {
+ theme.addCSSClass(button,"disabled");
+ }
+ theme.createTextNodeTo(button,"<<");
+
+ button = theme.createElementTo(paging,"div","small pad inline");
+ theme.createTextNodeTo(button,firstvisible+" - "+(firstvisible-1+parseInt(rowCount))+ " / " + totalrows);
+
+ button = theme.createElementTo(paging,"div","pad caption inline");
+ if (parseInt(firstvisible)+parseInt(pagelength)<=parseInt(totalrows)) {
+ theme.addCSSClass(button,"clickable");
+ theme.addAddClassListener(theme,client,button,"mouseover","bg");
+ theme.addRemoveClassListener(theme,client,button,"mouseout","bg");
+ theme.addSetVarListener(theme,client,button,"click",firstvisibleVar,(parseInt(firstvisible)+parseInt(pagelength)),true);
+ } else {
+ theme.addCSSClass(button,"disabled");
+ }
+ theme.createTextNodeTo(button,">>");
+}
+
+DefaultTheme.prototype.renderScrollTable = function(renderer,uidl,target,layoutInfo) {
+ // Shortcut variables
+ var theme = renderer.theme;
+ var client = renderer.client;
+ var colWidths;
+ if (target.colWidths) {
+ colWidths = target.colWidths;
+ } else {
+ colWidths = new Object();
+ }
+ var wholeWidth = target.wholeWidth;
+ var scrolledLeft = target.scrolledLeft;
+
+ // Get attributes
+ var pid = uidl.getAttribute("id");
+ var immediate = uidl.getAttribute("immediate")||false;
+ var selectmode = uidl.getAttribute("selectmode");
+ var cols = parseInt(uidl.getAttribute("cols"));
+ var rows = parseInt(uidl.getAttribute("rows"));
+ var totalrows = parseInt(uidl.getAttribute("totalrows"));
+ var pagelength = uidl.getAttribute("pagelength");
+ var colheaders = uidl.getAttribute("colheaders")||false;
+ var rowheaders = uidl.getAttribute("rowheaders")||false;
+ var visiblecols = theme.getFirstElement(uidl,"visiblecolumns");
+ var sortkey = theme.getVariableElementValue(theme.getVariableElement(uidl,"string","sortcolumn"));
+
+ var colorder = new Array();
+ var fv = parseInt(theme.getVariableElementValue(theme.getVariableElement(uidl,"integer","firstvisible"))||1);
+ var selected; // Selected map
+ if (selectmode) {
+ selected = new Array();
+ }
+
+ // Create containing DIV
+ var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ div.colWidths = colWidths;
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Variables
+ var fvVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"integer","firstvisible"));
+ var ccVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","collapsedcolumns"));
+ var coVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","columnorder"));
+ var selVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected"));
+ var sortVar = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"string","sortcolumn"));
+ var sortasc = theme.getVariableElement(uidl,"boolean","sortascending");
+ var sortascVar = theme.createVariableElementTo(div,sortasc);
+ sortasc = (sortasc != null && "true"==sortasc.getAttribute("value"));
+
+ // Create default header
+ var caption = theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+ // column collapsing
+
+ // main div
+ var inner = theme.createElementTo(div,"div","border");
+ inner.innerHTML = "<TABLE width=\"100%\"><TR><TD></TD></TR></TABLE>";
+ if (!wholeWidth) {
+ wholeWidth = inner.offsetWidth||inner.clientWidth||300;
+ wholeWidth -= 2; // Leave room for border, TODO: more dynamic
+ if (wholeWidth<200) wholeWidth = 300;
+ }
+ div.wholeWidth = wholeWidth;
+ var offsetLeft = client.getElementPosition(inner).x;
+
+ // Actions
+ var actions = null;
+ var actionVar = null;
+ var alNode = theme.getFirstElement(uidl,"actions")
+ if (alNode) {
+ actionVar = theme.createVariableElementTo(div,theme.getVariableElement(alNode,"string","action"));
+ actions = new Object();
+ var ak = alNode.getElementsByTagName("action");
+ for (var i=0;i<ak.length;i++) {
+ actions[ak[i].getAttribute("key")] = ak[i].getAttribute("caption");
+ }
+ }
+ delete alNode;
+
+ inner.innerHTML = "<DIV id=\""+pid+"status\" align=\"center\" class=\"abs border pad\" style=\"width:"+(wholeWidth/2)+"px;background-color:white;display:none;\"></DIV><TABLE cellpadding=0 cellspacing=0 border=0 width=100%><TBODY><TR valign=top class=bg><TD></TD><TD width=16></TD></TR></TBODY></TABLE><TABLE>";
+ //inner.style.width = wholeWidth+"px";
+ var vcols = inner.childNodes[1].firstChild.firstChild.childNodes[1];
+ if (visiblecols) {
+ vcols.innerHTML = "<IMG class=\"bg icon\" src=\""+theme.root+"/img/table/colsel.gif\"/>";
+ var icon = vcols.firstChild;
+ vcols.id = pid+"vcols";
+ var popup = theme.createElementTo(div,"div","border popup hide");
+ theme.addTogglePopupListener(theme,client,icon,"click",popup);
+ theme.addStopListener(theme,client,icon,"mouseover");
+ theme.addStopListener(theme,client,icon,"mouseout");
+ var row = theme.createElementTo(popup,"div","item clickable pad border");
+ theme.addHidePopupListener(theme,client,row,"click");
+ var cols = visiblecols.getElementsByTagName("column");
+ for (var i=0;i<cols.length;i++) {
+ var row = theme.createElementTo(popup,"div","item clickable pad border");
+ var collapsed = "true"==cols[i].getAttribute("collapsed");
+ icon = theme.createElementTo(row,"img","icon");
+ icon.src = theme.root+"/img/table/"+(collapsed?"off.gif":"on.gif");
+ theme.createTextNodeTo(row,cols[i].getAttribute("caption"));
+ theme.addAddClassListener(theme,client,row,"mouseover","over");
+ theme.addRemoveClassListener(theme,client,row,"mouseout","over");
+ theme.addToggleVarListener(theme,client,row,"click",ccVar,cols[i].getAttribute("cid"),true);
+ }
+ delete cols;
+ }
+
+
+ // FIRST render the table
+ var alignments = new Array();
+
+ // headers
+ var hout = theme.createElementTo(inner.childNodes[1].firstChild.firstChild.firstChild,"div","bg");
+ hout.style.width = (wholeWidth-16)+"px";
+ hout.style.paddingRight = "0px";
+ hout.id = pid+"hout";
+ hout.style.overflow = "hidden";
+ var html = "<TABLE id=\""+pid+"hin\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><TBODY><TR>";
+ if (rowheaders) {
+ html += "<TD ";
+ if (colWidths["heh"]) {
+ html += "width=\""+colWidths["heh"]+"\" ";
+ }
+ html += "style=\"overflow:hidden\" cid=\"heh\" id=\""+pid+"heh\"><DIV class=\"padnr\" style=\"";
+ if (colWidths["heh"]) {
+ html += "width:"+colWidths["heh"]+"px;";
+ }
+ html += "overflow:hidden;height:100%;white-space:nowrap;border-right:1px solid gray;\"><IMG id=\""+pid+"hah\" align=\"right\" src=\""+theme.root+"/img/table/handle.gif\" border=\"0\" style=\"height:100%;width:2px;cursor:w-resize;\"></DIV></TD>";
+ }
+ var chs = theme.getFirstElement(uidl, "cols").getElementsByTagName("ch");
+ var len = chs.length;
+ for (var i=0;i<len;i++) {
+ var col = chs[i];
+ var cap = col.getAttribute("caption")||(visiblecols?"":"");
+ var sort = col.getAttribute("sortable");
+ var cid = col.getAttribute("cid");
+ var iconUrl = col.getAttribute("icon");
+ if (iconUrl && iconUrl.indexOf("theme://") == 0) {
+ iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root)
+ + iconUrl.substring(8);
+ }
+ alignments[i] = col.getAttribute("align");
+ colorder[i] = cid;
+ html += "<TD ";
+ if (colWidths[cid]) {
+ html += "width=\""+colWidths[cid]+"\" ";
+ }
+ if (sortkey == cid) {
+ html += "sorted=\"true\" ";
+ }
+ html += "style=\"overflow:hidden\" cid=\""+cid+"\" id=\""+pid+"he"+i+"\" >"
+ html += "<DIV class=\"padnr\" ";
+ if (alignments[i]) {
+ switch (alignments[i]) {
+ case "e":
+ html += "align=\"right\"";
+ break;
+ case "c":
+ html += "align=\"center\"";
+ break;
+ default:
+ }
+ }
+ html += " style=\"";
+ if (colWidths[cid]) {
+ html += "width:"+colWidths[cid]+"px;";
+ }
+ html += "overflow:hidden;font-weight:bold;height:100%;white-space:nowrap;border-right:1px solid gray;\"><IMG id=\""+pid+"ha"+cid+"\" align=\"right\" src=\""+theme.root+"/img/table/handle.gif\" border=\"0\" style=\"height:100%;width:4px;cursor:w-resize;\">";
+ html += (iconUrl?"<IMG src=\""+iconUrl+"\" class=\"icon\">":"")+cap+"</DIV></TD>";
+ }
+ html += "</TR></TBODY></TABLE>";
+ hout.innerHTML = html;
+
+ // content
+ // scroll padding calculations
+ // TODO these need to be calculated better, perhaps updated after rendering content
+ var prePad = (fv==1?1:fv*22);
+ var postPad = (totalrows-fv-rows+1)*22;
+ // html
+ cout = theme.createElementTo(inner,"div");
+ cout.style.width = wholeWidth+"px";
+ cout.style.height = (18*rows)+"px";
+ cout.id = pid+"cout";
+ cout.style.overflow = "scroll";
+ html = "<TABLE border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\""+pid+"cin\"><TBODY><TR height=\""+prePad+"\"></TR>";
+ var trs = theme.getFirstElement(uidl, "rows").getElementsByTagName("tr");
+ len = trs.length;
+ if (len==0) {
+ html += "<TR id=\""+pid+"firstrow\"><TD style=\"overflow:hidden\">";
+ html += "<DIV class=\"pad\" style=\"overflow:hidden;height:100%;white-space:nowrap;border-right:1px solid gray;\"></DIV></TD></TR>";
+ }
+ for (var i=0;i<len;i++) {
+ var row = trs[i];
+ var cap = row.getAttribute("caption");
+ var key = row.getAttribute("key");
+ var seld = row.getAttribute("selected");
+ var iconUrl = row.getAttribute("icon");
+ html += "<TR "+(i==0?"id=\""+pid+"firstrow\"":"");
+ html += " key=\""+key+"\"";
+ if (seld) {
+ html += " selected=\"true\" class=\"selected\" ";
+ }
+ html += ">";
+ if (rowheaders) {
+ html += "<TD ";
+ if (colWidths["heh"]) {
+ html += "width=\""+colWidths["heh"]+"\" ";
+ }
+ html += "style=\"overflow:hidden\"><DIV class=\"padnr\" style=\"";
+ if (colWidths["heh"]) {
+ html += "width:"+colWidths["heh"]+"px;";
+ }
+ html += "overflow:hidden;height:100%;white-space:nowrap;border-right:1px solid gray;\">";
+ if (iconUrl) {
+ if (iconUrl.indexOf("theme://") == 0) {
+ iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root)
+ + iconUrl.substring(8);
+ }
+ html += "<IMG src=\""+iconUrl+"\" class=\"icon\" />";
+ }
+ html += row.getAttribute("caption")+"</DIV></TD>";
+ }
+ var comps = row.childNodes;
+ var l = comps.length;
+ if (l==0) {
+ html += "<TD><DIV class=\"padnr\" style=\"overflow:hidden;height:100%;white-space:nowrap;border-right:1px solid gray;\"></DIV></TD>";
+ }
+
+ var colNum = -1;
+ for (j=0;j<l;j++) {
+ var comp = comps[j];
+ if (comp.nodeName == "al"||comp.nodeName == "#text") continue;
+ colNum++;
+ // Placeholder TD, we'll render the content later
+ html += "<TD "
+ if (colWidths[colorder[colNum]]) {
+ html += "width=\""+colWidths[colorder[colNum]]+"\" ";
+ }
+ if (alignments[colNum]) {
+ switch (alignments[colNum]) {
+ case "e":
+ html += " align=\"right\" ";
+ break;
+ case "c":
+ html += " align=\"center\" ";
+ break;
+ default:
+ }
+ }
+ html += "style=\"overflow:hidden\"><DIV class=\"padnr\" style=\"";
+ if (colWidths[colorder[colNum]]) {
+ html += "width:"+colWidths[colorder[colNum]]+"px;";
+ }
+ html += "overflow:hidden;height:100%;white-space:nowrap;border-right:1px solid gray;\"></DIV></TD>";
+ }
+ html += "</TR>";
+ }
+ html += "<TR id=\""+pid+"lastrow\" height=\""+postPad+"\"></TR></TBODY></TABLE>";
+ cout.innerHTML = html;
+
+ // SECOND render the sub-components (TD content)
+ var trs = cout.firstChild.firstChild.childNodes;
+ var utrs = theme.getFirstElement(uidl, "rows").getElementsByTagName("tr");
+ for (var i=0;i<len;i++) {
+ var tr = trs[i+1];
+ var key = tr.getAttribute("key");
+ var comps = utrs[i].childNodes;
+ var l = comps.length;
+ var currentCol = (rowheaders?1:0);
+ var al = null;
+ for (j=0;j<l;j++) {
+ var comp = comps[j];
+ if (comp.nodeName == "#text") continue;
+ if (comp.nodeName == "al") {
+ al = comp;
+ continue;
+ }
+ var trg = tr.childNodes[currentCol++].firstChild;
+ client.renderUIDL(comp, trg);
+ }
+
+ if (al&&tr.firstChild) {
+ theme.renderActionPopup(renderer,al,tr,actions,actionVar,key,"rightclick");
+ }
+
+ // selection
+ if (selectmode) {
+ selected[selected.length] = tr;
+ theme.addCSSClass(tr,"clickable");
+ theme.addToggleClassListener(theme,client,tr,"mouseover","selectable");
+ theme.addToggleClassListener(theme,client,tr,"mouseout","selectable");
+ if (selectmode == "multi") {
+ theme.addToggleClassListener(theme,client,tr,"click","selected");
+ theme.addToggleVarListener(theme,client,tr,"click",selVar,key,immediate);
+ } else {
+ theme.addAddClassListener(theme,client,tr,"click","selected",tr,selected);
+ theme.addSetVarListener(theme,client,tr,"click",selVar,key,immediate);
+ }
+ }
+ }
+
+ // THIRD do some initial sizing and scrolling
+ var fr = target.ownerDocument.getElementById(pid+"firstrow").offsetTop;
+ var lr = target.ownerDocument.getElementById(pid+"lastrow").offsetTop;
+ cout.style.height = (lr-fr+20)+"px";
+ cout.scrollTop = (fv>totalrows-rows?cout.scrollHeight:fr);
+ div.recalc = theme.scrollTableRecalc;
+ div.initialWidth = wholeWidth;
+ div.recalc(pid,target);
+ cout.scrollLeft = scrolledLeft;
+ hout.scrollLeft = scrolledLeft;
+
+ var status = target.ownerDocument.getElementById(pid+"status");
+ var p = client.getElementPosition(inner);
+ status.style.top = (p.y + p.h/2) + "px";
+ status.style.left = (p.x + p.w/2 - wholeWidth/4) +"px";
+ theme.scrollTableAddScrollHandler(client,theme,cout,div,status,lr,fr,rows,totalrows,fv,fvVar,immediate);
+ theme.scrollTableAddScrollListener(theme,div,pid,lr,fr,rows,totalrows,fv);
+
+
+ // Column order drag & drop
+ var hin = target.ownerDocument.getElementById(pid+"hin");
+ var h = hin.getElementsByTagName("td");
+ var dragOrderGroup = new Object();
+ for (var i = 0;i<h.length;i++) {
+ var id = h[i].getAttribute("id");
+ if (id==pid+"heh") {
+ var handle = target.ownerDocument.getElementById(pid+"hah");
+ if (handle) {
+ theme.tableAddWidthListeners(client,theme,handle,"heh",div,pid);
+ }
+ }
+ if (!id||id.indexOf(pid+"he")<0) {
+ continue;
+ }
+ var cid = h[i].getAttribute("cid");
+ var handle = target.ownerDocument.getElementById(pid+"ha"+cid);
+ if (handle) {
+ theme.tableAddWidthListeners(client,theme,handle,cid,div,pid);
+ }
+ if (coVar||sortVar) {
+ theme.addCSSClass(h[i],"clickable");
+ theme.addToDragOrderGroup(client,theme,h[i],dragOrderGroup,coVar,sortVar,sortascVar,sortasc);
+ }
+ }
+
+ var hin = target.ownerDocument.getElementById(pid+"hin");
+ var cin = target.ownerDocument.getElementById(pid+"cin");
+ theme.scrollTableRegisterLF(client,theme,div,inner,cout,hout,cin,hin);
+}
+// Header order drag & drop
+DefaultTheme.prototype.tableAddWidthListeners = function(client,theme,element,cid,table,pid) {
+
+ var colWidths = table.colWidths;
+
+ var mouseDragListener = function (e) {
+ var evt = client.getEvent(e);
+ evt.stop();
+ element.ownerDocument.onselectstart = function(e) {return false;}
+ var target = element.target;
+ var div = target.parentNode;
+ var td = div.parentNode;
+ //target.style.position = "relative";
+ target.style.zIndex = "99999";
+ var offset = -(target.origX-evt.mouseX+10);
+ var w = (target.origW+offset);
+ if (w < 7) w = 7;
+ try {
+ target.style.left = offset+"px";
+ td.width = w;
+ td.style.width = w+"px";
+ td.firstChild.style.width = w+"px";
+ colWidths[cid] = w;
+ } catch (err) {
+ client.debug("Failed: d&d target.style.left="+ offset+"px");
+ }
+
+ }
+
+ var mouseUpListener = function(e) {
+ client.removeEventListener(element.ownerDocument.body,"mousemove",mouseDragListener);
+ client.removeEventListener(element.ownerDocument.body,"mouseup",arguments.callee);
+ client.removeEventListener(element.ownerDocument.body,"drag",stopListener);
+ var evt = client.getEvent(e);
+ evt.stop();
+ element.ownerDocument.onselectstart = null;
+ element.dragging = false;
+ // TODO apply for all rows
+ table.recalc(pid,table);
+ return false;
+ };
+
+ var stopListener = function (e) {
+ var evt = client.getEvent(e);
+ evt.stop();
+ return false;
+ }
+
+ client.addEventListener(element,"mousedown", function(e) {
+ var evt = client.getEvent(e);
+ evt.stop();
+ element.dragging = true;
+ element.moved = false;
+ element.target = evt.target;
+ evt.target.origX = evt.mouseX;
+ evt.target.origW = evt.target.parentNode.offsetWidth;
+ client.addEventListener(element.ownerDocument.body,"mousemove", mouseDragListener);
+ client.addEventListener(element.ownerDocument.body,"mouseup", mouseUpListener);
+ client.addEventListener(element.ownerDocument.body,"drag",stopListener);
+ });
+}
+
+DefaultTheme.prototype.scrollTableRegisterLF = function(client,theme,paintableElement,inner,cout,hout,cin,hin) {
+ client.registerLayoutFunction(paintableElement,function() {
+ var w = (inner.offsetWidth-2) +"px";
+ cout.style.width = w;
+ //cin.style.width = w;
+ //hout.style.width = w;
+ //hin.style.width = w;
+ hout.style.width = hout.offsetParent.offsetWidth + "px";
+ //div.recalc();
+ });
+}
+
+DefaultTheme.prototype.scrollTableAddScrollListener = function (theme,target,pid,lr,fr,rows,totalrows,fv) {
+ var hout = target.ownerDocument.getElementById(pid+"hout");
+ var cout = target.ownerDocument.getElementById(pid+"cout");
+ client.addEventListener(cout,"scroll", function (e) {
+ if (cout.scrollTimeout) {
+ clearTimeout(cout.scrollTimeout);
+ }
+ hout.scrollLeft = cout.scrollLeft;
+ target.scrolledLeft = cout.scrollLeft;
+ var status = target.ownerDocument.getElementById(pid+"status");
+ var d = theme.scrollTableGetFV(cout,lr,fr,rows,totalrows,fv);
+ if (d!=fv) {
+ status.innerHTML = d + "-" + (d+rows-1) + " / " + totalrows;
+ status.style.display = "";
+ }
+ cout.scrollTimeout = setTimeout(function () {
+ var cout = target.ownerDocument.getElementById(pid+"cout");
+ cout.scrollHandler();
+ },500)
+ });
+}
+DefaultTheme.prototype.scrollTableGetFV = function(cout,lr,fr,rows,totalrows,fv) {
+ var rh = (lr-fr)/rows;
+ if (cout.scrollTop >= (fr+rh/2) || cout.scrollTop <= (fr-rh/2)) {
+ var d = Math.round((cout.scrollTop-fr)/rh);
+ d = (fv+d);
+ if (d<1) d=1; // scrolled past begin
+ if (d>(totalrows-rows+1)) d=(totalrows-rows+1); // scrolled past last page
+ return d;
+ } else {
+ return fv;
+ }
+ }
+DefaultTheme.prototype.scrollTableAddScrollHandler = function(client,theme,cout,target,status,lr,fr,rows,totalrows,fv,fvVar,immediate) {
+ cout.scrollHandler = function () {
+ var rh = (lr-fr)/rows;
+ var d = theme.scrollTableGetFV(cout,lr,fr,rows,totalrows,fv);
+ if (d!=fv) {
+ // only submit if firstvisible changed
+ status.innerHTML = d + "-" + (d+rows-1) + " / " + totalrows + "...";
+ status.style.display = "";
+ // always immediate
+ theme.setVariable(client, fvVar, d, true);
+ } else {
+ // else realign
+ status.style.display = "none";
+ cout.scrollTop = fr;
+ }
+ };
+}
+DefaultTheme.prototype.scrollTableRecalc = function(pid,target) {
+ var defPad = 7;
+ var div = target.ownerDocument.getElementById(pid);
+ var wholeWidth = div.initialWidth;
+ var colWidths = div.colWidths;
+ if (!colWidths) {
+ colWidths = new Object();
+ div.colWidths = colWidths;
+ }
+ var hout = target.ownerDocument.getElementById(pid+"hout");
+ var cout = target.ownerDocument.getElementById(pid+"cout");
+ var hin = target.ownerDocument.getElementById(pid+"hin");
+ var cin = target.ownerDocument.getElementById(pid+"cin");
+ var h = hin.getElementsByTagName("td");
+ var c = cin.getElementsByTagName("td");
+ var whole = 0;
+ var col = -1;
+ for (var i = 0;i<h.length;i++) {
+ if (!h[i].getAttribute||!h[i].getAttribute("id")||h[i].getAttribute("id").indexOf(pid+"he")<0) {
+ continue;
+ }
+ col++;
+ // colWidth, or whole width if only one column
+ var cw = (h.length>1?colWidths[h[i].getAttribute("cid")]:hout.clientWidth-20);
+ var w1 = h[i].firstChild.clientWidth + defPad;
+ var w2 = (c[col]?c[col].firstChild.clientWidth + defPad:0);
+
+ var w = parseInt((cw?cw:(w1>w2?w1:w2)));
+ h[i].width = w;
+ h[i].style.width = w+"px";
+ h[i].firstChild.style.width = w+"px";
+ var rows = c.length/h.length;
+ for (var j=0;j<rows;j++) {
+ var idx = j*h.length+col;
+ if (c[idx]) {
+ c[idx].width = w;
+ c[idx].firstChild.style.width = w+"px";
+ c[idx].style.width = w+"px";
+ colWidths[h[i].getAttribute("cid")] = w;
+ }
+ }
+ whole += parseInt(w);
+ }
+}
+// Header order drag & drop
+DefaultTheme.prototype.addToDragOrderGroup = function (client,theme,element,group,variable,sortVar,sortascVar,sortasc) {
+ element.dragGroup = group;
+ if (!group.elements) {
+ group.elements = new Array();
+ }
+ var idx = group.elements.length;
+ group.elements[idx] = element;
+
+ var mouseDragListener = function (e) {
+ var evt = client.getEvent(e);
+ evt.stop();
+ element.ownerDocument.onselectstart = function() {return false;}
+ var target = element.target;
+ target.style.position = "relative";
+ target.style.top = "5px";
+ try {
+ target.style.left = -(target.origX-evt.mouseX+10)+"px";
+ } catch (err) {
+ client.error("Failed: d&d target.style.left="+ (-(target.origX-evt.mouseX+10)+"px"));
+ }
+ var dragGroup = element.dragGroup;
+ dragGroup.moved = true;
+ var els = dragGroup.elements;
+ for (var i=0;i<els.length;i++) {
+ if (i==element.idx) continue;
+ var el = els[i];
+ var p = client.getElementPosition(el);
+ if (i!=dragGroup.origIdx&&i-1!=dragGroup.origIdx&&p.x < evt.mouseX && p.x+p.w/2 > evt.mouseX) {
+ dragGroup.targetIdx = i;
+ el.style.borderLeft = "1px solid black";
+ el.style.borderRight = "";
+ break;
+ } else if (i!=dragGroup.origIdx&&i+1!=dragGroup.origIdx && p.x+p.w/2 < evt.mouseX && p.x+p.w > evt.mouseX) {
+ dragGroup.targetIdx = i+1;
+ el.style.borderRight = "1px solid black";
+ el.style.borderLeft = "";
+ break;
+ } else {
+ dragGroup.targetIdx = dragGroup.origIdx;
+ el.style.borderRight = "";
+ el.style.borderLeft = "";
+ }
+ }
+ }
+
+ var mouseUpListener = function(e) {
+ client.removeEventListener(element.ownerDocument.body,"mousemove",mouseDragListener);
+ client.removeEventListener(element.ownerDocument.body,"mouseup",arguments.callee);
+ var evt = client.getEvent(e);
+ evt.stop();
+ element.ownerDocument.onselectstart = null;
+ element.target.style.background = "";
+ element.dragGroup.dragging = false;
+ if (element.dragGroup.dragTM) {
+ clearTimeout(element.dragGroup.dragTM);
+ }
+ if (!element.dragGroup.moved) {
+ if (sortVar) {
+ var cid = element.getAttribute("cid");
+ var sorted = element.getAttribute("sorted");
+ //alert("sorting "+element.getAttribute("cid") + " " + sorted + " " + sortasc);
+ if (sorted) {
+ theme.setVariable(client, sortascVar, !sortasc, true);
+ } else {
+ theme.setVariable(client, sortVar, cid, true);
+ }
+ }
+ }
+ var origIdx = element.dragGroup.origIdx;
+ var targetIdx = element.dragGroup.targetIdx;
+ if (origIdx != targetIdx) {
+ var els = element.dragGroup.elements;
+ var neworder = new Array();
+ for (var i=0;i<els.length;i++) {
+ if (i==origIdx) continue;
+ if (i==targetIdx) {
+ neworder[neworder.length] = els[origIdx].getAttribute("cid");
+ }
+ neworder[neworder.length] = els[i].getAttribute("cid");
+ }
+ theme.setVariable(client, variable, neworder, true);
+ } else {
+ element.target.style.left = "0px";
+ element.target.style.top = "0px";
+ }
+ };
+
+ client.addEventListener(element,"mousedown", function(e) {
+ var evt = client.getEvent(e);
+ evt.stop();
+ element.dragGroup.dragging = true;
+ element.dragGroup.moved = false;
+ element.dragGroup.origIdx = idx;
+ element.dragGroup.targetIdx = idx;
+ element.target = evt.target;
+ evt.target.dragGroup = element.dragGroup;
+ evt.target.origX = evt.mouseX;
+ evt.target.idx = idx;
+ if (element.dragGroup.dragTM) {
+ clearTimeout(element.dragGroup.dragTM);
+ }
+ client.addEventListener(element.ownerDocument.body,"mouseup", mouseUpListener);
+ if (variable) {
+ // column reordering allowed
+ group.dragTM = setTimeout(function () {
+ if(element.dragGroup.dragging) {
+ evt.target.style.background = "white";
+ client.addEventListener(element.ownerDocument.body,"mousemove",mouseDragListener);
+ }
+ },100);
+ }
+ });
+ //client.addEventListener(element,"mouseup", mouseUpListener);
+}
+
+DefaultTheme.prototype.renderSelect = function(renderer,uidl,target,layoutInfo) {
+
+ var theme = renderer.theme;
+ var client = renderer.client;
+
+ // Create containing element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Create selection variable
+ var selectMode = uidl.getAttribute("selectmode");
+ var selectable = selectMode == "multi" || selectMode == "single";
+ var immediate = ("true" == uidl.getAttribute("immediate"));
+ var disabled = ("true" == uidl.getAttribute("disabled"));
+ var readonly = ("true" == uidl.getAttribute("readonly"));
+ var newitem = ("true" == uidl.getAttribute("allownewitem"));
+ var focusid = uidl.getAttribute("focusid");
+ var tabindex = uidl.getAttribute("tabindex");
+
+ var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected"));
+
+ // Render default header
+ theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ // Create select input
+ var select = theme.createElementTo(div,"select");
+ if (focusid) select.focusid = focusid;
+ if (tabindex) select.tabIndex = tabindex;
+ if (selectMode == "multi") {
+ select.setAttribute("multiple", "true");
+ if (newitem) {
+ theme.createElementTo(div,"br");
+ }
+ } else {
+ if (newitem) {
+ theme.addCSSClass(div,"nobr");
+ }
+ }
+ var options = theme.getFirstElement(uidl,"options");
+ if (options != null) {
+ options = options.getElementsByTagName("so");
+ }
+ if (disabled||readonly) {
+ select.disabled = "true";
+ } else {
+ // Add change listener
+ theme.addSetVarListener(theme,client,select,"change",selectionVariable,select,immediate);
+ }
+ // Empty selection for WA compatibility
+ var optionNode = theme.createElementTo(select,"option");
+ theme.createTextNodeTo(optionNode,"-");
+
+ // Selected options
+ if (options != null && options.length >0) {
+ for (var i=0; i<options.length;i++) {
+ var optionNode = theme.createElementTo(select,"option");
+ optionNode.setAttribute("value", options[i].getAttribute("key"));
+ if (options[i].getAttribute("selected") == "true") {
+ optionNode.selected="true";
+ }
+ theme.createTextNodeTo(optionNode,options[i].getAttribute("caption"));
+ }
+ }
+
+ if (newitem) {
+ var input = theme.createInputElementTo(div,"text");
+ var button = theme.createElementTo(div,"button");
+ theme.createTextNodeTo(button,"+");
+ var newitemVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"string","newitem"));
+ theme.addSetVarListener(theme,client,input,"change",newitemVariable,input,immediate);
+ }
+}
+
+
+DefaultTheme.prototype.renderSelectOptionGroup = function(renderer,uidl,target,layoutInfo) {
+ // TODO:
+ // - newitem currently always immediate, change
+ // - optiongrouphorizontal style
+
+ var theme = renderer.theme;
+ var client = renderer.client;
+
+ // Create containing element
+ var div = theme.createPaintableElement(renderer,uidl,target);
+
+ // Create selection variable
+ var selectMode = uidl.getAttribute("selectmode");
+ var selectable = selectMode == "multi" || selectMode == "single";
+ var immediate = ("true" == uidl.getAttribute("immediate"));
+ var disabled = ("true" == uidl.getAttribute("disabled"));
+ var readonly = ("true" == uidl.getAttribute("readonly"));
+ var newitem = ("true" == uidl.getAttribute("allownewitem"));
+ var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected"));
+
+ // Render default header
+ theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ // Create select input
+ var select = theme.createElementTo(div,"div");
+ var options = theme.getFirstElement(uidl,"options");
+ if (options != null) {
+ options = options.getElementsByTagName("so");
+ }
+
+ // Selected options
+ if (options != null && options.length >0) {
+ for (var i=0; i<options.length;i++) {
+ var optionUidl = options[i];
+ var iconUrl = optionUidl.getAttribute("icon");
+ var div = theme.createElementTo(select,"div", "nobr");
+ var key = optionUidl.getAttribute("key");
+
+ // Create input
+ var inputName = "input"+uidl.getAttribute("id");
+ var inputId = inputName+i;
+ var input = null;
+ var caption = optionUidl.getAttribute("caption");
+ var html;
+ if (selectMode == "multi") {
+ html = "<input type=checkbox name=\""+inputName+"\" id=\""+inputId+"\" ";
+ } else {
+ html = "<input type=radio name=\""+inputName+"\" id=\""+inputId+"\" ";
+ }
+ if (disabled||readonly) html += " disabled=\"true\" "
+ if (optionUidl.getAttribute("selected") == "true") {
+ html += " checked=\"true\" "
+ }
+ html += " ><label class=\"clickable\" for=\""+inputId+"\">";
+ if (caption) html += caption;
+ if (iconUrl) {
+ if (iconUrl.indexOf("theme://") == 0) {
+ iconUrl = (theme.iconRoot != null ? theme.iconRoot : theme.root)
+ + iconUrl.substring(8);
+ }
+ html += "<IMG src=\""+iconUrl+"\" class=\"icon\">";
+ }
+ html += "</label>";
+
+ div.innerHTML = html;
+ if (!(disabled||readonly)) {
+ var input = div.firstChild;
+ if (selectMode == "multi") {
+ theme.addToggleVarListener(theme,client,input,"click",selectionVariable,key,immediate);
+ } else {
+ theme.addSetVarListener(theme,client,input,"click",selectionVariable,key,immediate);
+ }
+ }
+ }
+ }
+ if (newitem) {
+ theme.createElementTo(div,"br");
+ var input = theme.createInputElementTo(div,"text");
+ var button = theme.createElementTo(div,"button");
+ theme.createTextNodeTo(button,"+");
+ var newitemVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"string","newitem"));
+ theme.addSetVarListener(theme,client,input,"change",newitemVariable,input,true);
+ }
+}
+
+DefaultTheme.prototype.renderLabel = function(renderer,uidl,target,layoutInfo) {
+
+ // Create container element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Create default header
+ var caption = renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ // Render children to div
+ if (uidl.childNodes.length>0) {
+ div = renderer.theme.createElementTo(div,"div");
+ renderer.theme.renderChildNodes(renderer, uidl, div);
+ }
+ if (div.innerHTML == "") div.innerHTML = " ";
+}
+
+DefaultTheme.prototype.renderData = function(renderer,uidl,target) {
+
+ var html = "";
+ for (var i=0; i<uidl.childNodes.length; i++) {
+ var child = uidl.childNodes.item(i);
+ if (child.nodeType == Node.ELEMENT_NODE) {
+ html += renderer.theme.nodeToString(child,true);
+ } if (child.nodeType == Node.TEXT_NODE && child.data != null) {
+ html += child.data;
+ }
+ }
+ target.innerHTML = html;
+
+}
+
+DefaultTheme.prototype.renderPre = function(renderer,uidl,target) {
+
+ // Create pre node
+ var pre = renderer.theme.createElementTo(target,"pre");
+
+ var html = "";
+ for (var i=0; i<uidl.childNodes.length; i++) {
+ var child = uidl.childNodes.item(i);
+ if (child.nodeType == Node.ELEMENT_NODE) {
+ html += renderer.theme.nodeToString(child,true);
+ } if (child.nodeType == Node.TEXT_NODE && child.data != null) {
+ html += child.data;
+ }
+ }
+ pre.innerHTML = html;
+}
+
+
+DefaultTheme.prototype.renderButton = function(renderer,uidl,target,layoutInfo) {
+ // Branch for checkbox
+
+ if (uidl.getAttribute("type") == "switch") {
+ return renderer.theme.renderCheckBox(renderer,uidl,target,layoutInfo);
+ }
+
+ // Shortcuts
+ var theme = renderer.theme;
+ var client = renderer.client;
+
+ var disabled = "true"==uidl.getAttribute("disabled");
+ var readonly = "true"==uidl.getAttribute("readonly");
+ var immediate = "true"==uidl.getAttribute("immediate");
+ var tabindex = uidl.getAttribute("tabindex");
+
+ var linkStyle = "link"==uidl.getAttribute("style");
+
+ var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ div = renderer.theme.createElementTo(div,"div",(linkStyle?"link clickable":"outset clickable"));;
+ var inner = renderer.theme.createElementTo(div,"div",(linkStyle?"pad":"border pad bg"));
+
+ var caption = theme.renderDefaultComponentHeader(renderer,uidl,inner);
+ theme.addTabtoHandlers(client,theme,caption,div,tabindex,("default"==uidl.getAttribute("style")));
+
+ if (!disabled&&!readonly) {
+ // Handlers
+ var v = theme.getVariableElement(uidl,"boolean", "state");
+ if (v != null) {
+ var varId = v.getAttribute("id");
+ theme.addSetVarListener(theme,client,div,"click",varId,"true",immediate);
+ theme.addAddClassListener(theme,client,div,"mouseover","over",div);
+ theme.addRemoveClassListener(theme,client,div,"mouseout","over",div);
+ }
+ }
+
+}
+
+DefaultTheme.prototype.renderCheckBox = function(renderer,uidl,target,layoutInfo) {
+ // Shortcuts
+ var theme = renderer.theme;
+ var client = renderer.client;
+
+ var div = theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ var immediate = (uidl.getAttribute("immediate") == "true");
+ var disabled = (uidl.getAttribute("disabled") == "true");
+ var readonly = (uidl.getAttribute("readonly") == "true");
+ var tabindex = uidl.getAttribute("tabindex");
+
+ // Create input
+ var div = theme.createElementTo(div,"div","nocappad nobr");
+ var input = theme.createInputElementTo(div,"checkbox");
+ input.setAttribute("id", "input"+uidl.getAttribute("id"));
+ if (tabindex) input.tabIndex = tabindex;
+ if (disabled||readonly) {
+ input.disabled = "true";
+ }
+
+ // Create label
+ var label = theme.createElementTo(div,"label", "clickable");
+ var cap = theme.renderDefaultComponentHeader(renderer,uidl,label);
+ theme.addCSSClass(cap,"inline");
+ label.setAttribute("for","input"+uidl.getAttribute("id"));
+ // Value
+ var v = theme.getVariableElement(uidl,"boolean", "state");
+ if ( v!= null) {
+ var varId = v.getAttribute("id");
+ input.checked = (v.getAttribute("value") == "true");
+ // Attach listener
+ theme.addSetVarListener(theme,client,input,(immediate?"click":"change"),varId,input,immediate);
+ }
+}
+
+
+///////
+
+
+/**
+ * Render tree as a menubar.
+ * NOTE:
+ * First level nodes are not selectable - menu opens with click.
+ * If style == "coolmenu", immediate is forced.
+ *
+ */
+
+DefaultTheme.prototype.renderTreeMenu = function(renderer,uidl,target,layoutInfo) {
+
+ var theme = renderer.theme;
+
+ // Create container element
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo);
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible
+
+ // Get tree attributes
+ var style = uidl.getAttribute("style");
+ var immediate = ("true" == uidl.getAttribute("immediate")||style=="coolmenu");
+ var disabled = ("true" == uidl.getAttribute("disabled"));
+ var readonly = ("true" == uidl.getAttribute("readonly"));
+ var selectMode = uidl.getAttribute("selectmode");
+ var selectable = selectMode == "multi" || selectMode == "single";
+ var selected;
+ if (selectable) {
+ selected = new Object();
+ }
+ var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected"));
+ var expandVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","expand"));
+ var collapseVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","collapse"));
+
+ var actions = null;
+ var actionVar = null;
+ var alNode = theme.getFirstElement(uidl,"actions")
+ if (alNode) {
+ actionVar = theme.createVariableElementTo(div,theme.getVariableElement(alNode,"string","action"));
+ actions = new Object();
+ var ak = alNode.getElementsByTagName("action");
+ for (var i=0;i<ak.length;i++) {
+ actions[ak[i].getAttribute("key")] = ak[i].getAttribute("caption");
+ }
+ }
+ delete alNode;
+
+ // Create default header
+ var caption = renderer.theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);
+
+ // Content DIV
+ var content = theme.createElementTo(div,"div","content menu");
+
+ // Iterate all nodes
+ for (var i = 0; i< uidl.childNodes.length;i++) {
+ var node = uidl.childNodes[i];
+ if (node.nodeName == "node" || node.nodeName == "leaf") {
+ theme.renderTreeMenuNode(renderer,node,content,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly,0);
+ }
+ }
+}
+
+DefaultTheme.prototype.renderTreeMenuNode = function(renderer,node,target,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly,level) {
+
+ var theme = renderer.theme;
+ var client = renderer.client;
+
+ var n = theme.createElementTo(target,"div",(level==0?"inline clickable":"clickable"));
+
+
+ // Caption
+ var cap = theme.createElementTo(n,"div","inline caption pad");
+ theme.createTextNodeTo(cap,node.getAttribute("caption"));
+
+ // Expand/collapse/spacer button
+ var img = theme.createElementTo(n,"img","icon");
+ img.align = "absbottom";
+ var key = node.getAttribute("key");
+ var icon = node.getAttribute("icon");
+ if (icon) {
+ var iconurl = theme.root+icon.split("theme:")[1];
+ var iimg = theme.createElementTo(n,"img","icon");
+ iimg.src = iconurl;
+ }
+
+
+ // Hover effects
+ if (!disabled&&!readonly) {
+ theme.addAddClassListener(theme,client,n,"mouseover","selected",n);
+ theme.addRemoveClassListener(theme,client,n,"mouseout","selected",n);
+ }
+
+ // Server-side selection
+ if (selectable && node.getAttribute("selected") == "true") {
+ theme.addCSSClass(n,"selected");
+ selected[key] = n;
+ }
+
+ // Indicate selection
+ if (theme.listContainsInt(selectionVariable.value,key)) {
+ theme.addCSSClass(n, "selected");
+ }
+
+ // Selection listeners
+ if (selectable && !disabled && (level != 0 || node.nodeName == "leaf")) {
+ if (!readonly) {
+ if (selectMode == "single") {
+ theme.addAddClassListener(theme,client,n,"click","selected",n,selected);
+ theme.addSetVarListener(theme,client,n,"click",selectionVariable,key,immediate);
+
+ } else if (selectMode == "multi") {
+ theme.addToggleClassListener(theme,client,n,"click","selected");
+ theme.addToggleVarListener(theme,client,n,"click",selectionVariable,key,immediate);
+
+ }
+ }
+ }
+
+ // Actions
+ if (!disabled && !readonly) {
+ for (var i = 0; i< node.childNodes.length;i++) {
+ var childNode = node.childNodes[i];
+ if (childNode.nodeName == "al" ) {
+ theme.renderActionPopup(renderer,childNode,n,actions,actionVar,key,1); // TODO check
+ }
+ }
+ }
+
+ // Render all sub-nodes
+ if (node.nodeName == "node") {
+ var subnodes = theme.createElementTo(target,"div","hide popup");
+ var inner = theme.createElementTo(subnodes,"div","border");
+ theme.addTogglePopupListener(theme,client,n,(level==0?"click":"mouseover"),subnodes,0,null,n);
+ //theme.addToggleClassListener(theme,client,n,(level==0?"click":"mouseover"),"hide",subnodes)
+ if (node.childNodes != null && node.childNodes.length >0) {
+ img.src = theme.root + "img/tree/empty.gif";
+ img.expanded = "true";
+ } else {
+ img.src = theme.root + "img/tree/empty.gif";
+ img.expanded = "false";
+ }
+ for (var i = 0; i< node.childNodes.length;i++) {
+ var childNode = node.childNodes[i];
+ if (childNode.nodeName == "node" || childNode.nodeName == "leaf") {
+ theme.renderTreeMenuNode(renderer,childNode,inner,selectable,selectMode,selected,selectionVariable,expandVariable,collapseVariable,actions,actionVar,immediate,disabled,readonly,level+1);
+ }
+ }
+
+ // Add event listener
+ if (!disabled&&level!=0) {
+ var target = (selectable&&!readonly?img:n);
+ theme.addToggleClassListener(theme,client,target,"mouseup","hidden",subnodes);
+ theme.addExpandNodeListener(theme,client,img,"mouseup",subnodes,expandVariable,collapseVariable,key,immediate,target);
+ theme.addStopListener(theme,client,target,"mouseup");
+ theme.addStopListener(theme,client,target,"click");
+ }
+
+ } else {
+ img.src = theme.root + "img/tree/empty.gif";
+ }
+}
+
+/**
+* 5.6.2006 - Jouni Koivuviita
+* New innerHTML components
+* RENAMED for testing both - marc
+*/
+
+DefaultTheme.prototype.renderNewPanel = function(renderer,uidl,target,layoutInfo) {
+ // Shortcuts
+ var theme = renderer.theme;
+ var style = uidl.getAttribute("style");
+ // Create component element
+ var div = theme.createPaintableElement(renderer,uidl,target);
+
+ /* New panel theme, 8.6.2006 - Jouni Koivuviita */
+ div.innerHTML = "<div class=\"top\"><div class=\"right\"></div><div class=\"left\"><div class=\"title\"></div></div></div><div class=\"middle\"></div><div class=\"bottom\"><div class=\"right\"></div><div class=\"left\"></div></div>";
+ var cap = div.firstChild.firstChild.nextSibling.firstChild;
+ var content = div.childNodes[1];
+ theme.applyWidthAndHeight(uidl,div.childNodes[1],"height");
+ theme.applyWidthAndHeight(uidl,div,"width");
+
+ /*
+ div.innerHTML = "<TABLE width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><TR height=\"35\"><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-left.png\"></TD><TD style=\"background: url('"+theme.root+"img/top.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/top.png', sizingMethod='scale');\"></TD><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-right.png\"></TD></TR><TR><TD style=\"background: url('"+theme.root+"img/left.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/left.png', sizingMethod='scale');\"></TD><TD bgcolor=white></TD><TD style=\"background: url('"+theme.root+"img/right.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/right.png', sizingMethod='scale');\"></TD></TR><TR height=\"12\"><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-left.png\"></TD><TD style=\"background: url('"+theme.root+"img/bottom.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/bottom.png', sizingMethod='scale');\"></TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-right.png\"></TD></TR></TABLE>";
+ var cap = div.firstChild.firstChild.firstChild.childNodes[1];
+ var content = div.firstChild.firstChild.childNodes[1].childNodes[1];
+ */
+
+ theme.renderDefaultComponentHeader(renderer,uidl,cap);
+ theme.renderChildNodes(renderer, uidl, content);
+}
+
+DefaultTheme.prototype.renderNewPanelModal = function(renderer,uidl,target,layoutInfo,alignment) {
+ // Shortcuts
+ var theme = renderer.theme;
+ //var parentTheme = theme.parent;
+ // Create component element
+ var div = theme.createPaintableElement(renderer,uidl,target);
+ var html = "<IFRAME frameborder=\"0\" style=\"border:none;z-index:9997;position:absolute;top:0px;left:0px;width:100%;height:100%;background-color:white;filter: alpha(opacity=80);opacity:0.8;\"></IFRAME>";
+ html += "<DIV align=\"center\" style=\"position:absolute;top:0px;width:100%;left:0px;z-index:9999;filter: alpha(opacity=100);opacity:1;\"><TABLE cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><TR height=\"35\"><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-left.png\"></TD><TD style=\"background: url('"+theme.root+"img/top.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/top.png', sizingMethod='scale');\"></TD><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-right.png\"></TD></TR><TR><TD style=\"background: url('"+theme.root+"img/left.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/left.png', sizingMethod='scale');\"></TD><TD bgcolor=white ></TD><TD style=\"background: url('"+theme.root+"img/right.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/right.png', sizingMethod='scale');\"></TD></TR><TR height=\"12\"><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-left.png\"></TD><TD style=\"background: url('"+theme.root+"img/bottom.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/bottom.png', sizingMethod='scale');\"></TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-right.png\"></TD></TR></TABLE><DIV>";
+ div.innerHTML = html;
+ var overlay = div.firstChild;
+ overlay.style.width = div.ownerDocument.body.offsetWidth + "px";
+ overlay.style.height = div.ownerDocument.body.offsetHeight + "px";
+ var table = div.childNodes[1].firstChild;
+ var cap = table.firstChild.firstChild.childNodes[1];
+ var content = table.firstChild.childNodes[1].childNodes[1];
+
+ theme.renderDefaultComponentHeader(renderer,uidl,cap);
+ theme.renderChildNodes(renderer, uidl, content);
+
+ var ifrdiv = theme.createElementTo(div,"div");
+
+ html = "<IFRAME frameborder=\"0\" style=\"border:none;z-index:9998;position:absolute;top:"+(div.childNodes[1].offsetTop+5)+"px;left:"+(table.offsetLeft+5)+"px;width:"+(table.offsetWidth-7)+"px;height:"+(table.offsetHeight-7)+"px;background-color:white;filter: alpha(opacity=100);opacity:1;\"></IFRAME>";
+ ifrdiv.innerHTML += html;
+}
+
+DefaultTheme.prototype.renderNewPanelLight = function(renderer,uidl,target,layoutInfo) {
+ // Shortcuts
+ var theme = renderer.theme;
+ var style = uidl.getAttribute("style");
+ // Create component element
+ var div = theme.createPaintableElement(renderer,uidl,target);
+
+ div.innerHTML = "<TABLE width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><TR><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-left-lite.png\"></TD><TD style=\"background: url('"+theme.root+"img/top-lite.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/top-lite.png', sizingMethod='scale');\"></TD><TD width=\"12\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/top-right-lite.png\"></TD></TR><TR><TD style=\"background: url('"+theme.root+"img/left.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/left.png', sizingMethod='scale');\"></TD><TD bgcolor=white></TD><TD style=\"background: url('"+theme.root+"img/right.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/right.png', sizingMethod='scale');\"></TD></TR><TR><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-left.png\"></TD><TD style=\"background: url('"+theme.root+"img/bottom.png') !important;background: none;background-position:right;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/bottom.png', sizingMethod='scale');\"></TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/bottom-right.png\"></TD></TR></TABLE>";
+
+ var content = div.firstChild.firstChild.childNodes[1].childNodes[1];
+
+ theme.renderDefaultComponentHeader(renderer,uidl,content);
+ theme.renderChildNodes(renderer, uidl, content);
+}
+
+DefaultTheme.prototype.renderNewPanelNone = function(renderer,uidl,target,layoutInfo) {
+ // Shortcuts
+ var theme = renderer.theme;
+ var style = uidl.getAttribute("style");
+ // Create component element
+ var div = theme.createPaintableElement(renderer,uidl,target);
+
+ var content = theme.createElementTo(div,"div");
+
+ theme.renderDefaultComponentHeader(renderer,uidl,content);
+ theme.renderChildNodes(renderer, uidl, content);
+}
+
+DefaultTheme.prototype.renderNewTabSheet = function(renderer,uidl,target,layoutInfo) {
+ // Shortcuts
+ var theme = renderer.theme;
+
+ // Create component element
+ var div = theme.createPaintableElement(renderer,uidl,target);
+ if (uidl.getAttribute("invisible")) return;
+
+ var style = uidl.getAttribute("style");
+ var disabled = ("true"==uidl.getAttribute("disabled"));
+
+ var cdiv = theme.createElementTo(div,"div");
+ var caption = theme.renderDefaultComponentHeader(renderer,uidl,cdiv,layoutInfo);
+ div = theme.createElementTo(div,"div");
+
+ // Tabs
+ var tabNodes = theme.getChildElements(uidl,"tabs");
+ if (tabNodes != null && tabNodes.length >0) tabNodes = theme.getChildElements(tabNodes[0],"tab");
+ var selectedTabNode = null;
+ if (tabNodes != null && tabNodes.length >0) {
+ var html = "<TABLE width=\"100%\" class=\"tabsheet-table\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><TBODY>";
+ html += "<TR valign=\"bottom\"><TD></TD>";
+
+ var posttabs = "<TR valign=\"top\"><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/top-left-lite.png\"/></TD>";
+ var len = tabNodes.length;
+ for (var i=0; i<len;i++) {
+ var tab = tabNodes[i];
+ var caption = tab.getAttribute("caption");
+ var icon = tab.getAttribute("icon");
+ if (icon) icon = theme.root+icon.split("theme://")[1];
+ var selected = ("true"==tab.getAttribute("selected"));
+ var disabled = ("true"==tab.getAttribute("disabled"));
+ var offset = (selected?6:4);
+
+ var variant = "";
+ if (disabled) {
+ variant = "-dis";
+ } else if (selected) {
+ variant = "-on";
+ }
+
+ if (selected) selectedTabNode = tab;
+
+ html += "<TD width=\"1\" align=\"right\"><IMG onload=\"png(this);\" onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/top-left"+variant+".png\"/></TD><TD class=\""+(disabled?"caption":"caption clickable")+"\" style=\"background-image: url('"+theme.root+"img/tabsheet/top"+variant+".png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/top"+variant+".png', sizingMethod='scale');\">"
+ html += "<DIV style=\"padding-top:0.5em;\" class=\"caption"+(selected&&!disabled?"":" clickable")+"\">";
+ if (icon) html += "<IMG onload=\"png(this);\" class=\"icon\" src=\""+icon+"\"/>";
+ html += caption+"</DIV>";
+ html += "</TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/top-right"+variant+".png\"/></TD>";
+
+
+ // POSTTABS
+ posttabs += "<TD align=\"right\" style=\"background-image: url('"+theme.root+"img/tabsheet/top-lite.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/top-lite.png', sizingMethod='scale');\"><IMG onload=\"png(this);\" height=\""+(selected?6:4)+"\" width=\"8\" src=\""+theme.root+"img/tabsheet/tab-left.png\"/></TD><TD "+(selected?"bgcolor=\"white\"":"style=\"background-image: url('"+theme.root+"img/tabsheet/top-lite.png') !important;background: white;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/top-lite.png', sizingMethod='scale');\"")+"></TD><TD style=\"background-image: url('"+theme.root+"img/tabsheet/top-lite.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/top-lite.png', sizingMethod='scale');\"><IMG onload=\"png(this);\" height=\""+(selected?6:4)+"\" width=\"8\" src=\""+theme.root+"img/tabsheet/tab-right.png\"/></TD>";
+ }
+ html += "<TD width=\"100%\"></TD></TR>"+posttabs+"<TD style=\"background-image: url('"+theme.root+"img/tabsheet/top-lite.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/top-lite.png', sizingMethod='scale');\" ></TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/top-right-lite.png\"/></TD></TR>";
+
+ //Content
+ html +="</TBODY></TABLE><TABLE width=\"100%\" class=\"tabsheet-table\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><TBODY><TR valign=\"top\"><TD style=\"width:12px;background-image: url('"+theme.root+"img/tabsheet/left.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/left.png', sizingMethod='scale');\"></TD><TD style=\"width:100% !important;width:auto;\" class=\"tabsheet-content\" bgcolor=\"white\" colspan=\""+(len*3+1)+"\"><DIV></DIV></TD><TD width=\"12\" style=\"background-image: url('"+theme.root+"img/tabsheet/right.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/right.png', sizingMethod='scale');\"></TD></TR>";
+ html += "<TR height=\"12\" valign=\"top\"><TD width=\"8\"><IMG onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/bottom-left.png\"></TD><TD style=\"background-image: url('"+theme.root+"img/tabsheet/bottom.png') !important;background: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+theme.root+"img/tabsheet/bottom.png', sizingMethod='scale');\" colspan=\""+(len*3+1)+"\"></TD><TD><IMG onload=\"png(this);\" src=\""+theme.root+"img/tabsheet/bottom-right.png\"></TD></TR></TBODY></TABLE>";
+ div.innerHTML = html;
+
+ // TODO click listeners
+
+ if (!disabled) {
+ var varId = theme.getVariableElement(uidl,"string","selected").getAttribute("id");
+ for (var i=0; i<len;i++) {
+ var tabNode = tabNodes[i];
+ if (tabNode == selectedTabNode||("true"==tabNode.getAttribute("disabled"))) continue;
+ var key = tabNode.getAttribute("key");
+ var tab = div.firstChild.firstChild.firstChild.childNodes[2+i*3];
+ theme.addAddClassListener(theme,client,tab,"mouseover","over",tab);
+ theme.addRemoveClassListener(theme,client,tab,"mouseout","over",tab);
+ theme.addSetVarListener(theme,client,tab,"click",varId,key,true);
+ }
+ }
+
+ var content = div.childNodes[1].firstChild.firstChild.childNodes[1];
+ if (selectedTabNode) {
+ theme.renderChildNodes(renderer,selectedTabNode, content);
+ }
+
+ }
+
}
\ No newline at end of file |