/**
 * javasript.js
 * A library of JavaScript functions centralized in a single file to decrease
 * the time it would take to load multiple JavaScript library files.
 * 
 * @package		Airline_Payscales_JavaScript
 * @version	 	$Id$
 * @copyright 	Copyright (c) 2008-2009, Will Fly For Food DBA Jet Web Designs
 * @author 		Webster Network <contact@webster-network.com>
 * @link 		http://www.webster-network.com/
 * @filesource
 */

/******************** AJAX Functions ********************/

/**
 * queryUser()
 * Presents the users with a popup choice box.  On
 * acceptance of the dialog, an ajax action is carried out
 * 
 * @param	string		message
 * @param	boolean		ajaxRequest
 * @param	string		query
 * @param	string		targetDiv
 * @param	boolean		showHide
 * @param	string		optQuery
 * @return	void
 */
function queryUser(message, ajaxRequest, query, targetDiv, showHide, optQuery)
{
	answer = confirm(message);
	
	if (answer)
	{
		if (ajaxRequest)
		{
			makeAjaxRequest(targetDiv, query,    showHide);
			
			if (optQuery != '')
			{
                makeAjaxRequest(targetDiv, optQuery, showHide);
            }
		}
		else
		{
			window.location.replace(query);
		}
	}
	
	return;
}

/**
 * makeAjaxRequest()
 * Makes an AJAX request
 * 
 * @param	string		targetDiv
 * @param	string		query
 * @param	boolean		showHide
 * @return	void
 */
function makeAjaxRequest(targetDiv, query, showHide)
{
	var httpRequest    = false;
	var loadingMessage = '<div style="width: 100%; padding: 50px; text-align: center; vertical-align: middle;"><img src="./styles/images/loading.gif" border="0" alt="Loading, please wait" /></div>';
	var doShowHide     = (typeof(showHide) == "boolean") ? showHide : true;
	
	if ( (doShowHide && showHideDiv(targetDiv) ) || (!doShowHide) )
	{
		if (window.XMLHttpRequest)
		{
			try
			{
				httpRequest = new XMLHttpRequest();
			}
			catch (e)
			{
				httpRequest = false;
			}
		}
		else if (window.ActiveXObject)
		{
			try
			{
				httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e)
			{
				try
				{
					httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e)
				{
					httpRequest = false;
				}
			}
		}
		else
		{
			httpRequest = false;
		}
		
		if (httpRequest)
		{
			url = query + '&ajax=true';
			
			httpRequest.open("get", url, true);
			httpRequest.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");		// Prevent caching
	        
			httpRequest.onreadystatechange = function ()
			{
				if (httpRequest.readyState == 4)
				{
					document.getElementById(targetDiv).innerHTML = httpRequest.responseText;
				}
				else
				{
					document.getElementById(targetDiv).innerHTML = loadingMessage;
				}
			}
			
			httpRequest.send(null);
		}
		else
		{
			window.location(query);
		}
	}
	
	return;
}

/**
 * showHideDiv()
 * Displays or hides a division based on
 * it's current visibility
 * 
 * @param	string		targetDiv
 * @return	void
 */
function showHideDiv(targetDiv)
{
	if ( (document.getElementById(targetDiv).style.display == '') || (document.getElementById(targetDiv).style.display == 'none') )
	{
		returnValue = true;
		
		document.getElementById(targetDiv).style.display = 'block';
		document.getElementById(targetDiv + 'Link').src = './styles/images/collapse.gif';
	}
	else
	{
		returnValue = false;
		
		document.getElementById(targetDiv).style.display = 'none';
		document.getElementById(targetDiv + 'Link').src = './styles/images/expand.gif';
	}

	return returnValue;
}

/**
 * hideDiv()
 * Hides a division
 * 
 * @param	string		targetDiv
 * @return	void
 */
function hideDiv(targetDiv)
{
	document.getElementById(targetDiv).style.display = 'none';
	
	return;
}

var airlineID     = 0;
var prevAirlineID = 0;

/**
 * createNewAirline()
 * Makes an AJAX request if the "Create New Airline" option is selected
 * from the drop down list otherwise the create new airline division is hidden.
 * 
 * @param	selectedIndex
 * @return	void
 */
function createNewAirline(selectedIndex)
{    
	if (selectedIndex == '1')
	{
		document.getElementById('createNewAirline').style.display = 'block';
		
		makeAjaxRequest('createNewAirline', 'submitPayRates.php?act=newAircraft', false);
	}
	else
	{
		hideDiv('createNewAirline');
		
		if (selectedIndex > 0)
		{
		    prevAirlineID = airlineID;
            airlineID     = document.getElementById('airlineID').options[selectedIndex].value;
            
            document.getElementById('payRatesPanel').style.display = 'block';
            
            if (prevAirlineID > 0)
            {
                queryUser('Are you sure you want to change airlines?  Any information you have entered into the form will be lost.', true, 'editAirline.php?ID=' + airlineID + '&lite=true', 'payRatesPanel', false, '');
            }
            else
            {
                makeAjaxRequest('payRatesPanel', 'editAirline.php?ID=' + airlineID + '&lite=true', false);
            }
		}
	}
	
	return;
}

/**
 * addNewPayRateDataSection()
 * Adds an additional section to the new pay rate data table.
 *
 * @param	void
 * @return	void
 */
function addNewPayRateDataSection()
{
	if (numNewPayRateDataSections >= 5)
	{
		alert('You cannot create any more pay rate data sections.');
	}
	else
	{
		targetDiv = 'newPayRateData_' + numNewPayRateDataSections;

		document.getElementById(targetDiv).style.display = '';

		numNewPayRateDataSections++;
	}

	return;
}

/**
 * addNewVacationDaysSection()
 * Adds an additional section to the vacation days table.
 *
 * @param	void
 * @return	void
 */
function addNewVacationDaysSection()
{
	if (numVacationDaysSections >= 30)
	{
		alert('You cannot create any more vacation day sections.');
	}
	else
	{
		targetDiv = 'newVacationDaysSection_' + numNewVacationDaysSections;

		document.getElementById(targetDiv).style.display = '';

		numVacationDaysSections++;
		numNewVacationDaysSections++;
	}

	return;
}

/******************** Page Tab Navigation Functions ********************/

/**
 * changeTabClass()
 * Changes the class for the page navigation tabs.
 * 
 * @param	int			tabNum
 * @param	int			numTabs
 * @return	void
 */
function changeTabClass(tabNum, numTabs)
{
	for (var i = 0; i < tabNum; i++)
    {
		document.getElementById("tab" + i).className = "";
    }

	document.getElementById("tab" + tabNum).className = "current";
	
	for (var j = (tabNum + 1); j <= numTabs; j++)
    {
		document.getElementById("tab" + j).className = "";
    }
    
	return;
}

/******************** Redirect Functions ********************/

/**
 * redirect()
 * Changes the browsers current location to the provided URL
 * 
 * @param 	string			url
 * @return	void
 */
function redirect(url)
{
	window.location.replace(url);
    
	return;
}

/******************** Popup Functions ********************/

/**
 * popUp()
 * Creates a popup window with an HTML page inside.
 * 
 * @param   URL         The URL of the page to display within the popup window.
 * @return  void
 */
function popUp(URL)
{
	day = new Date();
	id  = day.getTime();
	
	eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=850,height=800,left=475,top=125');");
	
	return;
}

/******************** General Helper Functions ********************/

/**
 * getVar()
 * Retrieves a GET variable from the query string
 *
 * @param	string		name
 * @return	void
 */
function getVar(name)
{
	var returnValue = false;

	var query = window.location.search.substring(1);
	var vars  = query.split("&");

	for (var i = 0; i < vars.length; i++)
	{
		var pair = vars[i].split("=");

		if (pair[0] == name)
		{
			returnValue =  pair[1];
		}
	}

	return returnValue;
}

/**
 * setStateDropDownStatus()
 * Disables the state drop down menu if a country
 * other than "United States" is selected
 * 
 * @param	string		value
 * @return	void
 */
function setStateDropDownStatus(value)
{
	if ( (value != "USA") && (value != "") )
    {
		document.getElementById("state").disabled = true;
    }
	else
    {
		document.getElementById("state").disabled = false;
    }
    
	return;
}

/**
 * redirectToSelectedPageNumber()
 * Redirect the user to a selected page number value
 * from a select drop down list.
 * 
 * @param   string      page
 * @param   int         value
 * @return  void
 */
function redirectToSelectedPageNumber(page, value)
{
    redirect(page + '&page=' + value);
    
    return;
}

/**
 * adjustNumPayRateYears()
 * Disables the state drop down menu if a country
 * other than "United States" is selected
 *
 * @param	integer		value
 * @return	void
 */
function adjustNumPayRateYears(value)
{
	/*
	 * Make sure the user hasn't chosen the current value or the 'Please Select' option from
	 * the dropdown as no action is needed in either case
	 */

	if ( ( !isNaN(value) ) && (numPayRateYears != value) && (value != '') )
	{
		value = parseInt(value);

		if (numPayRateYears > value)
		{
			/*
			 * Need to remove year rows from the tables
			 */

			// Use value + 1 as the value-th row should be left enabled, not disabled
			for (i = (value + 1); i <= numPayRateYears; i++)
			{
				for (j = 0; j < 4; j++)
				{
					if ( (aircraftPositionInfo[j][0] != '') && (aircraftPositionInfo[j][1] != 0) )
					{
						numSections = Math.ceil(aircraftPositionInfo[j][1] / 6);

						for (k = 0; k < numSections; k++)
						{
							document.getElementById('payRateDataYearRow_' + aircraftPositionInfo[j][0] + '_' + k + '_' + i).style.display = 'none';
						}
					}
				}

				// Remove year rows from the new pay rate table
				for (l = 0; l < 5; l++)
				{
					document.getElementById('newPayRateDataYearRow_' + l + '_' + i).style.display = 'none';
				}
			}
		}
		else // numPayRateYears < value
		{
			/*
			 * Add year rows to the tables
			 */

			// Loop through the number of pay rate years worth of data
			for (i = numPayRateYears; i <= value; i++)
			{
				// Loop through the aircraft positions (Captain, FO, SO, and PFE)
				for (j = 0; j < 4; j++)
				{
					if ( (aircraftPositionInfo[j][0] != '') && (aircraftPositionInfo[j][1] != 0) )
					{
						numSections = Math.ceil(aircraftPositionInfo[j][1] / 6);

						// Loop through the number of table sections for the selected position
						for (k = 0; k < numSections; k++)
						{
							document.getElementById('payRateDataYearRow_' + aircraftPositionInfo[j][0] + '_' + k + '_' + i).style.display = '';
						}
					}
				}

				// Remove year rows from the new pay rate table
				for (l = 0; l < 5; l++)
				{
					document.getElementById('newPayRateDataYearRow_' + l + '_' + i).style.display = '';
				}
			}
		}

		numPayRateYears = value;
	}

	return;
}

/**
 * queryUser()
 * Presents the users with a popup choice box.  On
 * acceptance of the dialog, an ajax action is carried out
 *
 * @param	void
 * @return	void
 */
function resetFormQuery()
{
	answer = confirm('Are you sure you want to clear all your changes?');

	if (answer)
	{
		document.editAirlineData.reset();
	}

	return;
}

/**
 * disableTextSelection()
 * Disables selection (drag and copy) within a specified element.
 * 
 * @param	target
 * @return	void
 */
function disableTextSelection(target)
{
	/***********************************************
	* Disable Text Selection script- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
	* This notice MUST stay intact for legal use
	* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
	***********************************************/
	
	if (typeof(target.onselectstart) != "undefined")
	{
		// Internet Explorer
		
		target.onselectstart = function()
		{
			return false;
		}
	}
	else if (typeof(target.style.MozUserSelect) != "undefined")
	{
		// Firefox
		
		target.style.MozUserSelect = "none";
	}
	else
	{
		// Others (e.g. Opera)
		
		target.onmousedown = function()
		{
			return false;
		}
	}
	
	target.style.cursor = "default";
	
	return;
}

/******************** Navigation Bar Functions ********************/

var cssdropdown={
disappeardelay: 250, 		// set delay in miliseconds before menu disappears onmouseout
disablemenuclick: true, 	// when user clicks on a menu item with a drop down menu, disable menu item's link?
enableswipe: 0, 			// enable swipe effect? 1 for yes, 0 for no
enableiframeshim: 1, 		// enable "iframe shim" technique to get drop down menus to correctly appear on top of controls such as form objects in IE5.5/IE6? 1 for yes, 0 for no

dropmenuobj: null, ie: document.all, firefox: document.getElementById&&!document.all, swipetimer: undefined, bottomclip:0,

getposOffset:function(what, offsettype){
var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
var parentEl=what.offsetParent;
while (parentEl!=null){
totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
parentEl=parentEl.offsetParent;
}
return totaloffset;
},

swipeeffect:function(){
if (this.bottomclip<parseInt(this.dropmenuobj.offsetHeight)){
this.bottomclip+=10+(this.bottomclip/10) //unclip drop down menu visibility gradually
this.dropmenuobj.style.clip="rect(0 auto "+this.bottomclip+"px 0)"
}
else
return
this.swipetimer=setTimeout("cssdropdown.swipeeffect()", 10)
},

showhide:function(obj, e){
if (this.ie || this.firefox)
this.dropmenuobj.style.left=this.dropmenuobj.style.top="-500px"
if (e.type=="click" && obj.visibility==hidden || e.type=="mouseover"){
if (this.enableswipe==1){
if (typeof this.swipetimer!="undefined")
clearTimeout(this.swipetimer)
obj.clip="rect(0 auto 0 0)" //hide menu via clipping
this.bottomclip=0
this.swipeeffect()
}
obj.visibility="visible"
}
else if (e.type=="click")
obj.visibility="hidden"
},

iecompattest:function(){
return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
},

clearbrowseredge:function(obj, whichedge){
var edgeoffset=0
if (whichedge=="rightedge"){
var windowedge=this.ie && !window.opera? this.iecompattest().scrollLeft+this.iecompattest().clientWidth-15 : window.pageXOffset+window.innerWidth-15
this.dropmenuobj.contentmeasure=this.dropmenuobj.offsetWidth
if (windowedge-this.dropmenuobj.x < this.dropmenuobj.contentmeasure)  //move menu to the left?
edgeoffset=this.dropmenuobj.contentmeasure-obj.offsetWidth
}
else{
var topedge=this.ie && !window.opera? this.iecompattest().scrollTop : window.pageYOffset
var windowedge=this.ie && !window.opera? this.iecompattest().scrollTop+this.iecompattest().clientHeight-15 : window.pageYOffset+window.innerHeight-18
this.dropmenuobj.contentmeasure=this.dropmenuobj.offsetHeight
if (windowedge-this.dropmenuobj.y < this.dropmenuobj.contentmeasure){ //move up?
edgeoffset=this.dropmenuobj.contentmeasure+obj.offsetHeight
if ((this.dropmenuobj.y-topedge)<this.dropmenuobj.contentmeasure) //up no good either?
edgeoffset=this.dropmenuobj.y+obj.offsetHeight-topedge
}
}
return edgeoffset
},

dropit:function(obj, e, dropmenuID){
if (this.dropmenuobj!=null) //hide previous menu
this.dropmenuobj.style.visibility="hidden" //hide menu
this.clearhidemenu()
if (this.ie||this.firefox){
obj.onmouseout=function(){cssdropdown.delayhidemenu()}
obj.onclick=function(){return !cssdropdown.disablemenuclick} //disable main menu item link onclick?
this.dropmenuobj=document.getElementById(dropmenuID)
this.dropmenuobj.onmouseover=function(){cssdropdown.clearhidemenu()}
this.dropmenuobj.onmouseout=function(e){cssdropdown.dynamichide(e)}
this.dropmenuobj.onclick=function(){cssdropdown.delayhidemenu()}
this.showhide(this.dropmenuobj.style, e)
this.dropmenuobj.x=this.getposOffset(obj, "left")
this.dropmenuobj.y=this.getposOffset(obj, "top")
this.dropmenuobj.style.left=this.dropmenuobj.x-this.clearbrowseredge(obj, "rightedge")+"px"
this.dropmenuobj.style.top=this.dropmenuobj.y-this.clearbrowseredge(obj, "bottomedge")+obj.offsetHeight+1+"px"
this.positionshim() //call iframe shim function
}
},

positionshim:function(){ //display iframe shim function
if (this.enableiframeshim && typeof this.shimobject!="undefined"){
if (this.dropmenuobj.style.visibility=="visible"){
this.shimobject.style.width=this.dropmenuobj.offsetWidth+"px"
this.shimobject.style.height=this.dropmenuobj.offsetHeight+"px"
this.shimobject.style.left=this.dropmenuobj.style.left
this.shimobject.style.top=this.dropmenuobj.style.top
}
this.shimobject.style.display=(this.dropmenuobj.style.visibility=="visible")? "block" : "none"
}
},

hideshim:function(){
if (this.enableiframeshim && typeof this.shimobject!="undefined")
this.shimobject.style.display='none'
},

contains_firefox:function(a, b) {
while (b.parentNode)
if ((b = b.parentNode) == a)
return true;
return false;
},

dynamichide:function(e){
var evtobj=window.event? window.event : e
if (this.ie&&!this.dropmenuobj.contains(evtobj.toElement))
this.delayhidemenu()
else if (this.firefox&&e.currentTarget!= evtobj.relatedTarget&& !this.contains_firefox(evtobj.currentTarget, evtobj.relatedTarget))
this.delayhidemenu()
},

delayhidemenu:function(){
this.delayhide=setTimeout("cssdropdown.dropmenuobj.style.visibility='hidden'; cssdropdown.hideshim()",this.disappeardelay) //hide menu
},

clearhidemenu:function(){
if (this.delayhide!="undefined")
clearTimeout(this.delayhide)
},

start:function(){
for (var ids=0; ids<arguments.length; ids++){
var menuitems=document.getElementById(arguments[ids]).getElementsByTagName("a")
for (var i=0; i<menuitems.length; i++){
if (menuitems[i].getAttribute("rel")){
var relvalue=menuitems[i].getAttribute("rel")
menuitems[i].onmouseover=function(e){
var event=typeof e!="undefined"? e : window.event
cssdropdown.dropit(this,event,this.getAttribute("rel"))
}
}
}
}
if (window.createPopup && !window.XmlHttpRequest){ //if IE5.5 to IE6, create iframe for iframe shim technique
document.write('<IFRAME id="iframeshim"  src="" style="display: none; left: 0; top: 0; z-index: 90; position: absolute; filter: progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)" frameBorder="0" scrolling="no"></IFRAME>')
this.shimobject=document.getElementById("iframeshim") //reference iframe object
}
}

}