/*
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]
        PostLoadDataToTab_FirstChunk_____ [PFUNC8]
        updateShowingString_____________  [PFUNC9]
        LoadDataToTab__________________ [PFUNC10]
        PostLoadDataToTab_LastChunk_____ [PFUNC11]
        SetTab_________________________ [PFUNC12]
        recordState_____________________ [PFUNC13]
        pageSetState____________________ [PFUNC14]
        pageState_______________________ [PFUNC15]
    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]
        getTabState_____________________  [TFUNC16]
        ConverStringToTabState___________  [TFUNC17]
        getTabStateArray________________  [TFUNC18]
        setTabStateArray________________  [TFUNC19]
    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)
            visible_page_count = # of pages to display in paging control.  (Set in TabStripMasterControl, default = 10)
            shallow_ajax_load = Appends the querystring value shallow=true to any tab Ajax Url (Set in TabStripMasterControl, default = false)
                                                Only works if the listing page has been coded to handle this querystring value
*/
var loadingLock = false;   // Set to true while an AJAX call is being queried.  Locks the TabStrip until query is completed (success or fail)
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, visible_page_count, shallow_ajax_load, debug_mode)
{ // 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 (visible_page_count != null && visible_page_count > 0) {
        this.visiblePageCount = visible_page_count;
    } else {
        this.visiblePageCount = 10;
    }

    if (shallow_ajax_load != null) {
        this.shallowAjaxLoad = shallow_ajax_load;
    } else {
        this.shallowAjaxLoad = 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;
     }
     if (debug_mode != null) {
         this.debugMode = debug_mode;
     } else {
        this.debugMode = 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;
    this.State = pageState;
    this.StartHashCheck = startHashCheck;
    this.StopHashCheck = cancelHashCheck;
    this.pageTitle = window.document.title;
    this.canSaveState = false;
    this.useMainHash = false;
    this.HistoryIFrameID = "#AjaxTabsBackHistory";
    this.PageHistory = "";
    this.hashCheckTimeout = null;
    if ($(this.HistoryIFrameID).length > 0) {
        this.canSaveState = true;
        if ($.browser.safari) {
            this.useMainHash = true;
            this.StartHashCheck();
        } else {
            this.ajaxHistoryUrl = $(this.HistoryIFrameID).attr("holderurl");
            try {
                this.PageHistory = $(this.HistoryIFrameID).contents().find("#onpagestate").text();
            } catch (exc) {
            }
        }
    }
}
function startHashCheck() {
    if (this.hashCheckTimeout == null) {
        this.hashCheckTimeout = setInterval("checkHash()", 200);
    }
}
function cancelHashCheck() {
    if (this.hashCheckTimeout != null) {
        clearInterval(this.hashCheckTimeout);
        this.hashCheckTimeout = null;
    }
}

// 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 set to false, will not run an ajax load until commanded from another event.
    // Must be set in javascript
    this.ajaxOnTabSwitch = true;
    
    // If Ajax Tab, these are the counters for the data 
    this.bdspagecount = 0;
    this.bdsentitycount = 0;
    this.bdscurrentpage = 0;
    this.bdscurrentpagesize = 15;
    // if Ajax Tab, use this for view more link
    this.showViewMoreLink = false;
    this.showFeaturedString = false;
    this.featuredString = "";

    // 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 = "";
    }
    
    // Return Untranslated Only
    this.returnUntranslated = true;
    
    // 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; 
   
    // Use the page's shallow load setting.
    this.shallowAjaxLoad = true;
    
    // 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.ExecuteAfterTabSwitch = "";
    // One Function to run on tab switch (every time this tab gets activated, run the following function)
    // Executes at the end of clicktab function
    var cssElement = $(ajaxpage.navID).find(" [tabstate='" + this.tabName + "']");
    if (cssElement != null && cssElement.length > 0) {
        this.tabOffStyle = $(cssElement).attr("offclass");
        if (this.tabOffStyle == null) { this.tabOffStyle = ""; }
        this.tabOnStyle = $(cssElement).attr("onclass");
        if (this.tabOnStyle == null) { this.tabOnStyle = ""; }
    } else {
        this.tabOffStyle = ""; 
        this.tabOnStyle = ""; 
    }
    
    // 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; 
    // Set the ajax tab's shallow load
    this.OverrideShallowLoad = overrideShallowLoad;
    // Get the Ajax Tab's current state
    this.State = getTabState;
    this.StateArray = getTabStateArray;
    this.SetStateArray = setTabStateArray;
    //this.GetTabIndex = ;
}
// Method of tabObject
function SetSearchUrl(queryString)
{ // TFUNC3
    var urlString = this.ajaxSearchUrlStub + queryString;
    if (this.ajaxSearchUrl != urlString) {
        if (this.SortType != "") {
            this.SortType = "";
            $("#tabdata_" + this.tabName).find("img.arrow_sort.active").removeClass("active");
            $("#tabdata_" + this.tabName).find("a[defaultsort='true']").each(function(i, sorttag) {
                this.SortType = $(sorttag).attr("sorttype");
                $(sorttag).find("img.arrow_sort").addClass("active");
            });
        }
        this.ajaxSearchUrl = urlString;
        this.bdscurrentpagesize = 15;
        this.bdscurrentpage = 0;
        this.isLoaded = false;
    }
}
// Method of tabObject
function overrideShallowLoad(bIsShallowLoad) {
    this.shallowAjaxLoad = bIsShallowLoad;
}

// 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 += "ajaxOnTabSwitch = '";
    if (this.ajaxOnTabSwitch) { retString += "true"; } else { retString += "false"; }
    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 += "SortType = '";
    if (this.SortType != null) { retString += this.SortType; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "returnUntranslated = '";
    if (this.returnUntranslated) { retString += "true"; } else { retString += "false"; }
    retString += "'<br/> ";
    retString += "shallowAjaxLoad = '";
    if (this.shallowAjaxLoad) { retString += "true"; } else { retString += "false"; }
    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/> ";
    retString += "tabOffStyle = '";
    if (this.tabOffStyle != null) { retString += this.tabOffStyle; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "tabOnStyle = '";
    if (this.tabOnStyle != null) { retString += this.tabOnStyle; } else { retString += "null"; }
    retString += "'<br/> ";
    retString += "showViewMoreLink = '";
    if (this.showViewMoreLink) { retString += "true"; } else { retString += "false"; }
    retString += "'<br/> ";
    retString += "showFeaturedString = '";
    if (this.showFeaturedString) { retString += "true"; } else { retString += "false"; }
    retString += "'<br/> ";
   return retString;

}
// Get the tab state as a string
function getTabState() {
    // TFUNC16
    var retString = "";
    if (typeof (this.tabName) != "undefined" && this.tabName != "") {
        var arr = this.StateArray();
        if (ajaxpage.useMainHash) {
            for (var i = 0; i < arr.length; i++) {
                retString += i + "=";
                retString += arr[i];
                retString += "&";
            }
        } else {
            for (a in arr) {
                retString += a + "=";
                retString += arr[a];
                retString += "&";
            }
        }
    }
    return retString;
}
// Convert the tab state string into the tab state array
function ConverStringToTabState(unescapedStateString) {
    // TFUNC17
    if (ajaxpage.useMainHash) {
        unescapedStateString = unescape(unescapedStateString);
        var retArray = {};
        var stateArr = unescapedStateString.split("&");
        for (var s = 0; s < stateArr.length; s++) {
            var attr = stateArr[s].split("=");
            retArray[s] = unescape(attr[1]);
        }
        return retArray;
    } else {
        var retArray = {};
        var stateArr = unescapedStateString.split("&");
        for (var s = 0; s < stateArr.length; s++) {
            var attr = stateArr[s].split("=");
            retArray[attr[0]] = unescape(attr[1]);
        }
        return retArray;
    }
}
// Build the tab state array
function getTabStateArray() {
    // TFUNC18
    if (ajaxpage.useMainHash) {
        var retArray = new Array();
        retArray[0] = GetTabIndex(this.tabName);
        retArray[1] = this.tabID;
        retArray[2] = this.tabText;
        retArray[3] = this.bdspagecount;
        retArray[4] = this.bdsentitycount;
        retArray[5] = this.bdscurrentpage;
        retArray[6] = this.bdscurrentpagesize;
        retArray[7] = escape(this.ajaxUrl);
        retArray[8] = this.SortType;
        retArray[9] = this.returnUntranslated;
        retArray[10] = this.shallowAjaxLoad;
        retArray[11] = escape(this.ajaxSearchUrl);
        retArray[12] = escape(this.ajaxSearchUrlStub);
        return retArray;
    } else {
        var retArray = {
            "tabName": this.tabName,
            "tabID": this.tabID,
            "tabText": this.tabText,
            "bdspagecount": this.bdspagecount,
            "bdsentitycount": this.bdsentitycount,
            "bdscurrentpage": this.bdscurrentpage,
            "bdscurrentpagesize": this.bdscurrentpagesize,
            "ajaxUrl": escape(this.ajaxUrl),
            "SortType": this.SortType,
            "returnUntranslated": this.returnUntranslated,
            "shallowAjaxLoad": this.shallowAjaxLoad,
            "ajaxSearchUrl": escape(this.ajaxSearchUrl),
            "ajaxSearchUrlStub": escape(this.ajaxSearchUrlStub)
        };
        return retArray;
    }
}
function getBoolean(stateArrayValue) {
    if (typeof (stateArrayValue) != "undefined" && stateArrayValue != "") {
        if (stateArrayValue == "false") { return false; }
        if (stateArrayValue == "true") { return true; }
    }
    return false;
}
function GetTabIndex(tabname) {
    if (typeof(tabname) == "undefined") {
        tabname = ajaxpage.getActiveTabName();
    }
    var i = 0;
    for (tName in ajaxtabs) {
        if (tName == tabname) {
            return i;
        }
        i++;
    }
    return -1;
}
function GetTabNameFromIndex(tIdx) {
    var i = 0;
    for (tName in ajaxtabs) {
        if (i == tIdx) {
            return tName;
        }
        i++;
    }
    return "";
}
// Read state array into the Tab object
function setTabStateArray(stateArray) {
    // TFUNC19
    if (ajaxpage.useMainHash) {
        this.bdspagecount = new Number(stateArray[3]);
        this.bdsentitycount = new Number(stateArray[4]);
        this.bdscurrentpage = new Number(stateArray[5]);
        var cPSize = new Number(stateArray[6]);
        if (isNaN(cPSize)) {
            cPSize = stateArray[6];
        } else {
            this.bdscurrentpagesize = cPSize;
        }
        this.ajaxUrl = stateArray[7];
        this.SortType = stateArray[8];
        this.returnUntranslated = getBoolean(stateArray[9]);
        this.shallowAjaxLoad = getBoolean(stateArray[10]);
        this.ajaxSearchUrl = stateArray[11];
        this.ajaxSearchUrlStub = stateArray[12];
    } else {
        this.bdspagecount = new Number(stateArray["bdspagecount"]);
        this.bdsentitycount = new Number(stateArray["bdsentitycount"]);
        this.bdscurrentpage = new Number(stateArray["bdscurrentpage"]);
        var cPSize = new Number(stateArray["bdscurrentpagesize"]);
        if (isNaN(cPSize)) {
            cPSize = stateArray["bdscurrentpagesize"];
        } else {
            this.bdscurrentpagesize = cPSize;
        }
        this.ajaxUrl = stateArray["ajaxUrl"];
        this.SortType = stateArray["SortType"];
        this.returnUntranslated = getBoolean(stateArray["returnUntranslated"]);
        this.shallowAjaxLoad = getBoolean(stateArray["shallowAjaxLoad"]);
        this.ajaxSearchUrl = stateArray["ajaxSearchUrl"];
        this.ajaxSearchUrlStub = stateArray["ajaxSearchUrlStub"];
    }
}
// Set tab with state array
function SetTab(stateArray) {
    // PFUNC12
    var tabname = "";
    if (ajaxpage.useMainHash) {
        tabname = GetTabNameFromIndex(stateArray[0]);
    } else {
        tabname = stateArray["tabName"];
    }
    reportDebugMessage(tabname + " Set " + Date());
    ajaxtabs[tabname].SetStateArray(stateArray);
    if (ajaxtabs[tabname].isActiveTab) {
        ajaxtabs[tabname].isLoaded = false;
        ajaxLoadData(tabname, false);
    } else {
        backSetTab(tabname);
        //switchtab(tabname);
    }
}

// Tab State Storage for debugging.
var stateStorage = new Array();
var stateStorageMessage = new Array();
var stateCount = 0;
// Tab State Storage for debugging.
function storeState(pagestate) {
    stateStorage[stateCount] = ConverStringToTabState(unescape(pagestate));
    var tabname = "";
    if (ajaxpage.useMainHash) {
        tabname = getTabState(stateStorage[stateCount][0]);
    } else {
        tabname = stateStorage[stateCount]["tabName"];
    }
    reportDebugMessage(tabname + " Store " + Date());
    stateCount++;
}
// Tab State Storage display for debugging.
function showStoreState() {
    var str = "";
    for (var i = 0; i < stateCount; i++) {
        var arr = stateStorage[i];
        for (a in arr) {
            str += "" + a + " -- ";
            str += arr[a];
            str += "<br/>";
        }
    }
    $("#ajaxinfodata").html(str);
    return false;
}
function checkHash() {
    var checkPageState = document.location.hash.replace("#", "");
    if (lastStateStore != unescape(checkPageState)) {
        pageSetState(checkPageState);
    }
}
// Record tab state to the holder aspx page in the iframe
function recordState(pagestate) {
    // PFUNC13
    if (pagestate != "") {
        storeState(pagestate);
        lastStateStore = pagestate;
        if (ajaxpage.canSaveState) {
            if (ajaxpage.useMainHash) {
                ajaxpage.StartHashCheck();
                location.hash = escape(pagestate);
            } else {
                if ($(ajaxpage.HistoryIFrameID).length > 0) {
                    $(ajaxpage.HistoryIFrameID).attr("src", ajaxpage.ajaxHistoryUrl + "?state=" + escape(pagestate) + "&pagetitle=" + escape(ajaxpage.pageTitle));
                } else {
                    ajaxpage.canSaveState = false;
                }
            }
        }
    }
}
var lastStateStore = null;
// Read state into the page, if it does not match the current state, load the tabs.
function pageSetState(statestring) {
    // PFUNC14
    if (ajaxpage.canSaveState) {
        if (lastStateStore != null) {
            if (statestring == "") {
                if (ajaxpage.useMainHash) {
                    SetTab(ConverStringToTabState(unescape(lastStateStore)));
                } else {
                    SetTab(ConverStringToTabState(unescape(lastStateStore)));
                }
                lastStateStore = null;
            } else {
                if (statestring != lastStateStore) {
                    reportDebugMessage("last: " + lastStateStore);
                    reportDebugMessage("state: " + statestring);
                    lastStateStore = statestring;
                    SetTab(ConverStringToTabState(unescape(statestring)));
                }
            }
        }
    }
}
// Get the page/tab state
function pageState(tabname) {
    // PFUNC15
    var t = "";
    if (typeof (tabname) != "undefined") { t = tabname; }
    else { t = ajaxpage.getActiveTabName(); }
    if (t != "DetailDisplay") {
        var pagestate = escape(ajaxtabs[t].State());
        return pagestate;
    } else {
        return "";
    }
}
// Method of pageObject
function pageToString() {
    // PFUNC5
    var retString = "";
    retString += "ajaxReady = '";
    if (this.ajaxReady) { retString += "true"; } else { retString += "false"; }
    retString += "'<br/> ";
    retString += "debugMode = '";
    if (this.debugMode) { 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/>";
    retString += "visiblePageCount = '";
    if (this.visiblePageCount != null) { retString += this.visiblePageCount; } else { retString += "null"; }
    retString += "<br/>";
    retString += "shallowAjaxLoad = '";
    if (this.shallowAjaxLoad) { retString += "true"; } else { retString += "false"; }
    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, visible_page_count, shallow_ajax_load, debugMode) {
    // 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, visible_page_count, shallow_ajax_load, debugMode);
    if (ajaxpage.PageHistory != "") {
        lastStateStore = ajaxpage.PageHistory;
        //SetTab(ConverStringToTabState(unescape(ajaxpage.PageHistory)));
        }        
    ajaxpage.initializeConnectText();
    if (ajaxpage.ajaxReady) {
        buildTabs();
        $(ajaxpage.navID).find("[tabstate='" + ajaxpage.startingTab + "']").addClass(ajaxtabs[ajaxpage.startingTab.replace("#", "")].tabOnStyle);
        $("a[tabref]").bind("click", function() {
            return clicktab($(this));
        });
    }
    try {
        if (ajaxpage.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 showStoreState();\">Ajax History</a><br/>"
            ajaxDebugMenu += "<a href=\"#\" onclick=\"return ajaxStateObject();\">Ajax State</a><br/>"
            ajaxDebugMenu += "<a href=\"#\" onclick=\"return ajaxDebugObjects();\">Ajax Info</a><br/><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) { }
    // Fix for pages where results are immediately show specifically for back button support
    var resultPages = new Array("list.aspx", "meetourppl.aspx");
    var searchString = document.location.pathname.toLowerCase();
    var qString = document.location.search.toLowerCase();
    if (searchString.indexOf("attorneys") >= 0 && qString.length == 0) {
        searchString = ""; 
    }
    var runSetTab =true;
    for (var pg = 0; pg < resultPages.length; pg++) {
        var pagename = resultPages[pg];
        if (searchString.indexOf(pagename) >= 0) {
            runSetTab = false;
            break;
        }
    }
    if (runSetTab && ajaxpage.PageHistory != "") {
      SetTab(ConverStringToTabState(unescape(ajaxpage.PageHistory)));
    } else {
      if (document.location.hash != "") {
        var hashValue = document.location.hash.substr(1);
        if (ajaxtabs[hashValue] != null) {
          var isHidden = false;
          if (typeof (ajaxtabs[hashValue].tabOnStyle) == "undefined" || ajaxtabs[hashValue].tabOnStyle == "") { isHidden = true; }
          if (isHidden) {
            clicktab(hashValue, isHidden);
          } else {
            switchtab(hashValue);
          }
        }
      }
    }
    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 States
function ajaxStateObject() {
    if ($("#ajaxinfodata").html() == "") {
        var str = "";
        str = "<table style='border:1px solid white; width:300px;'>";
        var t = ajaxpage.getActiveTabName();
        str += "<tr><td valign='top' style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;padding-right:2px;width:30%;white-space:nowrap;'>" + t + " Array--</td>";
        str += "<td style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;white-space:normal;width:70%;'>";
        var arr = ajaxtabs[t].StateArray();
        for (a in arr) {
            str += "" + a + " -- ";
            str += arr[a];
            str += "<br/>";
        }
        str += "</td></tr>";
        str += "<tr><td valign='top' style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;padding-right:2px;width:30%;white-space:nowrap;'>" + t + " State--</td>";
        str += "<td style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;white-space:normal;width:70%;'>";
        str += ajaxtabs[t].State().replace(/&/gi, "& ");
        str += "</td></tr>";
        str += "<tr><td valign='top' style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;padding-right:2px;width:30%;white-space:nowrap;'>" + t + " Escaped--</td>";
        str += "<td style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;white-space:normal;width:70%;'>";
        str += escape(ajaxtabs[t].State());
        str += "</td></tr>";
        var tempTab = new tabObject("temp", "#mainnav", false, false, "", "");
        tempTab.SetStateArray(ConverStringToTabState(unescape(lastStateStore)));
        str += "<tr><td valign='top' style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;padding-right:2px;width:30%;white-space:nowrap;'>Temp State--</td>";
        str += "<td style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;white-space:normal;width:70%;'>";
        str += tempTab.State().replace(/&/gi, "& ");
        str += "</td></tr>";
        str += "<tr><td valign='top' style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;padding-right:2px;width:30%;white-space:nowrap;'>Comparison--</td>";
        str += "<td style='text-align:left;font:10px/12px Arial, sans-serif; color:#fff;white-space:normal;width:70%;'>";
        var liveArr = ajaxtabs[t].StateArray();
        var tempArr = tempTab.StateArray();
        str += "<table>";
        str += "<tr><td style='font-size:10px;'>Field</td><td style='font-size:10px;width:200px;'>" + t + "</td><td style='font-size:10px;width:200px;'>Temp</td></tr>";
        for (a in liveArr) {
            str += "<tr>";
            str += "<td style='font-size:10px;'>" + a + "</td>";
            if (a == "tabID") {
                str += "<td style='font-size:10px;'>" + liveArr[a].replace(/_/gi, "_ ") + "</td>";
            } else {
                str += "<td style='font-size:10px;'>" + liveArr[a] + "</td>";
            }
            str += "<td style='font-size:10px;'>" + tempArr[a] + "</td>";
            str += "</tr>";
        }
        str += "</table>";
        str += "</td></tr>";
        str += "</table>";
        $("#ajaxinfodata").html(str);
    } else {
        $("#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 (ajaxpage.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 passThroughParameter = "";
        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 {
                ajaxurl = AjaxRoot + "?CT=" + $("#tabdata_" + ajaxpage.tabArray[a]).attr("attype").toLowerCase() + "&";
                searchstub = AjaxRoot + "?CT=" + $("#tabdata_" + ajaxpage.tabArray[a]).attr("attype").toLowerCase() + "&";
            }

            try {
                passThroughParameter = $("#tabdata_" + ajaxpage.tabArray[a]).attr("passThroughParameter");
                if (passThroughParameter != "") {
                    passThroughParameter += "&";
                    ajaxurl += passThroughParameter;
                    searchstub += passThroughParameter;
                }
            } catch (err) {
            }
            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).find("span.ajaxpagecontrol").find("a[page='previous']").html(ajaxpage.getConnectText("ctPreviousLinkText") + "");
            $(tabid).find("span.ajaxpagecontrol").find("a[page='next']").html("" + ajaxpage.getConnectText("ctNextLinkText"));
            $(tabid).find("span.ajaxpagecontrol").find("a[page='all']").html("" + ajaxpage.getConnectText("ctViewAllResultsLinkText") + "");
            $(tabid).find("span.ajaxpagecontrol").find("a[page='more']").html("" + ajaxpage.getConnectText("ctViewAllResultsLinkText") + "");
            $(tabid).find("span.featuredcontent").hide();
            // page="previous"
            // page="next"
            // page="all"
        }
        ajaxtabs[tabtitle] = new tabObject(tabtitle, tabid, startup, useajax, ajaxurl, searchstub);
        if (useajax) {
            try {
                var returnUntrans = $("#tabdata_" + ajaxpage.tabArray[a]).attr("returnuntranslated");
                if (typeof (returnUntrans) != "undefined") {
                    if (returnUntrans.toLowerCase() != "true") {
                        ajaxtabs[tabtitle].returnUntranslated = false;
                    }
                }
            } catch (Err) {
            }
        }
        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;
            }
        }
    }
        var onTab = "";
        for (t in ajaxtabs) {
            if (t != ajaxpage.startingTab) { $(ajaxtabs[t].tabID).hide(); }
            else { $(ajaxtabs[t].tabID).show();}
        }
    if (ajaxpage.isEditMode != "") {
        $(ajaxpage.loadingImageSelector).css("display", "none");
    } else {
        if (ajaxpage.loadAtStart) {
            var qString = document.location.search.replace("?", "");
            if (ajaxpage.PageHistory != "") {
                SetTab(ConverStringToTabState(unescape(ajaxpage.PageHistory)));
            } else {
            ajaxtabs[ajaxpage.startingTab].SetSearchUrl(qString);
                ajaxLoadData(ajaxpage.startingTab);
            }
            //get qstring
            if (ajaxpage.useAjaxBreadcrumbs){
                $(ajaxpage.ajaxBreadcrumbSelector).html(ajaxtabs[ajaxpage.startingTab.replace("#","")].tabText);
            }  
        } else {
            $(ajaxpage.loadingImageSelector).hide();
            if (ajaxpage.PageHistory == "") {
                recordState(ajaxtabs[ajaxpage.startingTab].State());
            }
        }
    }
}
// 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 backSetTab(tabname) {
    clicktab($("a[tabref='" + tabname + "']"), null, true);
}
function clicktab(clickitem, isHiddenTab, isBackButton) {
    // 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 (isBackButton == null) { isBackButton = false; }
        if (!loadingLock) {
            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;
                    if (typeof (ajaxtabs[oldtabname].tabOnStyle) != "undefined" && ajaxtabs[oldtabname].tabOnStyle != "") {
                    $(ajaxpage.navID).find("[tabstate='" + oldtabname + "']").removeClass(ajaxtabs[oldtabname].tabOnStyle);
                    }
                    if (typeof (ajaxtabs[oldtabname].tabOffStyle) != "undefined" && ajaxtabs[oldtabname].tabOffStyle != "") {
                        $(ajaxpage.navID).find("[tabstate='" + oldtabname + "']").addClass(ajaxtabs[oldtabname].tabOffStyle);
                    }
                    if (!isHiddenTab) {
                      if (typeof (ajaxtabs[tabname].tabOffStyle) != "undefined" && ajaxtabs[tabname].tabOffStyle != "") {
                            $(ajaxpage.navID).find("[tabstate='" + tabname + "']").removeClass(ajaxtabs[tabname].tabOffStyle);
                        }
                        if (typeof (ajaxtabs[tabname].tabOnStyle) != "undefined" && ajaxtabs[tabname].tabOnStyle != "") {
                        $(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);
            }
            // if we are currently in an edit mode, DO NOT LOAD AJAX DATA!
            if (ajaxpage.isEditMode == "") {
            // Run Ajax Load
                if (!isBackButton) {
                    recordState(ajaxpage.State());
            }
                ajaxLoadData(tabname, false);
                }
                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);
                }
            if (ajaxtabs[tabname].ExecuteAfterTabSwitch != "") {
                var fnCall = ajaxtabs[tabname].ExecuteAfterTabSwitch;
                try { eval(fnCall); } catch (er) { }
            }
        }
    } 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");
        }
    } 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, saveState) {
    // 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 (typeof (saveState) != "undefined") {
        if (saveState) {
            recordState(ajaxpage.State());
        }
    } else {
        recordState(ajaxpage.State());
    }
    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;
            } else {
                // If the page is set to ShallowAjaxLoad, pass that variable through - set in TabStripMasterControl
                if (ajaxpage.shallowAjaxLoad && ajaxtabs[tabname].shallowAjaxLoad) {
                    ajaxUrl += "&shallow=true";
                }
            }
            if (!ajaxtabs[tabname].returnUntranslated) {
                ajaxUrl += "&returnuntranslated=false";
            }
            // Include sort to QueryString, if necessary
            if (ajaxtabs[tabname].SortType != "") {
                ajaxUrl += "&sort=" + ajaxtabs[tabname].SortType;
            }
            reportDebugMessage(tabname + ": url: " + ajaxUrl + " -- " + Date());
            // Function to perform Data Chunking if user obtains a large number of results.
            if (ajaxtabs[tabname].bdscurrentpagesize == "all") {
                if ($(ajaxtabs[tabname].tabID + " span[featured='" + tabname + "']").length > 0) {
                    $(ajaxtabs[tabname].tabID + " span[featured='" + tabname + "']").hide();
                }
            }
            LoadDataToTab(tabname, ajaxUrl, unloadCurrentData, currentPage, currentPageSize, 0);
        }
    }
}
// On the First return of data from the Chunking, we know how many records and pages there
// are.  This records that data and sets up the paging and tab functionality for the rest of 
// the page.
function PostLoadDataToTab_FirstChunk(tabname, currentPage, currentPageSize) {
    // PFUNC8
    // 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);
}
// On the Last return of data from the Chunking, run the ExecuteAfterAjaxLoad
function PostLoadDataToTab_LastChunk(tabname, currentPage, currentPageSize) {
    // PFUNC11
    reportDebugMessage(tabname + ": AjaxComplete -- " + Date());
    if (ajaxtabs[tabname].ExecuteAfterAjaxLoad != "") {
        var fnCall = ajaxtabs[tabname].ExecuteAfterAjaxLoad;
        try { eval(fnCall); } catch (er) { }
    }
}
// Update the "Showing records" string while loading chunks of data.
function updateShowingString(tabname, minResultsDisplay, maxResultsDisplay, maxResultsCount) {
    // PFUNC9
    var displayString = "";
    if (maxResultsCount < maxResultsDisplay) {
        displayString = minResultsDisplay + "-" + maxResultsCount;
    } else {
        displayString = minResultsDisplay + "-" + maxResultsDisplay;
    }

    var showingString = ajaxpage.getConnectText("ctShowingResultsText");
    if (showingString != "") {
        showingString = showingString.replace("%PAGERANGE%", displayString);
        showingString = showingString.replace("%TOTALRESULTS%", maxResultsCount);
    } else {
        showingString = ajaxpage.showingString;
        showingString = showingString.replace("%X%", displayString);
        showingString = showingString.replace("%Y%", maxResultsCount);
    }
    if (ajaxtabs[tabname].showViewMoreLink) {
        if (ajaxtabs[tabname].featuredString != null && ajaxtabs[tabname].featuredString != "") {
            $(ajaxtabs[tabname].tabID + " .showingNum, " + ajaxtabs[tabname].tabID + " .loadingText").html("<b>" + ajaxtabs[tabname].featuredString + "</b>");
        } else {
            $(ajaxtabs[tabname].tabID + " .showingNum, " + ajaxtabs[tabname].tabID + " .loadingText").html("");
        }
    } else {
        $(ajaxtabs[tabname].tabID + " .showingNum, " + ajaxtabs[tabname].tabID + " .loadingText").html(showingString);
    }
    if (ajaxtabs[tabname].showFeaturedString) {
        $(ajaxtabs[tabname].tabID + " span.featuredcontent").show();
    } else {
        $(ajaxtabs[tabname].tabID + " span.featuredcontent").hide();
    }    
    $(ajaxtabs[tabname].tabID + " .loadingText").show();
}
// Actually performs the data chunking for large amounts of data.  Will load records
// 100 at a time if there are more than that returned.
function LoadDataToTab(tabname, url, unloadCurrentData, currentPage, currentPageSize, entityCount) {
    // PFUNC10
    var ajaxQuery = url;
    var chunk = ajaxpage.defaultPageSize;
    var maxNumberOfEntities = 0;
    var currentPageChunk = currentPage;
    if (typeof(entityCount) != "undefined") {
        maxNumberOfEntities = entityCount;
    }
    if (currentPageSize == "all") {
        chunk = 100;
    } else {
        chunk = currentPageSize;
    }
    reportDebugMessage(tabname + ": " + currentPage + "/" + chunk + " -- " + Date());
    ajaxQuery += "&pagesize=" + chunk + "&page=" + currentPageChunk;
    $.ajax({
        async: true,
        url: ajaxQuery,
        dataType: "text",
        success: function(data, textStatus) {
                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"
                reportDebugMessage(tabname + ": " + "No results start");
                $("#tabdata_" + tabname).find("[ajax]").remove();
                    unloadCurrentData = false;
                    clearPageIndex(tabname);
                $("#tabdata_" + tabname).hide();
                $(ajaxpage.loadingImageSelector).hide();
                ajaxtabs[tabname].isLoaded = false;
                loadingLock = false;
                reportDebugMessage(tabname + ": " + "No results end");
                } else {
                var localPageCount = new Number($returnData.find("#pagecount").text());
                if (maxNumberOfEntities == 0) {
                    // Get the page count from the returned AJAX Call
                    if (currentPageSize != "all") {
                        $returnData.find("#pagecount").each(function(index, datarow) {
                            ajaxtabs[tabname].bdspagecount = new Number($(datarow).html());
                        });
                    } else {
                        ajaxtabs[tabname].bdspagecount = 1;
                    }
                    // Get the entity results count from the returned AJAX Call
                    $returnData.find("#resultcount").each(function(index, datarow) {
                        ajaxtabs[tabname].bdsentitycount = new Number($(datarow).html());
                    });
                    // Get the "You Searched For" String
                    $returnData.find("#searchcriteria").each(function(index, datarow) {
                        ajaxtabs[tabname].YouSearchedFor = $(datarow).html();
                    });
                        if (unloadCurrentData) {
                            if (!ajaxpage.ClearBeforeAjax) {
                            $("#tabdata_" + tabname).find("[ajax]").remove();
                            }
                            unloadCurrentData = false;
                            clearPageIndex(tabname)
                        }
                    ajaxtabs[tabname].showViewMoreLink = false;
                    $returnData.find("#showviewmore").each(function(index, datarow) {
                        var viewmore = $(datarow).html();
                        if (typeof (viewmore) != "undefined") {
                            if (viewmore.toLowerCase() == "true") {
                                ajaxtabs[tabname].showViewMoreLink = true;
                        }
                }
                });
                PostLoadDataToTab_FirstChunk(tabname, currentPage, currentPageSize);
                }
                // Data was returned, load the returned HTML into the indicated Tab
                $("#tabdata_" + tabname).show();
                $(ajaxtabs[tabname].tabID + " .noresultsmessage").hide();
                var renderIN = "";
                var searchFor = "";
                if ($("#tabdata_" + tabname).is("table")) {
                    renderIN = "#tabdata_" + tabname + " > tbody";
                    searchFor = "tr";
                } else if ($("#tabdata_" + tabname).is("ul")) {
                    renderIN = "#tabdata_" + tabname;
                    searchFor = "li";
                } else if ($("#tabdata_" + tabname).is("div")) {
                    renderIN = "#tabdata_" + tabname;
                }
                searchFor += "[ajax='true']"
                $returnData.find(searchFor).appendTo(renderIN);
                reportDebugMessage(tabname + ": " + currentPage + "/" + chunk + " -- " + Date());
                if (currentPageSize == "all") {
                    var totalEntityCount = ajaxtabs[tabname].bdsentitycount;
                    if (currentPageChunk < (localPageCount - 1)) {
                        if ((chunk * currentPageChunk) < totalEntityCount) {
                            updateShowingString(tabname, 1, ((currentPageChunk + 1) * chunk), ajaxtabs[tabname].bdsentitycount);
                            LoadDataToTab(tabname, url, unloadCurrentData, (currentPageChunk + 1), "all", ajaxtabs[tabname].bdsentitycount);
                }
                    } else {
                        PostLoadDataToTab_LastChunk(tabname, currentPage, currentPageSize);
                        updateShowingString(tabname, 1, ajaxtabs[tabname].bdsentitycount, ajaxtabs[tabname].bdsentitycount);
                // Mark this Tab as "loaded" 
                ajaxtabs[tabname].isLoaded = true;
                // Hide the loading image 
                $(ajaxpage.loadingImageSelector).hide();
            // Unlock the Tab Strip navigation
            loadingLock = false;
        }
                } else {
                    updateShowingString(tabname, (currentPageSize * currentPage) + 1, ((currentPageSize * currentPage) + currentPageSize), ajaxtabs[tabname].bdsentitycount);
                    PostLoadDataToTab_LastChunk(tabname, currentPage, currentPageSize);
                    // Mark this Tab as "loaded" 
                    ajaxtabs[tabname].isLoaded = true;
                    // Hide the loading image
                    $(ajaxpage.loadingImageSelector).hide();
                    // Unlock the Tab Strip navigation
                    loadingLock = false;
                }
            }
            $returnData.remove();
        },
        complete: function() {
            if (entityCount == 0) {
            }
        },
        error: function(req, status, err) {
            alert(err.Description);
    } 
    });
}
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 = new Number(ajaxtabs[tabname].bdscurrentpage);
        var currentPageSize = ajaxtabs[tabname].bdscurrentpagesize;
        var pageCount = ajaxtabs[tabname].bdspagecount;
        var entityCount = ajaxtabs[tabname].bdsentitycount;
        var visiblePageCount = ajaxpage.visiblePageCount;
        var visiblePageCountHalf = Math.round(visiblePageCount / 2);
        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 (ajaxtabs[tabname].showViewMoreLink) {
            $(ajaxtabs[tabname].tabID + " .viewall a[page='more']").show();
            $(ajaxtabs[tabname].tabID + " .viewall a.viewAllLinkStart, " + ajaxtabs[tabname].tabID + " .viewall a.viewAllLinkEnd").show();
        } else {
            $(ajaxtabs[tabname].tabID + " .viewall a[page='more']").hide();
            }
        if (pageCount > visiblePageCount) {
            if ((currentPage+1) > visiblePageCountHalf) 
            {
                startPagePrint = (currentPage + 1) - visiblePageCountHalf;
            }
            if (currentPage > (pageCount - visiblePageCountHalf)) {
                startPagePrint = pageCount - visiblePageCount; 
            }
            endPagePrint = startPagePrint + visiblePageCount;
            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 > visiblePageCount) { $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist").append("<span class=\"showmoreprev\"> ...</span>"); }
            //for (var a = 0; a < pageCount; a++)
            for(var a = startPagePrint; a < endPagePrint; a++)
            {
                var pageString = "";
                //if (a == startPagePrint && showMorePrevPages) { pageString += ' ... | '; }
                if (a > startPagePrint) {
                    pageString += " ";
                }
                pageString += '<a href="#" page="' + a + '">' + (a+1);
                if ((a+1) < pageCount && (a+1) < endPagePrint) {
                    pageString += ' | ';
                }
                pageString += "</a>";
                if ((a + 1) < endPagePrint) {
                }
                 //if (a == (endPagePrint-1) && showMoreNextPages) { pageString += ' | ...'; }
                 $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist").append(pageString);
            }
            if (pageCount > visiblePageCount) { $(ajaxtabs[tabname].tabID + " .pageIndex .bdsresultspagelist").append("<span class=\"showmorenext\">... </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();} 
        $(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(); 
        }  
    } 
}
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;
        var forceReload = false;
            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" || action == "more") {
                currentPage = 0;
                currentPageSize = "all";
            if (action == "more") {
                ajaxtabs[tabname].shallowAjaxLoad = false;
                forceReload = true;
            }
                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) || (currentPageSize == "all") || forceReload) {
                ajaxtabs[tabname].bdscurrentpage = currentPage;
                ajaxtabs[tabname].bdscurrentpagesize = currentPageSize;
                ajaxtabs[tabname].isLoaded = false;
                    ajaxLoadData(tabname);
            }
        }
    } 
    return false; 
}
// Functions for AjaxSearchFilterControl text input box
function focusTextBox(clickitem) {
    // ASFUNC1
    var init = "";
    if ($(clickitem).attr("defaultvalue") != null) {
        init = $(clickitem).attr("defaultvalue");
    } else {
        init = $(clickitem).val();
        $(clickitem).attr("defaultvalue", init);
    }
    if ($(clickitem).val() == init) { $(clickitem).val(""); }
}
function blurTextBox(clickitem) {
    // ASFUNC2
    var init = "";
    if ($(clickitem).attr("defaultvalue")) { init = $(clickitem).attr("defaultvalue"); }
    if ($(clickitem).val() == "") { $(clickitem).val(init); }
}
// Reset the search to the initial page load
function resetSearch(criteriaJQSelector) {
    // ASFUNC3
    $(criteriaJQSelector).each(function(i, domitem) {
        var init = "";
        if ($(domitem).is("select")) {
            if ($(domitem).attr("size") != "") {
                $(domitem).attr("selectedIndex", "-1");
            } else {
                $(domitem).attr("selectedIndex", "0");
            }
        }
        if ($(domitem).is("input")) {
            if ($(domitem).attr("defaultvalue")) { init = $(domitem).attr("defaultvalue"); }
        domitem.value = init;
        }
        if ($(domitem).attr("controltype") == "radio") {
            $(domitem).children("input").attr("checked", false);
        }
    });
}
// 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 isMultiple = $(domitem).attr("multiple");
            if (typeof (isMultiple) != "undefined" && isMultiple != null && isMultiple != "" && isMultiple == "multiple") {
                isMultiple = "true";
            }
            var dText = $(domitem).attr("defaultvalue");
            var cText = $(domitem).children(":selected").attr("text");
            var cValue = "";
            if ($(domitem).children(":selected").length > 1) {
                $(domitem).children(":selected").each(function(m, selectoption) {
                    var selectedValue = $(selectoption).attr("value");
                    if (selectedValue != dText && selectedValue != "") {
                        if (cValue != "") { cValue += ","; }
                        cValue += selectedValue;
                    }
                });
            } else {
                cValue = $(domitem).children(":selected").attr("value");
            }
            var iValue = $(domitem).attr("initialvalue");
            if (typeof (cValue) != "undefined" && cValue != "") {
                if (dText != cText && dText != cValue) {
                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 = encodeURI( $.trim(cValue));
                searchItem = true;
            }
        }
        if (tagType == "radiobutton") {
            if ($(domitem).attr("checked")) {
                qValue = $(domitem).val();
                searchItem = true;
            }
        }
        if (searchItem) {
            if (searchQString.length > 0) { searchQString += "&"; }
            searchQString += criteriaName + "=" + 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 + "=" + escape(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
                {
                    var currentSelected = -1;
                    var currentValue = "";
                    var currentText = "";
                    if (getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").length > 0) {
                        currentSelected = getTypeAheadListElement(targetJQueryElement).children(".typeaheadselected").attr("idx");
                        if (currentSelected != -1) {
                            currentValue = getTypeAheadListElement(targetJQueryElement).children("[idx='" + currentSelected + "']").attr("value");
                            currentText = getTypeAheadListElement(targetJQueryElement).children("[idx='" + currentSelected + "']").text();
                        }
                    }                   
                    $(targetJQueryElement).attr("value", currentText).data("typeaheadselectedvalue", currentValue);
                }
            }
                
            clearTypeAheadDropDown(targetJQueryElement);
            processSelectedTypeAhead(targetJQueryElement);
        }
        valueSelected = true;
        isControlKey = true;
    }
    else
    {
        // If this is not the enter key clear the selected value
        if($(this).data("typeaheadselectedvalue") != undefined) {
                $(this).removeData("typeaheadselectedvalue");
        }    
    }
    // 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;
}

