// Crew Scheduler js utilities

//070524 open a screen in separate window, using std win size
var wins;
function navigateTo(sURL,sName,sFeatures) {
	// if screen size is < spec, use screen max
	var wid = screen.width - 28;	// 28,80 are padding values for a 1024x768 screen 
	var ht = screen.height - 80;	
	// if screen is large enough, use spec size
	if (wid >= 996) wid = 996;
	if (ht >= 688) ht = 688;	
	if (sFeatures == null || sFeatures == '') 
		sFeatures = 'width=' + wid + ',height=' + ht + ',resizable=yes,scrollbars=yes,status=yes,left=0,top=0';					
	if (!wins) wins = new Object;
	if ((wins[sName] == null) || (wins[sName].closed))
		wins[sName] = window.open(sURL,sName,sFeatures);
    wins[sName].focus();
}

// open a child screen; put timestamp in url to avoid caching:
function openChildScreen(url, wid, ht, winName) {
    var ts = new Date().getTime();
    url = url + '&tstamp=' + ts;
    if (!wid) wid = 996;
    if (!ht) ht = 688;
    var opts = 'width=' + wid + ',height=' + ht + ',resizable=yes,scrollbars=yes,status=yes';
    if(!winName) winName = ts; // use unique name
    if (!wins) wins = new Object;
    wins[winName] = window.open(url, winName, opts);
    if (wins[winName]) wins[winName].focus();
    return wins[winName];
}

// handle the wait screen, usually StatusWindow.aspx;
var winWait = null;
function openWaitScreen(url) {
	winWait = window.open(url,'winWait','width=450,height=50,resizable=no,scrollbars=no,status=no');
	winWait.focus();
}
function closeWaitScreen() {
    if(winWait) {
        winWait.close();
    }
}

// trap the button event fired by [Enter] key on textbox; force postback on btnName.Click()
function postbackOnEnterKey(btnName, e) {
    if (!e) e = window.event;
    var keyPressed = e.keyCode;  
    if (keyPressed == 13) {
		// cancel the default submit
        e.returnValue = false;
        e.cancel = true;
		// postback via button click
	    if(!btnName) { 
            btnName = 'btnRefresh'; // default 
        }
		__doPostBack(btnName,'Click'); 		
		return false; 	
	}
}

// trim leading/trailing whitespace
function trim(s) { return s.replace(/^\s+/,'').replace(/\s+$/,''); }  

// Open date picker dialog; ctrlName is control in calling window where date gets sent.
// If reloadFunction is given, the js function by that name is run on the calling window.
// visDate is a visible date to set on the calendar.  Blank or null means 'today'.
function openDatePicker(ctrlName,reloadFunction,visDate) {
    var url = 'dlgPickDate.aspx?control=' + ctrlName + '&reload=' + reloadFunction + '&visDate=' + visDate;
    var features = 'width=350,height=350,resizable=yes,scrollbars=no,status=no';
    window.open(url, 'dlgPickDate', features);
    // note: don't use window.showmodaldialog(); dlgPickDate uses window.opener, which is null for modals.
	return false;
}

// infragistics grid funcs; added handling for xhtmlconformance=Transitional

// given grid ID, return selected row
function igGetSelectedRow(gn) {
    var row;
    var grd = igGetGrid(gn);
    if (grd) {
        for (rowID in grd.SelectedRows) {
            if (grd.SelectedRows[rowID]) {
                row = igtbl_getRowById(rowID);
                break;
            }
        }
    }
    return row;
}

// given grid ID, return grid.  Handle legacy or transitional xhtml mode.
function igGetGrid(gn) {
    var grd = igtbl_getGridById(gn);
    if (!grd) {
        // transitional mode: try adding dollar sign before 'grdgrd'
        var i = gn.indexOf('grdgrd');
        if (i > -1) {
            gn = gn.substr(0, i) + '$' + gn.substr(i);
        }
        grd = igtbl_getGridById(gn);
    }
    return grd;
}



// added CS 2.6

// native js func getElementsByClassName is not yet ubiquitous, so we use this:
// Return array of elements with class name 'cl'; 'cl' may be a whitespace-delimited list of class names.
document.getElementsByClass = function(cl) {
    var retnode = [];
    var myclass = new RegExp('\\b' + cl + '\\b');
    var elem = this.getElementsByTagName('*');
    for (var i = 0; i < elem.length; i++) {
        var classes = elem[i].className;
        if (myclass.test(classes)) retnode.push(elem[i]);
    }
    return retnode;
};

function togglePanel(id) {
    var e = document.getElementById(id);
    if (e.style.display == 'block' || e.style.display == '')
        e.style.display = 'none';
    else
        e.style.display = 'block';
}
function showPanel(id) {
    var e = document.getElementById(id);
    e.style.display = 'block';
}
function hidePanel(id) {
    var e = document.getElementById(id);
    e.style.display = 'none';
}

// Scroll a radgrid to ensure the selected row is visible
function rgScrollSelRow(RadGrid1) {
    // get the selected row
    var row = RadGrid1.get_masterTableView().get_selectedItems()[0];
    if (row) {
        setTimeout(function() {
            var rowElement = row.get_element();
            //get the main table scrollArea HTML element
            var scrollArea = RadGrid1.GridDataDiv;
            if (scrollArea) {
                //check if the selected row is below the viewable grid area
                if ((rowElement.offsetTop - scrollArea.scrollTop) +
                    rowElement.offsetHeight + 20 > scrollArea.offsetHeight) {
                    //scroll down to selected row
                    scrollArea.scrollTop = scrollArea.scrollTop +
                    (rowElement.offsetTop - scrollArea.scrollTop) +
                    (rowElement.offsetHeight - scrollArea.offsetHeight) +
                    rowElement.offsetHeight;
                }
                //chck if the selected row is above the viewable grid area
                else if ((rowElement.offsetTop - scrollArea.scrollTop) < 0) {
                    //scroll the selected row to the top
                    scrollArea.scrollTop = rowElement.offsetTop;
                }
            } else {
                // grid has scrolling turned off
            }
        }, 200);
    }
}

// return value of the given cell for the selected row.
function rgGetSelectedRowValue(rg, columnName) {
    var table = rg.get_masterTableView();
    var row = table.get_selectedItems()[0];
    if (row) {
        var cell = table.getCellByColumnUniqueName(row, columnName);
        return (cell.innerHTML);
    } else {
        // no selection
        return null;
    }
}


// Search the radgrid for a column value that begins with searchChar;
// If found, select that row and scroll row into view. 
// TODO: handle existing selection? (cs binsearch moves to next item of same letter)
function rgSearch(grid, searchChar, colName) {
    grid.clearSelectedItems();
    searchChar = searchChar.toLowerCase();
    var table = grid.get_masterTableView();
    for (var i = 0; i < table.get_dataItems().length; i++) {
        var curRow = table.getCellByColumnUniqueName(table.get_dataItems()[i], colName);
        var cellVal = curRow.innerHTML;
        if (cellVal.charAt(0).toLowerCase() == searchChar) {
            table.get_dataItems()[i].set_selected(true);
            break;
        } else {
            table.get_dataItems()[i].set_selected(false);
        }
    }
    // ensure selected is in view
    rgScrollSelRow(grid);
} 





