<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2007 Ashley G Ramdass.
-->
<?page style="height:100%"?>
<?init zscript="theme.zs" ?>
<?meta http-equiv="X-UA-Compatible" content="IE=edge" ?>
<?meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" ?>
<?meta name="apple-mobile-web-app-capable" content="yes"?>
<?meta name="mobile-web-app-capable" content="yes"?>
<?link rel="icon" type="image/png" href="${browserIcon}"?>
<?link rel="stylesheet" type="text/css" href="${themeStyleSheet}"?>
<?link rel="stylesheet" type="text/css" href="${themeStyleSheetByBrowser}"?>
<?link rel="stylesheet" type="text/css" href="css/PAPanel.css"?>
<?link rel="manifest" href="manifest.json"?>
<?style content="
     .z-grid-header > table > tbody > tr.z-columns > th.z-column.hiddencol > .z-column-content {
	     white-space: nowrap !important;     
	     text-overflow: unset !important;
     }
"?>
<zk>
	<script><![CDATA[
		if (window.location.protocol == 'https:')
		{
			
		zk.load("jawwa.atmosphere");
		zk.load("org.idempiere.websocket");
		zk.load("adempiere.local.storage");	
		zk.load("html2canvas");
		zk.load("org.idempiere.commons");
		zk.load("jquery.maskedinput");
		zk.load("photobooth");
		
		zk.afterLoad(function() {
			zk._Erbx.push = function(msg) {
				if (console) console.log(msg);
			};

			zk.$package('id.zk');
			
			id.zk.Extend = zk.$extends(zk.Object, {}, {
				fakeOnchange: function (wgt) {
					// just sent fake event when control is textfield and value is not yet sync to server
					if ((wgt.$instanceof(zul.inp.Textbox) || wgt.$instanceof(zul.inp.Decimalbox)) && wgt.$n().value != wgt.getText())
						zAu.send(new zk.Event(zk.Widget.$(wgt), 'onChange',{"value":wgt.$n().value}));

					else if (zk.$import("ckez.CKeditor") != undefined && wgt.$instanceof(ckez.CKeditor)){//https://www.zkoss.org/javadoc/latest/jsdoc/_global_/zk.html#$import(_global_.String)
                        // CKEditor extend from zul.Widget not from wget zul.inp.InputWidget
                        // so some behavior is not same standard input
                        // this code bring from ckez.CKeditor.onBlur
                        var editor = wgt._editor;
                        
                        if (wgt._tidChg) {
                            clearInterval(wgt._tidChg);
                            wgt._tidChg = null;
                        }
                        
                        if (!editor.document)
                            editor.document = editor.element.getDocument();
                        
                        if (wgt.$class._checkEditorDirty(editor)) { // Issue #13
                            var val = editor.getData();
                            wgt._value = val; //save for onRestore
                            //ZKCK-16, 17 use sendAhead to make sure onChange always happens first
                            wgt.fire('onChange', {value: val});
                            editor.resetDirty();
                        }
					}
				},
				
				fireOnInitEdit: function (wgt) {
					// sent even to indicate field is start edit, this event sent new value to server but now don't use this data. 
					if (wgt.$instanceof(zul.inp.Textbox))
						zAu.send(new zk.Event(zk.Widget.$(wgt), 'onInitEdit',{"value":wgt.$n().value}));
				}
			});
		});
			
		zk.afterLoad('zul.inp', function () {
			
			// should filter out for only component inside standard window or component wish fire this event, 
			// or ever rise other event like start editting to distinguish with true onChange event
			zk.override(zul.inp.InputWidget.prototype, "doInput_", function (evt) {
				this.$doInput_(evt);
				
				if (this.get ("isOnStardardWindow") == 'false' || this.get ("isChangeEventWhenEditing") != true){
					return; // don't waste time to check component don't lay on standard window
				}
				
				var domElemOfLayout = jq('#' + this.$n().id).closest(".adwindow-layout"); // return a array
				if (domElemOfLayout.length == 0){
					this.set ("isOnStardardWindow", "false");// next time don't waste time to check this component
					                                         // in case, you move this component to a standard window, please update this properties at client by javascript Widget.set ()
					                                         // or at server by java function component.setWidgetOverride 
				}else{
					var winLayoutWg = zk.Widget.$(domElemOfLayout);
					if (winLayoutWg == null){
						;// do nothing, this case rare happen because ".adwindow-layout" always is a component
					}else{
						var isEditting = winLayoutWg.get ("isEditting");
						// winLayoutWg should cache to improve perfomance
						if (isEditting == "false"){
							winLayoutWg.set ("isEditting", "true");
							id.zk.Extend.fireOnInitEdit (this);//fire change event to move to edit
						}
					}
				}
			});
			
			
			zk.override(zk.Widget.prototype, "onAutofill", function (evt) {
				id.zk.Extend.fakeOnchange (this);//fire change event to move to edit
			});
			
			zk.override(zul.inp.Textbox.prototype, "bind_", function (dt, skipper, after) {
				if (!this.$bind_)
					return;
					
				this.$bind_(dt, skipper, after);
				
				var txtid = this.getId()
				if (txtid != "txtUserId" && txtid != "txtPassword" ){
					return;
				}
				
				this.domListen_(this.$n(), "onChange", "onAutofill");
			});


			zk.override(zul.inp.Textbox.prototype, "unbind_", function (dt, skipper) {
				if (!this.$unbind_)
					return;
				
				this.$unbind_(dt, skipper);
				
				var txtid = this.getId()
				if (txtid != "txtUserId" && txtid != "txtPassword" ){
					return;
				}
				
				this.domUnlisten_(this.$n(), "onChange", "onAutofill"); //unlisten
			});
			
			zk.override(zul.inp.Combobox.prototype, "doKeyDown_", function (evt) {
                // avoid confuse of idempiere shortcut key and function key of combobox
                if ( (evt.altKey || evt.ctrlKey || evt.shiftKey)  && 
                        (evt.keyCode == 33 || evt.keyCode == 34 || evt.keyCode == 35 || evt.keyCode == 36 || evt.keyCode == 38 || evt.keyCode == 40 || evt.keyCode == 37 || evt.keyCode == 39) ){//page up | page down | end | home | up | down | left | write
                    
                    if (this.isOpen())//close drop down if already open. it will let combobox select current item, it's consistent with lost focus
                        this.close({sendOnOpen: true});
                        
                    return;
                    // TODO:current idempiere use alt + down/up to move child parrent tab, but combobox also use it to open, close drop down
                    // at the moment, idempiere shortcut is more useful, so just get it work
                }else{
                    this.$doKeyDown_(evt);
                }
                
            });
                
			
		});
		
		zk.afterLoad('zul.mesh', function () {
			
			zk.override(zul.mesh.Paging.prototype, "bind_", function () {
				this.$bind_.apply(this, arguments);
				if (this._totalSize == 0x7fffffff){
					jq(".z-paging-text", this).text(" / ?");
				}
			});
			
			
			zk.override(zul.mesh.Paging.prototype, "infoText_",
					  function () {
					    //this.$infoText_.apply(this, arguments);
					    var acp = this._activePage,
								psz = this._pageSize,
								tsz = this._totalSize,
								
								lastItem = (acp + 1) * psz,
								dash = '';
							
							if ('os' != this.getMold())
								dash = ' - ' + (lastItem > tsz ? tsz : lastItem);
							
							if (this._totalSize == 0x7fffffff)
								tsz = "?";
							
							return '[ ' + (acp * psz + 1) + dash + ' / ' + tsz + ' ]';
					  });	  
			});
			
		zk.afterLoad('calendar', function () {
			zk.override(calendar.Event.prototype, "calculate_", function () {
				if (typeof this.event === "undefined" || this.event == null) {
					return;
				}
				this.$calculate_.apply(this, arguments);
			});
			
			zk.override(calendar.Event.prototype, "unbind_", function() {
				var node = this.$n();
				if (typeof node === "undefined") {
					return;
				}
				if (typeof this.$unbind_ === "undefined") {
					return;
				}
				this.$unbind_.apply(this, arguments);
			});
			
			zk.override(calendar.CalendarsMonth.prototype, "onSize", function () {
				var cmp = this.$n();
				if (typeof cmp  === "undefined" || cmp == null) {
					return;
				}
				this.$onSize.apply(this, arguments);
			});
			
			zk.override(calendar.CalendarsDefault.prototype, "onSize", function () {
				var cmp = this.$n();
				if (typeof cmp  === "undefined" || cmp == null) {
					return;
				}
				this.$onSize.apply(this, arguments);
			});
		});	
		
		zk.afterLoad("zul.mesh", function () {
		    var _xFrozen = {};
		    zk.override(zul.mesh.Frozen.prototype, _xFrozen, {
		        _doScrollNow: function() {
					var result = _xFrozen._doScrollNow.apply(this, arguments);
					/*Patch: add class to non-visible columns*/
					var mesh = this.parent;
					if (mesh.head) {
						var totalCols = mesh.head.nChildren,
									hdcol = mesh.ehdfaker.firstChild;
			
						for (var faker, i = 0; hdcol && i < totalCols; hdcol = hdcol.nextSibling, i++) {
							if (hdcol.style.width.indexOf('0.001px') != -1 || hdcol.style.width.indexOf('0px') != -1) {
								jq(zk.$(hdcol).$n()).addClass("hiddencol");
							} else {
								jq(zk.$(hdcol).$n()).removeClass("hiddencol");
							}
						}
					}
					return result;
		        }
		    });
		});	
		
		} //window.location.protocol check
		else
		{
			alert("This request has been blocked, the content must be served over HTTPS");
		}					
	]]>
	</script>
    <include src="${themePreference}" if="${execution.getScheme() == 'https'}"/>
	<window use="org.adempiere.webui.AdempiereWebUI" if="${execution.getScheme() == 'https'}"/>
</zk>