﻿/// <reference path="ajax.js"/>

/***********
    TITLE:      fnDisplayAlert
    AUTHOR:     Steven Ciarleglio
    PURPOSE:    This function should be called at any point 
                when the user should be displayed a message box 
                in the application.
***********/
function fnDisplayAlert(alertType)
{
    switch(alertType)
    {
        case "DeniedPermission":
            alert("You do not have permission to this application.");
            window.close();
            break;
        case "TimedOut":
            alert("Your session has expired. Please login again.");
            window.close();
            break;
        case "LoggedOut":
            alert("You have successfully logged out.");
            window.close();
            break;
    }
}
/***********
    TITLE:      fnOpenReportWindow
    AUTHOR:     Steven Ciarleglio
    PURPOSE:    This function opens a
                report in a new window. 
***********/
function fnOpenReportWindow(reportURL)
{
    window.open(reportURL);
}
/***********
    TITLE:      fnJavascriptLink
    AUTHOR:     Steven Ciarleglio
    PURPOSE:    Emulates a link by changing the 
                class onmouseover and onmouseout
***********/

function fnJavascriptLink(ElementID,State)
{
    if(State=="ON")
    {
        document.getElementById(ElementID).className='javascriptLinkON';
    }
    else if (State=="OFF")
    {
        document.getElementById(ElementID).className='javascriptLinkOFF';
    }
}


function fnShowCalendar(LocationDiv,ReturnElementID,HiddenTextField)
{
    document.getElementById(HiddenTextField).value=ReturnElementID;
    document.getElementById(LocationDiv).style.display = "block";
}
function fnHideCalendar(LocationDiv)
{
    document.getElementById(LocationDiv).style.display = "none";
}
function fnAssignDateValue(LocationDiv,dateValue,HiddenTextField)
{    
    document.getElementById(document.getElementById(HiddenTextField).value).value = dateValue;
    document.getElementById(LocationDiv).style.display = "none";
}

function fnOpenReportDetails(ReportID,DetailsType,DetailsStoredProcedure,Parameters, ExtraParams, title)
{
    var LoadURL = new String();
    var EncodedURL = new String();    
    Parameters = escape(Parameters);
    
    
//    alert(ReportID);
//    alert(DetailsType);
//    alert(DetailsStoredProcedure);
//    alert(Parameters);
     
    LoadURL = "../LoadingPage.aspx?url=";
    EncodedURL = "priceREPORTS/"+DetailsType+".aspx"
        +"?ReportID="+ReportID
        +"&DetailsType="+DetailsType
        +"&DetailsStoredProcedure="+DetailsStoredProcedure
        +"&Parameters="+Parameters
        +ExtraParams;
        
        
    EncodedURL = EncodedURL.replace(/\*/g, '{ASTERISK}');   // encoding * since javascript don't like it
    EncodedURL = encodeURIComponent(EncodedURL);
    LoadURL = LoadURL + EncodedURL;
    
    document.getElementById("ctl00_cph_UcDetailViewer1_ifReportDetails").src=LoadURL;    
    document.getElementById("reportDetailsHeader").innerText = title;                   
    $get("ctl00_cph_UcDetailViewer1_btnDummy").click();  
}



function fnLoadpricePALPortal(FlashVars)
{
    var so = new SWFObject("../media/pricePAL.swf","pricePALPortal","800","600","8","#000000");
    so.addParam("allowScriptAccess","always");
    so.addParam("loop","false");
    so.addParam("quality","high");
    so.addParam("devicefont","true");
   
    var fVars = new Array();
    fVars = FlashVars.split("&");
    
    for(i=0;i<fVars.length;i++)
    {
        var fVar = new Array();
        fVar = fVars[i].toString().split("=");
        so.addVariable(fVar[0],fVar[1]);
    }
    
    so.write("FlashContent");
}

function fnExecutePortalAction(Access,AppID,AppPath,AppError)
{  
    switch(Access)
    {
        case "GRANTED":
            var LoadURL = new String();
            LoadURL = "LoadingPage.aspx?url=";
            AppPath = escape(AppPath);            
            LoadURL = LoadURL + AppPath;            
            window.open(LoadURL,AppID,"width=800,height=580,status=yes,scrollbars=yes,resizable=yes,toolbar=no,location=no,directories=no");
            break;
        case "DENIED":
            alert("The "+AppError+" application is unavailable.");
            break;
        case "LOGOUT":
            alert("You have been logged out.");            
            window.close();
            break;        
    }
}


/***********
    TITLE:      fnOpenFacilityItemDetails()
    AUTHOR:     Yeng Yang
    PURPOSE:    Loads facility item details into a details iFrame.
***********/
function fnOpenFacilityItemDetails(itemID, facilityList, appID, guid)
{
    //need browser checking here
    document.getElementById("ctl00_cph_ModalIFramePopupView_modalIFrame").src="../LoadingPage.aspx?url="
        +"everyCAT*FacilityItemDetails.aspx~"
        +"UID="+guid
        +"^facilitylist="+facilityList
        +"^itemid="+itemID
        +"^appid="+appID;

    
    $get("ctl00_cph_ModalIFramePopupView_dummyButton").click();  
}
/***********
    TITLE:      fnOpenVendorContactDetails()
    AUTHOR:     Yeng Yang
    PURPOSE:    Loads vendor contact details into a details iFrame.
***********/
function fnOpenVendorContactDetails(companyID, facilityList, appID, guid, iframeID, buttonID)
{
    //need browser checking here
    document.getElementById(iframeID).src="../LoadingPage.aspx?url="
        +"vendorPHONEBOOK*VendorContactDetails.aspx~"
        +"UID="+guid
        +"^facilitylist="+facilityList
        +"^companyid="+companyID
        +"^appid="+appID;

    
    $get(buttonID).click();  
}
/***
Title: fnOpenModalIFrameView()
Author: Yeng Yang
Description: This function loads a url the ModalIFrameView.
***/
function fnOpenModalIFrameView(sourceURL, iframeID, buttonID){
    // set iframe source
    var iframe = $get(iframeID);
    var viewButton = $get(buttonID);
    if (iframe && viewButton){
        iframe.src = sourceURL;
        viewButton.click();
        
    }// if
}
/********************
    Title: fnEnterKeyPressSubmit()
    Author: Yeng Yang
    Purpose: This function is for a onkeypress event. It catches
            the key press event and checks to see if the key pressed
            was the enter key. If it was the enter key it does a postback
            calling the events of the submitButtonID. If the submitButtonID
            is empty the enter keypress is ignored.
**********************/
function fnEnterKeyPressSubmit(e, submitButtonID){

    if(e) {
       var charCode = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0));
       if (charCode == 13){  
            if (submitButtonID != ""){ 
                __doPostBack(submitButtonID,'');
            }// if
            return false;
        }// if
    }// if
}

/*******************
    Title: fnSetVisibility()
    Author: Yeng Yang
    Purpose: Sets the visibility of a control.
    Parameters: controlID - id of control to set
                visibleBool - bool flag for visibiliby
*******************/
function fnSetVisibility(controlID, visibleBool){

    var control = document.getElementById(controlID);
    
    if (control != null && control != undefined){    
        if (visibleBool){
            document.getElementById(controlID).style.visibility = "visible";
        }else{
            document.getElementById(controlID).style.visibility = "hidden";
        }// if-else
    }// if-else
}

/****************
    Title: fnToggleVisibility(controlID)
    Author: Yeng Yang
    Purpose: Toggles the visibility of a control on and off.
    Parameters: controlID - id of control to toggle
****************/
function fnToggleVisibility(controlID){
    
    var control = document.getElementById(controlID);
    if (control != null && control != undefined){
        if(control.style.visibility == "visible"){
            fnSetVisibility(controlID, false);
        }else{
            fnSetVisibility(controlID, true);
        }// if-else
    }// if-else

}

/***********
    Title: fnPositionUnderParent()
    Author: Yeng Yang
    Purpose: Positions an element under a parent element.
    Parameters: parentID - id of parent to position under
                controlID - id of element to position
                topOffset - top offset for positioning element
                leftOffset - left offset for positioning element
***********/
function fnPositionUnderParent(parentID, controlID, topOffset, leftOffset){
    
    var control = document.getElementById(controlID);
    
    if (control != null){
        control.style.top = findPosY(parentID) + topOffset + "px";
        control.style.left = findPosX(parentID) + leftOffset + "px";
    }
    
}

/***********
    Title: fnPositionUnderRelativeParent()
    Author: Yeng Yang
    Purpose: Positions an element under a parent element.
    Parameters: positionEleID - id of element to position under
                controlID - id of element to position
                topOffset - top offset for positioning element
                leftOffset - left offset for positioning element
                controlAnchorPosition - "top"/"bottom"
***********/
function fnPositionElement(positionEleID, controlID, topOffset, leftOffset, controlAnchorPosition){
    
    var control = document.getElementById(controlID);
    var parent = document.getElementById(positionEleID);
    
    if (control != null){
        var pos = findRelativePos(positionEleID, controlID);
        control.style.left = pos.x + leftOffset + "px";
        
        if (controlAnchorPosition == "bottom"){
            control.style.top = pos.y + topOffset - control.offsetHeight + "px";
        }else{
            control.style.top = pos.y + topOffset + "px";
        }// if-else
    }
    
}

/************
    Title: fnStopPropagation()
    Author: Yeng Yang
    Purpose: This function stops the propagation of an event.
    Parameters: curEvent - the calling event
************/
function fnStopPropagation(curEvent){
    if (curEvent.stopPropagation){
        curEvent.stopPropagation();
        curEvent.preventDefault();
    }else{
        curEvent.cancelBubble = true;
    }// if-else
}

/*****
    Title: fnFreezeGridViewHeader()
    Author: Yeng Yang
    Purpose: This function uses javascript to simulate the freezing of a gridview header.
             Though this freezes the header, some flickering can still be seen.
    Parameters: gridViewId - client id of gridview
                scrollContainerId - id of scroll container gridview is contained in
                columnIndex - index of row to freeze
*****/
function fnFreezeGridViewHeader(gridViewId, scrollContainerId, columnIndex, freezeCol){
 
    // get control handles
    var grid = document.getElementById(gridViewId);
    var scrollContainer = document.getElementById(scrollContainerId);
    
    if (grid && scrollContainer){
        var parentContainer = scrollContainer.parentNode;
        
        // get gridview headers
        var gvRows = grid.getElementsByTagName("tr");
        var headerTags;
        if (gvRows[0]){
            headerTags = gvRows[0].getElementsByTagName("th");
        }// if  
        
        if (typeof freezeCol == "undefined"){
            freezeCol = true;
        }
        
        // flags
        var freezeColumns = freezeCol && (gvRows.length > 1 && parentContainer && scrollContainer && gvRows.length > 0 && columnIndex > -1 && headerTags[columnIndex]);
        var freezeHeaders = (gvRows.length > 1 && parentContainer && scrollContainer && grid && headerTags);
        
        var frozenColumnsContainer = null
        var frozenHeaderColumn = null;
        var frozenColumns = null;
        var headerHeight;
        var scrollWidth = parseInt(parentContainer.offsetWidth) - 2;
        var newScrollWidth = scrollWidth;
        
        // freeze gridview column
        if (freezeColumns){
        
            headerHeight = parseInt(gvRows[0].offsetHeight);
            if (gvRows.outerHTML){
                headerHeight -= 5;
            }// if
        
            var headerRow = gvRows[0];
            var colPixelWidth = headerRow.cells[columnIndex].offsetWidth;
            var w = colPixelWidth/scrollWidth; // get column width
            newScrollWidth = (scrollWidth - headerRow.cells[columnIndex].offsetWidth)/scrollWidth;    // subtract column width from scroll container width
            
            if (w < .15){
                w = .15;
                newScrollWidth = .85;
            }// if
            
            // build frozen header column table
            var frozenHeaderColStr = new Array();
            var fhcCounter = 0;
            frozenHeaderColStr[fhcCounter++] = "<table cellPadding = '";
            frozenHeaderColStr[fhcCounter++] = grid.cellPadding;
            frozenHeaderColStr[fhcCounter++] = "px' cellSpacing = '";
            frozenHeaderColStr[fhcCounter++] = grid.cellSpacing;
            frozenHeaderColStr[fhcCounter++] = "px' border = '";
            frozenHeaderColStr[fhcCounter++] = grid.border;
            frozenHeaderColStr[fhcCounter++] = "px' style = 'border-collapse:";
            frozenHeaderColStr[fhcCounter++] = grid.style.borderCollapse;
            frozenHeaderColStr[fhcCounter++] = "; width:100%;'><tr class='";
            frozenHeaderColStr[fhcCounter++] = headerRow.className;
            frozenHeaderColStr[fhcCounter++] = "' style='height:";
            frozenHeaderColStr[fhcCounter++] = headerHeight;
            frozenHeaderColStr[fhcCounter++] = "px;'><th scope='col'>";
            frozenHeaderColStr[fhcCounter++] = headerRow.cells[columnIndex].innerHTML;
            frozenHeaderColStr[fhcCounter++] = "</th></tr></table>";
            
            // create frozen header column
            frozenHeaderColumn = document.createElement("div");
            frozenHeaderColumn.className = "freezeStyle";       
            frozenHeaderColumn.innerHTML = frozenHeaderColStr.join('');
            frozenHeaderColumn.style.width = (w * 100) + "%";
            gvRows[0].cells[columnIndex].style.width = colPixelWidth + "px";
            
            // create frozen columns
            frozenColumns = document.createElement("div");
            frozenColumns.id = gridViewId + "_FrozenColumns";
            frozenColumns.style.width = (w * 100) + "%";
            
            // build frozen column table
            var col = new Array();
            var colCounter = 0;
            col[colCounter++] = "<table id='";
            col[colCounter++] = gridViewId;
            col[colCounter++] = "_FrozenColumns'";
            col[colCounter++] = " cellPadding = '";
            col[colCounter++] = grid.cellPadding;
            col[colCounter++] = "px' cellSpacing = '";
            col[colCounter++] = grid.cellSpacing;
            col[colCounter++] = "px' border = '";
            col[colCounter++] = grid.border;
            col[colCounter++] = "px' style = 'border-collapse:";
            col[colCounter++] = grid.style.borderCollapse;
            col[colCounter++] = "; width:100%;'>";
            
            var cell;
            var colHeight = 0;
            var rowCount = gvRows.length;
            var curRow;
            
            // add cells to column
            for (var i = 1; i < rowCount; i++){
                cell = gvRows[i].cells[columnIndex];
                colHeight = parseInt(cell.offsetHeight);
                curRow = gvRows[i];
                
                if (cell.outerHTML){
                    // do for ie
                    colHeight -= 5;
                }// if
                
                col[colCounter++] = "<tr class='";
                col[colCounter++] = curRow.className;
                col[colCounter++] = "' style='height: ";
                col[colCounter++] = cell.offsetHeight;
                col[colCounter++] = "px;'><td>";
                col[colCounter++] = cell.innerHTML;
                col[colCounter++] = "</td></tr>";
                                                      
                curRow.style.height = cell.offsetHeight + "px";
                curRow.deleteCell(columnIndex);
                                     
            }// for
            col[colCounter++] = "</table>";
            
            frozenColumnsContainer = document.createElement("div");
            frozenColumnsContainer.className = scrollContainer.className + " freezeStyle";
            frozenColumnsContainer.style.overflow = "hidden";
            frozenColumnsContainer.style.width = (w * 100) + "%";
            frozenColumnsContainer.style.position = "relative";
            frozenColumnsContainer.innerHTML = col.join('');
            
            // delete header column        
            headerRow.deleteCell(columnIndex); // delete frozen header column from original header
            
        }// if
        
        
        var frozenHeaders = null;    
        // freeze gridview header
        if (freezeHeaders){   
            
            frozenHeaders = document.createElement("div")
            frozenHeaders.className = grid.className + " freezeStyle";
            frozenHeaders.style.overflow = "hidden";
            frozenHeaders.style.position = "relative";
            
            var headerTableArr = new Array();
            var headerArrCount = 0;
            // build frozen header table
            headerTableArr[headerArrCount++] = "<table id='";
            headerTableArr[headerArrCount++] = gridViewId;
            headerTableArr[headerArrCount++] = "_FrozenHeaders' cellPadding = '";
            headerTableArr[headerArrCount++] = grid.cellPadding;
            headerTableArr[headerArrCount++] = "px' cellSpacing = '";
            headerTableArr[headerArrCount++] = grid.cellSpacing;
            headerTableArr[headerArrCount++] = "px' border = '";
            headerTableArr[headerArrCount++] = grid.border;
            headerTableArr[headerArrCount++] = "px' style = 'border-collapse:";
            headerTableArr[headerArrCount++] = grid.style.borderCollapse;
            headerTableArr[headerArrCount++] = "; width:";
            headerTableArr[headerArrCount++] = grid.style.width;
            headerTableArr[headerArrCount++] = ";'><tr class='";
            headerTableArr[headerArrCount++] = gvRows[0].className;
            headerTableArr[headerArrCount++] = "' style='height:";
            headerTableArr[headerArrCount++] = headerHeight;
            headerTableArr[headerArrCount++] = "px;'>";
            headerTableArr[headerArrCount++] = gvRows[0].innerHTML;              
            headerTableArr[headerArrCount++] = "</tr></table>";
            frozenHeaders.innerHTML = headerTableArr.join('');
                                        
            // set widths
            if (freezeColumns){             
                // set width for scroll container    
                scrollContainer.style.width = (newScrollWidth * 100) + "%";        
                frozenHeaders.style.width = (newScrollWidth * 100) + "%";
            }// if    
            
                  
            // move grid up to hide main(non frozen) header
            grid.style.position = "relative";
            if (gvRows[0].outerHTML){
                // for ie
                grid.style.top = (parseInt(gvRows[0].offsetHeight) + parseInt(grid.border)) * -1 + "px";
            }else{
                // for ff
                grid.style.top = parseInt(gvRows[0].offsetHeight) * -1 + "px";
            }// if-else
       
        }// if      
        
        if (freezeHeaders || freezeColumns){
        
            // add frozen columns
            if (frozenHeaderColumn){
            
                // style and add frozen header column
                parentContainer.insertBefore(frozenHeaderColumn, scrollContainer);
            }// if
            
            // add frozen header
            if (freezeHeaders && frozenHeaders){
                
                // set style if header column is frozen
                if (frozenHeaderColumn){
                    frozenHeaders.className += " freezeStyle";
                }// if
                
                parentContainer.insertBefore(frozenHeaders, scrollContainer);
                
                var headers = document.getElementById(gridViewId + "_FrozenHeaders").childNodes[0].childNodes[0].cells;
                var gridCol = gvRows[1].cells;
                // set header widths
                for(var i = 0; i < headers.length; i++){
                    if (gridCol[i].style.width.indexOf("%") > -1){
                        headers[i].style.width = gridCol[i].style.width;
                        gridCol[i].style.width = gridCol[i].style.width;
                    }else{
                        headers[i].width = gridCol[i].offsetWidth + "px";
                        gridCol[i].width = gridCol[i].offsetWidth + "px";
                    }// if
                }// for
                
            }// 
            
            // add clearing elements for headers
            if (frozenHeaderColumn){
                var clearHeaders = document.createElement("div");
                clearHeaders.style.clear = "both";
                parentContainer.insertBefore(clearHeaders, scrollContainer);        
            }//
            
            // add frozen columns
            if (frozenColumnsContainer){
                // set frozen column styles and add
                parentContainer.insertBefore(frozenColumnsContainer, scrollContainer);            
                scrollContainer.className += " freezeStyle";
                
                var clearColumns = document.createElement("div");
                clearColumns.style.clear = "both";
                if (scrollContainer.nextSibling){
                    parentContainer.insertBefore(clearColumns, scrollContainer.nextSibling);
                }else{
                    parentContainer.appendChild(clearColumns);
                }// if-else
                             
            }// if      
        
            // set onscroll event for scroll container
            scrollContainer.onscroll = function(){
                
                // get frozen columns and scroll it top as scroll container scrolls vertically
                var columns = document.getElementById(gridViewId + "_FrozenColumns");
                if (columns){
                    columns.style.top = this.scrollTop * -1 + "px";
                    columns.style.position = "relative";
                }// if
                
                // get header row and scroll it left as scroll container scrolls horizontally
                var header = document.getElementById(gridViewId + "_FrozenHeaders");
                if (header){
                    header.style.left = this.scrollLeft * -1 + "px";
                    header.style.position = "relative";
                }// if
                
            };  
        
        }// if
    }// if

}
function fnGetTextBoxValue(controlid){
    
    var tb = document.getElementById(controlid);
    if (tb && tb.value){
        return tb.value;
    }// if
    return "";

}
function fnGetCheckboxValue(controlid){

    var cb = document.getElementById(controlid);
    if (cb){
        if (cb.checked){
            return "true";
        }else{
            return "false";
        }// if-else
    
    }// if
    
    return "";
}

function fnGetDropdownValue(controlid){

    var dropdown = document.getElementById(controlid);
    if (dropdown){
        return dropdown.options[dropdown.selectedIndex].value;
    }// if
    
    return "";
}

/***
Title: fnIsNumberKey()
Author: Yeng Yang
Description: This function checks if the key pressed is a valid number, "-", or "." key.
***/
function fnIsNumberKey(evt, control)
{
        var charCode = (evt.which) ? evt.which : event.keyCode
        if ((charCode == 45 && control.value.indexOf("-") > -1)
            || (charCode == 46 && control.value.indexOf(".") > -1)
            || (charCode != 45 && charCode != 46 && charCode > 31 && ((charCode < 48) || charCode > 57))){
            return false;
        }// if-else

         return true;
}

/*
Title: GetQueryString
Author: Yeng Yang
Description: This function retrieves a query string parameter.
*/
function GetQueryString(queryStr, key){

    var idx = queryStr.search("\\?");
    
    // do if there are query string parameters
    if (idx >= 0){
         
        var paramStr = queryStr.substring(idx + 1);    // get query parameters string    
        var parameters = paramStr.split("&");       // split query parameters
        var curParam
        
        // loop through all parameters and find key
        for (var i = 0; i < parameters.length; i++){
            curParam = parameters[i].split("=");
            
            if (curParam.length == 2 && curParam[0] == key){
                return curParam[1];
            }// if
        
        }// for        
        
    }// if
    

    return "";
}
