

function validate(input)
{   
   
    tr = input.parentNode.parentNode;
    account = tr.id;
    
    for(i=0;i<tr.childNodes.length;i++)
    {
       inputBox = tr.childNodes[i].firstChild;
       if(inputBox!=null && (inputBox.name='INPUT'))
       {
          name = inputBox.id;
          sw = (name.replace(name,account))
         
         alert(sw);
       }
    }
}




function viewReports()
{

render(800,500,'Reports',site_root+'/aw_reports/panel_report_graph/');

   startDates =document.getElementsByName("data[startDate][]");
    //endDates= document.getElementsByName("data[endDate][]");
     
    selectStart = document.getElementsByName("data[start_date][]");
    selectEnd =  document.getElementsByName("data[end_date][]");
    
    query=''
  
   
    for(i=0;i<3; i++)
    {
    query+=selectStart[i].name;
    query+='='+selectStart[i].value+'&';
   
    query+=selectEnd[i].name;
    query+='='+selectEnd[i].value+'&';
    
    } 
   
    new Ajax.Updater('ajaxReportGraph', site_root+'/aw_reports/ajax_report/?'+query, {onLoading:function(request){disableInput('reportBody', null, {opacity:75,color:'white'},'900px')}, onComplete:function(request){enableInput();},asynchronous:true, evalScripts:true, parameters:Form.serialize('ajaxFormReport')});

}

function saveAdminDates()
{
	 var startDate   = $('_unboundStartDate').value;
     var endDate     = $('_unboundEndDate').value;
     $('_unboundtimeframe').value = 'CDR';
     
new Ajax.Updater('ajaxAdminReportData', site_root+'/websites/admin_report/0/'+startDate+'/'+endDate, {onLoading:function(request){disableInput(null, null, {opacity:75,color:'white'},'900px')}, onComplete:function(request){enableInput();},asynchronous:true, evalScripts:true, parameters:Form.serialize('ajaxFormAdminReport')});
	
	
}

function sortByDate()
{
  
	//startDates =document.getElementsByName("data[startDate][]");
	//endDates= document.getElementsByName("data[endDate][]");
	 
	selectStart = document.getElementsByName("data[start_date][]");
	selectEnd =  document.getElementsByName("data[end_date][]");
	
	for(i=0;i<3; i++)
	{
	//elem = document.createElement('input');
	//elem.type='hidden';
	//elem.name=selectStart[i].name;
	//elem.value = selectStart[i].value;
	
	//elem2 = document.createElement('input');
	//elem2.type='hidden';
	//elem2.name=selectEnd[i].name;
	//elem2.value = selectEnd[i].value;
	
	//$('ajaxFormReport').appendChild(elem);
	//$('ajaxFormReport').appendChild(elem2);

}
  
  
new Ajax.Updater('ajaxReportData', site_root+'/aw_reports/summary/', {onLoading:function(request){disableInput('reportBody', null, {opacity:75,color:'white'},'900px')}, onComplete:function(request){enableInput();},asynchronous:true, evalScripts:true, parameters:Form.serialize('ajaxFormReport')});


}



    var benchmarkReportSave = true;

    function panelBenchNavigation(type)
    {
        conf = true;
        if(!benchmarkReportSave)
        {
            conf = confirm ("All changes will be lost, are you sure you want to continue?")
        }
        if(conf){
           
            new Ajax.Updater('myOverlay', site_root+'/website_reports_bms/panel_benchmarks/'+type+'/'+$('groupValue').value, {asynchronous:true, evalScripts:true});	
            
            benchmarkReportSave = true;
        }
    }

    function checkSave()
    {
        benchmarkReportSave = false;
    }
    function isNumberKey(evt)
    {
        var charCode = (evt.which) ? evt.which : event.keyCode
        
        if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode!=46)
            return false;
        
        return true;
    }


function SaveDataFiledsBenchmark(type)
{
    new Ajax.Updater('myOverlay', site_root+'/website_reports_bms/panel_benchmarks/'+type, {asynchronous:true, evalScripts:true, parameters:Form.serialize('dataFields')});
    
    benchmarkReportSave = true;
}


function switchReportStatus(status){

  new Ajax.Updater('ajaxReportData', site_root+'/aw_reports/summary/', {onLoading:function(request){disableInput('reportBody', null, {opacity:75,color:'white'},'900px')}, onComplete:function(request){enableInput();},asynchronous:true, evalScripts:true, parameters:Form.serialize('ajaxFormReport')});
}
 
function switchReportSize(){


 new Ajax.Updater('ajaxReportData', site_root+'/aw_reports/summary/', {onLoading:function(request){disableInput('reportBody', null, {opacity:75,color:'white'},'900px')}, onComplete:function(request){enableInput();},asynchronous:true, evalScripts:true, parameters:Form.serialize('ajaxFormReport')});

}
    

function switchReportEngine(search, woot){
	
	if(isNaN(search.value)){
		if(document.getElementById('unboundPublicationId')!=null){
			document.getElementById('unboundPublicationId').value=0;
		}
	}else{
		document.getElementById('unboundSearchengine').value='account_wide';
	}
	
    if($('unboundReportSelect') != null){
    
        alert ('Filtering by Search Engine is Perimited only on Campiagn level!');
        
        return false;
    
    }

    //document.form[0].secondselectbox = 'A'
    disableInput(null,null,{opacity:80,color:'white'});
    
   
    new Ajax.Updater('ajaxReportData',site_root+'/aw_reports/summary/', {onComplete:function(request){enableInput();}, asynchronous:true, evalScripts:true, parameters:Form.serialize('ajaxFormReport')});
}
  


 function getReportSelect(obj) {
 
 	 arr = obj.value.split('_');
     rid = obj.options[obj.selectedIndex].text;
     
     
    status = $('unboundReportStatus');
    search = $('unboundSearchengine');
    orderBy = $('reportPanel').value;
    
    new Ajax.Updater('ajaxReportData', site_root+'/aw_reports/summary/?orderBy='+orderBy+'&searchEngine='+arr[1]+'&name='+arr[0], {onComplete:function(request){enableInput();}, asynchronous:true, evalScripts:true, parameters:Form.serialize('frmReport')});
 
 
 }   
   
 
 function orderByAdminReport(orderBy, orderByclass)
 {
	 
	  	directions = new Array( {ASC:'DESC',
	  							 DESC:'ASC'}
	  							);
	     		

	  	 if($(orderBy+'x').lastChild.hash.slice(1)=='')	
	  	  { 					
	       direction = 'DESC';
	      } 
	     else 
	     { 
	      direction = directions[0][$(orderBy+'x').lastChild.hash.slice(1)];//
	  	 }
	  	

	  
	  	$('direction').value = direction; 
	  	$('orderBy').value = 'cost';
	  	
	
	  	new Ajax.Updater('ajaxAdminReportData', site_root+'/websites/admin_report/?OrderByClass='+orderByclass+'&OrderBy='+orderBy, {onComplete:function(request){enableInput();}, onComplete:function(request){orderByColumnFormat(orderBy,direction);}, asynchronous:true, evalScripts:true, parameters:Form.serialize('ajaxAdminReportData')});
	 }
 
 
function orderByReport(orderBy){
  	directions = new Array( {ASC:'DESC',
  							 DESC:'ASC'}
  							);
     				
  	 if($(orderBy+'x').lastChild.hash.slice(1)=='')	
  	  { 					
       direction = 'DESC';
      } 
     else 
     { 
      direction = directions[0][$(orderBy+'x').lastChild.hash.slice(1)];//
  	 }
  	
  
  	$('direction').value = direction; 
  	$('orderBy').value = orderBy;
  	new Ajax.Updater('ajaxReportData', site_root+'/aw_reports/summary/', {onComplete:function(request){enableInput();}, onComplete:function(request){orderByColumnFormat(orderBy,direction);}, asynchronous:true, evalScripts:true, parameters:Form.serialize('ajaxFormReport')});
 }
    

function orderByColumnFormat(id, order)
{

 //$(id).style.background = '#dde3e6';
 $(id+'x').lastChild.href ='#'+order;

}    

    
    function removeReportTemplate( templateId )
    {
        if(confirm("Are you sure you want to remove this Report Template ?"))
        {
            new Ajax.Request(site_root+'/aw_report_templates/remove/'+templateId, {onComplete:function(request){window.location.reload();}, asynchronous:true, evalScripts:true});
        }
        else
        {
            return false;
        }
    }
    
    function removeReport( reportId )
    {
        if(confirm("Are you sure you want to remove this Report ?"))
        {
            new Ajax.Request(site_root+'/aw_reports/remove/'+reportId, {onComplete:function(request){window.location.reload();}, asynchronous:true, evalScripts:true});
        }
        else
        {
            return false;
        }
    }
    
    function runReport()
    {
        disableInput(null, null, {opacity:75, color:'white'});

        var domSettingsPanel    = document.getElementById('domSettingsPanel');
        var domValidationPanel  = document.getElementById('domValidationPanel');
       
        new Ajax.Updater(domValidationPanel, site_root+'/aw_reports/validation/', {onComplete:function(request){showPreview(null, domSettingsPanel, domValidationPanel);}, asynchronous:true, evalScripts:true, parameters:Form.serialize('frmReport'), requestHeaders:['X-Update', domValidationPanel]});
    }
    
    /** Activity Reports **/
    var activeCampaign  = null;
    var activePanel     = null;
    var activeTab       = null;
    
    function expandCampaign(campaignId)
    {
        if(campaignId != activeCampaign && activeCampaign != null || campaignId == activeCampaign)        
        {
            domCampaignNode         = document.getElementById('node_campaign_'+activeCampaign);
            domCampaignNodeFolder   = document.getElementById('node_campaign_folder_'+activeCampaign);
            
            domCampaignNode.style.display   = 'none';
            domCampaignNodeFolder.className = 'node_folder_closed';
            
            if(activeCampaign == campaignId)
            {
                activeCampaign = null;
                
                return false;
            }
            
        }

        domCampaignNodePlusIcon = '';
        domCampaignNodeFolderIcon = '';
        
        domCampaignNode         = document.getElementById('node_campaign_'+campaignId);
        domCampaignNodeFolder   = document.getElementById('node_campaign_folder_'+campaignId);
        
        domCampaignNode.style.display   = 'block';
        domCampaignNodeFolder.className = 'node_folder_open';
        
        activeCampaign = campaignId;
        
        if(!campaignsLoaded[campaignId])
        {
            new Ajax.Updater(domCampaignNode.id, site_root+'/aw_activity_reports/findChildren/'+campaignId, {onComplete:function(request){ showDetails('AwCampaignFinal',campaignId);}, asynchronous:true, evalScripts:true, requestHeaders:['X-Update', domCampaignNode.id]});
        }
    }
    
    function showDetails( concreteModelName, modelId )
    {
        disableInput('panel_campaign_data', null, {opacity:75, color:'white'});
        
        new Ajax.Updater('panel_campaign_data', site_root+'/'+concreteModelName+'s/report/'+concreteModelName+'/'+modelId, {onComplete:function(request){updateLabels();enableInput();}, asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'panel_campaign_data']});
    }
    
    function updateLabels()
    {
        domLabels = document.getElementsByTagName('DIV');
        
        for(i=0; i<domLabels.length; i++)
        {
            if(domLabels[i].id.indexOf('label') > -1 && domLabels[i].id.indexOf('_hidden') < 0)
            {
                domLabelHidden = document.getElementById(domLabels[i].id+'_hidden');
                domLabels[i].innerHTML = domLabelHidden.innerHTML;
            }
        }
    }
    
    function showPanels()
    {
        domPanels = document.getElementsByName('summary_panel');
        
        for(i=0; i<domPanels.length; i++)
        {
            domPanels[i].style.display = 'block';
        }
    }
    
    function showPanel( domId, sender )
    {
        if(sender.tagName == 'A')
        {
            senderParent = sender.parentNode;
            
            if(senderParent != activeTab && activeTab != null)
            {
                domTabActive = document.getElementById(activeTab);
                domTabActive.className = 'tab_white';
            }
            
            senderParent.className = 'tab_active_white';
            
            activeTab = senderParent.id;
        }
        
        updateLabels();
        
        domPanel = document.getElementById(domId);
        domLabel = document.getElementById(domId.substr(domId.indexOf('_')+1)+'_label');
            
        if(domId != activePanel)
        {
            if(activePanel != null)
            {
                domPanelActive  = document.getElementById(activePanel);
                domLabelActive  = document.getElementById(activePanel.substr(activePanel.indexOf('_')+1)+'_label');
                
                if(domPanelActive)
                    domPanelActive.style.display = 'none';
                    
                if(domLabelActive)
                    domLabelActive.style.display = 'none';
            }
            
            domPanel.style.display = 'block';
            
            if(domLabel != null)
              domLabel.style.display = 'block';
            
            activePanel = domId
        }
        
        //return true;
    }
    
    function switchMonth( sender )
    {
        if(confirm('Are you sure you want to change monthly activity period to '+sender.options[sender.selectedIndex].text+'?'))
        {
            disableInput(null,null,{opacity:75,color:'white'});
            
            return document.forms[0].submit();
        }
        else
        {
            sender.selectedIndex = activeMonth;
        }
        
        return false;
    }
        
    function saveReportDates()
    {
    	
    	
        var startDate   = $('_unboundStartDate').value.split('-');
        var endDate     = $('_unboundEndDate').value.split('-');

        $('startMonth').value = startDate[1];
        $('startYear').value  = startDate[0];
        $('startDay').value   = startDate[2];
      
        $('endMonth').value = endDate[1];
        $('endYear').value  = endDate[0];
        $('endDay').value   = endDate[2];
        
        
        //sortByDate();
        //closeOverlay();
        DC.enableInput();
        
        if(document.forms[0])
        	document.forms[0].submit();
    }
    
    function saveDownloadReportDates(network)
    {

        var startDate   = $('_unboundStartDate').value.split('-');
        var endDate     = $('_unboundEndDate').value.split('-');
        
        
        $('downloadStartMonth').value = startDate[1];
        $('downloadStartYear').value  = startDate[0];
        $('downloadStartDay').value   = startDate[2];
      
        $('downloadEndMonth').value = endDate[1];
        $('downloadEndYear').value  = endDate[0];
        $('downloadEndDay').value   = endDate[2];
        
        $('downloadNetwork').value  = network;
        
    }
    
    /**
     * Key Performance Indicators
     */
    
    /**
     * Reset KPI
     * Resets the current KPI Group (TR) back to its original values
     * 
     * @author Ryan 
     */
    function resetKPI()
    {
    
    }
    
    /**
     * Update KPI
     * Updates the current KPIs in accordance to the requesting DOM element
     * 
     * @param sender DOM element that has triggered an update; e.g. CPC, Clicks etc
     * @return boolean true on success, false if invalid value
     */
    function updateKPI( sender )
    {
    	if(!sender || sender.value <= 0) { return false; }
  
    	var currentIndicators	= getCurrentKPI(sender.name, sender.id);
    	var maximumAllowedCost	= getMaximumAllowedCost();
    	
    	var changingImpressions = Math.round(currentIndicators.impressions);
    	var changingImpressions_float = currentIndicators.impressions;
    	var changingClicks = Math.round(currentIndicators.clicks);
    	var changingClicks_float = currentIndicators.clicks;
    	var changingCTR = currentIndicators.ctr*100;
    	var changingCTR_float = currentIndicators.ctr;
    	var changingCPC = currentIndicators.cpc
    	var changingCPC_float = currentIndicators.cpc;
    	var changingCost = currentIndicators.cost;
    	var changingCost_float = currentIndicators.cost;
    	var changingConvRate = currentIndicators.conv_rate*100;
    	var changingConvRate_float = currentIndicators.conv_rate;
    	var changingCostConv = currentIndicators.cost_conv;
    	var changingCostConv_float = currentIndicators.cost_conv;
    	var changingConversions = Math.round(currentIndicators.conversions);
    	var changingConversions_float = currentIndicators.conversions;
    	
    	var changedCost = false;
    	var changedCPC = false;
    	var changedCostConv = false;
    	var changedCTR = false;
    	var changedImpressions = false;
    	var changedClicks = false;
    	var changedConvRate = false;
    	var changedConversions = false;
    	
    	// update KPIs based on changing indicator
    	switch(sender.name)
    	{
    		case 'group':
    			
    			if(!checkGroupName(sender.value))
    			{
    				alert('Error! - You already have a KPI group with the name: `'+sender.value+'`');
    				
    				sender.value = currentIndicators.group;
    				
    				return false;
    			}
    			else
    			{
    				return true;
    			}
    			
    		break;
    	
    		case 'impression':
	    		
    			////console.log('KPI change: `Impressions`');//Mozilla Firebug Console
    			
	    		// check for specified Clicks
	    		if(currentIndicators.clicks > 0)
	    		{
	    			////console.log('> `Clicks` exist, so update `CTR`');//Mozilla Firebug Console
	    			
	    			if(Number(sender.value) < Number(Math.round(currentIndicators.clicks)))
	    			{
	    				alert('Error! - You cannot specify fewer Impressions than Clicks');
	    				
	    				sender.value = Math.round(currentIndicators.impressions);
	    				
	    				return false;
	    			}	    			
	    			
	    			////console.log('>> Updating `CTR` based on existing `Clicks` and new `Impressions` = ['+currentIndicators.clicks+'/'+sender.value+']['+(currentIndicators.clicks/sender.value)+']');//Mozilla Firebug Console
	    			
	    			// Clicks exist, so update the CTR
	    			changingCTR_float	= (currentIndicators.clicks/sender.value);
	    			changingCTR			= Math.round(changingCTR_float*100);
	    			
	    			// flag KPI as changed
	    			changedCTR = true;

	    			// check for Cost
		    		if(currentIndicators.cost > 0)
		    		{
		    			////console.log('>>> `Cost` set, so update `CPC`');//Mozilla Firebug Console
		    			
		    			////console.log('>>>> Updating `CPC` based on existing `Cost` and existig `Clicks` = ['+currentIndicators.cost+'/'+currentIndicators.clicks+']['+(currentIndicators.cost/currentIndicators.clicks)+']');//Mozilla Firebug Console
		    			
		    			// Cost exists, so update CPC
		    			changingCPC_float	= (currentIndicators.cost/currentIndicators.clicks);
		    			changingCPC			= Math.round(changingCPC_float*100)/100;
		    			
		    			// flag KPI as changed
		    			changedCPC = true;
		    		}
		    		
		    		if(currentIndicators.conv_rate > 0)
	    			{
	    				changingConversions_float	= changingClicks*(currentIndicators.conv_rate);
	    				changingConversions			= Math.round(changingConversions_float);
	    				
	    				changedConversions = true;
	    			}
	    		
	    		}
	    		// no Clicks, check for CTR
	    		else if(currentIndicators.ctr > 0)
	    		{
	    			////console.log('> NO `Clicks` but `CTR` exists, so update `Clicks`');//Mozilla Firebug Console
	    			
	    			////console.log('>> Updating `Clicks` based on new `Impressions` and existing `CTR` = ['+sender.value+'*'+currentIndicators.ctr+']['+(sender.value*currentIndicators.ctr)+']');//Mozilla Firebug Cosole
	    			
	    			// CTR exists, so update Clicks
	    			changingClicks_float	= (sender.value*currentIndicators.ctr);
	    			changingClicks			= Math.round(changingClicks_float);
	    			
	    			// flag KPI as changed
	    			changedClicks = true;
	    			
	    			// check for Cost
	    			if(currentIndicators.cost > 0)
	    			{
	    				////console.log('>>> `Cost` set, so update `CPC`');//Mozilla Firebug Console
	    				
	    				////console.log('>>>> Updating `CPC` based on existing `Cost` and new `Clicks` = ['+currentIndicators.cost+'/'+changingClicks+']['+(currentIndicators.cost/changingClicks)+']');//Mozilla Firebug Cosole
	    				
	    				// Cost exists, so update CPC
	    				changingCPC_float	= (currentIndicators.cost/changingClicks);
	    				changingCPC			= Math.round(changingCPC_float*100)/100;
	    				
	    				// flag KPI as changed
	    				changedCPC = true;
	    			}
	    			
	    			if(currentIndicators.conv_rate > 0)
	    			{
	    				changingConversions_float	= changingClicks*(currentIndicators.conv_rate);
	    				changingConversions			= Math.round(changingConversions_float);
	    				
	    				changedConversions = true;
	    			}
	    		}
	    		
	    		changingImpressions = changingImpressions_float = sender.value;
	    		
	    		// flag KPI as changed
	    		changedImpressions = true;
	    		
	    		break;
	    	case 'clicks':
	    		
	    		////console.log('KPI change: `Clicks`');//Mozilla Firebug Console
	    		
	    		// check for specified Impressions
	    		if(currentIndicators.impressions > 0)
	    		{
	    			////console.log('> `Impressions` exist, so update `CTR`');//Mozilla Firebug Console
	    			
	    			if(Number(sender.value) > Number(Math.round(currentIndicators.impressions)))
	    			{
	    				alert('Error! - You cannot specify more Clicks than Impressions');
	    				
	    				sender.value = Math.round(currentIndicators.clicks);
	    				
	    				return false;
	    			}	    			
	    		
	    			////console.log('>> Updating `CTR` based on new `Clicks` and existing `Impressions` = ['+sender.value+'/'+currentIndicators.impressions+']['+(sender.value/currentIndicators.impressions)+']');//Mozilla Firebug Console
	    			
	    			// Impressions exist, so update the CTR
	    			changingCTR_float	= (sender.value/currentIndicators.impressions);
	    			changingCTR			= Math.round(changingCTR_float*100);
	    			
	    			// flag KPI as changed
	    			changedCTR = true;
	    		}
	    		// no Impressions, check for CTR
	    		else if(currentIndicators.ctr > 0)
	    		{
	    			////console.log('> No `Impressions` but `CTR` exists, so update `Impressions`');//Mozilla Firebug Console
	    			
	    			////console.log('>> Updating `Impressions` based on new `Clicks` and existing `CTR` = ['+sender.value+'*'+currentIndicators.ctr+']['+(sender.value*currentIndicators.ctr)+']');//Mozilla Firebug Console
	    			
	    			// CTR exists, so update Impressions
	    			changingImpressions_float	= (sender.value*currentIndicators.ctr);
	    			changingImpressions			= Math.round(changingImpressions_float);
	    		
	    			// flag KPI as changed
	    			changedImpressions = true;
	    		}
	    		
	    		if(currentIndicators.conv_rate > 0)
	    		{
	    			//console.log('changing Conversions from Clicks');
	    			
	    			changingConversions_float	= sender.value*currentIndicators.conv_rate;
	    			changingConversions			= Math.round(changingConversions_float);
	    			
	    			changedConversions = true;
	    		}
	    		else if(currentIndicators.conversions > 0)
	    		{
	    			changingConvRate_float	= currentIndicators.conversions/sender.value;
	    			changingConvRate		= Math.round(changingConvRate_float);
	    			
	    			changedCTR = true;
	    		}
	    		
	    		// check for Cost
	    		if(currentIndicators.cost > 0)
	    		{
	    			////console.log('> `Cost` set, so update `CPC`');//Mozilla Firebug Console
	    			
	    			////console.log('>> Updating `CPC` based on existing `Cost` and new `Clicks` = ['+currentIndicators.cost+'/'+sender.value+']['+(currentIndicators.cost/sender.value)+']');//Mozilla Firebug Console
	    			
	    			// Cost exists, so update CPC
	    			changingCPC_float	= (currentIndicators.cost/sender.value);
	    			changingCPC			= Math.round(changingCPC_float*100)/100;
	    		
	    			// flag KPI as changed
	    			changedCPC = true;
	    			
	    			if(changedConversions)
	    			{
	    				changingCostConv_float	= (currentIndicators.cost/changingConversions);
	    				changingCostConv		= Math.round(changingCostConv_float);
	    			}
	    			else
	    			{
	    				changingCostConv_float	= (currentIndicators.cost/currentIndicators.conversions);
	    				changingCostConv		= Math.round(changingCostConv_float);
	    			}
	    		}
	    		
	    		changingClicks = changingClicks_float = sender.value;
	    		
	    		// flag KPI as changed
	    		changedClicks = true;
	    		
	    		break;
	    	case 'ctr':
	    		
	    		//////console.log('KPI change: `CTR`');//Mozilla Firebug Console
	    		
	    		if(Number(sender.value) > 100)
	    		{
	    			alert('Error! - You cannot have a CTR over 100%');
	    			
	    			sender.value = Math.round(currentIndicators.ctr*100)/100;
	    			
	    			return false;
	    		}
	    		
	    		// check for specified Impressions
	    		if(currentIndicators.impressions > 0)
	    		{
	    			//////console.log('> `Impressions` exist, so update `Clicks');//Mozilla Firebug Console
	    			
	    			//////console.log('>> Updating `Clicks` based on existing `Impressions` and new `CTR` = ['+currentIndicators.impressions+'*'+(sender.value/100)+']['+(currentIndicators.impressions*(sender.value/100))+']');//Mozilla Firebug Console
	    			
	    			// Impressions exist, so update Clicks
	    			changingClicks_float	= (currentIndicators.impressions*(sender.value/100));
	    			changingClicks			= Math.round(changingClicks_float);
	    			
	    			// flag KPI as changed
	    			changedClicks = true;
	    			
	    			// check for Cost
	    			if(currentIndicators.cost > 0)
	    			{
	    				//////console.log('>>> `Cost` exists, so update `CPC`');//Mozilla Firebug Console
	    				
	    				//////console.log('>>>> Updating `CPC` based on existing `Cost` and new `Clicks` = ['+currentIndicators.cost+'/'+changingClicks+']['+(currentIndicators.cost/changingClicks)+']');//Mozilla Firebug Console
	    				
	    				// Cost exists, so update CPC
	    				changingCPC_float	= (currentIndicators.cost/changingClicks);
	    				changingCPC			= Math.round(changingCPC_float*100)/100;
	    				
	    				// flag KPI as changed
	    				changedCPC = true;
	    			}
	    		}
	    		else if(currentIndicators.clicks > 0)
	    		{
	    			//////console.log('> NO `Impressions` but `Clicks` exist, so update `Impressions`');//Mozilla Firebug Console
	    			
	    			//////console.log('>> Updating `Impressions` based on existing `Clicks` and new `CTR` = ['+currentIndicators.clicks+'*'+(sender.value/100)+']['+(currentIndicators.clicks*(sender.value/100))+']');//Mozilla Firebug Console
	    			
	    			// Clicks exist, so update Impressions
	    			changingImpressions_float	= (currentIndicators.clicks/(sender.value/100));
	    			changingImpressions			= Math.round(changingImpressions_float);
	    			
	    			// flag KPI as changed
	    			changedImpressions = true;
	    		}
	    		
	    		changingCTR			= sender.value;
	    		changingCTR_float	= (sender.value/100);
	    		
	    		// flag KPI as changed
	    		changedCTR = true;
	    		
	    		break;
	    	case 'conv_rate':
	    		
	    		//////console.log('KPI change: `Conv. Rate`');//Mozilla Firebug Console');//Mozilla Firebug Console
	    		
	    		// check for specified Clicks
	    		if(currentIndicators.clicks > 0)
	    		{
	    			//////console.log('> `Clicks` exist, so update `Conversions`');//Mozilla Firebug Console
	    			
	    			//////console.log('>> Updating `Conversions` based on existing `Clicks` and new `Conv. Rate` = ['+currentIndicators.clicks+'*'+(sender.value/100)+']['+Math.round(currentIndicators.clicks*(sender.value/100))+']');//Mozilla Firebug Console
	    			
	    			// Clicks exist, so update Conversions
	    			changingConversions_float	= (currentIndicators.clicks*(sender.value/100));
	    			changingConversions			= Math.round(changingConversions_float);
	
	    			// flag KPI as changed
	    			changedConversions = true;
	    			
	    			// check for specified Cost
	    			if(currentIndicators.cost > 0)
	    			{
	    				//////console.log('>>> `Cost` exists, so update `CPA`');//Mozilla Firebug Console
	    				
	    				//////console.log('>>>> Updating `CPA` based on existing `Cost` and new `Conversions` = ['+currentIndicators.cost+'/'+changingConversions+']['+(currentIndicators.cost/changingConversions)+']');//Mozilla Firebug Console
	    				
	    				// Cost exists, so update CPA
	    				changingCostConv_float	= (currentIndicators.cost/changingConversions);
	    				changingCostConv		= Math.round(changingCostConv_float*100)/100;
	    				
	    				// flag KPI as changed
	    				changedCostConv = true;
	    			}
	    		}
	    		
	    		changingConvRate		= sender.value;
	    		changingConvRate_float	= (sender.value/100);
	    		
	    		// flag KPI as changed
	    		changedConvRate = true;
	    		
	    		break;
	    	case 'conversions':
	    		
	    		//////console.log('KPI change: `Conversions`');//Mozilla Firebug Console
	    		
	    		// check for specified Clicks
	    		if(currentIndicators.clicks > 0)
	    		{
	    			//////console.log('> `Clicks` exist, so update `Conv. Rate`');//Mozilla Firebug Console
	    			
	    			if(sender.value > Number(currentIndicators.clicks))
	    			{
	    				alert('Error! - You cannot have more Conversions than Clicks');
	    				
	    				sender.value = currentIndicators.conversions;
	    				
	    				return false;
	    			}	    			
	    			
	    			//////console.log('>> Updating `Conv. Rate` based on new `Conversions` and existing `Clicks` = ['+sender.value+'/'+currentIndicators.clicks+']['+(sender.value/currentIndicators.clicks)+']');//Mozilla Firebug Console
	    			
	    			// Clicks exist, so update Conversion Rate
	    			changingConvRate_float	= (sender.value/currentIndicators.clicks);
	    			changingConvRate		= Math.round(changingConvRate_float*100);
	    			
	    			// flag KPI as changed
	    			changedConvRate = true;
	    		}
	    		
	    		// check for Cost
	    		if(currentIndicators.cost > 0)
	    		{
	    			//////console.log('> `Cost` exists, so update `CPA`');//Mozilla Firebug Console
	    			
	    			//////console.log('>> Updating `CPA` based on existing `Cost` and new `Conversions` = ['+currentIndicators.cost+'/'+sender.value+']['+(currentIndicators.cost/sender.value)+']');//Mozilla Firebug Console
	    			
	    			// Cost exists, so update CPA
	    			changingCostConv_float	= (currentIndicators.cost/sender.value);
	    			changingCostConv		= Math.round(changingCostConv_float*100)/100;
	    			
	    			// flag KPI as changed
	    			changedCostConv = true;
	    		}
	    		
	    		changingConversions = changingConversions_float = sender.value;
	    		
	    		// flag KPI as changed
	    		changedConversions = true;
	    		
	    		break;
	    	case 'cost':
	    		
	    		/**
	    		 * Thursday 5th Feb: Re-worked to treat User Input for Cost as a percentage of allowed budget
	    		 */
	    		
	    		//////console.log('KPI change: `Cost`');//Mozilla Firebug Console
	    		
	    		adjustedCost = currentIndicators.maximumbudget*(sender.value/100);
	    		
	    		//////console.log('> Adjusted `Cost` from percentage to dollar = []');//Mozilla Firebug Console
	    		
	    		if(Number(sender.value) > Number(currentIndicators.allowedbudgetpercentage))//100)//currentIndicators.allowedbudget)
	    		{
	    			alert('Error! - You are trying to allocate more money than your budget allows to this group');
	    			
	    			sender.value = (currentIndicators.cost/currentIndicators.maximumbudget)*100;
	    			
	    			return false;
	    		}
	    		
	    		if(currentIndicators.clicks > 0)
	    		{
	    			//////console.log('>> `Clicks` exist, so update `CPC`');//Mozilla Firebug Console
	    			
	    			changingCPC_float	= (/*sender.value*/adjustedCost/currentIndicators.clicks);
	    			changingCPC			= Math.round(changingCPC_float*100)/100;
	    			
	    			// flag KPI as changed
	    			changedCPC = true;
	    		}
	    		
	    		if(currentIndicators.conversions > 0)
	    		{
	    			//////console.log('>> `Conversions` exist, so update `CPA`');//Mozilla Firebug Console
	    			
	    			//////console.log('>> Updating `CPA` based on new `Cost` and existing `Conversions` = ['+adjustedCost+'/'+currentIndicators.conversions+']['+(adjustedCost/currentIndicators.conversions)+']');//Mozilla Firebug Console
	    			
	    			changingCostConv_float	= (/*sender.value*/adjustedCost/currentIndicators.conversions);
	    			changingCostConv		= Math.round(changingCostConv_float*100)/100;
	    			
	    			// flag KPI as changed
	    			changedCostConv = true;
	    		}
	    		
	    		changingCost		= sender.value;
	    		changingCost_float	= adjustedCost;//sender.value;
	    		
	    		// flag KPI as changed
	    		changedCost = true;
	    		
	    		break;
	    	case 'cpc':
	    		
	    		//////console.log('KPI change: `CPC`');//Mozilla Firebug Console
	    		
	    		if(currentIndicators.cost > 0)
	    		{
	    			//////console.log('> `Cost` exists, so update `Clicks`');//Mozilla Firebug Console
	    			
	    			//////console.log('> Updating `Clicks` based on existing `Cost` and new `CPC` = ['+currentIndicators.cost+'/'+sender.value+']['+(currentIndicators.cost/sender.value)+']');
	    			
	    			changingClicks_float	= (currentIndicators.cost/sender.value);
	    			changingClicks			= Math.round(changingClicks_float);
	    			
	    			// flag KPI as changed
	    			changedClicks = true;
	    			
	    			if(currentIndicators.ctr > 0)
	    			{
	    				//////console.log('>> `CTR` exists, so update `Impressions`');//Mozilla Firebug Console
	    				
	    				//////console.log('>>> Updating `Impressions` based on new `Clicks` and existing `CTR` = ['+changingClicks_float+'/'+currentIndicators.ctr+']['+(changingClicks_float/currentIndicators.ctr)+']');//Mozilla Firebug Console
	    				
	    				changingImpressions_float	= (changingClicks_float/currentIndicators.ctr);
	    				changingImpressions			= Math.round(changingImpressions_float);
	    				
	    				// flag KPI as changed
	    				changedImpressions = true;
	    			}
	    			else if(currentIndicators.impressions > 0)
	    			{
	    				//////console.log('>> NO `CTR` but `Impressions` exist, so update `CTR`');//Mozilla Firebug Console
	    				
	    				//////console.log('>>> Updating `CTR` based on new `Clicks` and existing `Impressions` = ['+changingClicks_float+'/'+currentIndicators.impressions+']['+(changingClicks_float/currentIndicators.impressions)+']');//Mozilla Firebug Console
	    				
	    				changingCTR_float	= (changingClicks_float/currentIndicators.impressions);
	    				changingCTR			= Math.round(changingCTR_float);
	    				
	    				// flag KPI as changed
	    				changedCTR = true;
	    			}
	    			
	    			changingCost = Math.round((changingCost/currentIndicators.maximumbudget)*100);
	    			
	    			// flag KPI as changed
	    			changedCost = true;
	    		}
	    		else if(currentIndicators.clicks > 0)
	    		{
	    			//////console.log('> NO `Cost` but `Clicks` exist, so update `Cost`');//Mozilla Firebug Console
	    			
	    			//////console.log('>> Updating `Cost` based on existing `Clicks` and new `CPC` = ['+currentIndicators.clicks+'*'+sender.value+']['+(currentIndicators*sender.value)+']');//Mozilla Firebug Console
	    			
	    			changingCost_float		= (currentIndicators.clicks*sender.value);
	    			changingCost			= Math.round(changingCost_float*100)/100;
	    			
	    			// flag KPI as changed
	    			changedCost = true;
	    			
	    			// adjust Cost based on percentage
	    			adjustedCost = (changingCost/currentIndicators.maximumbudget)*100;
	    			
	    			// check if Cost is valid
	    			if(Number(adjustedCost) > Number(currentIndicators.allowedbudgetpercentage))
	    			{
	    				alert('Error! - You are trying to allocate more money than your budget allows to this group');
	    				
	    				sender.value = currentIndicators.cpc;
	    				
	    				return false;
	    			}
	    			
	    			//////console.log('>> Adjusted `Cost` as a percentage = ['+changingCost+'/'+currentIndicators.maximumbudget+']['+(changingCost/currentIndicators.maximumbudget)+']');//Mozilla Firebug Console
	    			
	    			// re-assigned Cost as percentage
	    			changingCost = Math.round(adjustedCost);
	    		}
	    		
	    		changingCPC = changingCPC_float = sender.value;
	    		
	    		// flag KPI as changed
	    		changedCPC = true;
	    		
	    		break;
	    	case 'cost_conv':
	    		
	    		//////console.log('KPI change: `CPA`');//Mozilla Firebug Console
	    		
	    		if(currentIndicators.cost > 0)
	    		{
	    			////////console.log('> `Cost` exists, so update `Conversions`');
	    			
	    			////////console.log('>> Updating `Conversions` based on existing `Cost` and new `CPA` = ['+currentIndicators.cost+'/'+sender.value+']['+(currentIndicators.cost/sender.value)+']');//Mozilla Firebug Console
	    			
	    			changingConversions_float	= (currentIndicators.cost/sender.value);
	    			changingConversions			= Math.round(changingConversions_float);
	    			
	    			// flag KPI as changed
	    			changedConversions = true;
	    		}
	    		else if(currentIndicators.conversions > 0)
	    		{
	    			////////console.log('> NO `Cost` but `Conversions`, so update `Cost`');//Mozilla Firebug Console
	    			
	    			////////console.log('>> Updating `Cost` based on existing `Conversions` and new `CPA` = ['+currentIndicators.impressions+'*'+sender.value+']['+(currentIndicators.impressions*sender.value)+']');//Mozilla Firebug Console
	    			
	    			changingCost_float	= (currentIndicators.impressions*sender.value);
	    			changingCost		= Math.round(changingCost_float*100)/100;
	    			
	    			// flag KPI as changed
	    			changedCost = true;
	    			
	    			// adjust Cost based on percentage
	    			adjustedCost = (changingCost/currentIndicators.maximumbudget)*100;
	    			
	    			// check if Cost if valid
	    			if(Number(adjustedCost) > Number(currentIndicators.allowedbudgetpercentage))
	    			{
	    				alert('Error! - You are tryig to allocated more money that your budget allows to this group');
	    				
	    				sender.value = currentIndicators.cost_conv;
	    				
	    				return false;
	    			}
	    			
	    			////////console.log('>> Adjusted `Cost` as a percentage = ['+changingCost+'/'+currentIndicators.maximumbudget+']['+(changingCost/currentIndicators.maximumbudget)+']');//Mozilla Firebug Console
	    			
	    			// re-assigne Cost as percentage
	    			changingCost = Math.round(adjustedCost);
	    		}
	    		
	    		changedCostConv = true;
	    		
	    		changingCostConv = changingCostConv_float = sender.value;
	    		
	    		break;
    	}
    	
    	// re-adjust Cost as Percentage
    	if(!changedCost)
    		changingCost = Math.round((changingCost/currentIndicators.maximumbudget)*100);
    	
    	if(!changedCPC)
    	{
			////////console.log('NO change: `CPC` = ['+changingCPC+']['+Math.round(changingCPC*100)/100+']');//Mozilla Firebug Console
    		changingCPC = Math.round(changingCPC*100)/100;
    	}
    	
    	if(!changedCTR)
    	{
    		////////console.log('NO change: `CTR` = ['+changingCTR+']['+Math.round(changingCTR*100)/100+']');//Mozilla Firebug Console
    		changingCTR = Math.round(changingCTR*100)/100;
    	}
    	
    	if(!changedCostConv)
    	{
    		////////console.log('NO change: `CPA` = ['+changingCostConv+']['+Math.round(changingCostConv*100)/100+']');//Mozilla Firebug Console
    		changingCostConv = Math.round(changingCostConv*100)/100;
    	}
    	
    	if(!changedConvRate)
    	{
    		////////console.log('NO change: `Conv. Rate` = ['+changingConvRate+']['+Math.round(changingConvRate*100)/100+']');//Mozilla Firebug Console
    		changingConvRate = Math.round(changingConvRate);
    	}
    	
    	////console.log(sender.name);
    	////console.log('Conversions: '+changingConversions);
    	////console.log('Conversions_float: '+changingConversions_float);
    	
    	var changedIndicators = {'group':currentIndicators.group,
    							 'group_hidden':currentIndicators.group_hidden,
    							 'impressions':changingImpressions,
    							 'impressions_float':changingImpressions_float,
    							 'clicks':changingClicks,
    							 'clicks_float':changingClicks_float,
    							 'cpc':changingCPC,
    							 'cpc_float':changingCPC_float,
    							 'ctr':changingCTR,
    							 'ctr_float':changingCTR_float,
    							 'cost':changingCost,
    							 'cost_float':changingCost_float,
    							 'conv_rate':changingConvRate,
    							 'conv_rate_float':changingConvRate_float,
    							 'cost_conv':changingCostConv,
    							 'cost_conv_float':changingCostConv_float,
    							 'conversions':changingConversions,
    							 'conversions_float':changingConversions_float};
    	
    	updateCurrentKPI(changedIndicators);
    	
    	return true;
    }
    
    function getCurrentKPI( senderName, senderId )
    {
    	var kpiGroup, kpiGroupTR;
    	
    	var groupNameParts = senderName.split('_');
    	var groupName = '';
    	
    	for(var i=0; i<groupNameParts.length; i++)
    	{
    		groupName += groupNameParts[i].substring(0,1).toUpperCase()+groupNameParts[i].substring(1);
    	}
    	
    	var senderGroupName = senderId.substring(0, senderId.lastIndexOf(groupName));

    	kpiGroupTR	= document.getElementById('kpi-group-'+senderGroupName);
   	
    	kpiGroup = {'group':kpiGroupTR.cells[0].childNodes[0].value,
    				'group_hidden':senderGroupName,
    				'impressions':kpiGroupTR.cells[0].childNodes[1].value,
    				'clicks':kpiGroupTR.cells[1].childNodes[1].value,
    				'ctr':kpiGroupTR.cells[2].childNodes[1].value,
    				'cpc':kpiGroupTR.cells[3].childNodes[1].value,
    				'cost':kpiGroupTR.cells[4].childNodes[1].value,
    				'conv_rate':kpiGroupTR.cells[5].childNodes[1].value,
    				'cost_conv':kpiGroupTR.cells[6].childNodes[1].value,
    				'conversions':kpiGroupTR.cells[7].childNodes[1].value,
    				'allowedbudget':document.getElementById('maximumAllowedBudget').value,//$('maximumAllowedBudget').value,
    				'allowedbudgetpercentage':document.getElementById('maximumAllowedBudgetPercentage').value,//$('maximumAllowedBudgetPercentage').value,
    				'maximumbudget':document.getElementById('maximumBudget').value};//$('maximumBudget').value};
    	
    	return kpiGroup;
    }
    
    function updateCurrentKPI( changedIndicators )
    {
    	for(var i in changedIndicators)
    	{
    		////////////console.log('['+i+'] > '+changedIndicators[i]);
    	}
    	
    	var kpiGroupTR;
    		kpiGroupTR = document.getElementById('kpi-group-'+changedIndicators.group_hidden);
    	
		kpiGroupTR.cells[0].childNodes[0].value = changedIndicators.group;
		kpiGroupTR.cells[0].childNodes[1].value	= changedIndicators.group_hidden;
		kpiGroupTR.cells[1].childNodes[0].value = changedIndicators.impressions;
		kpiGroupTR.cells[1].childNodes[1].value = changedIndicators.impressions_float;
		kpiGroupTR.cells[2].childNodes[0].value = changedIndicators.clicks;
		kpiGroupTR.cells[2].childNodes[1].value = changedIndicators.clicks_float;
		kpiGroupTR.cells[3].childNodes[0].value = changedIndicators.ctr;
		kpiGroupTR.cells[3].childNodes[1].value = changedIndicators.ctr_float;
		kpiGroupTR.cells[4].childNodes[0].value = changedIndicators.cpc;
		kpiGroupTR.cells[4].childNodes[1].value = changedIndicators.cpc_float;
		kpiGroupTR.cells[5].childNodes[0].value = changedIndicators.cost;
		kpiGroupTR.cells[5].childNodes[1].value = changedIndicators.cost_float;
		kpiGroupTR.cells[5].childNodes[2].value = changedIndicators.cost;
		//kpiGroupTR.cells[5].childNodes[4].innerHTML = '$ '+Math.round(changedIndicators.cost_float*100)/100;
		kpiGroupTR.cells[6].childNodes[0].value = changedIndicators.conv_rate;
		kpiGroupTR.cells[6].childNodes[1].value = changedIndicators.conv_rate_float;
		kpiGroupTR.cells[7].childNodes[0].value = changedIndicators.cost_conv;
		kpiGroupTR.cells[7].childNodes[1].value = changedIndicators.cost_conv_float;
		kpiGroupTR.cells[8].childNodes[0].value = changedIndicators.conversions;
		kpiGroupTR.cells[8].childNodes[1].value = changedIndicators.conversions_float;
		
		if($('CostDollars'))
			$('CostDollars').innerHTML = '$ '+Math.round(changedIndicators.cost_float*100)/100;
    }
    
    function getMaximumAllowedCost()
    {
    	var allocatedBudget = 0;
    	
    	var kpiGroupRows = document.getElementById('kpi-active-groups').rows;// > tr');
    	
    	for(var i=0; i<kpiGroupRows.length; i++)
    	{
    		allocatedBudget += Number(kpiGroupRows[i].cells[5].childNodes[1].value);
    	}
    	
    	////////////console.log('Allocated Budget: '+allocatedBudget);
    	
    	return (1000-Number(allocatedBudget));
    }
    
    /**
     * Add KPI
     * Adds new KPI Group (TR) to the active list (DOES NOT SAVE)
     * 
     * @param sender DOM element triggering this event
     */
    function addKpi( sender )
    {
    	if(!sender || sender.value <= 0) { return false; }
    	
    	var newIndicators = getCurrentKPI(sender.name, sender.id);
    	
    	disableInput('myOverlay',null,{depth:101,opacity:75,color:'white'});
    	
    	if(newIndicators.group.length <= 0)
    	{
    		alert('Error! You must specify a unique name for this KPI Group before adding it to the list');
    		
    		enableInput();
    		
    		return false;
    	}
    	
    	if(newIndicators.cost <= 0)
    	{
    		alert('Error! You must specify a budget for this KPI group before adding it to the list');
    		
    		enableInput();
    		
    		return false
    	}
   	
    	
    	var kpiGroupRows = $('active-kpis');// $$('table[id="kpis"] tbody[id="active-kpis"]');
    	
    	var kpiGroupRow = new Element('tr');
    	
    	////////////console.log('addKpi() { Creating New TR Element }');
    	
    	for(var i in newIndicators)
    	{
    		////////////console.log('addKpi() { Iterating over indicators: '+i);
    		
    		var indicatorName		 = i;
    		var indicatorName_id	 = i;
    		var indicatorValue		 = newIndicators[i];
    		var indicatorValue_float = newIndicators[i];
    		
    		if(indicatorName == 'group_hidden') { continue; }
    		
    		if(indicatorName == 'group')
    		{
    			var indicatorGroupName = indicatorValue.replace(' ', '');
    		}
    		
    		switch(indicatorName)
    		{
    			case 'impressions':
    				indicatorName	    = 'impression';
    				indicatorValue		= Math.round(indicatorValue);
    				indicatorName_id	= indicatorName.substring(0,1).toUpperCase()+indicatorName.substring(1);
    				break;
    			case 'clicks':
    				indicatorValue		= Math.round(indicatorValue);
    				indicatorName_id	= indicatorName.substring(0,1).toUpperCase()+indicatorName.substring(1);
    				break;
    			case 'ctr':
    				indicatorValue		= Math.round(indicatorValue*100);
    				indicatorName_id	= indicatorName.substring(0,1).toUpperCase()+indicatorName.substring(1);
    				break;
    			case 'cpc':
    				indicatorValue		= Math.round(indicatorValue*100)/100;
    				indicatorName_id	= indicatorName.substring(0,1).toUpperCase()+indicatorName.substring(1);
    				break;
    			case 'cost':
    				indicatorValue		= Math.round(indicatorValue*100)/100;
    				indicatorName_id	= indicatorName.substring(0,1).toUpperCase()+indicatorName.substring(1);
    				break;
    			case 'conv_rate':
    				
    				indicatorValue		= Math.round(indicatorValue*100);
    				indicatorName_parts	= indicatorName.split('_');
    				indicatorName_id	= '';
    				
    				for(var j=0; j<indicatorName_parts.length; j++)
    				{
    					indicatorName_id += indicatorName_parts[j].substring(0,1).toUpperCase()+indicatorName_parts[j].substring(1);
    				}
    				
    				break;
    			case 'cost_conv':
    				
    				indicatorValue		= Math.round(indicatorValue*100)/100;
    				indicatorName_parts	= indicatorName.split('_');
    				indicatorName_id	= '';
    				
    				for(var j=0; j<indicatorName_parts.length; j++)
    				{
    					indicatorName_id += indicatorName_parts[j].substring(0,1).toUpperCase()+indicatorName_parts[j].substring(1);
    				}
    				
    				break;
    			case 'conversions':
    				indicatorValue		= Math.round(indicatorValue);
    				indicatorName_id	= indicatorName.substring(0,1).toUpperCase()+indicatorName.substring(1);
    				break;
    		}
    		
    		////////////console.log('addKpi() { Insert new TD & FORM Elements');
    		
    		var kpiGroupCell = new Element('td');
    		
    			////////////console.log('addKpi() { name:'+indicatorName+', id:'+indicatorGroupName+indicatorName_id+', value:'+indicatorValue);
    		
    			kpiGroupCellInput	 = new Element('input',{'type':'text','onblur':'updateKPI(this);','style':'width:100%;','value':indicatorValue,'name':indicatorName});//,'id':indicatorGroupName+indicatorName_id}); 
    			kpiGroupCellInput.id = indicatorGroupName+indicatorName_id;
    			
    			kpiGroupCell.appendChild(kpiGroupCellInput);
    			
    			////////////console.log('addKpi() { name:data[KeyPerformanceIndicator]['+indicatorGroupName+']['+indicatorName+'], id:KeyPerformanceIndicator'+indicatorGroupName+indicatorName_id+', value:'+indicatorValue);
    			
    			kpiGroupCellInput	 = new Element('input',{'type':'hidden','style':'width:100%;','value':indicatorValue_float,'name':'data[KeyPerformanceIndicator]['+indicatorGroupName+']['+indicatorName+']'});//,'id':'KeyPerformanceIndicator'+indicatorGroupName+indicatorName_id}));
    			kpiGroupCellInput.id = 'KeyPerformanceIndicator'+indicatorGroupName+indicatorName_id;
    			
    			kpiGroupCell.appendChild(kpiGroupCellInput);
    			
    		if(indicatorName == 'group')
    		{
    			kpiGroupCellInput	 = new Element('input', {'type':'hidden','name':'data[KeyPerformanceIndicator]['+indicatorGroupName+'][id]','value':''});
    			kpiGroupCellInput.id = 'KeyPerformanceIndicator'+indicatorGroupName+'Id'; 
    			
    			kpiGroupCell.appendChild(kpiGroupCellInput);
    		}
    			
			kpiGroupRow.appendChild(kpiGroupCell);
    	}
    	
    	kpiGroupCell				= new Element('td');
    	kpiGroupCellContainer		= new Element('span', {'style':'display:none;'});
    	kpiGroupCellContainer.id	= 'KeyPerformanceIndicator'+indicatorGroupName+'Span';
    	
    	kpiGroupCellContainerB				= new Element('span', {'style':'display:block;'});
		kpiGroupCellContainerB.id		 	= 'KeyPerformanceIndicator'+indicatorGroupName+'SpanNew';
		kpiGroupCellContainerB.innerHTML	= 'Unsaved';
    	
    	kpiGroupCellInput			= new Element('input', {'type':'checkbox','name':'data[KeyPerformanceIndicator]['+indicatorGroupName+'][delete]','value':1});
    	kpiGroupCellInput.id		= 'KeyPerformanceIndicator'+indicatorGroupName+'Delete';
    	
    	kpiGroupCellContainer.appendChild(kpiGroupCellInput);
    	
    	kpiGroupCellLabel		= new Element('label', {'for':'KeyPerformanceIndicator'+indicatorGroupName+'Delete'});
    	kpiGroupCellContainer.appendChild(kpiGroupCellLabel);
    	
    	kpiGroupCell.appendChild(kpiGroupCellContainer);
    	kpiGroupCell.appendChild(kpiGroupCellContainerB);
    	
    	kpiGroupRow.appendChild(kpiGroupCell);
    	
    	kpiGroupRow.id = "kpi-group-"+indicatorGroupName;
    	
    	kpiGroupRows.appendChild(kpiGroupRow);
    	
    	resetKpi('New');
    	
    	return true;
    }
    
    function resetKpi()
    {
    	var kpiGroup, kpiGroupTR;

    	kpiGroupTR	= document.getElementById('kpi-group-New');
   	
    	for(var i=0; i<kpiGroupTR.cells.length; i++)
    	{
    		for(var j=0; j<kpiGroupTR.cells[i].childNodes.length; j++)
    		{
    			if(kpiGroupTR.cells[i].childNodes[j].tagName == 'INPUT' && kpiGroupTR.cells[i].childNodes[j].type != 'button')
    			{
    				kpiGroupTR.cells[i].childNodes[j].value = '';
    			}
    				
    		}
    	}
    	
    	enableInput();
    	
    	return true;
    }
    
    /**
     * Edit KPI Group
     * Opens AJAX Panel for editing of KPI details
     * 
     * @param websiteId unique id for the active DynamicCreative Website
     * @param groupId unique id for the chosen KPI Group
     * @return
     */
    function editKpiGroup( websiteId, groupId )
    {
    	if(!websiteId || (groupId == false && groupId != 0)) { return false; }
    	
    	render(800,650,'Edit Key Performance Indicators',site_root+'/key_performance_indicators/edit/'+websiteId+'/'+groupId);
    	
    	return true;
    }
    
    /**
     * Delete KPI Group
     * Deletes an existing KPI Group
     * 
     * @param closeOnSuccess
     * @return
     */
    function deleteKpiGroup( websiteId, groupId )
    {
    	if(!websiteId || (groupId == false && groupId != 0)) { return false; }
    	
    	
    	
    	return true;
    }
    
    function saveKpi( closeOnSuccess, portfolio )
    {
    	disableInput('myOverlay',null,{depth:200,opacity:75,color:'white'});
    	
    	// determine if new or existing KPI portfolio
    	if($('KeyPerformanceIndicator'+portfolio+'Id').value > 0)
    	{
    		if(confirm("Changes have been made to this existing KPI Portfolio:\r\n> "+portfolio+".\r\n\r\nDo you wish to keep your previous KPIs for historical purposes ?\r\n> Recommended for significant changes"))
    		{
    			$('KeyPerformanceIndicator'+portfolio+'Override').value = 1;
    		}
    		else
    		{
    			$('KeyPerformanceIndicator'+portfolio+'Override').value = 0;
    		}
    	}
    	
    	if($('SelectedCampaigns'))
    	{
	    	for(var i = 0; i<$('SelectedCampaigns').options.length; i++)
	    	{
	    		$('SelectedCampaigns').options[i].selected = true;
	    	}
    	}
    	
    	var jsonResponse = null;
    	var jsonKpi = null;
    	var j = null;
    	var errors = false;
    	var errorResponses = new Array();
    	
    	new Ajax.Request(site_root+'/websites/save_kpis/', {onComplete:function(transport, json){ jsonResponse = json; }, asynchronous:false, evalJSON:true, parameters:$('FormKeyPerformanceIndicators').serialize()});
    	
    	if(jsonResponse == null)
    	{
    		//////////////console.log('saveKpi(){ JSON Response is NULL! }');
    		
    		enableInput();
    		
    		// there was an error processing the JSON response, or PHP failed
    		return false;
    	}

    	for(j in jsonResponse)
    	{
    		if(j.length <= 0) { continue; }
    		
    		//////////////console.log('saveKpi(){ Iterate JSON: `'+j+'` }');
    		
    		// preprare DOM Element Id lookup (strip spaces)
    		formField 		= 'KeyPerformanceIndicator'+j.replace(' ','')+'Id';
    		//formFieldDelete = 'KeyPerformanceIndicator'+j.replace(' ','')+'Span'
    		//formFieldNew 	= 'KeyPerformanceIndicator'+j.replace(' ','')+'SpanNew'
    		
    		jsonKpi = jsonResponse[j];

    		// check for error
    		if(jsonKpi[0].error.length > 0)
    		{
    			//////////////console.log('saveKpi(){ KPI Error: `'+jsonKpi[0].error+'` }');
    			
    			// there was an error with this KPI group
    			errors = true;
    			errorResponses.push(jsonKpi[0].error);
    		}
    		else
    		{
    			if(isNaN(jsonKpi[0].id))
    			{
    				// we have an error; no id was saved or returned ?
    				errors = true;
    				errorResponses.push('Error! We were unable to save data for the Key Performance Indicator group: `'+j+'`');
    				
    				continue;
    			}
    			
    			////////console.log('saveKpi(){ Updating KPI Id ('+formField+'): '+jsonKpi[0].id+' }');
    			
    			// update Id in the event of Save w/o Close
    			if($(formField))
    				$(formField).id = jsonKpi[0].id;
    			
    			//if($(formFieldDelete))
    			//	$(formFieldDelete).style.display = 'block';
    			
    			//if($(formFieldNew))
    			//	$(formFieldNew).style.display = 'none';
    		}
    		
    	}
    	
    	if(!errors)
    	{
    		if(closeOnSuccess) { closeOverlay(); window.location.reload(); }else{ $('errors').style.display	= 'none'; }
    	}
    	else
    	{
    		var listItems = '';
    		
    		for(var i=0; i<errorResponses.length; i++)
    		{
    			listItems += '<li>'+errorResponses[i]+'</li>';
    		}
    		
    		$('errors').innerHTML		= listItems;
    		$('errors').style.display	= 'block';
    	}
    	
    	enableInput();
    }
    
    /**
     * Add Campaign to KPI Group
     * Adds the select Campaign to the KPI Group for matching on report screens; un-assigned Campaigns are only compared with Account Wide KPIs by default 
     * 
     * @param source select box to retrieve Campaign from
     * @param target select box to append Campaign to
     * @return
     */
    function addKpiCampaign( source, target )
    {
    	if(!source) { return false; }
    	
    	for(var i=0; i<source.options.length; i++)
    	{
    		if(source.options[i].selected)
    		{
    			//source.options[source.selectedIndex].style.display = 'none';
    			source.options[i].style.display = 'none';
    			
    			target.options[target.options.length] = new Option(source.options[i].text, source.options[i].value);
    		}
    	
    		//target.options[target.options.length] = new Option(source.options[source.selectedIndex].text, source.options[source.selectedIndex].value);
    	}
    	
    	return true;
    }
    
    /**
     * Remove Campaign from KPI Group
     * Removes the select Campaign from the current KPI Group; un-assigned Campaigns are only compared with Account Wide KPIs by default
     * 
     * @param source select box to retrieve Campaign from
     * @param target select box to return Campaign to
     * @return
     */
    function remKpiCampaign( source, target )
    {
    	if(!source) { return false; }
    	
    	for(var i=0; i<source.options.length; i++)
    	{
    		if(source.options[i].selected)
    		{
    			//$(source.options[source.selectedIndex].value).style.display = 'block';
    			$(source.options[i].value).style.display = 'block';
    		}
    	}	
    	
    	for(var j=0; j<source.options.length; j++)
    	{
			if(source.options[j].selected)
			{
				//source.options[source.selectedIndex] = null;
				source.options[j] = null;
				
				j--;
			}
    	}
    	
    	return true;
    }
    
    function editKpiAssignments( websiteId, kpiId )
    {
    	if((kpiId == null || isNaN(kpiId)) || (websiteId == null || isNaN(websiteId))){ return false; }
    	
    	render(800,450,'Key Peformance Indicator: Assign Campaigns',site_root+'/key_performance_indicators/assign/'+websiteId+'/'+kpiId);
    	
    	return true;
    }
    
    function exportCurrentTrend()
    {
    	$('mode').value = 'custom';
    	$('ajaxFormReport').action = site_root+'/aw_reports/export_trend_report/';
    	$('ajaxFormReport').submit();
    	
    	$('ajaxFormReport').action = site_root+'/aw_reports/trend_report/';
    	
    	//new Ajax.Request(site_root+'/aw_reports/export_trend_report/', {asynchronous:false, evalScript:false, evalJSON:false, parameters:Form.serialize('ajaxFormReport')})
    }
