/*
ajaxtabs.js - JavaScript Code for AjaxTabsTemplate Structure
    Required Modules: (FCWSite\Features\Ajax) 
        AjaxTabsTemplate.cs
        AjaxListingControl.cs
        AjaxData.aspx
        AjaxFilterSearchControl.ascx
        ENTITYNAMEListing.ascx (Controls defined in AjaxTabsTemplate.cs > AjaxDataListingControlType)
    Required Includes: (FCWSite\Include)
        JQuery (v.1.3.0 or greater: jquery-1.3.0.min.js)
        JQuery RightClick (jquery.rightClick.js v 1.01)
    Required Images: (FCWSite\Img)
        Loading Image defined in <at:AjaxMaster> <AjaxLoadingImageUrl Valiue="FILEPATH"></at:AjaxMaster>
    Required Features:
        Ajax Data Retreiver Path defined in <at:AjaxMaster>  <AjaxDataUrl Value="$[CultureRoot]/ajax/AjaxData.aspx" /> </at:AjaxMaster>
    
AJAX calls will not fire while in any Edit Mode

Contents of this file:
    Ajax Page Functions -- 
        pageObject_____________________  [PFUNC1]
        getActiveTabName_______________  [PFUNC2]
        getConnectText__________________ [PFUNC3]
        initializeConnectText______________  [PFUNC4]
        pageToString___________________   [PFUNC5]
        AjaxPageInit_____________________ [PFUNC6]
        ImmediateAjaxControlLoad_________  [PFUNC7]
    Tab Functions -- 
        tabObject_______________________ [TFUNC1]
        toString________________________  [TFUNC2]
        SetSearchUrl____________________ [TFUNC3]
        buildTabs_______________________ [TFUNC4]
        scrollTabStrip____________________ [TFUNC5]
        isTabStripVisible_________________  [TFUNC6]
        switchtab______________________   [TFUNC7]
        clicktab________________________   [TFUNC8]
        changeSort_____________________  [TFUNC9]
        ajaxLoadData____________________ [TFUNC10]
        runOtherTabControls______________ [TFUNC11]
        hideOtherTabControls_____________  [TFUNC12]
        clearPageIndex___________________ [TFUNC13]
        setPageIndex____________________  [TFUNC14]
        gopage_________________________  [TFUNC15]
    Debugging Functions --
        debugMenuToggle_________________ [DFUNC1]
        ajaxDebugObjects_________________ [DFUNC2]
        reportDebugMessage______________ [DFUNC3]
    AjaxFilterSearchControl Functions --
        focusTextBox____________________ [ASFUNC1]
        blurTextBox_____________________  [ASFUNC2]
        resetSearch_____________________  [ASFUNC3]
        getSearchQueryString_____________  [ASFUNC4]
    TypeAhead Functions -- 
        runTypeAheadSearch_____________  [TAFUNC1]
        typeAheadDataRetrieval___________   [TAFUNC2]
        KeyPressControl__________________ [TAFUNC3]
        getTypeAheadListElement__________   [TAFUNC4]
        clearTypeAheadDropDown_________   [TAFUNC5]
        SetTypeAheadDropDown___________  [TAFUNC6]
        processSelectedTypeAhead_________ [TAFUNC7]
        clearTypeAheadUpdate_____________ [TAFUNC8]
    Cascading Custom Drop Down Functions --
        processCustomDropDown___________ [CFUNC1]
    XML Functions and Name/Value Pair Functions -- 
        SelectSingleNode__________________  [XFUNC1]
        TranslateXmlToNameValuePairArray___  [XFUNC2]
        NameValueObject__________________  [XFUNC3]
    Video Display Functions -- 
        getVideoData______________________ [VFUNC1]
        getDimensions_____________________  [VFUNC2]
        
Debugging Helper:
    If <at:AjaxMaster isDebugMode="True">, the logo image in the top left corner has a right click menu for debugging.
        AjaxInfo: Information on any of the Tabs that have been rendered on the page.

Global JavaScript Information:
    defaultAjaxUrl: (String)  Url of AjaxData.aspx page.  Defined in <at:AjaxMaster><AjaxDataUrl Value="URL"></at:AjaxMaster>
    
    ajaxpage: Information about the page. (pageObject)
        Properties:
            ajaxReady: (Boolean)  AJAX/JavaScript availability on this page.
            navID: (String - JQuery Selector) HTML id of the TabStripMasterControl (i.e. "#tsMaster")
            tabArray: (Array) Array of all TabIDs
            startingTab: (String) TabID of the starting Tab.
            detailPageType: (String) BusinessEntityName for querystring criteria ("office", "professional") or "search"
            defaultPageSize: (Number)  Default number of records to return from an Ajax Listing Page
            loadAtStart: (Boolean)  Load all Tabs at $(document).ready() after AjaxPage.Init
            loadingImageSelector: (String - JQuery Selector)  HTML id of the Loading Image.
            startingPage: (Number)  Zero-based index of page array of the returned Ajax Listing page.
            ajaxBreadcrumbSelector: (String - JQuery Selector)  JQuery selector of last breadcrumb container to update on activate Tab.
            useAjaxBreadcrumbs: (Boolean) AJAX breadcrumbs availability
            textNvArray: (Array)  Array of Name/Value Pair Objects of ConnectText.ID and ConnectText.Text
            scrollingTabStrip: (Boolean)  Tab Strip Left/Right Scrolling availability
            showingString: (String)  Text for the "Showing 1-10 of 100 results"
            isEditMode: (String) Current FirmConnectPageMode (Current, Template, Site).  Empty string if not in Edit Mode
        Methods:
            getActiveTabName: (Input: None, Output: String)  Returns TabID of currently active Tab
            getConnectText: (Input: ConnectText.ID, Output: String)  Returns ConnectText.Text for a specific ConnectText.ID.  
            initializeConnectText:  (Input: None, Output: Array of Name/Value Pairs)  Run by getConnectText to load the textNvArray
                                        Name/Value pairs returned from AJAX call to AjaxData.aspx?CT=nvtext
            toString: (Input: None, Output: String)  Get the current settings of the properties (For debugging purposes only)
            
    ajaxtabs: Array of tabObject objects indexed by TabID
    
    tabObject: Unique Tab
        Properties:
            tabName: (String)  TabID, Index of Tab within ajaxtabs
            tabID: (String - JQuery Selector) Selector to find the Tab with JQuery
            tabText: (String) Tab name of the Tab.  The actual Text of the Tab within the Tab Strip
            isStartingTab: (Boolean)  Is this Tab the Starting Tab?
            isActiveTab: (Boolean) Is this Tab currently Active?
            isAjaxTab: (Boolean)  Does this Tab have an AJAX Target within?  (atDataWrapper and atControl within the Tab)  
            bdspagecount: (Number)  Page count of the last run AJAX Query (Initialization: 0)
            bdsentitycount: (Number)  Entity count of the last run AJAX Query (Initialization: 0)
            bdscurrentpage: (Number) Current index of the Zero-index page array being viewed (Initialization: 0)
            bdscurrentpagesize: (String) Current page size of the last run AJAX Query or "all" to view all results (Initialization: 10 or ajaxpage.defaultPageSize)
            YouSearchedFor: (String)  String of the last run AJAX Query.  Generated by AjaxPageingControl.SearchCriteriaValueString()
            ajaxUrl: (String)  This Tab's Ajax Listing Control Request Url.  Format: AjaxRoot + "/AjaxData.aspx?CT=" + Tab.CTKey
                                If this page is a detail page, this would also include the base Search Criteria (i.e. an Office Detail Page would add "&office=GUID"
            ajaxSearchUrl: (String) The Tab's last run AJAX search URL.  If a Tab has it's Filter/Search updated, this would be the last run AJAX Query Url
            ajaxSearchUrlStub: (String) The Tab's default search stub.  Additional QueryString values are appended upon this Url.
            SortType: (String)  Current sort of the Tab's Listing Control.  Will be passed back to the AJAX Listing Control and that will handle the sorting.
            isLoaded: (Boolean)  Is the current Tab loaded?  If the Tab does not have AJAX enabled, this will always be True
                                To forcably reload the Tab, set this to false
            OtherActiveControls: (String - JQuery Selector)  Selector for the other controls on the page that need to be shown when this Tab is activated
            OtherInActiveControls:  (String - JQuery Selector)  Selector for the other controls on the page that need to be hidden when this Tab is activated
            ExecuteAfterAjaxLoad: (String - Function)  When the Tab has completed an AJAX Load, run this function
            tabOffStyle: (String - ClassName)  The Tab's inactivated class name
            tabOnStyle: (String - ClassName)  The Tab's activated class name
        Methods:
            SetSearchUrl: (Input: QueryStringStub, Output: None)  Set the ajaxSearchUrl = ajaxSearchUrlStub + QueryStringStub
            toString: (Input: None, Output: String)  Get the current settings of the properties (For debugging purposes only)
    
    
Show/Hide Tabs
        switchtab(TabID): On click, switch to this Tab. If Tab.IsAjax, load the Tab
        clicktab(clickedTabStrip, [isHiddenTab]): Used by the TabStripControl to perform a switch Tab.  
                    isHiddenTab (Boolean) is used when a Tab does not appear as a TabStripControl but need to be activated.
                                This will cause the function to ignore the tabOnStyle update of the Hidden Tab.
                                
Initialize methods:
    AjaxPageInit - called at $(document).ready()
        inputs:
            navID = ID that contains the Tab Navigation (JQuery style, e.g. "#tsMaster")
            tabIds = Array of strings as JQuery Selectors (e.g. "#Professionals")
            startingTab = Title value of the Starting Tab (e.g. "Overview")
            firstPage = On Ajax Call, default first page that is returned
            detailPageType = Type of detail page we are on (e.g. "offices")
            defaultPageSize = On Ajax Call, default page size of the returned list
            loadAtStart = When page is done loading, run an Ajax call to load the starting tab.
            loadingImageClass = JQuery ClassName of the loading image (the Ajax "spinner", e.g. ".loadingImage")
            breadcrumbJQuerySelector = JQuery Selector for the Breadcrumb that is updated on tab change. (e.g. "li[ajaxbreadcrumb='true']")
            clear_before_ajax_get = Clear the Ajax Target (if there is one) before performing the $.get.  (Set in AjaxMaster, default = true)
*/
var loadingLock = false;   // Set to true while an AJAX call is being queried.  Locks the TabStrip until query is completed (success or fail)
//var enableHistory = false; // Enable Back/Forward button functionality on ajax pages.
var ajaxtabs = new Array();  // Loaded with tabObjects
var ajaxpage = new pageObject(); // Loaded with the current pageObject

function pageObject(tab_nav_id, tab_array, starting_tab, starting_page, detail_page_type, default_page_size, load_at_start, loading_image_selector, ajax_breadcrumb_selector, clear_before_ajax_get)
{ // PFUNC1
    this.ajaxReady = true;
    
    // Page Info
    if (tab_nav_id != null) {
        this.navID = tab_nav_id;
    } else {
        this.navID = "#tsMaster";
    }     
    if (tab_array != null) { 
        this.tabArray = tab_array;
    } else {
        this.tabArray = new Array();
        this.ajaxReady = false;
    }
    if (starting_tab != null) {
        this.startingTab = starting_tab;
    } else {
        if (this.ajaxReady) {
            this.startingTab = this.tabArray[0];
        } else {  
            this.startingTab = "";
            this.ajaxReady = false;
        }
    }
    if (detail_page_type != null) {    
        this.detailPageType = detail_page_type;
    } else {
        this.detailPageType = "";
        this.ajaxReady = false;
    }    
    
    if (default_page_size != null) { 
        this.defaultPageSize = default_page_size;
    } else {
        this.defaultPageSize = 15;
    }
    this.loadAtStart = false;
    if (load_at_start != null) {
        this.loadAtStart = load_at_start; 
    } else {
        this.loadAtStart = false;
    }
    
    if (loading_image_selector != null) {
        this.loadingImageSelector = loading_image_selector;
    } else {
        this.loadingImageSelector = ".loadingImage";
    }     
    if (starting_page != null) {
        this.startingPage = starting_page; 
    } else {
        this.startingPage = 0;
    }
    if (ajax_breadcrumb_selector != null) {
        this.ajaxBreadcrumbSelector = ajax_breadcrumb_selector;
    } else {
        this.ajaxBreadcrumbSelector = "li[ajaxbreadcrumb='true']";
    }
    if (this.ajaxReady) {
        if ($(this.ajaxBreadcrumbSelector).length > 0) {
            this.useAjaxBreadcrumbs = true; 
        } else {
            this.useAjaxBreadcrumbs = false;
        }  
    } else {
         this.useAjaxBreadcrumbs = false;
     }

    this.textNvArray = new Array();
    this.scrollingTabStrip = false;
    if ($("img[scrolltabstrip='left']").length > 0) {
        this.scrollingTabStrip = true;
        $("img[scrolltabstrip='left']").click(function() { return scrollTabStrip(this); });
        $("img[scrolltabstrip='right']").click(function() { return scrollTabStrip(this); });
    }
    this.showingString = "(Showing %X% of %Y% results)";
     
    this.isEditMode = ""; 
    if (CultureRoot.indexOf("/97") == 0) { this.isEditMode = "Content"; }
    if (CultureRoot.indexOf("/98") == 0) { this.isEditMode = "Template"; }
    if (CultureRoot.indexOf("/100") == 0) { this.isEditMode = "Site"; }

    // Value set from Ajax Master - default = true
    if (typeof (clear_before_ajax_get) != "undefined") {
        this.ClearBeforeAjax = clear_before_ajax_get;
    } else {
        this.ClearBeforeAjax = true;
    }
    
    this.getActiveTabName = getActiveTabName;
    this.getConnectText = getConnectText;
    this.initializeConnectText = initializeConnectText;
    this.toString = pageToString;
}

// Method of pageObject
function initializeConnectText() {
    // PFUNC4
    this.textNvArray = new Array();
    tempArray = new Array();
    var connecttextXml = AjaxRoot + "?CT=nvtext";
    $.ajax({
        async: false,
        url: connecttextXml,
        dataType: ($.browser.msie) ? "text" : "xml",
        success: function(data) {
            var xml;
            if (typeof data == "string") {
                xml = new ActiveXObject("Microsoft.XMLDOM");
                xml.async = false;
                xml.loadXML(data);
            } else {
                xml = data;
            }
            tempArray = TranslateXmlToNameValuePairArray(xml, "row", "value");
        }
    });
    this.textNvArray = tempArray;
}
// Method of pageObject
function getConnectText(fieldname) {
    // PFUNC3
    if (this.textNvArray.length > 0) {
        for (var i = 0; i < this.textNvArray.length; i++) {
            if (this.textNvArray[i].Value == fieldname) {
                return this.textNvArray[i].Name;
            }
        }
    }
    return "";
}
// Method of pageObject
function getActiveTabName()
{ // PFUNC2
    var currentlyActiveTab = "";
    for (t in ajaxtabs) {
        if (ajaxtabs[t].isActiveTab) { currentlyActiveTab = ajaxtabs[t].tabName; break;}
    }
    return currentlyActiveTab; 
}

function tabObject(tab_name, tab_id, isStartUpTab, useAjax, defaultAjaxUrl, searchStub_Url)
{ // TFUNC1
    // General Tab info
    this.tabName = tab_name;
    this.tabID = tab_id;
    this.tabText = tab_name; 
    
    // Starting or Active? 
    if (isStartUpTab != null) { 
        this.isStartingTab = isStartUpTab;
        if (isStartUpTab) { 
            this.isActiveTab = true; 
        } else {
            this.isActiveTab = false;
        }
    } else {
        this.isStartingTab =  false;
        this.isActiveTab = false;
    }  
    
    // Has Ajax? 
    this.isAjaxTab = useAjax;
    
    // If Ajax Tab, these are the counters for the data 
    this.bdspagecount = 0;
    this.bdsentitycount = 0;
    this.bdscurrentpage = 0;
    this.bdscurrentpagesize = 15;

    // If Ajax Tabs, you might need what you searched for.
    // Here is the search criteria string
    this.YouSearchedFor = "";
    
    // url for the default ajax call.  If empty, there is a blank area displayed
    if (defaultAjaxUrl != null) { 
        this.ajaxUrl = defaultAjaxUrl;
    } else {
        this.ajaxUrl = "";
    }
    
    // url for the current search performed on the tab, this will override the ajaxUrl above
    this.ajaxSearchUrl = "";
   
    this.SortType = "";
    // current sort type, blank: use default sort
    
    // The initial piece of the ajaxSearchUrl
    if (searchStub_Url != null) { 
        this.ajaxSearchUrlStub = searchStub_Url;
    } else {
        this.ajaxSearchUrlStub = "";
    } 
     
    // Is the tab loaded.  Set this to false and then "click" the tab to rerun the ajax. 
    this.isLoaded = false; 
   
    // JQuery Selector for other controls that are shown (run with $(OtherActiveControls).show()) after this tab is activated
    this.OtherActiveControls = "";   
    // JQuery Selector for other controls that are hidden ((run with $(OtherInActiveControls).hide()) after this tab is activated
    this.OtherInActiveControls = "";   
   
    // One Function to run on completion of an AjaxLoad 
    this.ExecuteAfterAjaxLoad = "";  
    // Example: Used to bind the rollover for Attorney Hovers
    //      ajaxtabs["Professionals"].ExecuteAfterAjaxLoad = "BindHover('#Professionals')";

    this.tabOffStyle = $(ajaxpage.navID).find(" [tabstate='" + this.tabName + "']").attr("offclass");
    this.tabOnStyle = $(ajaxpage.navID).find(" [tabstate='" + this.tabName + "']").attr("onclass");
    
    // methods
    // Get the Ajax Tab Information loaded into a string, used for debugging   
    this.toString=toString;
    // Set the search url to the following additional query string 
    this.SetSearchUrl=SetSearchUrl; 
}
// Method of tabObject
function SetSearchUrl(queryString)
{ // TFUNC3
    var urlString = this.ajaxSearchUrlStub + queryString;
    if (this.ajaxSearchUrl != urlString)
    {
        this.ajaxSearchUrl = urlString;
        this.bdscurrentpagesize = 15;
        this.bdscurrentpage = 0;
        this.isLoaded = false;
    }
}
// Method of tabObject
function toString()
{ // TFUNC2
    var retString = "";
    retString += "tabName = '";
    if (this.tabName != null) { retString += this.tabName; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "tabID = '";
    if (this.tabID != null) { retString += this.tabID; } else { retString += "null"; }
    retString += "'<br/> "; 
    retString += "tabText = '";
    if (this.tabText != null) { retString += this.tabText; } else { retString += "null"; }
    retString += "'<br/> ";  
    retString += "isStartingTab = '";
    if (this.isStartingTab) { retString += "true";  } else { retString += "false"; }
    retString += "'<br/> ";
    retString += "isActiveTab = '";
    if (this.isActiveTab) { retString += "true";  } else { retString += "false"; }
    retString += "'<br/> "; 
    retString += "isAjaxTab = '";
    if (this.isAjaxTab) { retString += "true"; } else { retString += "false"; }
    retString += "'<br/> ";
    retString += "TabOnStyle = '";
    if (this.tabOnStyle != null) { retString += this.tabOnStyle; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "TabOffStyle = '";
    if (this.tabOffStyle != null) { retString += this.tabOffStyle; } else { retString += "null"; }
    retString += "'<br/> "; 
    retString += "bdspagecount = '" + this.bdspagecount + "'<br/> ";
    retString += "bdsentitycount = '" + this.bdsentitycount + "'<br/> ";
    retString += "bdscurrentpage = '" + this.bdscurrentpage + "'<br/> ";
    retString += "bdscurrentpagesize = '" + this.bdscurrentpagesize + "'<br/> ";
    retString += "YouSearchedFor  = '";
    if (this.YouSearchedFor != null) { retString += this.YouSearchedFor; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "OtherActiveControls = '";
    if (this.OtherActiveControls != null) { retString += this.OtherActiveControls; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "OtherInActiveControls = '";
    if (this.OtherInActiveControls != null) { retString += this.OtherInActiveControls; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "ajaxUrl = '";
    if (this.ajaxUrl != null) { retString += this.ajaxUrl; } else { retString += "null"; }
    retString += "'<br/> ";  
    retString += "ajaxSearchUrl = '";
    if (this.ajaxSearchUrl != null) { retString += this.ajaxSearchUrl; } else { retString += "null"; }
    retString += "'<br/> ";  
    retString += "ajaxSearchUrlStub = '";
    if (this.ajaxSearchUrlStub != null) { retString += this.ajaxSearchUrlStub; } else { retString += "null"; }
    retString += "'<br/> ";  
    retString += "isLoaded = '";
    if (this.isLoaded) { retString += "true";  } else { retString += "false"; }
    retString += "'<br/> ";
   return retString;
}
// Method of pageObject
function pageToString() {
    // PFUNC5
    var retString = "";
    retString += "ajaxReady = '";
    if (this.ajaxReady) { retString += "true"; } else { retString += "false"; }
    retString += "'<br/> ";
    retString += "navID = '";
    if (this.navID != null) { retString += this.navID; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "tabArray = ";
    for (var ta = 0; ta < this.tabArray.length; ta++) {
        retString += "'" + this.tabArray[ta] + "'";
        if ((ta + 1) < this.tabArray.length) {
            retString += ", ";
        }
    }
    retString += "'<br/> ";
    retString += "startingTab = '";
    if (this.startingTab != null) { retString += this.startingTab; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "detailPageType = '";
    if (this.detailPageType != null) { retString += this.detailPageType; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "defaultPageSize = '";
    if (this.defaultPageSize != null) { retString += this.defaultPageSize; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "loadAtStart = '";
    if (this.loadAtStart) { retString += "true"; } else { retString += "false"; }
    retString += "'<br/> ";
    retString += "loadingImageSelector = '";
    if (this.loadingImageSelector != null) { retString += this.loadingImageSelector; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "startingPage = '";
    if (this.startingPage != null) { retString += this.startingPage; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "ajaxBreadcrumbSelector = '";
    if (this.ajaxBreadcrumbSelector != null) { retString += this.ajaxBreadcrumbSelector; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "useAjaxBreadcrumbs = '";
    if (this.useAjaxBreadcrumbs) { retString += "true"; } else { retString += "false"; }
    retString += "ClearBeforeAjax = '";
    if (this.ClearBeforeAjax) { retString += "true"; } else { retString += "false"; }
    retString += "'<br/> ";
    retString += "showingString = '";
    if (this.showingString != null) { retString += this.showingString; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "textNvArray = ";
    if (this.textNvArray.length == 0) { retString += "Empty";}
    else {
        retString += "<br/>";
        for (var i = 0; i < this.textNvArray.length; i++) {
            retString += this.textNvArray[i].Name + " = " + this.textNvArray[i].Value + "<br/>";
        }
    }
    retString += "<br/>";
    retString += "isEditMode = '";
    if (this.isEditMode != null) { retString += this.isEditMode; } else { retString += "null"; }
    retString += "'<br/> ";
    return retString;
}
// Initialize the ajaxpage and ajaxtab objects and controls.
function AjaxPageInit(tab_nav_id, tab_array, starting_tab, starting_page, detail_page_type, default_page_size, load_at_start, loading_image_selector, ajax_breadcrumb_selector, clear_before_ajax_get) {
    // PFUNC6
    $("body").append("<img src=\"" + LoadingImageUrl + "\" class=\"loadingImage\" />");
    ajaxpage = new pageObject(tab_nav_id, tab_array, starting_tab, starting_page, detail_page_type, default_page_size, load_at_start, loading_image_selector, ajax_breadcrumb_selector, clear_before_ajax_get);
    if (ajaxpage.ajaxReady) {
        if (tab_array.length > 0 && starting_tab != "MainNav") {
            ajaxpage.initializeConnectText();
        }        
        buildTabs();
        $(ajaxpage.navID).find("[tabstate='" + ajaxpage.startingTab + "']").addClass(ajaxtabs[ajaxpage.startingTab.replace("#", "")].tabOnStyle);
        $("a[tabref]").bind("click", function() {
            return clicktab($(this));
        });
    }
    try {
        if (debugMode) {
            var ajaxDebugMenu = "<div id=\"ajaxmenuDebugMenu\" ";
            ajaxDebugMenu += "style=\"position:absolute;text-align:left;font:10px/12px Arial, sans-serif; background-color:#808080;color:#fff;z-index:3;display:none;\">";
            ajaxDebugMenu += "<a href=\"#\" onclick=\"return ajaxDebugObjects();\">Ajax Info</a><div style=\"display:inline;\" id=\"ajaxinfodata\"></div>";
            ajaxDebugMenu += "<div style=\"display:inline;\" id=\"generalDebugMessages\"></div>";
            ajaxDebugMenu += "</div>";
            $("body").append(ajaxDebugMenu);
            $(".header").find("img:first").rightClick(function(e) {
                var topVal = $(this).offset().top + $(this).height();
                var leftVal = $(this).offset().left + $(this).width();
                $("#ajaxmenuDebugMenu").css("top", topVal).css("left", leftVal);
                debugMenuToggle();
            });
        }
    } catch (Err) { }
    if (ajaxpage.scrollingTabStrip) {
        //var tabStrim$("img[scrolltabstrip='left']").parents("div[scrolldivjq]").attr("scrolldivjq");
        var tabStripWidth = $(ajaxpage.navID).width();
        var overflowHiderWidth = tabStripWidth;
        var overflowHider = null;
        var checkParent = $(ajaxpage.navID).parent();
        var checkMax = 5;
        var currentCheck = 1;
        var found = false;
        while (!found && (currentCheck <= checkMax)){
            //($(checkParent).css("overflow-x") == null || $(checkParent).css("overflow-x") == "") && (currentCheck <= checkMax))
            if ($(checkParent).css("overflow-x") != null && $(checkParent).css("overflow-x") == "hidden") {
                found = true;
                break;
            }
            if ($(checkParent).css("overflow") != null && $(checkParent).css("overflow") == "hidden") {
                found = true;
                break;
            }
            checkParent = $(checkParent).parent();
            currentCheck++;
        }
        if (found) {
            overflowHider = checkParent;
            overflowHiderWidth = $(overflowHider).width();
        }
        if (overflowHiderWidth < tabStripWidth) {
            $("img[scrolltabstrip='left']").attr("src", $("img[scrolltabstrip='left']").attr("onimg"));
        } else {
            $("img[scrolltabstrip]").hide();
        }
    }
}
// Debug Menu Functionality
function debugMenuToggle() {
    // DFUNC1
    $("#ajaxmenuDebugMenu a").css("color", "#DDD");
    $("#ajaxmenuDebugMenu").toggle();
    $("#ajaxinfodata").html(""); 
    return false;
}
// Debug Menu Functionality - Display Debugging toStrings for ajaxpage and all ajaxtab objects
function ajaxDebugObjects() {
    // DFUNC2
    if ($("#ajaxinfodata").html() == "") {
        var str = "";
        str = "<table style='border:1px solid white; width:300px;'>";
        str += "<tr><td colspan='2' valign='top' style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;padding-right:2px;white-space:nowrap;'>";
        str += ajaxpage.toString();
        str += "</td></tr>";
        for (t in ajaxtabs) {
            str += "<tr><td valign='top' style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;padding-right:2px;width:20%;'>" + t + "</td>";
            str += "<td style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;white-space:nowrap;width:80%;'>";
            str += ajaxtabs[t].toString();
            str += "</td></tr>";
        }
        str += "</table>";
        $("#ajaxinfodata").html(str);
    } else {
        $("#ajaxinfodata").html("");
    }
    return false;
}
// Writes a message to the AjaxInfo menu, viewable from the top left logo on the page.
function reportDebugMessage(message) {
    // DFUNC3
    if (debugMode) {
        if (message.indexOf("<") < 0) {
            message = "<div>" + message + "</div>";
        }
        $("#generalDebugMessages").append(message);
    }
}
// Initialize tabs, display the first one (or the starting tab) from the tabIds Array and hide the rest.
function buildTabs()
{  
    // TFUNC4
    for(var a = 0; a < ajaxpage.tabArray.length; a++)
    {
        var tabtitle =  ajaxpage.tabArray[a].replace("#", "");
        var tabid = "#" + $("[tab='" + ajaxpage.tabArray[a] + "']").attr("id");
        var startup = (ajaxpage.tabArray[a] == (ajaxpage.startingTab));
        var useajax = ($("[tabdata='" + ajaxpage.tabArray[a] + "']").length > 0);
        var ajaxpreloaded = false;
        var ajaxurl = "";
        var searchstub = "";
        if (useajax) {
            if (detailPageType != "search" ) 
            {
                ajaxurl = AjaxRoot + "?CT=" + $("[tabdata='" + ajaxpage.tabArray[a] + "']").attr("attype").toLowerCase() + "&" + ajaxpage.detailPageType + "=" + rootGuid;
                searchstub = AjaxRoot + "?CT=" + $("[tabdata='" + ajaxpage.tabArray[a] + "']").attr("attype").toLowerCase() + "&" + ajaxpage.detailPageType + "=" + rootGuid + "&";
            }
            else {
                if ($("[tabdata='" + ajaxpage.tabArray[a] + "']").attr("attype") != null) {
                    ajaxurl = AjaxRoot + "?CT=" + $("[tabdata='" + ajaxpage.tabArray[a] + "']").attr("attype").toLowerCase() + "&";
                    searchstub = AjaxRoot + "?CT=" + $("[tabdata='" + ajaxpage.tabArray[a] + "']").attr("attype").toLowerCase() + "&";
                } else {
                    ajaxurl = AjaxRoot + "?CT=" + tabtitle.toLowerCase() + "&";
                    searchstub = AjaxRoot + "?CT=" + tabtitle.toLowerCase() + "&";
                }
            }
            if (($("[tabdata='" + ajaxpage.tabArray[a] + "']").attr("isloaded") == "true") || ($("[tabdata='" + ajaxpage.tabArray[a] + "']").children("[ajax='true']").length > 0))
            {
                ajaxpreloaded = true;
                if ($("[tabdata='" + ajaxpage.tabArray[a] + "']").attr("isloaded") != "true") { $("[tabdata='" + ajaxpage.tabArray[a] + "']").attr("isloaded", "true"); }
            }
            $(tabid).children("span.ajaxpagecontrol").find("a[page='previous']").html("<span class='arrow_left'>&#171; </span>" + ajaxpage.getConnectText("ctPreviousLinkText") + " ");
            $(tabid).children("span.ajaxpagecontrol").find("a[page='next']").html(" " + ajaxpage.getConnectText("ctNextLinkText") + "<span class='arrow_right'> &#187;</span>");
            $(tabid).children("span.ajaxpagecontrol").find("a[page='all']").html(" " + ajaxpage.getConnectText("ctViewAllResultsLinkText") + " ");
            // page="previous"
            // page="next"
            // page="all"
        }
        ajaxtabs[tabtitle] = new tabObject(tabtitle, tabid, startup, useajax, ajaxurl, searchstub);

        if (ajaxpreloaded) { ajaxtabs[tabtitle].isLoaded = true; }
        
        if ($(tabid).length > 0) {
            var tab_text = $(ajaxpage.navID).find("a[tabref='" + tabtitle + "']").text();
            if (tab_text != null && tab_text != "") {
                ajaxtabs[tabtitle].tabText = tab_text;
            }
        }
    }
    if (ajaxpage.isEditMode != "") { 
        $(ajaxpage.loadingImageSelector).css("display", "none");  
    }  else {
        var onTab = "";
        for (t in ajaxtabs) {
            if (t != ajaxpage.startingTab) { $(ajaxtabs[t].tabID).hide(); }
            else { $(ajaxtabs[t].tabID).show();}
        }
        if (ajaxpage.loadAtStart) {
            var qString = document.location.search.replace("?", "");
            ajaxtabs[ajaxpage.startingTab].SetSearchUrl(qString);
            if(typeof ($.fragmentChange) != "undefined" && typeof (enableHistory) != "undefined" && enableHistory){
                parse_fragment();
            }
            else{
                ajaxLoadData(ajaxpage.startingTab);
            }
            //get qstring
            if (ajaxpage.useAjaxBreadcrumbs){
                $(ajaxpage.ajaxBreadcrumbSelector).html(ajaxtabs[ajaxpage.startingTab.replace("#","")].tabText);
            }  
        } else {
            $(ajaxpage.loadingImageSelector).hide();
        }
    }
}
// Left/Right Scrolling Tab functionality.  Only used if there is an Image with attribute scrolltabstrip="left"
function scrollTabStrip(clickitem) {
    // TFUNC5
    var animateTabStripScroll = true;
    var currentScrollIndex = $(ajaxpage.navID).data("currentscrollindex");
    if (typeof (currentScrollIndex) == "undefined" || currentScrollIndex == null) {
        currentScrollIndex = 0;
    }
    if ($(clickitem).attr("scrolltabstrip").indexOf("left") >= 0) {
        currentScrollIndex++;
    }
    else {
        currentScrollIndex--;
    }
    var scrolldivjq = $(clickitem).parents("div[scrolldivjq]").attr("scrolldivjq");
    var scrollingElement = $(ajaxpage.navID).parents(scrolldivjq);
    var tabStripWidth = $(ajaxpage.navID).width();
    var scrollingElementWidth = $(scrollingElement).width();
    var scrollingArray = new Array();
    if ($(ajaxpage.navID).is("table")) {
        $(ajaxpage.navID).find("td").each(function(i, ele) {
            scrollingArray[i] = $(ele).outerWidth();
        });
    }
    if (currentScrollIndex > scrollingArray.length) {
        currentScrollIndex = scrollingArray.length - 1;
    }
    var scrollAmount = 0;
    for (var a = 0; (a < scrollingArray.length && a < currentScrollIndex); a++) {
        scrollAmount += scrollingArray[a];
    }
    if (currentScrollIndex <= 0) {
        scrollAmount = 0;
        currentScrollIndex = 0;
    }
    var startScroll = $(scrollingElement).scrollLeft();
    if (animateTabStripScroll) {
        $(scrollingElement).animate({ scrollLeft: scrollAmount }, 500, null, function() {
            var endScroll = $(scrollingElement).scrollLeft();
            if (currentScrollIndex > scrollingArray.length) {
                currentScrollIndex = scrollingArray.length - 1;
            }
            
            var realend = scrollingElementWidth+endScroll;
            
            var scrollDiff = Math.abs(endScroll - startScroll);
            
            if (realend >= tabStripWidth) {
                var imgSrc = $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='left']").attr("offimg");
                $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='left']").attr("src", imgSrc);
                
            } else {
                var imgSrc = $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='left']").attr("onimg");
                $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='left']").attr("src", imgSrc);
                $(ajaxpage.navID).data("currentscrollindex", currentScrollIndex);
            }
            if (currentScrollIndex == 0) {
                var imgSrc = $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='right']").attr("offimg");
                $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='right']").attr("src", imgSrc);
            } else {
                var imgSrc = $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='right']").attr("onimg");
                $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='right']").attr("src", imgSrc);
            }
        });
    } else {
        $(scrollingElement).scrollLeft(scrollAmount);
        var endScroll = $(scrollingElement).scrollLeft();
        if (currentScrollIndex > scrollingArray.length) {
            currentScrollIndex = scrollingArray.length - 1;
        }
        var scrollDiff = Math.abs(endScroll - startScroll);
        if (scrollDiff > 30) {
            var imgSrc = $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='left']").attr("onimg");
            $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='left']").attr("src", imgSrc);
            $(ajaxpage.navID).data("currentscrollindex", currentScrollIndex);
        } else {
            if (scrollDiff != 0) {
                var imgSrc = $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='left']").attr("offimg");
                $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='left']").attr("src", imgSrc);
            }
        }
        if (currentScrollIndex == 0) {
            var imgSrc = $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='right']").attr("offimg");
            $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='right']").attr("src", imgSrc);
        } else {
            var imgSrc = $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='right']").attr("onimg");
            $(clickitem).parents("div[scrolldivjq]").find("img[scrolltabstrip='right']").attr("src", imgSrc);
        }
    }
    return false;
}
// TabStrip Scrolling method to determine if the clicked Tab Strip is 100% visible.
function isTabStripVisible(tabName) {
    // TFUNC6
    var scrollingArray = new Array();
    var clickedIndex = -1;
    var scrolldivjq = $("img[scrolltabstrip='left']").parents("div[scrolldivjq]").attr("scrolldivjq");
    var scrollingElement = $(ajaxpage.navID).parents(scrolldivjq);
    var tabStripWidth = $(ajaxpage.navID).width();
    var scrollingElementWidth = $(scrollingElement).innerWidth();
    var currentScrollPosition = $(scrollingElement).scrollLeft();
    var currentScrollIndex = $(ajaxpage.navID).data("currentscrollindex");
    var currentOffSidePositions = 0;
    var selectedTabWidth = 0;
    if (typeof (currentScrollIndex) == "undefined" || currentScrollIndex == null) {
        currentScrollIndex = 0;
    }
    var currentViewedPositions = 0;
    if ($(ajaxpage.navID).is("table")) {
        $(ajaxpage.navID).find("td").each(function(i, ele) {
            scrollingArray[i] = $(ele).outerWidth();
            if (i >= currentScrollIndex && currentViewedPositions <= scrollingElementWidth) {
                currentViewedPositions += $(ele).outerWidth();
            }
            if ($(ele).attr("tabstate") == tabName) {
                selectedTabWidth = $(ele).outerWidth();
                return false;
            }
            currentOffSidePositions += $(ele).outerWidth();
        });
    }
    if (currentViewedPositions > scrollingElementWidth) {
        var scrollAmt = currentScrollPosition + (currentViewedPositions - scrollingElementWidth);
        $(scrollingElement).scrollLeft(scrollAmt);
    }
    var selectedTabPosition = (currentViewedPositions - selectedTabWidth);
    if (selectedTabPosition == 0 && currentScrollPosition > currentOffSidePositions) {
        var scrollAmt = currentScrollPosition - (currentScrollPosition - currentOffSidePositions);
        $(scrollingElement).scrollLeft(scrollAmt);
    }
}
// Switch To Tab
function switchtab(tabname)
{
    // TFUNC7
    clicktab($("a[tabref='" + tabname + "']"));
}
function clicktab(clickitem, isHiddenTab) {
    // TFUNC8
    // activate the clicked tab, hide the currently active one, run the Ajax Load.
    // is hidden tab is a tab without a top sub nav tab link.  Opened from another location
    try {
        var tabname = "";
        if (isHiddenTab == null) { isHiddenTab = false; }
        if (isHiddenTab) { tabname = clickitem; }
        else { tabname = $(clickitem).attr("tabref"); }
        if (!loadingLock && ajaxpage.isEditMode == "") {
            var oldtabname = ajaxpage.getActiveTabName();
            // Set the previously active Tab to inactive (tabOffStyle)
            // Set the clicked Tab to active (tabOnStyle)
            // Hide the previously active Tab and all associated Controls
            // Show the clicked Tab 
            // Run an Ajax Load on the clicked Tab
            // Show clicked Tab's associated Controls
            if (oldtabname != "") {
                if (oldtabname != tabname) {
                    ajaxtabs[oldtabname].isActiveTab = false;
                    $(ajaxpage.navID).find("[tabstate='" + oldtabname + "']").removeClass(ajaxtabs[oldtabname].tabOnStyle);
                    if (ajaxtabs[oldtabname].tabOffStyle != "") {
                        $(ajaxpage.navID).find("[tabstate='" + oldtabname + "']").addClass(ajaxtabs[oldtabname].tabOffStyle);
                    }
                    if (!isHiddenTab) {
                        if (ajaxtabs[tabname].tabOffStyle != "") {
                            $(ajaxpage.navID).find("[tabstate='" + tabname + "']").removeClass(ajaxtabs[tabname].tabOffStyle);
                        }
                        $(ajaxpage.navID).find("[tabstate='" + tabname + "']").addClass(ajaxtabs[tabname].tabOnStyle);
                    }
                    hideOtherTabControls(oldtabname);
                    $(ajaxtabs[oldtabname].tabID).hide();
                }
            }
            $(ajaxtabs[tabname].tabID).show();
            ajaxtabs[tabname].isActiveTab = true;
            if (ajaxpage.scrollingTabStrip) {
                isTabStripVisible(tabname);
            }
            // Run Ajax Load
            ajaxLoadData(tabname);
            if (ajaxtabs[tabname].OtherActiveControls != "") {
                $(ajaxtabs[tabname].OtherActiveControls).show();
            }
            if (ajaxtabs[tabname].OtherInActiveControls != "") {
                $(ajaxtabs[tabname].OtherInActiveControls).hide();
            }
            if (ajaxpage.useAjaxBreadcrumbs) {
                $(ajaxpage.ajaxBreadcrumbSelector).html(ajaxtabs[tabname].tabText);
            }
        } else {
            // if in an edit mode, display the tab and skip the ajax load 
            if (ajaxpage.isEditMode != "") {
                var tabname = $(clickitem).attr("tabref");
                var oldtabname = ajaxpage.getActiveTabName();
                $(ajaxpage.navID).find("[tabstate='" + oldtabname + "']").removeClass(ajaxtabs[oldtabname].tabOnStyle);
                if (ajaxtabs[oldtabname].tabOffStyle != "") {
                    $(ajaxpage.navID).find("[tabstate='" + oldtabname + "']").addClass(ajaxtabs[oldtabname].tabOffStyle);
                }
                $(ajaxpage.navID).find("[tabstate='" + tabname + "']").addClass(ajaxtabs[tabname].tabOnStyle);
                if (ajaxtabs[tabname].tabOffStyle != "") {
                    $(ajaxpage.navID).find("[tabstate='" + tabname + "']").removeClass(ajaxtabs[tabname].tabOffStyle);
                }
                $(ajaxtabs[oldtabname].tabID).hide();
                $(ajaxtabs[tabname].tabID).show();
                ajaxtabs[oldtabname].isActiveTab = false;
                ajaxtabs[tabname].isActiveTab = true;
                if (ajaxtabs[tabname].OtherActiveControls != "") {
                    $(ajaxtabs[tabname].OtherActiveControls).show();
                }
                if (ajaxtabs[tabname].OtherInActiveControls != "") {
                    $(ajaxtabs[tabname].OtherInActiveControls).hide();
                }
                if (ajaxpage.useAjaxBreadcrumbs) {
                    $(ajaxpage.ajaxBreadcrumbSelector).html(ajaxtabs[tabname].tabText);
                }
            }
        }
    } catch (Error) {
    alert(Error.description);
    }
    return false;
}
// update the Sorting of a Tab
// sortValue: read and sorted by ListingControl
// tabname: Tab with the control that needs to be sorted.
function changeSort(sortvalue, tabname,clickedColumn)
{
    // TFUNC9
    var currentSort = ajaxtabs[tabname].SortType;
    if (sortvalue != null && sortvalue != "") {
        if (currentSort == sortvalue) {
            sortvalue = "reverse" + sortvalue;
        }
        if (currentSort != sortvalue) { 
            ajaxtabs[tabname].SortType = sortvalue; //SetSearchUrl("&sort=" + 
            ajaxtabs[tabname].bdscurrentpagesize = 15;
            ajaxtabs[tabname].bdscurrentpage = 0;
            ajaxtabs[tabname].isLoaded = false;
            $("table[tabdata='" + tabname + "'] tbody tr").find("th img.active").removeClass("active");
            $(clickedColumn).find("img.arrow_sort").addClass("active");
        }
    } else {
        ajaxtabs[tabname].SortType = "";
        if (currentSort != "") { 
            ajaxtabs[tabname].bdscurrentpagesize = 15;
            ajaxtabs[tabname].bdscurrentpage = 0;
            ajaxtabs[tabname].isLoaded = false; 
        }
    }
    // Run an Ajax Load to update the sort.
    ajaxLoadData(tabname);
    return false;
}
// Within $(document).ready() after AjaxPageInit, any atControl marked
// AjaxLoadImmediate = true will run this function.
function ImmediateAjaxControlLoad(targetJQuerySelector, sourceUrl, postloadFunction) {
    // PFUNC7
    var loadImmediate = true;
    var currentEditMode = "";
    if (CultureRoot.indexOf("/97") == 0) { currentEditMode = "/97"; }
    if (CultureRoot.indexOf("/98") == 0) { currentEditMode = "/98"; }
    if (CultureRoot.indexOf("/100") == 0) { currentEditMode = "/100"; }
    if (typeof (DoNotLoadImmediate) != "undefined" && DoNotLoadImmediate) {
        loadImmediate = false;
    }
    if (loadImmediate) {
        if (currentEditMode != "") {
            sourceUrl = sourceUrl.replace(currentEditMode, "/64");
        }
        $(targetJQuerySelector).load(sourceUrl, null, function() {
            if (postloadFunction) {
                try {
                    postloadFunction($(targetJQuerySelector));
                } catch (err) {
                    alert(err.Description);
                }
            }
        });
    }
}
function ajaxLoadData(tabname) {
    // TFUNC10
    // Function to perform the Ajax Load
    // Check if this Tab uses AJAX, if so, check if it is previously loaded, if not, perform AJAX call
    if (ajaxtabs[tabname].isAjaxTab) {
        if (!ajaxtabs[tabname].isLoaded) {
            var unloadCurrentData = false;
            var tabtop =  $(ajaxtabs[tabname].tabID).position().top;  // Scroll to the top of the tab if we cannot already see it.
            var tableft = $(ajaxtabs[tabname].tabID).offset().left;
            if ($(document).scrollTop() > tabtop) {
                $(document).scrollTop(tabtop);
            }
            var currentPage = ajaxtabs[tabname].bdscurrentpage; // Get the current page number (default to page 0)
            var currentPageSize = ajaxtabs[tabname].bdscurrentpagesize;  // Get the current page size (default to page 10)
            $(ajaxpage.loadingImageSelector).css("left", tableft).css("top", tabtop);
            $(ajaxpage.loadingImageSelector).show(); // display the "loading image" for this tab.
            // If this Tab currently has data, clear the Tab AFTER new data has come back.
            if ($("[tabdata='" + tabname + "']").find("[ajax]").length > 0) {
                unloadCurrentData = true;
            }
            if (unloadCurrentData && ajaxpage.ClearBeforeAjax) {
                $(ajaxtabs[tabname].tabID + " .ajaxpagecontrol").hide();
                $("[tabdata='" + tabname + "']").find("[ajax]").remove();
                $("[tabdata='" + tabname + "']").hide();
            }
            loadingLock = true; // lock the Tab navigation until AJAX call completed
            
            // AJAX call uses Tab's Ajax Url, if ajaxSearchUrl is set, use that instead.
            var ajaxUrl = ajaxtabs[tabname].ajaxUrl;
            if (ajaxtabs[tabname].ajaxSearchUrl != "") {
                // set variable searchUrl to override simple data return with a search.
                ajaxUrl = ajaxtabs[tabname].ajaxSearchUrl;
            }
            if (currentPageSize != "all") { ajaxUrl += "&pagesize=" + currentPageSize + "&page=" + currentPage; }
            else { ajaxUrl += "&pagesize=all"; }
            
            // Include sort to QueryString, if necessary
            if (ajaxtabs[tabname].SortType != "")
            {
                ajaxUrl += "&sort=" + ajaxtabs[tabname].SortType;
            }
            reportDebugMessage(tabname + ": url: " + ajaxUrl + " -- " + Date());
            $.get(ajaxUrl, function(data) {
                var $returnData = $("<div/>").append(data.replace(/<script(.|\s)*?\/script>/g, "")); // load the data into a fake div tag and remove any javascript from the return
                if ($returnData.find("[ajax='true']").length == 0) {
                    // No data was returned, clear the tab and display the "No Results Message"
                    $("[tabdata='" + tabname + "']").find("[ajax]").remove();
                    unloadCurrentData = false;
                    clearPageIndex(tabname);
                    $("[tabdata='" + tabname + "']").hide();
                    $(ajaxtabs[tabname].tabID + " .noresultsmessage").show();
                    ajaxtabs[tabname].isLoaded = false;
                } else {
                    // Data was returned, load the returned HTML into the indicated Tab
                    $("[tabdata='" + tabname + "']").show();
                    $(ajaxtabs[tabname].tabID + " .noresultsmessage").hide();
                    $returnData.find("[ajax='true']").each(function(index, datarow) {
                        if (unloadCurrentData) {
                            if (!ajaxpage.ClearBeforeAjax) {
                                $("[tabdata='" + tabname + "']").find("[ajax]").remove();
                            }
                            unloadCurrentData = false;
                            clearPageIndex(tabname)
                        }
                        // Load data into the Tab's Data block
                        // Data Block is a TABLE, load the rows
                        if ($("table[tabdata='" + tabname + "'] > tbody").length > 0) {
                            if ($(datarow).attr("subcategory")) {
                                // Data Block is expecting categories, split them up 
                                $("table[tabdata='" + tabname + "'] > tbody > tr[category='" + $(datarow).attr("subcategory") + "']").css("display", "block");
                                $("table[tabdata='" + tabname + "'] > tbody > tr[category='" + $(datarow).attr("subcategory") + "End']").css("display", "block");
                                $(datarow).insertBefore("table[tabdata='" + tabname + "'] > tbody > tr[category='" + $(datarow).attr("subcategory") + "End']");
                            } else {
                                // Data Block is expecting straight table rows
                                $("table[tabdata='" + tabname + "'] > tbody").append(datarow);
                            }
                            // Data Block is a UL, load the LI's
                        } else if ($("ul[tabdata='" + tabname + "']").length > 0) {
                            $("ul[tabdata='" + tabname + "']").append(datarow);
                            // Data Block is a DIV, load the HTML with no post processing
                        } else if ($("div[tabdata='" + tabname + "']").length > 0) {
                            $("div[tabdata='" + tabname + "']").append(datarow);
                        }
                    });
                }
                // Get the page count from the returned AJAX Call
                $returnData.find("#pagecount").each(function(index, datarow) {
                    ajaxtabs[tabname].bdspagecount = new Number(datarow.innerHTML);
                });
                // Get the entity results count from the returned AJAX Call
                $returnData.find("#resultcount").each(function(index, datarow) {
                    ajaxtabs[tabname].bdsentitycount = new Number(datarow.innerHTML);
                });
                // Get the "You Searched For" String
                $returnData.find("#searchcriteria").each(function(index, datarow) {
                    ajaxtabs[tabname].YouSearchedFor = datarow.innerHTML;
                });
                // Get the "Showing" data string and replace the string's text with values
                var totalResults = ajaxtabs[tabname].bdsentitycount;
                var maxListResults = ((currentPage * currentPageSize) + currentPageSize);
                if (totalResults < maxListResults || currentPageSize == 0) { maxListResults = totalResults; }

                var displayString = "";
                if (currentPageSize == "all") { displayString = "1 - " + totalResults; }
                else { displayString = ((currentPage * currentPageSize) + 1) + " - " + maxListResults; }
                var showingString = ajaxpage.getConnectText("ctShowingResultsText");
                if (showingString != "") {
                    showingString = showingString.replace("%PAGERANGE%", displayString);
                    showingString = showingString.replace("%TOTALRESULTS%", totalResults);
                } else {
                    showingString = ajaxpage.showingString;
                    showingString = showingString.replace("%X%", displayString);
                    showingString = showingString.replace("%Y%", totalResults);
                }
                $(ajaxtabs[tabname].tabID + " .showingNum, " + ajaxtabs[tabname].tabID + " .loadingText").html(showingString);
                $(ajaxtabs[tabname].tabID + " .loadingText").show()
                // Set the current page's index in the rendered paging control
                setPageIndex(tabname);
                // Show/Hide the "other controls" for the tab after load 
                runOtherTabControls(tabname);
                // Check Ajax ExecuteAfterAjaxLoad property for post load executions
                if (ajaxtabs[tabname].ExecuteAfterAjaxLoad != "") {
                    var fnCall = ajaxtabs[tabname].ExecuteAfterAjaxLoad;
                    try { eval(fnCall); } catch (er) { }
                }
                // Mark this Tab as "loaded" 
                ajaxtabs[tabname].isLoaded = true;
                // Hide the loading image 
                $(ajaxpage.loadingImageSelector).hide();
            });
            // Unlock the Tab Strip navigation
            loadingLock = false;
        }
    } 
}
function runOtherTabControls(tabname) {
    // TFUNC11
    // This function runs after data has been loaded from Ajax to show other controls outside the Tab
    // If there are customDDLs within the loaded AJAX Tab, they are initialized here.
    try {
        $(ajaxtabs[tabname].tabID).find("div[controltype='customdropdownlist']").each(function(i, domelement) {
            customDDLs[$(domelement).attr("id")].Initialize();
        });
    } catch (err) { }
    if (ajaxtabs[tabname].OtherActiveControls != "") {
        $(ajaxtabs[tabname].OtherActiveControls).show();
        $(ajaxtabs[tabname].OtherActiveControls).find("div[controltype='customdropdownlist']").each(function(i, domelement) {
            try {
                customDDLs[$(domelement).attr("id")].Initialize();
            } catch (err) { }
        });
        $(ajaxtabs[tabname].OtherActiveControls).find("span[searchcriteriadisplay='true']").html(ajaxtabs[tabname].YouSearchedFor);
    }
    if (ajaxtabs[tabname].OtherInActiveControls != "") {
        $(ajaxtabs[tabname].OtherInActiveControls).hide();
    }
}
function hideOtherTabControls(tabname) {
    // TFUNC12
    // This function runs before data has been loaded from AJAX to hide other controls outside the Tab that was opened
    if (ajaxtabs[tabname].OtherActiveControls != "") {
        $(ajaxtabs[tabname].OtherActiveControls).hide();
    }
}
function clearPageIndex(tabname)
{
    // TFUNC13
    // Clear the Page Index display.  Used when the user clicks "View All"
    $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist").html("");
}
function setPageIndex(tabname)
{
    // TFUNC14
    if ($(ajaxtabs[tabname].tabID + " .ajaxpagecontrol").length > 0) {
        // This function builds out the page index and sets the click events for the individual pages and next, previous and view all links.
        var currentPage = ajaxtabs[tabname].bdscurrentpage;
        var currentPageSize = ajaxtabs[tabname].bdscurrentpagesize;
        var pageCount = ajaxtabs[tabname].bdspagecount;
        var entityCount = ajaxtabs[tabname].bdsentitycount;
        if (currentPageSize == 0 || pageCount == 1) {
            $(ajaxtabs[tabname].tabID + " .pageIndex").hide();
            $(ajaxtabs[tabname].tabID + " .viewall a").hide();
        } else {
            $(ajaxtabs[tabname].tabID + " .pageIndex").show();
            $(ajaxtabs[tabname].tabID + " .viewall").show();
        } 
        var startPagePrint = 0;
        var endPagePrint = pageCount;
        var showMorePrevPages = false;
        var showMoreNextPages = false;
        if (pageCount > 10) {
            if (currentPage > 5) 
            {
                startPagePrint = currentPage - 5;
            }
            if (currentPage > (pageCount-5))
            {
                startPagePrint = pageCount - 10; 
            }
            endPagePrint = startPagePrint + 10;
            if (startPagePrint > 0) { showMorePrevPages = true;} 
            if (endPagePrint < pageCount) { showMoreNextPages = true;} 
        } 
        if ($(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist").text().length == 0) {
            $(ajaxtabs[tabname].tabID + " .pageIndex a").unbind("click");
            if (pageCount > 10) {
                $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist").append("<span class=\"showmoreprev\"> <a href=\"#\" skipPages='-10'>...</a> | </span>"); 
            }
            for(var a = startPagePrint; a < endPagePrint; a++)
            {
                var pageString = "";
                //if (a == startPagePrint && showMorePrevPages) { pageString += ' ... | '; }
                pageString += '<a href="#" page="' + a + '">' + (a+1);
                pageString += "</a>"; 
                if ((a+1) < pageCount) {
                    pageString += ' | ';
                }
                 //if (a == (endPagePrint-1) && showMoreNextPages) { pageString += ' | ...'; }
                 $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist").append(pageString);
            }
            if (pageCount > 10) {
                $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist").append("<span class=\"showmorenext\"> <a href=\"#\" skipPages='10'>...</a> </span>"); 
            } 
            $(ajaxtabs[tabname].tabID + " .pageIndex a").bind("click", function(e) { return gopage(this); });
        }
        if (showMorePrevPages) {  $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist .showmoreprev").show(); } else { $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist .showmoreprev").hide();}
        if (showMoreNextPages) {  $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist .showmorenext").show(); } else { $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist .showmorenext").hide();} 
        for(var h = 0; h < pageCount; h++)
        {
            if (h >= startPagePrint && h <= endPagePrint) { 
                $(ajaxtabs[tabname].tabID + " .pageIndex a[page='" + h + "']").show();
            } else {
                $(ajaxtabs[tabname].tabID + " .pageIndex a[page='" + h + "']").hide();
            } 
        } 
        $(ajaxtabs[tabname].tabID + " .pageIndex a, " + ajaxtabs[tabname].tabID + " .viewall a").attr("tab", tabname);
        $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist a.currentpagelink:not(a[page='" + currentPage + "'])").toggleClass("currentpagelink");
        $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist a[page='" + currentPage + "']").toggleClass("currentpagelink");
        if (currentPage == 0) { $(ajaxtabs[tabname].tabID + " .pageIndex > a[page='previous']").addClass("currentpagelink");}
        else { $(ajaxtabs[tabname].tabID + " .pageIndex > a[page='previous']").removeClass("currentpagelink"); }
        if (currentPage == (pageCount-1)) { $(ajaxtabs[tabname].tabID + " .pageIndex > a[page='next']").addClass("currentpagelink");}
        else { $(ajaxtabs[tabname].tabID + " .pageIndex > a[page='next']").removeClass("currentpagelink"); }
        if (entityCount == 0) {
            $(ajaxtabs[tabname].tabID + " .ajaxpagecontrol").hide();
        } else {
            //$(ajaxtabs[tabname].tabID + " .ajaxpagecontrol").show(); 
            $(ajaxtabs[tabname].tabID + " .ajaxpagecontrol").css("display", "block");
        }  
    } 
}
function gopage(clickitem)
{
    // TFUNC15
    // Change the Tab's Page.  Click event for specific page, next, previous or view all
    var tabname = $(clickitem).attr("tab");
    if (!loadingLock) {
        var currentPage = ajaxtabs[tabname].bdscurrentpage;
        var currentPageSize = ajaxtabs[tabname].bdscurrentpagesize;
        var action = $(clickitem).attr("page");
        var changePage = false;
        if (typeof (action) == "undefined") {
            action = $(clickitem).attr("skipPages");
            if (typeof (action) == "undefined") { return false; }
            var newPageNumber = new Number(currentPage) + new Number(action);
            
            if(newPageNumber >= ajaxtabs[tabname].bdspagecount)
            {
                currentPage = ajaxtabs[tabname].bdspagecount-1;
            }
            else
            {
                currentPage = newPageNumber;
            }
            
            if (currentPage > ajaxtabs[tabname].bdspagecount) {
                currentPage = ajaxtabs[tabname].bdspagecount-1;
            }
            if (currentPage < 0) {
                currentPage = 0;
            }
            
            changePage = true;
        } else {
            if (action == "previous") {
                if (currentPage > 0) { currentPage--; changePage = true; }
            }
            else if (action == "next") {
                var pageCount = ajaxtabs[tabname].bdspagecount;
                pageCount--;
                if (currentPage < pageCount) { currentPage++; changePage = true; }
            }
            else if (action == "all") {
                currentPage = 0;
                currentPageSize = "all";
                changePage = true;
            }
            else { currentPage = $(clickitem).attr("page"); changePage = true; }
        }
       // If the click requires a reload or update, set the "isloaded" attribute and run the ajaxLoadData function above.
        if (changePage) {
            if (currentPage != ajaxtabs[tabname].bdscurrentpage) {
                ajaxtabs[tabname].bdscurrentpage = currentPage;
                ajaxtabs[tabname].bdscurrentpagesize = currentPageSize;
                ajaxtabs[tabname].isLoaded = false;
//                if(typeof ($.fragmentChange) != "undefined" && typeof (enableHistory) != "undefined" && enableHistory){
//                    var strQuery = $.queryString($.queryString());
//                    var strFrag = $.fragment($.fragment());
//                    var strParams = "page=" + (parseInt(currentPage) + 1);
//                    if(strFrag.replace("page=" + currentPage, "").length == 0){
//                        strParams = strQuery + "&" + strParams;
//                    }
//                    $.setFragment(strParams);
//                }
//                else{
                    ajaxLoadData(tabname);
                //}
            }
        }
    } 
    return false; 
}
// Functions for AjaxSearchFilterControl text input box
function focusTextBox(clickitem) {
    // ASFUNC1
    var init = "";
    if ($(clickitem).attr("defaultvalue")) { init = $(clickitem).attr("defaultvalue"); }
    if (clickitem.value == init) { clickitem.value = ""; }
}
function blurTextBox(clickitem) {
    // ASFUNC2
    var init = "";
    if ($(clickitem).attr("defaultvalue")) { init = $(clickitem).attr("defaultvalue"); }
    if (clickitem.value == "") { clickitem.value = init; }
}
// Reset the search to the initial page load
function resetSearch(criteriaJQSelector) {
    // ASFUNC3
    $(criteriaJQSelector).each(function(i, domitem) {
        var init = "";
        if ($(domitem).attr("initialvalue")) { init = $(domitem).attr("initialvalue"); }
        domitem.value = init;
    });
}
// Build a QueryString for a specific form (input is the JQuery Selector
// of the form elements)
// Form elements MUST have an attribute "criteria" which is the QueryString Key
// The QueryString value is the value of the form element.
function getSearchQueryString(criteriaJQSelector) {
    // ASFUNC4
    var searchQString = "";
    $(criteriaJQSelector).each(function(i, domitem) {
        var searchItem = false;
        var tagType = "text";
        var qValue = "";
        var criteriaName = $(domitem).attr("criteria");
        if(criteriaName == "service") {criteriaName = "serviceid";}
        if ($(domitem).is("select")) { tagType = "select"; }
        if ($(domitem).attr("type") == "radio") { tagType = "radiobutton"; }
        if ($(domitem).attr("controltype") == "customdropdownlist") { tagType = "customdropdownlist"; }
        if ($(domitem).attr("controltype") == "radcombobox") { tagType = "radcombobox"; }
        if ($(domitem).attr("controltype") == "popupbox") { tagType = "popupbox"; }
        if (tagType == "select") {
            var dText = $(domitem).attr("defaultvalue");
            var cText = $(domitem).children(":selected").attr("text");
            var cValue = $(domitem).children(":selected").attr("value");
            var iValue = $(domitem).attr("initialvalue");
            if (dText != cText) {
                qValue = cValue;
                searchItem = true;
            }
        }
        if (tagType == "popupbox") {
            var dText = "";
            var cText = $(domitem).text();
            var cValue = $(domitem).text();
            if (dText != cText) {
                qValue = cValue;
                searchItem = true;
            }
        }
        if (tagType == "radcombobox") {
            var radComboBoxID = $(domitem).children("div").attr("id");
            var radRoot = radComboBoxID.replace("_wrapper", "");
            var dText = $(domitem).attr("defaultvalue");
            var cText = $("#" + radRoot + "_text").attr("value");
            var cValue = $("#" + radRoot + "_value").attr("value");
            if (cValue != "") {
                if (dText != cText) {
                    qValue = cValue;
                    searchItem = true;
                }
            }
        }
        if (tagType == "customdropdownlist") {
            var customDDLID = $(domitem).attr("id");
            var cValue = customDDLs[customDDLID].SelectedValue();
            if (cValue != null && cValue != "") {
                qValue = cValue;
                searchItem = true;
            }
        }
        if (tagType == "text") {
            var dText = $(domitem).attr("defaultvalue");
            var cText = $(domitem).attr("value");
            var cValue = $(domitem).attr("value");
            if ($(domitem).attr("istypeahead") == "true") {
                cValue = $(domitem).data("typeaheadselectedvalue");
                if (typeof (cValue) == "undefined" || cValue == "") {
                    cValue = $(domitem).val();
                }
                //cValue = escape(cValue);
            }
            if ($(domitem).attr("controltype") == "raddatepicker") {
                //cValue = escape(cValue);
                if(cValue.indexOf("/") > -1)
                    cValue = cValue.replace(/\//g, "%2F");
            }
            if (dText != cText) {
                qValue = cValue;
                searchItem = true;
            }
        }
        if (tagType == "radiobutton") {
            if ($(domitem).attr("checked")) {
                qValue = $(domitem).val();
                searchItem = true;
            }
        }
        if (searchItem) {
            if (searchQString.length > 0) { searchQString += "&"; }
            searchQString += criteriaName + "=" + encodeURIComponent(qValue.replace(/^\s+|\s+$/g, ''));
        }
    });
    return searchQString;
}
function getSearchDescription(criteriaJQSelector) {
    var searchDescString = "";
    $(criteriaJQSelector).each(function(i, domitem) {
        var searchItem = false;
        var init = "";
        if ($(domitem).attr("initialvalue")) { init = $(domitem).attr("initialvalue"); }
        if (domitem.value != init && domitem.value != "") { searchItem = true; }
        if ($(domitem).attr("checked")) { searchItem = true; }
        if (searchItem) {
            if (searchDescString.length > 0) { searchDescString += ", "; }
            searchDescString += $(domitem).attr("text");
        }
    });
    return searchDescString;
}


var typeAheadData = null;
// Bind this event to the KeyPress event of an input box to use Type Ahead
// Syntax: <input type="text" onkeypress="return runTypeAheadSearch(this, window.event)" />
// JQuery Syntax: $(this).bind("keypress", function(e) { runTypeAheadSearch(this, e); });
function runTypeAheadSearch(searchitem, e) {
    // TAFUNC1
    var keyCode = KeyPressControl(searchitem, e);
    return keyCode;
}
// Retrieve the XML from the AJAX Call and call SetTypeAheadDropDown
function typeAheadDataRetrieval(searchString, searchCriteria, ctkey, targetJQueryElement) {
    // TAFUNC2
    var typeaheadUrl = AjaxRoot + "?CT=" + ctkey + "&" + searchCriteria + "=" + searchString + "&istypeahead=true";
    if ($(targetJQueryElement).data("filter") != null && $(targetJQueryElement).data("filter") != "") {
        typeaheadUrl += "&" + $(targetJQueryElement).data("filter");
    }
    $.ajax({
        url: typeaheadUrl,
        dataType: ($.browser.msie) ? "text" : "xml",
        success: function(data) {
            typeAheadData = data;
            var xml;
            if (typeof data == "string") {
                typeAheadData = new ActiveXObject("Microsoft.XMLDOM");
                typeAheadData.async = false;
                typeAheadData.loadXML(data);
            } else {
                typeAheadData = data;
            }
            SetTypeAheadDropDown(targetJQueryElement);
        }
    });
}
// Handle the OnKeyPress Event from the text box
// This function manages the Control Keys (Up, Down, Escape and Enter) and 
// the normal AlphaNumeric keys.
function KeyPressControl(targetJQueryElement, e) {
    // TAFUNC3
    var typeAheadExecuteLength = 3; // Default Minimum length
    //
    var mincharacterAttr = $(targetJQueryElement).attr("mincharacters");
    if (typeof (mincharacterAttr) != "undefined" && mincharacterAttr != "") {
        typeAheadExecuteLength = mincharacterAttr;
    }
    var valueLength = $(targetJQueryElement).val().length;
    var keypress = e.keyCode;
    var isControlKey = false;
    var valueSelected = false;
    // 38 = up arrow
    if (keypress == 38) {
        var typeAheadLength = getTypeAheadListElement(targetJQueryElement).children("div").length;
        if (typeAheadLength >= 1) {
            var currentSelected = -1;
            if (getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").length > 0) {
                currentSelected = getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").attr("idx");
            }
            getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected[idx='" + currentSelected + "']").removeClass("typeaheadselected");
            currentSelected--;
            getTypeAheadListElement(targetJQueryElement).children("[idx='" + currentSelected + "']").addClass("typeaheadselected");
        }
        isControlKey = true;
    }
    // 40 = down arrow
    if (keypress == 40) {
        var typeAheadLength = getTypeAheadListElement(targetJQueryElement).children("div").length;
        if (typeAheadLength >= 1) {
            var currentSelected = -1;
            if (getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").length > 0) {
                currentSelected = getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").attr("idx");
            }
            getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected[idx='" + currentSelected + "']").removeClass("typeaheadselected");
            currentSelected++;
            getTypeAheadListElement(targetJQueryElement).children("[idx='" + currentSelected + "']").addClass("typeaheadselected");
        }
        isControlKey = true;
    }
    // 27  = esc key
    if (keypress == 27) {
        $(targetJQueryElement).attr("value", "");
        clearTypeAheadDropDown(targetJQueryElement);
        processSelectedTypeAhead(targetJQueryElement);
        isControlKey = true;
    }
    // 13 = enter key
    if (keypress == 13) {
        var typeAheadLength = getTypeAheadListElement(targetJQueryElement).children("div").length;
        if (typeAheadLength >= 1) {
            var typeaheadcriteriaAttrib = $(targetJQueryElement).attr("criteria");
            if (getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").text() != "")
            {
                if ($(targetJQueryElement).attr("id") == "sitesearch_TypeaheadBox")
                    $(targetJQueryElement).attr("value", "\""+getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").text()+"\"").data("typeaheadselectedvalue", getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").attr("value"));
                else
                    $(targetJQueryElement).attr("value", getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").text()).data("typeaheadselectedvalue", getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").attr("value"));
            }
                
            clearTypeAheadDropDown(targetJQueryElement);
            processSelectedTypeAhead(targetJQueryElement);
        }
        valueSelected = true;
        isControlKey = true;
    }
    // If the key pressed was not a control key listed above, submit the current value of the text box to AJAX
    if (!isControlKey && (valueLength >= typeAheadExecuteLength)) {
        typeAheadDataRetrieval($(targetJQueryElement).attr("value"), $(targetJQueryElement).attr("criteria"), $(targetJQueryElement).attr("ctkey"), $(targetJQueryElement));
    }
    if (valueSelected) {
        return keypress;
    } else {
        return "0";
    }
}
// Find the Type Ahead List.
function getTypeAheadListElement(targetJQueryElement) {
    // TAFUNC4
    return $(targetJQueryElement).parent().find("div#typeahead");
}
// Escape key was pressed, clear the Type Ahead List
function clearTypeAheadDropDown(targetJQueryElement) {
    // TAFUNC5
    if (!typeAheadMouseOver) {
        getTypeAheadListElement(targetJQueryElement).remove();
    }
}
var typeAheadMouseOver = false;

// Set up the position (immediately below the text box) and layout of the 
// Type Ahead Drop Down List.  
// This also binds the events to each Element of the Type Ahead Drop Down List.
// MouseOver: Highlight the Element
// OnClick: Select the element
function SetTypeAheadDropDown(targetJQueryElement) {
    // TAFUNC6
    if (getTypeAheadListElement(targetJQueryElement).length == 0) {
        var styleString = "";
        var displayX = $(targetJQueryElement).position().left;
        var displayY = $(targetJQueryElement).position().top + $(targetJQueryElement).outerHeight();
        var displayWidth = $(targetJQueryElement).outerWidth();
        var typeaheadwidthAttr = $(targetJQueryElement).attr("typeaheadwidth");
        if (typeof (typeaheadwidthAttr) != "undefined" && typeaheadwidthAttr != "") {
            displayWidth = typeaheadwidthAttr;
        }
        styleString += "top:" + displayY + "px;left:" + displayX + "px;width:" + displayWidth + "px;";
        $(targetJQueryElement).parent().append("<div id=\"typeahead\" style=\"" + styleString +"\" class=\"typeahead\"></div>");
    }
    if (typeAheadData != null) {
        getTypeAheadListElement(targetJQueryElement).empty();
        var nvArray = TranslateXmlToNameValuePairArray(typeAheadData, "row", "value");
        if (nvArray != null) {
            var typeaheadcharacterlimit = 0;
            var typeaheadcharacterlimitAttr = $(targetJQueryElement).attr("typeaheadcharacterlimit");
            if (typeof (typeaheadcharacterlimitAttr) != "undefined" && typeaheadcharacterlimitAttr != "") {
                typeaheadcharacterlimit = typeaheadcharacterlimitAttr;
            }
            var typeaheadresultlimit = 0;
            var typeaheadresultlimitAttr = $(targetJQueryElement).attr("typeaheadresultlimit");
            if (typeof (typeaheadresultlimitAttr) != "undefined" && typeaheadresultlimitAttr != "") {
                typeaheadresultlimit = parseInt(typeaheadresultlimitAttr);
            }
            var resultTotal = $(typeAheadData).find("rows").attr("total");
            var resultCount = nvArray.length;
            if(typeaheadresultlimit > 0 && typeaheadresultlimit < nvArray.length){
                resultCount = typeaheadresultlimit;
            }
            for (var i = 0; i < resultCount; i++) {
                var className = "class=\"typeahead_item\" ";
                if (typeaheadresultlimit == 0 && resultTotal == null && i == resultCount - 1)
                    className = "class=\"typeahead_lastitem\" ";
                var itemName = nvArray[i].Name;
                if(typeaheadcharacterlimit > 0 && itemName.length > typeaheadcharacterlimit){
                    var indexSpace = itemName.substring(0, typeaheadcharacterlimit).lastIndexOf(" ");
                    if (indexSpace > -1)
                        itemName = itemName.substring(0, indexSpace) + " ...";
                }
                getTypeAheadListElement(targetJQueryElement).append("<div " + className + " value=\"" + nvArray[i].Value + "\" idx=\"" + i + "\">" + itemName + "</div>");
                //if($(targetJQueryElement).val().toLowerCase()  == nvArray[i].Name.toLowerCase())
                //    $(targetJQueryElement).attr("value", nvArray[i].Name).data("typeaheadselectedvalue", nvArray[i].Value);
            }
            if (typeaheadresultlimit != 0) {
                getTypeAheadListElement(targetJQueryElement).append("<span class=\"typeahead_lastitem\">" + resultCount + " of " + nvArray.length + "</span>");
            }
            getTypeAheadListElement(targetJQueryElement).children("div").bind("click", function() {
                typeAheadMouseOver = false;
                var typeAheadLength = getTypeAheadListElement(targetJQueryElement).children().length;
                if (typeAheadLength > 0) {
                    var typeaheadcriteriaAttrib = $(targetJQueryElement).attr("criteria");
                    if ($(targetJQueryElement).attr("id") == "sitesearch_TypeaheadBox")
                        $(targetJQueryElement).attr("value", "\""+$(this).text()+"\"").data("typeaheadselectedvalue", $(this).attr("value"));
                    else
                        $(targetJQueryElement).attr("value", $(this).text()).data("typeaheadselectedvalue", $(this).attr("value"));
                    
                    clearTypeAheadDropDown(targetJQueryElement);
                    processSelectedTypeAhead(targetJQueryElement);
                }
            }).bind("mouseover", function() {
                typeAheadMouseOver = true;
                getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").removeClass("typeaheadselected");
                $(this).addClass("typeaheadselected");
            }).bind("mouseout", function() {
                typeAheadMouseOver = false;
            });
            if(resultTotal != null && resultTotal != "" && resultCount > 0){
                getTypeAheadListElement(targetJQueryElement).append("<div class=\"typeahead_lastitem\" >" + resultCount + " of " + resultTotal + " results </div>");
            }
        }
    }
}

// Used by the Custom Drop Down List to perform an AJAX Call to retreive data to put into a target element.
// Syntax: <fcw:CustomDropDownList runat="server" ID="cddl_ID"
//              criteria="service"        // QueryString Key, SelectedValue is Value.
//              onselectedchange="processCustomDropDown"
//              ctkey="service"          // CT=service - in AjaxData.aspx Query
//              cascadetarget="legalservice_relatedservices">            // Target Element to Fill
//              </fcw:CustomDropDownList>
function processCustomDropDown(selectID) {
    // CFUNC1
    var guidValue = customDDLs[selectID].SelectedValue();
    var updateTag = $(customDDLs[selectID].Selector).attr("dynamictextupdate");
    var ctkey = $(customDDLs[selectID].Selector).attr("ctkey");
    var updateElement = $("[selectupdate='" + updateTag + "']");
    var sourceField = $(updateElement).attr("dynamictext");
    var activateTag = $(customDDLs[selectID].Selector).attr("activatebutton");
    if(activateTag != null && activateTag != "" && guidValue != null && guidValue != ""){
        var activateElement = $("#" + activateTag);
        if(activateElement != null)
            activateElement.removeAttr('disabled');
    }
    if (guidValue != null && guidValue != "") {
        var url = AjaxRoot + "?CT=" + ctkey + "&guid=" + guidValue + "&dynamictext=" + sourceField;
        $.ajax({
            url: url,
            dataType: "text",
            success: function(data) {
                var xml;
                if (typeof data == "string") {
                    xml = new ActiveXObject("Microsoft.XMLDOM");
                    xml.async = false;
                    xml.loadXML(data);
                } else {
                    xml = data;
                }
                tempArray = TranslateXmlToNameValuePairArray(xml, "row", "value");
                if (activateElement != null) {
                    $(activateElement).attr("searchtarget", "");
                    $(activateElement).attr("gotopage", tempArray[0].Value);
                }
                $(updateElement).html(tempArray[0].Name);
                //$(updateElement).html(data);
            },
            error: function(data) {
            }
        });
    } else {
    $(updateElement).empty();
    }
}

// Used by a Type Ahead Selection to perform an AJAX Call to retreive data to put into a target element.
// Example: <input type="text" class="text1" id="textbox_ID" 
//              criteria="service" 
//              value="" istypeahead="true" 
//              ctkey="service" 
//              typeaheadupdate="true" />
// MUST bind KeyPress to this input text box.
function processSelectedTypeAhead(targetJQueryElement) {
    // TAFUNC7
    if ($(targetJQueryElement).attr("typeaheadupdate") == "true") {
        var elementID = $(targetJQueryElement).attr("id");
        var sourceGuid = $(targetJQueryElement).data("typeaheadselectedvalue");
        var updateElement = $("[updatefrom='" + elementID + "']");
        var sourceField = $(updateElement).attr("dynamictext");
        var activateTag = $(targetJQueryElement).attr("activatebutton");
        var url = AjaxRoot + "?CT=" + $(targetJQueryElement).attr("ctkey") + "&guid=" + sourceGuid + "&dynamictext=" + sourceField;
        if ($(updateElement).length == 0) {
            return;
        }
        if (typeof (sourceGuid) == "undefined" || sourceGuid == "") {
            return;
        }
        var processWithFunction = $(targetJQueryElement).attr("processwith") + "()";
        if (processWithFunction != null && processWithFunction != "") {
            eval(processWithFunction);
        }
        if (activateTag != null && activateTag != "" && sourceGuid != null && sourceGuid != "") {
            var activateElement = $("#" + activateTag);
            if (activateElement != null)
                activateElement.removeAttr('disabled');
        }
        $.ajax({
            url: url,
            dataType: "text",
            success: function(data) {
                var xml;
                if (typeof data == "string") {
                    xml = new ActiveXObject("Microsoft.XMLDOM");
                    xml.async = false;
                    xml.loadXML(data);
                } else {
                    xml = data;
                }
                tempArray = TranslateXmlToNameValuePairArray(xml, "row", "value");
                if (activateElement != null) {
                    $(activateElement).attr("searchtarget", "");
                    $(activateElement).attr("gotopage", tempArray[0].Value);
                }
                $(updateElement).html(tempArray[0].Name);
                //$(updateElement).html(data);
            },
            error: function(data) {
            }
        });
    }
}
// Clear the Type Ahead Target Update Element
function clearTypeAheadUpdate(targetJQueryElement) {
    // TAFUNC8
    if ($(targetJQueryElement).attr("value") == "" && $(targetJQueryElement).attr("typeaheadupdate") == "true") {
        var elementID = $(targetJQueryElement).attr("id");
        var updateElement = $("[updatefrom='" + elementID + "']");
        $(updateElement).html("");
        if ($(updateElement).data("defaulttext") != null) {
            $(updateElement).html($(updateElement).data("defaulttext"));
        }
    }
}
// Select a Single Node from an XML Document.  Cross Browser compatable.
function SelectSingleNode(xmlDoc, elementPath) {
    // XFUNC1
    if ($.browser.msie) {
        return xmlDoc.selectSingleNode(elementPath);
    } else {
        if (document.implementation && document.implementation.createDocument) {
            var nodes = document.evaluate(elementPath, xmlDoc, null, XPathResult.ANY_TYPE, null);
            var results = nodes.iterateNext();
            return results;
        }
    }
}
// Constructor for a Name/Value Pair Object
function NameValueObject(name, value){
    // XFUNC2
    this.Name = name;
    this.Value = value;
}
/* 
Convert an XMLDoc received from AJAX from Structured XML to Name/Value Pair Objects.
    Input:
        xmlDoc: The received XML Document
        elementName: The XMLNode.Name to search for to make as the Name
        attributeName: The XMLNode.Attributes[attributeName] to make as the Value.
    Output: 
        Array of Name/Value Pairs.
    Xml Input Example:
        <rows>
            <row value="1">First</row>
            <row value="2">Second</row>
        </rows>
        TranslateXmlToNameValuePairArray(xml, "row", "value")
    Output Example:
        nvArray[0].Name = "First"
        nvArray[0].Value = "1"
        nvArray[1].Name = "Second"
        nvArray[1].Value = "2"
        
    For Child Entities:
    Xml Input Example:
        <rows>
            <row value="1" childelement="expand" childattribute="expandvalue">
                <expand expandvalue="1A">First A</expand>
                <expand expandvalue="1B">First B</expand>
            </row>
            <row value="2">Second</row>
            <row value="3" childelement="expand" childattribute="expandvalue">
                <expand expandvalue="3A">Third A</expand>
                <expand expandvalue="3B">Third B</expand>
            </row>
        </rows>
        TranslateXmlToNameValuePairArray(xml, "row", "value")
    Output Example:
        nvArray[0].Name = "1"
        nvArray[0].Value[0].Name = "First A"
        nvArray[0].Value[0].Value = "1A"
        nvArray[0].Value[1].Name = "First B"
        nvArray[0].Value[1].Value = "1B"
        nvArray[1].Name = "Second"
        nvArray[1].Value = "2"
        nvArray[2].Name = "3"
        nvArray[2].Value[0].Name = "Third A"
        nvArray[2].Value[0].Value = "3A"
        nvArray[2].Value[1].Name = "Third B"
        nvArray[2].Value[1].Value = "3B"
*/
function TranslateXmlToNameValuePairArray(xmlDoc, elementName, attributeName) {
    // XFUNC3
    var nvArray = new Array();
    var nvIndex = 0;
    var xmlNodes = xmlDoc.getElementsByTagName(elementName);
     if ($.browser.msie) {
        for(var n=0;  n< xmlNodes.length; n++) {
            var xid = xmlNodes[n].getAttribute(attributeName);
            var childelementname = xmlNodes[n].getAttribute("childelement");
            if (childelementname == null) {
                nvArray[nvIndex] = new NameValueObject(xmlNodes[n].text, xid);
            } else {
            var childattributename = xmlNodes[n].getAttribute("childattribute");
                var childArrayItem = new NameValueObject(xid, TranslateXmlToNameValuePairArray(xmlNodes[n], childelementname, childattributename));
                if (childArrayItem != null) {
                    nvArray[nvIndex] = childArrayItem;
                } else {
                    nvIndex--;
                }
            }
            nvIndex++;
        }
    } else {
        for (var n = 0; n < xmlNodes.length; n++) {
            var xid = xmlNodes[n].getAttribute(attributeName);
            var childelementname = xmlNodes[n].getAttribute("childelement");
            if (childelementname == null) {
                if (xmlNodes[n].childNodes[0] != null) {
                    nvArray[nvIndex] = new NameValueObject(xmlNodes[n].childNodes[0].nodeValue, xid);
                } else {
                    nvArray[nvIndex] = new NameValueObject("", xid);
                }
            } else {
                var childattributename = xmlNodes[n].getAttribute("childattribute");
                var childArrayItem = new NameValueObject(xid, TranslateXmlToNameValuePairArray(xmlNodes[n], childelementname, childattributename));
                if (childArrayItem != null) {
                    nvArray[nvIndex] = childArrayItem;
                } else {
                    nvIndex--;
                }
            }
            nvIndex++;
         }
     }
     return nvArray;
 }
// Video Flowplayer layout and Data controls
function getVideoData(controlid) {
    // VFUNC1
    var url = "";
    var mediaParentType = $("#mediaparenttype_" + controlid).text();
    var mediaParentGuid = $("#mediaparentguid_" + controlid).text();
    if (typeof (mediaParentType) != "undefined" && typeof (mediaParentGuid) != "undefined" && mediaParentType != "" && mediaParentGuid != "") {
        //added this code in in the case of in page language switching. So the site language may still be english, but page
        // content might be in netherlands or soemthing. Goes with languagedatabindmodifier and pagelanguageselection control.
        var whatever = window.location.search.substring(1).split("&");
        var addoncustomlang = "";
        for(var j=0;j<whatever.length;j++)
        {
            if(whatever[j].toLowerCase().indexOf("langguid") == 0)
                addoncustomlang = whatever[j];
        }
        url = AjaxRoot + "?CT=media&" + mediaParentType.toLowerCase().replace("firmevent", "event") + "=" + mediaParentGuid;
        if(addoncustomlang != "")
            url = url + "&" + addoncustomlang;
    }
    if (url != "") {
        $.ajax({
            url: url,
            dataType: ($.browser.msie) ? "text" : "xml",
            success: function(data) {
                var xml;
                if (typeof data == "string") {
                    xml = new ActiveXObject("Microsoft.XMLDOM");
                    xml.async = true;
                    xml.loadXML(data);
                } else {
                    xml = data;
                }
                var nvArray = TranslateXmlToNameValuePairArray(xml, "row", "value");
                var listingString = "";
                var playerString = "";
                var imageListingString = "";
                for (var i = 0; i < nvArray.length; i++) {
                    for (var s = 0; s < nvArray[i].Value.length; s++) {
                        if (nvArray[i].Value[s].Value == "MediaFile") {
                            var idString = "#overlay" + nvArray[i].Name;
                            if ($(idString).length == 0) {
                                playerString += "<div id=\"overlay" + nvArray[i].Name + "\" class=\"overlay\"><a class=\"player\" id=\"mediaTag" + nvArray[i].Name + "\" href=\"" + nvArray[i].Value[s].Name + "\" style=\"background-image: none; top:40px; left:40px; position: absolute; z-index: 9999; \">&nbsp;</a></div>";
                            }
                        }
                    }
                }
                //$("#flash_" + controlid).append(listingString);
                $("body").append(playerString);
                // setup overlay actions to buttons
                $("div.video_player[rel]").overlay({
                    finish: {
                        top: getDimensions("top"),
                        left: getDimensions("left"),
                        absolute: false
                    },
                    onBeforeLoad: function() {
                        $("body").data("previouslyLoaded", $.expose.isLoaded());
                        this.expose();
                    },

                    onLoad: function(content) {
                        // find the player contained inside this overlay and load it
                        this.getContent().find("a.player").flowplayer(0).load();
                    },

                    onBeforeClose: function() {
                        $f().unload();
                    },
                    onClose: function(content) {
                        this.getContent().find("a.player").flowplayer(0).stop();
                        if (!$("body").data("previouslyLoaded")) {                            
                            // close exposing
                            $.expose.close();
                            $("body").removeData("previouslyLoaded");
                        }
                    }
                });

                // install flowplayers
                $("a.player").flowplayer("/fcwsite/include/flowplayer.thomsonreuters-3.0.5.swf",{ key: FlowPlayerKey });
            }
        });
    }
    return false;
}
// Video Flowplayer layout function
function getDimensions(dimensionType) {
    // VFUNC2
    // width: 612px
    // height: 450px
    var retVal = 0;
    if (dimensionType == "left") {
        retVal = Math.round(($(window).width() - 612) / 2);
    }
    if (dimensionType == "top") {
        retVal = Math.round(($(window).height() - 482) / 2);
    }
    if (retVal < 0) { retVal = 0; }
    return retVal;
}  
// Parse the fragment, load/display content, and update all links as necessary.
function parse_fragment() {
    //alert($.queryString($.queryString()) + ":" + $.fragment($.fragment()));
    var searchQString = $.fragment($.fragment());
    if(searchQString.length == 0){
        searchQString = $.queryString($.queryString());
    }
    var currentTab = "";
    if(typeof (startingTab) != "undefined" && startingTab != null)
        currentTab = startingTab;
    if(currentTab.length > 0 && currentTab != "MainNav" && currentTab != "PENListing" && ajaxtabs[currentTab] != null){
        if(searchQString.length > 0){
            //alert(searchQString);
            var pageIndex = searchQString.indexOf("page=");
            if(pageIndex > -1){
                ajaxtabs[currentTab].SetSearchUrl(searchQString.substring(0, pageIndex - (pageIndex == 0 ? 0 : 1)));
                ajaxtabs[currentTab].bdscurrentpage = parseInt(searchQString.substring(pageIndex + 5)) - 1;
                ajaxtabs[currentTab].isLoaded = false;
                ajaxLoadData(currentTab);
            }
            else{
                ajaxtabs[currentTab].SetSearchUrl(searchQString);
                ajaxtabs[currentTab].bdscurrentpage = 0;
                ajaxtabs[currentTab].isLoaded = false;
                switchtab(currentTab);
            }
        }
        else{
            ajaxtabs[currentTab].SetSearchUrl("");
            ajaxtabs[currentTab].bdscurrentpage = 0;
            ajaxtabs[currentTab].isLoaded = false;
            ajaxLoadData(currentTab);
        }
    }
};
// Ajax History
if(typeof ($.fragmentChange) != "undefined" && typeof (enableHistory) != "undefined" && enableHistory){
    $(function(){  
        // Enable the fragmentChange event.
        $.fragmentChange( true );
        self.scrollTo(0, 0); // fix page jumps to bottom issue.
        // Bind parse_fragment to the fragmentChange event (using a namespace in case we need to unbind later).
        // $(document).bind( 'fragmentChange.nav', parse_fragment );
        // Call parse_fragment now, in case the page was loaded with a fragment.
        // parse_fragment();
        // Bind parse_fragment to the fragmentChange event
        $(document).bind('fragmentChange', function(e) {
            parse_fragment();
        });
    });
}
else if(typeof (enableHistory) != "undefined"){
    enableHistory = false;
}
