﻿// WinSaaS (http://www.winsaas.com) and HotelASP (http://www.hotelasp.com). Licensing apply to this source code. Please read and comply with source license available at site.
// Copyright (C) 2009 by Miguel Angelo Canaria Ribeiro (miguel.ribeiro@netcabo.pt). All rights reserved.
function XView(selfID, id, controlID, operationPostData, messageID, sysPath, activePath, basePath) 
{
    this.selfID = selfID; 
    this.id = id; 
    
    this.controlID = controlID; 
    this.controlUniqueID = controlID.replace(/\_/gi,'$'); 
    
    this.messageID = messageID;
    this.waitMessage = null;
    this.waitMessageRefresh = null;
    this.startTime = null;    
    
    if (document.forms["aspnetForm"])
    {
        this.defaultFormID = "aspnetForm";
    }
    else
    {
        this.defaultFormID = document.forms[0].id; //viewForm workflowForm ...
    }

    this.viewControlPrefix = this.controlID + "__" + this.id.toUpperCase() + "_";    
    this.viewControlUniquePrefix = this.controlUniqueID + "$_" + this.id.toUpperCase() + "_";
    
    this.gridManager = new GridManager(this);
    this.operationManager = new OperationManager(this, operationPostData);
    this.lookupManager = new LookupManager(this, operationPostData);
    this.validatorManager = new ValidatorManager(this);    
    this.regions = new Array();
    this.rawRegions = null;    
    this.windows = new Array();
    
    this.sysPath = sysPath;
    this.activePath = activePath;
    this.basePath = basePath;
       
} 

XView.prototype.OpenWindow = function (applicationID, moduleName, workAreaName, viewName, regionID, serviceID, linkType, extendedQueryString, windowFeatures)
{
    var url;
    if (windowFeatures == "")
    {
        windowFeatures = "dialogHeight: 500; dialogWidth: 720; center: Yes; help: No; resizable: Yes; status: No; scrollbars: Yes;";
    }
    
    if (linkType == "popup")
    {
        url = this.sysPath + "/UI/Web/WorkAreas/View.aspx";        
        url += "?aid=" + applicationID;
        url += "&ModuleName=" + moduleName;
	    url += "&WorkAreaName=" + workAreaName;
	    url += "&ViewName=" + encodeURI(viewName);
	    url += "&RegionID=" + encodeURI(regionID);
	    url += "&SvcID=" + encodeURI(serviceID);
	    url += "&_EnableAutomaticDefaults=false";
		
	    if (extendedQueryString!="")
	    {
		    url += extendedQueryString;
	    }
		
	    var popUp = OpenWindow(url, this, windowFeatures);
	    popUp.focus();		
    }
	
    if (linkType == "self")
    {
	    url = this.basePath + "/Default.aspx";
	    url += "?aid=" + applicationID;
	    url += "&ModuleName=" + moduleName;
	    url += "&WorkAreaName=" + workAreaName;
	    url += "&ViewName=" + encodeURI(viewName);
	    url += "&RegionID=" + encodeURI(regionID);
	    url += "&SvcID=" + encodeURI(serviceID);
	    url += "&_EnableAutomaticDefaults=false";
		
	    if (extendedQueryString!="")
	    {
		    url += extendedQueryString;
	    }
		
	    location.href = url;
	}
}

XView.prototype.Initialize = function ()
{
    this.LoadRegions();
}

XView.prototype.LoadRegions = function ()
{            
	var rawArray = this.rawRegions.split(';');
	for(var i = 0; i < rawArray.length; i++)
	{
	    var data = rawArray[i].split('#');
        if (data.length == 2)
	    {	 
	        var d0 = data[0];
	        var d1 = data[1];
	        	            	    	 
	        this.regions[this.regions.length] = new Region(d0, d1, this);
	    }
	}
}

XView.prototype.GetRegion = function (regionID)
{ 
    for(var i = 0; i < this.regions.length; i++)
	{
	    var region = this.regions[i];
	    if (region.id == regionID)
	    {
	        return region
	    }
    }    
    return null;
}

XView.prototype.GetWindow = function (windowID)
{ 
    for(var i = 0; i < this.windows.length; i++)
    {
        var window = this.windows[i];
        if (window.id == windowID)
        {
            return window
        }
    }
    return null;
}

XView.prototype.GetWindowIndex = function (windowID)
{ 
    for(var i = 0; i < this.windows.length; i++)
	{
	    var window = this.windows[i];
	    if (window.id == windowID)
	    {
	        return i
	    }
    }    
    return -1;
}

XView.prototype.DeleteWindow = function (windowID)
{ 
    var index = this.GetWindowIndex(windowID);
    if (index == -1) return;
    
    if (this.windows.length == 1)
    {
        delete this.windows[index];
        this.windows = new Array();
    }
    else
    {
        delete this.windows[index];
        this.windows.length -= 1;
    }   
}

XView.prototype.GetFields = function ()
{
    var result = new Array();
    for(var i = 0; i < this.regions.length; i++)
	{
	    var aux = this.regions[i].fields;
        for(var z = 0; z < aux.length; z++)
	    {
	        result[result.length] = aux[z];
	    }	    
	}
	return result;
}

XView.prototype.GetField = function (controlID)
{
    var fields = this.GetFields();
    for(var i = 0; i < fields.length; i++)
	{
	    var field = fields[i];
	    if (field.controlID == controlID)
	    {
	        return field
	    }
    }    
    return null;
}

XView.prototype.ServerResponseException = function (response)
{
	var tld = response.tld;
	var status = response.status;
	var statusText = response.statusText;
	var allResponseHeaders = response.allResponseHeaders;
	var responseText = response.responseText;
	var responseXML = response.responseXML;
	
	if (response.argument==null)
	{
		alert ("XViewHttpResponseException Argument is Null");
		return;
	}
	
	try
	{
		var callBackData = response.argument.split(";");
		var viewID = callBackData[0];
		var typeID = callBackData[1];
		var targetObjectID = callBackData[2];
		
		var targetObject = document.getElementById(viewID);
		if (targetObject!=null)
		{
			targetObject.innerHTML = responseText;
		}
		else
		{
		    alert(responseText);
		}
	}
	catch (e)
	{
		alert ("XViewHttpResponseException: " + e.message + " - " + responseText);
	}
	
	if (this.waitMessageRefresh) window.clearInterval(this.waitMessageRefresh);
	
	if (this.waitMessage!=null)
	{
		this.waitMessage.style.visibility = 'hidden';
	}
	
	CloseBatchWaitMessage();
}

XView.prototype.CreateWaitMessage = function (typeID, sourceControlID, targetControlID) 
{
    var referenceObject;
    var offsetWidth;
    var offsetHeight;
    if (typeID==2)
    {
        referenceObject = document.getElementById(targetControlID);
        referenceObject.innerHTML = "<div style='HEIGHT:24px;'></div>";
        offsetWidth = 5;
        offsetHeight = 2;
    }
    else
    {
        referenceObject = document.getElementById(sourceControlID);
        offsetWidth = referenceObject.offsetWidth / 2 - 50;
        offsetHeight = referenceObject.offsetHeight / 2 - 50;
    }
    
    var elem = document.getElementById("XViewHttpRequestWaitMessage");
    if (!elem) 
    {
        elem = document.createElement("div");
        elem.id = "XViewHttpRequestWaitMessage";
        elem.style.position = "absolute";
        elem.style.zIndex = 100;      
        document.body.insertBefore(elem, document.body.firstChild);
    }
    else
    {
		elem.style.visibility = "visible";
    }
    
    YAHOO.util.Dom.setStyle(elem.id, "opacity", 1);
    var html = "<table cellspacing=0 cellpadding=0 >"
    html += "<tr><td colspan=2 class='CSS_WC' nowrap align=center><B>" + _$WaitMessage + "</B></td></tr>";
    html += "<tr><td valign=top align=left><img src=\"" + this.basePath + "/Shared/Images/wait.gif\" /></td>";
    html += "<td><SPAN id='XViewHttpRequestWaitMessageSeconds' class='CSS_WC_SMALL'></SPAN></td></tr>";    
    elem.innerHTML = html + "</table>";
    var obj = document.getElementById(referenceObject.id);
    if (obj!=null)
    {
		var xy = YAHOO.util.Dom.getXY(obj);
		xy[0] += offsetWidth;
		xy[1] += offsetHeight;
		YAHOO.util.Dom.setXY(elem, xy); 
	}
		
    this.waitMessage = elem;
}

XView.prototype.RefreshWaitMessage = function () 
{
	var elem = document.getElementById("XViewHttpRequestWaitMessageSeconds");		

	var actualDate = new Date();
	var endTime = actualDate.getTime();
	var dif = (endTime - this.startTime) / 1000;
	var html = "<B>" + dif.toString() + "s&nbsp;</B>";
	elem.innerHTML = html;
}

XView.prototype.ClearWaitMessage = function () 
{
	if (this.waitMessageRefresh) window.clearInterval(this.waitMessageRefresh);
	if (this.waitMessage!=null)
	{
		this.waitMessage.style.visibility = 'hidden';
	}
}

XView.prototype.CleanFields = function (ctrlPrefixID)
{
    this.CleanFieldsHelper(document.getElementsByTagName("input"), ctrlPrefixID);
    this.CleanFieldsHelper(document.getElementsByTagName("select"), ctrlPrefixID);
}

XView.prototype.CleanFieldsHelper = function (ctrls, ctrlPrefixID)
{
    for(var i = 0; i < ctrls.length; i++)
    {
        var ctrl = ctrls[i];
        if (ctrl.name.indexOf(ctrlPrefixID) > -1)
        {
            switch(ctrl.type)
            {
                case "checkbox":
                    ctrl.checked = false;
                    break;
                case "select-one":
                    for(var i2 = 0; i2 < ctrl.options.length; i2++)
                    {
                        var option = ctrl.options[i2];
                        if (option.value == '')
                        {
                            option.selected = true;
                        }
                        else
                        {
                            option.selected = false;
                        }
                    }
                    break;
                default:
                    ctrl.value = '';
                break;
            }
        }
    }
}

XView.prototype.CloseCalendar1 = function (data)
{
    var dataArray = data.split("#");
    var windowID = dataArray[0];
    var sourceObjectID = dataArray[1];
    var value = dataArray[2];
    
    var elem = document.getElementById(sourceObjectID);
    if (elem != null)
    {
        elem.value = value;
        
        if (isMoz)
        {
            var evt = document.createEvent('HTMLEvents');
            evt.initEvent('change', true, false);
            elem.dispatchEvent(evt);
        }
        else
        {            
            elem.fireEvent('onchange')
        }
    }
            
    this.GetWindow(windowID).CloseWindow();        
}

XView.prototype.CloseWindow = function (windowID)
{    
    this.GetWindow(windowID).CloseWindow();
}

XView.prototype.CloseWindowAndRedirect = function (windowID, url)
{    
    this.GetWindow(windowID).CloseWindow();
    //location.href = url;
    
    location.pathname = decodeURIComponent(url);
}
            
XView.prototype.OpenCalendar = function (path, fieldID)
{
    var xwindow = new XWindow(fieldID + "_wnd", this, false, 2, 15);    

    var callBackFunction1 = this.selfID + ".CloseCalendar1";
    var callBackFunction2 = this.selfID + ".CloseWindow";
    
    var field = document.getElementById(fieldID);
    path = path + "&windowID=" + xwindow.id;
    path = path + "&sourceObjectID=" + fieldID;
    path = path + "&sourceObjectValue=" + field.value;
    path = path + "&callBackFunction1=" + callBackFunction1;
    path = path + "&callBackFunction2=" + callBackFunction2;
    
    xwindow.sourceObjectID = fieldID;
    xwindow.targetObjectID = fieldID;
    xwindow.targetServerURL = path;
    xwindow.formData = "";   
    xwindow.Open("");
}

XView.prototype.OpenDoc = function(path, docID, fieldID) {
    this.OpenDoc2(path, docID, fieldID, 2, 15);
}

XView.prototype.OpenDoc2 = function (path, docID, fieldID, posX, posY)
{
    var xwindow = new XWindow(fieldID + "_dwnd", this, false, posX, posY);    

    path = path + "&windowID=" + xwindow.id;
    path = path + "&sourceObjectID=" + fieldID;
    path = path + "&sourceObjectValue=";
    path = path + "&callBackFunction1=";
    path = path + "&callBackFunction2=";
    
    xwindow.sourceObjectID = fieldID;
    xwindow.targetObjectID = fieldID;
    xwindow.targetServerURL = path;
    xwindow.formData = "";   
    xwindow.Open("");
}

XView.prototype.OpenSideBar = function (path, sourceObjectID)
{
    var xwindow = new XWindow(sourceObjectID + "_sbwnd", this, true, 2, 24);    

    path = path + "&windowID=" + xwindow.id;
    path = path + "&sourceObjectID=" + sourceObjectID;
    path = path + "&sourceObjectValue=";
    path = path + "&callBackFunction1=";
    path = path + "&callBackFunction2=";
    
    xwindow.sourceObjectID = sourceObjectID;
    xwindow.targetObjectID = sourceObjectID;
    xwindow.targetServerURL = path;
    xwindow.formData = "";   
    xwindow.Open("");
}

XView.prototype.OpenConfigFields = function (path, sourceObjectID)
{
    var xwindow = new XWindow(sourceObjectID + "_cfwnd", this, false, 2, 15);    
    var callBackFunction1 = this.selfID + ".CloseWindowAndRedirect";
    
    path = path + "&windowID=" + xwindow.id;
    path = path + "&sourceObjectID=" + sourceObjectID;
    path = path + "&sourceObjectValue=";
    path = path + "&callBackFunction1=" + callBackFunction1;
    path = path + "&callBackFunction2=";
    
    xwindow.sourceObjectID = sourceObjectID;
    xwindow.targetObjectID = sourceObjectID;
    xwindow.targetServerURL = path;
    xwindow.formData = "";   
    xwindow.Open("");
}

XView.prototype.OpenFeedback = function (path, sourceObjectID)
{
    var xwindow = new XWindow(sourceObjectID + "_fbwnd", this, false, -240, 15);    
    var callBackFunction1 = this.selfID + ".CloseWindowAndRedirect";
    
    path = path + "&windowID=" + xwindow.id;
    path = path + "&sourceObjectID=" + sourceObjectID;
    path = path + "&sourceObjectValue=";
    path = path + "&callBackFunction1=" + callBackFunction1;
    path = path + "&callBackFunction2=";
    
    xwindow.sourceObjectID = sourceObjectID;
    xwindow.targetObjectID = sourceObjectID;
    xwindow.targetServerURL = path;
    xwindow.formData = "";   
    xwindow.Open("");
}

XView.prototype.GetFormData = function(formID, sendViewState, sendEventState, convertChecks) {
    if (formID == "") {
        formID = this.defaultFormID;
    }

    var includeElement = true;
    var formData = '';
    var oForm = document.forms[formID];
    if (oForm == null) return;

    var oElement, elName, elValue;
    for (var i = 0; i < oForm.elements.length; i++) {
        oElement = oForm.elements[i];
        elName = oForm.elements[i].name;
        elValue = oForm.elements[i].value;

        if ((!sendViewState) && (elName == "__VIEWSTATE")) {
            includeElement = false;
        }
        else {
            includeElement = true;
        }

        if (((!sendEventState) && (elName == "__EVENTTARGET")) || ((!sendEventState) && (elName == "__EVENTARGUMENT"))) {
            includeElement = false;
        }
        else {
            includeElement = true;
        }

        if (includeElement) {
            switch (oElement.type) {
                case 'select-multiple':
                    for (var j = 0; j < oElement.options.length; j++) {
                        if (oElement.options[j].selected) {
                            formData += encodeURIComponent(elName) + '=' + encodeURIComponent(oElement.options[j].value) + '&';
                        }
                    }
                    break;
                case 'radio':
                    if (oElement.checked) {
                        formData += encodeURIComponent(elName) + '=' + encodeURIComponent(elValue) + '&';
                    }
                    break;
                case 'checkbox':
                    if (convertChecks) {
                        var val = 0;
                        if (oElement.checked) {
                            val = 1;
                        }
                        formData += encodeURIComponent(elName) + '=' + encodeURIComponent(val) + '&';
                        var pNode = oElement.parentNode;
                        if ((pNode != null) && (pNode.getAttribute("data") != null)) {
                            var cbNodeData = pNode.getAttribute("data");
                            formData += encodeURIComponent(elName) + '=' + cbNodeData + '&';
                        }
                    }
                    else {
                        if (oElement.checked) {
                            formData += encodeURIComponent(elName) + '=' + encodeURIComponent(elValue) + '&';
                        }
                    }
                    break;
                case 'file':
                    // stub case as XMLHttpRequest will only send the file path as a string.
                    break;
                case 'textarea':
                    if (FTB_API) {
                        if (FTB_API[elName]) {
                            formData += encodeURIComponent(elName) + '=' + encodeURIComponent(HtmlEncode(elValue)) + '&';
                        }
                        else {
                            formData += encodeURIComponent(elName) + '=' + encodeURIComponent(elValue) + '&';
                        }
                    }
                    else {
                        formData += encodeURIComponent(elName) + '=' + encodeURIComponent(elValue) + '&';
                    }
                    break;
                case undefined:
                    // stub case for fieldset element which returns undefined.
                    break;
                default:
                    formData += encodeURIComponent(elName) + '=' + encodeURIComponent(elValue) + '&';
                    break;
            }
        }
    }
    return formData.substr(0, formData.length - 1);
}


XView.prototype.FillCopyDataWithValues = function (copyData, defaultValue)
{
	var queryString = "";
	if (copyData!="")
	{
		copyData = decodeURIComponent(copyData);
		var copyDataArray = copyData.split(";");
		for(var i = 0; i < copyDataArray.length; i++)
		{
			var dataArray = copyDataArray[i].split("#");
			
			var from = dataArray[0];
			var to = dataArray[1];
			
			var data = "";
			
			var fromFieldID = this.controlID + "_" + from.toUpperCase();			    
		    if(document.getElementById(fromFieldID)!=null)
		    {			    
		        data = encodeURIComponent(GetFieldData(fromFieldID, from));
		    }
		    else
		    {
		        data = defaultValue;
		    }
			
			if (to.indexOf("-") == 0)
			{
				to = to.substring(1, to.length);
				data = "-" + data;
			}
			
			queryString += "&_" + to + "=" + data;
		}
	}
	
	return queryString;
}

// ************************************************************************************************************
//												** XWINDOW **
// ************************************************************************************************************

function XWindow(id, view, isSideBar, posX, posY)
{
    this.id = id;
    this.isSideBar = isSideBar;
    this.view = view;
    this.sourceObjectID = "";
    this.targetObjectID = "";
    this.targetServerURL = "";
    this.formData = "";
    this.posX = posX;
    this.posY = posY;       
    this.viewState = null;
    this.data = null;
    this.closeWindow = false;
    
  	if (this.view.GetWindow(this.id) == null)
    {
        this.view.windows[this.view.windows.length] = this;
    }
    else
    {
        this.closeWindow = true;
    }
}

XWindow.prototype.Open = function (formData)
{
    if (this.closeWindow)
    {
        this.CloseWindow();
    }
    else
    {
        this.OpenHelper(formData);
    }
}

XWindow.prototype.OpenHelper = function (formData)
{	
	var callBackData = this.targetObjectID + ";" + this.targetServerURL + ";" + formData;
	var callBack =
	{
		success: this.ServerResponse,
		failure: this.view.ServerResponseException,
		argument: callBackData,
		scope: this
	}
            
    var formID = document.forms[0].id; // the first form is the one created by xwindow. ALERT: CANNOT HAVE 2 EQUAL FORMS ACTIVE
    var data = this.view.GetFormData(formID, false, false, false); 
    if (formData!="")
    {
	    data = decodeURIComponent(formData) + "&" + data;
    }
    
	var image = document.getElementById(this.sourceObjectID + "_");
	if (image!=null)
	{
	    image.src = image.src.replace("calendar.gif","wait.gif");
	}

    var callBackObject = YAHOO.util.Connect.asyncRequest('POST', this.targetServerURL, callBack, data);		
}

XWindow.prototype.ServerResponse = function (response)
{
	var tld = response.tld;
	var status = response.status;
	var statusText = response.statusText;
	var allResponseHeaders = response.allResponseHeaders;
	var responseText = response.responseText;
	var responseXML = response.responseXML;
	if (responseText!=null)
	{
		window.status = "Transferred " + responseText.length + " Bytes";
	}

	try
	{
		var callBackData = response.argument.split(";");
		var targetObjectID = callBackData[0];
		var targetServerURL = callBackData[1];
		var specificRequestFormData = callBackData[2];
		
		this.CreateWindow(targetObjectID, responseText);		
	}
	catch (e)
	{
		alert ("Error '" + e.message + "' in XView Server Response");
	}
	
	var image = document.getElementById(this.sourceObjectID + "_");
    if (image!=null)
    {
        image.src = image.src.replace("wait.gif","calendar.gif");
    }
}

XWindow.prototype.CloseWindow = function () 
{
    RemoveElement(this.id); // avoid problems with 2 forms (base + the xwindow form)
    RemoveElement(this.id + "_iframe");
    
    this.view.DeleteWindow(this.id);    
}

XWindow.prototype.PostBack = function (eventTarget, eventArgument) 
{    
    var formData = "__EVENTTARGET=" + eventTarget;
    formData += "&__EVENTARGUMENT=" + eventArgument;    
    this.Open(formData);		
}

XWindow.prototype.CreateWindow = function (sourceObjectID, data) 
{

    //    var regExp = new RegExp("(?:id\=\"__VIEWSTATE\".*value\=\")(.*)(?:\".*\/\>)", "g");    
    //    var result = regExp.exec(data);
    //    if (result!=null)
    //    {
    //        __viewState = result[1];
    //    }
    
    var posStart = data.indexOf("<!--XWINDOW.START-->") + 21;
    var posEnd = data.indexOf("<!--XWINDOW.END-->");    
    var section = data.substring(posStart, posEnd);
                
    var postback1 = this.view.selfID + ".GetWindow('" + this.id + "').PostBack";    
    section = section.replace(/javascript:__doPostBack/g, "javascript:" + postback1);
    
    var postback2 = this.view.selfID + ".GetWindow(\\'" + this.id + "\\').PostBack";
    section = section.replace(/'__doPostBack/g, "'" + postback2);
    	
    section = section.replace(/theForm/g, "theForm_" + sourceObjectID);
    	
	if (this.isSideBar)
	{
	    this.LoadSideBarHtml(sourceObjectID, section)
	}
	else
	{
	    this.LoadHtml(sourceObjectID, section)
	}
}

XWindow.prototype.LoadSideBarHtml = function(sourceObjectID, html) {
    var xwindowHtml = "<DIV>" + html + "</DIV>";

    var elem = document.getElementById(this.id);
    if (!elem) {
        elem = document.createElement("div");
        elem.id = this.id;
        elem.style.position = "absolute";
        elem.style.visibility = "visible";
        elem.style.zIndex = 200;

        document.body.insertBefore(elem, document.body.firstChild);

        var frame = document.createElement("iframe");
        frame.id = this.id + "_iframe";
        frame.style.position = "absolute";
        frame.style.visibility = "visible";
        frame.style.zIndex = 200;
        frame.style.backgroundColor = "white";
        frame.src = "about:blank";
        frame.frameBorder = "0";
        frame.scrolling = "no";
        document.body.insertBefore(frame, document.body.firstChild);
    }
    else {
        elem.style.visibility = "visible";
        elem.style.display = "block";

        var frame = document.getElementById(this.id + "_iframe");
        frame.style.visibility = "visible";
        frame.style.display = "block";
    }

    elem.innerHTML = xwindowHtml;

    //var clientHeight = YAHOO.util.Dom.getClientHeight();

    var masterContainer = document.getElementById("ctl00_mt");
    if (masterContainer != null) {
        elem.style.height = (masterContainer.offsetHeight - 60) + "px";
    }

    frame.style.width = elem.offsetWidth + "px";
    frame.style.height = elem.offsetHeight + "px";

    var sourceObject = document.getElementById(sourceObjectID);
    var xy = YAHOO.util.Dom.getXY(sourceObject);
    xy[0] += this.posX;
    xy[1] += this.posY;
    YAHOO.util.Dom.setXY(elem, xy);
    YAHOO.util.Dom.setXY(frame, xy);
    YAHOO.util.Dom.setStyle(elem.id, "opacity", 1);
    YAHOO.util.Dom.setStyle(frame.id, "opacity", 1);

}

XWindow.prototype.LoadHtml = function (sourceObjectID, html) 
{
	var xwindowHtml = "<TABLE class='XW_TABLE' cellspacing=1 cellpadding=2><TR><TD align=right><img src='" + this.view.basePath + "/Shared/Images/close.gif" + "' onclick=\"" + this.view.selfID + ".GetWindow('" + this.id + "').CloseWindow();\"></TD></TR>";
	xwindowHtml += "<TR><TD><DIV>" + html + "</DIV></TD></TR></TABLE>";

    var elem = document.getElementById(this.id);
    if (!elem) 
    {    
        elem = document.createElement("div");
        elem.id = this.id;
        elem.className = "XW_DIV";
        elem.style.position = "absolute";
        elem.style.visibility = "visible";
        elem.style.zIndex = 100;
       
        document.body.insertBefore(elem, document.body.firstChild);
        
		var frame = document.createElement("iframe");
		frame.id = this.id + "_iframe";
		frame.style.position = "absolute";
		frame.style.visibility = "visible";
		frame.src = "about:blank";
		frame.frameBorder = "0";
		frame.scrolling = "no";
		document.body.insertBefore(frame, document.body.firstChild);			
    }
    else
    {
        elem.style.visibility = "visible";        
		elem.style.display = "block";		
		var frame = document.getElementById(this.id + "_iframe");
        frame.style.visibility = "visible";        
		frame.style.display = "block";
    }
    
    elem.innerHTML = xwindowHtml;
    
    frame.style.width = elem.offsetWidth;
	frame.style.height = elem.offsetHeight;
	
    var sourceObject = document.getElementById(sourceObjectID);
    if (sourceObject!=null)
    {
	    var xy = YAHOO.util.Dom.getXY(sourceObject);
	    xy[0] += this.posX;
	    xy[1] += this.posY;
	    YAHOO.util.Dom.setXY(elem, xy);		
	    YAHOO.util.Dom.setXY(frame, xy); 
        YAHOO.util.Dom.setStyle(elem.id, "opacity", 1);
	    YAHOO.util.Dom.setStyle(frame.id, "opacity", 1); 
	}
}

// ************************************************************************************************************
//												** UTILS **
// ************************************************************************************************************

var sUserAgent = navigator.userAgent;

var isKHTML = sUserAgent.indexOf("KHTML") > -1 
              || sUserAgent.indexOf("Konqueror") > -1 
              || sUserAgent.indexOf("AppleWebKit") > -1; 
              
var isIE = sUserAgent.indexOf("compatible") > -1 
           && sUserAgent.indexOf("MSIE") > -1;
           
var isMoz = sUserAgent.indexOf("Gecko") > -1
            && !isKHTML;
            
            
Function.prototype.bind = function() 
{ 
   var __method = this, args = $A(arguments), object = args.shift(); 
   return function() 
   { 
     return __method.apply(object, args.concat($A(arguments))); 
   } 
} 
  
Function.prototype.bindAsEventListener = function() 
{ 
   var __method = this, args = $A(arguments), object = args.shift(); 
   return function(event) 
   { 
     return __method.apply(object, [event || window.event].concat(args)); 
   } 
} 

var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0; i < iterable.length; i++)
      results.push(iterable[i]);
    return results;
  }
}


function XmlDom() 
{
    if (window.ActiveXObject) 
    {
        var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0",
                             "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument",
                             "Microsoft.XmlDom"];
                         
        for (var i=0; i < arrSignatures.length; i++) {
            try {
        
                var oXmlDom = new ActiveXObject(arrSignatures[i]);
            
                return oXmlDom;
        
            } catch (oError) {
                //ignore
            }
        }          

        throw new Error("MSXML is not installed on your system."); 
              
    } 
    else if (document.implementation && document.implementation.createDocument) 
    {
        
        var oXmlDom = document.implementation.createDocument("","",null);

        oXmlDom.parseError = {
            valueOf: function () { return this.errorCode; },
            toString: function () { return this.errorCode.toString() }
        };
        
        oXmlDom.__initError__();
                
        oXmlDom.addEventListener("load", function () {
            this.__checkForErrors__();
            this.__changeReadyState__(4);
        }, false);

        return oXmlDom;        
        
    } 
    else 
    {
        throw new Error("Your browser doesn't support an XML DOM object.");
    }
}

if (isMoz) 
{
    Document.prototype._readyState = 0;
    Document.prototype.onreadystatechange = null;

    Document.prototype.__changeReadyState__ = function (iReadyState) {
        this._readyState = iReadyState;

        if (typeof this.onreadystatechange == "function") {
            this.onreadystatechange();
        }
    };

    Document.prototype.__initError__ = function () {
        this.parseError.errorCode = 0;
        this.parseError.filepos = -1;
        this.parseError.line = -1;
        this.parseError.linepos = -1;
        this.parseError.reason = null;
        this.parseError.srcText = null;
        this.parseError.url = null;
    };
    
    Document.prototype.__checkForErrors__ = function () {

        if (this.documentElement.tagName == "parsererror") {

            var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;

            reError.test(this.xml);
            
            this.parseError.errorCode = -999999;
            this.parseError.reason = RegExp.$1;
            this.parseError.url = RegExp.$2;
            this.parseError.line = parseInt(RegExp.$3);
            this.parseError.linepos = parseInt(RegExp.$4);
            this.parseError.srcText = RegExp.$5;
        }
    };
    
        
    Document.prototype.loadXML = function (sXml) {
    
        this.__initError__();
    
        this.__changeReadyState__(1);
    
        var oParser = new DOMParser();
        var oXmlDom = oParser.parseFromString(sXml, "text/xml");
        oXmlDom.normalize();
 
        while (this.firstChild) {
            this.removeChild(this.firstChild);
        }

        for (var i=0; i < oXmlDom.childNodes.length; i++) {
            var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
            this.appendChild(oNewNode);
        }
        
        this.__checkForErrors__();
        
        this.__changeReadyState__(4);

    };
    
    Document.prototype.__load__ = Document.prototype.load;

    Document.prototype.load = function (sURL) {
        this.__initError__();
        this.__changeReadyState__(1);
        this.__load__(sURL);
    };
    
    Node.prototype.__defineGetter__("xml", function () {
        var oSerializer = new XMLSerializer();
        return oSerializer.serializeToString(this, "text/xml");
    });
        
    Element.prototype.selectNodes = function (sXPath) 
    {
        var oEvaluator = new XPathEvaluator();
        var oResult = oEvaluator.evaluate(sXPath, this, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
        var aNodes = new Array;
        if (oResult != null) 
        {
            var oElement = oResult.iterateNext();
            while(oElement) 
            {
                aNodes.push(oElement);
                oElement = oResult.iterateNext();
            }
        }
        return aNodes;
    };

}

function GetXmlDom(xml)
{
    var oXmlDom = new XmlDom();        
    oXmlDom.onreadystatechange = function () 
    {
        if (oXmlDom._readyState == 4) 
        {
            if (oXmlDom.parseError != 0) 
            {
                var oError = oXmlDom.parseError;
                alert("An error occurred:\nError Code: "
                      + oError.errorCode + "\n"
                      + "Line: " + oError.line + "\n"
                      + "Line Pos: " + oError.linepos + "\n"
                      + "Reason: " + oError.reason);

            }
        }
    }        
    oXmlDom.loadXML(xml);
    return oXmlDom;
}

function GetNodeValue(node)
{
    var result;
    if (isMoz)
    {
        result = node.textContent;
    }
    else
    {
        result = node.firstChild.nodeValue;
    }
    return result;
}

var whitespace = "\n\r\t "; var quotes = "\"'"; 

function convertEscapes(str) { var gt; gt = -1; while (str.indexOf("&lt;", gt + 1) > -1) { var gt = str.indexOf("&lt;", gt + 1); var newStr = str.substr(0, gt); newStr += "<"; newStr = newStr + str.substr(gt + 4, str.length); str = newStr;}
gt = -1; while (str.indexOf("&gt;", gt + 1) > -1) { var gt = str.indexOf("&gt;", gt + 1); var newStr = str.substr(0, gt); newStr += ">"; newStr = newStr + str.substr(gt + 4, str.length); str = newStr;}
gt = -1; while (str.indexOf("&amp;", gt + 1) > -1) { var gt = str.indexOf("&amp;", gt + 1); var newStr = str.substr(0, gt); newStr += "&"; newStr = newStr + str.substr(gt + 5, str.length); str = newStr;}
return str;}

function convertToEscapes(str) { var gt = -1; while (str.indexOf("&", gt + 1) > -1) { gt = str.indexOf("&", gt + 1); var newStr = str.substr(0, gt); newStr += "&amp;"; newStr = newStr + str.substr(gt + 1, str.length); str = newStr;}
gt = -1; while (str.indexOf("<", gt + 1) > -1) { var gt = str.indexOf("<", gt + 1); var newStr = str.substr(0, gt); newStr += "&lt;"; newStr = newStr + str.substr(gt + 1, str.length); str = newStr;}
gt = -1; while (str.indexOf(">", gt + 1) > -1) { var gt = str.indexOf(">", gt + 1); var newStr = str.substr(0, gt); newStr += "&gt;"; newStr = newStr + str.substr(gt + 1, str.length); str = newStr;}
return str;}
                                
function ConvertToBoolean(b)
{
	if (b.toLowerCase()=="true")
	{
		return true;
	}
	else
	{
		return false;
	}
}

function RemoveElement(elemID) 
{
	var elem = document.getElementById(elemID);
	if (elem!=null)
	{
		elem.parentNode.removeChild(elem);
	}
}

function GetFieldData(fieldID, fieldName)
{
	var result = "";
	var oElement = document.getElementById(fieldID);
	if (oElement!=null)
	{
		switch (oElement.type)
		{
			case 'select-multiple':
				for(var j=0; j<oElement.options.length; j++)
				{
					if(oElement.options[j].selected)
					{
						result = oElement.options[j].value;
					}
				}
				break;
			case 'radio':
				result = oElement.value;
				break;
			case 'checkbox':
				var val = 0;
				if(oElement.checked)
				{
					val = 1;
				}
				result = val;
				break;
			default:
				result = oElement.value;
				if (result == null)
				{
				    result = GetFieldRadioButtonListData(oElement, fieldID);
				}
				break;
		}
	}
	return result;
}

function GetFieldRadioButtonListData(container, fieldID)
{        
    var controls = container.getElementsByTagName("input");        
    for(var i = 0; i < controls.length; i++)
    {
        var control = controls[i];
        if ((control.type == "radio") && (control.checked))
        {
            return control.value;
        }
    }
    return "";
}

function SetFocus(name)
{	
	var field = document.getElementById(name);
	if (field!=null)
	{
		try
		{
			field.focus();
		}
		catch(e)
		{
		}
	}
	return false;
}

function HtmlDecode(text) 
{
	if ( typeof( text ) != "string" )
		text = text.toString() ;

	text = text.replace(/&amp;/g, "&") ;
	text = text.replace(/&quot;/g, "\"") ;
	text = text.replace(/&lt;/g, "<") ;
	text = text.replace(/&gt;/g, ">") ;
	text = text.replace(/&#146;/g, "'") ;

	return text ;
}

function HtmlEncode(text) 
{
	if ( typeof( text ) != "string" )
		text = text.toString() ;

	text = text.replace(/&/g, "&amp;") ;
	text = text.replace(/"/g, "&quot;") ;
	text = text.replace(/</g, "&lt;") ;
	text = text.replace(/>/g, "&gt;") ;
	text = text.replace(/'/g, "&#146;") ;

	return text ;
}

function ShowHTML(title, html)
{
	var wind = window.open('', title, '');	
	wind.document.open();
	wind.document.write('<B>' + title + '</B>');
	wind.document.write('<BR><BR>');
	wind.document.write(convertToEscapes(html));
	//wind.document.write(html);
	wind.document.close();
}

// ************************************************************************************************************
//												** WEB TASKS **
// ************************************************************************************************************

function CreateWebBox(fieldId, fieldValue, webTaskType)
{	
    var container = document.getElementById(_$XViewClientID);

	var id = fieldId + "_WebBox";
    var elem = document.getElementById(id);
    if (!elem) 
    {
        elem = document.createElement("div");
        elem.id = id;
        elem.style.position = "absolute";
        elem.style.visibility = "visible";
        elem.style.display = "block";
        document.body.insertBefore(elem, document.body.firstChild);
    }
    
    if (elem.style.visibility != "visible")
    {
        elem.style.visibility = "visible";
        elem.style.display = "block";
    }
    
    //YAHOO.util.Dom.setStyle(elem.id, "opacity", .8);
    var tableConfig = "";
	if (isIE)
    {
		tableConfig = "border=0 cellspacing=3 cellpadding=1";
    }
    
	var html = "<TABLE " + tableConfig + " ><TR><TD align=right><img src='" + _$WebPath + "/Shared/Images/close.gif" + "' onclick=\"CloseWebBox('" + elem.id + "');\"></TD></TR>";
	if (GetWebTaskTypeName(webTaskType, fieldId) == "map") // loading javascript
	{
		try
		{
			var mapContainerID = elem.id + "_map";
			html += "<TR><TD class=\"XDV_WEBBOX_MAP\"><DIV id=" + mapContainerID + "></DIV></TD></TR></TABLE>";
			elem.innerHTML = html;
			fieldValue = fieldValue.replace("MAPCONTAINERCLIENTID", mapContainerID);
			eval(fieldValue);
		}
		catch(e)
		{
			var message = "Error '" + e.message + "' in processing map web rule " + fieldValue;
			CloseBatchWaitMessage();
			CloseWebBox(elem.id);
		}
	}
	else
	{
		var style = "";
	    if (isIE)
        {
			style = "Style='HEIGHT:198px;overflow: auto;'";
        }
		html += "<TR><TD class=\"XDV_WEBBOX\"><DIV " + style + ">" + fieldValue + "</DIV></TD></TR></TABLE>"
		elem.innerHTML = html;
	}
	
	    
    if (container!=null)
    {
		var xy = YAHOO.util.Dom.getXY(container);
		xy[0] += container.offsetWidth + 2;
		xy[1] += 5;
		YAHOO.util.Dom.setXY(elem, xy); 
	}
}

function CloseWebBox(id)
{
    var elem = document.getElementById(id);
    if (elem!=null) 
    {
		elem.style.visibility = "hidden";
		elem.style.display = "none";
    }
}

function GetWebTaskTypeName(webTaskType, fieldId)
{
	var result = "";
	if (webTaskType!="")
	{
		var webTaskTypeArray = webTaskType.split(";");
		for(var i = 0; i < webTaskTypeArray.length; i++)
		{
			var type = webTaskTypeArray[i].split("=");
			if ((type!="") && (type.length == 2))
			{
				if (type[0].toLowerCase() == fieldId.toLowerCase())
				{
					result = type[1];
					break;
				}
			}
		}
	}
	return result;
}

function ProcessBatch(targetServerURL, targetObject, specificRequestFormData, batchData)
{

	CreateBatchWaitMessage();
	
	var callBackData = targetObject.id;
	var callBack =
	{
		success: XViewHttpBatchResponse,
		failure: XViewHttpResponseException,
		argument: callBackData,
		scope: this
	}

	var data = this.GetFormData("", false, true, true);			
	if (specificRequestFormData!="")
	{
		data = decodeURIComponent(_$OperationPostData) + "&" + decodeURIComponent(specificRequestFormData) + "&" + data;
	}
	else
	{
		data = decodeURIComponent(_$OperationPostData) + "&" + data;
	}
	var primaryKeyValue = "";
	var aux = eval("document.forms[0]." + GetXData("defaultTablePrimaryKey", _$OperationPostData));
	if (aux!=null)
	{
		primaryKeyValue = aux.value;
	}
	data += "&defaultTablePrimaryValue=" + primaryKeyValue;
	
	data = SetXData("xmlRequestData", batchData, data);
	
	var callBackObjectWebRules = YAHOO.util.Connect.asyncRequest('POST', targetServerURL, callBack, data);
}

XView.prototype.CreateBatchWaitMessage = function () 
{
    var elem = document.getElementById("XViewHttpRequestBatchWaitMessage");
    if (!elem) 
    {
        elem = document.createElement("div");
        elem.id = "XViewHttpRequestBatchWaitMessage";
        elem.style.position = "absolute";
        elem.style.visibility = "visible";
        document.body.insertBefore(elem, document.body.firstChild);
    }
    else
    {
		elem.style.visibility = "visible";
    }
    
    elem.innerHTML = "<img src=\"" + this.basePath + "/Shared/Images/wait2.gif\" />";
    
    var obj = document.getElementById(this.controlID);
    if (obj!=null)
    {
		var xy = YAHOO.util.Dom.getXY(obj);
		xy[0] += -2; // width
		xy[1] += -9; //height
		YAHOO.util.Dom.setXY(elem, xy); 
	}
}

function CloseBatchWaitMessage()
{
    var elem = document.getElementById("XViewHttpRequestBatchWaitMessage");
    if (elem) 
    {
		elem.style.visibility = 'hidden';
	}
}

function XViewHttpBatchResponse(response)
{
	var tld = response.tld;
	var status = response.status;
	var statusText = response.statusText;
	var allResponseHeaders = response.allResponseHeaders;
	var responseText = response.responseText;
	var responseXML = response.responseXML;
	if (responseText!=null)
	{
		window.status = "Transferred " + responseText.length + " Bytes";
	}
	
	try
	{
		var callBackData = response.argument.split(";");
		var targetObjectID = callBackData[0];
		var targetObject = document.getElementById(targetObjectID);
		ProcessOperation(responseText, targetObject, "", "", true);
	}
	catch (e)
	{
		alert ("Error in executing web rules. " + e.message);
	}
	
	CloseBatchWaitMessage();
}

// ************************************************************************************************************
//												END ** WEB RULES **
// ************************************************************************************************************