﻿// JScript File
function Dbg(str)
{
    var dbgEl = el('dbgdiv');
    if (dbgEl == null)
    {
        var dbgEl = document.createElement('DIV');
        dbgEl.id = 'dbgdiv';
        dbgEl.style.position = 'fixed';
        dbgEl.style.width = '400px';
        dbgEl.style.height = 'auto';
        dbgEl.style.top = '20px';
        dbgEl.style.left = '20px';
        dbgEl.style.filter = 'alpha(opacity=50)';
        dbgEl.style.opacity = '0.50';
        dbgEl.style.border = '1px solid black';
        dbgEl.style.backgroundColor = '#DDDDDD';

        document.body.appendChild(dbgEl);
        //document.write('<div id=\'dbgdiv\' style=\'position:absolute;width: 300px; height: auto;top: 20px; right: 20px; filter:alpha(opacity=50);opacity=0.5;border: 1px solid black; background-color: #DDDDDD;\'></div>');
        //dbgEl = el('dbgdiv');
    }
    
    var newInfo = document.createElement('DIV');
    newInfo.style.position = 'relative';
    newInfo.style.clear = 'both';
    newInfo.innerHTML = str;
    dbgEl.appendChild(newInfo);
    dbgEl.appendChild(document.createElement('HR'));
}

function VenueInformation() { }
VenueInformation.oContainer = null;
VenueInformation.LastToHide = null;
VenueInformation.HideTimeout = null;
VenueInformation.ShowInfoPopup = function(name)
{

    if (VenueInformation.oContainer == null)
    {
        VenueInformation.oContainer = el('venueInformationPopup');
    }
    
    if (VenueInformation.HideTimeout != null)
    {
        window.clearTimeout(VenueInformation.HideTimeout);
        XibAjax.HideElement(el(VenueInformation.LastToHide));
    }
    
    var element = el(name);
    XibAjax.ShowElement(element);
    XibAjax.ShowElement(VenueInformation.oContainer);
    Event.observe(document, 'mousemove', VenueInformation.MoveVenueInformationPopup, false);
}
VenueInformation.HideInfoPopup = function(name)
{
    VenueInformation.LastToHide = name;
    VenueInformation.HideTimeout = setTimeout('VenueInformation.HideInfoPopup_Timeout()', 150);
}
VenueInformation.HideInfoPopup_Timeout = function()
{
    XibAjax.HideElement(el(VenueInformation.LastToHide));
    XibAjax.HideElement(VenueInformation.oContainer);
    Event.stopObserving(document, 'mousemove', VenueInformation.MoveVenueInformationPopup, false);
}

VenueInformation.MoveVenueInformationPopup = function(e)
{
    VenueInformation.oContainer.style.left = (Event.pointerX(e) + 25) + 'px';
    VenueInformation.oContainer.style.top = (Event.pointerY(e) + 15) + 'px';
}

XibAjax.ToggleElement = function(show, element)
{
    if (show)
    {
        XibAjax.ShowElement(el(element));
    }
    else
    {
        XibAjax.HideElement(el(element));
    }
}



XibAjax.GetValue = function(url, func, Params)
{
	var oAjaxRequest = new AjaxRequest();
	oAjaxRequest.XmlRequest.open("GET", XibAjax.CleanUrl(url), true);
	oAjaxRequest.Function = func;
    oAjaxRequest.PassedParameters = Params;
	oAjaxRequest.oncomplete = "XibAjax.GetValue_finalise";
	oAjaxRequest.XmlRequest.send(null);
	IncrementProcessCounter();
}

XibAjax.GetValue_finalise = function(oAjaxRequest){
	var val = eval(oAjaxRequest.XmlRequest.responseText);
	
	if (typeof(oAjaxRequest.Function) == 'object' ||
	    typeof(oAjaxRequest.Function) == 'function')
	{
	    oAjaxRequest.Function(val, oAjaxRequest.PassedParameters);
	}
	
	DecrementProcessCounter();
}

function LocatePostcode(baseUrl)
{
    var postcode = window.prompt('Please enter your postcode');
    if (postcode + '' == '')
    {
        alert('\'' + postcode + '\' is not a valid postcode');
        return;
    }

    var params = new Object();
    params.Postcode = postcode;

    XibAjax.GetValue(baseUrl + encodeURIComponent(postcode),
        function (result)
        {
            var resultArr = result.split('|');
            if (resultArr.length != 2)
            {
                alert('Could not Geocode postcode. Please contact your administrator');
                return;
            }
            if (resultArr[0] == 'ERR')
            {
                alert(resultArr[1]);
            }
            else
            {
                //is ok...
                var latLong = resultArr[1].split(',');
                if (!latLong.length == 2)
                {
                    alert('Could not Geocode postcode. Please contact your administrator');
                    return;
                }
                GoogleMap.SetMarker(parseFloat(latLong[0]), parseFloat(latLong[1]), '<p>' + params.Postcode + '</p>');
            }
        },
        params
    );
}

/*
 * Client side ajax drop down filtering
 */
AjaxTable.HandleCheckboxClick = function(tableId, idClicked, description, newValue){
	var oTable = AjaxTable.GetTable(tableId);
	oTable.SelectedIdList.AddOrRemoveItem(idClicked, newValue, description);
	
	if (typeof(oTable.OnSelectedValueChanged) == 'function' ||
		    typeof(oTable.OnSelectedValueChanged) == 'object')
	{
	    oTable.OnSelectedValueChanged();
	}
	
	if(oTable.SelectedIdList.PickerType == "Single"){
		//Un-check the other checkboxes.
		var ArrCheckboxes = oTable.getElementsByTagName("input");
		var chkPrefix = tableId + "_chkbox_";
		for(var i=0; i<ArrCheckboxes.length; i++){
			var oItem = ArrCheckboxes[i];
			if(oItem.id.indexOf(chkPrefix) == 0){
				var id = oItem.id.substring(chkPrefix.length);
				if(id != idClicked + "") oItem.checked = false;
			}
		}
		
		XibAjax.CloseControl(XibAjax.LastControlOpenned);
	}	
}

AjaxTable.AddLimitingParam = function(table, param)
{
    table.LimitingParameters[table.LimitingParameters.length] = param;
}
AjaxTable.ClearLimitingParams = function(table, propertyName)
{
    if (typeof(propertyName) != 'undefined' &&
        propertyName != null)
    {
        for (var i = 0; i < table.LimitingParameters.length; ++i)
        {
            if (table.LimitingParameters[i].name == propertyName)
            {
                table.LimitingParameters.splice(i, 1);
                return;
            }
        }
    }
    else
    {
        table.LimitingParameters = [];
    }
}

LimitingParameter = function() { }

LimitingParameter.prototype.name = '';
LimitingParameter.prototype.value = '';

/*
 * Limiting parameters
 */

AjaxTable.CreateQueryString = function(oTable){

	var qs = "";
	//qs = Ajax.AddToQueryString(qs, "ClassName", oTable.XiClass);
	qs = XibAjax.AddToQueryString(qs, "PageSize", oTable.PageSize);
	qs = XibAjax.AddToQueryString(qs, "CurrentPage", oTable.CurrentPage);
	qs = XibAjax.AddToQueryString(qs, "Order", oTable.OrderRequests);
	
	if (!oTable.Refreshed)
	{
	    qs = XibAjax.AddToQueryString(qs, "Refreshed", oTable.Refreshed);
	}
	qs = XibAjax.AddToQueryString(qs, "TableID", oTable.id);
	
	qs = XibAjax.AddToQueryString(qs, "Finder", oTable.Finder.Serialize());
	
	
	for(var i=0; i<oTable.SearchParameters.length; i++){
		var oParam = oTable.SearchParameters[i];
		qs = XibAjax.AddToQueryString(qs, "s_" + oParam.name, oParam.value);
	}
	
	for (var j=0; j < oTable.LimitingParameters.length; ++j)
	{
	    qs = XibAjax.AddToQueryString(qs, 's_' + oTable.LimitingParameters[j].name, oTable.LimitingParameters[j].value);
	}
	
	//Add limiting parameters here
	
	//remove possibility of cache/proxy servers
	qs = XibAjax.AddToQueryString(qs, "t", new Date().getTime());
	
	return(qs);
}

//This is called when the HTML table is loaded in to the page.
AjaxTable.Initialise = function(tableId, parameters, dontRefresh) {
	var oTable = AjaxTable.GetTable(tableId);
	
	oTable.CurrentProcessCount = 0;
	
	oTable.parameters = parameters;
	
	oTable.isCssTable = (oTable.tagName == "DIV");
	oTable.isEditable = parameters.EditableTable;
	
	oTable.initialized = true;
	oTable.Refreshed = false;
	oTable.OrderRequests = new Array();
	oTable.Url = oTable.attributes["Url"].value;
	//oTable.XiClass = oTable.attributes["XiClass"].value;
	oTable.NumberOfRecords = null;
	oTable.SearchParameters = new Array();
	oTable.LimitingParameters = [];
	
	oTable.PageSize = parseInt(oTable.attributes["PageSize"].value);
	if(isNaN(oTable.PageSize)) oTable.PageSize = 20;
	
	oTable.CurrentPage = 0;	
	
	oTable.Finder = parameters.Finder;
	oTable.LinkDefaultParameter = parameters.LinkDefaultParameter;
	
	if(oTable.isCssTable){
		
		//The template should be the only thing within the body
		//We can grab it, then remove it.
	    var oTBody = XibAjax.FindChildNodeByClassname(oTable, "TableData");

		oTable.DataItemTemplate = oTBody.innerHTML;
		

        for(var i=0; i<oTBody.childNodes.length; i++){
            if(oTBody.childNodes[i].tagName != null){
                oTBody.removeChild(oTBody.childNodes[i]);
                i--;
            }
        }
        
        //Resize the table to coincide with the data in the header row.
        var oTHead = XibAjax.FindChildNodeByClassname(oTable, "TableHeader");
        var Spans = oTHead.getElementsByTagName("SPAN");
        var totalWidth = 0;
        for(var i=0; i<Spans.length; i++){
            totalWidth += (Spans[i].offsetWidth + 0);
        }
        
        //oTable.style.width = (totalWidth + 5) + "px";
        //oTable.style.width = "800px";


    }		
	
	/*
	if(parameters != null){
		if(parameters.finder != null){
			AjaxTable.Finder = parameters.finder;
			oTable.ReferringObjectClass = parameters.finder.containingClass;
			oTable.ReferringObjectId = parameters.finder.id;
			oTable.ReferringObjectFinder = parameters.finder.finderProperty;
		}
	}
	*/

    if (!dontRefresh) AjaxTable.Refresh(tableId);
	
}

IdList.prototype.Selected = function()
{
    if(this.PickerType == "Single")
    {
        if (this.ItemsToAdd.length == 0)
        {
            return null;
        }
        else
        {
            return this.ItemsToAdd[0].id;
        }
    }
    else
    {
        return this.ItemsToAdd;
    }
}

AjaxTable._GlobalRefreshTables = [];
AjaxTable.RegisterForGlobalRefresh = function(groupName, tableId)
{
    var args = new AjaxTable_GlobalRefreshArgs();
    args.GroupName = groupName;
    args.TableID = tableId;
    AjaxTable._GlobalRefreshTables[AjaxTable._GlobalRefreshTables.length] = args;
}

AjaxTable.GlobalRefresh = function(groupName)
{
    var tmpGroupName = groupName;
    if (tmpGroupName == null)
    {
        tmpGroupName = "";
    }
    for (var i = 0; i < AjaxTable._GlobalRefreshTables.length; ++i)
    {
        if (AjaxTable._GlobalRefreshTables[i].GroupName = tmpGroupName)
        {
            AjaxTable.Refresh(AjaxTable._GlobalRefreshTables[i].TableID);
        }
    }
}

function AjaxTable_GlobalRefreshArgs() { }
AjaxTable_GlobalRefreshArgs.prototype.GroupName = "";
AjaxTable_GlobalRefreshArgs.prototype.TableID = "";

function AjaxObjectPicker() { }

AjaxObjectPicker._DependentPickers = [];
AjaxObjectPicker.GetByParentId = function(parentTableId)
{
    for (var i = 0; i < AjaxObjectPicker._DependentPickers.length; ++i)
    {
        if (AjaxObjectPicker._DependentPickers[i].Parent == parentTableId)
        {
            return AjaxObjectPicker._DependentPickers[i];
        }
    }
    return null;
}

AjaxObjectPicker.GetByGroupName = function(groupName)
{
    for (var i = 0; i < AjaxObjectPicker._DependentPickers.length; ++i)
    {
        if (AjaxObjectPicker._DependentPickers[i].GroupName == groupName)
        {
            return AjaxObjectPicker._DependentPickers[i];
        }
    }
    return null;
}

AjaxObjectPicker.Contains = function(parentTableId)
{
    return AjaxObjectPicker.GetByParentId(parentTableId) != null;
}

AjaxObjectPicker.ContainsGroup = function(groupName)
{
    return AjaxObjectPicker.GetByGroupName(groupName) != null;
}

AjaxObjectPicker.AddParent = function(parentId, groupName)
{
    //alert('AddParent, groupName:' + groupName + ', parentId:' + parentId);
    //alert('AjaxObjectPicker.ContainsGroup(groupName):' + AjaxObjectPicker.ContainsGroup(groupName) + ', AjaxObjectPicker.Contains(parentId):' + AjaxObjectPicker.Contains(parentId));
    
    if (AjaxObjectPicker.ContainsGroup(groupName))
    {
        var depGroup = AjaxObjectPicker.GetByGroupName(groupName);
        depGroup.Parent = parentId;
    }
    else
    {
        AjaxObjectPicker._DependentPickers[AjaxObjectPicker._DependentPickers.length] = {
            Parent : parentId,
            GroupName : groupName,
            Dependents : []
        }
    }
}

AjaxObjectPicker.AddDependent = function(groupName, dependentId, propertyName)
{
    
    if (!AjaxObjectPicker.ContainsGroup(groupName))
    {
        AjaxObjectPicker.AddParent('', groupName);
    }
    var depGroup = AjaxObjectPicker.GetByGroupName(groupName);
    
    
    depGroup.Dependents[depGroup.Dependents.length] =
        {
            Dependent : dependentId,
            PropertyName : propertyName
        };
}

AjaxObjectPicker.RefreshGroup = function(groupName, _maintainValue)
{
    var maintainValue = false;
    if (arguments.length == 2)
    {
        maintainValue = _maintainValue;
    }

    //Dbg('Refresh:' + groupName);
    var depGroup = AjaxObjectPicker.GetByGroupName(groupName);
    var selectedId = AjaxTable.GetSelectedId(depGroup.Parent);//Now this supports M2Ms
    
    //Dbg('Refresh, selectedId:' + selectedId);
    
    for (var i = 0; i < depGroup.Dependents.length; ++i)
    {
   
        //Dbg('Refresh 2');
        var depTable = AjaxTable.GetTable(depGroup.Dependents[i].Dependent);

        if (selectedId != null)
        {

            //Dbg('Refresh 3');
            AjaxTable.ClearLimitingParams(depTable, depGroup.Dependents[i].PropertyName);
            if (!maintainValue)
            {
                depTable.SelectedIdList.Reset();
            }
            var limitingParam = new LimitingParameter();
            limitingParam.name = depGroup.Dependents[i].PropertyName;
            limitingParam.value = '' + selectedId;
            AjaxTable.AddLimitingParam(depTable, limitingParam);
            AjaxTable.Refresh(depTable.id);
        }
        else
        {
            AjaxTable.ClearLimitingParams(depTable);
        }
    }
}

IdList.prototype.Reset = function()
{
    this.ItemsToAdd = [];
    this.SetInputValues();
}

AjaxTable.ClearSearch = function(tableId, autoRefresh){

    var tmpAutoRefresh = true;
    if (autoRefresh == false)
    {
        tmpAutoRefresh = false;
    }

	var oTable = AjaxTable.GetTable(tableId);
	
	//Clear previous parameters
	oTable.SearchParameters = new Array();
	
	oTable.CurrentPage = 0;
	if (tmpAutoRefresh)
	{
	    AjaxTable.Refresh(tableId);
	}
}

AjaxTable.GetSelectedId = function(parentTableId)
{
    var selectedIds = null;
    var oParentTable = AjaxTable.GetTable(parentTableId);
    if (oParentTable != null)
    {
        if (oParentTable.SelectedIdList.PickerType == 'Single')
        {
            selectedIds = oParentTable.SelectedIdList.Selected();
        }
        else
        {
            selectedIds = XibAjax.CreateIDStringFromArray(oParentTable.SelectedIdList.Selected());
        }
        
    }
    //Dbg('Selected Id:' + selectedId);
    return selectedIds;
}

XibAjax.CreateIDStringFromArray = function(idArr)
{
    var idString = '';
    var isFirst = true;
    if (idArr.length > 0)
    {
        for (var i = 0; i < idArr.length; ++i)
        {
            if (isFirst)
            {
                isFirst = false;
            }
            else
            {
                idString += ',';
            }
            if (idArr[i].id)
            {
                idString += idArr[i].id;
            }
            else
            {
                idString += idArr[i];
            }
        }
    }
    else
    {
        idString = '-1';
    }
    return idString;
}

AjaxObjectPicker.AddNew = function(parentTableId, dependentId, propertyName, groupName)
{

    AjaxObjectPicker._DependentPickers[AjaxObjectPicker._DependentPickers.length] = {
        Parent : parentTableId,
        GroupName : groupName,
        Dependents :
            [
                {
                    Dependent : dependentId,
                    PropertyName : propertyName
                }
            ]
    };
}

XibAjax.LoadHtml = function(elementId, parameters, Url, isPOST){
	var oElement = window.top.document.getElementById(elementId);
	
	if(oElement.tagName == "DIV") oElement.style.display = "block";	
	if(oElement.tagName == "SPAN") oElement.style.display = "inline";
	if(oElement.LoadComplete) {
		if (oElement.OnShow) {
			oElement.OnShow();
		}
		return;
	}
	if((!oElement.attributes["Url"]) && (Url == null)) return;

	if(Url == null) Url = oElement.attributes["Url"].value;

    var qs = "";

	var oAjaxRequest = new AjaxRequest();
	if (isPOST) {
	    var i = Url.indexOf("?");
	    var sUrl = i>-1 ? Url.substr(0,i) : Url;
	    qs = i>-1 ? Url.substr(i+1) : "";
	    oAjaxRequest.XmlRequest.open("POST", XibAjax.CleanUrl(sUrl), true);
	    oAjaxRequest.XmlRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	} else {
	    oAjaxRequest.XmlRequest.open("GET", XibAjax.CleanUrl(Url), true);
	}
	
	oAjaxRequest.oElement = oElement;
	if(typeof parameters == "string"){
		oAjaxRequest.PassedParameters = document.getElementById(parameters);
		if (oAjaxRequest.PassedParameters==null) {
			oAjaxRequest.PassedParameters = eval(parameters);
			if(oAjaxRequest.PassedParameters.length)oAjaxRequest.PassedParameters = oAjaxRequest.PassedParameters[0];
		}
	}	else {
		oAjaxRequest.PassedParameters = parameters;
	}


	
	oAjaxRequest.oncomplete = "XibAjax.LoadHtml_finalise";
	oAjaxRequest.XmlRequest.send(isPOST ? qs : null);
	IncrementProcessCounter();

	
}

XibAjax.ToggleVisibility = function(checkbox, element_id)
{
    if (checkbox.checked)
    {
        XibAjax.ShowElement(el(element_id));
    }
    else
    {
        XibAjax.HideElement(el(element_id));
    }
}

XibAjax.LoadHtmlInvisible = function(elementId, parameters, Url) {

    var oElement = document.getElementById(elementId);
    if (!oElement) oElement = window.top.document.getElementById(elementId);

    //if (oElement.tagName == "DIV") oElement.style.display = "block";
    if (oElement.tagName == "SPAN") oElement.style.display = "inline";
    if (oElement.LoadComplete) {
        if (oElement.OnShow) {
            oElement.OnShow();
        }
        return;
    }
    if ((!oElement.attributes["Url"]) && (Url == null)) return;

    if (Url == null) Url = oElement.attributes["Url"].value;

    var oAjaxRequest = new AjaxRequest();
    oAjaxRequest.XmlRequest.open("GET", XibAjax.CleanUrl(Url), true);

    oAjaxRequest.oElement = oElement;
    if (typeof parameters == "string") {
        oAjaxRequest.PassedParameters = document.getElementById(parameters);
        if (oAjaxRequest.PassedParameters == null) {
            oAjaxRequest.PassedParameters = eval(parameters);
            if (oAjaxRequest.PassedParameters.length) oAjaxRequest.PassedParameters = oAjaxRequest.PassedParameters[0];
        }
    } else {
        oAjaxRequest.PassedParameters = parameters;
    }



    oAjaxRequest.oncomplete = "XibAjax.LoadHtml_finalise";
    oAjaxRequest.XmlRequest.send(null);
    IncrementProcessCounter();


}