//General
//for example: instead of each module writing out script found in moduleMaxMin_OnClick have the functionality cached
//

var DNN_COL_DELIMITER = String.fromCharCode(16);
var DNN_ROW_DELIMITER = String.fromCharCode(15);
var __dnn_m_bPageLoaded = false;

window.onload = __dnn_Page_OnLoad;








//-----------------------------------------------------------------------------------

// fill the global vars
// Some evil global variables var
	ALLOWABLE_DEDUCTION = 4800;  // in RMB
	CPT_SALARY = 99900;			// in RMB
	FO_HRS_PER_YEAR = 800;
	FO_SALARY_ARY = new Array (51800,57018,61185,64513,67170,69292,70986,72339,73419,74281,74970,75520);
	OVERTIME = 80;	
	CPT_OT_RATE = 1800;		// in RMB
	FO_OT_RATE = 1400;		// in RMB
	CPT_HOUSING_RES = 15000; // in RMB
	FO_HOUSING_RES = 10000;  // in RMB
	HOUSING_COM = 8000;  // in RMB
	MEDICAL = 2200;	// in RMB
	MAX_MEDICAL_ADD_FAM_MEMBERS = 3;
	MEDICAL_ADD_FAM_MEMBER = 370;		// in RMB
	CPT_PENSION_RES = 4440;
	FO_PENSION_RES = 2960;
	CPT_PENSION_COM = 2960;
	FO_PENSION_COM = 1480;
	EDUCATION = 12000;
	OUT_OF_PORT_HOUR = 22;
	MAX_FURNITURE_FAM_MEMBERS = 4;
	FURNITURE_FAM_MEMBER = 5000;
	FURNITURE = 15000;
	CPT_LCHECK = 148000;
	FO_LCHECK = 74000;
 	IsCaptain = false;
	HasResPackage = true;
	IsB744TR = false;
	HasWife = true;
	Rmb2usd = 7.4;
	HrsJetFO = 1000;
	BlockHrs = 80;
	OutOfPortDays = 10;
	NumKids = 1;
	IsExRateOK = true;
	IsJetHrsOK = true;
	IsBlockHrsOK = true;
	IsOutOfPortOK = true;
	IsNumKidsOK = true;

// -----------------------------------------------------------------------------

// prints thousand separators and rounds number
function prettyPrint()  {
	var str, manLen, numStr;

	numStr = String(Math.round(this.numFloat));
	manLen = this.numStr.lastIndexOf(".");
	str = numStr.substring(0, manLen);
	if (manLen > 6)
		str = numStr.substring(0, manLen-6) + "," +
			numStr.substring(manLen-6, manLen-3) + "," +
			numStr.substring(manLen-3, manLen);
	else if (manLen > 3)
		str = numStr.substring(0, manLen-3) + "," + 
			numStr.substring(manLen-3, manLen);
	
	return str;
}

function checkNum(re, fldObj)  {
	return re.test(fldObj.value);		
}

function checkInteger(fldObj)  {
	return checkNum(/^\d+$/, fldObj);
}

function checkFloat(fldObj)  {
	// start (^) and end ($) with a decimal number that makes a float.  
	// Since '.' is a special char, it needs a backslash.
	return checkNum(/^\d+\.\d+$/, fldObj);
}

function clearAllFields()  {
	var fldAry, fld;
	
	fldAry = ["grossSalaryTfld", "basSalaryTfld", "otimeTfld", "netSalaryTfld",
			  "netBenefitTfld", "houseTfld", "medTfld", "pensionTfld", "eduTfld",
			  "totalNetIncomeTfld", "outOfPortTfld", "oneTimePayTfld", "furnitureTfld",
			  "lineCheckBonusTfld"];
	for (var i in fldAry)  {
		fld = eval("Form." + fldAry[i] + "_RMB");
		fld.value = "";
		fld = eval("Form." + fldAry[i] + "_USD");
		fld.value = "";
	}
}

// -----------------------------------------------------------------------------
	
	
	
// handle exchange rate
function handleExchangeTfld(rateTfld)  {
	IsExRateOK = false;
	if (checkFloat(rateTfld))  {
		Rmb2usd = parseFloat(rateTfld.value);
		IsExRateOK = true;
	}
	else 
		alert ("Please enter correct exchange rate.");
}
	
// handle a change in position
function handlePositionRB(position)  {
	IsCaptain = false;
	if (position=="cpt") {
		Form.hrsJetTfld.value = 0;
		Form.hrsJetTfld.disabled = true;
		IsCaptain = true;
	}
	else  
		Form.hrsJetTfld.disabled = false;
}

function handleJetHoursTfld(hrsTfld)  {
	IsJetHrsOK = false;
	if (checkInteger(hrsTfld))  {
		HrsJetFO = parseInt(hrsTfld.value);
		IsJetHrsOK = true;
	}
	else
		alert ("Please enter correct number of jet hours.");
}

// handle a change in package
function handlePackageRB(pckg)  {
	HasResPackage = true;
	if (pckg=="residence")
		Form.kidsTfld.disabled = false;
	else {
		Form.furnitureTfld_RMB.value = 0;
		HasResPackage = false;
		calcIncome();
	}
}

function handleB744RB(ans)  {
	IsB744TR = (ans == "yes");
}

function handleBlockHrsTfld(hrsTfld)  {
	IsBlockHrsOK = false;
	if (checkInteger(hrsTfld))  {
		BlockHrs = parseInt(hrsTfld.value);
		IsBlockHrsOK = true;
	}
	else
		alert ("Please enter correct number of block hours.");
}	

function handleOutOfPortTfld(daysTfld)  {
	IsOutOfPortOK = false;
	if (checkInteger(daysTfld))  {
		OutOfPortDays = parseInt(daysTfld.value);
		IsOutOfPortOK = true;
	}
	else
		alert ("Please enter correct number of out of port days.");
}

function handleWifeRB(ans)  {
	HasWife = (ans == "yes");
}

function handleKidsTfld(numberOfKidsTfld)  {
	IsNumKidsOK = false;
	if (checkInteger(numberOfKidsTfld))  {
		NumKids = parseInt(numberOfKidsTfld.value);
		IsNumKidsOK = true;
	}
	else
		alert ("Please enter the correct number of kids.");
}	

//-----------------------------------------------------------------------------------

function calcNetSalary(gross)  {
	var taxRate, quickDeduct, tax;
	
	if (gross<=500)  { taxRate=0.05; quickDeduct=0; }
	else if (gross<=2000)  { taxRate=0.10; quickDeduct=25; }
	else if (gross<=5000)  { taxRate=0.15;  quickDeduct=125; }
	else if (gross<=20000)  { taxRate=0.20;  quickDeduct=375; }
	else if (gross<=40000)  { taxRate=0.25;  quickDeduct=1375; }
	else if (gross<=60000)  { taxRate=0.30;	 quickDeduct=3375; }
	else if (gross<=80000)  { taxRate=0.35;  quickDeduct=6375; }
	else if (gross<=100000)  { taxRate=0.40;  quickDeduct=10375; }
	else { taxRate=0.45;  quickDeduct=15375;} 
	tax = (gross-ALLOWABLE_DEDUCTION) * taxRate - quickDeduct;

	return gross - tax;
}

function calcGrossSalary()  {
	var startYear, otHrs, otPay;
	
	otHrs = Math.max(0,BlockHrs-OVERTIME);
	if (IsCaptain)  {
  		gross = CPT_SALARY;
		otPay = otHrs * CPT_OT_RATE;
	}
	else  {	// start year for FOs
		startYear = Math.min(Math.ceil(HrsJetFO / FO_HRS_PER_YEAR), 12);
		gross = FO_SALARY_ARY[startYear - 1];
		otPay = otHrs * FO_OT_RATE;
	}
	Form.grossSalaryTfld_RMB.value = gross + otPay;
	Form.basSalaryTfld_RMB.value = gross;
	Form.otimeTfld_RMB.value = otPay;

	return gross + otPay;;
}
		
function calcHousing()  {
	var housing;
	
	if (HasResPackage) {
		housing = FO_HOUSING_RES;
		if (IsCaptain)
			housing = CPT_HOUSING_RES;
	}
		else
			housing = HOUSING_COM;
			
	Form.houseTfld_RMB.value = housing;
}

function calcMedical() {
	var numAddFamMembers, med;
	
	numAddFamMembers = (HasWife ? 1 : 0) + NumKids;
	numAddFamMembers = Math.min(numAddFamMembers, MAX_MEDICAL_ADD_FAM_MEMBERS);
	med = MEDICAL + numAddFamMembers * MEDICAL_ADD_FAM_MEMBER;
	Form.medTfld_RMB.value = med;
}

function calcPension()  {
	var pension;
	
	if (HasResPackage)  {
		if (IsCaptain)
			pension = CPT_PENSION_RES;
		else
			pension = FO_PENSION_RES;
	}
	else  {
		if (IsCaptain)
			pension = CPT_PENSION_COM;
		else
			pension = FO_PENSION_COM;
	}
	Form.pensionTfld_RMB.value = pension;
}		

function calcEducation()  {
	Form.eduTfld_RMB.value = NumKids * EDUCATION;
}

function calcMonthlyBenefits()  {
	calcHousing();
	calcMedical();
	calcPension();
	calcEducation();
	Form.netBenefitTfld_RMB.value = parseInt(Form.houseTfld_RMB.value) 
		+ parseInt(Form.medTfld_RMB.value) +
		parseInt(Form.pensionTfld_RMB.value) + parseInt(Form.eduTfld_RMB.value);
}

function calcOutOfPort_OneTime()  {
	Form.outOfPortTfld_RMB.value = OutOfPortDays * OUT_OF_PORT_HOUR * 24;
}		

function calcFurniture()  {
	var numFamMembers, furn;
	
	furn = 0;
	if (HasResPackage)  {
		numFamMembers = (HasWife ? 1 : 0) + NumKids + 1;
		numFamMembers = Math.min(numFamMembers, MAX_FURNITURE_FAM_MEMBERS);
		furn = FURNITURE + numFamMembers * FURNITURE_FAM_MEMBER;
	}
	Form.furnitureTfld_RMB.value = furn;
}

function calcLineCheckBonus()  {
	if (IsB744TR)
		Form.lineCheckBonusTfld_RMB.value = (IsCaptain ? CPT_LCHECK : FO_LCHECK);
	else
		Form.lineCheckBonusTfld_RMB.value = 0;
}
	
// prints thousand separators and rounds number
function prettyPrintInteger(num)  {
	var str, manLen, numStr;

	numStr = String(num);
	manLen = numStr.length;
	str = numStr.substring(0, manLen);
	if (manLen > 6)
		str = numStr.substring(0, manLen-6) + "," +
			numStr.substring(manLen-6, manLen-3) + "," +
			numStr.substring(manLen-3, manLen);
	else if (manLen > 3)
		str = numStr.substring(0, manLen-3) + "," + 
			numStr.substring(manLen-3, manLen);
	
	return str;
}		

//-----------------------------------------------------------------------------------

function calcIncome_RMB()  {
	var net;
	
	net = calcNetSalary(calcGrossSalary());
	Form.netSalaryTfld_RMB.value = Math.round(net);
	calcMonthlyBenefits();
	
	Form.totalNetIncomeTfld_RMB.value = parseInt(Form.netSalaryTfld_RMB.value) +
		parseInt(Form.netBenefitTfld_RMB.value);

	calcOutOfPort_OneTime();
	calcFurniture();
	calcLineCheckBonus();
	Form.oneTimePayTfld_RMB.value = parseInt(Form.furnitureTfld_RMB.value) +
		parseInt(Form.lineCheckBonusTfld_RMB.value);	
}

function prettyPrintOutput()  {
	var fldAry, fld, num;
	
	fldAry = ["grossSalaryTfld", "basSalaryTfld", "otimeTfld", "netSalaryTfld",
			  "netBenefitTfld", "houseTfld", "medTfld", "pensionTfld", "eduTfld",
			  "totalNetIncomeTfld", "outOfPortTfld", "oneTimePayTfld", "furnitureTfld",
			  "lineCheckBonusTfld"];
	for (var i in fldAry)  {
		fld = eval("Form." + fldAry[i] + "_RMB");
		num = fld.value;
		padStr = "";
		fld.value = padStr + prettyPrintInteger(fld.value);
		fld = eval("Form." + fldAry[i] + "_USD");
		fld.value = padStr + prettyPrintInteger(Math.round(num / Rmb2usd));
	}
}
	

function calcIncome()  {
	if (IsExRateOK && IsJetHrsOK && IsBlockHrsOK && IsOutOfPortOK && IsNumKidsOK)  {
		calcIncome_RMB();
		prettyPrintOutput();
	}
	else  {
		alert ("Please correct the erronenous input values first.");
		clearAllFields();
	}
}
	


















function __dnn_ClientAPIEnabled()
{
	return typeof(dnn) != 'undefined';
}


function __dnn_Page_OnLoad()
{
	if (__dnn_ClientAPIEnabled())
	{
		var sLoadHandlers = dnn.getVar('__dnn_pageload');
		if (sLoadHandlers != null)
			eval(sLoadHandlers);
		
		dnn.dom.attachEvent(window, 'onscroll', __dnn_bodyscroll);
	}
	__dnn_m_bPageLoaded = true;
}

function __dnn_KeyDown(iKeyCode, sFunc, e)
{
	if (e == null)
		e = window.event;

	if (e.keyCode == iKeyCode)
	{
		eval(unescape(sFunc));
		return false;
	}
}

function __dnn_bodyscroll() 
{
	var oF=document.forms[0];	
	if (__dnn_ClientAPIEnabled() && __dnn_m_bPageLoaded)
		oF.ScrollTop.value=document.documentElement.scrollTop ? document.documentElement.scrollTop : dnn.dom.getByTagName("body")[0].scrollTop;
}

function __dnn_setScrollTop(iTop)
{
	if (__dnn_ClientAPIEnabled())
	{
		if (iTop == null)
			iTop = document.forms[0].ScrollTop.value;
	
		var sID = dnn.getVar('ScrollToControl');
		if (sID != null && sID.length > 0)
		{
			var oCtl = dnn.dom.getById(sID);
			if (oCtl != null)
			{
				iTop = dnn.dom.positioning.elementTop(oCtl);
				dnn.setVar('ScrollToControl', '');
			}
		}
		window.scrollTo(0, iTop);
	}
}

//Focus logic
function __dnn_SetInitialFocus(sID)
{
	var oCtl = dnn.dom.getById(sID);	
	if (oCtl != null && __dnn_CanReceiveFocus(oCtl))
		oCtl.focus();
}	

function __dnn_CanReceiveFocus(e)
{
	//probably should call getComputedStyle for classes that cause item to be hidden
	if (e.style.display != 'none' && e.tabIndex > -1 && e.disabled == false && e.style.visible != 'hidden')
	{
		var eParent = e.parentElement;
		while (eParent != null && eParent.tagName != 'BODY')
		{
			if (eParent.style.display == 'none' || eParent.disabled || eParent.style.visible == 'hidden')
				return false;
			eParent = eParent.parentElement;
		}
		return true;
	}
	else
		return false;
}

//Max/Min Script
function __dnn_ContainerMaxMin_OnClick(oLnk, sContentID)
{
	var oContent = dnn.dom.getById(sContentID);
	if (oContent != null)
	{
		var oBtn = oLnk.childNodes[0];
		var sContainerID = oLnk.getAttribute('containerid');
		var sCookieID = oLnk.getAttribute('cookieid');
		var sCurrentFile = oBtn.src.toLowerCase().substr(oBtn.src.lastIndexOf('/'));
		var sMaxFile;
		var sMaxIcon;
		var sMinIcon;

		if (dnn.getVar('min_icon_' + sContainerID))
			sMinIcon = dnn.getVar('min_icon_' + sContainerID);
		else
			sMinIcon = dnn.getVar('min_icon');

		if (dnn.getVar('max_icon_' + sContainerID))
			sMaxIcon = dnn.getVar('max_icon_' + sContainerID);
		else
			sMaxIcon = dnn.getVar('max_icon');

		sMaxFile = sMaxIcon.toLowerCase().substr(sMaxIcon.lastIndexOf('/'));

		var iNum = 5;
		if (oLnk.getAttribute('animf') != null)
			iNum = new Number(oLnk.getAttribute('animf'));
			
		if (sCurrentFile == sMaxFile)
		{
			oBtn.src = sMinIcon;				
			//oContent.style.display = '';
			dnn.dom.expandElement(oContent, iNum);
			oBtn.title = dnn.getVar('min_text');
			if (sCookieID != null)
			{
				if (dnn.getVar('__dnn_' + sContainerID + ':defminimized') == 'true')
					dnn.dom.setCookie(sCookieID, 'true', 365);
				else
					dnn.dom.deleteCookie(sCookieID);
			}
			else
				dnn.setVar('__dnn_' + sContainerID + '_Visible', 'true');
		}
		else
		{
			oBtn.src = sMaxIcon;				
			//oContent.style.display = 'none';
			dnn.dom.collapseElement(oContent, iNum);
			oBtn.title = dnn.getVar('max_text');
			if (sCookieID != null)
			{
				if (dnn.getVar('__dnn_' + sContainerID + ':defminimized') == 'true')
					dnn.dom.deleteCookie(sCookieID);
				else
					dnn.dom.setCookie(sCookieID, 'false', 365);				
			}
			else
				dnn.setVar('__dnn_' + sContainerID + '_Visible', 'false');			
		}
		
		return true;	//cancel postback
	}
	return false;	//failed so do postback
}

function __dnn_Help_OnClick(sHelpID)
{
	var oHelp = dnn.dom.getById(sHelpID);
	if (oHelp != null)
	{
		if (oHelp.style.display == 'none')
			oHelp.style.display = '';
		else
			oHelp.style.display = 'none';

		return true;	//cancel postback
	}
	return false;	//failed so do postback
}

function __dnn_SectionMaxMin(oBtn, sContentID)
{
	var oContent = dnn.dom.getById(sContentID);
	if (oContent != null)
	{
		var sMaxIcon = oBtn.getAttribute('max_icon');
		var sMinIcon = oBtn.getAttribute('min_icon');
		var bCallback = oBtn.getAttribute('userctr') != null;
		var sVal;
		if (oContent.style.display == 'none')
		{
			oBtn.src = sMinIcon;				
			oContent.style.display = '';
			if (bCallback)
			    sVal = 'True';
			else
			    dnn.setVar(oBtn.id + ':exp', 1);
		}
		else
		{
			oBtn.src = sMaxIcon;				
			oContent.style.display = 'none';
			if (bCallback)
			    sVal = 'False';
			else
                dnn.setVar(oBtn.id + ':exp', 0);
		}
		if (bCallback)
		    dnncore.setUserProp(oBtn.getAttribute('userctr'), oBtn.getAttribute('userkey'), sVal, null);
		return true;	//cancel postback
	}
	return false;	//failed so do postback
}

//Drag N Drop
function __dnn_enableDragDrop()
{
	var aryConts = dnn.getVar('__dnn_dragDrop').split(";");	
	var aryTitles;

	for (var i=0; i < aryConts.length; i++)
	{
		aryTitles = aryConts[i].split(" ");
		if (aryTitles[0].length > 0)
		{			
			var oCtr = dnn.dom.getById(aryTitles[0]);
			var oTitle = dnn.dom.getById(aryTitles[1]);
			if (oCtr != null && oTitle != null)
			{
				oCtr.setAttribute('moduleid', aryTitles[2]);
				dnn.dom.positioning.enableDragAndDrop(oCtr, oTitle, '__dnn_dragComplete()', '__dnn_dragOver()');
			}	
		}
	}
}

var __dnn_oPrevSelPane;
var __dnn_oPrevSelModule;
var __dnn_dragEventCount=0;
function __dnn_dragOver()
{
	__dnn_dragEventCount++;
	if (__dnn_dragEventCount % 75 != 0)	//only calculate position every 75 events
		return;
	
	var oCont = dnn.dom.getById(dnn.dom.positioning.dragCtr.contID);

	var oPane = __dnn_getMostSelectedPane(dnn.dom.positioning.dragCtr);
		
	if (__dnn_oPrevSelPane != null)	//reset previous pane's border
		__dnn_oPrevSelPane.pane.style.border = __dnn_oPrevSelPane.origBorder;

	if (oPane != null)
	{		
		__dnn_oPrevSelPane = oPane;
		oPane.pane.style.border = '4px double ' + DNN_HIGHLIGHT_COLOR;
		var iIndex = __dnn_getPaneControlIndex(oCont, oPane);

		var oPrevCtl;
		var oNextCtl;
		for (var i=0; i<oPane.controls.length; i++)
		{
			if (iIndex > i && oPane.controls[i].id != oCont.id)
				oPrevCtl = oPane.controls[i];
			if (iIndex <= i && oPane.controls[i].id != oCont.id)
			{
				oNextCtl = oPane.controls[i];
				break;
			}
		}			
		
		if (__dnn_oPrevSelModule != null)
			dnn.dom.getNonTextNode(__dnn_oPrevSelModule.control).style.border = __dnn_oPrevSelModule.origBorder;
			

		if (oNextCtl != null)
		{
			__dnn_oPrevSelModule = oNextCtl;
			dnn.dom.getNonTextNode(oNextCtl.control).style.borderTop = '5px groove ' + DNN_HIGHLIGHT_COLOR;
		}
		else if (oPrevCtl != null)
		{
			__dnn_oPrevSelModule = oPrevCtl;
			dnn.dom.getNonTextNode(oPrevCtl.control).style.borderBottom = '5px groove ' + DNN_HIGHLIGHT_COLOR;
		}
	}
}

function __dnn_dragComplete()
{
	var oCtl = dnn.dom.getById(dnn.dom.positioning.dragCtr.contID);
	var sModuleID = oCtl.getAttribute('moduleid');
	
	if (__dnn_oPrevSelPane != null)
		__dnn_oPrevSelPane.pane.style.border = __dnn_oPrevSelPane.origBorder;

	if (__dnn_oPrevSelModule != null)
		dnn.dom.getNonTextNode(__dnn_oPrevSelModule.control).style.border = __dnn_oPrevSelModule.origBorder;
		
	var oPane = __dnn_getMostSelectedPane(dnn.dom.positioning.dragCtr);
	var iIndex;
	if (oPane == null)
	{
		var oPanes = __dnn_Panes();
		for (var i=0; i<oPanes.length; i++)
		{
			if (oPanes[i].id == oCtl.parentNode.id)
				oPane = oPanes[i];
		}
	}	
	if (oPane != null)
	{
		iIndex = __dnn_getPaneControlIndex(oCtl, oPane);
		__dnn_MoveToPane(oPane, oCtl, iIndex);

		dnn.callPostBack('MoveToPane', 'moduleid=' + sModuleID, 'pane=' + oPane.paneName, 'order=' + iIndex * 2); 
	}
}

function __dnn_MoveToPane(oPane, oCtl, iIndex)
{

	if (oPane != null)
	{
		var aryCtls = new Array();
		for (var i=iIndex; i<oPane.controls.length; i++)
		{
			if (oPane.controls[i].control.id != oCtl.id)
				aryCtls[aryCtls.length] = oPane.controls[i].control;

			dnn.dom.removeChild(oPane.controls[i].control);
		}
		dnn.dom.appendChild(oPane.pane, oCtl);
		oCtl.style.top=0;
		oCtl.style.left=0;
		oCtl.style.position = 'relative';
		for (var i=0; i<aryCtls.length; i++)
		{
			dnn.dom.appendChild(oPane.pane, aryCtls[i]);
		}
		__dnn_RefreshPanes();
	}
	else
	{
		oCtl.style.top=0;
		oCtl.style.left=0;
		oCtl.style.position = 'relative';
	}
}

function __dnn_RefreshPanes()
{
	var aryPanes = dnn.getVar('__dnn_Panes').split(';');
	var aryPaneNames = dnn.getVar('__dnn_PaneNames').split(';');
	__dnn_m_aryPanes = new Array();
	for (var i=0; i<aryPanes.length; i++)
	{
		if (aryPanes[i].length > 0)
			__dnn_m_aryPanes[__dnn_m_aryPanes.length] = new __dnn_Pane(dnn.dom.getById(aryPanes[i]), aryPaneNames[i]);
	}
}

var __dnn_m_aryPanes;
var __dnn_m_aryModules;
function __dnn_Panes()
{
	if (__dnn_m_aryPanes == null)
	{
		__dnn_m_aryPanes = new Array();
		__dnn_RefreshPanes();
	}
	return __dnn_m_aryPanes;
}

function __dnn_Modules(sModuleID)
{
	if (__dnn_m_aryModules == null)
		__dnn_RefreshPanes();
	
	return __dnn_m_aryModules[sModuleID];
}

function __dnn_getMostSelectedPane(oContent)
{
	var oCDims = new dnn.dom.positioning.dims(oContent);
	var iTopScore=0;
	var iScore;
	var oTopPane;
	for (var i=0; i<__dnn_Panes().length; i++)
	{
		var oPane = __dnn_Panes()[i];
		var oPDims = new dnn.dom.positioning.dims(oPane.pane);
		iScore = dnn.dom.positioning.elementOverlapScore(oPDims, oCDims);
		
		if (iScore > iTopScore)
		{
			iTopScore = iScore;
			oTopPane = oPane;
		}
	}
	return oTopPane;
}

function __dnn_getPaneControlIndex(oContent, oPane)
{
	if (oPane == null)
		return;
	var oCDims = new dnn.dom.positioning.dims(oContent);
	var oCtl;
	if (oPane.controls.length == 0)
		return 0;
	for (var i=0; i<oPane.controls.length; i++)
	{
		oCtl = oPane.controls[i];
		var oIDims = new dnn.dom.positioning.dims(oCtl.control);
		if (oCDims.t < oIDims.t)
			return oCtl.index;
	}
	if (oCtl != null)
		return oCtl.index+1;
	else
		return 0;
}

//Objects
function __dnn_Pane(ctl, sPaneName)
{
	this.pane = ctl;
	this.id = ctl.id;
	this.controls = new Array();
	this.origBorder = ctl.style.border;
	this.paneName = sPaneName;
	
	var iIndex = 0;
	var strModuleOrder='';
	for (var i=0; i<ctl.childNodes.length; i++)
	{
		var oNode = ctl.childNodes[i];
		if (dnn.dom.isNonTextNode(oNode))	
		{
			if (__dnn_m_aryModules == null)
				__dnn_m_aryModules = new Array();

			//if (oNode.tagName == 'A' && oNode.childNodes.length > 0)
			//	oNode = oNode.childNodes[0];	//DNN now embeds anchor tag 
				
			var sModuleID = oNode.getAttribute('moduleid');
			if (sModuleID != null && sModuleID.length > 0)
			{
				strModuleOrder += sModuleID + '~';
				this.controls[this.controls.length] = new __dnn_PaneControl(oNode, iIndex);
				__dnn_m_aryModules[sModuleID] = oNode.id;
				iIndex+=1;
			}
		}
	}
	this.moduleOrder = strModuleOrder;

}

function __dnn_PaneControl(ctl, iIndex)
{
	this.control = ctl;
	this.id = ctl.id;
	this.index = iIndex;
	this.origBorder = ctl.style.border;
	
}

//move towards dnncore ns.  right now only for personalization
function __dnncore()
{
    this.GetUserVal = 0;
    this.SetUserVal = 1;
}

__dnncore.prototype = {
getUserProp: function(sNameCtr, sKey, pFunc) {
    this._doUserCallBack(dnncore.GetUserVal, sNameCtr, sKey, null, new dnncore.UserPropArgs(sNameCtr, sKey, pFunc));
},

setUserProp: function(sNameCtr, sKey, sVal, pFunc) {
    this._doUserCallBack(dnncore.SetUserVal, sNameCtr, sKey, sVal, new dnncore.UserPropArgs(sNameCtr, sKey, pFunc));
},

_doUserCallBack: function(iType, sNameCtr, sKey, sVal, pFunc) {
    if (dnn && dnn.xmlhttp)
    {
        var sPack = iType + COL_DELIMITER + sNameCtr + COL_DELIMITER + sKey + COL_DELIMITER + sVal;
        dnn.xmlhttp.doCallBack('__Page',sPack,dnncore._callBackSuccess,pFunc,dnncore._callBackFail,null,true,null,0);
    }
    else
        alert('Client Personalization not enabled');
},

_callBackSuccess: function (result, ctx, req) {
    if (ctx.pFunc)
        ctx.pFunc(ctx.namingCtr, ctx.key, result);
},

_callBackFail: function (result, ctx) {
	window.status = result;
}
}

__dnncore.prototype.UserPropArgs = function(sNameCtr, sKey, pFunc)
{
    this.namingCtr = sNameCtr;
	this.key = sKey;
	this.pFunc = pFunc;
}

var dnncore = new __dnncore();
