/***********************************************************************
'(c) Copyright DirectEDI. All Rights Reserved
'
' Project: Outgoing Documents Template
'
' Author: Stas
'
' Requirements: none
'
***********************************************************************/

function LTrim(str){ return str.replace(/^\s*/,''); }
function RTrim(str){ return str.replace(/\s*$/,''); }
function Trim(str){ return LTrim(RTrim(str)); }

function roundOff(fltValue, intPrecision) 
{
	if(isNaN(fltValue))
		return parseInt("NaN");
    
    intPrecision = parseInt(intPrecision);
    fltValue = Math.round(fltValue * Math.pow(10, intPrecision));
    
    return fltValue / Math.pow(10, intPrecision);
}

function parseFloatNumbersOnly( fltValue )
{
    var rx = /^\d*(\.\d+)?$/i;
	return rx.test( fltValue ) ? parseFloat( fltValue ) : NaN;
}
	
/************************************************** GET ELEMENT *******/
function GetParentElement(elem, tagName) 
{
	while(elem  &&  elem.tagName != tagName) 
	{
		elem = elem.parentNode;
	}
	return elem;
}
function GetNextElement(elem, tagName) 
{
	do 
	{
		elem = elem.nextSibling;
	} while(elem  &&  elem.tagName != tagName);
	return elem;
}
function GetPreviousElement(elem, tagName) 
{
	do 
	{
		elem = elem.previousSibling;
	} while(elem  &&  elem.tagName != tagName);
	
	return elem;
}
function GetChildElement(elem, tagName) 
{
	for(var i = 0; i < elem.childNodes.length; i++ )
	{
		if(elem.childNodes[i].tagName == tagName)
			return elem.childNodes[i];
	}
}
function GetPreviousTable(elem) 
{
	do 
	{
		while(elem.tagName != 'TABLE'  &&  elem.previousSibling)
			elem = elem.previousSibling;

		if(elem.tagName != 'TABLE'  &&  elem.parentNode) 
			elem = elem.parentNode;
	
	} while(elem.tagName != 'TABLE'  &&  (elem.previousSibling || elem.parentNode));
	return elem;
}

/************************************************** GET ATTRIBUTE *****/
function GetLineTrCount(tblTarget) 
{
	var intResult = tblTarget.getAttribute('LineTrCount');
	return (intResult != null) ? parseInt(intResult, 10) : 1;
}
function GetHeaderTrCount(tblTarget) 
{
	var intResult = tblTarget.getAttribute('HeaderTrCount');
	return (intResult != null) ? parseInt(intResult, 10) : 1;
}
function GetCheckElementsColumn(tblTarget) 
{
	for(var i = 0; i < tblTarget.rows[0].cells.length; i++ )
	{
		if(tblTarget.rows[0].cells[i].getAttribute("cellContent") == "checkbox") 
			return i;
	}
	return -1;
}
function GetNumbersColumn(tblTarget) 
{
	for(var i = 0; i < tblTarget.rows[0].cells.length; i++ )
	{
		if(tblTarget.rows[0].cells[i].getAttribute("cellContent") == "number") 
			return i;
	}
	return -1;
}
function GetCollapseElementsColumn(tblTarget) 
{
	for(var i = 0; i < tblTarget.rows[0].cells.length; i++ )
	{
		if(tblTarget.rows[0].cells[i].getAttribute("cellContent") == "collapse") 
			return i;
	}
	return -1;
}
function GetItemsOffset(tblTarget) 
{
	var result = GetHeaderTrCount(tblTarget);
	if(tblTarget.getAttribute('TemplateRemoved') != '1')
		result += GetLineTrCount(tblTarget);
	return result;
}

/************************************************** CHECK \ COLLAPSE **/
var CheckColor = '#FFFFE7';
var StandardColor = 'transparent';

function Check(sender, intLineTrCount) 
{
	var newColor = sender.checked ? CheckColor : StandardColor;
	var trCurrentRow = GetParentElement(sender, 'TR');
	
	if(intLineTrCount == null)
		intLineTrCount = GetLineTrCount(GetParentElement(trCurrentRow, 'TABLE')) - 1;
	if(intLineTrCount <= 0)
		intLineTrCount = 1;
	
//	trCurrentRow.style.backgroundColor = newColor;
	trCurrentRow.setAttribute('checked', sender.checked? 1 : 0);
	ApplyDefaultColor(trCurrentRow);
	
	for(var j = 1 ; j < intLineTrCount; j++)
	{
		trCurrentRow = GetNextElement(trCurrentRow, 'TR');
//		trCurrentRow.style.backgroundColor = newColor;
		ApplyDefaultColor(trCurrentRow);
	}
}

var colorOk = "transparent";

function ApplyDefaultColor(trTarget, bitIsError)
{
	if(trTarget.getAttribute('containErrors') == '1')
	{
		trTarget.style.backgroundColor = colorErr;
	}
	else if(trTarget.getAttribute('checked') == '1')
	{
		trTarget.style.backgroundColor = CheckColor;
	}
	else
	{
		trTarget.style.backgroundColor = colorOk;
	}
}

function Collapse(sender, intLineTrCount, correctMainImage) 
{
	var trParentRow = GetParentElement(sender, 'TR');
	var tblParentTable = GetParentElement(sender, 'TABLE');
	
	if(intLineTrCount == null)
		intLineTrCount = GetLineTrCount(tblParentTable);
		
	var collapsed = sender.getAttribute('collapsed');
	var newState = (collapsed == 1) ? 0 : 1;
	var newImage = (collapsed == 1) ? '/templates/images/unroll.gif' : '/templates/images/roll.gif';
	var newStyle = (collapsed == 1) ? 'none' : '';
	
	sender.setAttribute('collapsed', newState);
	sender.src = newImage;
	trParentRow.setAttribute('collapsed', newState);
	
	if(newState == 1)
	{
		trParentRow.removeAttribute('containErrors');
		ApplyDefaultColor(trParentRow);
	}

	for(var i = 1; i < intLineTrCount; i ++)
	{
		trParentRow = GetNextElement(trParentRow, 'TR');
		if(GetNextElement(trParentRow, 'TR') == null)
			break;
		trParentRow.style['display'] = newStyle;
	}
	
	if(correctMainImage == null || correctMainImage == true)
	{
		CorrectCollapseAllButton(tblParentTable, newState);
	}
}

function CorrectCollapseAllButton(tblParentTable, newState)
{
	var LineTrCount = GetLineTrCount(tblParentTable);
	var CollapseElementsColumn = GetCollapseElementsColumn(tblParentTable);
	var startPosition = GetItemsOffset(tblParentTable);
	
	var tdCurrentCell, isCollapsed;
	
	for( var j = startPosition; j < tblParentTable.rows.length ; j += LineTrCount )
	{
		tdCurrentCell = tblParentTable.rows[j].cells[CollapseElementsColumn];
		
		if(!tdCurrentCell.hasChildNodes() || tdCurrentCell.childNodes[0].tagName != 'IMG')
			continue;
		
		isCollapsed = tdCurrentCell.childNodes[0].getAttribute('collapsed');
		
		if(isCollapsed == null) isCollapsed = 0;
			
		if(isCollapsed != newState) return;
	}

	tblParentTable.rows[0].cells[CollapseElementsColumn].childNodes[0].setAttribute('collapsed', newState);
	tblParentTable.rows[0].cells[CollapseElementsColumn].childNodes[0].src = newState ? '/templates/images/roll.gif' : '/templates/images/unroll.gif';
}


/**********************************************************************/
function enableField(field, bitIncludeToXml) 
{
	var element, elementMark;
	if(typeof(field) == 'object')
	{
		element = field;
		elementMark = document.getElementById(element.id + '_Mark');
	}
	else
	{
		element = document.getElementById(field);
		elementMark = document.getElementById(field + '_Mark');
	}
	
	if(element != null)
	{
		element.disabled = false;
		element.style.background = '';
		if(bitIncludeToXml)
		    element.setAttribute('excludeFromXml', 0);
    	CopyValue(element);
    }

	if(elementMark != null)
	{
		elementMark.innerHTML = '*';
	}
	
}
function disableField(field, bitExcludeFromXml) 
{
	var element, elementMark;
	if(typeof(field) == 'object')
	{
		element = field;
		elementMark = document.getElementById(element.id + '_Mark');
	}
	else
	{
		element = document.getElementById(field);
		elementMark = document.getElementById(field + '_Mark');
	}
	
	if(element != null)
	{
		element.className = '';
		element.disabled = true;
		element.style.background = '#CCCCCC';
		if(bitExcludeFromXml)
		    element.setAttribute('excludeFromXml', 1);
    	CopyValue(element);
	}

	if(elementMark != null)
	{
		elementMark.innerHTML = '';
	}
}

function Exists(element)
{
	return (document.getElementById(element) != null);
}

/********************************************************** STATIC *****
 
 all functions can be executed as AddRow(this) \ DeleteSelected(this) \ ...
 defaults:
		HeaderTrCount = 1
		LineTrCount = 1
		CheckElementsColumn = 0
		CollapseElementsColumn = 0
 all previous values can be changed adding corresponding attributes 
 to the selected table:
 <table ... HeaderTrCount="2" LineTrCount="3"> ... </table>
 
************************************************************************/

// adds new row to the current table
// returns total rows number
function AddRow (sender) 
{
	var spnDisableSelected = GetNextElement(sender, 'SPAN');
	spnDisableSelected.style.display = '';
	
	if(sender.tagName != 'TABLE')
		sender = GetPreviousTable(sender);

	var intItemsCounter = sender.getAttribute("ItemsCounter");  // item unique id
    intItemsCounter = (intItemsCounter == null)? 10000 : parseInt(intItemsCounter, 10) + 1;
    sender.setAttribute("ItemsCounter", intItemsCounter);
		
	var intHeaderLength = GetHeaderTrCount(sender);
	var intTemplateLength = GetLineTrCount(sender);
	var intNumbersColumn = GetNumbersColumn(sender);

	var tBody = GetChildElement(sender, 'TBODY');
	
	for(var i = 0; i < intTemplateLength; i++ )
	{
		var trNew = sender.rows[intHeaderLength + i].cloneNode(true);

		trNew.removeAttribute('excludeFromXml');
		fixTemplateRow(trNew, intItemsCounter);

		trNew.style['display'] = (i == 0) ? '' : 'none';
		
		tBody.appendChild(trNew);
	}
	
	if(intNumbersColumn != -1)
	{
		var lastRow = sender.rows[sender.rows.length - intTemplateLength];
		lastRow.cells[intNumbersColumn].innerHTML = Count(sender);
	}

	
	return (sender.rows.length - intHeaderLength - intTemplateLength) / intTemplateLength;
}

function includeToXml(sender)
{
	if(sender.attributes)
		sender.removeAttribute('excludeFromXml');
	for(var i = 0; i < sender.childNodes.length; i ++)
	{
		includeToXml(sender.childNodes[i]);
	}
}

function Enumerate(sender)
{
	var intNumbersColumn = GetNumbersColumn(sender);
	var intLineTrCount = GetLineTrCount(sender);
	var intItemsOffset = intLineTrCount + GetHeaderTrCount(sender);
	if(intNumbersColumn != -1)
	{
		var itemIndex = 1;
		for(var i = intItemsOffset; i < sender.rows.length ; i += intLineTrCount )
		{
			sender.rows[i].cells[intNumbersColumn].innerHTML = itemIndex++;
		}
	}
	return itemIndex - 1;
}

// deletes selected rows from the current table
// returns deleted rows number

var arrOnDeleteEmptyMessages = new Array();
var arrOnDeleteConfirmMessages = new Array();

function DeleteSelected (sender, strName) 
{
	var spnDeleteSelected = sender;
	
	if(sender.tagName != 'TABLE')
		sender = GetPreviousTable(sender);
		
	var strErrorMessage = arrOnDeleteEmptyMessages[strName];
	var strConfirmMessage = arrOnDeleteConfirmMessages[strName];
		
	var CheckElementsColumn = GetCheckElementsColumn(sender);
	var LineTrCount = GetLineTrCount(sender);
	var HeaderTrCount = GetHeaderTrCount(sender);
	
	var intDelCounter = 0; 
	for( var j = sender.rows.length - LineTrCount ; j >= LineTrCount + HeaderTrCount ; j -= LineTrCount )
	{
		if(sender.rows[j].cells[CheckElementsColumn].childNodes[0].checked)
		{
			intDelCounter ++;
		}
	}
	
	if(intDelCounter == 0  &&  strErrorMessage != null)
	{
		alert(strErrorMessage);
	}
	else if(strConfirmMessage != null  &&  !confirm(strConfirmMessage))
	{
		return 0;
	}

	for( var j = sender.rows.length - LineTrCount ; j >= LineTrCount + HeaderTrCount ; j -= LineTrCount )
	{
		if(sender.rows[j].cells[CheckElementsColumn].childNodes[0].checked)
		{
			for(var i = 0; i < LineTrCount ; i++ )
			{
				sender.deleteRow(j);
			}
		}
	}
	sender.rows[0].cells[CheckElementsColumn].childNodes[0].checked = false;
	
	if(Enumerate(sender) == 0  &&  spnDeleteSelected != null)
		spnDeleteSelected.style.display = 'none';
	
	return intDelCounter;
}

// returns total items number for the current table
function Count (tblTarget) 
{
	if(tblTarget.tagName != 'TABLE')
		tblTarget = GetPreviousTable(tblTarget);
		
	var LineTrCount = GetLineTrCount(tblTarget);
	var ItemsOffset = GetItemsOffset(tblTarget);

	return (tblTarget.rows.length - ItemsOffset) / LineTrCount;
}

// collapses all elements in current table
function CollapseAll(sender) 
{
	var collapsed = sender.getAttribute('collapsed');
	if(collapsed == 1) 
	{
		sender.setAttribute('collapsed', 0);
		sender.src = '/templates/images/unroll.gif';
	}
	else
	{
		sender.setAttribute('collapsed', 1);
		sender.src = '/templates/images/roll.gif';
	}
		
	sender = GetParentElement(sender, 'TABLE');
	
	var HeaderTrCount = GetHeaderTrCount(sender);
	var LineTrCount = GetLineTrCount(sender);
	var CollapseElementsColumn = GetCollapseElementsColumn(sender);

	var tdCurrentCell;
	var startPosition = GetItemsOffset(sender);
	
	for( var j = startPosition ; j < sender.rows.length ; j += LineTrCount )
	{
		tdCurrentCell = sender.rows[j].cells[CollapseElementsColumn];
		
		if(tdCurrentCell.hasChildNodes()  &&  tdCurrentCell.childNodes[0].tagName == 'IMG')
		{
			tdCurrentCell.childNodes[0].setAttribute('collapsed', collapsed);
			Collapse(tdCurrentCell.childNodes[0], LineTrCount, false);
		}
	}
}

// checks all elements in current table
function CheckAll(sender, intCheckTrCount) 
{
	var checked = sender.checked ? 1 : 0;
	var newColor = checked ? CheckColor : StandardColor;

	sender = GetParentElement(sender, 'TABLE');
	
	var HeaderTrCount = GetHeaderTrCount(sender);
	var LineTrCount = GetLineTrCount(sender);
	var CheckElementsColumn = GetCheckElementsColumn(sender);

	if(intCheckTrCount == null)
		intCheckTrCount = LineTrCount - 1;
	if(intCheckTrCount <= 0)
		intCheckTrCount = 1;

	var tdCurrentCell;
	var startPosition = GetItemsOffset(sender);
	
	for( var i = startPosition ; i < sender.rows.length ; i += LineTrCount )
	{
		sender.rows[i].setAttribute('checked', checked);
		ApplyDefaultColor(sender.rows[i]);
		
		tdCurrentCell = sender.rows[i].cells[CheckElementsColumn];
		if(tdCurrentCell.hasChildNodes()  &&  tdCurrentCell.childNodes[0].type == 'checkbox')
		{
			tdCurrentCell.childNodes[0].checked = checked;
			for(var j = 1; j < intCheckTrCount; j++)
			{
				sender.rows[j + i].style.backgroundColor = newColor;
			}
		}
	}
}

/*********************************************** ELEMENTS CORRECTION *****/
function fixTemplateRow(elem, intNumber)
{
	if(elem.attributes)
	{
		if(elem.getAttribute("excludeFromXml") == 1)		// this will stop processing template rows of itemcharges
			return;

        //-------------- adding xmlName ---------------------
		var strHiddenName = elem.getAttribute("hiddenName");
		if(strHiddenName != null)
		{
			elem.setAttribute('xmlName', strHiddenName);
			elem.removeAttribute("hiddenName");
		}

        //-------------- id-s replace -----------------------
        if(elem.id != null && elem.id != '')
            elem.id = elem.id.replace('#id#', intNumber);

        if(elem.name != null && elem.name != '')
            elem.name = elem.name.replace('#id#', intNumber);

        if(elem.value != null && elem.value != '')
            elem.value = elem.value.replace('#id#', intNumber);
        
        //-------------- actions replace --------------------
        var f;
        if(elem.onclick != null  &&  elem.onclick != '')
        {
	        f = elem.onclick.toString();
  	        f = f.substring(f.indexOf('{') + 1, f.indexOf('}'));
  	        f = f.replace('#id#', intNumber);
  		    elem.onclick = new Function('', f);
  	    }
      	
        if(elem.onchange != null  &&  elem.onchange != '')
        {
	        f = elem.onchange.toString();
  	        f = f.substring(f.indexOf('{') + 1, f.indexOf('}'));
  	        f = f.replace('#id#', intNumber);
  		    elem.onchange = new Function('', f);
  	    }


	}

    for(var i = 0 ; i < elem.childNodes.length; i++ )
        fixTemplateRow(elem.childNodes[i], intNumber);
}


function replaceId(elem, intNumber)
{
	if(elem.attributes != null)
	{
        if(elem.id != null && elem.id != '')
            elem.id = elem.id.replace('#id#', intNumber);

        if(elem.name != null && elem.name != '')
            elem.name = elem.name.replace('#id#', intNumber);

        if(elem.value != null && elem.value != '')
            elem.value = elem.value.replace('#id#', intNumber);
        
        //----------------- actions replace -----------------
        var f;
        if(elem.onclick != null  &&  elem.onclick != '')
        {
	        f = elem.onclick.toString();
  	        f = f.substring(f.indexOf('{') + 1, f.indexOf('}'));
  	        f = f.replace('#id#', intNumber);
  		    elem.onclick = new Function('', f);
  	    }
      	
        if(elem.onchange != null  &&  elem.onchange != '')
        {
	        f = elem.onchange.toString();
  	        f = f.substring(f.indexOf('{') + 1, f.indexOf('}'));
  	        f = f.replace('#id#', intNumber);
  		    elem.onchange = new Function('', f);
  	    }
    }
   
    for(var i = 0 ; i < elem.childNodes.length; i++ )
        replaceId(elem.childNodes[i], intNumber);
}

/**************************************************** PRINT PREVIEW ******/

function CopyValue(elem)
{
	var nextDiv = GetNextElement(elem, 'DIV');
	if(nextDiv != null)
	{
	    if(elem.disabled == true)
	    {
	        nextDiv.innerHTML = "&nbsp;";
	    }
		else if(elem.tagName == "INPUT")
		{
			//nextDiv.innerHTML = (elem.value == "") ? "&nbsp;" : elem.value;
			nextDiv.innerHTML = elem.value + "&nbsp;";
		}
		else if(elem.tagName == "SELECT")
		{
		    var e = elem.options[elem.selectedIndex];
			nextDiv.innerHTML = (e.value == "") ? "&nbsp;" : e.innerHTML;
		}
	}
}


