function BasketManager()
{
    /**
     * TODO: clear globals + other mess....
     * m_basketForm
     * m_iNumberOfBasketSubmits
     * m_bIsCustomerLoggedIn
     * m_mainFormManager
     * getBasketForm
     * setFormFieldValues
     * doLogin
     * m_vasManager
     */

    this.init = init;
    
    this.addOrderLine          = addOrderLine;
    this.addOrderLines         = addOrderLines;
    this.addVASOrderLines      = addVASOrderLines;
    this.addVASPrintingLine    = addVASPrintingLine;
    this.addToBasket           = addToBasket;
    this.addToBasket1          = addToBasket1;
    this.addToBasket2          = addToBasket2;
    this.checkout              = checkout;
	this.checkout_deliverydate = checkout_deliverydate;//added by pankaj khattar-20 sep 2007-[SR 2804] 
    this.clearBasket           = clearBasket; // IHE 20050311 (moved here from pmsspecific)
    this.deleteOrderLine       = deleteOrderLine;
    this.getNewLineNumber      = getNewLineNumber;
    this.getOrder              = getOrder;
    this.getOrderLines         = getOrderLines;
    this.getVASPrintings       = getVASPrintings;
    this.order                 = order;
    this.quote                 = quote;
    this.refresh               = refresh;
    this.removeOrderLine       = removeOrderLine;
    this.removeReferringLines  = removeReferringLines;
    this.removeVariants        = removeVariants;
    this.requestDoPayment      = requestDoPayment;
    this.requestSample         = requestSample;
    this.setDate               = setDate;
    this.setDeliveryDate       = setDeliveryDate;
    this.setOrder              = setOrder;
    this.updateBasket          = updateBasket;
    this.updateLineQuantity    = updateLineQuantity;
    this.setCheckDeliveryDatesMessage = setCheckDeliveryDatesMessage; // IHE 20050408

	//Added by KPA for IMPRINT/PRICING module on 18OCT08
	this.addToDecoBasket          = addToDecoBasket;
	this.addToImprintBasket       = addToImprintBasket;
	this.getImprintBasketForm	  = getImprintBasketForm;
	this.updateImprintBasket      = updateImprintBasket;
	//END by KPA for IMPRINT/PRICING module on 18OCT08
	//Added by KPA for OnlinePayment(Credit Card) module
	this.onlinepayment			  = onlinepayment;
	this.placeonlinepayment		  = placeonlinepayment;
	//End by KPA for OnlinePayment(Credit Card) module

    var m_rOrder         = null;
    var m_rsOrderLines   = null;
    var m_rsVASPrintings = null;
    
    var m_fForm          = null;
    
    var m_sDistributorID = null;

    var m_sCheckDatesMessage = null;
    var m_rsUsers        = null;


    /*******************************************************************************
     * Lifecycle methods
     *******************************************************************************/

    function init(rOrder, rsOrderLines, rsVASPrintings, fForm, sDistributorID)
    {
        m_rOrder         = rOrder;
        m_rsOrderLines   = rsOrderLines;
        m_rsVASPrintings = rsVASPrintings;
        
        m_fForm          = fForm;
        if ( m_fForm == null ) { m_fForm = getBasketForm(); }
        
        m_sDistributorID = sDistributorID;
    }

    function setOrder(rOrder, rsOrderLines, rsVASPrintings)
    {
        m_rOrder         = rOrder;
        m_rsOrderLines   = rsOrderLines;
        m_rsVASPrintings = rsVASPrintings;
    }

    // IHE 20050408
    function setCheckDeliveryDatesMessage(sMessage)
    {
        m_sCheckDatesMessage = sMessage;
    }

    /*******************************************************************************
     * Public methods
     *******************************************************************************/
    function getOrder()
    {
        return m_rOrder;
    }

    function clearBasket()
    {
        m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.CLEAR_BASKET);
        m_mainFormManager.submit();
    }

    function getOrderLines()
    {
        return m_rsOrderLines;
    }

    function getVASPrintings()
    {
        return m_rsVASPrintings;
    }

    function setLines(rsOrderLines, rsVASPrintings)
    {
        m_rsOrderLines   = rsOrderLines;
        m_rsVASPrintings = rsVASPrintings;
    }


    function placeOrder()
    {
        if ( formValidation.isFormValid() == false ) { return; }
    
        if ( m_iNumberOfBasketSubmits > 0 ) { return; }
        m_iNumberOfBasketSubmits++;
    
        m_basketForm.elements[PMSFinals.ACTION   ].value = PMSFinals.PLACE_ORDER;
        m_basketForm.elements[PMSFinals.ORDERTYPE].value = PMSFinals.ORDERTYPE_ORDER;
        m_basketForm.submit();
    }
    
    function requestDoPayment()
    {
        if ( formValidation.isFormValid() == false ) { return; }
    
        if ( m_iNumberOfBasketSubmits > 0 ) { return; }
        m_iNumberOfBasketSubmits++;

		var sURL = document.URL;

		sURL = sURL.replace(":8080", "");
		sURL = sURL.replace("http", "https");

		m_basketForm.action = sURL;

        m_basketForm.elements[PMSFinals.ACTION   ].value = "showPaymentPage";
        m_basketForm.elements[PMSFinals.ORDERTYPE].value = "1";
        m_basketForm.submit();

        //m_mainFormManager.addInput(PMSFinals.ACTION               , "showPaymentPage");
        
        //TODO: 
        // set address fields in rOrder
        
        //m_mainFormManager.addInput(PMSFinals.ORDER              , ProtocolFinals.US + m_rOrder.rowSet .writeObject());
        //m_mainFormManager.addInput(PMSFinals.ORDERLINES         , ProtocolFinals.US + m_rsOrderLines  .writeObject());
        //m_mainFormManager.addInput(PMSFinals.VASPRINTINGS       , ProtocolFinals.US + m_rsVASPrintings.writeObject());
        //m_mainFormManager.addInput("META.CONTAINSSERIALIZEDDATA", "1");

        //m_mainFormManager.submit();
    }

	function getSessionID(sAction)
	{
		var sSessionID = null;

		if ( ! sAction ) { return null; }

		var iIndexOfSessionID = sAction.indexOf("jsessionid=");
alert("iIndexOfSessionID: " + iIndexOfSessionID);
		if ( ! iIndexOfSessionID ) { return null; }

		var iIndexOfSemiColon = sAction.indexOf(";", iIndexOfSessionID+11);
		if ( (! iIndexOfSemiColon) || (iIndexOfSemiColon == -1) ) { iIndexOfSemiColon = sAction.length; }
alert("iIndexOfSemiColon: " + iIndexOfSemiColon);

		sSessionID = sAction.substring(iIndexOfSessionID, iIndexOfSemiColon);	

		return sSessionID;
	}
    
    function requestQuotation()
    {
        if ( formValidation.isFormValid() == false ) { return; }
    
        if ( m_iNumberOfBasketSubmits > 0 ) { return; }
        m_iNumberOfBasketSubmits++;
    
        m_basketForm.elements[PMSFinals.ACTION   ].value = PMSFinals.PLACE_ORDER;
        m_basketForm.elements[PMSFinals.ORDERTYPE].value = PMSFinals.ORDERTYPE_QUOTATION;
        m_basketForm.submit();
    }

    function requestSample(iProductID, iArticleID)
    {
        if ( m_bIsCustomerLoggedIn == false ) {
            doLogin();
            return;
        }
    
        var rOrderLine = addOrderLine(iProductID, iArticleID, "1");
        rOrderLine.set(PMSFinals.SAMPLEINDICATOR , "1");
        
        updateBasket();
        
        //reset modification
        m_rsOrderLines.resetModificationType();
    }

    function removeOrderLine(iLineNumber, bRemoveVariants)
    {
        deleteOrderLine(iLineNumber);
        
        if ( bRemoveVariants ) { removeVariants(iLineNumber); }
       
        //make sure the getBasket is called after updateBasket
        m_mainFormManager.addInput("GETBASKET", "1");
        
        updateBasket();
    }

    function deleteOrderLine(iLineNumber)
    {
        var rOrderLine = m_rsOrderLines.findRow(PMSFinals.LINENUMBER , '' + iLineNumber);
        if ( rOrderLine == null ) { return; }
        
        rOrderLine.setModification(ProtocolFinals.MODIFICATIONTYPE_DELETE);
        
        removeReferringLines(iLineNumber);
    }
    
    function removeReferringLines(iRefersToLineNumber)
    {
        var rsOrderLines = m_rsOrderLines.filter(PMSFinals.REFERSTOLINENUMBER, '' + iRefersToLineNumber);
        if ( rsOrderLines.getNumberOfRows() == 0 ) { return; }
        
        var iterator = rsOrderLines.iterator();
        while ( iterator.hasNext() )
        {
            var rOrderLine  = iterator.next();
            
            var sLineNumber         = rOrderLine.get(PMSFinals.LINENUMBER);
            var sRefersToLineNumber = rOrderLine.get(PMSFinals.REFERSTOLINENUMBER);
            if ( sLineNumber == sRefersToLineNumber ) { continue; }
            
                rOrderLine  = m_rsOrderLines.findRow(PMSFinals.LINENUMBER , '' + sLineNumber);
            if ( rOrderLine == null ) { continue; }
    
            rOrderLine.setModification(ProtocolFinals.MODIFICATIONTYPE_DELETE);
    
            removeReferringLines(sLineNumber);
        }
    }
    
    // supports different articles with different quantitities (and, of course, also one single article)
    function addToBasket(s1, s2, bGetShopPresentation)
    {
        if ( m_bIsCustomerLoggedIn == false ) { 
            m_oLastMethod     = this.addToBasket;
            m_oLastMethodArgs = arguments;
            doLogin();
            return;
        }

        var fBasketForm = getBasketForm();
        if ( fBasketForm == null ) { return; }
    
        // if vas specified, the VASManager has prepared the orderlines:
        if ( (m_vasManager != null) &&  m_vasManager.hasVAS() ) { 
            rsVASOrderLines = m_vasManager.getVASOrderLines();
            addVASOrderLines(rsVASOrderLines); 
            
            // save
            updateBasket();
            
            // clear entered quantities
            setFormFieldValues(fBasketForm, "QUANTITY_", "");

            // reset modification
            m_rsOrderLines.resetModificationType();

            return;
        }

        var elements = fBasketForm.elements;
        
        var iNumberOfItems = 0;
        var rFirstLine     = null;
        
        // Added by Pankaj Khattar for making quantity not equal to Zero
	 var no_quantity_zero = 0;
        
        for (var i = 0; i < elements.length; i++)
        {
            var fInputField = elements[i];
            
            var sFieldName  = fInputField.name;
            if ( !sFieldName || (sFieldName.startsWith("QUANTITY_") == false) ) { continue; }
            
            var sQuantity = fInputField.value;
            if ( sQuantity.trim().length == 0 ) { continue; }
            
            iNumberOfItems++;
            
	     // Added by Pankaj Khattar for making quantity not equal to Zero
            if (parseInt(sQuantity) <= 0){ no_quantity_zero++; }

            var iIndexUnderscore  = sFieldName.indexOf("_");
            var sProductArticleID = sFieldName.substring(iIndexUnderscore + 1);
            
            iIndexUnderscore = sProductArticleID.indexOf("_");
    
            var sProductID = sProductArticleID.substring(0, iIndexUnderscore);
            var sArticleID = sProductArticleID.substring(iIndexUnderscore + 1);
            
            var rOrderLine = addOrderLine(sProductID, sArticleID, sQuantity);
            
            // if more variants (multiple sizes) fill addtolinenumber for grouping of orderlines
            if ( iNumberOfItems == 1 ) {
                rFirstLine = rOrderLine;
            } else {
                var sAddToLineNumber = rFirstLine.get("LINENUMBER");
                rFirstLine.set("ADDTOLINENUMBER", sAddToLineNumber);
                rOrderLine.set("ADDTOLINENUMBER", sAddToLineNumber);
            }
        }
        
		//  20060630
		// quantity fileds checking: at lease one quantity should be filled
        if ( iNumberOfItems == 0 ) {
        	alert( m_sBasketAlertQuantityInvalid );
	    	return;
	    }

	// Added by Pankaj Khattar for making quantity not equal to Zero
	if ( no_quantity_zero > 0) {
        	alert( 'Quantity cannot be Zero' );
	    	return;
	    }



        if ( bGetShopPresentation ) {
            m_mainFormManager.addInput("GETSHOPPRESENTATION", "1");

            //make sure the getBasket is called after updateBasket
            m_mainFormManager.addInput("GETBASKET"          , "1");
        }

        // save    
        updateBasket();

        //  20060630
        // inform a product is added to the basket
       
	   //Start Commented by Rizvan Khan for RFC -2241
        //if ( m_bGoBasketAfterAdding == false ) 
		//End Commented by Rizvan Khan for RFC -2241
			
		{
	    	alert( m_sBasketAlertAdding );
		}

        // clear entered quantities
        setFormFieldValues(fBasketForm, "QUANTITY_", "");
        
        m_mainFormManager.removeInput("GETSHOPPRESENTATION");
        m_mainFormManager.removeInput("GETBASKET"          );

        // reset modification
        m_rsOrderLines.resetModificationType();
    }
    
    // supports one article, and checks if any vas lines are added
    function addToBasket1(iProductID, iArticleID, bGetShopPresentation, sVarProductIndicator)
    {
        var fBasketForm = getBasketForm();
        if ( fBasketForm == null ) { return; }

		// quantity filed checking
        var sQuantityFieldName = PMSFinals.QUANTITY + "_" + iProductID + "_" + iArticleID;
        var fQuantityField     = fBasketForm.elements[sQuantityFieldName];
        var sQuantity          = fQuantityField.value;
	    if ( (sQuantity == null) || sQuantity.equals("") || sQuantity.equals("0") ) {
	    	alert( m_sBasketAlertQuantityInvalid );
	    	return;
	    }

		// logging in checking
        //if ( m_bIsCustomerLoggedIn == false) { //Commented by KPA for RFC3859
		if ( m_bIsCustomerLoggedIn == false && m_bRegisterFreeOrder == false) { //Added by KPA for RFC3859

            m_oLastMethod     = this.addToBasket1;
            m_oLastMethodArgs = arguments;
            doLogin(); 
            return;
        }
        
        // if VAS specified
        if ( (m_vasManager != null) &&  m_vasManager.hasVAS() ) { 
            rsVASOrderLines = m_vasManager.getVASOrderLines();
            addVASOrderLines(rsVASOrderLines);
            
            //save
            updateBasket();
            
            //reset modification
            m_rsOrderLines.resetModificationType();

            //clear entered quantities
            setFormFieldValues(fBasketForm, sQuantityFieldName, "");
            return;
        }

        // if product has variants, go to product details to clarify size, color, etc.
        if ( sVarProductIndicator == "V" ) {
        	getProductDetails(iProductID, iArticleID, sQuantity);
        	return;
        }

        var rOrderLine = addOrderLine(iProductID, iArticleID, sQuantity);
   
        if ( bGetShopPresentation ) {
            m_mainFormManager.addInput("GETSHOPPRESENTATION", "1");
            m_mainFormManager.addInput("GETBASKET"          , "1");
        }

        // save
        updateBasket();

        // inform a product is added to the basket
        //Start Commented by Rizvan Khan for RFC -2241
        //if ( m_bGoBasketAfterAdding == false ) 
		//End Commented by Rizvan Khan for RFC -2241
			
		{
	    	alert( m_sBasketAlertAdding );
		}
    }
            
    	//Added by KPA for IMPRINT/PRICING module on 18OCT08
	// To call ProductCalculation.jsp
	function addToDecoBasket(iProductID, iArticleID, bGetShopPresentation, sVarProductIndicator)
    {
        
		var fBasketForm = getBasketForm();
        if ( fBasketForm == null ) { return; }
		
		// quantity filed checking
        var sQuantityFieldName = PMSFinals.QUANTITY + "_" + "DECO" + "_" + iProductID + "_" + iArticleID;
		var sImageName = "IMAGE";
        var fQuantityField     = fBasketForm.elements[sQuantityFieldName];
		var fImageField		   = fBasketForm.elements[sImageName];
        var sQuantity          = fQuantityField.value;
		var sImage			   = fImageField.src;
		m_mainFormManager.addInput("IMAGESRC"          , sImage);
		m_mainFormManager.addInput("PRODUCTID"          , iProductID.toString());
		m_mainFormManager.addInput("ARTICLEID"          , iArticleID.toString());
		if ( (sQuantity == null) || sQuantity.equals("") || sQuantity.equals("0") || sQuantity == 0) {
	    	alert( m_sBasketAlertQuantityInvalid );
	    	return;
	    }
	      /*Added by KPA for SR5510*/
		if(sQuantity < 100){
			alert('please note that the minimum order qty for imprinted items is 100');
			return;
		}
		/*END by KPA for SR5510*/
		m_mainFormManager.addInput("QUANTITY"          , sQuantity);
		
		// logging in checking
      /*  if ( m_bIsCustomerLoggedIn == false ) { 
            m_oLastMethod     = this.addToBasket1;
            m_oLastMethodArgs = arguments;
            doLogin(); 
            return;
        }*/
	   
        // if product has variants, go to product details to clarify size, color, etc.
        if ( sVarProductIndicator == "V" ) {
        	getProductDetails(iProductID, iArticleID, sQuantity);
        	return;
        }
		
        updateDecoBasket();
		
    }


// ImprintOverview.jsp
	function getImprintBasketForm()
{
    var fBasketForm = null;
    
    var fBasketForm = document.forms["ImprintOverviewForm"];
    if ( !fBasketForm ) { return null; }
    
    return fBasketForm;
}


 function addToImprintBasket()
    {
        //alert('addToImprintBasketcalled');
		var fImprintBasketForm = getImprintBasketForm();
        if ( fImprintBasketForm == null ) { return; }

		// logging in checking
        //if ( m_bIsCustomerLoggedIn == false) { //Commented by KPA for RFC3859
	if ( m_bIsCustomerLoggedIn == false && m_bRegisterFreeOrder == false) { //Added by KPA for RFC3859
            m_oLastMethod     = this.addToImprintBasket;
            m_oLastMethodArgs = arguments;
            doLogin(); 
            return;
        }
		
		m_mainFormManager.addInput("IMPRINT_ORDERFLAG"          ,"true");
		m_mainFormManager.addInput("IMPRINT_ARTICLENUMBER", fImprintBasketForm.elements["IMPRINTARTICLENUMBER"].value);
		m_mainFormManager.addInput("IMPRINT_TOTAL_CHARGES", fImprintBasketForm.elements["TOTALCHARGES"].value);
		m_mainFormManager.addInput("IMPRINT_DECORATIONCHARGES_TOTAL", fImprintBasketForm.elements["DECORATIONCHARGESTOTAL"].value);
		m_mainFormManager.addInput("IMPRINT_HANDLINGCHARGES_TOTAL", fImprintBasketForm.elements["HANDLINGCHARGESTOTAL"].value);
		m_mainFormManager.addInput("IMPRINT_SETUPCHARGES_TOTAL", fImprintBasketForm.elements["SETUPCHARGESTOTAL"].value);
		m_mainFormManager.addInput("IMPRINT_PRODUCTPROOFCHARGES_TOTAL", fImprintBasketForm.elements["PRODUCTPROOFCHARGESTOTAL"].value);
		
		var sImprintOrderQuantityFieldName = "ImprintOrderQuantity";
        var fImprintOrderQuantityField = fImprintBasketForm.elements[sImprintOrderQuantityFieldName];
		var sImprintOrderQuantityField = fImprintOrderQuantityField.value;

		var sImprintProductIdFieldName = "ImprintProductId";
        var fImprintProductIdField = fImprintBasketForm.elements[sImprintProductIdFieldName];
		var sImprintProductIdField = fImprintProductIdField.value;

		var sImprintArticleIdFieldName = "ImprintArticleId";
        var fImprintArticleIdField = fImprintBasketForm.elements[sImprintArticleIdFieldName];
		var sImprintArticleIdField = fImprintArticleIdField.value;

		var iCurrentLineNumber = getCurrentLineNumber();
		//alert('iCurrentLineNumber:'+iCurrentLineNumber);
		//var rOrderLine = addImprintOrderLine(sImprintProductIdField, sImprintArticleIdField, sImprintOrderQuantityField)
		rOrderLine = m_rsOrderLines.insertRow();

        rOrderLine.set("DISTRIBUTORID", m_sDistributorID );
        rOrderLine.set("ORDERID"      , m_rOrder.get("ORDERID") );
        
        rOrderLine.set("LINENUMBER", (iCurrentLineNumber+1));
        rOrderLine.set("PRODUCTID" , sImprintProductIdField);
        rOrderLine.set("ARTICLEID" , sImprintArticleIdField);
        rOrderLine.set("QUANTITY"  , sImprintOrderQuantityField );
        
        //if ( sAddToLineNumber ) { rOrderLine.set("ADDTOLINENUMBER", (iCurrentLineNumber+1)); }
        //alert('rOrderLine:'+ rOrderLine);
		
		m_mainFormManager.addInput("IMPRINT_CURRENTLINENUMBER"    ,'' + (iCurrentLineNumber+1));
        
        // save
        //updateImprintBasket();
		updateBasket();

        // inform a product is added to the basket
        if ( m_bGoBasketAfterAdding == false ) {
	    	alert( m_sBasketAlertAdding );
		}
    }



function addImprintOrderLine(iProductID, iArticleID, sQuantity, sAddToLineNumber)
    {
        //alert('addImprintOrderLine called!!!!');
		var rOrderLine = null;
        
        //var iLineNumber = getNewLineNumber();
		var iLineNumber = getCurrentLineNumber();
		iLineNumber = iLineNumber + 1;

        rOrderLine = m_rsOrderLines.insertRow();

        rOrderLine.set("DISTRIBUTORID", m_sDistributorID );
        rOrderLine.set("ORDERID"      , m_rOrder.get("ORDERID") );
        
        rOrderLine.set("LINENUMBER", iLineNumber);
        rOrderLine.set("PRODUCTID" , iProductID);
        rOrderLine.set("ARTICLEID" , iArticleID);
        rOrderLine.set("QUANTITY"  , sQuantity );
        
        if ( sAddToLineNumber ) { rOrderLine.set("ADDTOLINENUMBER", sAddToLineNumber); }
        //alert('rOrderLine:'+ rOrderLine);
        return rOrderLine;
    }

  function updateImprintBasket()
    {
        m_mainFormManager.addInput(PMSFinals.ACTION    , "updateImprintBasket");
		
		// ProductOverview page will post StartIndex for maintaining the same page when reloading happened
		if (typeof(m_iStartIndex) != "undefined") {
    		m_mainFormManager.addInput(PMSFinals.STARTINDEX, ''+ m_iStartIndex);  //make sure it is a string, else 0 will become ''
		}
		
        m_mainFormManager.submit();
    }

	// ImprintOverview.jsp
	//END by KPA for IMPRINT/PRICING module on 18OCT08
	
	
    // called from VAS.jsp
    function addToBasket2(rsOrderLines, rsVASOrderLines, sLineNumberRemove)
    {
        //set orderlines
        m_rsOrderLines  = rsOrderLines;
        
        addVASOrderLines(rsVASOrderLines); 
    
        //when updating -> remove the old line; referring lines are deleted by the server    
        if ( sLineNumberRemove != null ) {
            var rOrderLineRemove = m_rsOrderLines.findRow(PMSFinals.LINENUMBER, sLineNumberRemove);
            if ( rOrderLineRemove != null ) { rOrderLineRemove.setModification(ProtocolFinals.MODIFICATIONTYPE_DELETE); }
            
            removeReferringLines(sLineNumberRemove);
            removeVariants      (sLineNumberRemove);
        }

        //save
        updateBasket();

        //reset modification
        m_rsOrderLines.resetModificationType();
    }
    
    function addOrderLine(iProductID, iArticleID, sQuantity, sAddToLineNumber)
    {
        var rOrderLine = null;
        
        var iLineNumber = getNewLineNumber();

        rOrderLine = m_rsOrderLines.insertRow();

        rOrderLine.set("DISTRIBUTORID", m_sDistributorID );
        rOrderLine.set("ORDERID"      , m_rOrder.get("ORDERID") );
        
        rOrderLine.set("LINENUMBER", iLineNumber);
        rOrderLine.set("PRODUCTID" , iProductID);
        rOrderLine.set("ARTICLEID" , iArticleID);
        rOrderLine.set("QUANTITY"  , sQuantity );
        
        if ( sAddToLineNumber ) { rOrderLine.set("ADDTOLINENUMBER", sAddToLineNumber); }
        
        return rOrderLine;
    }

    function addVASPrintingLine()
    {
        return m_rsVASPrintings.insertRow();
    }

    function addVASOrderLines(rsVASOrderLines)
    {
        if ( rsVASOrderLines == null ) { return; }
        
        if ( rsVASOrderLines.getNumberOfRows() == 0 ) { return; }
        m_rsOrderLines.appendRowSet(rsVASOrderLines);
    }

    function addOrderLines(rsOrderLines)
    {
        if ( (rsOrderLines == null) || (rsOrderLines.size() == 0) ) { return; }
        
        if ( (m_rsOrderLines == null) || (m_rsOrderLines.size() == 0) ) {  m_rsOrderLines = rsOrderLines; return; }
        
        //add new lines to the existing lines (used when login was triggered after addToBasket)
        m_rsOrderLines.sort("LINENUMBER");
        var rLastLine       = m_rsOrderLines.getLastRow();
        var iLastLineNumber = rLastLine.getInt("LINENUMBER");
        
        var iAdd = iLastLineNumber + 1;
        
        var iterator = rsOrderLines.iterator();

        while ( iterator.hasNext() ) 
        {
            var rLine = iterator.next();

            var iLineNumber         = rLine.getInt("LINENUMBER");
            var iRefersToLineNumber = rLine.getInt("REFERSTOLINENUMBER");
            
            var sRefersToLineNumber = rLine.get("REFERSTOLINENUMBER");

            rLine.set("LINENUMBER", iLineNumber + iAdd);
            
            if ( sRefersToLineNumber != null ) {
                rLine.set("REFERSTOLINENUMBER", iRefersToLineNumber + iAdd);
            }

            m_rsOrderLines.appendRow(rLine.getData());
        }
    }
    
    function updateBasket()
    {
        m_mainFormManager.addInput(PMSFinals.ACTION    , PMSFinals.UPDATEBASKET);
        m_mainFormManager.addInput(PMSFinals.ORDERLINES, ProtocolFinals.US + m_rsOrderLines.writeObject());
        if ( m_rsVASPrintings != null ) {
        	m_mainFormManager.addInput(PMSFinals.VASPRINTINGS, ProtocolFinals.US + m_rsVASPrintings.writeObject());
        }
        m_mainFormManager.addInput("META.CONTAINSSERIALIZEDDATA", "1");

		// ProductOverview page will post StartIndex for maintaining the same page when reloading happened
		if (typeof(m_iStartIndex) != "undefined") {
    		m_mainFormManager.addInput(PMSFinals.STARTINDEX, ''+ m_iStartIndex);  //make sure it is a string, else 0 will become ''
		}
		
        m_mainFormManager.submit();
    }
    

//Added by KPA for IMPRINT/PRICING module on 18OCT08
	function updateDecoBasket()
    {
        m_mainFormManager.addInput(PMSFinals.ACTION    , "updateDecoBasket");
        
		// ProductOverview page will post StartIndex for maintaining the same page when reloading happened
		if (typeof(m_iStartIndex) != "undefined") {
    		m_mainFormManager.addInput(PMSFinals.STARTINDEX, ''+ m_iStartIndex);  //make sure it is a string, else 0 will become ''
		}
		
        m_mainFormManager.submit();
    }
//END by KPA for IMPRINT/PRICING module on 18OCT08
    
    function refreshBasket()
    {
        m_mainFormManager.addInput(PMSFinals.ACTION    , PMSFinals.REFRESHBASKET);
        m_mainFormManager.addInput(PMSFinals.ORDERLINES, ProtocolFinals.US + m_rsOrderLines.writeObject());
        if ( m_rsVASPrintings != null ) {
	        m_mainFormManager.addInput(PMSFinals.VASPRINTINGS, ProtocolFinals.US + m_rsVASPrintings.writeObject());
        }
        m_mainFormManager.addInput("META.CONTAINSSERIALIZEDDATA", "1");

		// ProductOverview page will post StartIndex for maintaining the same page when reloading happened
		if (typeof(m_iStartIndex) != "undefined") {
    		m_mainFormManager.addInput(PMSFinals.STARTINDEX, ''+ m_iStartIndex);  //make sure it is a string, else 0 will become ''
		}
		
        m_mainFormManager.submit();
    }
        
    function getNewLineNumber()
    {
        var iNewLineNumber = 0;
        
        if ( m_rsOrderLines.getNumberOfRows() == 0 ) { return 0; }
        
        m_rsOrderLines.sort("LINENUMBER");

        var rOrder         = m_rsOrderLines.getLastRow();
        var iMaxLineNumber = rOrder.getInt(PMSFinals.LINENUMBER);

        iNewLineNumber = ++iMaxLineNumber;

        return iNewLineNumber;
    }

	 //Added by KPA for IMPRINT/PRICING module on 23OCT08
	 function getCurrentLineNumber()
    {
        var iCurrentLineNumber = 0;
        
        if ( m_rsOrderLines.getNumberOfRows() == 0 ) { return -1; }
        
        m_rsOrderLines.sort("LINENUMBER");

        var rOrder         = m_rsOrderLines.getLastRow();
		//alert(rOrder);
        var iMaxLineNumber = rOrder.getInt(PMSFinals.LINENUMBER);

        iCurrentLineNumber = iMaxLineNumber;

        return iCurrentLineNumber;
    }
	//Added by KPA for IMPRINT/PRICING module on 23OCT08

    function updateLineQuantity(fQuantity)
    {
        var sFieldName  = fQuantity.name;
        var sLinenumber = sFieldName.substring(10);
        
        var rOrderLine  = m_rsOrderLines.findRow("LINENUMBER", sLinenumber);
        if ( rOrderLine == null ) { return; }
        
        var sQuantity = fQuantity.value;
        rOrderLine.update("QUANTITY"   , sQuantity);
        rOrderLine.update("STOCKRESULT", null);
        
        disableCheckOut(m_basketForm);
    }
    
    function disableCheckOut(fForm)
    {
        var checkOutButton = document.getElementById("BUTTONCHECKOUT");
        if ( !checkOutButton ) { return; }
        
        checkOutButton.disabled = true;
    }

    function enableCheckOut(fForm)
    {
        var checkOutButton = document.getElementById("BUTTONCHECKOUT");
        if ( !checkOutButton ) { return; }
        
        checkOutButton.disabled = false;
    }

    function setDeliveryDate(iLineNumber, sDate)
    {
        var rOrderLine  = m_rsOrderLines.findRow("LINENUMBER", iLineNumber);
        if ( rOrderLine == null ) { return; }
        rOrderLine.update("DELIVERYDATE", sDate);

        disableCheckOut(m_basketForm);
    }
    
    function setDate(iLineNumber, sDate)
    {
        if ( sDate ) {
            var e = m_basketForm.elements["DELIVERYDATE__" + iLineNumber + "_PRESENTATION"];
            if ( e ) { datePicker.copyDate(e, sDate); }
        }
    
        disableCheckOut(m_basketForm);
        
        var rOrderLine  = m_rsOrderLines.findRow("LINENUMBER", iLineNumber);
        if ( rOrderLine == null ) { return; }
        rOrderLine.update("STOCKRESULT", null);
    }
    
    function setQuantity(iLineNumber, iQuantity)
    {
        var sFieldname = "QUANTITY__" + iLineNumber;
        
        var fField = m_basketForm.elements[sFieldname];
        fField.value = iQuantity;
        
        updateLineQuantity(fField)
        
        disableCheckOut(m_basketForm);
    }
    
    function order()
    {
		//added by Renu ....on 13 oct 2008......start
 	    var m_sBasketRemarks =	m_basketForm.elements["CUSTOMERREMARKS"].value;
		//alert('remark before change:' + m_sBasketRemarks );
		var m_sBasketRemarks =EditRemarks();
		//alert('After EditRemark:'+ m_sBasketRemarks);
		//added by Renu ...on 13 oct 2008/........end
        //added by pankaj khattar-14 sep 2007-[SR 2806] 
        defineFVAdditionalFields();
        enableAddressValidation();
        if ( !checkCostCenter() ) { return; }
        placeOrder();
        disableAddressValidation();
        //added by pankaj khattar-14 sep 2007-[SR 2806] 
        unDefineFVAdditionalFields();
    }

	//Added by KPA for OnlinePayment(Credit Card) module
	// This Function is used to validate the Input from 2nd CheckOut screen
	function onlinepayment()
    {
		
 	    //alert('onlinepayment:: called');
		//var m_sBasketRemarks =	m_basketForm.elements["SHOPCHECKOUTLABELCUSTOMERREMARKS"].value;
		m_basketForm.elements["CUSTOMERREMARKS"].value;
		var m_sBasketRemarks =EditRemarks();
		defineFVAdditionalFields();
        enableAddressValidation();
        if ( !checkCostCenter() ) { return; }
        placeonlinepayment();
        disableAddressValidation();
        unDefineFVAdditionalFields();
    }

	// This Function is used to submit the form
	function placeonlinepayment()
    {
        if ( formValidation.isFormValid() == false ) { return; }
    
        if ( m_iNumberOfBasketSubmits > 0 ) { return; }
        m_iNumberOfBasketSubmits++;
    
        m_basketForm.elements[PMSFinals.ACTION   ].value = "placeOnlinePayment";
        m_basketForm.elements[PMSFinals.ORDERTYPE].value = PMSFinals.ORDERTYPE_ORDER;
        m_basketForm.submit();
    }
	//End by KPA for OnlinePayment(Credit Card) module

	//commented by pankaj khattar-14 sep 2007-[SR 2806]  
	/*function order()
    {
        enableAddressValidation();
        if ( !checkCostCenter() ) { return; }
        placeOrder();
        disableAddressValidation();
    }*/

	function checkCostCenter() {
    	if ( m_bShowCostCenter && m_bIsCostCenterMandatory ) {
            var sCostCenter = m_basketForm.elements["COSTCENTERID"].value;
            if ( (sCostCenter==null) || (sCostCenter.equals("") )) {
            	alert("Selection in COST CENTER is mandatory!");
            	return false;
            }
        }
    	if ( m_bShowRequestFor && m_bIsRequestForMandatory ) {
    	    var sRequestFor = m_basketForm.elements["REQUESTFOR"].value;
            if ( (sRequestFor==null) || (sRequestFor.equals("") )) {
            	alert("Selection in REQUEST FOR is mandatory!");
            	return false;
            }
        }
        
        return true;
	}
    
    function checkout()
    {  //Added by Pankaj Khattar to make Quantity not equal to '0'
       if ( checkQuantity() == false ) { alert("Quantity cannot be Zero or Blank."); return; } 
        if ( m_bIsCustomerLoggedIn == false ) {
            doLogin();
            return;
        }
        if ( checkDeliveryDates() == false ) { return; }
        checkoutBasket();
    }
    
    //Added by Pankaj Khattar to make Quantity not equal to '0'
    function checkQuantity(){
    	with ( m_basketForm )
        {
        	var itr=0;
            while(true)
            {
            	if(elements["QUANTITY__"+itr]!=undefined){
				//if(!confirm('Step  0 close it?:'+"QUANTITY__"+itr +":"+ elements["QUANTITY__"+itr][1])){return false;}
					if(elements["QUANTITY__"+itr][1] !=undefined){
                	var qtyValue = elements["QUANTITY__"+itr][1].value;
                	if(qtyValue=="" || parseInt(qtyValue)<=0){
                		return false;
                	}
                }
			}
                else{
                	break;
                }
                itr++;
            }
        }
        
        return true;
    }

	//added by pankaj khattar-20 sep 2007-[SR 2804] 
	 function checkout_deliverydate()
        {
        if ( m_bIsCustomerLoggedIn == false ) {
            doLogin();
            return;
            }
        //if ( checkDeliveryDates() == false ) { return; }
        checkoutBasket();
    }
    
    function refresh()
    {   //Added by Pankaj Khattar to make Quantity not equal to '0'
	    if ( checkQuantity() == false ) { alert("Quantity cannot be Zero or Blank."); return; }
        if ( checkDeliveryDates() == false ) { return; }
        refreshBasket();

        enableCheckOut(m_basketForm);
    }
    
    function checkDeliveryDates()
    {
        with ( m_basketForm )
        {
            for ( var i = 0 ; i < m_iDeliveryDateLineNumbers.length; i++ )
            {
                var iLineNumber = m_iDeliveryDateLineNumbers[i];
                var sYYYYMMDD   = elements["DELIVERYDATE__" + iLineNumber].value;
    
                if ( ( sYYYYMMDD.length < 8 ) || ( Date.isYYYYMMDDinFuture(sYYYYMMDD) == false ) ) {
                    alert(m_sCheckDatesMessage);
                    return false;
                }
            }
        }
    
        return true;
    }
    

	//added by Renu ..on 13 oct 2008....RFC-2180......start
	function EditRemarks()
	{
		var m_sBasketRemarks = m_basketForm.elements["CUSTOMERREMARKS"].value;
	//	alert('m_sBasketRemarks:'+ m_sBasketRemarks);
		
		var newstr="";
		var strText=m_sBasketRemarks;
		//alert('strText:'+ strText);
       //var strText=document.getElementById('str').value;
        var strArray=m_sBasketRemarks.split("\r\n");
	//	alert('strArray:'+strArray);
	for(var i=0;i<strArray.length;i++){
  newstr=newstr+strArray[i];
  newstr=newstr+" ";
  // alert('after conversion:'+ newstr);
}  
//alert('after conversion:'+ newstr);
return newstr;
}
//added by Renu on 13 oct. 2008.........RFC-2180.....END

    function quote()
    {
		//added by Renu ....on 13 oct 2008......start
 	    var m_sBasketRemarks =	m_basketForm.elements["CUSTOMERREMARKS"].value;
	//	alert('remark before change:' + m_sBasketRemarks );
		var m_sBasketRemarks =EditRemarks();
	//	alert('After EditRemark:'+ m_sBasketRemarks);
		//added by Renu ...on 13 oct 2008/........end
        var fAddAddress      = m_basketForm.elements["ADDADDRESS"];
        var bValidateAddress = (m_bCustomerMaintenance == false) || (fAddAddress && (fAddAddress.value == "1"));
    
        defineFVAdditionalFields();
        //added by pankaj khattar-14 sep 2007-[SR 2806] 
       enableAddressValidation()
         //commented by pankaj khattar-14 sep 2007-[SR 2806] ;  
       // if ( bValidateAddress ) { enableAddressValidation();  }
       requestQuotation();
         //commented by pankaj khattar-14 sep 2007-[SR 2806] ;  
       // if ( bValidateAddress ) { disableAddressValidation(); }
        //added by pankaj khattar-14 sep 2007-[SR 2806] 
       disableAddressValidation();
       unDefineFVAdditionalFields();
     }


	//commented by pankaj khattar-14 sep 2007-[SR 2806] ;  
	/*function quote()
    {
        var fAddAddress      = m_basketForm.elements["ADDADDRESS"];
        var bValidateAddress = (m_bCustomerMaintenance == false) || (fAddAddress && (fAddAddress.value == "1"));
    
        defineFVAdditionalFields();
    
        if ( bValidateAddress ) { enableAddressValidation();  }
        requestQuotation();
        if ( bValidateAddress ) { disableAddressValidation(); }
    
        unDefineFVAdditionalFields();
    }*/


    /*******************************************************************************
     * Private methods
     *******************************************************************************/

    function removeVariants(iLineNumber)
    {
        var rMainLine = m_rsOrderLines.findRow("LINENUMBER", iLineNumber);
        if ( rMainLine == null ) { return; }

        var sAddToLineNumber = rMainLine.get("ADDTOLINENUMBER");
        if ( sAddToLineNumber == null ) { return; }

        var iterator = m_rsOrderLines.iterator();

        while ( iterator.hasNext() )
        {
            var rLine = iterator.next();

            var sAddTo = rLine.get("ADDTOLINENUMBER");
            if ( (sAddTo == null) || (sAddTo != sAddToLineNumber) ) { continue; }
            
            //var sLineNumber = rLine.get("LINENUMBER");
            //if ( sLineNumber == sAddTo ) { continue; }
            
            rLine.setModification(ProtocolFinals.MODIFICATIONTYPE_DELETE);
        }    
    }
}
function getZones (rsZones, rsZoneRelations, rsDefaultVASes, sArticleImage, sCaptionOPMDEFAULT)
{
    var zones = null;
    
    var bDefault = ( rsDefaultVASes != null );

    var idxZone = 1;
    if ( bDefault == false ) {
        rsZones.sort("ZONEID");

        var itZone  = rsZones.iterator();
        while ( itZone.hasNext() )
        {
            var rZone = itZone.next();

            var sBackgroundImageID = rZone.get   ("BACKGROUNDIMAGEID");
            var sURLObject         = rZone.get   ("URLOBJECT"        );
            var sCompression       = rZone.get   ("COMPRESSION"      );
            var sZoneSetID         = rZone.get   ("ZONESETID"        );
            var sZoneID            = rZone.get   ("ZONEID"           );
            var sZoneRemarks       = rZone.get   ("ZONEDESCRIPTION"  );
            var iZoneXC            = rZone.getInt("ZONE_XC"          );
            var iZoneYC            = rZone.getInt("ZONE_YC"          );
            var iZoneWidth         = rZone.getInt("ZONE_WIDTH"       );
            var iZoneHeight        = rZone.getInt("ZONE_HEIGHT"      );

            var sZonePath          = null;
            if ( sBackgroundImageID == null ) {
                sZonePath          = getURLObject(sArticleImage, sArticleImage);
            } else {
                sZonePath          = getURLObject(sURLObject, sBackgroundImageID);
            }
    
            var zone = new Zone(idxZone, iZoneXC, iZoneYC, iZoneWidth, iZoneHeight, sZoneRemarks, sZonePath, sZoneID, sZoneSetID);
            
            if ( zones == null ) { zones = new Array(); }
            zones[zones.length] = zone;

            //vases per zone:
            if ( (rsZoneRelations != null) && (rsZoneRelations.getNumberOfRows() > 0) ) {
                var rs = rsZoneRelations.filter("ZONEID", sZoneID);
                
                var iterator = rs.iterator();
                while ( iterator.hasNext() )
                {
                    var rRelation         = iterator.next();
                    
                    var sProductID        = rRelation.get("VASPRODUCTID"             );
                    var sArticleID        = rRelation.get("VASARTICLEID"             );
                    var sShortDescription = rRelation.get("DISTRIBUTORVASDESCRIPTION");
                    var sArticleNumber    = rRelation.get("DISTRIBUTORARTICLENUMBER" );
     
                    var oPrintMethod = new PrintMethod(sProductID, sArticleID, sShortDescription, sArticleNumber);
                    zone.printMethods[zone.printMethods.length] = oPrintMethod;
                }
            }
            
            idxZone++;
        }
    } else {
        var sImageURL = getURLObject(sArticleImage, sArticleImage);
        var zone      = new Zone(1, null, null, null, null, sCaptionOPMDEFAULT, sImageURL, 0, 0);
        if ( zones == null ) { zones = new Array(); }
        zones[zones.length] = zone;

        var itVAS  = rsDefaultVASes.iterator();
        while ( itVAS.hasNext() )
        {
            var rVAS = itVAS.next();

            var sProductID        = rVAS.get("VASPRODUCTID"             );
            var sArticleID        = rVAS.get("VASARTICLEID"             );
            var sShortDescription = rVAS.get("DISTRIBUTORVASDESCRIPTION");
            var sArticleNumber    = rVAS.get("DISTRIBUTORARTICLENUMBER" );

            var oPrintMethod = new PrintMethod(sProductID, sArticleID, sShortDescription, sArticleNumber);
            zone.printMethods[zone.printMethods.length] = oPrintMethod;
        }
    }
    
    return zones;
}

function getLogos(rsLogos)
{
    var logos = new Array();
    
    var itLogo = rsLogos.iterator();

    while ( itLogo.hasNext() )
    {
        var rLogo        = itLogo.next();
        var sExternalID  = rLogo.get("EXTERNALID"      );
        var sURLObject   = rLogo.get("URLOBJECT"       );
        var sDescription = rLogo.get("SHORTDESCRIPTION");
        if ( sDescription == null ) { sDescription = ""; }

        sUrlObject       = getURLObject(sURLObject, sExternalID);
        
        var logo         = new Logo(sExternalID, sUrlObject, sDescription);
        logos[logos.length] = logo;
    }
    
    return logos;
}

function getStates(zones, logos)
{
    var states = new Array();

    //Create state objects
    for (var i = 0; i < zones.length; i++)
    {
        states[i] = new ZoneState();
        states[i].bAltered = false;
    }

    var bUpdateMode  = opm_getUpdateMode();
    if ( bUpdateMode == false ) { return states; }
    
    
    var sOrderLineNumber = opm_getMainLineNumber();
    var rsOrderLines     = opm_getOrderLines();
    var rsVASPrintings   = opm_getVASPrintings(sOrderLineNumber);
    
    //Load VASPrintings from basket
    var iterator = rsVASPrintings.iterator();

    while ( iterator.hasNext() )
    {
        var rVASPrinting  = iterator.next();
        var sStoredZoneID = rVASPrinting.get("ZONEID");

        //get the zones index for the zone where zoneid = sStoredZoneID
        var iZoneIndex    = 0;
        var iLengthZone   = zones.length;

        for ( var j = 0; j < iLengthZone; j++ )
        {
           if ( zones[j].zoneid == sStoredZoneID ) { iZoneIndex = j; break; }
        }

        //Configure states[ iZoneIndex ]
        var sRemarks = rVASPrinting.get("REMARKS");
        var sLogoID  = rVASPrinting.get("LOGOID" );

        states[iZoneIndex].bAltered = true;
        states[iZoneIndex].image    = new Image();
        zones [iZoneIndex].logoid   = sLogoID;

        //get and set logo source
        var src = null;
        for ( var l = 0; l < logos.length; l++ )
        {
            if ( logos[l].id == sLogoID ) { src = logos[l].src; break; }
        }

        states[iZoneIndex].zonelogo = src;
        
        var sLineNumber = rVASPrinting.get("LINENUMBER");
        var rOrderLine  = rsOrderLines.findRow("LINENUMBER", sLineNumber);
        
        // get and set print method
        for ( var pm = 0; pm < zones[iZoneIndex].printMethods.length; pm++ )
        {
            if ( (zones[iZoneIndex].printMethods[pm].VASProductID == rOrderLine.get("PRODUCTID")) &&
                 (zones[iZoneIndex].printMethods[pm].VASArticleID == rOrderLine.get("ARTICLEID")) ) 
            {
                states[iZoneIndex].selectedPrintMethod = pm;
                break;
            }
        }

        //cmyks
        states[iZoneIndex].cmyk1   = getShowValue(rVASPrinting.get("CMYK1"));
        states[iZoneIndex].cmyk2   = getShowValue(rVASPrinting.get("CMYK2"));
        states[iZoneIndex].cmyk3   = getShowValue(rVASPrinting.get("CMYK3"));
        states[iZoneIndex].cmyk4   = getShowValue(rVASPrinting.get("CMYK4"));

        states[iZoneIndex].panton1 = getShowValue(rVASPrinting.get("PANTON1"));
        states[iZoneIndex].panton2 = getShowValue(rVASPrinting.get("PANTON2"));
        states[iZoneIndex].panton3 = getShowValue(rVASPrinting.get("PANTON3"));
        states[iZoneIndex].panton4 = getShowValue(rVASPrinting.get("PANTON4"));

        //get logo src form logos
        states[iZoneIndex].left         = rVASPrinting.get("LOGO_XC");
        states[iZoneIndex].top          = rVASPrinting.get("LOGO_YC");
        states[iZoneIndex].width        = rVASPrinting.get("LOGO_WIDTH");
        states[iZoneIndex].height       = rVASPrinting.get("LOGO_HEIGHT");
        states[iZoneIndex].zone_comment = getShowValue(rVASPrinting.get("REMARKS"));
    }

    return states;
}


function validPrintingMethod()
{
    var fPrintingMethods = document.getElementById("PRINTMETHODS");
    if ( !fPrintingMethods) { return true; }
    
    if ( fPrintingMethods.value == 0 ) { return false; }

    return true;
}

//-----------------------------------------
// PRE:  0 if current zone not updated
// POST: 1 if current zone got updated
// POST: 2 if current zone got updated and error
//-----------------------------------------
function saveState()
{
    //validate printing method if zone is operated on

    var zoneposition   = document.getElementById("ZoneLogoPosition");
    if ( !zoneposition ) { return 0; }

    if ( validPrintingMethod() == false ) {
        alert(m_sCaptionOPMSELECTMETHOD);
        return 2;
    } else {
        saveCurrentZone();
        return 1;
    }
}

//-------------------------------------------
// collects all state information.
//-------------------------------------------
function savePrintings()
{
    //check if quantities are filled:
    if ( m_vasManager && (m_vasManager.getBaseQuantity() == 0) ) { alert(m_sVASMessageQuantity); return; }
    
    //current zone may not have been stored yet
    saveState();

    //clear previous main line (and related):
    var bUpdateMode      = opm_getUpdateMode();
    var sOrderLineNumber = opm_getMainLineNumber()
    if ( bUpdateMode ) { opm_deleteOrderLine(sOrderLineNumber); }

    //main orderline (if vas present and used, then the main line is already added):
    var rMainOrderLine  = null;
    var rsVASOrderLines = null;
    
    var rsOrderLines    = opm_getOrderLines();
    
    if ( m_vasManager ) {
        m_vasManager.resetNewOrderLine(rsOrderLines);
        m_vasManager.createVASLines   (rsOrderLines);
        rMainOrderLine  = m_vasManager.getMainOrderLine();
        rsVASOrderLines = m_vasManager.getVASOrderLines();//the new lines
        
        if ( rsVASOrderLines.size() == 0 ) { alert(m_sCaptionOPMMESSAGESELECTPRINTMETHOD); return; }
    }

    if ( !m_vasManager ) { m_sQuantity = getQuantity(); }

    //if not present -> add the orderline
    if ( rMainOrderLine == null ) {
        rMainOrderLine = opm_addOrderLine(m_sProductID, m_sArticleID, m_sQuantity);
    }

    var sDistributorID  = rMainOrderLine.get("DISTRIBUTORID");
    var sOrderID        = rMainOrderLine.get("ORDERID"      );
    var sMainLineNumber = rMainOrderLine.get("LINENUMBER"   );
    
    rMainOrderLine.set("REFERSTOLINENUMBER", sMainLineNumber);
    
    //vas printings are added for the lines that are refering on level 1:
    if ( rsVASOrderLines != null ) { rsVASOrderLines = rsVASOrderLines.filter("REFERSTOLINENUMBER", sMainLineNumber); }

    // get vas product article
    for (var j = 0; j < m_states.length; j++)
    {
        if ( m_states[j].bAltered == false ) { continue; }

        var sVASProductID            = null;
        var sVASArticleID            = null;
        var sVASDescription          = null;
        var sVASDistributorArticleID = null;
        
        if ( m_vasManager ) {
            //sVASProductID            = "1";
            //sVASArticleID            = "1";
        } else {
            var printMethod = m_images["ZoneSelector"][j].printMethods[m_states[j].selectedPrintMethod];
            sVASProductID            = printMethod.VASProductID;
            sVASArticleID            = printMethod.VASArticleID;
            sVASDescription          = printMethod.description;
            sVASDistributorArticleID = printMethod.distributorarticleid;
        }

        var sZoneID     = m_zones[j].zoneid;
        var sZoneSetID  = m_zones[j].zonesetid;
        
        //refering orderline (if vas present and used, then the refering lines are already added):
        var rOrderLine  = null;
        if ( (rsVASOrderLines == null) || (rsVASOrderLines.size() == 0) ) {
            //TODO: multiple sizes in this case
            rOrderLine    = opm_addOrderLine(sVASProductID, sVASArticleID, m_sQuantity);
            rOrderLine.set("REFERSTOLINENUMBER" , sMainLineNumber);
        } else {
            rOrderLine    = rsVASOrderLines.findRow("POSITION", sZoneID);

            sVASProductID = rOrderLine.get("PRODUCTID");
            sVASArticleID = rOrderLine.get("ARTICLEID");
        }

        var sLineNumber = rOrderLine.get("LINENUMBER");

        var sLogoID     = m_zones[j].logoid;

        var sLogoXC     = m_states[j].left;
        var sLogoYC     = m_states[j].top;
        var sLogoWidth  = m_states[j].width;
        var sLogoHeight = m_states[j].height;

        var sComment    = m_states[j].zone_comment;

        var sCMYK1      = m_states[j].cmyk1;
        var sCMYK2      = m_states[j].cmyk2;
        var sCMYK3      = m_states[j].cmyk3;
        var sCMYK4      = m_states[j].cmyk4;

        var sPANTON1    = m_states[j].panton1;
        var sPANTON2    = m_states[j].panton2;
        var sPANTON3    = m_states[j].panton3;
        var sPANTON4    = m_states[j].panton4;

        //add a vasprinting line
        var rVASPrinting = opm_addVASPrintingLine();

        rVASPrinting.set("DISTRIBUTORID", sDistributorID  );
        rVASPrinting.set("ORDERID"      , sOrderID        );
        rVASPrinting.set("LINENUMBER"   , sLineNumber     );
        rVASPrinting.set("ZONESETID"    , sZoneSetID      );
        rVASPrinting.set("ZONEID"       , sZoneID         );
        rVASPrinting.set("LOGOID"       , sLogoID         );
        rVASPrinting.set("CMYK1"        , sCMYK1          );
        rVASPrinting.set("CMYK2"        , sCMYK2          );
        rVASPrinting.set("CMYK3"        , sCMYK3          );
        rVASPrinting.set("CMYK4"        , sCMYK4          );
        rVASPrinting.set("PANTON1"      , sPANTON1        );
        rVASPrinting.set("PANTON2"      , sPANTON2        );
        rVASPrinting.set("PANTON3"      , sPANTON3        );
        rVASPrinting.set("PANTON4"      , sPANTON4        );
        rVASPrinting.set("LOGO_XC"      , sLogoXC         );
        rVASPrinting.set("LOGO_YC"      , sLogoYC         );
        rVASPrinting.set("LOGO_WIDTH"   , sLogoWidth      );
        rVASPrinting.set("LOGO_HEIGHT"  , sLogoHeight     );
        rVASPrinting.set("ZONE_XC"      , null            );
        rVASPrinting.set("ZONE_YC"      , null            );
        rVASPrinting.set("ZONE_HEIGHT"  , null            );
        rVASPrinting.set("REMARKS"      , sComment        );
        rVASPrinting.set("VASPRODUCTID" , sVASProductID   );
        rVASPrinting.set("VASARTICLEID" , sVASArticleID   );
    }
    
    opm_saveOrder();
}

function guiCMYK()
{
    var anchor = document.getElementById("CMYK");
    var table  = document.createElement("TABLE");
    var thead  = document.createElement("THEAD");
    var tr     = document.createElement("TR");
    var th     = document.createElement("TH");
    var text   = document.createTextNode(m_sCaptionOPMCMYK);
    var tbody  = document.createElement("TBODY");

    table.setAttribute("width" , "75");
    table.setAttribute("border", "1");

    th.className = m_sLabelClassName;
    th.appendChild(text);

    tr.appendChild(th);
    thead.appendChild(tr);
    table.appendChild(thead);

    for (var idxRow = 0; idxRow < 4; idxRow++)
    {
        tr = document.createElement("TR");

        td = document.createElement("TD");
        td.setAttribute("width", "75");
        td.setAttribute("align", "center");

        var input = document.createElement("input");
        input.setAttribute("type", "text");
        input.className = m_sInputClassName;

        var t_idx = idxRow + 1;

        var sInputName = "cmyk" + t_idx;
        input.setAttribute("id"       , sInputName);
        input.setAttribute("name"     , sInputName);
        input.setAttribute("size"     , "8");
        input.setAttribute("value"    , "");
        input.setAttribute("maxlength", "8");

        td.appendChild(input);

        tr.appendChild(td);
        tbody.appendChild(tr);
    }

    table.appendChild(tbody);
    anchor.appendChild(table);
}

function guiComment()
{
    var anchorCOMMENT = document.getElementById("REMARKS");

    var table    = document.createElement("TABLE");
    var thead    = document.createElement("THEAD");
    var tr       = document.createElement("TR");
    var td       = document.createElement("TD");
    var text     = document.createTextNode(m_sCaptionOPMCOMMENT);
    var tbody    = document.createElement("TBODY");
    var textarea = document.createElement("textarea");

    table.setAttribute("width"  , "100%");
    table.setAttribute("border" , "0");

    td.setAttribute("align", "left");
    td.className = m_sLabelClassName;

    td.appendChild(text);
    tr.appendChild(td);
    thead.appendChild(tr);
    table.appendChild(thead);

    tr = document.createElement("TR");
    td = document.createElement("TD");

    textarea.setAttribute("id"   , "zone_comment");
    textarea.setAttribute("name" , "zone_comment");
    textarea.setAttribute("cols" , "69");
    textarea.setAttribute("rows" , "5");
    textarea.setAttribute("value", "");

    td.appendChild(textarea);

    tr.appendChild(td);
    tbody.appendChild(tr);
    table.appendChild(tbody);
    anchorCOMMENT.appendChild(table);
}

function PrintMethod(VASProductID, VASArticleID, sVASDescription, sVASDistributorArticleID)
{
    this.VASProductID         = VASProductID;
    this.VASArticleID         = VASArticleID;
    this.description          = sVASDescription;
    this.distributorarticleid = sVASDistributorArticleID;
}

function Zone(id, x, y, width, height, comment, zone_image, zoneid, zonesetid)
{
    this.id           = id;
    this.zoneid       = zoneid;
    this.zonesetid    = zonesetid;
    this.x            = x;
    this.y            = y;
    this.width        = width;
    this.height       = height;
    this.comment      = comment;
    this.image        = new Image();
    this.image.src    = zone_image;
    this.printMethods = new Array();
    this.logoid       = 0;
}

function Logo(id, logo_image, sShortDescription)
{
    this.id               = id;
    this.image            = new Image();
    this.src              = logo_image;
    this.shortdescription = sShortDescription;
}

function State()
{
}

function LogoState()
{
}

// Stores al zone properties, altered by the user
// called from ZoneSelector
function ZoneState(config)
{
    var bAltered        = false;
    var zoneImage       = "";

    var logoid          = ""
    var zonelogo        = "";

    var zonelogo_width  = 20;
    var zonelogo_height = 20;

    var zone_comment    = "";

    var cmyk1           = "";
    var cmyk2           = "";
    var cmyk3           = "";
    var cmyk4           = "";

    var panton1         = "";
    var panton2         = "";
    var panton3         = "";
    var panton4         = "";

    var top             = 0;
    var left            = 0;
    var width           = 0;
    var height          = 0;

    var selectedPrintMethod = null;

    // the zoom index is used for proportional support
    // during zooming.
    // By increasing the logo, this index will be
    // incremented by 1
    var indexZoom       = 0;
    var defaultWidth    = 0;
    var defaultHeight   = 0;
}

function SelectorConfig(
    name,
    screen_position,

    selector_width,
    selector_height,
    selector_border,

    image_navigate_left,
    image_select,
    image_navigate_right,

    width_navigation,
    width_select,
    height_select,

    width_logo,
    height_logo,
    position_navigation,

    state_config,
    state_data,

    guiPosition,
    imagePosition,
    zonelogoPosition)
{
    this.name                = name;
    this.screen_position     = screen_position;

    this.width               = selector_width;
    this.height              = selector_height;
    this.border              = selector_border;

    this.width_navigation    = width_navigation;
    this.width_select        = width_select;
    this.height_select       = height_select;
    this.width_logo          = width_logo;
    this.height_logo         = height_logo;
    this.position_navigation = position_navigation;

    this.state_config        = state_config;
    this.state_data          = state_data;

    this.guiPosition         = guiPosition;
    this.imagePosition       = imagePosition;
    this.ZoneLogoPosition    = zonelogoPosition;
}

function uni_attachEvent(element, eventType, eventHandler)
{
    if ( m_bIsIE5 ) {
        element.attachEvent(eventType, eventHandler);
    }
    
    if ( m_bIsNS6 ) {
        if ( eventType == "onclick"     ) { eventType = "click";     }
        if ( eventType == "onmousedown" ) { eventType = "mousedown"; }
        if ( eventType == "onmouseup"   ) { eventType = "mouseup";   }
        if ( eventType == "onmousemove" ) { eventType = "mousemove"; }

        element.addEventListener(eventType, eventHandler, true);
    }
}

function getAbsoluteLeft(oNode)
{
    var oCurrentNode = oNode;
    var iLeft        = 0;
    
    while ( oCurrentNode.tagName != "BODY" )
    {
        iLeft       += oCurrentNode.offsetLeft;
        oCurrentNode = oCurrentNode.offsetParent;
        
        if ( (m_sContainerID != null) && (oCurrentNode.id == m_sContainerID) ) { break; }
    }

    return iLeft;
}

function getAbsoluteTop(oNode)
{
    var oCurrentNode = oNode;
    var iTop         = 0;
    
    while ( oCurrentNode.tagName != "BODY" )
    {
        iTop        += oCurrentNode.offsetTop;
        oCurrentNode = oCurrentNode.offsetParent;
        
        if ( (m_sContainerID != null) && (oCurrentNode.id == m_sContainerID) ) { break; }
    }
    
    return iTop;
}

function zoomIndex()
{
    this.indexZoom     = 0;
    this.defaultWidth  = document.getElementById("LogoPosition").width;
    this.defaultHeight = document.getElementById("LogoPosition").width;
}

function saveCurrentZone()
{
    var zonebackground = m_images["ZoneSelector"][m_currentState].image.src;
    var zoneposition   = document.getElementById("ZoneLogoPosition");

    m_states[m_currentState].bAltered  = true;
    m_states[m_currentState].zoneImage = zonebackground;
    m_states[m_currentState].zonelogo  = zoneposition.src;
    m_states[m_currentState].width     = zoneposition.width;
    m_states[m_currentState].height    = zoneposition.height;

    // cross browser support
    m_states[m_currentState].top       = GUI._findPosY(zoneposition, true);
    m_states[m_currentState].left      = GUI._findPosX(zoneposition, true);

    // cmyk
    m_states[m_currentState].cmyk1     = document.getElementById("cmyk1").value;
    m_states[m_currentState].cmyk2     = document.getElementById("cmyk2").value;
    m_states[m_currentState].cmyk3     = document.getElementById("cmyk3").value;
    m_states[m_currentState].cmyk4     = document.getElementById("cmyk4").value;

    // panton
    m_states[m_currentState].panton1   = document.getElementById("panton1").value;
    m_states[m_currentState].panton2   = document.getElementById("panton2").value;
    m_states[m_currentState].panton3   = document.getElementById("panton3").value;
    m_states[m_currentState].panton4   = document.getElementById("panton4").value;

    // comment
    m_states[m_currentState].zone_comment = document.getElementById("zone_comment").value;

    // print method
    var fPrintingMethods = document.getElementById("PRINTMETHODS");
    if ( !fPrintingMethods) { return; }
    
    m_states[m_currentState].selectedPrintMethod = fPrintingMethods.value - 1;
}

function openUpload()
{
    window.open("", "UploadLogo", "toolbar=no,location=no,directories=no, status=yes, menubar=no, "
                                + "scrollbars=no, resizeable=no,copyhistory=no, width=300,height=300");
    document.forms['uploadForm'].submit();
}

function deleteLogo()
{
    var iExternalID = m_logos[m_logoSelector.getCurrentLogoState()].id;
    if ( !iExternalID || (iExternalID == 'undefined') ) { return; }

    if ( mustSaveChanges() == false ) { return; }

    document.forms['deleteLogoForm'].EXTERNALID.value = iExternalID;
    document.forms['deleteLogoForm'].submit();
}

function addLogo(iExternalID, sSource, sShortDescription)
{
    sUrlObject = getURLObject(sSource, iExternalID);

    var iIndex = ( (m_logos == null) ? 0 : m_logos.length );
    
    m_logos[iIndex] = new Logo(iExternalID, sUrlObject, sShortDescription);

    m_logoSelector.setCurrentLogoState(iIndex - 1);
    m_logoSelector.showImage();
}

function switchLayer(sLayer)
{
    var element = document.getElementById(sLayer);
    if ( !element) { return; }

    if (element.style.display == "block") {
        element.style.display = "none";
    } else {
        element.style.display = "block";
    }
}

function mustSaveChanges()
{
    var bMustSave = false;

    if ( m_bModified == false ) { return true; }

    bMustSave = confirm(m_sCaptionOPMMESSAGESAVECHANGES);
    if ( bMustSave == false ) { return true; }
    
    savePrintings();

    return bMustSave;
}

function getShowValue(sValue)
{
    if ( sValue == null ) { return ""; }

    return sValue;
}

function LogoSelector( config )
{
    this.showImage           = showImage;
    this.setCurrentLogoState = setCurrentLogoState;
    this.getCurrentLogoState = getCurrentLogoState;
    this.init                = LS_init;

    // Constructor (called once for each instance)
    var m_zoneSelector       = null;
    var m_iCurrentLogoState  = 0;
    var m_states             = new Array();
    var m_bDragging          = false;
    var m_iLeft              = 0;
    var m_iTop               = 0;
    var m_iX                 = 0;
    var m_iY                 = 0;

    var sARROWLEFT           = m_sARROWLEFT;
    var sARROWRIGHT          = m_sARROWRIGHT;
    var sSELECT              = m_sSELECT;
    var sBgColor1            = m_sBackgroundColor1;

    //Create state object
    //read logos from context
    for (var i = 0; i < m_images["LogoSelector"].length; i++) { m_states[m_states.length] = new LogoState(); }

    //initialize
    var pos_nav              = 0;
    var pos_selector_image   = 1;
    if ( config.position_navigation == "top" ) {
        pos_nav              = 0;
        pos_selector_image   = 1;
    } else if ( config.position_navigation == "bottom" ) {
        pos_nav              = 1;
        pos_selector_image   = 0;
    }

    var m_anchor = document.getElementById(config.guiPosition);

    // create table
    var table = document.createElement("TABLE");
    table.setAttribute("cellSpacing", "0");
    table.style.borderColor = sBgColor1;

    var tbody = document.createElement("TBODY");

    // header
    var thead = document.createElement("THEAD");
    var tr    = document.createElement("TR");
    tr.setAttribute("bgColor", sBgColor1);

    var th = document.createElement("TH");
    tr.appendChild(th);
    th = document.createElement("TH");
    th.className = m_sTitleClassName;
    var text = document.createTextNode(m_sCaptionOPMLOGOSELECTOR);
    th.appendChild(text);
    tr.appendChild(th);
    th = document.createElement("TH");
    tr.appendChild(th);
    thead.appendChild(tr);
    table.appendChild(thead);
    
    var logo = null;

    //create table structure
    for (var idxRow = 0; idxRow < 2; idxRow++)
    {
        tr = document.createElement("TR");

        //Create 3 cells per row
        for (var idxCell = 0; idxCell < 3; idxCell++)
        {
            td = document.createElement("TD");

            //format table cell according to config
            if ( pos_nav == idxRow ) {
                td.setAttribute("height", config.height_select);
            } else {
                td.setAttribute("height", config.height - config.height_select);
            }

            //prev
            if ( (idxCell == 0) && (pos_nav == idxRow) ) {
                td.setAttribute("width", config.width_navigation);
                td.setAttribute("align", "center");
                td.setAttribute("id"   , "prevImage");

                logo = document.createElement("IMG");
                logo.setAttribute("src", sARROWLEFT);

                uni_attachEvent(logo, "onclick", Prev, false);
                td.appendChild(logo);
            }

            // select (navigation)
            if ( (idxCell == 1) && (pos_nav == idxRow) ) {
                td.setAttribute("width"  , config.width_select);
                td.setAttribute("align"  , "center");
                td.setAttribute("bgColor", sBgColor1);
                logo = document.createElement("IMG");
                logo.setAttribute("src", sSELECT);
                logo.setAttribute("width", "23");
                logo.setAttribute("alt", m_sCaptionOPMSELECT);
                logo.className = "pointer";

                uni_attachEvent(logo, "onclick", Select, false);
                td.appendChild(logo);
            }

            if ( (idxCell == 0) || (idxCell == 2) ) {
                td.setAttribute("bgColor", sBgColor1);
            }

            // select (logo)
            if ( (pos_selector_image == idxRow) && (idxCell == 1) ) {
                td.setAttribute("align"  , "center");
                td.setAttribute("valign" , "top");
                td.setAttribute("bgColor", "#ffffff");

                logo = document.createElement("IMG");
                if ( m_images[config.name].length > 0 ) {
                    var logourl = m_images[config.name][0].image.src
                    if ( logourl.length > 0 ) { logo.setAttribute("src", logourl); }
                } else {
                    logo.setAttribute("src", m_sNOIMAGE);
                }
                logo.setAttribute("id", config.ZoneLogoPosition);

                //added
                uni_attachEvent(logo, "onmousedown", dragLogo);
                uni_attachEvent(logo, "onmouseup"  , dragendLogo);

                m_oZoneLogo = logo;

                td.appendChild(logo);
            }

            // next
            if ( (idxCell == 2) && (pos_nav == idxRow) ) {
                td.setAttribute("width", config.width_navigation);
                td.setAttribute("align", "center");
                td.setAttribute("id", "nextImage");

                logo = document.createElement("IMG");
                logo.setAttribute("src", sARROWRIGHT);

                uni_attachEvent(logo, "onclick", Next, false);
                td.appendChild(logo);
            }

            tr.appendChild(td);
        }

        tbody.appendChild(tr);
    }

    //    If navigation control is on top, then add a footer
    if ( config.position_navigation == "top" ) {
        tr = document.createElement("TR");
        td = document.createElement("TD");
        td.setAttribute("height" , "8");
        td.setAttribute("bgColor", sBgColor1);
        td.setAttribute("colSpan", "3");
        tr.appendChild(td);
        tbody.appendChild(tr);
    }

    //  append logo index indicator
    tr = document.createElement("TR");
    td = document.createElement("TD");
    tr.appendChild(td);
    td = document.createElement("TD");
    td.setAttribute("id", "logo_indicator");
    td.setAttribute("align", "center");
    td.className = m_sLabelClassName;

    var sStartIndex = ( ((m_logos == null) || (m_logos.length == 0)) ? "0" : "1" );

    var logo_indicator = " " + sStartIndex + " / " + m_images["LogoSelector"].length;
    text = document.createTextNode(logo_indicator);
    td.appendChild(text);

    tr.appendChild(td);
    td = document.createElement("TD");
    tr.appendChild(td);
    tbody.appendChild(tr);

    if ( m_bUploadEnabled ) {
        tr = document.createElement("TR");

        //empty cell
        td = document.createElement("TD");
        tr.appendChild(td);

        td = document.createElement("TD");
        td.setAttribute("id"   , "logobuttons");
        td.setAttribute("align", "center");
        td.style.whiteSpace = 'nowrap';

        //upload button
        button = new Button(m_sCaptionOPMUPLOAD, openUpload);
        td.appendChild(button);

        text = document.createTextNode(" ");
        td.appendChild(text);

        //delete button
        button = new Button(m_sCaptionOPMDELETE, deleteLogo);
        td.appendChild(button);
        tr.appendChild(td);

        tr.appendChild(td);
        tbody.appendChild(tr);
    }

    table.appendChild(tbody);

    table.setAttribute("border", config.border);
    table.setAttribute("width" , config.width);
    table.setAttribute("height", config.height);
    m_anchor.appendChild(table);

    //Initialize panel
    //Should be the last action from the constructor
    showImage();

    function Prev()
    {
        if ( (m_logos == null) || (m_logos.length == 0) ) { return; }

        m_iCurrentLogoState--;
        if ( m_iCurrentLogoState < 0 ) { m_iCurrentLogoState = m_logos.length - 1; }

        showImage();
    }

    function Next()
    {
        if ( (m_logos == null) || (m_logos.length == 0) ) { return; }

        m_iCurrentLogoState++;

        if ( m_iCurrentLogoState > (m_logos.length -1) ) { m_iCurrentLogoState = 0; }

        showImage();
    }

    //create zonelogo and position it centered
    function Select()
    {
        if ( (m_logos == null) || (m_logos.length == 0) ) { return; }

        clearZone();

        var activeZone = m_zones[m_currentState];

        activeZone.logoid = m_images[config.name][m_iCurrentLogoState].id;

        var zone     = document.getElementById("ZonePosition");
        var zonelogo = document.createElement("IMG");
        var src      = m_images[config.name][m_iCurrentLogoState].src;

        zonelogo.setAttribute("src", src);
        zonelogo.setAttribute("id", "ZoneLogoPosition");

        var activeLogo  = getCurrentLogo();

        var x1          = getValue(activeZone.x, 0);
        var y1          = getValue(activeZone.y, 0);
        var iWidth      = getValue(activeZone.width , opm_parseInt(zone.width ));
        var iHeight     = getValue(activeZone.height, opm_parseInt(zone.height));
        var iLogoWidth  = activeLogo.width ;
        var iLogoHeight = activeLogo.height;

        var iCenterX    = x1 + ( iWidth  / 2 );
        var iCenterY    = y1 + ( iHeight / 2 );

        var x = iCenterX - ( iLogoWidth  / 2 );
        var y = iCenterY - ( iLogoHeight / 2 );

        // set zone logo width like logo logo width
        zonelogo.setAttribute("width" , iLogoWidth);
        zonelogo.setAttribute("height", iLogoHeight);
        zonelogo.style.position = "relative";

        if ( m_bIsIE5 ) {
            zonelogo.style.posLeft = x;
            zonelogo.style.posTop  = y;
        } else if ( m_bIsNS6 ) {
            zonelogo.style.left    = x;
            zonelogo.style.top     = y;
        }

        m_oZoneLogo = zonelogo;

        // set state defaults
        zone.appendChild(zonelogo);

        m_zoneSelector.useDrag();
    }

    function getValue(iValue, iDefaultValue)
    {
        var iNewValue = ( (iValue && (iValue != null)) ? iValue : iDefaultValue );
        
        return iNewValue;
    }

    function getCurrentLogo()
    {
        return document.getElementById(config.ZoneLogoPosition);
    }

    function getZoneLogo()
    {
        return document.getElementById(config.ZoneLogoPosition);
    }

    function updatePanel()
    {
        // General
        document.panel.panel_current_logo_idx.value = m_iCurrentLogoState;

        var nextImage        = m_images["LogoSelector"][m_iCurrentLogoState].src;
        var posLastIndex     = nextImage.lastIndexOf("/");
        var strImageNameOnly = nextImage.substring(posLastIndex + 1);
        document.panel.panel_current_logo_image_path.value = strImageNameOnly;

        // Zone logo update
        var anchor = getZoneLogo();
        if ( anchor ) {
            var zonelogo     = anchor.src;
            posLastIndex     = zonelogo.lastIndexOf("/");
            strImageNameOnly = zonelogo.substring(posLastIndex + 1);

            document.panel.panel_current_zone_logo_path.value = strImageNameOnly;
        } else {
            document.panel.panel_current_zone_logo_path.value = "--";
        }

        showImage();
    }

    function showImage()
    {
        if ( (m_logos == null) || (m_logos.length == 0) ) { return; }

        // the logo of the current state index is shown
        var imagePosition = getCurrentLogo();

        // Implement dragging
        var logoImage = document.getElementById(config.ZoneLogoPosition);
        if ( !logoImage ) { alert("Exception: no logoimage"); return; }
        logoImage.src = m_images["LogoSelector"][m_iCurrentLogoState].src;
        
        //prevent no height:
        var iHeight = getImageHeight(logoImage.src);
        
        logoImage.setAttribute("width"    , "80"      );
        logoImage.setAttribute("className", "dragable");

        logoImage.style.position = "relative";

        if ( m_bIsNS6 ) {
            logoImage.style.left    = 0;
            logoImage.style.top     = 0;
        } else if ( m_bIsIE5 ) {
            logoImage.style.posLeft = 0;
            logoImage.style.posTop  = 0;
        }

        var logo_indicator = document.getElementById("logo_indicator");
        if ( !logo_indicator ) { alert("Exception: no logo_indicator"); return; }
        
        logo_indicator.removeChild(logo_indicator.childNodes[0]);

        var sLogoIndicator = (m_iCurrentLogoState + 1) + " / " + m_images["LogoSelector"].length
                           + "   -   " + m_images["LogoSelector"][m_iCurrentLogoState].shortdescription;

        var text           = document.createTextNode(sLogoIndicator);
        logo_indicator.appendChild(text);
    }

    function getImageHeight(source)
    {
        var tmpImage = new Image();
        tmpImage.src = source;

        return tmpImage.height;
    }

    function getImageWidth(source)
    {
        var tmpImage = new Image();
        tmpImage.src = source;

        return tmpImage.width;
    }

    var m_iBackup_pixelLeft = 0;
    var m_iBackup_pixelTop  = 0;

    function dragLogo(event)
    {
        m_bDragging = true;
        
        if ( m_bIsNS6 ) {
            event.preventDefault();
            window.lastX = event.clientX;
            window.lastY = event.clientY;

            var element = event.target.getAttribute("ID");
            if ( element == "LogoPosition" ) {
                window.onmousemove = dragLogoNN6;
                window.onmouseup   = dragendLogoNN6;
                dragLogoNN6(event);
            }
        } else if ( m_bIsIE5 ) {
            dragLogoMSI(event);
        }
    }

    function dragLogoNN6(event)
    {
        var difX = event.clientX - window.lastX;
        var difY = event.clientY - window.lastY;

        var newX1 = opm_parseInt(getCurrentLogo().style.left) + difX;
        var newY1 = opm_parseInt(getCurrentLogo().style.top) + difY;

        // positioner
        getCurrentLogo().style.left = newX1 + "px";
        getCurrentLogo().style.top  = newY1 + "px";

        window.lastX = event.clientX;
        window.lastY = event.clientY;
    }

    function dragLogoMSI(event)
    {
        var imagePosition = getCurrentLogo();
        if ( event.srcElement.className != "dragable" ) { return; }
        
        //no 'var' bfore x,y,z,left,top -> move_logo does not work??
        m_iX = event.clientX;
        m_iY = event.clientY;

        //src = event.srcElement;
        m_iLeft = imagePosition.style.pixelLeft;
        m_iTop  = imagePosition.style.pixelTop;

        //backup
        m_iBackup_pixelLeft = m_iLeft;
        m_iBackup_pixelTop  = m_iTop;

        uni_attachEvent(imagePosition, "onmousemove", move_logo);
    }

    function dragendLogo(event)
    {
        if ( m_bIsIE5 ) {
            dragendLogoMSI(event);
        } else if ( m_bIsNS6 ) {
            dragendLogoNN6(event);
        }

        m_zoneSelector.useDrag();
    }

    function dragendLogoNN6(event)
    {
        window.onmousemove = null;

        if ( m_bDragging == false ) { return; }

        getCurrentLogo().style.left = m_iBackup_pixelLeft;
        getCurrentLogo().style.top  = m_iBackup_pixelTop;

        Select();

        m_bDragging = false;
    }

    function dragendLogoMSI(event)
    {
        if ( m_bDragging == false ) { return; }

        var imagePosition = getCurrentLogo();

        //set selected logo to original position in logo selector
        imagePosition.style.pixelLeft = m_iBackup_pixelLeft;
        imagePosition.style.pixelTop  = m_iBackup_pixelTop;

        Select();

        m_bDragging = false;
    }

    function move_logo()
    {
        if ( (event.button == 1) && m_bDragging ) {   // SJN 20050819: Firefox and Netscape return 0 for left button !!!
            getCurrentLogo().style.pixelLeft = m_iLeft + event.clientX - m_iX;
            getCurrentLogo().style.pixelTop  = m_iTop  + event.clientY - m_iY;

            return false;
        }
    }

    //called when a (new) logo is selected from the logo selector
    function clearZone()
    {
        var anchor     = document.getElementById("ZonePosition"    );
        var t_zonelogo = document.getElementById("ZoneLogoPosition");

        if ( t_zonelogo ) { anchor.removeChild(t_zonelogo); }

        document.getElementById("cmyk1").setAttribute("value", "");
        document.getElementById("cmyk2").setAttribute("value", "");
        document.getElementById("cmyk3").setAttribute("value", "");
        document.getElementById("cmyk4").setAttribute("value", "");

        document.getElementById("panton1").setAttribute("value", "");
        document.getElementById("panton2").setAttribute("value", "");
        document.getElementById("panton3").setAttribute("value", "");
        document.getElementById("panton4").setAttribute("value", "");
    }

    function setCurrentLogoState(iLogoState)
    {
        if ( iLogoState < 0 ) { iLogoState = 0; }
        
        m_iCurrentLogoState = iLogoState;
    }

    function getCurrentLogoState()
    {
        return m_iCurrentLogoState;
    }

    function LS_init(zoneSelector)
    {
        m_zoneSelector = zoneSelector;
    }
}

function Button(sLabel, sEvent)
{
    var button = document.createElement("input");
    button.setAttribute("type" , "button");
    button.className = m_sButtonClassName + " pointer";
    button.setAttribute("value", sLabel);

    uni_attachEvent(button, "onclick", sEvent);

    return button;
}

function guiPANTON()
{
    var anchor = document.getElementById("PANTON");

    var table = document.createElement("TABLE");
    table.setAttribute("width" , "75");
    table.setAttribute("border", "1");

    var thead = document.createElement("THEAD");
    var tr    = document.createElement("TR");

    th   = document.createElement("TH");
    th.className = m_sLabelClassName;
    var text = document.createTextNode(m_sCaptionOPMPANTON);
    th.appendChild(text);
    tr.appendChild(th);
    thead.appendChild(tr);
    table.appendChild(thead);

    var tbody = document.createElement("TBODY");

    for (var idxRow = 0; idxRow < 4; idxRow++)
    {
        tr = document.createElement("TR");

        td = document.createElement("TD");
        td.setAttribute("width", "75");
        td.setAttribute("align", "center");

        var input = document.createElement("INPUT");
        input.setAttribute("type", "text");
        input.className = m_sInputClassName;

        var t_idx = idxRow + 1;

        var sInputName = "panton" + t_idx;
        input.setAttribute("id"       , sInputName);
        input.setAttribute("name"     , sInputName);
        input.setAttribute("size"     , "8");
        input.setAttribute("value"    , "");
        input.setAttribute("maxlength", "8");

        td.appendChild(input);

        tr.appendChild(td);
        tbody.appendChild(tr);
    }

    table.appendChild(tbody);
    anchor.appendChild(table);
}

function ZoneSelector( config )
{
    this.init                = ZS_init;
    this.getZoneCanvasX      = getZoneCanvasX;
    this.getZoneCanvasY      = getZoneCanvasY;
    this.getZoneCanvasWidth  = getZoneCanvasWidth;
    this.getZoneCanvasHeight = getZoneCanvasHeight;
    this.useDrag             = useDrag;

    // Constructor
    var m_bScaling           = false;
    var m_bDragging          = false;
    var m_iPosX              = 0;
    var m_iPosY              = 0;

    // selector m_images
    var sARROWLEFT           = m_sARROWLEFT;
    var sARROWRIGHT          = m_sARROWRIGHT;
    var sSELECT              = m_sUNDO;
    var sNULLIMAGE           = m_sNULLIMAGE;
    var sBgColor1            = m_sBackgroundColor1;

    // tool drag and drop
    var m_bDragMode          = false;
    var m_bZoomMode          = false;
    var m_bUseTools          = true;

    // dragging
    var dm_x                 = 0;
    var dm_y                 = 0;
    var dm_left              = 0;
    var dm_top               = 0;

    // initialize
    var pos_nav              = 0;
    var pos_selector_image   = 1;
    if (config.position_navigation == "top") {
        pos_nav              = 0;
        pos_selector_image   = 1;
    } else if (config.position_navigation == "bottom") {
        pos_nav              = 1;
        pos_selector_image   = 0;
    }

    var m_anchor = document.getElementById(config.guiPosition);

    //  create table
    var table = document.createElement("TABLE");
    table.setAttribute("cellSpacing", "0");
    var tbody = document.createElement("TBODY");

    //    header
    var thead = document.createElement("THEAD");
    var tr    = document.createElement("TR");
    tr.setAttribute("bgColor", sBgColor1);

    var th = document.createElement("TH");
    tr.appendChild(th);

    th   = document.createElement("TH");
    th.className = m_sTitleClassName;
    text = document.createTextNode(m_sCaptionOPMZONESELECTOR);
    th.appendChild( text );
    tr.appendChild(th);

    th = document.createElement("TH");
    tr.appendChild(th);
    thead.appendChild(tr);
    table.appendChild(thead);

    //    create table structure
    for (var idxRow = 0; idxRow < 2; idxRow++)
    {
        tr = document.createElement("TR");

        // Create 3 cells per row
        for (var idxCell = 0; idxCell < 3; idxCell++)
        {
            var td = document.createElement("TD");

            // format table cell according to config
            if ( pos_nav == idxRow ) {
                td.setAttribute("height", config.height_select);
            } else {
                td.setAttribute("height", config.height - config.height_select);
            }

            // PREV
            if ( (idxCell == 0) && (pos_nav == idxRow) ) {
                td.setAttribute("width", config.width_navigation);
                td.setAttribute("align", "center");
                td.setAttribute("id"   , "prevImage");
                var logo = document.createElement("IMG");
                logo.setAttribute("src", sARROWLEFT);
                uni_attachEvent(logo, "onclick", Prev);
                td.appendChild(logo);
            }

            // SELECT (navigation)
            if ( (idxCell == 1) && (pos_nav == idxRow) ) {
                td.setAttribute("width"  , config.width_select);
                td.setAttribute("align"  , "center");
                td.setAttribute("bgColor", sBgColor1);

                if ( m_bEditAllowed ) {
                    var logo = document.createElement("IMG");
                    logo.setAttribute("src"  , sSELECT);
                    logo.setAttribute("width", "23");
                    logo.setAttribute("alt"  , m_sCaptionOPMUNDO);
                    logo.className = "pointer";
                    uni_attachEvent(logo, "onclick", undo);
                    td.appendChild(logo);
                }
            }

            if ( (idxCell == 0) || (idxCell == 2) ) {
                 td.setAttribute("bgColor", sBgColor1);
            }

            // SELECT (logo)
            if ( (pos_selector_image == idxRow) && (idxCell == 1) ) {
                td.setAttribute("align"  , "left");
                td.setAttribute("vAlign" , "top");
                td.setAttribute("bgColor", "#ffffff");

                //var url = "url(" + m_images[config.name][0].image.src + ")";
                // prepare background
                var url = null;
                if ( m_images[config.name].length > 0 ) {
                    url = "url(" + m_images[config.name][0].image.src + ")";
                } else {
                    url = "url(" + m_sNOIMAGE + ")";;
                }

                // Null logo (for Netscape 6)
                addNullImage(td);

                // now set the backgroundi
                td.style.backgroundImage = url;
                // show background image only once (no tiling)
                td.style.backgroundRepeat = "no-repeat";

                // make table cell for zone logo callable
                td.setAttribute("id", config.imagePosition);

                td.setAttribute("width", config.width_select);
            }

            // NEXT
            if ( (idxCell == 2) && (pos_nav == idxRow) ) {
                td.setAttribute("width", config.width_navigation);
                td.setAttribute("align", "center");
                td.setAttribute("id"   , "nextImage");

                logo = document.createElement("IMG");
                logo.setAttribute("src", sARROWRIGHT);
                uni_attachEvent(logo, "onclick", Next);
                td.appendChild(logo);
            }

            // tool buttons
            if ( m_bEditAllowed && (idxCell == 2) && (pos_nav != idxRow) ) {
                var logo = document.createElement("IMG");
                logo.setAttribute("src", m_sDRAGIMAGE);
                logo.setAttribute("alt", m_sCaptionOPMDRAGLOGO);

                uni_attachEvent(logo, "onclick", useDrag);
                td.appendChild(logo);

                //centered logo alignment
                td.setAttribute("align", "center");

                td.appendChild(logo);
            }
            tr.appendChild(td);
        }
        tbody.appendChild(tr);
    }

    //    If navigation control is on top, then add a footer
    if ( config.position_navigation == "top" ) {
        tr = document.createElement("TR");
        td = document.createElement("TD");
        td.setAttribute("height" , "8");
        td.setAttribute("bgColor", sBgColor1);
        td.setAttribute("colSpan", "3");
        tr.appendChild(td);
        tbody.appendChild(tr);
    }

    //------------------
    //add logo indicator
    //------------------
    tr = document.createElement("TR");
    var td = document.createElement("TD");
    tr.appendChild(td);
    td = document.createElement("TD");
    td.setAttribute("id"   , "zone_indicator");
    td.setAttribute("align", "center");
    td.className = m_sLabelClassName;

    var sZoneIndicator = " 1 / " + m_images["ZoneSelector"].length;
    var text = document.createTextNode(sZoneIndicator);
    td.appendChild(text);

    tr.appendChild(td);
    td = document.createElement("TD");
    tr.appendChild(td);
    tbody.appendChild(tr);

    table.appendChild(tbody);

    table.setAttribute("border", config.border);
    table.setAttribute("width" , config.width);
    table.setAttribute("height", config.height);
    m_anchor.appendChild(table);

    //Initialize panel
    //Should be the last action from the constructor
    //showImage();

    // Initialize zone canvas boundaries for drag and drop
    var zone_canvas_x_abs  = getAbsoluteLeft(table) + config.width_navigation;
    var zone_canvas_y_abs  = getAbsoluteTop(table)  + config.height_select;
    var zone_canvas_width  = config.width_select;
    var zone_canvas_height = config.height - config.height_select;

    function getZoneCanvasX()      { return zone_canvas_x_abs;  }
    function getZoneCanvasY()      { return zone_canvas_y_abs;  }
    function getZoneCanvasWidth()  { return zone_canvas_width;  }
    function getZoneCanvasHeight() { return zone_canvas_height; }

    function mouseOut()
    {
    }

    // Previous
    function Prev()
    {
        if ( m_zones.length == 1 ) { return; }

        // Check state
        if ( saveState() == 0 ) { return; }

        // Perform job
        m_currentState--;
        if ( m_currentState < 0 ) { m_currentState = m_zones.length - 1; }

        showImage();

        // remove current zone logo
        clearZone();

        // load next zone
        loadZone();

        // show vas for zone
        var activeZone = m_zones[m_currentState];
        showVASZone(activeZone.zoneid);
    }

    function Next()
    {
        if ( m_zones.length == 1 ) { return; }

        // check state
        if ( saveState() == 0 ) { return; }

        // Perform job
        m_currentState++;
        if ( m_currentState > (m_zones.length - 1) ) { m_currentState = 0; }

        showImage();

        // remove current zone logo
        clearZone();

        // load next zone
        loadZone();

        // show vas for zone
        var activeZone = m_zones[m_currentState];
        showVASZone(activeZone.zoneid);
    }

    function undo()
    {
        // reset zone properties
        var zoneposition = document.getElementById(config.ZoneLogoPosition);

        // Update internal state
        if ( zoneposition ) {
            m_states[m_currentState].bAltered  = false;
            m_states[m_currentState].zoneImage = "";
            m_states[m_currentState].zonelogo  = "";
        }

        // Update presentation
        var anchor = document.getElementById(config.imagePosition);
        anchor.removeChild(anchor.childNodes[0]);

        clearZone();

        loadZone();
    }

    function validPrintingMethod()
    {
        var fPrintMethods = document.getElementById("PRINTMETHODS");
        if ( !fPrintMethods ) { return true; }

        if ( fPrintMethods.value == 0 ) {
            alert(m_sCaptionOPMSELECTMETHOD);
            return false;
        }
        
        return true;
    }

    // Before loading the next state, the current zone properties are stored
    function saveState()
    {
        // validate printing method if zone is operated on
        var zoneposition   = document.getElementById(config.ZoneLogoPosition);
        if ( !zoneposition ) { return 1; }

        if ( validPrintingMethod() == false ) { return 0; }

        var zonebackground = m_images["ZoneSelector"][m_currentState].image.src;
        
        m_states[m_currentState].bAltered  = true;
        m_states[m_currentState].zoneImage = zonebackground;
        m_states[m_currentState].zonelogo  = zoneposition.src;
        m_states[m_currentState].width     = zoneposition.width;
        m_states[m_currentState].height    = zoneposition.height;

        m_states[m_currentState].top       = GUI._findPosY(zoneposition, true);
        m_states[m_currentState].left      = GUI._findPosX(zoneposition, true);

        // cmyk
        m_states[m_currentState].cmyk1     = document.getElementById("cmyk1").value;
        m_states[m_currentState].cmyk2     = document.getElementById("cmyk2").value;
        m_states[m_currentState].cmyk3     = document.getElementById("cmyk3").value;
        m_states[m_currentState].cmyk4     = document.getElementById("cmyk4").value;

        // panton
        m_states[m_currentState].panton1   = document.getElementById("panton1").value;
        m_states[m_currentState].panton2   = document.getElementById("panton2").value;
        m_states[m_currentState].panton3   = document.getElementById("panton3").value;
        m_states[m_currentState].panton4   = document.getElementById("panton4").value;

        // comment
        m_states[m_currentState].zone_comment = document.getElementById("zone_comment").value;
        var fPrintMethods = document.getElementById("PRINTMETHODS");
        if ( !fPrintMethods) { return 1; }

        m_states[m_currentState].selectedPrintMethod = fPrintMethods.value - 1;
        
        return 1;
    }

    function loadZone()
    {
        // Load zone    (if set by end-user)
        if ( m_states[m_currentState].bAltered == true ) {
            // background
            // zone logo
            var anchor = document.getElementById(config.imagePosition);
            var logo   = document.createElement("IMG");
            logo.setAttribute("src"   , m_states[m_currentState].zonelogo);
            logo.setAttribute("width" , m_states[m_currentState].width   );
            logo.setAttribute("height", m_states[m_currentState].height  );
            logo.style.position = "relative";

            if ( m_bIsNS6 ) {
                logo.style.top    = m_states[m_currentState].top;
                logo.style.left    = m_states[m_currentState].left;
            } else {
                logo.style.posTop = m_states[m_currentState].top;
                logo.style.posLeft = m_states[m_currentState].left;
            }

            logo.setAttribute("id", config.ZoneLogoPosition);

            uni_attachEvent(logo, "onmousedown", dragZoneLogo);
            uni_attachEvent(logo, "onmouseup"  , dragendLogo);
            m_oZoneLogo = logo;

            anchor.appendChild(logo);

            document.getElementById("zone_comment").value = m_states[m_currentState].zone_comment;

            document.getElementById("cmyk1").value        = m_states[m_currentState].cmyk1;
            document.getElementById("cmyk2").value        = m_states[m_currentState].cmyk2;
            document.getElementById("cmyk3").value        = m_states[m_currentState].cmyk3;
            document.getElementById("cmyk4").value        = m_states[m_currentState].cmyk4;

            document.getElementById("panton1").value      = m_states[m_currentState].panton1;
            document.getElementById("panton2").value      = m_states[m_currentState].panton2;
            document.getElementById("panton3").value      = m_states[m_currentState].panton3;
            document.getElementById("panton4").value      = m_states[m_currentState].panton4;
        }

        drawBorder();
    }

    function drawBorder()
    {
        var zone       = document.getElementById("ZonePosition");
        var activeZone = m_zones[m_currentState];
        var x          = getAbsoluteLeft(zone);
        var y          = getAbsoluteTop (zone);

        var topBorder  = document.createElement("v:line");
        topBorder.id   = "topborder";
        topBorder.style.position  = "absolute";
        topBorder.style.pixelLeft = x + activeZone.x;
        topBorder.style.pixelTop  = y + activeZone.y;
        topBorder.from = getPoint(0, 0);
        topBorder.to   = getPoint(activeZone.width, 0);

        zone.appendChild(topBorder);

        var leftBorder = document.createElement("v:line");
        leftBorder.id  = "leftborder";
        leftBorder.style.position  = "absolute";
        leftBorder.style.pixelLeft = x + activeZone.x;
        leftBorder.style.pixelTop  = y + activeZone.y;
        leftBorder.from = getPoint(0, 0);
        leftBorder.to   = getPoint(0, activeZone.height);

        zone.appendChild(leftBorder);

        var rightBorder = document.createElement("v:line");
        rightBorder.id  = "rightborder";
        rightBorder.style.position = "absolute";
        rightBorder.style.pixelLeft = x + activeZone.x;
        rightBorder.style.pixelTop  = y + activeZone.y;
        rightBorder.from = getPoint(activeZone.width, 0);
        rightBorder.to   = getPoint(activeZone.width, activeZone.height);

        zone.appendChild(rightBorder);

        var bottomBorder = document.createElement("v:line");
        bottomBorder.id  = "bottomborder";
        bottomBorder.style.position  = "absolute";
        bottomBorder.style.pixelLeft = x + activeZone.x;
        bottomBorder.style.pixelTop  = y + activeZone.y;
        bottomBorder.from = getPoint(0, activeZone.height);
        bottomBorder.to   = getPoint(activeZone.width, activeZone.height);

        zone.appendChild(bottomBorder);

    }

    function removeBorder()
    {
        var leftborder = document.getElementById("leftborder");
        leftborder.removeNode();
        
        var rightborder = document.getElementById("rightborder");
        rightborder.removeNode();
        
        var topborder = document.getElementById("topborder");
        topborder.removeNode();
        
        var bottomborder = document.getElementById("bottomborder");
        bottomborder.removeNode();
    }

    function getPoint(x, y)
    {
        return x + "px, " + y + "px";
    }

    function updatePanel()
    {
        var nextImage    = m_images["ZoneSelector"][m_currentState].image.src;
        var posLastIndex = nextImage.lastIndexOf("/");

        // positions
        var zonelogo = document.getElementById(config.ZoneLogoPosition);
        if ( zonelogo ) {
            if ( m_bIsNS6 ) { 
                t_left = zonelogo.style.left; 
                t_top  = zonelogo.style.top;
            } else if ( m_bIsIE5 ) { 
                t_left = zonelogo.style.posLeft; 
                t_top  = zonelogo.style.posTop;
            }
        }

        // tool mode
        var sToolMode = null;
        if ( m_bUseTools == true ) {
            if ( m_bDragMode ) {
                sToolMode = "Dragging";
            }
            if ( m_bZoomMode ) {
                sToolMode = "Zooming";
            }
        }
    }

    function showImage()
    {
        // the logo of the current state index is shown
        var background = document.getElementById(config.imagePosition);
        var url        = m_images["ZoneSelector"][m_currentState].image.src;

        // load background
        var nullImage = document.createElement("IMG");
        nullImage.setAttribute("src", sNULLIMAGE);
        background.appendChild(nullImage);

        url = "url(" + url + ")";
        background.style.backgroundImage  = url;
        background.style.backgroundRepeat = "no-repeat";

        var indicator = document.getElementById("zone_indicator");
        indicator.removeChild(indicator.childNodes[0]);
        var sZoneIndicator = (m_currentState + 1) + " / " + m_images["ZoneSelector"].length
                           + "   -   " + m_images["ZoneSelector"][m_currentState].comment;
        var text = document.createTextNode(sZoneIndicator);
        indicator.appendChild(text);

        // Maintain print methods
        var fPrintMethods = document.getElementById("PRINTMETHODS");
        if ( !fPrintMethods) { return; }

        // Clear options
        for ( var i = 0; i < fPrintMethods.length; ) { fPrintMethods.remove(i); }

        // first remove current options (print methods)
        // add zone related options (print methods)
        // start with an empty option
        var option   = document.createElement("option");
        option.text  = m_sCaptionOPMSELECTMETHOD;
        option.value = 0;

        fPrintMethods[fPrintMethods.length] = option;

        // add valid options
        for (var i = 0; i < m_images["ZoneSelector"][m_currentState].printMethods.length; i++)
        {
            option = document.createElement("option");
            option.text  = m_images["ZoneSelector"][m_currentState].printMethods[i].description;
            option.value = i + 1;

            // check for selected attribute
            if ( m_states[m_currentState].selectedPrintMethod == i ) { option.setAttribute("selected", "true"); }
            fPrintMethods[fPrintMethods.length] = option;
        }
    }

    function clearZone()
    {
        var anchor     = document.getElementById(config.imagePosition);
        var t_zonelogo = document.getElementById(config.ZoneLogoPosition);

        removeBorder();

        if ( t_zonelogo ) {
            anchor.removeChild(t_zonelogo);
            // remove null image
            anchor.removeChild[0];
        }

        document.getElementById("zone_comment").value = "";

        document.getElementById("cmyk1").value        = "";
        document.getElementById("cmyk2").value        = "";
        document.getElementById("cmyk3").value        = "";
        document.getElementById("cmyk4").value        = "";

        document.getElementById("panton1").value      = "";
        document.getElementById("panton2").value      = "";
        document.getElementById("panton3").value      = "";
        document.getElementById("panton4").value      = "";
    }

    function prepareZone()
    {
    }

    function getCurrentZone()
    {
        return document.getElementById(config.imagePosition);
    }

    function getCurrentZoneLogo()
    {
        return document.getElementById(config.ZoneLogoPosition);
    }

    function dragZoneLogo(event)
    {
        // m_oZoneLogo reference already set?
        if ( m_oZoneLogo == null ) { m_oZoneLogo = document.getElementById("ZoneLogoPosition"); }
        
        if ( m_bDragMode == false ) { return; }

        // prepare dragging
        // dm_    : dragging mode
        m_bDragging = true;

        if ( m_bIsIE5 ) {
            dm_x    = event.clientX;
            dm_y    = event.clientY;
            dm_left = m_oZoneLogo.style.posLeft;
            dm_top  = m_oZoneLogo.style.posTop;
            
            m_oZoneLogo.onmouseup   = PositionerIE5;
        } else if ( m_bIsNS6 ) {
            event.preventDefault();
            window.lastX       = event.clientX;
            window.lastY       = event.clientY;
            window.onmousemove = dragLogoNN6;
            window.onmouseup   = dragendLogoNN6;
            dragLogoNN6(event);
            
            m_oZoneLogo.onmouseup   = PositionerNN6;
        }

        m_oZoneLogo.onmousemove = move_zonelogo;
        
    }

    function dragLogoNN6(event)
    {
        var difX = event.clientX - window.lastX;
        var difY = event.clientY - window.lastY;

        var newX1 = opm_parseInt(document.getElementById("ZoneLogoPosition").style.left) + difX;
        var newY1 = opm_parseInt(document.getElementById("ZoneLogoPosition").style.top) + difY;

        document.getElementById("ZoneLogoPosition").style.left = newX1 + "px";
        document.getElementById("ZoneLogoPosition").style.top  = newY1 + "px";

        window.lastX = event.clientX;
        window.lastY = event.clientY;
    }

    function dragendLogoNN6(event)
    {
        m_bDragging             = false;
        window.onmousemove      = null;
        m_oZoneLogo.onmousemove = null;
    }

    function PositionerIE5()
    {
        Positioner(event);
    }

    function PositionerNN6(event)
    {
        Positioner(event);
    }

    // Positioner
    // The positioner respects the zone properties, when moving the zone logo around.
    // If the logo is outside the zone -> move logo into zone
    function Positioner(eEvent)
    {
        if ( typeof eEvent == 'undefined' ) { return; }
        
        var zonelogo      = document.getElementById(config.ZoneLogoPosition);
        var zone          = document.getElementById(config.imagePosition);

        var mouse_x       = eEvent.clientX;
        var mouse_y       = eEvent.clientY;
        var zone_west     = zone_canvas_x_abs;
        var zone_north    = zone_canvas_y_abs;
        var zone_east     = zone_canvas_x_abs + zone_canvas_width;
        var zone_south    = zone_canvas_y_abs + zone_canvas_height;
                      
        var absZoneWidth  = zone.width;
        var absZoneHeight = zone.height;

        //    calculate mouse ponter logo (0,0) deltas
        //
        //    (left,top) ---------------------
        //    |                   |          |
        //    |                  dY          |
        //    |                   |          |
        //     -- dX - m_x, m_y ---- dXX ----
        //    |                   |          |
        //    |                 dYY          |
        //    |                   |          |
        //     ------------------------------

        var activeZone = m_zones[m_currentState];

        var xZone      = getValue(activeZone.x, 0);
        var yZone      = getValue(activeZone.y, 0);
        var widthZone  = getValue(activeZone.width , opm_parseInt(zone.width ));
        var heightZone = getValue(activeZone.height, opm_parseInt(zone.height));

        var absXZone   = opm_parseInt(getAbsoluteLeft(zone)) + xZone;
        var absYZone   = opm_parseInt(getAbsoluteTop (zone)) + yZone;

        var absXLogo   = getAbsoluteLeft(zonelogo);
        var absYLogo   = getAbsoluteTop (zonelogo);

        var widthLogo  = opm_parseInt(zonelogo.width);
        var heightLogo = opm_parseInt(zonelogo.height);

        // relative mouse position within zone logo
        dX  = mouse_x    - absXLogo;
        dXX = widthLogo  - dX;
        dY  = mouse_y    - absYLogo;
        dYY = heightLogo - dY;

        zonelogo.style.position = "relative";

        // WEST
        if ( ( mouse_x - dX ) < absXZone ) {
            if ( m_bIsIE5 ) {
                zonelogo.style.posLeft = xZone - 4;
            } else if ( m_bIsNS6 ) {
                zonelogo.style.left    = Math.max(0, xZone - 4);
            }
        }
        
        // NORTH
        if ( ( mouse_y - dY ) < absYZone ) {
            if ( m_bIsIE5 ) {
                zonelogo.style.posTop = yZone - 1;
            } else if ( m_bIsNS6 ) {
                zonelogo.style.top    = Math.max(0, yZone - 1);
            }
        }
        
        // EAST
        var iLeft = applylogo_getLeft(zonelogo);
        if ( (iLeft + widthLogo) > (xZone + widthZone) ) {
            if ( m_bIsIE5 ) {
                zonelogo.style.posLeft = xZone + widthZone - zonelogo.width - 6;
            } else if ( m_bIsNS6 ) {
                zonelogo.style.left    = Math.max(0, xZone + widthZone - zonelogo.width - 6) + "px";
            }
        }
        
        // SOUTH
        var iTop = getTop(zonelogo);
        if ( (iTop + heightLogo) > (yZone + heightZone) ) {
            if ( m_bIsIE5 ) {
                zonelogo.style.posTop = yZone + heightZone - zonelogo.height - 3;
            } else if ( m_bIsNS6 ) {
                zonelogo.style.top    = Math.max(0, yZone + heightZone - zonelogo.height - 3) + "px";
            }
        }
    }

    function applylogo_getLeft(element)
    {
        if ( !element ) {return 0; }
        
        var iLeft = ( m_bIsIE5 ? element.style.posLeft : element.style.left );
        if ( isNaN(iLeft) == false ) { return iLeft; }
            
        var iIndexOfPX = iLeft.indexOf("px");
        if ( iIndexOfPX < 0 ) { 
            iLeft = parseInt(iLeft); 
        } else {
            var sLeft = iLeft.substring(0, iIndexOfPX);
            iLeft = parseInt(iLeft); 
        }
        
        if ( isNaN(iLeft) ) { iLeft = 0; }
        
        return iLeft;
    }

    function getTop(element)
    {
        if ( !element ) {return 0; }
        
        var iLeft = ( m_bIsIE5 ? element.style.posTop : element.style.top );
        if ( isNaN(iLeft) == false ) { return iLeft; }
            
        var iIndexOfPX = iLeft.indexOf("px");
        if ( iIndexOfPX < 0 ) { 
            iLeft = parseInt(iLeft); 
        } else {
            var sLeft = iLeft.substring(0, iIndexOfPX);
            iLeft = parseInt(iLeft); 
        }
        
        if ( isNaN(iLeft) ) { iLeft = 0; }
        
        return iLeft;
    }

    function getValue(iValue, iDefaultValue)
    {
        var iNewValue = ( (iValue && (iValue != null)) ? iValue : iDefaultValue );
        
        return iNewValue;
    }

    function move_zonelogo()
    {
        if ( typeof event == 'undefined' ) { return false; }
        
        if ( (event.button == 1) && m_bDragging ) {   // SJN 20050819: Firefox and Netscape return 0 for left button !!!
            if ( m_bIsIE5 ) {
                m_oZoneLogo.style.pixelLeft = dm_left + event.clientX - dm_x;
                m_oZoneLogo.style.pixelTop  = dm_top  + event.clientY - dm_y;
            } else if ( m_bIsNS6 ) {
                //TODO
            }

            return false;
        }
    }

    function dragendLogo()
    {
        if ( m_bScaling  ) { m_bScaling  = false; }
        if ( m_bDragging ) { m_bDragging = false; }
    }

    function scale_logo()
    {
        if ( (event.button == 1) && m_bScaling ) {   // SJN 20050819: Firefox and Netscape return 0 for left button !!!
            current_width  = m_oZoneLogo.width;
            current_height = m_oZoneLogo.height;

            new_w = event.clientX - m_iPosX;
            new_h = event.clientY - m_iPosY;

            if ( new_w >= maximumXsize ) { new_w = maximumXsize; }
            if ( new_h >= maximumYsize ) { new_h = maximumYsize; }
            if ( new_w <= minimumXsize ) { new_w = minimumXsize; }
            if ( new_h <= minimumYsize ) { new_h = minimumYsize; }

            m_oZoneLogo.width  = new_w;
            m_oZoneLogo.height = new_h;

            return false;
        }

    }

    function useZoom()
    {
        m_bDragMode = false;
        m_bZoomMode = true;

        showImage();
    }

    function useDrag()
    {
        // enable mouse events
        var anchor = document.getElementById(config.ZoneLogoPosition);
        if ( anchor ) {
            uni_attachEvent(anchor, "onmousedown", dragZoneLogo);
            uni_attachEvent(anchor, "onmouseup"  , dragendLogo);
        }

        m_bZoomMode = false;
        m_bDragMode = true;
    }

    function addNullImage(node)
    {
        var nullImage = document.createElement("IMG");
        if ( !nullImage ) { return; }

        nullImage.setAttribute("src", sNULLIMAGE);
        node.appendChild(nullImage);
    }

    function ZS_init()
    {
        loadZone();
        updatePanel();
        showImage();
    }

    function getStates()
    {
        return this.m_states;
    }
}

function guiZoom()
{
    var sBgColor1 = m_sBackgroundColor1;

    var helperZoom = new Array();
    for (var i = 0; i < m_states.length; i++)
    {
        helperZoom[helperZoom.length] = new zoomIndex();

        var state        = m_states[i];
        var sLogoSource  = state.zonelogo;

        if ( sLogoSource ) {
            var iImageWidth  = getImageWidth(sLogoSource);
            var iImageHeight = getImageHeight(sLogoSource);

            var iCurrentWidth = state.width;

            var deltaX       = iCurrentWidth - 80;
            var resizeFactor = iImageWidth / iImageHeight;
            helperZoom[helperZoom.length - 1].indexZoom = deltaX/resizeFactor;
        }
    }

    var anchor = document.getElementById("Controls");

    //outer table open (start)
    var table_outer = document.createElement("TABLE");
    table_outer.setAttribute("cellSpacing", "0");
    table_outer.setAttribute("cellPadding", "0");
    table_outer.setAttribute("border", "0");
    table_outer.setAttribute("width" , "100%");
    table_outer.setAttribute("height", "75");
    var tbody_outer = document.createElement("TBODY");
    var tr_outer    = document.createElement("TR");
    var td_outer    = document.createElement("TD");
    td_outer.setAttribute("align", "center");
    td_outer.setAttribute("height", "75");
    //outer table open (end)

    var table = document.createElement("TABLE");
    table.setAttribute("width", "100%");
    table.setAttribute("height","75");
    table.setAttribute("border", "0");
    table.setAttribute("cellSpacing", "0");

    //Add header
    var thead = document.createElement("THEAD");
    var tr = document.createElement("TR");
    tr.setAttribute("bgColor", sBgColor1);

    var th = document.createElement("TH");
    th.className = m_sTitleClassName;
    var text = document.createTextNode(m_sCaptionOPMZOOM);
    th.appendChild(text);
    tr.appendChild(th);
    thead.appendChild(tr);
    table.appendChild(thead);

    var tbody = document.createElement("TBODY");

    for (var idxRow = 0; idxRow < 2; idxRow++)
    {
        tr = document.createElement("TR");

        var td = document.createElement("TD");
        td.setAttribute("align", "center");

        if ( idxRow == 0 ) {
            var logo = document.createElement("IMG");
            logo.setAttribute("src", m_sARROWUP);
            uni_attachEvent(logo, 'onclick', zoomEnlarge);
            td.appendChild( logo );
        }
        if ( idxRow == 1 ) {
            var logo = document.createElement("IMG");
            logo.setAttribute("src", m_sARROWDOWN);
            uni_attachEvent(logo, 'onclick', zoomDecrease);
            td.appendChild( logo );
        }

        tr.appendChild(td);
        tbody.appendChild(tr);
    }

    table.appendChild(tbody);

    td_outer.appendChild(table);
    tr_outer.appendChild(td_outer);
    tbody_outer.appendChild(tr_outer);
    table_outer.appendChild(tbody_outer);

    anchor.appendChild(table_outer);

    //Private functions
    function zoomEnlarge()
    {
        var element = document.getElementById("ZoneLogoPosition");
        if ( !element ) { return; }

        var source   = element.src;
        var tmpImage = new Image();
        tmpImage.src = source;

        var oldW = tmpImage.width;
        var oldH = tmpImage.height;

        var fInitResizefactor = 80/oldW;
        oldW = 80;
        oldH = fInitResizefactor*oldH;

        var currentZoomIndex = helperZoom[m_currentState].indexZoom;
        currentZoomIndex++;

        var zoomIndex    = currentZoomIndex;
        var resizeFactor = 0;
        var deltaX       = 0;
        var deltaY       = 0;

        if ( oldW < oldH ) {
            resizeFactor = oldW / oldH;
            deltaX = zoomIndex * resizeFactor;
            deltaY = zoomIndex;
        }

        if ( oldH < oldW ) {
            resizeFactor = oldH / oldW;
            deltaX = zoomIndex;
            deltaY = zoomIndex * resizeFactor;
        }

        if ( oldH == oldW ) {
            deltaX = zoomIndex;
            deltaY = zoomIndex;
        }

        element.width  = oldW + deltaX;
        element.height = oldH + deltaY;

        helperZoom[m_currentState].indexZoom = currentZoomIndex;
    }

    function zoomDecrease()
    {
        var element = document.getElementById("ZoneLogoPosition");
        if ( !element ) { return; }

        var source   = element.src;
        var tmpImage = new Image();
        tmpImage.src = source;

        var oldW = tmpImage.width;
        var oldH = tmpImage.height;

        var fInitResizefactor = 80/oldW;
        oldW = 80;
        oldH = fInitResizefactor*oldH;

        var currentZoomIndex = helperZoom[m_currentState].indexZoom;
        currentZoomIndex--;

        var zoomIndex = currentZoomIndex;

        var resizeFactor = 0;
        var deltaX       = 0;
        var deltaY       = 0;

        if ( oldW < oldH ) {
            resizeFactor = oldW / oldH;
            deltaX = zoomIndex * resizeFactor;
            deltaY = zoomIndex;
        }

        if ( oldH < oldW ) {
            resizeFactor = oldH / oldW;
            deltaX = zoomIndex;
            deltaY = zoomIndex * resizeFactor;
        }
        if ( oldH == oldW ) {
            deltaX = zoomIndex;
            deltaY = zoomIndex;
        }

        element.width  = oldW + deltaX;
        element.height = oldH + deltaY;

        helperZoom[m_currentState].indexZoom = currentZoomIndex;
    }

    function getImageWidth(source)
    {
        var tmpImage = new Image();
        tmpImage.src = source;

        return tmpImage.width;
    }

    function getImageHeight(source)
    {
        var tmpImage = new Image();
        tmpImage.src = source;

        return tmpImage.height;
    }
}

function guiNavigation()
{
    var anchor    = document.getElementById("Controls");
    var sBgColor1 = m_sBackgroundColor1;
    anchor.setAttribute("align", "center");

    // outer table open (start)
    var table_outer = document.createElement("TABLE");
    table_outer.setAttribute("cellSpacing", "0");
    table_outer.setAttribute("cellPadding", "0");
    table_outer.setAttribute("border"     , "0");
    table_outer.setAttribute("width"      , "100%");
    table_outer.setAttribute("height"     , "75");

    var tbody_outer = document.createElement("TBODY");
    var tr_outer = document.createElement("TR");
    var td_outer = document.createElement("TD");

    table_outer.setAttribute("borderColor", sBgColor1);

    td_outer.setAttribute("height", "75");
    td_outer.setAttribute("align"  , "center");
    // outer table open (end)

    // Create matrix 9x9
    var table = document.createElement("TABLE");
    table.setAttribute("width" , "100%");
    table.setAttribute("height", "45");
    table.setAttribute("cellSpacing", "0");

    var tbody = document.createElement("TBODY");

    var thead = document.createElement("THEAD");
    var tr = document.createElement("TR");
    tr.setAttribute("bgColor", sBgColor1);

    var th = document.createElement("TH");
    th.setAttribute("colSpan", "3");
    th.setAttribute("align"  , "center");
    th.className = m_sTitleClassName;
    var text = document.createTextNode(m_sCaptionOPMPOSITIONER);
    th.appendChild(text);
    tr.appendChild(th);
    thead.appendChild(tr);
    table.appendChild(thead);

    table.setAttribute("border", "0");

    for (var idxRow = 0; idxRow < 3; idxRow++)
    {
        tr = document.createElement("TR");
        for (var idxCell = 0; idxCell < 3; idxCell++)
        {
            var td = document.createElement("TD");

            if ( (idxRow == 0) && (idxCell == 1) ) {
                var img = document.createElement("IMG");
                img.setAttribute("src", m_sARROWUP);
                uni_attachEvent(img, 'onclick', North);
                td.setAttribute("align", "center");
                td.appendChild(img);
            }

            if ( (idxRow == 1) && (idxCell == 0) ) {
                var img = document.createElement("IMG");
                img.setAttribute("src", m_sARROWLEFT);
                uni_attachEvent(img, 'onclick', West);
                td.setAttribute("align"  , "right");
                td.appendChild(img);
            }

            if ( (idxRow == 1) && (idxCell == 2) ) {
                var img = document.createElement("IMG");
                img.setAttribute("src", m_sARROWRIGHT);
                uni_attachEvent(img, 'onclick', East);
                td.setAttribute("align"  , "left");
                td.appendChild(img);
            }

            if ( (idxRow == 2) && (idxCell == 1) ) {
                var img = document.createElement("IMG");
                img.setAttribute("src", m_sARROWDOWN);
                uni_attachEvent(img, 'onclick', South);
                td.setAttribute("align", "center");
                td.appendChild(img);
            }
            tr.appendChild(td);
        }
        tbody.appendChild(tr);
    }
    table.appendChild(tbody);

    td_outer.appendChild(table);
    tr_outer.appendChild(td_outer);
    tbody_outer.appendChild(tr_outer);
    table_outer.appendChild(tbody_outer);

    anchor.appendChild(table_outer);

    var br = document.createElement("BR");
    anchor.appendChild(br);

    function North()
    {
        var anchor = document.getElementById("ZoneLogoPosition");
        if ( !anchor ) { return; }

        if ( m_bIsIE5 ) {
            var iCurrent_posTop = anchor.style.posTop;
            anchor.style.setAttribute("posTop", iCurrent_posTop - 2);
        } else if ( m_bIsNS6 ) {
            var iCurrent_posTop = opm_parseInt(anchor.style.top);
            var iNewTop         = iCurrent_posTop - 2;
            anchor.style.top    = iNewTop + "px";
        }
    }

    function West()
    {
        var anchor = document.getElementById("ZoneLogoPosition");
        if ( !anchor ) { return; }

        if ( m_bIsIE5 ) {
            var iCurrent_posLeft = anchor.style.posLeft;
            anchor.style.setAttribute("posLeft", iCurrent_posLeft - 2);
        } else if ( m_bIsNS6 ) {
            var iCurrent_posLeft = opm_parseInt(anchor.style.left);
            var iNewLeft         = iCurrent_posLeft - 2;
            anchor.style.left    = iNewLeft + "px";
        }
    }

    function East()
    {
        var anchor = document.getElementById("ZoneLogoPosition");
        if ( !anchor ) { return; }

        if ( m_bIsIE5 ) {
            var iCurrent_posLeft = anchor.style.posLeft;
            anchor.style.setAttribute("posLeft", iCurrent_posLeft + 2);
        } else if ( m_bIsNS6 ) {
            var iCurrent_posLeft = opm_parseInt(anchor.style.left);
            var iNewLeft         = iCurrent_posLeft + 2;
            anchor.style.left    = iNewLeft + "px";
        }
    }

    function South()
    {
        var anchor = document.getElementById("ZoneLogoPosition");
        if ( !anchor ) { return; }

        if ( m_bIsIE5 ) {
            var iCurrent_posTop = anchor.style.posTop;
            anchor.style.setAttribute("posTop", iCurrent_posTop + 2);
        } else if ( m_bIsNS6 ) {
            var iCurrent_posTop = opm_parseInt(anchor.style.top);
            var iNewTop         = iCurrent_posTop + 2;
            anchor.style.top    = iNewTop + "px";
        }
    }
}

function opm_parseInt(sValue, iDefault)
{
    var iValue = 0;
    
    iDefault = iDefault || 0;
    
    if ( !sValue ) { return iDefault; }
    
    iValue = parseInt(sValue);
    if ( isNaN(iValue) ) { return iDefault; }
    
    return iValue;
}
/**
 *
 * PMS specific methods
 *
 */

//for positioning if not in popup (pms):
var m_sContainerID = "mainAreaDiv";

//because pmt uses getExternalAsBinary:
function getURLObject(sURLObject, sExternalID)
{
    return sURLObject;
}

function opm_addOrderLine(sProductID, sArticleID, sQuantity)
{
    if ( m_bOffer ) { return addOfferLine(); }//TODO: popup situation
    
    var basketManager = ( m_bOPMPopup ? opener.m_basketManager : m_basketManager );
    
    return basketManager.addOrderLine(sProductID, sArticleID, sQuantity);
}

function opm_addVASPrintingLine()
{
    if ( m_bOffer ) { return addOfferVASPrintingLine(); }//TODO: popup situation
    
    var basketManager = ( m_bOPMPopup ? opener.m_basketManager : m_basketManager );
    
    return basketManager.addVASPrintingLine();
}

function opm_cancel()
{
    if ( m_bOPMPopup ) { window.close(); return; }
    
    history.go(-1);
}

function opm_deleteOrderLine(iOrderLine)
{
    if ( m_bOffer ) { return deleteOfferLine(iOrderLine); }//TODO: popup situation
    
    var basketManager = ( m_bOPMPopup ? opener.m_basketManager : m_basketManager );

    basketManager.deleteOrderLine(iOrderLine);
}

function opm_getOrderLines()
{
    if ( m_bOffer ) { return getOfferLines(); }//TODO: popup situation
    
    var basketManager = ( m_bOPMPopup ? opener.m_basketManager : m_basketManager );
    
    return basketManager.getOrderLines();
}

function opm_getVASPrintings(iMainLineNumber)
{
    var rsPrintings    = null;
    
    var rsVASPrintings = null;
    
    if ( m_bOffer ) {
        rsVASPrintings    = getOfferVASPrintings();//TODO: popup situation
    } else {
        var basketManager = ( m_bOPMPopup ? opener.m_basketManager : m_basketManager );
        
        rsVASPrintings    = basketManager.getVASPrintings();
    }

    rsPrintings = rsVASPrintings.removeRows();
        
    if ( m_bUpdateMode == false ) { return rsPrintings; }
    
    if ( !iMainLineNumber && (iMainLineNumber != 0) ) { return rsPrintings; }
    
    var rsOrderLines = opm_getOrderLines();
    var rs           = rsOrderLines.filter("REFERSTOLINENUMBER", iMainLineNumber);

    var iterator     = rs.iterator();
    while ( iterator.hasNext() )
    {
        var rOrderLine  = iterator.next();
        var sLineNumber = rOrderLine.get("LINENUMBER");
        
        var rPrinting = rsVASPrintings.findRow("LINENUMBER", sLineNumber);
        if ( rPrinting == null ) { continue; }
        
        rsPrintings.appendRow(rPrinting.getData());
    }

    return rsPrintings;
}

function opm_saveOrder()
{
    if ( m_bOffer ) { //TODO: popup situation
        if ( m_vasManager.getBaseQuantity() == 0 ) { return; }
        
        //append VASOfferLines to OfferLines
        var rsVASOrderLines = m_vasManager.getVASOrderLines();
        addVASOfferLines(rsVASOrderLines); 
        
        var sOfferLineNumberToRemove = opm_getMainLineNumber();

        //when updating -> remove the old line; referring lines are deleted by the server    
        if ( sOfferLineNumberToRemove != null ) { 
            deleteOfferLine    (sOfferLineNumberToRemove); 
            deleteOfferVariants(sOfferLineNumberToRemove)
        }
        
        //save Offer (in session)
        updateOffer();
    
        return;
    }
    
    var basketManager = ( m_bOPMPopup ? opener.m_basketManager : m_basketManager );

    if ( m_vasManager ) {
        if ( m_vasManager.getBaseQuantity() == 0 ) { return; }
        
        var rsVASOrderLines = m_vasManager.getVASOrderLines();
        basketManager.addVASOrderLines(rsVASOrderLines); 
    }

    var sLineNumberToRemove = opm_getMainLineNumber();

    //when updating -> remove the old line (and referring, and variants related (REFERSTO-, ADDTOLINENUMBER)
    if ( sLineNumberToRemove != null ) { 
       basketManager.removeReferringLines(sLineNumberToRemove);
       basketManager.removeVariants      (sLineNumberToRemove);
    }
    
    //make sure the getBasket is called after updateBasket:
    m_mainFormManager.addInput("GETBASKET", "1");
    basketManager.updateBasket();
    
    if ( m_bOPMPopup ) { window.close(); }
}

function opm_getUpdateMode()
{
    return m_bUpdateMode;
}

function opm_getMainLineNumber()
{
    return m_sOrderLineNumber;
}


var ContextFinals = new Object();

ContextFinals.CONTEXTNAME             = "pms";
ContextFinals.CONTEXTPATH             = "/pms/";
ContextFinals.CONTROLLERSERVLET       = ContextFinals.CONTEXTPATH + "pms";

ContextFinals.CSSPATH                 = ContextFinals.CONTEXTPATH        + "css/";
ContextFinals.DATAPATH                = ContextFinals.CONTEXTPATH        + "dat/";
ContextFinals.IMAGEPATH               = ContextFinals.CONTEXTPATH        + "img/";
ContextFinals.JSPPATH                 = ContextFinals.CONTEXTPATH;//        + "jsp/";
ContextFinals.HTMPATH                 = ContextFinals.CONTEXTPATH        + "htm/";
ContextFinals.SCRIPTPATH              = ContextFinals.CONTEXTPATH        + "javascript/";

ContextFinals.APPIMAGEPATH            = ContextFinals.IMAGEPATH          + "appimages/";

ContextFinals.IMGBACKGROUNDPATH       = ContextFinals.APPIMAGEPATH       + "backgrounds/";
ContextFinals.BUTTONSPATH             = ContextFinals.APPIMAGEPATH       + "buttons/";
ContextFinals.STYLEMANAGERPATH        = ContextFinals.APPIMAGEPATH       + "stylemanager/";
ContextFinals.TEMPLATESPATH           = ContextFinals.APPIMAGEPATH       + "templates/";
ContextFinals.IMAGE_NOIMAGE           = ContextFinals.APPIMAGEPATH       + "templates/NoImage.gif";
ContextFinals.IMAGE_DUMMY             = ContextFinals.APPIMAGEPATH       + "Dummy.gif";
ContextFinals.IMAGE_IMAGE_NOT_FOUND   = ContextFinals.APPIMAGEPATH       + "ImageNotFound.gif";

ContextFinals.STYLESPATH              = ContextFinals.CSSPATH            + "style/";
var PMSFinals = new Object();

//Actions
PMSFinals.ACCEPTTERMS                           = "acceptTerms";
PMSFinals.CHANGE_QUOTATION                      = "changeQuotation";
PMSFinals.CHECKOUT_BASKET                       = "checkoutBasket";
PMSFinals.CLEAR_BASKET                          = "clearBasket";
PMSFinals.COMPAREPRODUCTS                       = "compareProducts";
PMSFinals.CONTACTDISTRIBUTOR                    = "contactDistributor";
PMSFinals.REQUESTLOGIN                          = "requestLogin";
PMSFinals.REQUESTLOGOUT                         = "requestLogout";
PMSFinals.DOSELECTOR                            = "doSelector";
PMSFinals.REQUESTSETLANGUAGE                    = "requestSetLanguage";
PMSFinals.GETCOMPANYPROFILE                     = "getCompanyProfile";
PMSFinals.REQUESTCONTACTDISTRIBUTOR             = "requestContactDistributor";
PMSFinals.GETCODEOFCONDUCT                      = "getCodeOfConduct";
PMSFinals.GETDISCLAIMER                         = "getDisclaimer";
PMSFinals.GETFREEWEBPAGE                        = "getFreeWebPage";
PMSFinals.GETPOPUPLINK                          = "getPopupLink";
PMSFinals.GETVASINFORMATION                     = "getVASInfo";
PMSFinals.GETFAQ                                = "getFaq";
PMSFinals.GETHELP                               = "getHelp";
PMSFinals.REQUESTMYPROFILE                      = "requestMyProfile";
PMSFinals.SAVEPROFILE                           = "saveProfile";
PMSFinals.REQUESTMYUSERS                        = "requestMyUsers";
PMSFinals.EDITUSER                              = "editUser";
PMSFinals.SAVEUSER                              = "saveUser";
PMSFinals.GET_IMPRESSUM                         = "getImpressum";
PMSFinals.GETNEWS                               = "getNews";
PMSFinals.GETNEWSITEM                           = "getNewsItem";
PMSFinals.GETPRIVACYSTATEMENT                   = "getPrivacyStatement";
PMSFinals.GETTERMS                              = "getTerms";
PMSFinals.GET_BASKET                            = "getBasket";
PMSFinals.GET_OFFER                             = "getOffer";
PMSFinals.GET_BRANDS                            = "getBrands";
PMSFinals.GET_PRODUCTSINDEX                     = "getProductsIndex";
PMSFinals.GET_PRODUCTCATEGORIES                 = "getProductCategories";
PMSFinals.GET_PRODUCTDETAILS                    = "getProductDetails";
PMSFinals.GET_PRODUCTSFORCATEGORYTREE           = "getProductsForCategoryTree";
PMSFinals.GET_ALTERNATIVEPRODUCTS               = "getAlternativeProducts";
PMSFinals.GET_PRODUCTS                          = "getProducts";
PMSFinals.GET_PROMOTIONS                        = "getPromotions";
PMSFinals.GET_NEWPRODUCTS                       = "getNewProducts";
PMSFinals.GET_SALESORDERS                       = "getSalesOrders";
PMSFinals.GET_SHOPPRESENTATION                  = "getShopPresentation";
PMSFinals.DOLOGOUTCUSTOMER                      = "doLogoutCustomer";
PMSFinals.PLACE_ORDER                           = "placeOrder";
PMSFinals.ACCEPT_QUOTATION                      = "acceptQuotation";
PMSFinals.REJECT_QUOTATION                      = "rejectQuotation";
PMSFinals.REPEATORDER                           = "repeatOrder";
PMSFinals.APPROVEORDER                          = "approveOrder";
PMSFinals.DECLINEORDER                          = "declineOrder";
PMSFinals.UPDATEBASKET                          = "updateBasket";
PMSFinals.REFRESHBASKET                         = "refreshBasket";
PMSFinals.REQUESTPRINTINGMODULE                 = "requestPrintingModule";
PMSFinals.REQUESTVAS                            = "requestVAS";
PMSFinals.SETLANGUAGE                           = "setLanguage";
PMSFinals.SHOW_BASKET                           = "showBasket";
PMSFinals.SHOWSTATICHTML                        = "showStaticHtml";
PMSFinals.VIEWORDERQUOTATION                    = "viewOrderQuotation";
PMSFinals.INVOKELEAFLET                         = "invokeLeafletSteps";

//ProtocolFinals
PMSFinals.ACTION                                = "ACTION";
PMSFinals.MENUID                                = "MENUID";
PMSFinals.ORDERID                               = "ORDERID";

//Other keys
PMSFinals.ACCEPTTERMS_INDICATOR                 = "ACCEPTTERMS_INDICATOR";
PMSFinals.ARTICLEID                             = "ARTICLEID";
PMSFinals.ARTICLENUMBER                         = "ARTICLENUMBER";
PMSFinals.BRANDID                               = "BRANDID";
PMSFinals.CATEGORIZATION                        = "CATEGORIZATION";
PMSFinals.CATEGORYID                            = "CATEGORYID";
PMSFinals.DISTRIBUTORID                         = "DISTRIBUTORID";
PMSFinals.GETPRODUCTDETAILS                     = "GETPRODUCTDETAILS";
PMSFinals.GROUPANDCATEGORYPREFIX                = "_PGC_";
PMSFinals.GROUPID                               = "GROUPID";
PMSFinals.IMAGE_IMAGE_NOT_FOUND                 = "appimages/" + "ImageNotFound.gif";
PMSFinals.LANGUAGECODE                          = "LANGUAGECODE";
PMSFinals.LINENUMBER                            = "LINENUMBER";
PMSFinals.OPTIONINDICATOR                       = "OPTIONINDICATOR";
PMSFinals.ORDERINDICATOR                        = "ORDERINDICATOR";
PMSFinals.ORDERLINES                            = "ORDERLINES";
PMSFinals.ORDERTYPE                             = "ORDERTYPE";
PMSFinals.PRODUCTID                             = "PRODUCTID";
PMSFinals.PAGEREQUESTED                         = "PAGEREQUESTED";
PMSFinals.POSITION                              = "POSITION";
PMSFinals.QUANTITY                              = "QUANTITY";
PMSFinals.REFERSTOLINENUMBER                    = "REFERSTOLINENUMBER";
PMSFinals.RELATEDARTICLEID                      = "RELATEDARTICLEID";
PMSFinals.RELATEDPRODUCTID                      = "RELATEDPRODUCTID";
PMSFinals.RELATIONTYPEID                        = "RELATIONTYPEID";
PMSFinals.ROW                                   = "ROW";
PMSFinals.SAMPLEINDICATOR                       = "SAMPLEINDICATOR";
PMSFinals.SHOPID                                = "SHOPID";
PMSFinals.SUBACTION                             = "SUBACTION";
PMSFinals.STARTINDEX                            = "STARTINDEX";
PMSFinals.STARTLETTER                           = "STARTLETTER";
PMSFinals.STATUSIDS                             = "STATUSIDS";
PMSFinals.USERID                                = "USERID";
PMSFinals.VERSIONID                             = "VERSIONID";
PMSFinals.VASPRINTINGS                          = "VASPRINTINGS";
PMSFinals.WINDOWNAME                            = "PROMOVEMENT";
PMSFinals.SELECTORTYPE                          = "SHOPSELECTORTYPE"; // IHE 20050311

//orderstatuses
PMSFinals.ORDERSTATUS_WAITING_FOR_ACCEPTANCE    = "310";
PMSFinals.ORDERSTATUS_FINAL_QUOTATION           = "320";

//ordertypes
PMSFinals.ORDERTYPE_ORDER                       = "1";
PMSFinals.ORDERTYPE_QUOTATION                   = "2";
var PMSIntegerFinals = new Object();

//subactions (ServletRequestFinals)
PMSIntegerFinals.SUBACTION_BASKET                      = 2000;
PMSIntegerFinals.SUBACTION_CHILDCATEGORIES             = 3200;
PMSIntegerFinals.SUBACTION_ORDERDETAILS                = 2050;
PMSIntegerFinals.SUBACTION_OTHERSTATIC                 = 4000;
PMSIntegerFinals.SUBACTION_BRANDS                      = 5000;
PMSIntegerFinals.SUBACTION_PRODUCTDETAILS              = 1100;
PMSIntegerFinals.SUBACTION_SALESORDERS                 = 7000;
PMSIntegerFinals.SUBACTION_PRODUCTSINDEX               = 1300; // check
PMSIntegerFinals.SUBACTION_SELECTOR                    = 1200; // check

//NavigationFinals
PMSIntegerFinals.HOME                                  =  100;
PMSIntegerFinals.LOGIN                                 = 1000;
PMSIntegerFinals.LOGOUT                                = 1005;
PMSIntegerFinals.BRANDS                                = 2000;
PMSIntegerFinals.PROMOTIONS                            = 2150;
PMSIntegerFinals.NEWPRODUCTS                           = 2160;
PMSIntegerFinals.PRODUCTSINDEX                         = 2170;
PMSIntegerFinals.NEWS                                  = 3000;
PMSIntegerFinals.NEWSITEM                              = 3010;
PMSIntegerFinals.SELECTOR                              = 4000;
PMSIntegerFinals.COMPAREPRODUCTS                       = 4100;
PMSIntegerFinals.CONTACT                               = 5000;
PMSIntegerFinals.PRIVACY                               = 5100;
PMSIntegerFinals.DISCLAIMER                            = 5200;
PMSIntegerFinals.TERMS                                 = 5300;
PMSIntegerFinals.HELP                                  = 5400;
PMSIntegerFinals.COMPANYPROFILE                        = 5500;
PMSIntegerFinals.MYPROFILE                             = 5600;
PMSIntegerFinals.MYUSERS                               = 5650;
PMSIntegerFinals.FAQ                                   = 5700;
PMSIntegerFinals.MYLANGUAGE                            = 5800;
PMSIntegerFinals.CODEOFCONDUCT                         = 5900;
PMSIntegerFinals.BASKET                                = 6000;
PMSIntegerFinals.OFFER                                 = 6500;
PMSIntegerFinals.SALESORDERS                           = 7000;
PMSIntegerFinals.FREEPAGE1                             = 8010;
PMSIntegerFinals.FREEPAGE2                             = 8020;
PMSIntegerFinals.FREEPAGE3                             = 8030;
PMSIntegerFinals.FREEPAGE4                             = 8031;
PMSIntegerFinals.FREEPAGE5                             = 8032;
PMSIntegerFinals.FREEPAGE6                             = 8033;
PMSIntegerFinals.FREEPAGE7                             = 8034;
PMSIntegerFinals.FREEPAGE8                             = 8035;
PMSIntegerFinals.FREEPAGE9                             = 8036;
PMSIntegerFinals.FREEPAGE10                            = 8037;
PMSIntegerFinals.POPUPLINK                             = 8040;
PMSIntegerFinals.VASINFORMATION                        = 9000;
PMSIntegerFinals.IMPRESSUM                             = 9100;

// IHE 20040927
PMSIntegerFinals.SELECTORTYPE_MODAL                    = 0;
PMSIntegerFinals.SELECTORTYPE_INSHOP                   = 1;
PMSIntegerFinals.SELECTORTYPE_NEWWINDOW                = 2;
if ( LogWriter ) {
	LogWriter.setEnabled(false);
}

var m_bPopupWindow = false;

function doAction(iButtonID)
{
    switch ( iButtonID )
    {
        case PMSIntegerFinals.HOME:
            getShopPresentation();
            break;
        case PMSIntegerFinals.LOGIN:
            doLogin();
            break;
        case PMSIntegerFinals.LOGOUT:
            doLogout();
            break;
        case PMSIntegerFinals.BRANDS:
            getBrands();
            break;
        case PMSIntegerFinals.COMPAREPRODUCTS:
            compareProducts();
            break;
        case PMSIntegerFinals.PROMOTIONS:
            getPromotions();
            break;
        case PMSIntegerFinals.NEWPRODUCTS:
            getNewProducts();
            break;
        case PMSIntegerFinals.PRODUCTSINDEX:
            getProductsIndex();
            break;
        case PMSIntegerFinals.NEWS:
            doNews();
            break;
        case PMSIntegerFinals.NEWSITEM:
            doNewsItem();
            break;
        case PMSIntegerFinals.SELECTOR:
            doSelector();
            break;
        case PMSIntegerFinals.CONTACT:
            doContactDistributor();
            break;
        case PMSIntegerFinals.PRIVACY:
            doPrivacyStatement();
            break;
        case PMSIntegerFinals.DISCLAIMER:
            doDisclaimer();
            break;
        case PMSIntegerFinals.FREEPAGE1:
            doFreeWebPage(1);
            break;
        case PMSIntegerFinals.FREEPAGE2:
            doFreeWebPage(2);
            break;
        case PMSIntegerFinals.FREEPAGE3:
            doFreeWebPage(3);
            break;
        case PMSIntegerFinals.FREEPAGE4:
            doFreeWebPage(4);
            break;
        case PMSIntegerFinals.FREEPAGE5:
            doFreeWebPage(5);
            break;
        case PMSIntegerFinals.FREEPAGE6:
            doFreeWebPage(6);
            break;
        case PMSIntegerFinals.FREEPAGE7:
            doFreeWebPage(7);
            break;
        case PMSIntegerFinals.FREEPAGE8:
            doFreeWebPage(8);
            break;
        case PMSIntegerFinals.FREEPAGE9:
            doFreeWebPage(9);
            break;
        case PMSIntegerFinals.FREEPAGE10:
            doFreeWebPage(10);
            break;
        case PMSIntegerFinals.POPUPLINK:
            doPopupLink();
            break;
        case PMSIntegerFinals.CODEOFCONDUCT:
            doCodeOfConduct();
            break;
        case PMSIntegerFinals.TERMS:
            doTerms();
            break;
        case PMSIntegerFinals.HELP:
            doHelp();
            break;
        case PMSIntegerFinals.FAQ:
            doFaq();
            break;
        case PMSIntegerFinals.MYLANGUAGE:
            doLanguage();
            break;
        case PMSIntegerFinals.COMPANYPROFILE:
            doCompanyProfile();
            break;
        case PMSIntegerFinals.MYPROFILE:
            doMyProfile();
            break;
        case PMSIntegerFinals.MYUSERS:
            doMyUsers();
            break;
        case PMSIntegerFinals.BASKET:
            getBasket();
            break;
        case PMSIntegerFinals.OFFER:
            getOffer();
            break;
        case PMSIntegerFinals.SALESORDERS:
            getSalesOrders();
            break;
        case PMSIntegerFinals.VASINFORMATION:
            doVASInformation();
            break;
        case PMSIntegerFinals.IMPRESSUM:
            doImpressum();
            break;
        default:
            alert(' not implemented : ' + iButtonID);
            break;
    }
}

function setMenuID(sMenuID)
{
    m_mainFormManager.addInput(PMSFinals.MENUID, sMenuID);
}

function acceptTerms(bAccept)
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.ACCEPTTERMS);

    var sValue;
    if ( bAccept ) {
        sValue = "1";
    } else {
        sValue = "0";
    }

    m_mainFormManager.addInput(PMSFinals.ACCEPTTERMS_INDICATOR, sValue);
    m_mainFormManager.submit();
}

function checkoutBasket()
{
    if ( m_iNumberOfBasketSubmits > 0 ) { return; }
    m_iNumberOfBasketSubmits++;

    var fBasketForm = getBasketForm();

    if ( fBasketForm != null ) {
        var sOrderType = fBasketForm.elements[PMSFinals.ORDERINDICATOR].value;
        m_mainFormManager.addInput(PMSFinals.ORDERINDICATOR, sOrderType);
    }

    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.CHECKOUT_BASKET );
    m_mainFormManager.addInput(PMSFinals.SUBACTION, PMSIntegerFinals.SUBACTION_BASKET);
    m_mainFormManager.submit();
}

function contactDistributor()
{
    if ( formValidation.isFormValid() == false ) { return; }

    document.forms['CONTACT'].elements[PMSFinals.ACTION].value = PMSFinals.CONTACTDISTRIBUTOR;
    document.forms['CONTACT'].submit();
}

/**
 * Requests a loginpage. If the user is already logged in, the logout page is shown in a pop-up.
 */
function doLogin()
{

//alert("Do login called");

	//alert('HOOHURL' +getHOOKURL());
    // Added By Vishal Sharma of RFC 3591 for Selector Screen and other popups
    if(getHOOKURL()==undefined || getHOOKURL()==""){
    	//doShowPopup( [ PMSFinals.ACTION       ], [ PMSFinals.REQUESTLOGIN ], 'LOGIN', new XYWH(0,0,470,400));
    	doShowPopupLogout( [ PMSFinals.ACTION       ], [ PMSFinals.REQUESTLOGIN ], 'LOGIN', new XYWH(0,0,470,400));
	}
	else{ //alert('else');
		doShowInFrame( [ PMSFinals.ACTION       ], [ PMSFinals.REQUESTLOGIN ], 'LoginFrame');		
    }
}
function doLogout()
{
    // Added By Vishal Sharma of RFC 3591 for Selector Screen and other popups
    doShowPopupLogout( [ PMSFinals.ACTION       ]
               , [ PMSFinals.REQUESTLOGOUT]
               , 'LOGOUT'
               , new XYWH(0,0,470,400));
    /*doShowPopup( [ PMSFinals.ACTION       ]
               , [ PMSFinals.REQUESTLOGOUT]
               , 'LOGOUT'
               , new XYWH(0,0,470,400));*/
}

var m_modalSelector = null;
function doSelector()
{
    var iSelectorType = parseInt(m_sSelectorType);
// Added By Vishal Sharma of RFC 3591 for Selector Screen and other popups
    var xywh = new XYWH(0,0,300,650);
    //var xywh = new XYWH(0,0,353,550);
    switch(iSelectorType)
    {
        case PMSIntegerFinals.SELECTORTYPE_MODAL:
            //TODO
            m_modalSelector = doShowModal( [ PMSFinals.ACTION    , PMSFinals.SELECTORTYPE       ]
                                         , [ PMSFinals.DOSELECTOR, PMSIntegerFinals.SELECTORTYPE_MODAL ]
                                         , 'mySelector'
                                         , xywh);
            break;
        case PMSIntegerFinals.SELECTORTYPE_INSHOP:
            m_mainFormManager.addInput(PMSFinals.ACTION      , PMSFinals.DOSELECTOR         );
            m_mainFormManager.addInput(PMSFinals.SELECTORTYPE, PMSIntegerFinals.SELECTORTYPE_INSHOP);
            m_mainFormManager.addInput(PMSFinals.SUBACTION   , PMSIntegerFinals.SUBACTION_SELECTOR );
            m_mainFormManager.submit();
            break;
        case PMSIntegerFinals.SELECTORTYPE_NEWWINDOW:
        default:
        // Added By Vishal Sharma of RFC 3591 for Selector Screen and other popups
            doShowPopupSelector( [ PMSFinals.ACTION    , PMSFinals.SELECTORTYPE           ]
            //doShowPopup( [ PMSFinals.ACTION    , PMSFinals.SELECTORTYPE           ]
                       , [ PMSFinals.DOSELECTOR, PMSIntegerFinals.SELECTORTYPE_NEWWINDOW ]
                       , 'mySelector'
                       , xywh);
            break;
    }
}
/*IHE: functions to use if modal selector must remain visible after 'submit'
function closeModalSelector()
{
    m_modalSelector.close();
    window.onfocus = function() {};
}
function makeSelectorModal(window)
{
    if ( window ) {
        m_modalSelector = window;
    }
    window.onfocus = function() {
        m_modalSelector.focus();
    };
}
*/

function doLanguage()
{
    	// Added By Vishal Sharma of RFC 3591 for Selector Screen and other popups
	//alert("doLanguage Called in Shop.js");
    doShowPopupLanguage( [ PMSFinals.ACTION             ]
               , [ PMSFinals.REQUESTSETLANGUAGE ]
               , 'LOGOUT'
               , new XYWH(0,0,50,50));
    /*doShowPopup( [ PMSFinals.ACTION             ]
               , [ PMSFinals.REQUESTSETLANGUAGE ]
               , 'LOGOUT'
               , new XYWH(0,0,300,50));*/
}

function setLanguageCode(sLanguageCode)
{
    m_mainFormManager.addInput(PMSFinals.ACTION      , PMSFinals.SETLANGUAGE);
    m_mainFormManager.addInput(PMSFinals.LANGUAGECODE, sLanguageCode        );
    m_mainFormManager.submit();
}

function doCompanyProfile()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETCOMPANYPROFILE);
    m_mainFormManager.submit();
}

function doContactDistributor()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.REQUESTCONTACTDISTRIBUTOR);
    m_mainFormManager.submit();
}

function doCodeOfConduct()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETCODEOFCONDUCT);
    m_mainFormManager.submit();
}

function doDisclaimer()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETDISCLAIMER);
    m_mainFormManager.submit();
}

function doFreeWebPage(i)
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETFREEWEBPAGE + i);
    m_mainFormManager.submit();
}

function doPopupLink()
{
    doShowPopup( [ PMSFinals.ACTION       ]
               , [ PMSFinals.GETPOPUPLINK ]
               , 'POPUPLINK'
               , new XYWH(0,0,800,600));
}

function doImpressum()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GET_IMPRESSUM);
    m_mainFormManager.submit();
}

function doVASInformation()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETVASINFORMATION);
    m_mainFormManager.submit();
}

function doFaq()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETFAQ);
    m_mainFormManager.submit();
}

function doHelp()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETHELP);
    m_mainFormManager.submit();
}

function doMyProfile()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.REQUESTMYPROFILE);
    m_mainFormManager.submit();
}

function saveProfile()
{
    if ( formValidation.isFormValid() == false ) { return; }

    document.forms['PROFILE'].elements[PMSFinals.ACTION].value = PMSFinals.SAVEPROFILE;
    document.forms['PROFILE'].submit();
}

function showMyUsersFromIndex(iIndex)
{
    doMyUsers(iIndex);
}

function doMyUsers(iIndex)
{
    if ( !iIndex && (iIndex!=0) ) { iIndex = '-1'; }
    m_mainFormManager.addInput(PMSFinals.STARTINDEX, '' + iIndex); //make sure iIndex is a string, else 0 will become ''

    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.REQUESTMYUSERS);
    m_mainFormManager.submit();
}

function editUser(iUserID)
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.EDITUSER);
    m_mainFormManager.addInput(PMSFinals.USERID, iUserID           );
    m_mainFormManager.submit();
}

function saveUser(bFormValidation)
{
    if ( bFormValidation ) {
        if ( formValidation.isFormValid() == false ) { return; }
    }

    document.forms['PROFILE'].elements[PMSFinals.ACTION].value = PMSFinals.SAVEUSER;
    document.forms['PROFILE'].submit();
}

function doNews()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETNEWS);
    m_mainFormManager.submit();
}

function doNewsItem()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETNEWSITEM);
    m_mainFormManager.submit();
}

function doPrivacyStatement()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETPRIVACYSTATEMENT);
    m_mainFormManager.submit();
}

function doTerms()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.GETTERMS);
    m_mainFormManager.submit();
}

function doShowInFrame( saParameterNames, saParameterValues, sFrameName)
{
    var tmpFormManager = new FormManager('TEMP', m_sFormAction, 'tmpFormManager');
    tmpFormManager.getForm().target = sFrameName;
    if ( saParameterValues ) {
        for ( var i=0; i < saParameterValues.length; i++ ) {
            tmpFormManager.addInput(saParameterNames[i], saParameterValues[i] || '');
        }
    }
    tmpFormManager.submit();
}

function doShowPopup( saParameterNames, saParameterValues, sWindowName, location)
{
    
    var mywindow = window.open('', sWindowName
                              ,'toolbar=0,scrollbars=1,location=0,status=1,menubar=0,resizable,', + location.toCSVString());

    var tmpFormManager = new FormManager('TEMP', m_sFormAction, 'tmpFormManager');
    tmpFormManager.getForm().target = sWindowName;
    if ( saParameterValues ) {
        for ( var i=0; i < saParameterValues.length; i++ ) {
            tmpFormManager.addInput(saParameterNames[i], saParameterValues[i] || '');
        }
    }
    tmpFormManager.submit();

    if ( mywindow ) {
        mywindow.focus();
    } else {
        alert('Do you have a popup-killer? Please:\r- de-activate it, or\r- configure it to allow popups for this site.');
    }

    return mywindow;
}


// Added By Vishal Sharma of RFC 3591 for Selector Screen and other popups
function doShowPopupSelector( saParameterNames, saParameterValues, sWindowName, location)
{
	// Added By Vishal Sharma of RFC 3591 for Selector Screen and other popups
	//alert("Show Popup Called");
    var mywindow = window.open('', sWindowName
                              ,'toolbar=0,scrollbars=1,location=0,status=1,menubar=0,resizable, width=300px, height=650px', + location.toCSVString());

    var tmpFormManager = new FormManager('TEMP', m_sFormAction, 'tmpFormManager');
    tmpFormManager.getForm().target = sWindowName;
    if ( saParameterValues ) {
        for ( var i=0; i < saParameterValues.length; i++ ) {
            tmpFormManager.addInput(saParameterNames[i], saParameterValues[i] || '');
        }
    }
    tmpFormManager.submit();

    if ( mywindow ) {
        mywindow.focus();
    } else {
        alert('Do you have a popup-killer? Please:\r- de-activate it, or\r- configure it to allow popups for this site.');
    }

    return mywindow;
}


function doShowPopupLanguage( saParameterNames, saParameterValues, sWindowName, location)
{
	
	//alert("Show Popup Called");
    var mywindow = window.open('', sWindowName
                              ,'toolbar=0,scrollbars=1,location=0,status=1,menubar=0,resizable, width=300px, height=50px', + location.toCSVString());

    var tmpFormManager = new FormManager('TEMP', m_sFormAction, 'tmpFormManager');
    tmpFormManager.getForm().target = sWindowName;
    if ( saParameterValues ) {
        for ( var i=0; i < saParameterValues.length; i++ ) {
            tmpFormManager.addInput(saParameterNames[i], saParameterValues[i] || '');
        }
    }
    tmpFormManager.submit();

    if ( mywindow ) {
        mywindow.focus();
    } else {
        alert('Do you have a popup-killer? Please:\r- de-activate it, or\r- configure it to allow popups for this site.');
    }

    return mywindow;
}

function doShowPopupLogout( saParameterNames, saParameterValues, sWindowName, location)
{
	// Added By Vishal Sharma of RFC 3591 for Selector Screen and other popups
	//alert("Show Popup Called");
    var mywindow = window.open('', sWindowName
                              ,'toolbar=0,scrollbars=1,location=0,status=1,menubar=0,resizable, width=350px, height=300px', + location.toCSVString());

    var tmpFormManager = new FormManager('TEMP', m_sFormAction, 'tmpFormManager');
    tmpFormManager.getForm().target = sWindowName;
    if ( saParameterValues ) {
        for ( var i=0; i < saParameterValues.length; i++ ) {
            tmpFormManager.addInput(saParameterNames[i], saParameterValues[i] || '');
        }
    }
    tmpFormManager.submit();

    if ( mywindow ) {
        mywindow.focus();
    } else {
        alert('Do you have a popup-killer? Please:\r- de-activate it, or\r- configure it to allow popups for this site.');
    }

    return mywindow;
}
// End By Vishal Sharma of RFC 3591 for Selector Screen and other popups

function doShowModal( saParameterNames, saParameterValues, sWindowName, xywh)
{
    var mywindow = null;

    var bSimulateModalInIE = false;
    if ( ! window.showModalDialog || bSimulateModalInIE ) {
        mywindow = doShowPopup(saParameterNames, saParameterValues, sWindowName, xywh);
        return mywindow;
    }

    var sFeatures = xywh.asDialogFeatureString()
                  + "edge:Raised;"
                  + "center:No;"
                  + "help:No;"
                  + "resizable:Yes;"
                  + "status:No;";
    var sURL = "/pms/pms";
    if ( saParameterValues ) {
        for ( var i=0; i < saParameterValues.length; i++ ) {
            if ( i==0 ) { sURL += "?"; }
            else        { sURL += "&"; }
            sURL += (saParameterNames[i] + '=' + saParameterValues[i]);
        }
    }

    mywindow = window.showModalDialog(sURL,window,sFeatures);

/*
    // impossible check for window.showModalDialog since the code stops executing in previous line
    if ( ! mywindow ) {
        alert('Do you have a popup-killer? Please:\r- de-activate it, or\r- configure it to allow popups for this site.');
    }
*/

    return mywindow;
}

function getBasket()
{
    //m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.GET_BASKET);
    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.SHOW_BASKET);
    m_mainFormManager.submit();
}

function getOffer()
{
    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.GET_OFFER);
    m_mainFormManager.submit();
}

function getBrands()
{
    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.GET_BRANDS);
    m_mainFormManager.submit();
}

function compareProducts()
{
    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.COMPAREPRODUCTS);
    m_mainFormManager.submit();
}

function getPromotions()
{
    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.GET_PROMOTIONS);
    m_mainFormManager.submit();
}

function getNewProducts()
{
    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.GET_NEWPRODUCTS);
    m_mainFormManager.submit();
}

function getProductsIndex(sFrom)
{
    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.GET_PRODUCTSINDEX);
    if ( sFrom ) {
        m_mainFormManager.addInput(PMSFinals.STARTLETTER, sFrom);
    }
    m_mainFormManager.submit();
}

function getProductCategories(iCategorization, iGroupID, iCategoryID, iIndex)
{
    m_mainFormManager.addInput(PMSFinals.ACTION    , PMSFinals.GET_PRODUCTCATEGORIES);
    m_mainFormManager.addInput(PMSFinals.GROUPID   , iGroupID                       );
    m_mainFormManager.addInput(PMSFinals.CATEGORYID, iCategoryID                    );

    if ( !iIndex && (iIndex!=0) ) { iIndex = '-1'; }

    m_mainFormManager.addInput(PMSFinals.STARTINDEX, '' + iIndex); //make sure is is a string, else 0 will become ''

    m_mainFormManager.addInput(PMSFinals.CATEGORIZATION, iCategorization);

    m_mainFormManager.submit();
}

function getProductCategories1(iGroupID, iCategoryID, iIndex)
{
    if(iCategoryID == '') {iCategoryID = iGroupID; }//Added by SVI for RFC-5289
    getProductCategories(1, iGroupID, iCategoryID, iIndex);
}

function getProductCategories2(iGroupID, iCategoryID, iIndex)
{
    getProductCategories(2, iGroupID, iCategoryID, iIndex);
}

function getArticleDetails()
{
    var oForm = document.getElementById("DIRECTORDERFORM");
    var sArticleNumber = oForm.elements[PMSFinals.ARTICLENUMBER].value;
    if ( sArticleNumber.trim().length == 0 ) { return; }

    m_mainFormManager.addInput(PMSFinals.ACTION           , PMSFinals.GET_PRODUCTS);
    m_mainFormManager.addInput(PMSFinals.ARTICLENUMBER    , sArticleNumber        );
    m_mainFormManager.addInput("DIRECTORDER", "1");//Added By SVI for RFC-4744
    m_mainFormManager.addInput(PMSFinals.GETPRODUCTDETAILS, "1"                   );

    m_mainFormManager.submit();
}

function getProductDetails(iProductID, iArticleID, sQuantity)
{
    if ( m_bPopupWindow ) { 
        opener.getProductDetails(iProductID, iArticleID);
        window.close();
        return;
    }
    
    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.GET_PRODUCTDETAILS);
    m_mainFormManager.addInput(PMSFinals.PRODUCTID, iProductID                  );
    m_mainFormManager.addInput(PMSFinals.ARTICLEID, iArticleID                  );
   	m_mainFormManager.addInput(PMSFinals.QUANTITY , sQuantity                   );

    m_mainFormManager.submit();
}

function getProductDetailsForSelectedColor(iProductID, iArticleID, oForm)
{
    if (!oForm.QUANTITY) { getProductDetails(iProductID, iArticleID, ''); return; }

    if (!oForm.QUANTITY.length) {
        // single QUANTITY field
        m_mainFormManager.addInput('QUANTITY', oForm.QUANTITY.value);
    } else {
        for (var i=0; i < oForm.QUANTITY.length; i++) {
            m_mainFormManager.addInput('QUANTITY', oForm.QUANTITY[i].value, 'hidden', true);
        }
    }
    getProductDetails(iProductID, iArticleID);
}

function getProducts(iGroupID, iCategoryID, iIndex)
{
    //alert("iGroupID:::"+iGroupID+"::::iCategoryID:::"+iCategoryID);
    if ( ! m_mainFormManager ) { return; } // IHE 20050314: if init() not yet finished...

    m_mainFormManager.addInput(PMSFinals.ACTION    , PMSFinals.GET_PRODUCTSFORCATEGORYTREE);

    m_mainFormManager.addInput(PMSFinals.GROUPID   , iGroupID);
    m_mainFormManager.addInput(PMSFinals.CATEGORYID, iCategoryID);

    if ( !iIndex && (iIndex!=0) ) { iIndex = '-1'; }
    m_mainFormManager.addInput(PMSFinals.STARTINDEX, '' + iIndex);  //make sure is is a string, else 0 will become ''

    m_mainFormManager.submit();
}

function getProductsAlternative(iProductID, iArticleID)
{
    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.GET_ALTERNATIVEPRODUCTS);
    m_mainFormManager.addInput(PMSFinals.PRODUCTID, iProductID);
    m_mainFormManager.addInput(PMSFinals.ARTICLEID, iArticleID);
    m_mainFormManager.submit();
}

function getProductsBrand(iBrandID)
{
    m_mainFormManager.addInput(PMSFinals.ACTION , PMSFinals.GET_PRODUCTS);
    m_mainFormManager.addInput(PMSFinals.BRANDID, iBrandID);
    m_mainFormManager.submit();
}

function showSalesOrdersFromIndex(iIndex)
{
    getSalesOrders(null, iIndex);
}

function getSalesOrders(form, iIndex)
{
    var sStatusIDs = null;
    var sOrderType = null;

    if ( form ) {
        sStatusIDs = form.elements[PMSFinals.STATUSIDS].value;
        sOrderType = form.elements[PMSFinals.ORDERTYPE].value;
    } else {
        //sStatusIDs = PMSFinals.ORDERSTATUS_WAITING_FOR_ACCEPTANCE + ", " + PMSFinals.ORDERSTATUS_FINAL_QUOTATION;
        //sOrderType = PMSFinals.ORDERTYPE_QUOTATION;
        sStatusIDs = "395"; //should be added to PMSFinals.ORDERSTATUS_WAITING_FOR_APPROVAL;
        sOrderType = PMSFinals.ORDERTYPE_ORDER;
    }

    if ( !iIndex && (iIndex!=0) ) { iIndex = '-1'; }
    m_mainFormManager.addInput(PMSFinals.STARTINDEX, '' + iIndex); //make sure iIndex is a string, else 0 will become ''

    m_mainFormManager.addInput(PMSFinals.ACTION    , PMSFinals.GET_SALESORDERS);
    m_mainFormManager.addInput(PMSFinals.STATUSIDS , sStatusIDs               );
    m_mainFormManager.addInput(PMSFinals.ORDERTYPE , sOrderType               );

    m_mainFormManager.submit();
}

function getShopPresentation(iDistributorID, iShopID, iVersionID)
{
    //some requests (vas, apply, addToBasket) require login; after login do the last request if this was the case.
    if ( m_oLastMethod != null ) {
        m_bIsCustomerLoggedIn = true;
        m_oLastMethod(m_oLastMethodArgs[0], m_oLastMethodArgs[1], true, m_oLastMethodArgs[3]);
        return;
    }

    if ( iDistributorID ) { m_mainFormManager.addInput(PMSFinals.DISTRIBUTORID, iDistributorID); }
    if ( iShopID        ) { m_mainFormManager.addInput(PMSFinals.SHOPID       , iShopID       ); }
    if ( iVersionID     ) { m_mainFormManager.addInput(PMSFinals.VERSIONID    , iVersionID    ); }

    m_mainFormManager.addInput (PMSFinals.ACTION, PMSFinals.GET_SHOPPRESENTATION);

    m_mainFormManager.submit();
}

function setOrder(rOrder, rsOrderLines, rsVASPrintings)
{
    m_rOrder         = rOrder;
    m_rsOrderLines   = rsOrderLines;
    m_rsVASPrintings = rsVASPrintings;

    m_basketManager.setOrder(m_rOrder, m_rsOrderLines, m_rsVASPrintings);
}

function logout()
{
    //m_mainFormManager.setTarget(PMSFinals.WINDOWNAME);
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.DOLOGOUTCUSTOMER);

    m_mainFormManager.submit();
}

function acceptQuotation(form)
{
    form.elements[PMSFinals.ACTION].value = PMSFinals.ACCEPT_QUOTATION;
    form.submit();
}

function changeQuotation(form)
{
    form.elements[PMSFinals.ACTION].value = PMSFinals.CHANGE_QUOTATION;
    form.submit();
}

function rejectQuotation(form)
{
    form.elements[PMSFinals.ACTION].value = PMSFinals.REJECT_QUOTATION;
    form.submit();
}

function repeatOrder(form)
{
    form.elements[PMSFinals.ACTION].value = PMSFinals.REPEATORDER;
    form.submit();
}

function approveOrder(form)
{
    form.elements[PMSFinals.ACTION].value = PMSFinals.APPROVEORDER;
    form.submit();
}

function declineOrder(form)
{
    form.elements[PMSFinals.ACTION].value = PMSFinals.DECLINEORDER;
    form.submit();
}

function getBasketForm()
{
    var fBasketForm = null;
    
    var fBasketForm = document.forms["basketform"];
    if ( !fBasketForm ) { return null; }
    
    return fBasketForm;
}

function setFormFieldValues(form, sParameterName, sValue)
{
    for ( i = 0; i < form.elements.length; i++ )
    {
        var oElement = form.elements[i];
        var sName    = oElement.name;
        if ( sName.startsWith(sParameterName) == false ) { continue; }

        oElement.value = sValue;
    }
}

function dateHasChangedCustom(ePresentation, sInternalID, sFormat)
{
    var fDeliveryDate = document.getElementById(sInternalID);
    if ( !fDeliveryDate ) { return; }
    
    var sFieldName  = fDeliveryDate.name;
    var sLineNumber = sFieldName.substring(14);
    
    var sDeliveryDate = fDeliveryDate.value;

    // IHE 20050318: added 'if' because in popup the m_basketManager is not defined
    if ( ( typeof m_basketManager != "undefined" ) && (m_basketManager != null) ) {
        m_basketManager.setDeliveryDate(sLineNumber, sDeliveryDate);
    }
}

//product comparison: stores this article in the session for product comparison
function setCompareProduct(chkbox, iProductID, iArticleID)
{
    //set parameters
    m_mainFormManager.addInput("PRODUCTID", iProductID);
    m_mainFormManager.addInput("ARTICLEID", iArticleID);

    //set action
    var sAction = ( chkbox.checked ? "setCompareProduct" : "removeCompareProduct" );
    
    m_mainFormManager.addInput(PMSFinals.ACTION, sAction);

    //send request
    m_mainFormManager.submit();
}

//product comparison: stores this article in the session for product comparison
function removeCompareProduct(iProductID, iArticleID)
{
    //set parameters
    m_mainFormManager.addInput("PRODUCTID", iProductID);
    m_mainFormManager.addInput("ARTICLEID", iArticleID);

    //set action
    var sAction = "removeCompareProduct";

    m_mainFormManager.addInput(PMSFinals.ACTION, sAction);

    //send request
    m_mainFormManager.submit();
}

//from productoverview / productdetails
var requestPrintingModule2 = function requestPrintingModule2(iProductID, iArticleID, bGetShopPresentation)
{
    if ( m_bIsCustomerLoggedIn == false ) {
        m_oLastMethod     = requestPrintingModule2;
        m_oLastMethodArgs = arguments;
        doLogin();
        return;
    }

    var fBasketForm    = getBasketForm();
    if ( fBasketForm == null ) { return; }

    //copy quantities to main form
    var elements = fBasketForm.elements;
    for (var i = 0; i < elements.length; i++)
    {
        var sFieldName = elements[i].name;
        if ( !sFieldName || (sFieldName.indexOf("QUANTITY_" + iProductID + "_") < 0) ) { continue; }
        
        var sQuantity  = elements[i].value;
        
        m_mainFormManager.addInput(sFieldName, sQuantity);
    }

    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.REQUESTPRINTINGMODULE);

/*
    //TODO: handle popup
    if ( m_bOPMPopup || !m_bHasPrintingModule ) {
        var location = null;
        if ( m_bHasPrintingModule ) {
            location = new XYWH(0, 0, 855, 800);
        } else {
            location = new XYWH(100, 100, 600, 400);
        }
        var mywindow = window.open('','VAS','toolbar=1,scrollbars=1,location=1,status=1,menubar=1,resizable,' 
                                              + location.toCSVString());
        m_mainFormManager.setTarget("VAS");
    }
*/

    if ( bGetShopPresentation ) {
        m_mainFormManager.addInput("GETSHOPPRESENTATION", "1");
    }

    //send request
    m_mainFormManager.submit();
    
    //clean up mainform (necessary for popup situation)
    var fMainForm = m_mainFormManager.getForm();
    elements = fMainForm.elements;
    for (var i = 0; i < elements.length; i++)
    {
        var sFieldName = elements[i].name;
        if ( !sFieldName || (sFieldName.indexOf("QUANTITY_") < 0) ) { continue; }
        
        m_mainFormManager.removeInput(sFieldName);
    }
    
    m_mainFormManager.removeInput("GETSHOPPRESENTATION");

    //reset target (necessary for popup situation)
    m_mainFormManager.setTarget("");
}


//from productoverview / productdetails
var requestVAS = function requestVAS(iProductID, iArticleID, bGetShopPresentation)
{
    //for now require login
    if ( m_bIsCustomerLoggedIn == false ) {
        m_oLastMethod     = requestVAS;
        m_oLastMethodArgs = arguments;
        doLogin();
        return;
    }

    var fBasketForm    = getBasketForm();
    if ( fBasketForm == null ) { return; }

    var elements = fBasketForm.elements;
    
    for (var i = 0; i < elements.length; i++)
    {
        var fInputField = elements[i];
        
        var sFieldName  = fInputField.name;
        if ( !sFieldName || (sFieldName.startsWith("QUANTITY_" + iProductID + "_") == false) ) { continue; }
        
        var sQuantity = fInputField.value;
        
        m_mainFormManager.addInput(sFieldName, sQuantity);
    }

    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.REQUESTVAS);
/*
    if ( m_bOPMPopup || !m_bHasPrintingModule ) {
        var location = null;
        if ( m_bHasPrintingModule ) {
            location = new XYWH(0, 0, 855, 800);
        } else {
            location = new XYWH(100, 100, 600, 400);
        }
        var mywindow = window.open('','VAS','toolbar=1,scrollbars=1,location=1,status=1,menubar=1,resizable,' 
                                              + location.toCSVString());
        m_mainFormManager.setTarget("VAS");
    }
*/
    if ( bGetShopPresentation ) {
        m_mainFormManager.addInput("GETSHOPPRESENTATION", "1");
    }

    m_mainFormManager.submit();
    
    //clear quantities
    //m_mainFormManager.removeInput(sFieldName);

    m_mainFormManager.removeInput("GETSHOPPRESENTATION");

    //reset target
    m_mainFormManager.setTarget("");
}


//from basket or offer (if vas configured)
function requestBasketVAS(iLineNumber, bFromOffer)
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.REQUESTVAS);

    var sLineNumber = iLineNumber.toString();
    m_mainFormManager.addInput(PMSFinals.LINENUMBER, sLineNumber);

    var rsLines    = bFromOffer ? getOfferLines() : m_rsOrderLines;
    if ( rsLines == null ) { return; }

    var rLine      = rsLines.findRow("LINENUMBER", sLineNumber);
    if ( rLine == null ) { return; }
    
    //check for other variants
    var sAddToLineNumber = rLine.get("ADDTOLINENUMBER");

    if ( sAddToLineNumber == null ) {
        var sProductID = rLine.get("PRODUCTID");
        var sArticleID = rLine.get("ARTICLEID");
        var sQuantity  = rLine.get("QUANTITY");

        var sFieldName = PMSFinals.QUANTITY + "_" + sProductID + "_" + sArticleID;
        m_mainFormManager.addInput(sFieldName, sQuantity);
    } else {
        var rsVariants = rsLines.filter("ADDTOLINENUMBER", sAddToLineNumber);
        var iterator   = rsVariants.iterator();
        
        while ( iterator.hasNext() )
        {
            var rVariantLine = iterator.next();
            
            var sProductID = rVariantLine.get("PRODUCTID");
            var sArticleID = rVariantLine.get("ARTICLEID");
            var sQuantity  = rVariantLine.get("QUANTITY");
            
            var sFieldName = PMSFinals.QUANTITY + "_" + sProductID + "_" + sArticleID;
            m_mainFormManager.addInput(sFieldName, sQuantity);
        }
    }
/*
    if ( m_bOPMPopup || !m_bHasPrintingModule ) {
        var location = null;
        if ( m_bHasPrintingModule ) {
            location = new XYWH(0, 0, 855, 800);
        } else {
            location = new XYWH(100, 100, 600, 400);
        }
        var mywindow = window.open('','VAS','toolbar=0,scrollbars=1,location=0,status=1,menubar=0,resizable,' 
                                              + location.toCSVString());
        m_mainFormManager.setTarget("VAS");
    }
*/

    if ( bFromOffer ) {
        m_mainFormManager.addInput("OFFERINDICATOR", "1");
    }

    m_mainFormManager.submit();

    //m_mainFormManager.removeInput(sFieldName);
    //m_mainFormManager.removeInput(PMSFinals.LINENUMBER);
    //m_mainFormManager.removeInput("OFFERINDICATOR");
    
    m_mainFormManager.setTarget("");
}

function invokeLeafletApplication(iProductCode, iArticleCode)
{
    doShowPopup( [ PMSFinals.ACTION       , PMSFinals.PRODUCTID, PMSFinals.ARTICLEID]
               , [ PMSFinals.INVOKELEAFLET, iProductCode       , iArticleCode       ]
               , 'LEAFLET'
               , new XYWH(100, 100, 1024, 800));
/*
    //invoke the E-Leaflet application in a separate window
    //alert("The E-Leaflet Application should now be invoked in a separate window");

    //Considerations: How handle multiple leaflet application invocations in the same user-session (serverside)?
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.INVOKELEAFLET);
    m_mainFormManager.addInput(PMSFinals.PRODUCTID, iProductCode);
    m_mainFormManager.addInput(PMSFinals.ARTICLEID, iArticleCode);

    var location = new XYWH(100, 100, 800, 800);
    var mywindow = window.open('','LEAFLET','toolbar=0,scrollbars=1,location=0,status=1,menubar=0,resizable,' 
                                          + location.toCSVString());
    m_mainFormManager.setTarget("LEAFLET");

    m_mainFormManager.submit();

    //clean form
    m_mainFormManager.removeInput(PMSFinals.PRODUCTID);
    m_mainFormManager.removeInput(PMSFinals.ARTICLEID);
    m_mainFormManager.setTarget("");*/
}

//from basket or offer (if vas configured)
function requestBasketOPM(iLineNumber, bFromOffer)
{
    m_mainFormManager.addInput(PMSFinals.ACTION, PMSFinals.REQUESTPRINTINGMODULE);

    var sLineNumber = iLineNumber.toString();
    m_mainFormManager.addInput(PMSFinals.LINENUMBER, sLineNumber);

    var rsLines    = bFromOffer ? getOfferLines() : m_rsOrderLines;
    if ( rsLines == null ) { return; }

    var rLine      = rsLines.findRow("LINENUMBER", sLineNumber);
    if ( rLine == null ) { return; }
    
    //check for other variants
    var sAddToLineNumber = rLine.get("ADDTOLINENUMBER");

    if ( sAddToLineNumber == null ) {
        var sProductID = rLine.get("PRODUCTID");
        var sArticleID = rLine.get("ARTICLEID");
        var sQuantity  = rLine.get("QUANTITY");

        var sFieldName = PMSFinals.QUANTITY + "_" + sProductID + "_" + sArticleID;
        m_mainFormManager.addInput(sFieldName, sQuantity);
    } else {
        var rsVariants = rsLines.filter("ADDTOLINENUMBER", sAddToLineNumber);
        var iterator   = rsVariants.iterator();
        
        while ( iterator.hasNext() )
        {
            var rVariantLine = iterator.next();
            
            var sProductID = rVariantLine.get("PRODUCTID");
            var sArticleID = rVariantLine.get("ARTICLEID");
            var sQuantity  = rVariantLine.get("QUANTITY");
            
            var sFieldName = PMSFinals.QUANTITY + "_" + sProductID + "_" + sArticleID;
            m_mainFormManager.addInput(sFieldName, sQuantity);
        }
    }
    
    if ( m_bOPMPopup ) {
        var location = new XYWH(0, 0, 855, 800);
        var mywindow = window.open("","OPM","toolbar=0,scrollbars=1,location=0,status=1,menubar=0,resizable,"
                                           + location.toCSVString());
        m_mainFormManager.setTarget("OPM");
    }

    if ( bFromOffer ) {
        m_mainFormManager.addInput("OFFERINDICATOR", "1");
    }

    m_mainFormManager.submit();

    //m_mainFormManager.removeInput(sFieldName);
    //m_mainFormManager.removeInput(PMSFinals.LINENUMBER);
    //m_mainFormManager.removeInput("OFFERINDICATOR");
    
    m_mainFormManager.setTarget("");
}

function showCategoriesFromIndex(iIndex)
{
    getProductCategories(1, m_sSelectedGroupID, m_sSelectedCategoryID, iIndex);
}

function showPage(sParameter)
{
    m_mainFormManager.addInput(PMSFinals.ACTION        , PMSFinals.SHOWSTATICHTML);
    m_mainFormManager.addInput(PMSFinals.SUBACTION     , PMSIntegerFinals.SUBACTION_OTHERSTATIC);
    m_mainFormManager.addInput(PMSFinals.PAGEREQUESTED , sParameter              );
    m_mainFormManager.submit();
}

function showProductsFromIndex(iIndex)
{
    getProducts(m_sSelectedGroupID, m_sSelectedCategoryID, iIndex);
}

function viewOrderQuotation(iOrderID)
{
    m_mainFormManager.addInput(PMSFinals.ACTION   , PMSFinals.VIEWORDERQUOTATION    );
    m_mainFormManager.addInput(PMSFinals.SUBACTION, PMSIntegerFinals.SUBACTION_ORDERDETAILS);
    m_mainFormManager.addInput(PMSFinals.ORDERID  , iOrderID                        );

    m_mainFormManager.submit();
}

function doImageNotFound(img)
{
	img.src = PMSFinals.IMAGE_IMAGE_NOT_FOUND;
	img.alt = 'Image not found';
    img.notFound = true;
}
/**
 * Resizes group and category images, function is called via onload attribute in image tag.
 */
function doImageResize(img)
{
    var xywh = new XYWH(0,0,140,72);
    var sImageID = img.id;
    if ( sImageID.indexOf(PMSFinals.GROUPANDCATEGORYPREFIX) != -1 )
    {
        if ( img.width  != xywh.w ) {
            if ( img.width  > xywh.w ) { img.width                   = xywh.w; }
            if ( img.width  < xywh.w ) { img.parentNode.style.width  = xywh.w; }
        }
        if ( img.height != xywh.h ) {
            if ( img.height > xywh.h ) { img.height                  = xywh.h; }
            if ( img.height < xywh.h ) { img.parentNode.style.height = xywh.h; }
        }
    }
    if ( img.notFound ) {
        img.width  = xywh.w;
        img.height = xywh.h;
    }
}

/**
 * The onload="doImageRezise(this)" attribute in image tag does not always work... This method calls the method for sure.
 */
function resizeImages()
{
    if ( ! document.images ) { return; }

    var images = document.images;
    for ( var i=0; i < images.length; i++ ) {
        var image = images[i];
        if ( image.onload ) {
            //alert(image.id);
            image.onload();
        }
    }
}

function copyDeliveryAddress(chkbox)
{
    if ( !chkbox ) { return; }
    
    var fForm       = chkbox.form;
    if ( !fForm ) { alert("copyDeliveryAddress: no form"); }
    
    if ( chkbox.checked == false ) { return; }
    
    var elements = fForm.elements;
    
    for (var i = 0; i < elements.length; i++)
    {
        var sName = elements[i].name;
        if ( !sName || (sName.indexOf("BILLING") != 0) ) { continue; }
        
        var sDeliveryFieldName = sName.substring(7);
        var fDeliveryField     = elements[sDeliveryFieldName];
        if ( !fDeliveryField ) { elements[i].value = ""; continue; }
        
        var sValue = fDeliveryField.value;
        if ( !sValue ) { elements[i].value = ""; continue; }
        
        if ( typeof elements[i] == "select" ) {
            var fSelect = new SelectElement(elements[i]);
            fSelect.setValue(sValue);
            continue;
        }
        
        elements[i].value = sValue;
    }
}

function setAddDeliveryAddress(chkbox)
{
    var fForm       = chkbox.form;
    var fAddAddress = fForm.elements["ADDADDRESS"];
    
    if ( chkbox.checked ) { fAddAddress.value = "1"; return; }

    fAddAddress.value = "0";
}

function setAddBillingAddress(chkbox)
{
    var fForm       = chkbox.form;
    var fAddAddress = fForm.elements["ADDBILLINGADDRESS"];
    
    if ( chkbox.checked ) { fAddAddress.value = "1"; return; }

    fAddAddress.value = "0";
}

//TODO: combine with setSelectedAddress -> generic function!
function setSelectedBillingAddress(selectList, iAddressID)
{
    if ( !selectList ) { alert("setSelectedBillingAddress: no selectList!"); }

    var form = selectList.form;
    if ( !form ) { alert("setSelectedBillingAddress: no form!"); }
    
    var fAddressID = selectList;
    
    var fAddressSelect = new SelectElement(fAddressID);
    fAddressSelect.setValue(iAddressID);
    
    if ( iAddressID.length == "" ) { clearBillingAddressFields(selectList); return; }
    
    //form.elements["ADDRESSTYPE"          ].value = getAddressValue(iAddressID, 1);
    form.elements["BILLINGSTREET"               ].value = getAddressValue(iAddressID, 3);
    form.elements["BILLINGHOUSENUMBER"          ].value = getAddressValue(iAddressID, 4);
    form.elements["BILLINGCITY"                 ].value = getAddressValue(iAddressID, 5);
    form.elements["BILLINGZIP"                  ].value = getAddressValue(iAddressID, 7);
    form.elements["BILLINGADDITIONALADDRESSINFO"].value = getAddressValue(iAddressID,10);
    
    var fCountryCode     = new SelectElement(form.elements["BILLINGCOUNTRYCODE"]);
    fCountryCode.setValue(getAddressValue(iAddressID, 6));

    form.elements["ADDBILLINGADDRESS"].value = "0";
}

function setSelectedAddress(selectList, iAddressID)
{
    if ( !selectList ) { alert("setSelectedAddress: no selectList!"); }

    var form = selectList.form;
    if ( !form ) { alert("setSelectedAddress: no form!"); }
    
    var fAddressID = selectList;
    
    var fAddressSelect = new SelectElement(fAddressID);
    fAddressSelect.setValue(iAddressID);
    
    if ( iAddressID.length == "" ) { clearAddressFields(selectList); return; }
    
    //form.elements["ADDRESSTYPE"          ].value = getAddressValue(iAddressID, 1);
    form.elements["STREET"               ].value = getAddressValue(iAddressID, 3);
    form.elements["HOUSENUMBER"          ].value = getAddressValue(iAddressID, 4);
    form.elements["CITY"                 ].value = getAddressValue(iAddressID, 5);
    form.elements["ZIP"                  ].value = getAddressValue(iAddressID, 7);
    form.elements["ADDITIONALADDRESSINFO"].value = getAddressValue(iAddressID,10);
    
    var fCountryCode     = new SelectElement(form.elements["COUNTRYCODE"]);
    fCountryCode.setValue(getAddressValue(iAddressID, 6));

/*	 switching address should not affect delivery cost

    var fDeliveryCosts   = parseFloat(getAddressValue(iAddressID, 9));
    if ( isNaN(fDeliveryCosts) ) {
        fDeliveryCosts   = parseFloat(m_sBasketDeliveryCosts);
    }
    form.elements["DELIVERYCOSTS"].value = fDeliveryCosts;

    if ( m_bNeedTotal ) {
        m_fDeliveryCosts = fDeliveryCosts;
        m_fTotal         = m_fSubTotal + m_fDeliveryCosts + m_fOrderCosts;
        setTotals(m_fTotal, m_fDeliveryCosts);
    }
*/
    form.elements["ADDADDRESS"].value = "0";
}

//TODO: combine with clearAddressFields -> generic function!
function clearBillingAddressFields(selectList)
{
    if ( !selectList ) { alert("clearBillingAddressFields: no selectList!"); }

    var form = selectList.form;
    if ( !form ) { alert("clearBillingAddressFields: no form!"); }

    var fSelectList = new SelectElement(selectList);
    fSelectList.setValue("");

    //form.elements["ADDRESSTYPE"          ].value = m_sDefaultAddressType;
    form.elements["BILLINGSTREET"               ].value = "";
    form.elements["BILLINGHOUSENUMBER"          ].value = "";
    form.elements["BILLINGCITY"                 ].value = "";
    form.elements["BILLINGZIP"                  ].value = "";
    form.elements["BILLINGADDITIONALADDRESSINFO"].value = "";

    var fCountryCode = new SelectElement(form.elements["BILLINGCOUNTRYCODE"]);
    fCountryCode.setValue(m_sDefaultCountryCode);
}

function clearAddressFields(selectList)
{
    if ( !selectList ) { alert("clearAddressFields: no selectList!"); }

    var form = selectList.form;
    if ( !form ) { alert("clearAddressFields: no form!"); }

    var fSelectList = new SelectElement(selectList);
    fSelectList.setValue("");

    //form.elements["ADDRESSTYPE"          ].value = m_sDefaultAddressType;
    form.elements["STREET"               ].value = "";
    form.elements["HOUSENUMBER"          ].value = "";
    form.elements["CITY"                 ].value = "";
    form.elements["ZIP"                  ].value = "";
    form.elements["ADDITIONALADDRESSINFO"].value = "";

    var fCountryCode = new SelectElement(form.elements["COUNTRYCODE"]);
    fCountryCode.setValue(m_sDefaultCountryCode);

    m_fDeliveryCosts = parseFloat(m_sBasketDeliveryCosts);
    m_fTotal         = m_fSubTotal + m_fDeliveryCosts + m_fOrderCosts;
    setTotals(m_fTotal, m_fDeliveryCosts);
}

function setTotals(fTotal, fDeliveryCosts)
{
    var eBasketTotal   = document.getElementById("baskettotalvalue");
    eBasketTotal.innerHTML   = fTotal.toLocaleString();
    
    var eDeliveryCosts = document.getElementById("basketdeliverycostsvalue");
    if ( !eDeliveryCosts ) { return; }
    eDeliveryCosts.innerHTML = fDeliveryCosts.toLocaleString();
}

function getArrayValue(anArray, iID, iIndex)
{
    var oValue = anArray[iID][iIndex];
    if ( !oValue ) { oValue = ""; }

    return oValue;
}

//  20060331
function setSelectedCostCenter(iCostCenterID, rsUsers)
{
    var selectList    = document.forms["basketform"].elements["REQUESTFOR"];
    var selectElement = new SelectElement(selectList);

    //always add 'empty' option
    var oFirstOption  = new Option("", "");
    
    var rsCostCenterUsers = rsUsers.filter("COSTCENTERID", iCostCenterID);
    selectElement.setOptions(rsCostCenterUsers, "USERID", "FULLNAME", oFirstOption);
}

    /*******************************************************************************
     * SELECTOR METHODS (/other/SelectorContent.jsp)
     *******************************************************************************/

function setCategoryOptions(iGroupID, rsCategories, iCategorization)
{
    var selectList    = document.forms[SELECTORFORM].elements["CATEGORYID" + iCategorization];
    var selectElement = new SelectElement(selectList);
    
    //always add 'empty' option
    var oFirstOption  = new Option(m_sOptionAll, "");

    var rsCategories1 = null;
    if ( iGroupID == "" ) {
        rsCats = rsCategories.filter("PARENTCATEGORYID", null, RowSet.FILTER_EXCLUSIVE);
    } else {
        rsCats = rsCategories.filter("PARENTCATEGORYID", iGroupID);
    }

    rsCats.sort("DESCRIPTION");

    selectElement.setOptions(rsCats, "CATEGORYID", "DESCRIPTION", oFirstOption);

    //set groupid
    var fGroupID      = document.forms[SELECTORFORM].elements["GROUPID"];
    fGroupID.value    = iGroupID;

    //set categoryid
    var fCategoryID   = document.forms[SELECTORFORM].elements["CATEGORYID"];
    fCategoryID.value = "";
    
    //other categorization (optional!)    
    var iOtherCategorization = ( iCategorization == 1 ) ? 2 : 1;
    resetCategorization(iOtherCategorization)
}

function setCategoryID(iCategoryID, iOtherCategorization)
{
    var fCategoryID   = document.forms[SELECTORFORM].elements["CATEGORYID"];
    fCategoryID.value = iCategoryID;

    resetCategorization(iOtherCategorization);
}

function resetCategorization(iOtherCategorization)
{
    var fOtherGroups = document.forms[SELECTORFORM].elements["GROUPID" + iOtherCategorization];
    if ( !fOtherGroups ) { return; } 
    
    fOtherGroups.selectedIndex = 0;
    
    var selectListOther    = document.forms[SELECTORFORM].elements["CATEGORYID" + iOtherCategorization];
    var selectElementOther = new SelectElement(selectListOther);
    
    //always add 'empty' option
    var oFirstOptionOther  = new Option(m_sOptionAll, "");

    var rsCategories = ( (iOtherCategorization == 1) ? m_rsCategories1 : m_rsCategories2 );

    var rsCategoriesOther = rsCategories.filter("PARENTCATEGORYID", null, RowSet.FILTER_EXCLUSIVE);
    rsCategoriesOther.sort("DESCRIPTION");

    selectElementOther.setOptions(rsCategoriesOther, "CATEGORYID", "DESCRIPTION", oFirstOptionOther);
}

function setSubColors(iColorID)
{
    var selectList    = document.forms[SELECTORFORM].elements["SUBCOLORVALUEID"];
    var selectElement = new SelectElement(selectList);

    //always add 'empty' option
    var oFirstOption = new Option(m_sOptionAll, "");

    var rsSubColors = null;
    if ( iColorID == "" ) {
        rsSubColors = m_rsSubColors;
    } else {
        rsSubColors = m_rsSubColors.filter("PARENTVALUEID", iColorID);
    }

    rsSubColors.sort("DESCRIPTION");

    selectElement.setOptions(rsSubColors, "VALUEID", "DESCRIPTION", oFirstOption);
}

// IHE: 20050408: renamed method (Number.js contains a formatNumberInput as well...)
// IHE: 20050408: added cDecimalSeparator as parameter
function formatNumberInputPMS(element, decimals, cDecimalSeparator)
{
    var sElementName = element.name;

    var iIndexPostfix     = sElementName.indexOf("PRESENTATIONPOSTFIX");
    var sValueElementName = sElementName.substring(0, iIndexPostfix);

    var eValueElement = document.getElementById(sValueElementName);

    var sInput  = element.value;
    if (!sInput) { eValueElement.value = ""; return 0; }

    iIndexDot   = sInput.indexOf('.');
    iIndexComma = sInput.indexOf(',');

    if (  iIndexComma > iIndexDot ) {
        var sReplace = /\./g;
        sInput = sInput.replace(sReplace, "");
        sReplace = /\,/g;
        sInput = sInput.replace(sReplace, ".");
    } else {
        sReplace = /\,/g;
        sInput = sInput.replace(sReplace, "");
    }

    var fValue = parseFloat(sInput);
    if ( isNaN(fValue) ) {
        eValueElement.value = ""; element.value = "";
    } else {
        eValueElement.value = fValue;
        fValue = fValue.formatFloat(decimals, cDecimalSeparator);
        element.value = fValue;
    }
}

Number.prototype.formatFloat = function(decimals, sDecimalSeparator)
{
    var decimals = decimals || 2; // defaults to two
    var sDecimalSeparator = sDecimalSeparator || ".";
    var catalyst = Math.pow(10, decimals);

    var fixedNum = Math.round(parseFloat(this) * catalyst) / catalyst;

    if ( fixedNum % 1 ) {
        var sValue    = fixedNum.toString();
        iIndexDot     = sValue.indexOf(".");
        var sInteger  = sValue.substring(0, iIndexDot);
        var sDecimals = sValue.substring(iIndexDot+1);
        for ( var i = sDecimals.length; i < decimals; i++ )
        {
            sDecimals = sDecimals + "0";
        }
        return sInteger+sDecimalSeparator+sDecimals;
    } else {
        var str = sDecimalSeparator;

        while ( decimals-- ) { str += "0"; }

        return fixedNum + str;
    }
}

//for selector
function validateForm(form)
{
    var bValuesOK = areValuesOK(form);

    if ( bValuesOK && ( m_iSelectorType == PMSIntegerFinals.SELECTORTYPE_MODAL ) ) {
        // for actual modal window using window.showModalDialog (opener is not defined in that case)
        // the window must be closed or the 'opener' is not refreshed
        if ( !opener ) { window.setTimeout('window.close()', 300); }
    }

    return bValuesOK;
}

//for selector (this can be made easier....)
function areValuesOK(form)
{
    var sAllValues = '';
    var sValue     = null;
    
    var fField = null;

    fField = document.getElementById("ARTICLENUMBER");
    if ( fField ) {
        sValue      = fField.value;
        sAllValues += sValue.trim();
    }

    fField = document.getElementById("KEYWORDS");
    if ( fField ) {
        sValue      = fField.value;
        sAllValues += sValue.trim();                     
    }
                                                     
    fField = document.getElementById("GROUPID");
    if ( fField ) {
        sValue      = fField.value;
        sAllValues += sValue.trim();
    }

    fField = document.getElementById("CATEGORYID");
    if ( fField ) {
        sValue      = fField.value;
        sAllValues += sValue.trim();
    }

    fField = document.getElementById("BRANDID");
    if ( fField ) {
        sValue      = fField.value;
        sAllValues += sValue.trim();
    }

    fField      = document.getElementById("PRICEFROM");
    if ( fField ) {
        sValue      = fField.value;
        sAllValues += sValue.trim();
    }

    fField      = document.getElementById("PRICETO");
    if ( fField ) {
        sValue      = fField.value;
        sAllValues += sValue.trim();
    }

    fField = document.getElementById("COLORVALUEID");
    if ( fField ) {
        sValue      = fField.value;
        sAllValues += sValue.trim();                     
    }
    fField = document.getElementById("SUBCOLORVALUEID");
    if ( fField ) {
        sValue      = fField.value;
        sAllValues += sValue.trim();
    }

    var iValueLength = ( sAllValues ? sAllValues.length : 0 );
    if ( iValueLength == 0 ) {
        alert(m_sSelectorMessage1);
        return false;
    }

    var sQuantityValue      = null;
    var sDeliveryDateValue  = null;
    
    fField = document.getElementById("QUANTITY");
    if ( fField ) {
        sQuantityValue      = fField.value;
        sQuantityValue      = sQuantityValue.trim();
    }

    fField = document.getElementById("DELIVERYDATE");
    if ( fField ) {
        sDeliveryDateValue  = fField.value;
        sDeliveryDateValue  = sDeliveryDateValue.trim();
    }

    var iQuantityLength     = ( (sQuantityValue     != null) ? sQuantityValue.length     : 0 );
    var iDeliveryDateLength = ( (sDeliveryDateValue != null) ? sDeliveryDateValue.length : 0 );

    if ( (iQuantityLength == 0) && (iDeliveryDateLength == 0) ) { return true; }
    if ( (iQuantityLength >  0) && (iDeliveryDateLength >  0) ) { return true; }

    alert(m_sSelectorMessage2);

    return false;
}

DatePicker.prototype.setPopupPositionCustom = function(ePopup, eTarget, XYWHpopup, XYWHelement)
{
    var xywhWindow = getWindowXYWH();
    var popupLayerBottom = XYWHpopup.y + XYWHpopup.h;
    if ( popupLayerBottom >  xywhWindow.h ) {
        var dH = popupLayerBottom - xywhWindow.h + 5;
        window.resizeBy(0, dH);
    }
}

    /*******************************************************************************
     * END SELECTOR METHODS
     *******************************************************************************/
     
    /*******************************************************************************
     * START OFFER METHODS
     *******************************************************************************/

function addOfferLine()
{
    var rsOfferLines = getOfferLines();
    
    return rsOfferLines.insertRow();
}

function addOfferVASPrintingLine()
{
    var rsOfferVASPrintings = getOfferVASPrintings();
    
    return rsOfferVASPrintings.insertRow();
}

function getOfferLines()
{
    if ( m_rsOfferLines != null ) { return m_rsOfferLines; }
    
    m_rsOfferLines = m_rsOrderLines.removeRows();
    
    return m_rsOfferLines;
}

function getOfferVASPrintings()
{
    if ( m_rsOfferVASPrintings != null ) { return m_rsOfferVASPrintings; }
    
    if ( m_rsVASPrintings != null ) {
		m_rsOfferVASPrintings = m_rsVASPrintings.removeRows();
	}
    
    return m_rsOfferVASPrintings;
}

function addOfferToBasket()
{
    //add the offer to the orderlines
    m_rsOfferLines.setModifications(ProtocolFinals.MODIFICATIONTYPE_INSERT);
    m_basketManager.addOrderLines(m_rsOfferLines);
    
    //indicator for clearing the offer
    m_mainFormManager.addInput("CLEAROFFER", "1");

    //indicator for forward to basket
    m_mainFormManager.addInput("GETBASKET", "1");

    //update basket
    m_basketManager.updateBasket();
}

function addVASOfferLines(rsVASOfferLines)
{
    if ( rsVASOfferLines == null ) { return; }
    
    if ( rsVASOfferLines.getNumberOfRows() == 0 ) { return; }
    
    var rsOfferLines = getOfferLines();

    rsOfferLines.appendRowSet(rsVASOfferLines);
}

function clearOffer()
{
    m_mainFormManager.addInput(PMSFinals.ACTION, "clearOffer");

    m_mainFormManager.submit();
}

//remove from offer
function removeOfferLine(iLineNumber, bRemoveVariants)
{
    deleteOfferLine(iLineNumber);
   
    if ( bRemoveVariants ) { deleteOfferVariants(iLineNumber); }

    updateOffer();
}

function deleteOfferLine(iLineNumber)
{
    var rsOfferLines       = getOfferLines();
    var rsOfferVASPrinting = getOfferVASPrintings();

    var rOfferLine = rsOfferLines.findRow(PMSFinals.LINENUMBER , '' + iLineNumber);
    if ( rOfferLine == null ) { return; }
    
    rOfferLine.setModification(ProtocolFinals.MODIFICATIONTYPE_DELETE);
    
    deleteReferringOfferLines(iLineNumber);
}

function deleteReferringOfferLines(iRefersToLineNumber)
{
    var rsOfferLines = getOfferLines();
    
    var rsOfferLines1 = rsOfferLines.filter(PMSFinals.REFERSTOLINENUMBER, '' + iRefersToLineNumber);
    if ( rsOfferLines1.size() == 0 ) { return; }
    
    var iterator = rsOfferLines1.iterator();
    while ( iterator.hasNext() )
    {
        var rOfferLine  = iterator.next();
        
        var sLineNumber         = rOfferLine.get(PMSFinals.LINENUMBER);
        var sRefersToLineNumber = rOfferLine.get(PMSFinals.REFERSTOLINENUMBER);
        if ( sLineNumber == sRefersToLineNumber ) { continue; }
        
            rOfferLine  = rsOfferLines.findRow(PMSFinals.LINENUMBER , '' + sLineNumber);
        if ( rOfferLine == null ) { continue; }

        rOfferLine.setModification(ProtocolFinals.MODIFICATIONTYPE_DELETE);

        deleteReferringOfferLines(sLineNumber);
    }
}

function deleteOfferVariants(iLineNumber)
{
    var rsOfferLines = getOfferLines();
    if ( rsOfferLines == null ) { return; }
    
    var rMainLine = rsOfferLines.findRow("LINENUMBER", iLineNumber);
    if ( rMainLine == null ) { return; }
    
    var sAddToLineNumber = rMainLine.get("ADDTOLINENUMBER");
    if ( sAddToLineNumber == null ) { return; }
    
    var iterator = rsOfferLines.iterator();
    
    while ( iterator.hasNext() )
    {
        var rLine = iterator.next();
        
        var sAddTo = rLine.get("ADDTOLINENUMBER");
        if ( (sAddTo == null) || (sAddTo != sAddToLineNumber) ) { continue; }
        
        //var sLineNumber = rLine.get("LINENUMBER");
        //if ( sLineNumber == sAddTo ) { continue; }
        
        rLine.setModification(ProtocolFinals.MODIFICATIONTYPE_DELETE);
    }
}

function updateOffer()
{
    var rsOfferLines       = getOfferLines();
    var rsOfferVASPrinting = getOfferVASPrintings();
    
    m_mainFormManager.addInput(PMSFinals.ACTION             , "updateOffer");
    m_mainFormManager.addInput(PMSFinals.ORDERLINES         , ProtocolFinals.US + rsOfferLines.writeObject());
    m_mainFormManager.addInput(PMSFinals.VASPRINTINGS       , ProtocolFinals.US + rsOfferVASPrinting.writeObject());
    m_mainFormManager.addInput("META.CONTAINSSERIALIZEDDATA", "1");

    m_mainFormManager.submit();
}

    /*******************************************************************************
     * END OFFER METHODS
     *******************************************************************************/
     
var ProtocolFinals = new Object();

ProtocolFinals.DSC_INDICATOR                                     = "DSC_INDICATOR";
ProtocolFinals.DSCP_INDICATOR                                    = "DSCP_INDICATOR";
ProtocolFinals.DSCPA_INDICATOR                                   = "DSCPA_INDICATOR";

/***************************************************************************
 * API METHOD FINALS
 **************************************************************************/

// article manager
ProtocolFinals.DELETE_ARTICLE                      = "deleteArticle";
ProtocolFinals.GET_ARTICLEINFO                     = "getArticleInfo";
ProtocolFinals.GET_ARTICLEPRICEINFO                = "getArticlePriceInfo";
ProtocolFinals.GET_ARTICLEPRICESCUSTOMERGROUP      = "getArticlePricesCustomerGroup";
ProtocolFinals.GET_ARTICLEPRICESCUSTOMER           = "getArticlePricesCustomer";
ProtocolFinals.GET_ARTICLEDESCRIPTIONS             = "getArticleDescriptions";
ProtocolFinals.GET_PRODUCTARTICLES                 = "getProductArticles";
ProtocolFinals.INSERT_ARTICLE                      = "insertArticle";
ProtocolFinals.SAVE_ARTICLE                        = "saveArticle";
ProtocolFinals.SAVE_ARTICLEATTRIBUTES              = "saveArticleAttributes";
ProtocolFinals.SAVE_DISTRIBUTORARTICLES            = "saveDistributorArticles";

ProtocolFinals.SAVE_DISTRIBUTORCATEGORIZATION      = "saveDistributorCategorization";
ProtocolFinals.SAVE_DISTRIBUTORCATEGORIZATIONLINK  = "saveDistributorCategorizationLink";
ProtocolFinals.SAVE_DISTRIBUTORCATEGORIZATIONCOPY  = "saveDistributorCategorizationCopy";

// category manager
//  ProtocolFinals.GET_CATEGORYDESCRIPTIONS            = "getCategoryDescriptions";
//  ProtocolFinals.GET_CATEGORYPRODUCTIMAGES           = "getCategoryProductImages";
ProtocolFinals.GET_CATEGORYPRODUCTSTRUCTURE        = "getCategoryProductStructure";
ProtocolFinals.GET_DISTRIBUTORCATEGORIES           = "getDistributorCategories";
ProtocolFinals.GET_SHOPINSHOPCATEGORIES            = "getShopInShopCategories";
ProtocolFinals.GET_DISTRIBUTORPRODUCTCATEGORIES    = "getDistributorProductCategories";
ProtocolFinals.GET_PRODUCTCATEGORIES               = "getProductCategories";
ProtocolFinals.GET_PPMCATEGORYCHILDS               = "getProductCategoryChilds";
ProtocolFinals.GET_PMPRODUCTCATEGORIES             = "getPMProductCategories";
ProtocolFinals.GET_PRODUCTCATEGORYSTRUCTURE        = "getProductCategoryStructure";
ProtocolFinals.GET_PRODUCTPRODUCTCATEGORIES        = "getProductProductCategories";
ProtocolFinals.SAVE_PRODUCTCATEGORIES              = "saveProductCategories";
ProtocolFinals.SAVE_PRODUCTLAYOUT                  = "saveProductLayout";
ProtocolFinals.SAVE_SHOPCATEGORIES                 = "saveShopCategories";
ProtocolFinals.SAVE_SHOPSIZES                      = "saveShopSizes";

ProtocolFinals.SEARCH_PRODUCTGROUPS                = "searchProductGroups";
ProtocolFinals.GET_PRODUCTGROUP                    = "getProductGroup";
ProtocolFinals.SAVE_PRODUCTGROUP                   = "saveProductGroup";

// colors
ProtocolFinals.SEARCH_COLORS                       = "searchColors";
ProtocolFinals.GET_COLOR                           = "getColor";
ProtocolFinals.SAVE_COLOR                          = "saveColor";
ProtocolFinals.DELETE_COLOR                        = "deleteColor";

// customer manager
ProtocolFinals.DELETE_CUSTOMER                     = "deleteCustomer";
ProtocolFinals.DELETE_CUSTOMERADDRESSES            = "deleteCustomerAddresses";
ProtocolFinals.GET_CUSTOMER                        = "getCustomer";
ProtocolFinals.GET_CUSTOMERINFO                    = "getCustomerInfo";
ProtocolFinals.GET_CUSTOMERUSER                    = "getCustomerUser";
ProtocolFinals.GET_CUSTOMERS                       = "getCustomers";
ProtocolFinals.GET_CUSTOMERGROUPS                  = "getCustomerGroups";

ProtocolFinals.GET_CUSTOMERLIST                    = "getCustomerList";
ProtocolFinals.GET_CUSTOMERADDRESSES               = "getCustomerAddresses";

ProtocolFinals.GET_CUSTOMERSTATUSSES               = "getCustomerStatusses";
ProtocolFinals.GET_CUSTOMERUSERS                   = "getCustomerUsers";
ProtocolFinals.INSERT_CUSTOMERUSER                 = "insertCustomerUser";
ProtocolFinals.INSERT_CUSTOMER                     = "insertCustomer";
ProtocolFinals.SAVE_CUSTOMER                       = "saveCustomer";
ProtocolFinals.SAVE_CUSTOMERUSERS                  = "saveCustomerUsers";


ProtocolFinals.SAVE_CUSTOMERADDRESSES              = "saveCustomerAddresses";
ProtocolFinals.SEARCH_CUSTOMER                     = "searchCustomer";
ProtocolFinals.SEARCH_CUSTOMERS                    = "searchCustomers";
//ProtocolFinals.UPDATE_CUSTOMER                   = "updateCustomer";

// login manager
ProtocolFinals.CHANGE_PASSWORD                     = "changePassword";
ProtocolFinals.DO_LOGINDISTRIBUTOR                 = "doLoginDistributor";
ProtocolFinals.DO_SINGLELOGINDISTRIBUTOR           = "doSingleLoginDistributor";
ProtocolFinals.DO_LOGINPMMANAGER                   = "doLoginManager";
ProtocolFinals.DO_PASSWORDREMINDERDISTRIBUTOR      = "doPasswordReminderDistributor";
ProtocolFinals.DO_PASSWORDREMINDERMANAGER          = "doPasswordReminderManager";
ProtocolFinals.DO_PASSWORDUPDATEMANAGER            = "doPasswordUpdateManager";
ProtocolFinals.DO_PASSWORDUPDATEDISTRIBUTOR        = "doPasswordUpdateDistributor";

// certificate manager (=single login manager)
ProtocolFinals.DO_CERTIFICATEREQUEST               = "doCertificateRequest";
ProtocolFinals.GET_CERTIFICATEFILE                 = "getCertificateFile";
ProtocolFinals.DELETE_CERTIFICATE                  = "deleteCertificate";
ProtocolFinals.HANDLE_CERTIFICATEREQUEST           = "handleCertificateRequest";
ProtocolFinals.SEND_CERTIFICATEFILE                = "sendCertificateFile";
ProtocolFinals.CERTIFICATEREQUEST                  = "CERTIFICATEREQUEST";
ProtocolFinals.CERTIFICATEREQUESTFILE              = "CERTIFICATEREQUESTFILE";
ProtocolFinals.CERTIFICATEFILE                     = "CERTIFICATEFILE";
ProtocolFinals.CERTIFICATE                         = "CERTIFICATE";

ProtocolFinals.SL_USERNAMEPLUSTIMESTAMP_KEY        = "C"; // credentials
ProtocolFinals.SL_ACCOUNT_KEY                      = "A";

ProtocolFinals.SL_USERNAME_KEY                     = "U";
ProtocolFinals.SL_TIMESTAMP_KEY                    = "T";
ProtocolFinals.SL_KEY_VALUESEPARATOR               = ":";
ProtocolFinals.SL_VALUES_SEPARATOR                 = ",";

// distributor manager
ProtocolFinals.ACCEPT_AGREEMENT                    = "acceptAgreement";
ProtocolFinals.REJECT_AGREEMENT                    = "rejectAgreement";
ProtocolFinals.IS_TERMSOFDELIVERYAGREEMENTNEEDED   = "isTermsOfDeliveryAgreementNeeded";
ProtocolFinals.ACCEPT_TERMSOFDELIVERY              = "acceptTermsOfDelivery";
ProtocolFinals.REJECT_TERMSOFDELIVERY              = "rejectTermsOfDelivery";
ProtocolFinals.GET_DISTRIBUTOR                     = "getDistributor";
ProtocolFinals.GET_DISTRIBUTORPARAMETERS           = "getDistributorParameters";
//    ProtocolFinals.GET_DISTRIBUTORMENU                 = "getDistributorMenu";
//ProtocolFinals.GET_DISTRIBUTORUSER               = "getDistributorUser";
ProtocolFinals.INSERT_DISTRIBUTOR                  = "insertDistributor";
ProtocolFinals.INSERT_DISTRIBUTORUSER              = "insertDistributorUser";
ProtocolFinals.GET_DISTRIBUTORUSERS                = "getDistributorUsers";
ProtocolFinals.GET_DISTRIBUTORUSERSQUICKEDIT       = "getDistributorUsersQuickEdit";
ProtocolFinals.GET_DISTRIBUTORUSER                 = "getDistributorUser";
ProtocolFinals.SAVE_DISTRIBUTORUSERS               = "saveDistributorUsers";
ProtocolFinals.GET_DISTRIBUTORADDRESSES            = "getDistributorAddresses";
ProtocolFinals.SAVE_DISTRIBUTORADDRESSES           = "saveDistributorAddresses";
ProtocolFinals.GET_DISTRIBUTORLANGUAGES            = "getDistributorLanguages";
ProtocolFinals.GET_DISTRIBUTORPRICEAREAS           = "getDistributorPriceAreas";
ProtocolFinals.GET_DISTRIBUTORCURRENCIES           = "getDistributorCurrencies";
ProtocolFinals.GET_CONTRACTTYPES                   = "getContractTypes";
ProtocolFinals.GET_DISTRIBUTORS                    = "getDistributors";
ProtocolFinals.GET_DISTRIBUTORSTATUSSES            = "getDistributorStatusses";
ProtocolFinals.GET_DISTRIBUTORSUPPLIERS            = "getDistributorSuppliers";
ProtocolFinals.GET_DISTRIBUTOROWNSUPPLIERS         = "getDistributorOwnSuppliers";
ProtocolFinals.GET_DISTRIBUTORDISTRIBUTORSUPPLIERS = "getDistributorDistributorSuppliers";
ProtocolFinals.SAVE_DISTRIBUTOR                    = "saveDistributor";
ProtocolFinals.DELETE_DISTRIBUTOR                  = "deleteDistributor";
//ProtocolFinals.SAVE_DISTRIBUTORUSER              = "saveDistributorUser";
ProtocolFinals.SEARCH_DISTRIBUTORS                  = "searchDistributors";
ProtocolFinals.SAVE_DISTRIBUTORSUPPLIER            = "saveDistributorSupplier";

// order manager
ProtocolFinals.ACCEPT_PURCHASEORDERPROPOSAL        = "acceptPurchaseOrderProposal";
ProtocolFinals.CANCEL_PURCHASEORDER                = "cancelPurchaseOrder";
ProtocolFinals.CANCEL_PURCHASEORDERPROPOSAL        = "cancelPurchaseOrderProposal";
ProtocolFinals.CANCEL_SALESORDER                   = "cancelSalesOrder";
ProtocolFinals.COMPLETE_PURCHASEORDER              = "completePurchaseOrder";
ProtocolFinals.COMPLETE_SALESORDER                 = "completeSalesOrder";
ProtocolFinals.DOINPROGRESS_SALESORDER             = "doInProgressSalesOrder";
ProtocolFinals.CONTACT_CUSTOMER                    = "contactCustomer";
ProtocolFinals.CREATE_PURCHASEORDERPROPOSALS       = "createPurchaseOrderProposals";
ProtocolFinals.GET_PURCHASEORDERS                  = "getPurchaseOrders";
ProtocolFinals.GET_PURCHASEORDERSTATUSES           = "getPurchaseOrderStatuses";
ProtocolFinals.GET_PURCHASEORDERDETAILS            = "getPurchaseOrderDetails";
ProtocolFinals.GET_SALESORDERS                     = "getSalesOrders";
ProtocolFinals.GET_SALESORDERSTATUSES              = "getSalesOrderStatuses";
ProtocolFinals.GET_SALESORDERDETAILS               = "getSalesOrderDetails";
ProtocolFinals.GET_VASPRINTING                     = "getVASPrinting";
ProtocolFinals.REFUSE_SALESORDER                   = "refuseSalesOrder";
ProtocolFinals.SAVE_SALESORDER                     = "saveSalesOrder";
ProtocolFinals.SAVE_PURCHASEORDER                  = "savePurchaseOrder";
ProtocolFinals.SHIP_PURCHASEORDER                  = "shipPurchaseOrder";
ProtocolFinals.GET_SALESORDERLINEATTRIBUTES        = "getSalesOrderLineAttributes";
ProtocolFinals.GET_PURCHASEORDERLINEATTRIBUTES     = "getPurchaseOrderLineAttributes";
ProtocolFinals.CALCULATELEADTIMEFORARTICLE         = "calculateLeadTimeForArticle";
ProtocolFinals.PURCHASEORDER_ORDERID               = "PURCHASEORDER_ORDERID";
ProtocolFinals.QUOTATION_ORDERID                   = "QUOTATION_ORDERID";
ProtocolFinals.SALESORDER_ORDERID                  = "SALESORDER_ORDERID";

// product manager
ProtocolFinals.GET_PRODUCTSSHORT                   = "getProductsShort";
ProtocolFinals.GET_PRODUCTSSUPPLIERS               = "getProductsSuppliers";
ProtocolFinals.GET_DISTRIBUTORPRODUCTS             = "getDistributorProducts";
ProtocolFinals.GET_PRODUCTINFO                     = "getProductInfo";

ProtocolFinals.GET_PRODUCTPURCHASEPRICEINFO        = "getProductPurchasePriceInfo";

ProtocolFinals.GET_PRODUCTS                        = "getProducts";
ProtocolFinals.GET_GENERALBRANDS                   = "getGeneralBrands";
ProtocolFinals.GET_DISTRIBUTORBRANDS               = "getDistributorBrands";
ProtocolFinals.GET_SUPPLIER                        = "getSupplier";
ProtocolFinals.GET_SUPPLIERSALESOFFICES            = "getSupplierSalesOffices";
ProtocolFinals.GET_SUPPLIERS                       = "getSuppliers";
ProtocolFinals.GET_POSSIBLEDISTRIBUTORSUPPLIERS    = "getPossibleDistributorSuppliers";
ProtocolFinals.GET_SUPPLIERARTICLES                = "getSupplierArticles";
ProtocolFinals.GET_SUPPLIERPRODUCTS                = "getSupplierProducts";
ProtocolFinals.SAVE_DISTRIBUTORPARAMETER           = "saveDistributorParameter";
ProtocolFinals.SAVE_SHOPPARAMETER                  = "saveShopParameter";
ProtocolFinals.SAVE_DISTRIBUTORPRICEAREAS          = "saveDistributorPriceAreas";
ProtocolFinals.SAVE_DISTRIBUTORPRODUCTGENERAL      = "saveDistributorProductGeneral";
ProtocolFinals.SAVE_DISTRIBUTORPRODUCTS            = "saveDistributorProducts";
//  ProtocolFinals.SAVE_PRODUCT                        = "saveProduct";
ProtocolFinals.SAVE_PRODUCTGENERAL                 = "saveProductGeneral";
ProtocolFinals.INSERT_PRODUCT                      = "insertProduct";
ProtocolFinals.DELETE_PRODUCT                      = "deleteProduct";
ProtocolFinals.DELETE_PRODUCTGROUP                 = "deleteProductGroup";

ProtocolFinals.SEARCH_PMVASES                      = "searchPMVASes";
ProtocolFinals.GET_PRODUCTVAS                      = "getProductVAS";
ProtocolFinals.SAVE_PRODUCTVAS                     = "saveProductVAS";
ProtocolFinals.DELETE_PRODUCTVAS                   = "deleteProductVAS";
ProtocolFinals.SAVE_PRODUCTVASRELATED              = "saveProductVASRelated";

// price manager
ProtocolFinals.GET_PRICEAREAS                      = "getPriceAreas";
ProtocolFinals.SAVE_CUSTOMERARTICLEPRICES          = "saveCustomerArticlePrices";
ProtocolFinals.SAVE_CUSTOMERGROUPARTICLEPRICES     = "saveCustomerGroupArticlePrices";
ProtocolFinals.SAVE_DISTRIBUTORARTICLEPRICES       = "saveDistributorArticlePrices";
ProtocolFinals.SAVE_SUPPLIERSALESPRICES            = "saveSupplierSalesPrices";
ProtocolFinals.COUNT_PRICECALCULATIONARTICLES      = "countPriceCalculationArticles";
ProtocolFinals.GET_PRICECALCULATIONSOURCEPRICES    = "getPriceCalculationSourcePrices";
ProtocolFinals.SAVE_PRICECALCULATIONTARGETPRICES   = "savePriceCalculationTargetPrices";
ProtocolFinals.CALCULATE_NEWARTICLEPRICES          = "calculateNewArticlePrices";
ProtocolFinals.ARTICLESCOUNT                       = "ARTICLESCOUNT";

// DISTRIBUTOR VAS manager
ProtocolFinals.GET_PMVASES                         = "getPMVASes";
ProtocolFinals.GET_PPMDIMENSIONS                   = "getPPMDimensions";
ProtocolFinals.GET_RELATIONTYPES                   = "getRelationTypes";
ProtocolFinals.GET_POSSIBLEVASESFORPRODUCT         = "getPossibleVASesForProduct";

/** no longer via DIS_PRODUCT */
//  ProtocolFinals.GET_PMVASESDISTRIBUTORSUPPORTS      = "getPMVASesDistributorSupports";

//  ProtocolFinals.GET_DISTRIBUTOROWNEDVASES           = "getDistributorOwnedVASes";

//    ProtocolFinals.GET_DISTRIBUTORVASDETAILS           = "getDistributorVASDetails";
//    ProtocolFinals.SAVE_DISTRIBUTORVASDETAILS          = "saveDistributorVASDetails";
//    ProtocolFinals.SAVE_DISTRIBUTORVASES               = "saveDistributorVASes";
//    ProtocolFinals.INSERT_DISTRIBUTORVAS               = "insertDistributorVAS";
//    ProtocolFinals.DELETE_DISTRIBUTORVAS               = "deleteDistributorVAS";


// quotation manager
ProtocolFinals.ACTIVATE_CUSTOMER                   = "activateCustomer";
ProtocolFinals.DELETE_QUOTATION                    = "deleteQuotation";
ProtocolFinals.GET_QUOTATIONS                      = "getQuotations";
ProtocolFinals.FORWARD_QUOTATION                   = "forwardQuotation";
ProtocolFinals.PROCESS_QUOTATION                   = "processQuotation";
ProtocolFinals.REJECT_QUOTATION                    = "rejectQuotation";

// report
ProtocolFinals.GET_REPORT                          = "getReport";
ProtocolFinals.GENERATE_REPORT                     = "generateReport";

ProtocolFinals.GET_REPORTS                         = "getReports";
ProtocolFinals.GET_REPORTDATA                      = "getReportData";

// shop

ProtocolFinals.CREATE_NEWSHOPVERSION               = "createNewShopVersion";
ProtocolFinals.GET_DISTRIBUTORSHOPSCOUNT           = "getDistributorShopsCount";
ProtocolFinals.COPY_SHOP                           = "copyShop";
ProtocolFinals.DELETE_SHOP                         = "deleteShop";
ProtocolFinals.GET_SHOP                            = "getShop";
ProtocolFinals.GET_SHOPLAYOUTID                    = "getShopLayoutID";
ProtocolFinals.GET_SHOPS                           = "getShops";
ProtocolFinals.GET_SHOPLAYOUT                      = "getShopLayout";
ProtocolFinals.GET_SHOPLAYOUTPARAMETERS            = "getShopLayoutParameters";
ProtocolFinals.GET_SHOPPARAMETERS                  = "getShopParameters";

ProtocolFinals.EDIT_SUPPORTEDCATEGORIZATIONCATEGORIES = "editSupportedCategorizationCategories";
ProtocolFinals.EDIT_SHOPCATEGORYARTICLE               = "editShopCategoryArticle";
ProtocolFinals.GET_SUPPORTEDCATEGORIZATIONCATEGORIES  = "getSupportedCategorizationCategories";
ProtocolFinals.GET_SUPPORTEDCATEGORYPRODUCTARTICLES   = "getSupportedCategoryProductArticles";
ProtocolFinals.SAVE_SUPPORTEDCATEGORYPRODUCTARTICLES  = "saveSupportedCategoryProductArticles";
ProtocolFinals.SAVE_SUPPORTEDCATEGORIZATIONCATEGORIES = "saveSupportedCategorizationCategories";
ProtocolFinals.PRODUCTSARTICLES                       = "PRODUCTSARTICLES";

ProtocolFinals.INSERT_SHOP                         = "insertShop";
ProtocolFinals.SAVE_SHOPLAYOUT                     = "saveShopLayout";
ProtocolFinals.SAVE_SHOPOPTIONS                    = "saveShopOptions";
ProtocolFinals.SAVE_SHOPBUTTONS                    = "saveShopButtons";
ProtocolFinals.SAVE_SHOPTEXTS                      = "saveShopTexts";

ProtocolFinals.DELETE_WEBPAGE                      = "deleteWebPage";


// StockManager
ProtocolFinals.CHECK_PURCHASEORDERSTOCK            = "checkPurchaseOrderStock";
ProtocolFinals.CHECK_SALESORDERSTOCK               = "checkSalesOrderStock";
ProtocolFinals.GET_DISTRIBUTORSTOCKS               = "getDistributorStocks";
ProtocolFinals.SAVE_DISTRIBUTORSTOCKS              = "saveDistributorStocks";

// SupplierManager
ProtocolFinals.SAVE_SUPPLIER                       = "saveSupplier";
ProtocolFinals.GET_SUPPLIERPARAMETERS              = "getSupplierParameters";
ProtocolFinals.GET_SUPPLIERSALESOFFICEPARAMETERML  = "getSupplierSalesOfficeParameterML";
ProtocolFinals.SAVE_SUPPLIERPARAMETERS             = "saveSupplierParameters";
ProtocolFinals.SAVE_SUPPLIERSALESOFFICES           = "saveSupplierSalesOffices";
ProtocolFinals.INSERT_SUPPLIER                     = "insertSupplier";
ProtocolFinals.SEARCH_SUPPLIERS                    = "searchSuppliers";
ProtocolFinals.DELETE_SUPPLIER                     = "deleteSupplier";

// SystemManager
ProtocolFinals.GET_PMUSER                          = "getPMUser";
ProtocolFinals.GET_PMUSERS                         = "getPMUsers";
ProtocolFinals.SEARCH_PMUSERS                      = "searchPMUsers";
ProtocolFinals.DELETE_PMUSER                       = "deletePMUser";
ProtocolFinals.INSERT_PMUSER                       = "insertPMUser";
ProtocolFinals.SAVE_PMUSERS                        = "savePMUsers";
ProtocolFinals.SAVE_PMUSER                         = "savePMUser";

ProtocolFinals.GET_TEXTANDTITLEPARAMETERS          = "getTextAndTitleParameters";
ProtocolFinals.GET_TEXTPARAMETERS                  = "getTextParameters";
ProtocolFinals.SAVE_PMPARAMETERS                   = "savePMParameters";

// UserManager
ProtocolFinals.SAVE_CUSTOMERUSERSQUICK          = "saveCustomerUsersQuick";
ProtocolFinals.SAVE_DISTRIBUTORUSERSQUICKEDIT   = "saveDistributorUsersQuickEdit";

//OnlinePrintingManager
ProtocolFinals.DELETE_ONLINEPRINTINGLOGO        = "deleteOnlinePrintingLogo";
ProtocolFinals.GET_ONLINEPRINTINGAVAILABLELOGOS = "getOnlinePrintingLogos";
ProtocolFinals.GET_ONLINEPRINTINGZONES          = "getOnlinePrintingZones";

ProtocolFinals.GET_SUPPORTEDVASES               = "getSupportedVASes";

ProtocolFinals.GET_ZONESETS                     = "getZoneSets";
ProtocolFinals.SAVE_PRINTINGS                   = "savePrintings";

// MCI functionality -> TEMPORARILY parked in SystemManager (??)
ProtocolFinals.GET_CHANNELS                     = "getChannels";
ProtocolFinals.GET_CHANNELTYPES                 = "getChannelTypes";
ProtocolFinals.GET_EDITABLEINDICATORS           = "getEditableIndicators";
ProtocolFinals.GET_MESSAGESTATUSES              = "getMessageStatuses";
ProtocolFinals.GET_MESSAGEUSERSTATUSES          = "getMessageUserStatuses";

ProtocolFinals.CHANNELID                        = "CHANNELID";
ProtocolFinals.CHANNELS                         = "CHANNELS";
ProtocolFinals.CHANNELTYPEID                    = "CHANNELTYPEID";
ProtocolFinals.CHANNELTYPES                     = "CHANNELTYPES";
ProtocolFinals.EDITABLEINDICATORS               = "EDITABLEINDICATORS";
ProtocolFinals.MESSAGESTATUSES                  = "MESSAGESTATUSES";
ProtocolFinals.MESSAGEUSERSTATUSES              = "MESSAGEUSERSTATUSES";

/***************************************************************************
 * API METHOD KEYS
 **************************************************************************/

// method keys
ProtocolFinals.ACCOUNT                          = "ACCOUNT";
ProtocolFinals.ACCOUNTMANAGER                   = "ACCOUNTMANAGER";
ProtocolFinals.ACTION                           = "ACTION";
ProtocolFinals.ADDITIONALADDRESSINFO            = "ADDITIONALADDRESSINFO";
ProtocolFinals.ADDRESS                          = "ADDRESS";
ProtocolFinals.ADDRESS1                         = "ADDRESS1";
ProtocolFinals.ADDRESS2                         = "ADDRESS2";
ProtocolFinals.ADDRESS3                         = "ADDRESS3";
ProtocolFinals.ADDRESS4                         = "ADDRESS4";
ProtocolFinals.ADDRESSEEID                      = "ADDRESSEEID";
ProtocolFinals.ADDRESSID                        = "ADDRESSID";
ProtocolFinals.ADDRESSTYPE                      = "ADDRESSTYPE";
ProtocolFinals.ADVICEPRICE                      = "ADVICEPRICE";
ProtocolFinals.ALTTEXT                          = "ALTTEXT";
ProtocolFinals.ALTERNATIVEDELIVERYDATE          = "ALTERNATIVEDELIVERYDATE";
ProtocolFinals.AMOUNT                           = "AMOUNT";
ProtocolFinals.ANSWER                           = "ANSWER";
ProtocolFinals.ARTICLEDESCRIPTION               = "ARTICLEDESCRIPTION";
ProtocolFinals.ARTICLEDESCRIPTIONS              = "ARTICLEDESCRIPTIONS";
ProtocolFinals.ARTICLEID                        = "ARTICLEID";
ProtocolFinals.ARTICLENAME                      = "ARTICLENAME";
ProtocolFinals.ARTICLENUMBER                    = "ARTICLENUMBER";
ProtocolFinals.ATMOSPHEREIMAGE                  = "ATMOSPHEREIMAGE";
ProtocolFinals.ATTRIBUTEID                      = "ATTRIBUTEID";
ProtocolFinals.ATTRIBUTESEQUENCE                = "ATTRIBUTESEQUENCE";
ProtocolFinals.AUTHORIZATION                    = "AUTHORIZATION";
ProtocolFinals.AVAILABLEQUANTITY                = "AVAILABLEQUANTITY";
ProtocolFinals.BASEDISTRIBUTORID                = "BASEDISTRIBUTORID";
ProtocolFinals.BASESHOPID                       = "BASESHOPID";
ProtocolFinals.BASEVERSIONID                    = "BASEVERSIONID";
ProtocolFinals.BRANCHECODE                      = "BRANCHECODE";
ProtocolFinals.BRANDCODE                        = "BRANDCODE";
ProtocolFinals.BRANDID                          = "BRANDID";
ProtocolFinals.BRANDNAME                        = "BRANDNAME";
ProtocolFinals.CALCULATIONMETHOD                = "CALCULATIONMETHOD";
ProtocolFinals.CATALOGPAGES                     = "CATALOGPAGES";
ProtocolFinals.CATEGORY                         = "CATEGORY";
ProtocolFinals.CATEGORIZATION                   = "CATEGORIZATION";
ProtocolFinals.CATEGORIZATIONTREE               = "CATEGORIZATIONTREE";
ProtocolFinals.CATEGORYID                       = "CATEGORYID";
ProtocolFinals.CATEGORYNAME                     = "CATEGORYNAME";
ProtocolFinals.CHILDCATEGORYID                  = "CHILDCATEGORYID";
ProtocolFinals.CITY                             = "CITY";
ProtocolFinals.CLASSIFICATIONCODE               = "CLASSIFICATIONCODE";
ProtocolFinals.CODEN3                           = "CODEN3";
ProtocolFinals.COLORCODE                        = "COLORCODE";
ProtocolFinals.COLORNAME                        = "COLORNAME";
ProtocolFinals.COLORORDER                       = "COLORORDER";
ProtocolFinals.COLUMN                           = "COLUMN";
ProtocolFinals.COMPLAINT                        = "COMPLAINT";
ProtocolFinals.COMPLAINTID                      = "COMPLAINTID";
ProtocolFinals.COMPLEXITY                       = "COMPLEXITY";
ProtocolFinals.COMPONENTID                      = "COMPONENTID";
ProtocolFinals.CONTACTDATE                      = "CONTACTDATE";
ProtocolFinals.CONTACTID                        = "CONTACTID";
ProtocolFinals.CONTACTPERSON                    = "CONTACTPERSON";
ProtocolFinals.CONTENTID                        = "CONTENTID";
ProtocolFinals.CONTEXTKEY                       = "CONTEXTKEY";
ProtocolFinals.CONTENTLANGUAGECODES             = "CONTENTLANGUAGECODES";
ProtocolFinals.CONTRACTDESCRIPTION              = "CONTRACTDESCRIPTION";
ProtocolFinals.CONTRACTTYPE                     = "CONTRACTTYPE";
ProtocolFinals.CONTROLFIELDID                   = "CONTROLFIELDID";
ProtocolFinals.CONTROLFIELDTYPEID               = "CONTROLFIELDTYPEID";
ProtocolFinals.CONTROLOBJECTID                  = "CONTROLOBJECTID";
ProtocolFinals.COUNT                            = "COUNT";
ProtocolFinals.COUNTRY                          = "COUNTRY";
ProtocolFinals.COUNTRYCODE                      = "COUNTRYCODE";
ProtocolFinals.COUNTRYNAME                      = "COUNTRYNAME";
ProtocolFinals.CURRENCYCODE                     = "CURRENCYCODE";
ProtocolFinals.CURRENCYCODE_SELFDEFINED         = "001";
ProtocolFinals.CURRENCYSIGN                     = "CURRENCYSIGN";
ProtocolFinals.CUSTOMER                         = "CUSTOMER";
ProtocolFinals.CUSTOMERCUSTOMERGROUPS           = "CUSTOMERCUSTOMERGROUPS";
ProtocolFinals.CUSTOMERGROUP                    = "CUSTOMERGROUP";
ProtocolFinals.CUSTOMERARTICLEPRICES            = "CUSTOMERARTICLEPRICES";
ProtocolFinals.CUSTOMERGROUPARTICLEPRICES       = "CUSTOMERGROUPARTICLEPRICES";
ProtocolFinals.CUSTOMERPRODUCTPRICES            = "CUSTOMERPRODUCTPRICES";
ProtocolFinals.CUSTOMERID                       = "CUSTOMERID";
ProtocolFinals.CUSTOMERGROUPID                  = "CUSTOMERGROUPID";
ProtocolFinals.CUSTOMERGROUPNAME                = "CUSTOMERGROUPNAME";
ProtocolFinals.CUSTOMERNAME                     = "CUSTOMERNAME";
ProtocolFinals.CUSTOMERREMARKS                  = "CUSTOMERREMARKS";
ProtocolFinals.CUSTOMERUSER                     = "CUSTOMERUSER";
ProtocolFinals.CUSTOMISABLE                     = "CUSTOMISABLE";
ProtocolFinals.DATATYPE                         = "DATATYPE";
ProtocolFinals.DECIMALS                         = "DECIMALS";
ProtocolFinals.DEFAULTDELIVERYTERM              = "DEFAULTDELIVERYTERM";
ProtocolFinals.DEFAULTLANGUAGECODE              = "DEFAULTLANGUAGECODE";
ProtocolFinals.DEFAULTPACKAGINGMETHOD           = "DEFAULTPACKAGINGMETHOD";
ProtocolFinals.DEFAULTPRICEAREAID               = "DEFAULTPRICEAREAID";
ProtocolFinals.DELETESTRATEGY                   = "DELETESTRATEGY";
ProtocolFinals.DELIVERYCODE                     = "DELIVERYCODE";
ProtocolFinals.DELIVERYCOSTS                    = "DELIVERYCOSTS";
ProtocolFinals.DELIVERYDATE                     = "DELIVERYDATE";
ProtocolFinals.DELIVERYDATEFEASABLE             = "DELIVERYDATEFEASABLE";
ProtocolFinals.DEPARTMENT                       = "DEPARTMENT";
ProtocolFinals.DEPARTMENTCODE                   = "DEPARTMENTCODE";
ProtocolFinals.DESCRIPTION                      = "DESCRIPTION";
ProtocolFinals.DESIGNTYPE                       = "DESIGNTYPE";
ProtocolFinals.DIMENSIONID                      = "DIMENSIONID";
ProtocolFinals.DIMENSIONS                       = "DIMENSIONS";
ProtocolFinals.DISCOUNT                         = "DISCOUNT";
ProtocolFinals.DISCOUNTPERCENTAGE               = "DISCOUNTPERCENTAGE";
ProtocolFinals.DISTRIBUTORARTICLENUMBER         = "DISTRIBUTORARTICLENUMBER";
ProtocolFinals.DISTRIBUTORARTICLEPRICES         = "DISTRIBUTORARTICLEPRICES";
ProtocolFinals.DISTRIBUTORCUSTOMERID            = "DISTRIBUTORCUSTOMERID";
ProtocolFinals.DISTRIBUTORDELIVERYADDRESS       = "DISTRIBUTORDELIVERYADDRESS";
ProtocolFinals.DISTRIBUTORID                    = "DISTRIBUTORID";
ProtocolFinals.DISTRIBUTORIDSAVED               = "DISTRIBUTORIDSAVED";
ProtocolFinals.DISTRIBUTORMAINADDRESS           = "DISTRIBUTORMAINADDRESSES";
ProtocolFinals.DISTRIBUTORNAME                  = "DISTRIBUTORNAME";
ProtocolFinals.DISTRIBUTORPFCSUPPLIER           = "DISTRIBUTORPFCSUPPLIER";
ProtocolFinals.DISTRIBUTORPRODUCTNUMBER         = "DISTRIBUTORPRODUCTNUMBER";
ProtocolFinals.DISTRIBUTORREMARKS               = "DISTRIBUTORREMARKS";
ProtocolFinals.DISTRIBUTORSUPPLIER              = "DISTRIBUTORSUPPLIER";
ProtocolFinals.DOMAINID                         = "DOMAINID";
ProtocolFinals.DOMAINVALUEID                    = "DOMAINVALUEID";
ProtocolFinals.EDITABLEINDICATOR                = "EDITABLEINDICATOR";
ProtocolFinals.EMAILTYPEINDICATOR               = "EMAILTYPEINDICATOR";
ProtocolFinals.ENDDATE                          = "ENDDATE";
ProtocolFinals.ENDDATE_PRESENTATION             = "ENDDATE_PRESENTATION";
ProtocolFinals.EUROINDICATOR                    = "EUROINDICATOR";
ProtocolFinals.EVENTID                          = "EVENTID";
ProtocolFinals.EVENTSOURCE                      = "EVENTSOURCE";
ProtocolFinals.EVENTTYPE                        = "EVENTTYPE";
ProtocolFinals.EXCLUDES                         = "EXCLUDES";
ProtocolFinals.EXCHANGERATE                     = "EXCHANGERATE";
ProtocolFinals.EXTERNALID                       = "EXTERNALID";
ProtocolFinals.EXTERNALURL                      = "EXTERNALURL";
ProtocolFinals.EXTRANETACCOUNTNUMBER            = "EXTRANETACCOUNTNUMBER";
ProtocolFinals.FACTOR                           = "FACTOR";
ProtocolFinals.FAXNUMBER                        = "FAXNUMBER";
ProtocolFinals.FEATURESEQUENCE                  = "FEATURESEQUENCE";
ProtocolFinals.FIELDID                          = "FIELDID";
ProtocolFinals.FIELDNAME                        = "FIELDNAME";
ProtocolFinals.FILENAME                         = "FILENAME";
ProtocolFinals.FILESIZE                         = "FILESIZE";
ProtocolFinals.FILETYPE                         = "FILETYPE";
ProtocolFinals.FINANCIALSTATUS                  = "FINANCIALSTATUS";
ProtocolFinals.FIRSTNAME                        = "FIRSTNAME";
ProtocolFinals.FORMFIELDS                       = "FORMFIELDS";
ProtocolFinals.FORMVALUES                       = "FORMVALUES";
ProtocolFinals.FUNCTION                         = "FUNCTION";
ProtocolFinals.FUNCTIONID                       = "FUNCTIONID";
ProtocolFinals.FUTURESTOCK                      = "FUTURESTOCK";
ProtocolFinals.GENDER                           = "GENDER";
ProtocolFinals.GENERALEMAIL                     = "GENERALEMAIL";
ProtocolFinals.GENERALLEADTIME                  = "GENERALLEADTIME";
ProtocolFinals.GETATTRIBUTESINDICATOR           = "GETATTRIBUTESINDICATOR";
ProtocolFinals.GETPRICEINDICATOR                = "GETPRICEINDICATOR";
ProtocolFinals.GROSSAMOUNT                      = "GROSSAMOUNT";
ProtocolFinals.GROUPNAME                        = "GROUPNAME";
ProtocolFinals.GROUPSEQUENCE                    = "GROUPSEQUENCE";
ProtocolFinals.GUARANTEEDDELIVERABLEQTY         = "GUARANTEEDDELIVERABLEQTY";
ProtocolFinals.HASHCODE                         = "HASHCODE";
ProtocolFinals.HKENTERPRISECODE                 = "HKENTERPRISECODE";
ProtocolFinals.HOMEPAGEURL                      = "HOMEPAGEURL";
ProtocolFinals.HOUSENUMBER                      = "HOUSENUMBER";
ProtocolFinals.IMAGE                            = "IMAGE";
ProtocolFinals.IMAGECONTENTID                   = "IMAGECONTENTID";
ProtocolFinals.INCLUDES                         = "INCLUDES";
ProtocolFinals.INCLUDESALSO                     = "INCLUDESALSO";
ProtocolFinals.INDICATOR                        = "INDICATOR";
ProtocolFinals.INDICATORCODE                    = "INDICATORCODE";
ProtocolFinals.INFO                             = "INFO";
ProtocolFinals.INPUTFIELDSIZE                   = "INPUTFIELDSIZE";
ProtocolFinals.ISINUSE                          = "ISINUSE";
ProtocolFinals.ITEMID                           = "ITEMID";
ProtocolFinals.ITEMTEXT                         = "ITEMTEXT";
ProtocolFinals.LABELALIGN                       = "LABELALIGN";
ProtocolFinals.LABELCOLSPAN                     = "LABELCOLSPAN";
ProtocolFinals.LABELCOLUMNNUMBER                = "LABELCOLUMNNUMBER";
ProtocolFinals.LABELROWNUMBER                   = "LABELROWNUMBER";
ProtocolFinals.LABELROWSPAN                     = "LABELROWSPAN";
ProtocolFinals.LABELSTYLE                       = "LABELSTYLE";
ProtocolFinals.LABELTEXT                        = "LABELTEXT";
ProtocolFinals.LABELVALIGN                      = "LABELVALIGN";
ProtocolFinals.LABELVISIBILITY                  = "LABELVISIBILITY";
ProtocolFinals.LANGUAGECODE                     = "LANGUAGECODE";
ProtocolFinals.LANGUAGEDESCRIPTIONCODE          = "LANGUAGEDESCRIPTIONCODE";
ProtocolFinals.LANGUAGEFLAG                     = "LANGUAGEFLAG";
ProtocolFinals.LANGUAGENAME                     = "LANGUAGENAME";
ProtocolFinals.LASTNAME                         = "LASTNAME";
ProtocolFinals.LAYOUT                           = "LAYOUT";
ProtocolFinals.LAYOUTID                         = "LAYOUTID";
ProtocolFinals.LAYOUTTYPE                       = "LAYOUTTYPE";
ProtocolFinals.LEADTIME                         = "LEADTIME";
ProtocolFinals.LEVELDEPTH                       = "LEVELDEPTH";
ProtocolFinals.LEVELID                          = "LEVELID";
ProtocolFinals.LINEAMOUNT                       = "LINEAMOUNT";
ProtocolFinals.LINENUMBER                       = "LINENUMBER";
ProtocolFinals.LOCATIONID                       = "LOCATIONID";
ProtocolFinals.LOGINPASSWORDREMINDER            = "LOGINPASSWORDREMINDER";
ProtocolFinals.LOGINPASSWORDUPDATE              = "LOGINPASSWORDUPDATE";
ProtocolFinals.LONGDESCRIPTION                  = "LONGDESCRIPTION";
ProtocolFinals.MAILINGINDICATOR                 = "MAILINGINDICATOR";
ProtocolFinals.MANDATORY                        = "MANDATORY";
ProtocolFinals.MANDATORYINDICATOR               = "MANDATORYINDICATOR";
ProtocolFinals.MAXDATALENGTH                    = "MAXDATALENGTH";
ProtocolFinals.MAXDATAPRECISION                 = "MAXDATAPRECISION";
ProtocolFinals.MAXNUMBEROFCOLOURS               = "MAXNUMBEROFCOLOURS";
ProtocolFinals.MAXNUMBERSHOPINSHOPS             = "MAXNUMBERSHOPINSHOPS";
ProtocolFinals.MAXORDERAMOUNT                   = "MAXORDERAMOUNT";
ProtocolFinals.MENUID                           = "MENUID";
ProtocolFinals.MENUITEMS                        = "MENUITEMS";
ProtocolFinals.MENUITEMSML                      = "MENUITEMSML";
ProtocolFinals.MENULEVEL                        = "MENULEVEL";
ProtocolFinals.MESSAGE                          = "MESSAGE";
ProtocolFinals.MESSAGEID                        = "MESSAGEID";
ProtocolFinals.MIMETYPE                         = "MIMETYPE";
ProtocolFinals.MINDATALENGTH                    = "MINDATALENGTH";
ProtocolFinals.MINIMUMQUANTITY                  = "MINIMUMQUANTITY";
ProtocolFinals.MINORDERAMOUNT                   = "MINORDERAMOUNT";
ProtocolFinals.MINQUOTATIONAMOUNT               = "MINQUOTATIONAMOUNT";
ProtocolFinals.MOBILEPHONENUMBER                = "MOBILEPHONENUMBER";
ProtocolFinals.MODELCODE                        = "MODELCODE";
ProtocolFinals.MODULEID                         = "MODULEID";
ProtocolFinals.MUTCODE                          = "MUTCODE";
ProtocolFinals.NAME                             = "NAME";
ProtocolFinals.NAVIGATIONMETHOD                 = "NAVIGATIONMETHOD";
ProtocolFinals.NETAMOUNT                        = "NETAMOUNT";
ProtocolFinals.NEWQUESTIONID                    = "NEWQUESTIONID";
ProtocolFinals.NEXTPANELID                      = "NEXTPANELID";
ProtocolFinals.NOK                              = "NOK";
ProtocolFinals.NUMBEROFEMPLOYEES                = "NUMBEROFEMPLOYEES";
ProtocolFinals.NUMBEROFPOSITIONS                = "NUMBEROFPOSITIONS";
ProtocolFinals.OBJECT                           = "OBJECT";
ProtocolFinals.OBJECTID                         = "OBJECTID";
ProtocolFinals.OBJECTS                          = "OBJECTS";
ProtocolFinals.OBJECTSML                        = "OBJECTSML";
ProtocolFinals.OK                               = "OK";
ProtocolFinals.OLDPASSWORD                      = "OLDPASSWORD";
ProtocolFinals.ONLINEPRINTABLE                  = "ONLINEPRINTABLE";
ProtocolFinals.ONLINEPRINTINGAVAILABLELOGOS     = "ONLINEPRINTINGAVAILABLELOGOS";
ProtocolFinals.ONLINEPRINTINGCONFIGZONES        = "ONLINEPRINTINGCONFIGZONES";
ProtocolFinals.OPTIONINDICATOR                  = "OPTIONINDICATOR";
ProtocolFinals.ORDERCOSTS                       = "ORDERCOSTS";
ProtocolFinals.ORDERDATE                        = "ORDERDATE";
ProtocolFinals.ORDERDATEFROM                    = "ORDERDATEFROM";
ProtocolFinals.ORDERDATETO                      = "ORDERDATETO";
ProtocolFinals.ORDERID                          = "ORDERID";
ProtocolFinals.ORDERSTATUS                      = "ORDERSTATUS";
ProtocolFinals.ORDERTYPE                        = "ORDERTYPE";
ProtocolFinals.OWNCATALOG                       = "OWNCATALOG";
ProtocolFinals.PACKAGEQUANTITY                  = "PACKAGEQUANTITY";
ProtocolFinals.PACKAGINGCODE                    = "PACKAGINGCODE";
ProtocolFinals.PACKAGINGMETHODCODE              = "PACKAGINGMETHODCODE";
ProtocolFinals.PACKINGQTY                       = "PACKINGQTY";
ProtocolFinals.PANELID                          = "PANELID";
ProtocolFinals.PANELTYPEID                      = "PANELTYPEID";
ProtocolFinals.PARAMETERCONTROLOBJECTID         = "PARAMETERCONTROLOBJECTID";
ProtocolFinals.PARAMETERID                      = "PARAMETERID";
ProtocolFinals.PARAMETERNAME                    = "PARAMETERNAME";
ProtocolFinals.PARAMETERS                       = "PARAMETERS";
ProtocolFinals.PARAMETERTEXT                    = "PARAMETERTEXT";
ProtocolFinals.PARAMETERTEXTML                  = "PARAMETERTEXTML";
ProtocolFinals.PARAMETERTITLE                   = "PARAMETERTITLE";
ProtocolFinals.PARAMETERTITLEML                 = "PARAMETERTITLEML";
ProtocolFinals.PARAMS                           = "PARAMS";
ProtocolFinals.PARENTBRANCHECODE                = "PARENTBRANCHECODE";
ProtocolFinals.PARENTCATEGORYID                 = "PARENTCATEGORYID";
ProtocolFinals.PARENTDESCRIPTION                = "PARENTDESCRIPTION";
ProtocolFinals.PARENTID                         = "PARENTID";
ProtocolFinals.PARENTMENUID                     = "PARENTMENUID";
ProtocolFinals.PARENTSUBJECTID                  = "PARENTSUBJECTID";
ProtocolFinals.PARENTPANELID                    = "PARENTPANELID";
ProtocolFinals.PARENTVALUE                      = "PARENTVALUE";
ProtocolFinals.PASSWORD                         = "PASSWORD";
ProtocolFinals.PASSWORDCONFIRMATION             = "PASSWORDCONFIRMATION";
ProtocolFinals.PASSWORDREMINDERTITLE                 = "PASSWORDREMINDERTITLE";
ProtocolFinals.PASSWORDUPDATETITLE                   = "PASSWORDUPDATETITLE";
ProtocolFinals.PASSWORDUPDATEINSTRUCTIONTOOLSSTEP1   = "PASSWORDUPDATEINSTRUCTIONTOOLSSTEP1";
ProtocolFinals.PASSWORDUPDATEINSTRUCTIONTOOLSSTEP2   = "PASSWORDUPDATEINSTRUCTIONTOOLSSTEP2";
ProtocolFinals.PASSWORDREMINDERINSTRUCTIONTOOLSSTEP1 = "PASSWORDREMINDERINSTRUCTIONTOOLSSTEP1";
ProtocolFinals.PASSWORDREMINDERINSTRUCTIONTOOLSSTEP2 = "PASSWORDREMINDERINSTRUCTIONTOOLSSTEP2";
ProtocolFinals.PASSWORDREMINDER                      = "PASSWORDREMINDER";
ProtocolFinals.PASSWORDREMINDEREMAILFORMANAGER       = "PASSWORDREMINDEREMAILFORMANAGER";
ProtocolFinals.PASSWORDREMINDEREMAILFORDISTRIBUTOR   = "PASSWORDREMINDEREMAILFORDISTRIBUTOR";
ProtocolFinals.PASSWORDREMINDEREMAILFORCUSTOMER      = "PASSWORDREMINDEREMAILFORCUSTOMER";
ProtocolFinals.PASSWORDREMINDERANSWER                = "PASSWORDREMINDERANSWER";
ProtocolFinals.PHONENUMBER                            = "PHONENUMBER";
ProtocolFinals.PORT                                   = "PORT";
ProtocolFinals.POSITION                               = "POSITION";
ProtocolFinals.POSSIBLEVASES                          = "POSSIBLEVASES";
ProtocolFinals.POSSIBLEVASES2                         = "POSSIBLEVASES2";
ProtocolFinals.PREFIXLASTNAME                   = "PREFIXLASTNAME";
ProtocolFinals.PRESENCEINDICATOR                = "PRESENCEINDICATOR";
ProtocolFinals.PRICE                            = "PRICE";
ProtocolFinals.PRICEAREAID                      = "PRICEAREAID";
ProtocolFinals.PRICEAREAID_SELFDEFINED          = "0";
ProtocolFinals.PRICEDIMENSION                   = "PRICEDIMENSION";
ProtocolFinals.PRICEEND                         = "PRICEEND";
ProtocolFinals.PRICEPER                         = "PRICEPER";
ProtocolFinals.PRICERANGE                       = "PRICERANGE";
ProtocolFinals.PRICESTART                       = "PRICESTART";
ProtocolFinals.PROCESSSEQUENCE                  = "PROCESSSEQUENCE";
ProtocolFinals.PROCESSSTATUS                    = "PROCESSSTATUS";
ProtocolFinals.PRODUCTCATEGORYCODE              = "PRODUCTCATEGORYCODE";
ProtocolFinals.PRODUCTGROUPCODE                 = "PRODUCTGROUPCODE";
ProtocolFinals.PRODUCTGROUPID                   = "PRODUCTGROUPID";
ProtocolFinals.PRODUCTID                        = "PRODUCTID";
ProtocolFinals.PRODUCTMODELCODE                 = "PRODUCTMODELCODE";
ProtocolFinals.PRODUCTTYPE                      = "PRODUCTTYPE";
ProtocolFinals.PROMOTIONBEGIN                   = "PROMOTIONBEGIN";
ProtocolFinals.PROMOTIONEND                     = "PROMOTIONEND";
ProtocolFinals.PROMOTIONID                      = "PROMOTIONID";
ProtocolFinals.PROPERTYID                       = "PROPERTYID";
ProtocolFinals.PROTOCOLID                       = "PROTOCOLID";
ProtocolFinals.PUBLISHDATE                      = "PUBLISHDATE";
ProtocolFinals.PURCHASEORDERIDS                 = "PURCHASEORDERIDS";
ProtocolFinals.QTYFROM                          = "QTYFROM";
ProtocolFinals.QUANTITY                         = "QUANTITY";
ProtocolFinals.QUESTION                         = "QUESTION";
ProtocolFinals.QUESTIONER                       = "QUESTIONER";
ProtocolFinals.QUESTIONEREMAIL                  = "QUESTIONEREMAIL";
ProtocolFinals.QUOTEVALIDITY                    = "QUOTEVALIDITY";
ProtocolFinals.RANGE                            = "RANGE";
ProtocolFinals.RANK                             = "RANK";
ProtocolFinals.RATEUNITS                        = "RATEUNITS";
ProtocolFinals.REFERENCE                        = "REFERENCE";
ProtocolFinals.REFERSTOLINENUMBER               = "REFERSTOLINENUMBER";
ProtocolFinals.REFERSTOPRODUCTID                = "REFERSTOPRODUCTID";
ProtocolFinals.REFERSTOARTICLEID                = "REFERSTOARTICLEID";
ProtocolFinals.RELATEDARTICLEID                 = "RELATEDARTICLEID";
ProtocolFinals.RELATEDCATEGORYID                = "RELATEDCATEGORYID";
ProtocolFinals.RELATEDITEMID                    = "RELATEDITEMID";
ProtocolFinals.RELATEDALLPRODUCTS               = "RELATEDALLPRODUCTS";
ProtocolFinals.RELATEDPRODUCTS                  = "RELATEDPRODUCTS";
ProtocolFinals.RELATEDPRODUCTID                 = "RELATEDPRODUCTID";
ProtocolFinals.RELATIONTYPES                    = "RELATIONTYPES";
ProtocolFinals.RELATIONTYPEID                   = "RELATIONTYPEID";
ProtocolFinals.REMARKS                          = "REMARKS";
ProtocolFinals.REPORTCONTROLOBJECTID            = "REPORTCONTROLOBJECTID";
ProtocolFinals.REPORTID                         = "REPORTID";
ProtocolFinals.REQUESTUSERID                    = "REQUESTUSERID";
ProtocolFinals.RESULT_CODE                      = "RESULT_CODE";
ProtocolFinals.RESULTCOUNTCOMMUNICATION         = "RESULTCOUNTCOMMUNICATION";
ProtocolFinals.ROLEID                           = "ROLEID";
ProtocolFinals.ROLETYPE                         = "ROLETYPE";
ProtocolFinals.ROOTCATEGORYID                   = "ROOTCATEGORYID";
ProtocolFinals.ROOTID                           = "ROOTID";
ProtocolFinals.ROUNDMETHOD                      = "ROUNDMETHOD";
ProtocolFinals.RUNDATE                          = "RUNDATE";
ProtocolFinals.RW                               = "RW";
ProtocolFinals.SALESOFFICE                      = "SALESOFFICE";
ProtocolFinals.SALESOFFICECODE                  = "SALESOFFICECODE";
ProtocolFinals.SALESOFFICENAME                  = "SALESOFFICENAME";
ProtocolFinals.SALESORDERID                     = "SALESORDERID";
ProtocolFinals.SALESORDERDATE                   = "SALESORDERDATE";
ProtocolFinals.SAMPLECONDITIONS                 = "SAMPLECONDITIONS";
ProtocolFinals.SAMPLEINDICATOR                  = "SAMPLEINDICATOR";
ProtocolFinals.SCRAMBLEDINDICATOR               = "SCRAMBLEDINDICATOR";
ProtocolFinals.SELECTED                         = "SELECTED";
ProtocolFinals.SEQUENCE                         = "SEQUENCE";
ProtocolFinals.SEQUENCENUMBER                   = "SEQUENCENUMBER";
ProtocolFinals.SHOPID                           = "SHOPID";
ProtocolFinals.SHOPTYPE                         = "SHOPTYPE";
ProtocolFinals.SHORTDESCRIPTION                 = "SHORTDESCRIPTION";
ProtocolFinals.SIZEBYTES                        = "SIZEBYTES";
ProtocolFinals.SIZECODE                         = "SIZECODE";
ProtocolFinals.SIZEGROUPCODE                    = "SIZEGROUPCODE";
ProtocolFinals.SOURCEOBJECT                     = "SOURCEOBJECT";
ProtocolFinals.SOURCEPRICE                      = "SOURCEPRICE";
ProtocolFinals.SPECIFICATIONCODE                = "SPECIFICATIONCODE";
ProtocolFinals.STANDARDLANGUAGECODE             = "STANDARDLANGUAGECODE";
ProtocolFinals.STARTDATE                        = "STARTDATE";
ProtocolFinals.STARTDATE_PRESENTATION           = "STARTDATE_PRESENTATION";
ProtocolFinals.STATUS                           = "STATUS";
ProtocolFinals.STATUSDATE                       = "STATUSDATE";
ProtocolFinals.STATUSDESCRIPTION                = "STATUSDESCRIPTION";
ProtocolFinals.STATUSID                         = "STATUSID";
ProtocolFinals.STATUSIDS                        = "STATUSIDS";
ProtocolFinals.STATUSTYPE                       = "STATUSTYPE";
ProtocolFinals.STOCK                            = "STOCK";
ProtocolFinals.STOCKRESULT                      = "STOCKRESULT";
ProtocolFinals.STREET                           = "STREET";
ProtocolFinals.SUBITEMSINDICATOR                = "SUBITEMSINDICATOR";
ProtocolFinals.SUBJECT                          = "SUBJECT";
ProtocolFinals.SUBJECTID                        = "SUBJECTID";
ProtocolFinals.SUPPLIERARTICLENUMBER            = "SUPPLIERARTICLENUMBER";
ProtocolFinals.SUPPLIERARTICLES                 = "SUPPLIERARTICLES";
ProtocolFinals.SUPPLIERID                       = "SUPPLIERID";
ProtocolFinals.SUPPLIERNAME                     = "SUPPLIERNAME";
ProtocolFinals.SUPPLIERORDERCODE                = "SUPPLIERORDERCODE";
ProtocolFinals.SUPPLIERPRODUCTNUMBER            = "SUPPLIERPRODUCTNUMBER";
ProtocolFinals.SUPPLIERTYPE                     = "SUPPLIERTYPE";
ProtocolFinals.SUPPLIERTYPEDESCRIPTION          = "SUPPLIERTYPEDESCRIPTION";
ProtocolFinals.SUPPORTEDVASES                   = "SUPPORTEDVASES";
ProtocolFinals.TARGETFIELDNAME                  = "TARGETFIELDNAME";
ProtocolFinals.TARGETID                         = "TARGETID";
ProtocolFinals.TARGETNAME                       = "TARGETNAME";
ProtocolFinals.TARGETINDICATOR                  = "TARGETINDICATOR";
ProtocolFinals.TARGETOBJECT                     = "TARGETOBJECT";
ProtocolFinals.TARGETPRICEAREAID                = "TARGETPRICEAREAID";
ProtocolFinals.TARGETTYPEID                     = "TARGETTYPEID";
ProtocolFinals.TEXT                             = "TEXT";
ProtocolFinals.TEXTAREACOLSSIZE                 = "TEXTAREACOLSSIZE";
ProtocolFinals.TEXTAREAROWSSIZE                 = "TEXTAREAROWSSIZE";
ProtocolFinals.THE_FILE                         = "THE_FILE";
ProtocolFinals.THE_FILE_THUMBNAIL               = "THE_FILE_THUMBNAIL";
ProtocolFinals.TRANSPORTCODE                    = "TRANSPORTCODE";
ProtocolFinals.TREELEVEL                        = "TREELEVEL";
ProtocolFinals.TYPEID                           = "TYPEID";
ProtocolFinals.URL                              = "URL";
ProtocolFinals.URLHOST                          = "URLHOST";
ProtocolFinals.URLOBJECT                        = "URLOBJECT";
ProtocolFinals.URLPORT                          = "URLPORT";
ProtocolFinals.URLPROTOCOL                      = "URLPROTOCOL";
ProtocolFinals.USAGECODE                        = "USAGECODE";
ProtocolFinals.USERID                           = "USERID";
ProtocolFinals.USERLANGUAGECODE                 = "USERLANGUAGECODE";
ProtocolFinals.USERNAME                         = "USERNAME";
ProtocolFinals.USERROLES                        = "USERROLES";
ProtocolFinals.VALUE                            = "VALUE";
ProtocolFinals.VALUEALIGN                       = "VALUEALIGN";
ProtocolFinals.VALUECLOB                        = "VALUECLOB";
ProtocolFinals.VALUECOLSPAN                     = "VALUECOLSPAN";
ProtocolFinals.VALUECOLUMNNUMBER                = "VALUECOLUMNNUMBER";
ProtocolFinals.VALUEDATE                        = "VALUEDATE";
ProtocolFinals.VALUEEXTERNAL                    = "VALUEEXTERNAL";
ProtocolFinals.VALUEEXTERNALID                  = "VALUEEXTERNALID";
ProtocolFinals.VALUEID                          = "VALUEID";
ProtocolFinals.VALUENUMBER                      = "VALUENUMBER";
ProtocolFinals.VALUEROWNUMBER                   = "VALUEROWNUMBER";
ProtocolFinals.VALUEROWSPAN                     = "VALUEROWSPAN";
ProtocolFinals.VALUESTYLE                       = "VALUESTYLE";
ProtocolFinals.VALUETEXT                        = "VALUETEXT";
ProtocolFinals.VALUEVALIGN                      = "VALUEVALIGN";
ProtocolFinals.VASARTICLES                      = "VASARTICLES";
ProtocolFinals.VASPRINTING                      = "VASPRINTING";
ProtocolFinals.VASSUPPLIERS                     = "VASSUPPLIERS";
ProtocolFinals.VATNUMBER                        = "VATNUMBER";
ProtocolFinals.VERSIONID                        = "VERSIONID";
ProtocolFinals.VISUALTYPE                       = "VISUALTYPE";
ProtocolFinals.ZIP                              = "ZIP";
ProtocolFinals.ZIPCODE                          = "ZIPCODE";
ProtocolFinals.ZONEID                           = "ZONEID";
ProtocolFinals.ZONESETID                        = "ZONESETID";
ProtocolFinals.ZONESETS                         = "ZONESETS";


/** @deprecated */
ProtocolFinals.PREFERREDSUPPLIER                = "PREFERREDSUPPLIER";
ProtocolFinals.PREFERREDSUPPLIERNAME            = "PREFERREDSUPPLIERNAME";

// BUDGETS
ProtocolFinals.BUDGETCURRENCYCODE               = "BUDGETCURRENCYCODE";
ProtocolFinals.TOTALBUDGET                      = "TOTALBUDGET";
ProtocolFinals.USEDBUDGET                       = "USEDBUDGET";
ProtocolFinals.USERUSEDBUDGET                   = "USERUSEDBUDGET";

// GET_SHOPS
ProtocolFinals.SHOPSCUSTOMER                    = "SHOPSCUSTOMER";
ProtocolFinals.SHOPSPUBLIC                      = "SHOPSPUBLIC";
ProtocolFinals.SHOPS                            = "DISTRIBUTORSHOPS";
ProtocolFinals.SHOP                             = "SHOP";

// GET_SHOPLAYOUT
ProtocolFinals.SHOPLAYOUT                       = "SHOPLAYOUT";
ProtocolFinals.SHOPFUNCTION                     = "SHOPFUNCTION";
ProtocolFinals.SHOPMENU                         = "SHOPMENU";
ProtocolFinals.SHOPMENUML                       = "SHOPMENUML";
ProtocolFinals.SHOPMODULES                      = "SHOPMODULES";
ProtocolFinals.SHOPPARAMETERS                   = "SHOPPARAMETERS";
ProtocolFinals.SHOPPARAMETERSML                 = "SHOPPARAMETERSML";

// GET_DISTRIBUTOR_EXTERNALS
ProtocolFinals.LIMITTOOWNERINDICATOR            = "LIMITTOOWNERINDICATOR";
ProtocolFinals.EXTERNALTYPE                     = "EXTERNALTYPE";

// SHOPTYPES
ProtocolFinals.SHOPTYPE_PUBLICPRIVATE           = "1";
ProtocolFinals.SHOPTYPE_CUSTOMER                = "2";
ProtocolFinals.SHOPTYPE_CUSTOMERGROUP           = "3";

// SHOPLAYOUTS
ProtocolFinals.SHOPLAYOUT_DOUBLETOPLEFT         = "DOUBLETOPLEFT";
ProtocolFinals.SHOPLAYOUT_TOPLEFT               = "TOPLEFT";
ProtocolFinals.SHOPLAYOUT_DOUBLETOP             = "DOUBLETOP";
ProtocolFinals.SHOPLAYOUT_TOPBOTTOM             = "TOPBOTTOM";

// SHOPLAYOUT PARAMETERS
ProtocolFinals.ATMOSPHEREIMAGEGENERAL          = "ATMOSPHEREIMAGEGENERAL";
ProtocolFinals.ATMOSPHERETEXTGENERAL           = "ATMOSPHERETEXTGENERAL";
ProtocolFinals.BACKGROUNDCOLOR                 = "BACKGROUNDCOLOR";

ProtocolFinals.BACKGROUNDIMAGE                 = "BACKGROUNDIMAGE";
ProtocolFinals._BGI_ZINDEX                     = "ZINDEX"; // BACKGROUNDIMAGE SUFFIXES to handle 4 background parameters ...
ProtocolFinals._BGI_HALIGN                     = "HALIGN";
ProtocolFinals._BGI_VALIGN                     = "VALIGN";
ProtocolFinals._BGI_PLACEMENT                  = "PLACEMENT";
ProtocolFinals._BGI_MARK                       = "MARK";

ProtocolFinals.BROWSECATEGORIES                = "BROWSECATEGORIES";
ProtocolFinals.BUTTONIMAGE                     = "BUTTONIMAGE";
ProtocolFinals._BI_HOVER                       = "HOVER";  // BUTTONIMAGE SUFFIX to handle 4 background parameters BUTTONIMAGE#HOVER
ProtocolFinals.BUTTONHEIGHT                    = "BUTTONHEIGHT";
ProtocolFinals.BUTTONWIDTH                     = "BUTTONWIDTH";
ProtocolFinals.BUTTONSPACING                   = "BUTTONSPACING";

ProtocolFinals.BUTTONCATALOGREQUEST                    = "BUTTONCATALOGREQUEST";
ProtocolFinals.BUTTONCHECKOUT                          = "BUTTONCHECKOUT";
ProtocolFinals.BUTTONINFOMESUBSCRIPTION                = "BUTTONINFOMESUBSCRIPTION";
ProtocolFinals.BUTTONLOGIN                             = "BUTTONLOGIN";
ProtocolFinals.BUTTONNEWSLETTERSUBSCRIPTION            = "BUTTONNEWSLETTERSUBSCRIPTION";
ProtocolFinals.BUTTONPRODUCTDETAILS                    = "BUTTONPRODUCTDETAILS";
ProtocolFinals.BUTTONPRODUCTSELECTOR                   = "BUTTONPRODUCTSELECTOR";
ProtocolFinals.BUTTONSHOPPINGBASKET                    = "BUTTONSHOPPINGBASKET";
ProtocolFinals.BUTTONIMAGEADDCART                      = "BUTTONIMAGEADDCART";
ProtocolFinals.BUTTONIMAGEGENERAL                      = "BUTTONIMAGEGENERAL";
ProtocolFinals.BUTTONIMAGEREQUESTSAMPLE                = "BUTTONIMAGEREQUESTSAMPLE";
ProtocolFinals.BUTTONTEASERREQUEST                     = "BUTTONTEASERREQUEST";
ProtocolFinals.BUTTONVAS                               = "BUTTONVAS";
ProtocolFinals.FIELDLINKS                              = "FIELDLINKS";
ProtocolFinals.FREEWEBPAGE1                            = "FREEWEBPAGE1";
ProtocolFinals.FREEWEBPAGE2                            = "FREEWEBPAGE2";
ProtocolFinals.FREEWEBPAGE3                            = "FREEWEBPAGE3";
ProtocolFinals.GROUPOVERVIEWNUMBEROFCOLS               = "GROUPOVERVIEWNUMBEROFCOLS";
ProtocolFinals.GROUPOVERVIEWNUMBEROFROWS               = "GROUPOVERVIEWNUMBEROFROWS";

ProtocolFinals.HOMEPAGEINDICATOR                       = "HOMEPAGEINDICATOR";
ProtocolFinals.HOMEPAGE                                = "HOMEPAGE";
ProtocolFinals.LOCALE                                  = "LOCALE";
ProtocolFinals.LOGINMAINFOOTERIMAGE                    = "LOGINMAINFOOTERIMAGE";
ProtocolFinals.LOGINMAINFOOTERTEXT                     = "LOGINMAINFOOTERTEXT";
ProtocolFinals.LOGINMAININSTRUCTION                    = "LOGINMAININSTRUCTION";
ProtocolFinals.LOGINMAINTITLE                          = "LOGINMAINTITLE";
ProtocolFinals.LOGINPAGE                               = "LOGINPAGE";
ProtocolFinals.LOGO                                    = "LOGO";
ProtocolFinals.LOGOHEIGHT                              = "LOGOHEIGHT";
ProtocolFinals.LOGOPOSITION                            = "LOGOPOSITION";
ProtocolFinals.LOGOWIDTH                               = "LOGOWIDTH";
ProtocolFinals.MAXGROUPOVERVIEWNUMBEROFCOLS            = "MAXGROUPOVERVIEWNUMBEROFCOLS";
ProtocolFinals.MAXGROUPOVERVIEWNUMBEROFROWS            = "MAXGROUPOVERVIEWNUMBEROFROWS";
ProtocolFinals.MAXPRODUCTOVERVIEWNUMBEROFCOLS          = "MAXPRODUCTOVERVIEWNUMBEROFCOLS";
ProtocolFinals.MAXPRODUCTOVERVIEWNUMBEROFROWS          = "MAXPRODUCTOVERVIEWNUMBEROFROWS";
ProtocolFinals.OPMUPLOADINDICATOR                      = "OPMUPLOADINDICATOR";
ProtocolFinals.PRODUCTOVERVIEWNUMBEROFCOLS             = "PRODUCTOVERVIEWNUMBEROFCOLS";
ProtocolFinals.PRODUCTOVERVIEWNUMBEROFROWS             = "PRODUCTOVERVIEWNUMBEROFROWS";

ProtocolFinals.MAXNUMBEROFGROUPSHORIZONTAL             = "MAXNUMBEROFGROUPSHORIZONTAL";
ProtocolFinals.MAXNUMBEROFCATEGORIESHORIZONTAL         = "MAXNUMBEROFCATEGORIESHORIZONTAL";
ProtocolFinals.MAXNUMBEROFMENUBUTTONSHORIZONTAL        = "MAXNUMBEROFMENUBUTTONSHORIZONTAL";

ProtocolFinals.SHOPSELECTORTYPE                        = "SHOPSELECTORTYPE";
ProtocolFinals.SELECTORTYPE_CONTROLFIELDTYPEID         = "280";
ProtocolFinals.SHOWVASINDICATOR                        = "SHOWVASINDICATOR";
ProtocolFinals.STYLESHEET                              = "STYLESHEET";
ProtocolFinals.MAINSHOPCOLOR                           = "MAINSHOPCOLOR";

ProtocolFinals.SHOPSTOCKTYPEINDICATOR                   = "SHOPSTOCKTYPEINDICATOR";
ProtocolFinals.STOCKTYPEINDICATOR_CONTROLFIELDTYPEID    = "290";
ProtocolFinals.SHOPSHOWSTOCKINDICATOR                   = "SHOPSHOWSTOCKINDICATOR";
ProtocolFinals.SHOWSTOCKINDICATOR_CONTROLFIELDTYPEID    = "300";
ProtocolFinals.SHOPMAXSTOCKFORINDICATION                = "SHOPMAXSTOCKFORINDICATION";

ProtocolFinals.SHOPDISPLAYCOLUMNPRICEINDICATOR          = "SHOPDISPLAYCOLUMNPRICEINDICATOR";
ProtocolFinals.SHOPDISPLAYPRICEINDICATOR                = "SHOPDISPLAYPRICEINDICATOR";

ProtocolFinals.CATEGORYSTRUCTURE1                       = "CATEGORYSTRUCTURE1";
ProtocolFinals.CATEGORYSTRUCTURE2                       = "CATEGORYSTRUCTURE2";
ProtocolFinals.CATEGORYSTRUCTURE2_CONTROLFIELDTYPEID    = "310";

ProtocolFinals.SHOPPRODUCTINDEXMINIMALLIMIT             = "SHOPPRODUCTINDEXMINIMALLIMIT";
ProtocolFinals.SHOPPRODUCTORDER                         = "SHOPPRODUCTORDER";

ProtocolFinals.SHOPNEWPRODUCTPERIOD                     = "SHOPNEWPRODUCTPERIOD";
ProtocolFinals.SHOPNEWPRODUCTSINDICATOR                 = "SHOPNEWPRODUCTSINDICATOR";
ProtocolFinals.SHOPPROMOTIONSINDICATOR                  = "SHOPPROMOTIONSINDICATOR";
ProtocolFinals.SHOPDISPLAYPROMOTIONINDICATOR            = "SHOPDISPLAYPROMOTIONINDICATOR";

ProtocolFinals.SHOPBASKETIMAGEINDICATOR                 = "SHOPBASKETIMAGEINDICATOR";
ProtocolFinals.SHOPBASKETINDICATOR                      = "SHOPBASKETINDICATOR";
ProtocolFinals.SHOPBASKETIMAGE                          = "SHOPBASKETIMAGE";
ProtocolFinals.SHOPOWNCURRENCYINDICATOR                 = "SHOPOWNCURRENCYINDICATOR";

ProtocolFinals.SHOPBASKETPOSITIONINDICATOR              = "SHOPBASKETPOSITIONINDICATOR";

ProtocolFinals.SHOPBUDGETTYPEINDICATOR                  = "SHOPBUDGETTYPEINDICATOR";
ProtocolFinals.SHOPSHOWBUDGETINIDCATOR                  = "SHOPSHOWBUDGETINIDCATOR";
ProtocolFinals.SHOPBUDGET                               = "SHOPBUDGET";
ProtocolFinals.SHOPBUDGETCURRENCYCODE                   = "SHOPBUDGETCURRENCYCODE";
ProtocolFinals.SHOPCURRENCYTEXT                         = "SHOPCURRENCYTEXT";

ProtocolFinals.SHOPCATEGORIZATIONCATEGORYID				= "SHOPCATEGORIZATIONCATEGORYID";

ProtocolFinals.TOOLSLOGINREMEMBERDATAINDICATOR			= "TOOLSLOGINREMEMBERDATAINDICATOR";

ProtocolFinals.THANKYOUTEXT                            = "THANKYOUTEXT";
ProtocolFinals.WELCOMEIMAGE                            = "WELCOMEIMAGE";
ProtocolFinals.WELCOMETEXT                             = "WELCOMETEXT";

// todo: add to database
ProtocolFinals.SEARCHENGINETITLE                       = "SEARCHENGINETITLE";
ProtocolFinals.SEARCHENGINEDESCRIPTION                 = "SEARCHENGINEDESCRIPTION";
ProtocolFinals.SEARCHENGINEKEYWORDS                    = "SEARCHENGINEKEYWORDS";

ProtocolFinals.HELP                                    = "HELP";
ProtocolFinals.HELPTITLE                               = "HELPTITLE";
ProtocolFinals.HELPTEXT                                = "HELPTEXT";
ProtocolFinals.PRIVACYTITLE                            = "PRIVACYTITLE";
ProtocolFinals.PRIVACYTEXT                             = "PRIVACYTEXT";
ProtocolFinals.COMPANYPROFILETITLE                     = "COMPANYPROFILETITLE";
ProtocolFinals.COMPANYPROFILETEXT                      = "COMPANYPROFILETEXT";
ProtocolFinals.CONTACTTITLE                            = "CONTACTTITLE";
ProtocolFinals.CONTACTINSTRUCTION                      = "CONTACTINSTRUCTION";
ProtocolFinals.DISCLAIMER                              = "DISCLAIMER";
ProtocolFinals.DISCLAIMERTITLE                         = "DISCLAIMERTITLE";
ProtocolFinals.DISCLAIMERTEXT                          = "DISCLAIMERTEXT";

// DIS_PARAMETERS
ProtocolFinals.PRIVACYSTATEMENT                        = "PRIVACYSTATEMENT";
ProtocolFinals.PRIVACYSTATEMENTTITLE                   = "PRIVACYSTATEMENTTITLE";
ProtocolFinals.PRIVACYSTATEMENTTEXT                    = "PRIVACYSTATEMENTTEXT";
ProtocolFinals.CODEOFCONDUCT                           = "CODEOFCONDUCT";
ProtocolFinals.CODEOFCONDUCTTITLE                      = "CODEOFCONDUCTTITLE";
ProtocolFinals.CODEOFCONDUCTTEXT                       = "CODEOFCONDUCTTEXT";
ProtocolFinals.VASINFO                                 = "VASINFO";
ProtocolFinals.VASINFOTITLE                            = "VASINFOTITLE";
ProtocolFinals.VASINFOTEXT                             = "VASINFOTEXT";
ProtocolFinals.ADDEXTRALEADTIMEDAYAFTER12AM            = "ADDEXTRALEADTIMEDAYAFTER12AM";

ProtocolFinals.CAPTIONPLATFORM                         = "CAPTIONPLATFORM";

/***********************************************************************
 * CUSTOMER MANAGER
 **********************************************************************/

ProtocolFinals.CONTACTS                                 = "CONTACTS";
ProtocolFinals.ADDRESSES                                = "ADDRESSES";
ProtocolFinals.CUSTOMERS                                = "CUSTOMERS";
ProtocolFinals.CUSTOMERGROUPS                           = "CUSTOMERGROUPS";
ProtocolFinals.CUSTOMERSHOP                             = "CUSTOMERSHOP";
ProtocolFinals.CUSTOMERSHOPCOUNT                        = "CUSTOMERSHOPCOUNT";
ProtocolFinals.SHOPCOUNT                                = "SHOPCOUNT";
//ProtocolFinals.CUSTOMER                               = "CUSTOMER";
ProtocolFinals.CUSTOMERLIST                             = "CUSTOMERLIST";
ProtocolFinals.CUSTOMERSTATUSSES                        = "CUSTOMERSTATUSSES";
ProtocolFinals.CUSTOMERUSERS                            = "CUSTOMERUSERS";
ProtocolFinals.USERS                                    = "USERS";
ProtocolFinals.ROLES                                    = "ROLES";

ProtocolFinals.FINANCIALSTATUS_GREEN                    = "0";
ProtocolFinals.FINANCIALSTATUS_ORANGE                   = "1";
ProtocolFinals.FINANCIALSTATUS_RED                      = "2";


/***********************************************************************
 * DISTRIBUTOR MANAGER
 **********************************************************************/

ProtocolFinals.USER                                     = "USER";
ProtocolFinals.ROLE                                     = "ROLE";
ProtocolFinals.DISTRIBUTOR                              = "DISTRIBUTOR";
ProtocolFinals.DISTRIBUTORLOGO                          = "DISTRIBUTORLOGO";
ProtocolFinals.DISTRIBUTORLOGOID                        = "DISTRIBUTORLOGOID";
ProtocolFinals.DISTRIBUTORS                             = "DISTRIBUTORS";
ProtocolFinals.DISTRIBUTORUSER                          = "DISTRIBUTORUSER";
ProtocolFinals.DISTRIBUTORUSERS                         = "DISTRIBUTORUSERS";
ProtocolFinals.DISTRIBUTORADDRESSES                     = "DISTRIBUTORADDRESSES";
ProtocolFinals.DISTRIBUTORCONTRACT                      = "DISTRIBUTORCONTRACT";
ProtocolFinals.DISTRIBUTORLANGUAGES                     = "DISTRIBUTORLANGUAGES";
ProtocolFinals.DISTRIBUTORPRICEAREAS                    = "DISTRIBUTORPRICEAREAS";
ProtocolFinals.DISTRIBUTORCURRENCIES                    = "DISTRIBUTORCURRENCIES";
ProtocolFinals.DISTRIBUTORSUPPLIERS                     = "DISTRIBUTORSUPPLIERS";
ProtocolFinals.DISTRIBUTORPARAMETERS                    = "DISTRIBUTORPARAMETERS";
ProtocolFinals.DISTRIBUTORPARAMETERSML                  = "DISTRIBUTORPARAMETERSML";
ProtocolFinals.CONTRACTTYPES                            = "CONTRACTTYPES";
ProtocolFinals.DISTRIBUTORSTATUSSES                     = "DISTRIBUTORSTATUSSES";
ProtocolFinals.DISTRIBUTORSTOCKS                        = "DISTRIBUTORSTOCKS"; // IHE 20050316
ProtocolFinals.DISTRIBUTORSTATUS                        = "DISTRIBUTORSTATUS";
ProtocolFinals.ISMAINDISTRIBUTORUSER                    = "ISMAINDISTRIBUTORUSER";

ProtocolFinals.ROLEID_PMMANAGER                         = "1";

ProtocolFinals.ROLEID_MAINDISTRIBUTORUSER               = "2";
ProtocolFinals.ROLEID_REGULARDISTRIBUTORUSER            = "3";
ProtocolFinals.ROLEID_SALESDISTRIBUTORUSER              = "4";
ProtocolFinals.ROLEID_PURCHASEDISTRIBUTORUSER           = "5";

ProtocolFinals.ROLEID_UNIDENTIFIEDCUSTOMERUSER          = "7";
ProtocolFinals.ROLEID_REGULARCUSTOMERUSER               = "8";
ProtocolFinals.ROLEID_MAINCUSTOMERUSER                  = "9";
ProtocolFinals.ROLEID_MAINDISTRIBUTORUSER_AND_MCI       = "12"; // IHE

// DISTRIBUTOR PARAMETERS
ProtocolFinals.PRODUCTOVERVIEWSORTING                   = "PRODUCTOVERVIEWSORTING";

ProtocolFinals.CATEGORYID_VASSES                = "30000";

/***********************************************************************
 * STOCK MANAGER
 **********************************************************************/
ProtocolFinals.STOCKRESULT_NOTDETERMINED       = "0";
ProtocolFinals.STOCKRESULT_OK                  = "1"; // Available
ProtocolFinals.STOCKRESULT_PARTLYAVAILABLE     = "2";
ProtocolFinals.STOCKRESULT_UNAVAILABLE         = "3";

/***********************************************************************
 * ORDER MANAGER
 **********************************************************************/

ProtocolFinals.ORDERTYPE_BASKET                 = "0";
ProtocolFinals.ORDERTYPE_ORDER                  = "1";
ProtocolFinals.ORDERTYPE_QUOTATION              = "2";

ProtocolFinals.STATUSTYPE_ORDER                 = "1";
ProtocolFinals.STATUSTYPE_ORDERLINE             = "2";
ProtocolFinals.STATUSTYPE_BOTH                  = "3";

ProtocolFinals.PURCHASEORDERS                   = "PURCHASEORDERS";
ProtocolFinals.PURCHASEORDERSTATUSES            = "PURCHASEORDERSTATUSES";
ProtocolFinals.QUOTATIONS                       = "QUOTATIONS";
ProtocolFinals.SALESORDERS                      = "SALESORDERS";
ProtocolFinals.SALESORDERSTATUSES               = "SALESORDERSTATUSES";


/***********************************************************************
 * PRODUCT MANAGER
 **********************************************************************/

ProtocolFinals.ALTERNATIVEPRODUCTS                      = "ALTERNATIVEPRODUCTS";
ProtocolFinals.VASPRODUCTS                              = "VASPRODUCTS";
ProtocolFinals.VASPRODUCT                               = "VASPRODUCT";
ProtocolFinals.ARTICLES                                 = "ARTICLES";
ProtocolFinals.ARTICLE                                  = "ARTICLE";
ProtocolFinals.ARTICLEML                                = "ARTICLEML";
ProtocolFinals.ARTICLESATTRIBUTES                       = "ARTICLESATTRIBUTES";
ProtocolFinals.ARTICLEATTRIBUTES                        = "ARTICLEATTRIBUTES";
ProtocolFinals.ARTICLEATTRIBUTESML                      = "ARTICLEATTRIBUTESML";
ProtocolFinals.BRAND                                    = "BRAND";
ProtocolFinals.BRANDS                                   = "BRANDS";
ProtocolFinals.BRANDDESCRIPTION                         = "BRANDDESCRIPTION";
ProtocolFinals.CATEGORYPRODUCTSTRUCTURE                 = "CATEGORYPRODUCTSTRUCTURE";
ProtocolFinals.CATEGORYPRODUCTIMAGES                    = "CATEGORYPRODUCTIMAGES";
ProtocolFinals.CATEGORYDESCRIPTIONS                     = "CATEGORYDESCRIPTIONS";
ProtocolFinals.DISTRIBUTORCATEGORIES                    = "DISTRIBUTORCATEGORIES";
ProtocolFinals.SHOPINSHOPCATEGORIES                     = "SHOPINSHOPCATEGORIES";
ProtocolFinals.DISTRIBUTORCATEGORIESML                  = "DISTRIBUTORCATEGORIESML";
ProtocolFinals.DISTRIBUTORARTICLESML                    = "DISTRIBUTORARTICLESML";
ProtocolFinals.DISTRIBUTORPRODUCTS                      = "DISTRIBUTORPRODUCTS";
ProtocolFinals.SHOPPRODUCTS                             = "SHOPPRODUCTS";
ProtocolFinals.PRODUCTSHOPS                             = "PRODUCTSHOPS";
ProtocolFinals.DISTRIBUTORPRODUCTSML                    = "DISTRIBUTORPRODUCTSML";
ProtocolFinals.PRICEAREAS                               = "PRICEAREAS";
ProtocolFinals.PRODUCT                                  = "PRODUCT";
ProtocolFinals.PRODUCTML                                = "PRODUCTML";
ProtocolFinals.PRODUCTCATEGORYSTRUCTURE                 = "PRODUCTCATEGORYSTRUCTURE";
ProtocolFinals.PRODUCTCATEGORIES                        = "PRODUCTCATEGORIES";
ProtocolFinals.PRODUCTCATEGORIESML                      = "PRODUCTCATEGORIESML";
ProtocolFinals.PRODUCTDESCRIPTION                       = "PRODUCTDESCRIPTION";
ProtocolFinals.PRODUCTIDFROM                            = "PRODUCTIDFROM";
ProtocolFinals.PRODUCTIDTO                              = "PRODUCTIDTO";
ProtocolFinals.OWNPRODUCTSONLY                          = "OWNPRODUCTSONLY";
ProtocolFinals.PRODUCTS                                 = "PRODUCTS";
ProtocolFinals.PRODUCTSADDEDTODISTRIBUTORID             = "PRODUCTSADDEDTODISTRIBUTORID";
ProtocolFinals.PRODUCTSSUPPLIERS                        = "PRODUCTSSUPPLIERS";
ProtocolFinals.SHOPPRODUCTCATEGORIES                    = "SHOPPRODUCTCATEGORIES";
ProtocolFinals.STOCKS                                   = "STOCKS";
ProtocolFinals.SUPPLIERADDRESSES                        = "SUPPLIERADDRESSES";
ProtocolFinals.SUPPLIERMAINADDRESS                      = "SUPPLIERMAINADDRESS";
ProtocolFinals.SUPPLIERPARAMETERS                       = "SUPPLIERPARAMETERS";
ProtocolFinals.SUPPLIERSALESOFFICESPARAMETERS           = "SUPPLIERSALESOFFICESPARAMETERS";
ProtocolFinals.SUPPLIERSALESOFFICESPARAMETERSML         = "SUPPLIERSALESOFFICESPARAMETERSML";
ProtocolFinals.SUPPLIERPARAMETERSML                     = "SUPPLIERPARAMETERSML";
ProtocolFinals.SUPPLIERARTICLEPRICES                    = "SUPPLIERARTICLEPRICES";
ProtocolFinals.PURCHASEPRICESARTICLES                   = "SUPPLIERPURCHASEPRICES";
ProtocolFinals.SUPPLIERPRODUCT                          = "SUPPLIERPRODUCT";
ProtocolFinals.SUPPLIERPRODUCTS                         = "SUPPLIERPRODUCTS";
ProtocolFinals.DUMMYID                                  = "-1";
ProtocolFinals.VASLIST                                  = "VASLIST";

// suppliers
ProtocolFinals.SUPPLIER                                 = "SUPPLIER";
ProtocolFinals.SUPPLIERID_PFCONCEPT                     = "1";

ProtocolFinals.RELATIONTYPE_VAS                         = "1";
ProtocolFinals.RELATIONTYPE_ALTERNATIVEPRODUCT          = "2";

/***********************************************************************
 * CATEGORY MANAGER
 **********************************************************************/
ProtocolFinals.PRODUCTGROUPS                           = "PRODUCTGROUPS";
ProtocolFinals.PRODUCTGROUP                            = "PRODUCTGROUP";
ProtocolFinals.CATEGORIES                              = "CATEGORIES";
//ProtocolFinals.CATEGORIES2                             = "CATEGORIES2";
ProtocolFinals.CATEGORIESML                            = "CATEGORIESML";

/***********************************************************************
 * VAS MANAGER
 **********************************************************************/
ProtocolFinals.CALCULATIONTYPE                         = "CALCULATIONTYPE";
ProtocolFinals.DIMENSIONVALUE                          = "DIMENSIONVALUE";
ProtocolFinals.SHOWTYPE                                = "SHOWTYPE";

/***********************************************************************
 * COLOR MANAGER
 **********************************************************************/

ProtocolFinals.COLOR                                   = "COLOR";
ProtocolFinals.COLORS                                  = "COLORS";
ProtocolFinals.SUBCOLORS                               = "SUBCOLORS";
ProtocolFinals.SUBCOLORSML                             = "SUBCOLORSML";
ProtocolFinals.NUMBEROFCHILDS                          = "NUMBEROFCHILDS";

/***********************************************************************
 * ONLINEPRINTINGMANAGER
 **********************************************************************/
ProtocolFinals.BACKGROUNDIMAGEID                       = "BACKGROUNDIMAGEID";
ProtocolFinals.ZONEDESCRIPTION                         = "ZONEDESCRIPTION";
ProtocolFinals.COMPRESSION                             = "COMPRESSION";
ProtocolFinals.VASPRODUCTID                            = "VASPRODUCTID";
ProtocolFinals.VASARTICLEID                            = "VASARTICLEID";
ProtocolFinals.LOGOID                                  = "LOGOID";
ProtocolFinals.LOGO_XC                                 = "LOGO_XC";
ProtocolFinals.LOGO_YC                                 = "LOGO_YC";
ProtocolFinals.LOGO_WIDTH                              = "LOGO_WIDTH";
ProtocolFinals.LOGO_HEIGHT                             = "LOGO_HEIGHT";
ProtocolFinals.ZONE_XC                                 = "ZONE_XC";
ProtocolFinals.ZONE_YC                                 = "ZONE_YC";
ProtocolFinals.ZONE_WIDTH                              = "ZONE_WIDTH";
ProtocolFinals.ZONE_HEIGHT                             = "ZONE_HEIGHT";
ProtocolFinals.CMYK1                                   = "CMYK1";
ProtocolFinals.CMYK2                                   = "CMYK2";
ProtocolFinals.CMYK3                                   = "CMYK3";
ProtocolFinals.CMYK4                                   = "CMYK4";
ProtocolFinals.PANTON1                                 = "PANTON1";
ProtocolFinals.PANTON2                                 = "PANTON2";
ProtocolFinals.PANTON3                                 = "PANTON3";
ProtocolFinals.PANTON4                                 = "PANTON4";
ProtocolFinals.DISTRIBUTORVASDESCRIPTION               = "DISTRIBUTORVASDESCRIPTION";
ProtocolFinals.ZONES                                   = "ZONES";
ProtocolFinals.ZONERELATIONS                           = "ZONERELATIONS";

/***********************************************************************
 * QUOTATION MANAGER
 **********************************************************************/

ProtocolFinals.ISFINALQUOTATION                       = "ISFINALQUOTATION";


/***********************************************************************
 * REPORT MANAGER
 **********************************************************************/

ProtocolFinals.ONE                                    = "ONE";
ProtocolFinals.REPORTS                                = "REPORTS";
ProtocolFinals.REPORTPARENTID                         = "REPORTPARENTID";
ProtocolFinals.REPORT_ACTION                          = "REPORT_ACTION";
ProtocolFinals.REPORT                                 = "REPORT";
ProtocolFinals.REPORTDATA                             = "REPORTDATA";
ProtocolFinals.REPORTDATATOTAL                        = "REPORTDATATOTAL";
ProtocolFinals.REPORTDATADETAIL                       = "REPORTDATADETAIL";
ProtocolFinals.REPORTPARAMETERS                       = "REPORTPARAMETERS";
ProtocolFinals.REPORTDIMENSIONS                       = "REPORTDIMENSIONS";
ProtocolFinals.DOMAINVALUES                           = "DOMAINVALUES";
ProtocolFinals.PERIOD                                 = "PERIOD";

// report finals
ProtocolFinals.WSTVISITORSREPORT           = "20";
ProtocolFinals.WSTBRANDREPORT              = "30";
ProtocolFinals.WSTPRODUCTGROUPREPORT       = "35";
ProtocolFinals.WSTCATEGORYREPORT           = "40";
ProtocolFinals.WSTPRICERANGEREPORT         = "45";
ProtocolFinals.WSTQUANTITYREPORT           = "55";

ProtocolFinals.REPORTPRODUCTGROUPTURNOVER    = "100";
ProtocolFinals.REPORTPRODUCTTURNOVER         = "150";
ProtocolFinals.REPORTBRANCHTURNOVER          = "200";
ProtocolFinals.REPORTCUSTOMERTURNOVER        = "210";
ProtocolFinals.REPORTHKCATEGORIETURNOVER     = "220";

/***********************************************************************
 * SHOP MANAGER
 **********************************************************************/

// Style sheet manager
ProtocolFinals.STYLESHEETCONTENT                       = "STYLESHEETCONTENT";
ProtocolFinals.STYLESHEETURL                           = "STYLESHEETURL";
ProtocolFinals.STYLESHEETCONTENTCHANGED                = "STYLESHEETCONTENTCHANGED";

// ImagePicker and Imagemanager
ProtocolFinals.EXTERNALIDSTODELETE                     = "EXTERNALIDSTODELETE";

// Function manager
ProtocolFinals.FUNCTIONID_PUBLICONLYSHOPFUNCTIONS       = "9";
ProtocolFinals.FUNCTIONID_PUBLICSHOPMENUITMS            = "10";
ProtocolFinals.FUNCTIONID_SHOPINSHOPMENUITMS            = "11";

// Layout manager
ProtocolFinals.MODULEID_PRODUCTOVERVIEW                 = "1";
ProtocolFinals.MODULEID_WELCOME                         = "6";
ProtocolFinals.MODULEID_GROUPOVERVIEW                   = "12";
ProtocolFinals.MODULEID_PRODUCTDETAILS                  = "11";

ProtocolFinals.PRESENCEINDICATOR_NO                     = "0";
ProtocolFinals.PRESENCEINDICATOR_ALWAYS                 = "1";
ProtocolFinals.PRESENCEINDICATOR_HOMEPAGE               = "2";
ProtocolFinals.PRESENCEINDICATOR_ONREQUEST              = "3";

/***********************************************************************
 * SUPPLIER MANAGER
 **********************************************************************/

ProtocolFinals.SUPPLIERTYPE_PRODUCTS              = "1";
ProtocolFinals.SUPPLIERTYPE_SERVICES              = "2";
ProtocolFinals.SUPPLIERTYPE_PRODUCTS_AND_SERVICES = "3";

ProtocolFinals.SUPPLIERS                                = "SUPPLIERS";
ProtocolFinals.SUPPLIERSALESOFFICES                     = "SUPPLIERSALESOFFICES";

// GEN_INDICATOR
ProtocolFinals.INDICATOR_SHOPTYPE                       = "SHOPTYPE";
ProtocolFinals.INDICATOR_CONTRACTTYPE                   = "CONTRACTTYPE";
ProtocolFinals.INDICATOR_FINANCIALSTATUS                = "FINANCIALSTATUS";
ProtocolFinals.INDICATOR_SUPPLIERTYPE                   = "SUPPLIERTYPE";
ProtocolFinals.INDICATOR_HKENTERPRISECODE               = "HKENTERPRISECODE";

// GEN_EXTERNAL
ProtocolFinals.OWNER                                               = "OWNER";
ProtocolFinals.OWNERTYPE_DISTRIBUTOR                               = "1";
ProtocolFinals.OWNERTYPE_SHOP                                      = "2";
ProtocolFinals.OWNERTYPE_PFMANAGER                                 = "3";
ProtocolFinals.OWNERTYPE_CATEGORY                                  = "4";
ProtocolFinals.OWNERTYPE_CUSTOMER                                  = "5";

ProtocolFinals.S_SET_TOOLS                                         = "1";
ProtocolFinals.S_SET_SHOPS                                         = "2";
ProtocolFinals.S_SET_INFO                                          = "4";

// CUSTOMER ADDRESS_TYPES
ProtocolFinals.CUSTOMERADDRESSTYPE_MAIN                            = "1";
ProtocolFinals.CUSTOMERADDRESSTYPE_DELIVERY                        = "10";

// DISTRIBUTOR ADDRESS_TYPES
ProtocolFinals.DISTRIBUTORADDRESSTYPE_MAIN                         = "1";
ProtocolFinals.DISTRIBUTORADDRESSTYPE_DELIVERY                     = "10";

// SUPPLIER ADDRESS_TYPES
ProtocolFinals.SUPPLIERADDRESSTYPE_MAIN                            = "1";

// PRODUCT TYPES
ProtocolFinals.PRODUCTTYPE_REGULAR                                 = "1";
ProtocolFinals.PRODUCTTYPE_VAS                                     = "2";

// ROLES TYPES
ProtocolFinals.ROLETYPE_CUSTOMER                                   = "100";
ProtocolFinals.ROLETYPE_DISTRIBUTOR                                = "20";
ProtocolFinals.ROLETYPE_SHOPMANAGER                                = "10";
ProtocolFinals.ROLETYPE_SYSTEMMANAGER                              = "30";

// USER GENDER (SEX) INDICATORS
ProtocolFinals.GENDERINDICATOR_MALE                                = "1";
ProtocolFinals.GENDERINDICATOR_FEMALE                              = "2";

// distributor status
ProtocolFinals.DISTRIBUTORSTATUS_SUSPECT                           =  "10";
ProtocolFinals.DISTRIBUTORSTATUS_PROSPECT                          =  "20";
ProtocolFinals.DISTRIBUTORSTATUS_HOT_PROSPECT                      =  "30";
ProtocolFinals.DISTRIBUTORSTATUS_SIGNED_DECLARATIONOFINTENT        = "100";
ProtocolFinals.DISTRIBUTORSTATUS_SIGNED_CONTRACT                   = "200";
ProtocolFinals.DISTRIBUTORSTATUS_CANCELLED                         = "900";

ProtocolFinals.S_ATTRIBUTEID_COLOR           = "1";
ProtocolFinals.S_ATTRIBUTEID_SIZE            = "2";

// sales order status
ProtocolFinals.ORDERSTATUS_BASKETPREFIX                      =   "1";// fictional, to recognize baskets
ProtocolFinals.ORDERSTATUS_QUOTATIONPREFIX                   =   "3";// fictional, to recognize quotations
ProtocolFinals.ORDERSTATUS_OPEN_BASKET                       = "100";
ProtocolFinals.ORDERSTATUS_STOCKCHECK_FAILED                 = "150";
ProtocolFinals.ORDERSTATUS_PROPOSAL                          = "200";
ProtocolFinals.ORDERSTATUS_WAITING_FOR_QUOTATION             = "300";
ProtocolFinals.ORDERSTATUS_QUOTATION_FORWARDED               = "305";
ProtocolFinals.ORDERSTATUS_WAITING_FOR_ACCEPTANCE            = "310";
ProtocolFinals.ORDERSTATUS_FINAL_QUOTATION                   = "320";
ProtocolFinals.ORDERSTATUS_WAITING_FOR_REQUOTATION           = "340";
ProtocolFinals.ORDERSTATUS_QUOTATION_ACCEPTED_BY_CUSTOMER    = "350";
ProtocolFinals.ORDERSTATUS_QUOTATION_REJECTED_BY_CUSTOMER    = "370";
ProtocolFinals.ORDERSTATUS_QUOTATION_REJECTED_BY_DISTRIBUTOR = "380";
ProtocolFinals.ORDERSTATUS_QUOTATION_ENDED                   = "390";
ProtocolFinals.ORDERSTATUS_ORDER_PLACED                      = "400";
ProtocolFinals.ORDERSTATUS_PURCHASEORDER_PROPOSAL_CREATED    = "420";
ProtocolFinals.ORDERSTATUS_ORDER_IN_PROGRESS                 = "450";
ProtocolFinals.ORDERSTATUS_ORDER_IN_BACKORDER                = "500";
ProtocolFinals.ORDERSTATUS_ORDER_PARTLY_IN_BACKORDER         = "510";
ProtocolFinals.ORDERSTATUS_ORDER_SHIPPED                     = "600";
ProtocolFinals.ORDERSTATUS_ORDER_REFUSED                     = "800";
ProtocolFinals.ORDERSTATUS_ORDER_CANCELLED                   = "810";
ProtocolFinals.ORDERSTATUS_ORDER_COMPLETED                   = "900";

// purchase order status
ProtocolFinals.PURCHASEORDERSTATUS_ON_HOLD                   = "150";
ProtocolFinals.PURCHASEORDERSTATUS_PROPOSAL_CANCELLED        = "160";
ProtocolFinals.PURCHASEORDERSTATUS_ORDER_CANCELLED           = "170";
ProtocolFinals.PURCHASEORDERSTATUS_PROPOSAL                  = "200";
ProtocolFinals.PURCHASEORDERSTATUS_ORDER_PLACED              = "400";
ProtocolFinals.PURCHASEORDERSTATUS_ORDER_IN_PROGRESS         = "450";
ProtocolFinals.PURCHASEORDERSTATUS_LINE_IN_BACKORDER         = "460";
ProtocolFinals.PURCHASEORDERSTATUS_LINE_ON_PICKINGLIST       = "470";
ProtocolFinals.PURCHASEORDERSTATUS_LINE_DELAYED              = "480";
ProtocolFinals.PURCHASEORDERSTATUS_LINE_SHIPPED              = "490";
ProtocolFinals.PURCHASEORDERSTATUS_ORDER_IN_BACKORDER        = "500";
ProtocolFinals.PURCHASEORDERSTATUS_ORDER_PARTLY_IN_BACKORDER = "510";
ProtocolFinals.PURCHASEORDERSTATUS_ORDER_SHIPPED             = "600";
ProtocolFinals.PURCHASEORDERSTATUS_ORDER_COMPLETED           = "900";

ProtocolFinals.CONTACTCUSTOMERSUBJECT                        = "CONTACTCUSTOMERSUBJECT";
ProtocolFinals.CONTACTCUSTOMERBODY                           = "CONTACTCUSTOMERBODY";
ProtocolFinals.CONFIRMORDERBODY                              = "CONFIRMORDERBODY";
ProtocolFinals.CONFIRMORDERSUBJECT                           = "CONFIRMORDERSUBJECT";


/************************************************************
 *   API METHODS
 ************************************************************/

//  ProtocolFinals.GET_PRODUCTBRANDS                 = "getProductBrands";             //Move to MCI Finals
ProtocolFinals.GET_PPMBRAND                      = "getPPMBrand";
ProtocolFinals.GET_PPMBRANDARTICLES              = "getPPMBrandArticles";
ProtocolFinals.GET_PPMPRODUCTSARTICLES           = "getPPMProductsArticles";
//  ProtocolFinals.REQUEST_PPMPRODUCTSBYKEYWORD      = "requestPPMProductByKeyword";   //Move to MCI Finals

ProtocolFinals.GET_PPMCHILDCATEGORIES            = "getPPMChildCategories";
ProtocolFinals.GET_PPMCATEGORYARTICLES           = "getPPMCategoryArticles";

/************************************************************
 *   ROWSET RETURN KEYS (CategoryBrowserManager)
 ************************************************************/

ProtocolFinals.CHILDCATEGORIES                   = "CHILDCATEGORIES";
ProtocolFinals.CHILDCATEGORIESCONTENTANDOBJECT   = "CHILDCATEGORIESCONTENTANDOBJECT";
ProtocolFinals.PRODUCTSARTICLESANDIMAGES         = "PRODUCTSARTICLESANDIMAGES";


ProtocolFinals.BRANDSCONTENTANDOBJECT            = "BRANDSCONTENTANDOBJECT";
ProtocolFinals.BRANDARTICLESANDIMAGES            = "BRANDARTICLESANDIMAGES";
ProtocolFinals.BRANDSWITHIMAGE                   = "BRANDSWITHIMAGE";

// QuickEdit
ProtocolFinals.QUICKEDITNUMBEROFRECORDSPERPAGE   = "QUICKEDITNUMBEROFRECORDSPERPAGE";
ProtocolFinals.QUICKEDITMAXNUMBEROFRECORDS       = "QUICKEDITMAXNUMBEROFRECORDS";

// Distributor agreements
ProtocolFinals.AGREEMENTAGREEDDATE               = "AGREEMENTAGREEDDATE";
ProtocolFinals.AGREEMENTUSERID                   = "AGREEMENTUSERID";
ProtocolFinals.AGREEMENTUSERNAME                 = "AGREEMENTUSERNAME";
ProtocolFinals.AGREEMENTTEXT                     = "AGREEMENTTEXT";
ProtocolFinals.AGREEMENTTITLE                    = "AGREEMENTTITLE";
ProtocolFinals.AGREEMENTDATE                     = "AGREEMENTDATE";
ProtocolFinals.AGREEMENTNEEDED                   = "AGREEMENTNEEDED";
ProtocolFinals.AGREEMENTREJECTEDTEXT             = "AGREEMENTREJECTEDTEXT";
ProtocolFinals.AGREEMENTNOTSIGNEDTEXT            = "AGREEMENTNOTSIGNEDTEXT";
ProtocolFinals.AGREEMENTNOTSIGNED                = "AGREEMENTNOTSIGNED";

ProtocolFinals.TERMSOFDELIVERY                   = "TERMSOFDELIVERY";
ProtocolFinals.TERMSOFDELIVERYTITLE              = "TERMSOFDELIVERYTITLE";
ProtocolFinals.TERMSOFDELIVERYTEXT               = "TERMSOFDELIVERYTEXT";
ProtocolFinals.TERMSOFDELIVERYDATE               = "TERMSOFDELIVERYDATE";
ProtocolFinals.TERMSOFDELIVERYAGREEDDATE         = "TERMSOFDELIVERYAGREEDDATE";
ProtocolFinals.TERMSOFDELIVERYUSERID             = "TERMSOFDELIVERYUSERID";
ProtocolFinals.TERMSOFDELIVERYUSERNAME           = "TERMSOFDELIVERYUSERNAME";

ProtocolFinals.SUPPLIERDISCLAIMERTITLE           = "SUPPLIERDISCLAIMERTITLE";
ProtocolFinals.SUPPLIERDISCLAIMERTEXT            = "SUPPLIERDISCLAIMERTEXT";
ProtocolFinals.SUPPLIERTERMSOFDELIVERYDATE       = "SUPPLIERTERMSOFDELIVERYDATE";
ProtocolFinals.SUPPLIERTERMSOFDELIVERYTITLE      = "SUPPLIERTERMSOFDELIVERYTITLE";
ProtocolFinals.SUPPLIERTERMSOFDELIVERYTEXT       = "SUPPLIERTERMSOFDELIVERYTEXT";

ProtocolFinals.BILLINGSTARTDATE                  = "BILLINGSTARTDATE";
ProtocolFinals.CONTRACTDATE                      = "CONTRACTDATE";

ProtocolFinals.DEMOPERIOD                        = "DEMOPERIOD";
ProtocolFinals.DEMOSTARTDATE                     = "DEMOSTARTDATE";
ProtocolFinals.DEMOENDDATE                       = "DEMOENDDATE";
ProtocolFinals.DEMODATA                          = "DEMODATA";
ProtocolFinals.DEMOEXPIREDTEXT                   = "DEMOEXPIREDTEXT";
ProtocolFinals.DEMOEXPIRED                       = "DEMOEXPIRED";
ProtocolFinals.DEMOEXPIREDMAINUSERTEXT           = "DEMOEXPIREDMAINUSERTEXT";

// TODO: to qv50
ProtocolFinals.SOURCEOBJECT                      = "SOURCEOBJECT";
ProtocolFinals.PRETARGETOBJECT                   = "PRETARGETOBJECT";





ProtocolFinals.GET_LASTREQUESTASXML         = "getLastRequestAsXML";

// POPUP (USR_USER?)
ProtocolFinals.ISPOPUP                               = "ISPOPUP";
ProtocolFinals.POPUPINDICATOR                        = "POPUPINDICATOR";

// GENERAL
ProtocolFinals.MENUACTION                            = "MENUACTION";

// PLATFORM
ProtocolFinals.APPLICATION                           = "APPLICATION";
ProtocolFinals.APPLICATIONNAME                       = "APPLICATIONNAME";
ProtocolFinals.PLATFORMID                            = "PLATFORMID";
ProtocolFinals.PLATFORMPARAMETERS                    = "PLATFORMPARAMETERS";
ProtocolFinals.PLATFORMAPPLICATIONNAME               = "PLATFORMAPPLICATIONNAME";
ProtocolFinals.PLATFORMSTYLESHEET                    = "PLATFORMSTYLESHEET";

// EMAILMARKETING
ProtocolFinals.SET_MESSAGEREAD                       = "setMessageRead";

ProtocolFinals.DELETEACTION                          = "DELETEACTION";
ProtocolFinals.ORIENTATION                           = "ORIENTATION";
ProtocolFinals.COPYFROMMAINADDRESS                   = "COPYFROMMAINADDRESS";

ProtocolFinals.MAXPERIODCOLUMNSONREPORT              = "MAXPERIODCOLUMNSONREPORT";
ProtocolFinals.PAGELENGTH                            = "PAGELENGTH";

// LOGIN
ProtocolFinals.DO_TOOLSLOGIN                         = "doToolsLogin";
ProtocolFinals.DO_PASSWORDREMINDERTOOLS              = "doPasswordReminderTools";
ProtocolFinals.DO_PASSWORDUPDATETOOLS                = "doPasswordUpdateTools";
ProtocolFinals.DO_TOOLSLOGOUT                        = "doToolsLogout";
ProtocolFinals.VIEW_DISCLAIMER                       = "requestViewDisclaimer";
ProtocolFinals.VIEW_AGREEMENT                        = "requestViewAgreement";

// SHOP LAYOUT
ProtocolFinals.EDIT_SHOPGENERAL                      = "editShopGeneral";
ProtocolFinals.EDIT_SHOPLAYOUT                       = "editShopLayout";
ProtocolFinals.NEW_SHOP                              = "newShop";
//ProtocolFinals.DELETE_WEBPAGE                        = "deleteWebPage";
ProtocolFinals.PICK_WEBPAGE                          = "pickWebPage";
ProtocolFinals.PROCESS_WEBPAGES                      = "processWebPages";
ProtocolFinals.EDIT_SHOPSTYLESHEET                   = "editShopStyleSheet";
ProtocolFinals.UPDATE_STYLESHEETSESSIONDATA          = "updateStyleSheetSessionData";
ProtocolFinals.SAVE_STYLESHEETSESSIONDATA            = "saveStyleSheetSessionData";
ProtocolFinals.CANCEL_STYLESHEETSESSIONDATA          = "cancelStyleSheetSessionData";
ProtocolFinals.PREPARE_PRODUCTLAYOUT                 = "prepareProductLayout";
ProtocolFinals.PREPARE_CUSTOMERLAYOUT                = "prepareCustomerLayout";

// ABSTRACT IMAGE MANAGER
ProtocolFinals.SET_UPLOADINPROGRESS                  = "setUploadInProgress";
ProtocolFinals.UPDATE_IMAGES                         = "updateImages";

// IMAGE MANAGER
ProtocolFinals.MANAGE_IMAGES                         = "manageImages";
ProtocolFinals.GET_IMAGES_JS                         = "getImagesJS";
ProtocolFinals.UPLOADIMAGE_SESSIONRESPONSE           = "uploadImageSessionResponse";
ProtocolFinals.GET_UPLOADEDIMAGERESPONSEJS           = "getUploadedImageResponseJS";
ProtocolFinals.FIND_IMAGES_JS                        = "findImagesJS";
ProtocolFinals.PICK_IMAGE                            = "pickImage";

// IMAGE MANAGER OPM
ProtocolFinals.MANAGE_OPMIMAGES                      = "manageOPMImages";
ProtocolFinals.GET_OPMIMAGES_JS                      = "getOPMImagesJS";
ProtocolFinals.UPLOADOPMIMAGE_SESSIONRESPONSE        = "uploadOPMImageSessionResponse";
ProtocolFinals.GET_UPLOADEDOPMIMAGERESPONSEJS        = "getUploadedOPMImageResponseJS";
ProtocolFinals.REQUESTUPLOADLOGO                     = "requestUploadLogo";
ProtocolFinals.UPLOADLOGO                            = "uploadLogo";
ProtocolFinals.SET_OPMUPLOADINPROGRESS               = "setOPMUploadInProgress";

ProtocolFinals.DOPREVIEW                             = "DOPREVIEW";
ProtocolFinals.SHOPIDVERSIONID                       = "SHOPIDVERSIONID";
ProtocolFinals.PREVIEWMODEINDICATOR                  = "PREVIEWMODEINDICATOR";

// ORDERS & QUOTATIONS
ProtocolFinals.ACCEPT_PURCHASEORDER                  = "acceptPurchaseOrder";
ProtocolFinals.CHECK_QUOTATIONSTOCK                  = "checkQuotationStock";
ProtocolFinals.DELETE_PURCHASEORDER                  = "deletePurchaseOrder";
ProtocolFinals.DELETE_QUOTATION                      = "deleteQuotation";
ProtocolFinals.DELETE_SALESORDER                     = "deleteSalesOrder";
ProtocolFinals.GET_PURCHASEORDERS                    = "getPurchaseOrders";
ProtocolFinals.GET_PURCHASEORDERDETAILS              = "getPurchaseOrderDetails";
ProtocolFinals.GET_PURCHASEORDERSSEARCH              = "getPurchaseOrdersSearch";
ProtocolFinals.GET_PURCHASEORDERSLIST                = "getPurchaseOrdersList";
ProtocolFinals.GET_PURCHASEORDERSPROPOSAL            = "getPurchaseOrdersProposal";
ProtocolFinals.GET_PURCHASEORDERSPLACED              = "getPurchaseOrdersPlaced";
ProtocolFinals.GET_PURCHASEORDERSWORKINGONIT         = "getPurchaseOrdersWorkingOnIt";
ProtocolFinals.GET_PURCHASEORDERSSHIPPED             = "getPurchaseOrdersShipped";
ProtocolFinals.GET_PURCHASEORDERSCANCELLEDPROPOSALS  = "getPurchaseOrdersCancelledProposals";
ProtocolFinals.GET_PURCHASEORDERSCANCELLEDORDERS     = "getPurchaseOrdersCancelledOrders";
ProtocolFinals.GET_PURCHASEORDERSCOMPLETED           = "getPurchaseOrdersCompleted";
ProtocolFinals.GET_QUOTATIONDETAILS                  = "getQuotationDetails";
ProtocolFinals.GET_QUOTATIONS                        = "getQuotations";
ProtocolFinals.GET_QUOTATIONSSEARCH                  = "getQuotationsSearch";
ProtocolFinals.GET_QUOTATIONSLIST                    = "getQuotationsList";
ProtocolFinals.GET_QUOTATIONSTOBEHANDLED             = "getQuotationsToBeHandled";
ProtocolFinals.GET_QUOTATIONSWORKINGONIT             = "getQuotationsWorkingOnIt";
ProtocolFinals.GET_QUOTATIONSREJECTED                = "getQuotationsRejected";
ProtocolFinals.GET_QUOTATIONSACCEPTEDCUSTOMER        = "getQuotationsAcceptedCustomer";
ProtocolFinals.GET_QUOTATIONSREJECTEDCUSTOMER        = "getQuotationsRejectedCustomer";
ProtocolFinals.GET_QUOTATIONSPROPOSALMADE            = "getQuotationsProposalMade";
ProtocolFinals.GET_SALESORDERDETAILS                 = "getSalesOrderDetails";
ProtocolFinals.GET_SALESORDERS                       = "getSalesOrders";
ProtocolFinals.GET_SALESORDERSSEARCH                 = "getSalesOrdersSearch";
ProtocolFinals.GET_SALESORDERSLIST                   = "getSalesOrdersList";
ProtocolFinals.GET_SALESORDERSOPEN                   = "getSalesOrdersOpen";
ProtocolFinals.GET_SALESORDERSWORKINGONIT            = "getSalesOrdersWorkingOnIt";
ProtocolFinals.GET_SALESORDERSREFUSED                = "getSalesOrdersRefused";
ProtocolFinals.GET_SALESORDERSCANCELLED              = "getSalesOrdersCancelled";
ProtocolFinals.GET_SALESORDERSCOMPLETED              = "getSalesOrdersCompleted";
ProtocolFinals.GET_SALESORDERSWAITINGPAYMENT         = "getSalesOrdersWaitingPayment";
ProtocolFinals.REQUEST_SUPPLIERPRINTINGMODULE        = "requestSupplierPrintingModule";
ProtocolFinals.SAVE_QUOTATION                        = "saveQuotation";
ProtocolFinals.SEARCH_PURCHASEORDERS                 = "searchPurchaseOrders";
ProtocolFinals.SEARCH_QUOTATIONS                     = "searchQuotations";
ProtocolFinals.SEARCH_SALESORDERS                    = "searchSalesOrders";

//USERS
ProtocolFinals.EDIT_CUSTOMERUSERS                    = "editCustomerUsers";
ProtocolFinals.EDIT_DISTRIBUTORUSERSQUICKEDIT        = "editDistributorUsersQuickEdit";

// tcd intake
ProtocolFinals.INTAKE_ACTIONS                        = "intakeActions";

ProtocolFinals.ORDERTYPE_BASKET                      = "0";
ProtocolFinals.ORDERTYPE_ORDER                       = "1";
ProtocolFinals.ORDERTYPE_QUOTATION                   = "2";

//ProtocolFinals.S_ATTRIBUTEID_COLOR                     = "1";
//ProtocolFinals.S_ATTRIBUTEID_SIZE                      = "2";
ProtocolFinals.ATTRIBUTEID_LENGTH                    = "3";
ProtocolFinals.ATTRIBUTEID_WIDTH                     = "4";
ProtocolFinals.ATTRIBUTEID_HEIGHT                    = "5"; 
ProtocolFinals.ATTRIBUTEID_WEIGHT                    = "7";
ProtocolFinals.ATTRIBUTEID_MATERIAL                  = "8";
ProtocolFinals.ATTRIBUTEID_PRODUCTID                 = "9";
ProtocolFinals.ATTRIBUTEID_DISTRIBUTORARTICLENUMBER  = "10";
ProtocolFinals.ATTRIBUTEID_ARTICLEID                 = "11";
ProtocolFinals.ATTRIBUTEID_FEATURES                  = "12";
ProtocolFinals.ATTRIBUTEID_LENGTH2                   = "13";
ProtocolFinals.ATTRIBUTEID_MANUAL                    = "14";
ProtocolFinals.ATTRIBUTEID_PACKAGING                 = "15";
ProtocolFinals.ATTRIBUTEID_CATALOG                   = "16";
    
ProtocolFinals.ATTRIBUTEID_THUMBNAILIMAGE            = "17";
ProtocolFinals.ATTRIBUTEID_FULLIMAGE                 = "18";
ProtocolFinals.ATTRIBUTEID_EXPORT_SIZE               = "25";
ProtocolFinals.ATTRIBUTEID_EXPORT_WEIGHT             = "26";
ProtocolFinals.ATTRIBUTEID_EXPORT                    = "27";
ProtocolFinals.ATTRIBUTEID_INNER                     = "28";
ProtocolFinals.ATTRIBUTEID_ADAP_INC                  = "30";
ProtocolFinals.ATTRIBUTEID_ADAPTER                   = "31";
ProtocolFinals.ATTRIBUTEID_BAT_1_INC                 = "32";
ProtocolFinals.ATTRIBUTEID_DIAMETER                  = "33";
ProtocolFinals.ATTRIBUTEID_BAT_1_NBR                 = "34";
ProtocolFinals.ATTRIBUTEID_BAT_1_TYPE                = "35";
ProtocolFinals.ATTRIBUTEID_BAT_1_SIZE                = "39";

// PM Manager (PRODUCTGROUPDETAIL/CATEGORY)               
ProtocolFinals.FIND_PRODUCTGROUPS                    = "findProductGroups";
ProtocolFinals.EDIT_PRODUCTGROUP                     = "editProductGroup";
ProtocolFinals.NEW_PRODUCTGROUP                      = "newProductGroup";
    
// PM Manager (Colors)
ProtocolFinals.FIND_COLORS                           = "findColors";
ProtocolFinals.EDIT_COLOR                            = "editColor";
ProtocolFinals.NEW_COLOR                             = "newColor";
ProtocolFinals.MOVE_COLOR                            = "moveColor";
    
// VAS (PM Manager) 
ProtocolFinals.FIND_PMVASES                          = "findPMVASes";
ProtocolFinals.EDIT_PMVAS                            = "editPMVAS";
ProtocolFinals.EDIT_PMVASSUPPORTED                   = "editPMVASSupported";
ProtocolFinals.NEW_PMVAS                             = "newPMVAS";
ProtocolFinals.SAVE_PMVAS                            = "savePMVAS";
ProtocolFinals.SAVE_PMVASSUPPORTED                   = "savePMVASSupported";
ProtocolFinals.DELETE_PMVAS                          = "deletePMVAS";
    
// PRODUCT (CATEGORY) 
//ProtocolFinals.EDIT_SHOPCATEGORYIMAGES               = "editShopCategoryImages";
//ProtocolFinals.SAVE_SHOPCATEGORYIMAGES               = "saveShopCategoryImages";

ProtocolFinals.UPDATESELECTEDPRODUCTSINSESSION       = "updateSelectedProductsInSession";

ProtocolFinals.UPDATESELECTEDSHOPPRODUCTSINSESSION   = "updateSelectedShopProductsInSession";
//ProtocolFinals.SELECT_SUPPORTEDPRODUCTS              = "selectSupportedProducts";
ProtocolFinals.DO_PRICECALCULATION                   = "doPriceCalculation";
//ProtocolFinals.DO_LEAFLETDETAILSPMT                  = "invokeLeafletDetails";
//ProtocolFinals.DO_LEAFLETSTEPSPMT                    = "invokeLeafletSteps";
//ProtocolFinals.DO_SELECTPRODUCTFORLEAFLETSTEP        = "doSelectProductForLeafletStep";    //Moved to MCI Protocol Finals
//ProtocolFinals.SELECT_SUPPORTEDSHOPPRODUCTS          = "selectSupportedShopProducts";

ProtocolFinals.FIND_PRODUCTS                         = "findProducts";
ProtocolFinals.FIND_VASPRODUCTS                      = "findVasProducts";
ProtocolFinals.SHOW_PRODUCTLIST                      = "showProductList";

// CategoryBrowserManager
//ProtocolFinals.GET_PPMCATEGORYCHILDS                 = "getPPMCategoryChilds"; //copied to mcic protocol finals
ProtocolFinals.SHOW_PRODUCTARTICLESINBROWSER         = "showProductArticlesInBrowser";
//ProtocolFinals.SHOW_BRANDPRODUCTARTICLESINBROWSER    = "showBrandProductArticlesInBrowser";
ProtocolFinals.SELECTARTICLEFROMBROWSER              = "selectArticleFromBrowser";
ProtocolFinals.PROCESSARTICLEACTION                  = "PROCESSARTICLEACTION";
//ProtocolFinals.SHOW_SHOPPRODUCTDETAIL                = "showShopProductDetail";

ProtocolFinals.EDIT_PRODUCTGENERAL                   = "editProductGeneral";
//ProtocolFinals.SAVE_PRODUCTGENERAL                   = "saveProductGeneral";
ProtocolFinals.NEW_PRODUCT                           = "newProduct";
//ProtocolFinals.EDIT_STOCKS                           = "editStocks";
ProtocolFinals.SHOW_ARTICLEHEADER                    = "showArticleHeader";
ProtocolFinals.SHOW_ARTICLETHUMB                     = "showArticleThumb";
ProtocolFinals.VIEW_SUPPLIERPRICES                   = "viewSupplierPrices";
ProtocolFinals.VIEW_ARTICLEPURCHASEPRICES            = "viewArticlePurchasePrices";

/** product is no longer directly in shop but attached to a category that is in a shop (DIS_SHOPCATEGORYARTICLE) */
ProtocolFinals.EDIT_DISTRIBUTORPRICEAREAS            = "editDistributorPriceAreas";

ProtocolFinals.EDIT_PRICES                           = "editPrices";
ProtocolFinals.EDIT_DISTRIBUTORARTICLEPRICES         = "editDistributorArticlePrices";

ProtocolFinals.EDIT_CUSTOMERPRICES                   = "editCustomerPrices";
ProtocolFinals.EDIT_CUSTOMERARTICLEPRICES            = "editCustomerArticlePrices";

ProtocolFinals.EDIT_CUSTOMERGROUPPRICES              = "editCustomerGroupPrices";
ProtocolFinals.EDIT_CUSTOMERGROUPARTICLEPRICES       = "editCustomerGroupArticlePrices";

ProtocolFinals.EDIT_PRODUCTVAS                       = "editProductVAS";
ProtocolFinals.EDIT_ARTICLES                         = "editArticles";
ProtocolFinals.EDIT_ARTICLE                          = "editArticle";
ProtocolFinals.NEW_ARTICLE                           = "newArticle";

    // DISTRIBUTOR
ProtocolFinals.NEW_DISTRIBUTORPROFILE                = "newDistributorProfile";
ProtocolFinals.EDIT_DISTRIBUTORPROFILE               = "editDistributorProfile";
ProtocolFinals.INSERT_DISTRIBUTORPROFILE             = "insertDistributorProfile";
ProtocolFinals.INSERT_DISTRIBUTORSUPPLIER            = "insertDistributorSupplier";
ProtocolFinals.SAVE_DISTRIBUTORPROFILE               = "saveDistributorProfile";
ProtocolFinals.EDIT_DISTRIBUTORSUPPLIERS             = "editDistributorSuppliers";
//ProtocolFinals.SAVE_DISTRIBUTORSUPPLIERS             = "saveDistributorSuppliers";
ProtocolFinals.EDIT_DISTRIBUTORUSERS                 = "editDistributorUsers";
ProtocolFinals.SAVE_DISTRIBUTORUSERS                 = "saveDistributorUsers";
//ProtocolFinals.DELETE_DISTRIBUTORUSER                = "deleteDistributorUser";
//ProtocolFinals.EDIT_DISTRIBUTORADDRESSES             = "editDistributorAddresses";
ProtocolFinals.SAVE_DISTRIBUTORADDRESSES             = "saveDistributorAddresses";
//ProtocolFinals.GET_DISTRIBUTORUSERROLES              = "getDistributorUserRoles";
ProtocolFinals.FINDDISTRIBUTORS                      = "findDistributors";
ProtocolFinals.SHOW_DISTRIBUTORLIST                   = "showDistributorList";
ProtocolFinals.SHOW_DISTRIBUTORIMPORT                = "showDistributorImport";
ProtocolFinals.SHOW_DISTRIBUTOREXPORT                = "showDistributorExport";
ProtocolFinals.SEND_BATCHCOMMUNICATIONRESULTFILE     = "sendBatchCommunicationResultFile";
ProtocolFinals.EDIT_DISTRIBUTORSUPPLIERDETAILS       = "editDistributorSupplierDetails";
ProtocolFinals.SAVE_DISTRIBUTORSUPPLIERDETAIL        = "saveDistributorSupplierDetail";
ProtocolFinals.NEW_DISTRIBUTORSUPPLIER               = "newDistributorSupplier";
ProtocolFinals.DELETE_DISTRIBUTORSUPPLIER            = "deleteDistributorSupplier";
ProtocolFinals.EDIT_PMCATEGORYIMAGES                 = "editPMCategoryImages";  // TODO: currently not used
ProtocolFinals.SAVE_PMCATEGORYIMAGES                 = "savePMCategoryImages";
ProtocolFinals.SELECT_DISTRIBUTORSUPPORTEDCATEGORIES     = "selectDistributorCategories";
//ProtocolFinals.SELECT_DISTRIBUTORSHOPSUPPORTEDCATEGORIES = "selectDistributorShopCategories";

// DISTRIBUTOR VAS
/** @deprecated */
ProtocolFinals.SHOW_DISTRIBUTORVASLIST               = "showDistributorVASList";

/** @deprecated */
ProtocolFinals.EDIT_DISTRIBUTORVASDETAIL             = "editDistributorVASDetail";

/** @deprecated */
ProtocolFinals.NEW_DISTRIBUTORVAS                    = "newDistributorVAS";

// SUPPLIERS
ProtocolFinals.FIND_SUPPLIERS                        = "findSuppliers";
ProtocolFinals.EDIT_SUPPLIERDETAILS                  = "editSupplierDetails";
ProtocolFinals.EDIT_SUPPLIERSALESOFFICES             = "editSupplierSalesOffices";
ProtocolFinals.SAVE_SUPPLIERDETAIL                   = "saveSupplierDetail";
ProtocolFinals.NEW_SUPPLIER                          = "newSupplier";
ProtocolFinals.DELETE_SUPPLIER                       = "deleteSupplier";

// getProducts special columns (not matching table column name)
ProtocolFinals.PRODUCTSHORTDESCRIPTION       = "PRODUCTSHORTDESCRIPTION";
ProtocolFinals.DISTRIBUTORPRODUCTDESCRIPTION = "DISTRIBUTORPRODUCTDESCRIPTION";
ProtocolFinals.SUPPLIERSALESPRICE            = "SUPPLIERSALESPRICE";
ProtocolFinals.DISTRIBUTORSALESPRICE         = "DISTRIBUTORSALESPRICE";
ProtocolFinals.CATEGORYDESCRIPTION           = "CATEGORYDESCRIPTION";
ProtocolFinals.ISACUSTOMERSPECIFICPRODUCT    = "ISACUSTOMERSPECIFICPRODUCT";
ProtocolFinals.ISADISTRIBUTORSPECIFICPRODUCT = "ISADISTRIBUTORSPECIFICPRODUCT";

ProtocolFinals.SELECTABLEPRODUCTID                   = "SELECTABLEPRODUCTID";

// CUSTOMERS
ProtocolFinals.EDIT_CUSTOMER                         = "editCustomer";
ProtocolFinals.NEW_CUSTOMER                          = "newCustomer";
ProtocolFinals.FINDCUSTOMERS                         = "findCustomers";
ProtocolFinals.SHOW_CUSTOMERLIST                     = "showCustomerList";
ProtocolFinals.GET_CUSTOMERPRODUCTS                  = "getCustomerProducts";
//ProtocolFinals.EDIT_CUSTOMERUSER                     = "editCustomerUser";

// REPORTS
ProtocolFinals.GET_ONEFROMDUAL                       = "getOneFromDual";
ProtocolFinals.GET_REPORTS                           = "getReports";
ProtocolFinals.GET_DIMENSIONS                        = "getDimensions";
ProtocolFinals.GET_REPORTDATA                        = "getReportData";
ProtocolFinals.REPORT_WSTVISITORS                    = "reportWSTVisitors";
ProtocolFinals.REPORTS_WSTBRANDS                     = "reportWSTBrands";
ProtocolFinals.GET_REPORTPARAMETERS                  = "getReportParameters";
ProtocolFinals.GENERATE_REPORT                       = "generateReport";
ProtocolFinals.DISPLAY_REPORT                        = "displayReport";

// SYSTEM (PROMOVEMENT MANAGER)
ProtocolFinals.EDIT_PMUSERS                          = "editPMUsers"; // old

ProtocolFinals.EDIT_PMUSER                           = "editPMUser";
ProtocolFinals.FIND_PMUSERS                          = "findPMUsers";
ProtocolFinals.NEW_PMUSER                            = "newPMUser";
ProtocolFinals.SHOW_PMUSERLIST                       = "showPMUserList";


ProtocolFinals.EDIT_TEXTPMPARAM                      = "editTextPMParameter";
ProtocolFinals.EDIT_PMCODEOFCONDUCT                  = "editPMCodeOfConduct";
ProtocolFinals.EDIT_PMVASINFO                        = "editPMVASInfo";
ProtocolFinals.EDIT_PMDISCLAIMER                     = "editPMDisclaimer";
ProtocolFinals.EDIT_PMHELP                           = "editPMHelp";
ProtocolFinals.EDIT_PMPRIVACYSTATMENT                = "editPMPrivacyStatement";
ProtocolFinals.EDIT_PMTERMSOFDELIVERY                = "editPMTermsOfDelivery";

ProtocolFinals.SAVE_PMTITLEANDTEXT                   = "savePMTitleAndText";
ProtocolFinals.SAVE_PMTEXT                           = "savePMText";

// CAPTIONS
ProtocolFinals.BACKGROUND                            = "BACKGROUND";
ProtocolFinals.BOTTOM                                = "BOTTOM";
ProtocolFinals.BUTTONCHANGEPASSWORD                  = "BUTTONCHANGEPASSWORD";
ProtocolFinals.BUTTONS                               = "BUTTONS";
ProtocolFinals.CENTER                                = "CENTER";
ProtocolFinals.CAPTION                               = "CAPTION";
ProtocolFinals.CAPTIONCOPYFROMMAINADDRESS            = "CAPTIONCOPYFROMMAINADDRESS";
ProtocolFinals.CAPTIONDELIVERYADDRESS                = "CAPTIONDELIVERYADDRESS";
ProtocolFinals.CAPTIONDISTRIBUTORLOGO                = "CAPTIONDISTRIBUTORLOGO";
ProtocolFinals.CAPTIONLOGINMAIN                      = "CAPTIONLOGINMAIN";
ProtocolFinals.CAPTIONMAINADDRESS                    = "CAPTIONMAINADDRESS";
ProtocolFinals.CAPTIONNEWCATEGORY                    = "CAPTIONNEWCATEGORY";
ProtocolFinals.CAPTIONSTYLEINFO                      = "CAPTIONSTYLEINFO";
ProtocolFinals.CAPTIONSTYLEMODULE                    = "CAPTIONSTYLEMODULE";
ProtocolFinals.CAPTIONSTYLESAMPLE                    = "CAPTIONSTYLESAMPLE";
ProtocolFinals.CAPTIONSTYLESAMPLETEXT                = "CAPTIONSTYLESAMPLETEXT";
ProtocolFinals.CAPTIONSTYLESTYLES                    = "CAPTIONSTYLESTYLES"; // Copied to com.qv.mcic.system.MCIFinals
ProtocolFinals.CAPTIONSTYLEFONTFAMILY                = "CAPTIONSTYLEFONTFAMILY";
ProtocolFinals.CAPTIONSTYLESIZE                      = "CAPTIONSTYLESIZE";
ProtocolFinals.CAPTIONSTYLECOLOR                     = "CAPTIONSTYLECOLOR";
ProtocolFinals.CAPTIONSTYLEBACKGROUNDCOLOR           = "CAPTIONSTYLEBACKGROUNDCOLOR";
ProtocolFinals.FACTOR                                = "FACTOR";
ProtocolFinals.FREEWEBPAGE                           = "FREEWEBPAGE";
ProtocolFinals.GROUPOVERVIEW                         = "GROUPOVERVIEW";
ProtocolFinals.GROUPOVERVIEWINDICATOR                = "GROUPOVERVIEWINDICATOR";
ProtocolFinals.HEIGHT                                = "HEIGHT";
ProtocolFinals.HOMEPAGEHOMEPAGEINSTRUCTION           = "HOMEPAGEHOMEPAGEINSTRUCTION";
ProtocolFinals.HOMEPAGEINSTRUCTION                   = "HOMEPAGEINSTRUCTION";
ProtocolFinals.HORIZONTALALIGNMENT                   = "HORIZONTALALIGNMENT";
ProtocolFinals.HOVER                                 = "HOVER";
ProtocolFinals.IMAGE1                                = "IMAGE1";
ProtocolFinals.IMAGE2                                = "IMAGE2";
ProtocolFinals.IMAGE3                                = "IMAGE3";
ProtocolFinals.IMAGEPICKERINSTRUCTION                = "IMAGEPICKERINSTRUCTION";
ProtocolFinals.IMAGEPICKERSHOWPMIMAGES               = "IMAGEPICKERSHOWPMIMAGES";
ProtocolFinals.IMAGEPICKERTITLE                      = "IMAGEPICKERTITLE";
ProtocolFinals.LEFT                                  = "LEFT";
ProtocolFinals.LEFTRIGHTWINDOWCOLOR                  = "LEFTRIGHTWINDOWCOLOR";
ProtocolFinals.LEFTSPACING                           = "LEFTSPACING";
ProtocolFinals.LOGOBUTTONCAPTION                     = "LOGOBUTTONCAPTION";
ProtocolFinals.MAXNUMBEROFCATEGORIESHORIZONTAL       = "MAXNUMBEROFCATEGORIESHORIZONTAL";
ProtocolFinals.MAXNUMBEROFGROUPSHORIZONTAL           = "MAXNUMBEROFGROUPSHORIZONTAL";
ProtocolFinals.MAXNUMBEROFGROUPSVERTICAL             = "MAXNUMBEROFGROUPSVERTICAL";
ProtocolFinals.MENU                                  = "MENU";
ProtocolFinals.MESSAGEARTICLENUMBERREQUIRED          = "MESSAGEARTICLENUMBERREQUIRED";
ProtocolFinals.MESSAGECREATENEWVERSION               = "MESSAGECREATENEWVERSION";
ProtocolFinals.MESSAGEMAXPUBLICSHOPS                 = "MESSAGEMAXPUBLICSHOPS";
ProtocolFinals.MESSAGEMAXSHOPINSHOPS                 = "MESSAGEMAXSHOPINSHOPS";
ProtocolFinals.MESSAGENOCUSTOMERSFORSHOPINSHOP       = "MESSAGENOCUSTOMERSFORSHOPINSHOP";
ProtocolFinals.MESSAGENOPUBLICSHOP                   = "MESSAGENOPUBLICSHOP";
ProtocolFinals.MESSAGENOSHOPINSHOPSUPPORT            = "MESSAGENOSHOPINSHOPSUPPORT";
ProtocolFinals.MODULESPACING                         = "MODULESPACING";
ProtocolFinals.NOREPEAT                              = "NOREPEAT";
ProtocolFinals.NORMAL                                = "NORMAL";
ProtocolFinals.NUMBEROFITEMSPERROW                   = "NUMBEROFITEMSPERROW";
ProtocolFinals.NUMBEROFROWSPERPAGE                   = "NUMBEROFROWSPERPAGE";
ProtocolFinals.OPMADD                                = "OPMADD";
ProtocolFinals.OPMCMYK                               = "OPMCMYK";
ProtocolFinals.OPMCOMMENT                            = "OPMCOMMENT";
ProtocolFinals.OPMDELETE                             = "OPMDELETE";
ProtocolFinals.OPMLOGOSELECTOR                       = "OPMLOGOSELECTOR";
ProtocolFinals.OPMPANTON                             = "OPMPANTON";
ProtocolFinals.OPMPOSITIONER                         = "OPMPOSITIONER";
ProtocolFinals.OPMTITLE                              = "OPMTITLE";
ProtocolFinals.OPMUPLOAD                             = "OPMUPLOAD";
ProtocolFinals.OPMUPLOADDESCRIPTION                  = "OPMUPLOADDESCRIPTION";
ProtocolFinals.OPMUPLOADINSTRUCTION                  = "OPMUPLOADINSTRUCTION";
ProtocolFinals.OPMUPLOADTITLE                        = "OPMUPLOADTITLE";
ProtocolFinals.OPMZONESELECTOR                       = "OPMZONESELECTOR";
ProtocolFinals.OPMZOOM                               = "OPMZOOM";
ProtocolFinals.OPMSELECT                             = "OPMSELECT";
ProtocolFinals.OPMDEFAULT                            = "OPMDEFAULT";
ProtocolFinals.OPMDRAGLOGO                           = "OPMDRAGLOGO";
ProtocolFinals.OPMUNDO                               = "OPMUNDO";
ProtocolFinals.OPMPRINTMETHODS                       = "OPMPRINTMETHODS";
ProtocolFinals.OPMSAVE                               = "OPMSAVE";
ProtocolFinals.OPMCANCEL                             = "OPMCANCEL";
ProtocolFinals.OPMSELECTMETHOD                       = "OPMSELECTMETHOD";
ProtocolFinals.OPMHELP                               = "OPMHELP";
ProtocolFinals.OPMINSTRUCTION                        = "OPMINSTRUCTION";
ProtocolFinals.OPMMESSAGENOZONE                      = "OPMMESSAGENOZONE";
ProtocolFinals.OPMMESSAGESAVECHANGES                 = "OPMMESSAGESAVECHANGES";
ProtocolFinals.OPMMESSAGESELECTPRINTMETHOD           = "OPMMESSAGESELECTPRINTMETHOD";
ProtocolFinals.PERCENTAGE                            = "PERCENTAGE";
ProtocolFinals.PREVIEW                               = "PREVIEW";
ProtocolFinals.PRICECALCULATIONSTEP1                 = "PRICECALCULATIONSTEP1";
ProtocolFinals.PRICECALCULATIONSTEP2                 = "PRICECALCULATIONSTEP2";
ProtocolFinals.PRICECALCULATIONSTEP3                 = "PRICECALCULATIONSTEP3";
ProtocolFinals.PRICECALCULATIONSTEP4                 = "PRICECALCULATIONSTEP4";
ProtocolFinals.PRICECALCULATIONSTEP5                 = "PRICECALCULATIONSTEP5";
ProtocolFinals.PRICECALCULATIONSTEP6                 = "PRICECALCULATIONSTEP6";
ProtocolFinals.PRODUCTLAYOUT                         = "PRODUCTLAYOUT";
ProtocolFinals.PRODUCTOVERVIEW                       = "PRODUCTOVERVIEW";
ProtocolFinals.PRODUCTOVERVIEWINDICATOR              = "PRODUCTOVERVIEWINDICATOR";
ProtocolFinals.REPEAT                                = "REPEAT";
ProtocolFinals.REPEATLABEL                           = "REPEATLABEL";
ProtocolFinals.REPEATX                               = "REPEATX";
ProtocolFinals.REPEATY                               = "REPEATY";
ProtocolFinals.REPORTCAPTION_GENERALTOTAL            = "REPORTCAPTION_GENERALTOTAL";
ProtocolFinals.REPORTCAPTION_PARAMETERS              = "REPORTCAPTION_PARAMETERS";
ProtocolFinals.REPORTCAPTION_RUNDATE                 = "REPORTCAPTION_RUNDATE";
ProtocolFinals.RIGHT                                 = "RIGHT";
ProtocolFinals.SIZE                                  = "SIZE";
ProtocolFinals.SPACING                               = "SPACING";
ProtocolFinals.SPECIFICBUTTONS                       = "SPECIFICBUTTONS";
ProtocolFinals.TOP                                   = "TOP";
ProtocolFinals.VERTICALALIGNMENT                     = "VERTICALALIGNMENT";
ProtocolFinals.VIEW                                  = "VIEW";
ProtocolFinals.WATERMARK                             = "WATERMARK";
ProtocolFinals.WIDTH                                 = "WIDTH";
ProtocolFinals.WINDOWWIDTH                           = "WINDOWWIDTH";
ProtocolFinals.WEBPAGE                               = "WEBPAGE";
ProtocolFinals.WEBPAGEPICKERINSTRUCTION              = "WEBPAGEPICKERINSTRUCTION";
ProtocolFinals.WEBPAGEPICKERTITLE                    = "WEBPAGEPICKERTITLE";
ProtocolFinals.WEBPAGEPICKERTITLEIMAGES              = "WEBPAGEPICKERTITLEIMAGES";
ProtocolFinals.WELCOMEIMAGEINDICATOR                 = "WELCOMEIMAGEINDICATOR";
ProtocolFinals.WELCOMELAYOUT                         = "WELCOMELAYOUT";
ProtocolFinals.WELCOMELAYOUTIMAGEBOTTOM              = "WELCOMELAYOUTIMAGEBOTTOM";
ProtocolFinals.WELCOMELAYOUTIMAGETOP                 = "WELCOMELAYOUTIMAGETOP";
ProtocolFinals.WELCOMETEXTINDICATOR                  = "WELCOMETEXTINDICATOR";

ProtocolFinals.PARAM_COLUMNNUMBER                    = "PARAM.COLUMNNUMBER";
ProtocolFinals.PARAM_COMPONENTS                      = "PARAM.COMPONENTS";
ProtocolFinals.PARAM_COMPONENTID                     = "PARAM.COMPONENTID";
ProtocolFinals.PARAM_CONTROLFIELDS                   = "PARAM.CONTROLFIELDS";
ProtocolFinals.PARAM_CONTROLOBJECTID                 = "PARAM.CONTROLOBJECTID";
ProtocolFinals.PARAM_CONTROLOBJECTS                  = "PARAM.CONTROLOBJECTS";
ProtocolFinals.PARAM_DOMAINS                         = "PARAM.DOMAINS";
ProtocolFinals.PARAM_EXTERNALID                      = "PARAM.EXTERNALID";
ProtocolFinals.PARAM_OBJECTS                         = "PARAM.OBJECTS";
ProtocolFinals.PARAM_OBJECTSML                       = "PARAM.OBJECTSML";
ProtocolFinals.PARAM_PANELID                         = "PARAM.PANELID";
ProtocolFinals.PARAM_NEXTPANELID                     = "PARAM.NEXTPANELID";
ProtocolFinals.PARAM_PANELS                          = "PARAM.PANELS";
ProtocolFinals.PARAM_ROWNUMBER                       = "PARAM.ROWNUMBER";

/***************************************************************************
 * Used in Generic ML popup
 ***************************************************************************/

ProtocolFinals.MLCOLUMNTYPES                                 = "MLCOLUMNTYPES";
ProtocolFinals.MLCOLUMNWIDTHS                                = "MLCOLUMNWIDTHS";
ProtocolFinals.MLCOLUMNHEIGHTS                               = "MLCOLUMNHEIGHTS";
ProtocolFinals.MLCOLUMNMAXLENGTH                             = "MLCOLUMNMAXLENGTH";
ProtocolFinals.READONLY                                      = "READONLY";

ProtocolFinals.SHORTDESCRIPTIONMLBUTTON                      = "SHORTDESCRIPTIONMLBUTTON";
ProtocolFinals.DESCRIPTIONMLBUTTON                           = "DESCRIPTIONMLBUTTON";
//OPM (Apply Your Logo)
ProtocolFinals.CUSTOMERLOGO                    = "CUSTOMERLOGO";
ProtocolFinals.GETONLINEPRINTINGAVAILABLELOGOS = "GETONLINEPRINTINGAVAILABLELOGOS";
ProtocolFinals.GETONLINEPRINTINGZONES          = "GETONLINEPRINTINGZONES";
ProtocolFinals.MODE                            = "MODE";
ProtocolFinals.UPLOADLOGOID                    = "UPLOADLOGOID";
ProtocolFinals.UPLOADLOGOSRC                   = "UPLOADLOGOSRC";
ProtocolFinals.VASPRINTINGDISTRIBUTORID        = "VASPRINTINGDISTRIBUTORID";
ProtocolFinals.VASPRINTINGPRODUCTID            = "VASPRINTINGPRODUCTID";
ProtocolFinals.VASPRINTINGARTICLEID            = "VASPRINTINGARTICLEID";
ProtocolFinals.VASPRINTINGLOGOID               = "VASPRINTINGLOGOID";
ProtocolFinals.VASPRINTINGLOGOXC               = "VASPRINTINGLOGOXC";
ProtocolFinals.VASPRINTINGLOGOYC               = "VASPRINTINGLOGOYC";
ProtocolFinals.VASPRINTINGLOGOWIDTH            = "VASPRINTINGLOGOWIDTH";
ProtocolFinals.VASPRINTINGLOGOHEIGHT           = "VASPRINTINGLOGOHEIGHT";
ProtocolFinals.VASPRINTINGREMARKS              = "VASPRINTINGREMARKS";
ProtocolFinals.VASPRINTINGZONESETID            = "VASPRINTINGZONESETID";
ProtocolFinals.VASPRINTINGZONEID               = "VASPRINTINGZONEID";
ProtocolFinals.VASPRINTINGCMYK1                = "VASPRINTINGCMYK1";
ProtocolFinals.VASPRINTINGCMYK2                = "VASPRINTINGCMYK2";
ProtocolFinals.VASPRINTINGCMYK3                = "VASPRINTINGCMYK3";
ProtocolFinals.VASPRINTINGCMYK4                = "VASPRINTINGCMYK4";
ProtocolFinals.VASPRINTINGPANTON1              = "VASPRINTINGPANTON1";
ProtocolFinals.VASPRINTINGPANTON2              = "VASPRINTINGPANTON2";
ProtocolFinals.VASPRINTINGPANTON3              = "VASPRINTINGPANTON3";
ProtocolFinals.VASPRINTINGPANTON4              = "VASPRINTINGPANTON4";
ProtocolFinals.VASPRINTINGS                    = "VASPRINTINGS";
ProtocolFinals.OPMUPDATE_MODE                  = "OPMUPDATE_MODE";

//MCI
ProtocolFinals.CHANNELS                        = "CHANNELS";
ProtocolFinals.CHANNELTYPEID                   = "CHANNELTYPEID";
ProtocolFinals.EDITABLEINDICATOR               = "EDITABLEINDICATOR";

//QuickEdit
ProtocolFinals.TABS_ACTIVETAB                  = "TABS_ACTIVETAB";
ProtocolFinals.TABS_LAYER                      = "TABS_LAYER";

// keep most used classes short in string length!
ProtocolFinals.CLASS_BOOLEAN                   =     1;
ProtocolFinals.CLASS_INTEGER                   =     2;
ProtocolFinals.CLASS_NULL                      =     3;
ProtocolFinals.CLASS_STRING                    =     4;
ProtocolFinals.CLASS_ROWSET                    =    10;
ProtocolFinals.CLASS_HASHMAP                   =    20;

ProtocolFinals.DATATYPE_NONE                   =     0;
ProtocolFinals.DATATYPE_DECIMAL                =     3;
ProtocolFinals.DATATYPE_VARCHAR                =    12;
ProtocolFinals.DATATYPE_DATE                   =    91;
ProtocolFinals.DATATYPE_TIMESTAMP              =    93;
ProtocolFinals.DATATYPE_CLOB                   =  2005;
ProtocolFinals.DATATYPE_EXTERNALID             = 10002;

ProtocolFinals.MODIFICATIONTYPE                = "MODIFICATIONTYPE";
ProtocolFinals.MODIFICATIONTYPE_NOMODIFICATION =   0;
ProtocolFinals.MODIFICATIONTYPE_DELETE         = 110;
ProtocolFinals.MODIFICATIONTYPE_INSERT         = 120;
ProtocolFinals.MODIFICATIONTYPE_UPDATE         = 130;
ProtocolFinals.MODIFICATIONTYPE_DELETED        = 210;
ProtocolFinals.MODIFICATIONTYPE_INSERTED       = 220;
ProtocolFinals.MODIFICATIONTYPE_UPDATED        = 230;
ProtocolFinals.VALIDINDICATOR                  = "VALIDINDICATOR";
ProtocolFinals.VALIDINDICATOR_TRUE             = "1";
ProtocolFinals.VALIDINDICATOR_FALSE            = "0";

ProtocolFinals.NUMERIC                         = 2;
ProtocolFinals.DECIMAL                         = 3;

ProtocolFinals.FS                              = '\x1C';  // file/field separator (value separator '=')
ProtocolFinals.US                              = '\x1F';  // unit separator       (key separator)

ProtocolFinals.CONTROLOBJECT_CATEGORIZATION_ROOTS                = 184;
ProtocolFinals.CONTROLOBJECT_CATEGORIZATION_TREES                = 185;
ProtocolFinals.CONTROLOBJECT_CATEGORIZATION_ASSIGNEDTOCATEGORIES = 186;
ProtocolFinals.CONTROLOBJECT_SUPPLIERCATEGORYASSIGNMENT          = 187;

ProtocolFinals.DESIGNTYPE_SHOPLAYOUT             = 0;
ProtocolFinals.DESIGNTYPE_PRODUCTOVERVIEW        = 1;
ProtocolFinals.DESIGNTYPE_PRODUCTDETAILS         = 2;
ProtocolFinals.DESIGNTYPE_PRODUCTCOMPARISON      = 3;
ProtocolFinals.DESIGNTYPE_SELECTOR               = 4;
ProtocolFinals.DESIGNTYPE_CUSTOMERREGISTER       = 5;
ProtocolFinals.DESIGNTYPE_CUSTOMERPROFILE        = 6;

ProtocolFinals.LAYOUTTYPE_DEFAULT                = 0;
ProtocolFinals.LAYOUTTYPE_VERTICALMENU           = 1;
ProtocolFinals.LAYOUTTYPE_EXPLORERMENU           = 2;
ProtocolFinals.LAYOUTTYPE_PRODUCTOVERVIEW        = 3;
ProtocolFinals.LAYOUTTYPE_PRODUCTDETAILS         = 4;
ProtocolFinals.LAYOUTTYPE_SELECTOR               = 5;
ProtocolFinals.LAYOUTTYPE_PRODUCTCOMPARISON      = 6;
ProtocolFinals.LAYOUTTYPE_CUSTOMERREGISTER       = 7;
ProtocolFinals.LAYOUTTYPE_CUSTOMERPROFILE        = 8;

if ( typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement)
{
	HTMLElement.prototype.insertAdjacentElement = function(where, parsedNode)
	{
		switch ( where ) {
		case 'beforeBegin':
			this.parentNode.insertBefore(parsedNode, this);
			break;
		case 'afterBegin':
			this.insertBefore(parsedNode, this.firstChild);
			break;
		case 'beforeEnd':
			this.appendChild(parsedNode);
			break;
		case 'afterEnd':
			if ( this.nextSibling && ( this.nextSibling.nodeType == NodeTypes.ELEMENT ) ) {
                this.parentNode.insertBefore(parsedNode, this.nextSibling);
            } else {
                this.parentNode.appendChild(parsedNode);
            }
			break;
		}
	}

	HTMLElement.prototype.insertAdjacentHTML = function(where, htmlStr)
	{
		var r = this.ownerDocument.createRange();
		r.setStartBefore(this);
		var parsedHTML = r.createContextualFragment(htmlStr);
		this.insertAdjacentElement(where, parsedHTML)
	}


	HTMLElement.prototype.insertAdjacentText = function(where, txtStr)
	{
		var parsedText = document.createTextNode(txtStr)
		this.insertAdjacentElement(where, parsedText)
	}
}


var NodeTypes = {
	ELEMENT                : 1 ,
	ATTRIBUTE              : 2 ,
	TEXT                   : 3 ,
	CDATA_SECTION          : 4 ,
	ENTITY_REFERENCE       : 5 ,
	ENTITY                 : 6 ,
	PROCESSING_INSTRUCTION : 7 ,
	COMMENT                : 8 ,
	DOCUMENT               : 9 ,
	DOCUMENT_TYPE          : 10,
	DOCUMENT_FRAGMENT      : 11,
	NOTATION               : 12
}
/**
 * This class holds properties for easy checking of the browser version.
 * Besides it contains wrapper methods that normally would require code like
 * <pre>
 * if(browser.isIE) {
 *     IEfunction();
 * } else if(browser.isNS) {
 *     NSfunction();
 * }
 * </pre>
 * Ultimatly all browser specific javascript functions should be
 * encapsulated in this class.
 *
 * It is currently used by the following classes:
 * <ul>
 * <li>QvExplorerMenu.js
 * <li>QvPopUpMenu.js
 * </ul>
 *
 * 2003-02-25 (EUG): used by pms; added getWindowHeight
 * 2004-04-26 (EJN): added browserCheck for IE on Mac.
 */
function BrowserSmall()
{
	this.DOMcomp = (document.getElementById)?true:false;

	this.isNS4 = (document.layers) ? true : false;
	this.isIE4 = (document.all && !this.DOMcomp) ? true : false;
	this.isIE5 = (document.all && this.DOMcomp)  ? true : false;
	this.isNS6 = (!document.all && this.DOMcomp) ? true : false;

	this.isIEonMac = B_isIEonMac;

	this.getElementById        = B_getElementById;
	this.getImageById          = B_getImageById;
	this.getElementsStyle      = B_getElementsStyle;
	this.setDivVisibility      = B_setDivVisibility;
	this.moveDivTo             = B_moveDivTo;
	this.moveDivBy             = B_moveDivBy;
	this.positionElement       = B_positionElement;

	this.getWindowWidth   = B_getWindowWidth;
	this.getWindowHeight  = B_getWindowHeight;
	this.showMessage      = B_showMessage;

	this.STYLESHOW = (this.isNS4)?'show':'visible';
	this.STYLEHIDE = (this.isNS4)?'hide':'hidden';

	// private
	this.getNS4LayerById = B_getNS4LayerById;

	this.MESSAGETYPE = 1;

	//if(document.images) { this.showMessage('document.images supported'); }
}

	function B_getElementById(sID) {
		var elm = null;
		if (this.DOMcomp)elm = document.getElementById(sID);
		if (this.isIE4)  elm = document.all[sID];
		if (this.isNS4)  {
			elm = this.getNS4LayerById('root',document,sID,1);
			if(!elm) this.showMessage("element not found:" + sID);
		}
		return elm;
	}
		function B_getNS4LayerById(parentID,doc,sID,iDepth) {
			var elm = null;
			var ll = doc.layers.length;
			if(ll==0) { return null; }

			elm = doc.layers[sID];
			if(elm) {
				//this.showMessage('Found ' + sID + ' in ' + parentID);
				return elm;
			}
			//this.showMessage('NOT Found ' + sID + ' in ' + parentID + ' \niDepth=' + iDepth);

			//this.showMessage(parentID + '.layers.length=' + ll + (doc.id?doc.id:' (no id)'));
			for(var i=0; i<ll;i++) {
				subl = doc.layers[i];
				elm = this.getNS4LayerById(subl.name, subl.document, sID, iDepth+1);

				if(iDepth==4) return null;
			}
			return elm;
		}


	function B_getImageById(sID) {
		var img = null;
		if (this.DOMcomp)           img = document.getElementById(sID);
		if (this.isIE4||this.isNS6) img = document.images[sID];
		if (this.isNS4)             img = document.images[sID];
		if(!img) this.showMessage("image not found:" + sID);
		return img;
	}

	function B_getElementsStyle(sID){

		var elm = this.getElementById(sID);
		if(!elm) return null;

		var style = null;
		if(this.DOMcomp || this.isIE4) style = elm.style;
		if( this.isNS4 ) { style = elm; }
		if(!style) this.showMessage("style not found:" + sID);
		return style;
	}

	function B_setDivVisibility(sID,bVisible){
		if(this.isNS4) this.showMessage(sID);
		var sVisibility = bVisible?this.STYLESHOW:this.STYLEHIDE;
		var style = this.getElementsStyle(sID);
		if(style) {
			if(style.visibility!=sVisibility) {
				style.visibility=sVisibility;
			}
		}
	}

	function B_moveDivTo(sID,x,y) {
		var style = this.getElementsStyle(sID);
		if(style) {
			style.left=x;
			style.top =y;
		}
	}

	function B_moveDivBy(sID,x,y) {
		var style = this.getElementsStyle(sID);
		if(style) {
			style.left = parseInt(style.left) + x + "px";
			style.top  = parseInt(style.top)  + y + "px";
		}
	}

	function B_showMessage(sMessage) {
		if(this.MESSAGETYPE==1) {
			window.status = sMessage;
		} else {
			alert(sMessage);
		}
	}

	/** help function for getting window width of the html document */
	function B_getWindowWidth()
	{
		var W;
		if ( browser.isNS4 || browser.isNS6 ) {
            W = window.innerWidth;
		} else {
		    if ( parent.frames.length > 0 ) {
		        //W = document.body.clientWidth;
		        W = document.body.offsetWidth;
		    } else {
		        W = document.body.offsetWidth;
		    }
		}
		return W;
	}

	/** help function for getting window height of the html document */
	function B_getWindowHeight()
	{
		var H;
		if ( browser.isNS4 || browser.isNS6 ) {
		    H = window.innerHeight;
		} else {
		    H = document.body.clientHeight;
		}

		return H;
	}

	function B_positionElement(element, iLeft, iTop, iWidth, iHeight, sVisibility, iBottom, iRight)
	{
	    if ( typeof element == 'string' ) {
	        element = this.getElementById(element);
	    }
	    if ( ! element ) { return; }

	    if ( iLeft != null ) {
	        element.style.left       = iLeft;
	    }
	    if ( iTop != null ) {
	        element.style.top        = iTop;
	    }
	    if ( iWidth != null ) {
	        element.style.width      = iWidth;
	    }
	    if ( iHeight != null ) {
	        element.style.height     = iHeight;
	    }
	    if ( sVisibility != null ) {
	        element.style.visibility = sVisibility;
	    }
	    if ( iBottom != null ) {
	        element.style.bottom     = iBottom;
	    }
	    if ( iRight != null ) {
	        element.style.right     = iRight;
	    }
	}

	var B_sUserAgent = navigator.userAgent.toLowerCase();
	var B_sOS        = null;
	var B_sBrowser   = null;
	var B_sVersion   = null;
	var b_BrowserPlace  = null;
	var b_BrowserString = null;

    var B_BROWSERSAFARI    = 0;
    var B_BROWSEROMNIWEB   = 1;
    var B_BROWSEROPERA     = 2;
    var B_BROWSERWEBTV     = 3;
    var B_BROWSERICAB      = 4;
    var B_BROWSERMSIE      = 5;
    var B_BROWSERKONQUEROR = 6;
    var B_BROWSERNETSCAPE  = 7;
    var B_BROWSERUNKNOWN   = -1;

    var B_OSLINUX    = 0;
    var B_OSUNIX     = 1;
    var B_OSMAC      = 2;
    var B_OSWINDOWS  = 3;
    var B_OSUNKNOWN  = -1;


	if (searchBrowserString('konqueror'))
    {
    	B_sBrowser = B_BROWSERKONQUEROR;
	    B_sOS = B_OSLINUX;
    }
    else if (searchBrowserString('safari') ) B_sBrowser = B_BROWSERSAFARI;
    else if (searchBrowserString('omniweb')) B_sBrowser = B_BROWSEROMNIWEB;
    else if (searchBrowserString('opera')  ) B_sBrowser = B_BROWSEROPERA;
    else if (searchBrowserString('webtv')  ) B_sBrowser = B_BROWSERWEBTV;
    else if (searchBrowserString('icab')   ) B_sBrowser = B_BROWSERICAB;
    else if (searchBrowserString('msie')   ) B_sBrowser = B_BROWSERMSIE;
    else if (!searchBrowserString('compatible'))
    {
	    B_sBrowser = B_BROWSERNETSCAPE
	    B_sVersion = B_sUserAgent.charAt(8);
    }
    else B_sBrowser = B_BROWSERUNKNOWN;

    if (!B_sVersion) B_sVersion = B_sUserAgent.charAt(b_BrowserPlace + b_BrowserString.length);

    if (!B_sOS)
    {
	    if      (searchBrowserString('linux')) B_sOS = B_OSLINUX;
	    else if (searchBrowserString('x11')  ) B_sOS = B_OSUNIX;
	    else if (searchBrowserString('mac')  ) B_sOS = B_OSMAC;
	    else if (searchBrowserString('win')  ) B_sOS = B_OSWINDOWS;
	    else B_sOS = B_OSUNKNOWN;
    }

    function searchBrowserString(string)
    {
        b_BrowserString = string;
	    b_BrowserPlace = B_sUserAgent.indexOf(string) + 1;
	    return b_BrowserPlace;
    }

    function B_isIEonMac()
    {
	return ((B_sOS == B_OSMAC) && (B_sBrowser == B_BROWSERMSIE));
    }

var browser = new BrowserSmall();
//Attach this scripts LogWriterImpl-instance to the top window
//and make it available everywhere on the webpage where this script is loaded

var LogWriter = null;   //start with capital for backwards compatibility with old LogWriter

LogWriter = new LogWriterImpl(); // for firefox problems using top etc  // SJN: THIS IS WRONG!!!

if ( ! LogWriter )
{
    if ( ( window != window.top ) && window.top.LogWriter ) {
        //alert('logWriter known at top');
        LogWriter = window.top.LogWriter;
    } else {
        if ( opener && (typeof opener.location.href != "unknown") && opener.LogWriter ) {
            //alert('logWriter known at opener');
            LogWriter = opener.LogWriter;
        } else {
            //alert('logWriter not known; create new one');
            window.top.LogWriter = new LogWriterImpl(); //Enabled by default
            LogWriter = window.top.LogWriter;
        }
    }
}

/**
 *  This utility-class is a simple clientside JavaScript-logger.
 *  When logging is switched on, the logger displays messages in a separate window
 *
 *  Importing this script in your webpage enables you to write logmessages using
 *  the global object-instance called logWriter. So, to write to the log from anywhere
 *  in your application to help you debug it, use E.g. logWriter.log("This is a message");
 *  For details on the public API, see below.
 *
 *  This class is tested on IE6.0 only
 */
function LogWriterImpl()
{
    //'private' attributes
	var m_oLogWindow         = null;     //debugWindow  = null;          //the window that the logger displays its messages in
	var m_bIsWindowOpen      = false;    //windowIsOpen = false;         //a flag that indicates whether the loggers' window is open or not
	var m_bIsEnabled         = false;    //disabled     = true;          //indicates whether the user wants to see logmessages or not
	var m_bDisplayTimestamp  = true;     //logTime      = false;         //flags whether a timestamp will be added to a logmessage
	var m_bAutoFocus         = false;                                    //flags whether the logging window must request focus when a message is logged

//	var bUseBuffer         = false;    //useBuffer    = false;         //DEPRICATED -- buffering no longer supported
//	var sBuffer            = "";       //buffer       = "";            //DEPRICATED -- buffering no longer supported


    //'public' methods
    this.log                         = NLG_log;                          //LogWriter.log or DW_writeln
    this.logSeparator                = NLG_logSeparator;                 //LogWriter.logSeparator or DW_writeSeparator
    this.logWindowStructure          = NLG_logWindowStructure;           //LogWriter.logWindowStructure
    this.logDebugInformation         = NLG_logDebugInformation;          //DW_showDebugInformation
    this.logEval                     = NLG_logEval;                      //DW_writeEval
    this.logProperties               = NLG_logProperties;                //DW_writeProperties
    this.logMap                      = NLG_logMap;                       //DW_writeMap
    this.logObjectProperties         = NLG_logObjectProperties;          //DW_writeObjectProperties
    this.setDisplayTimestamp         = NLG_setDisplayTimestamp;          //LogWriter.doLogTime
    this.setAutoFocus                = NLG_setAutoFocus;
    this.setEnabled                  = NLG_setEnabled;                   //DW_enable or LogWriter.enable
    this.isEnabled                   = NLG_isEnabled;
    this.clearScreen                 = NLG_clearScreen                   //Erase all messages in log-window - use the buildin-script of m_oLogWindow
    this.appendObject                = NLG_appendObject;                 //used by Communicator.Request.valueOf


    //'Private' methods
    //These nested functions below are not declared as properties of NewLogWriter, so they are not accessible
    //from outside NewLogWriter
    //NLG_openWindow;                                                    //DW_openWindow or LogWriter.openWindow
    //NLG_closeWindow;                                                   //DW_closeWindow or LogWriter.closeWindow
    //NLG_getTimestamp;                                                  //LogWriter.getTime
    //NLG_logStyle;                                                      //LogWriter.logStyle or DW_writeStyle
    //NLG_appendObject;                                                  //LogWriter.appendObject
    //NLG_appendArray;                                                   //LogWriter.appendArray
    //NLG_appendMap;                                                     //LogWriter.appendMap
    //NLG_appendWindow;                                                  //LogWriter.appendWindow
    //NLG_logScriptEngineInformation;                                    //LogWriter.logScriptEngineInformation or DW_showScriptEngineInformation
    //NLG_logWindowInformation;                                          //DW_showWindowInformation
    //NLG_logClientInformation;                                          //DW_showClientInformation
    //NLG_logLocationInformation;                                        //DW_showLocationInformation
    //NLG_logScreenInformation;                                          //DW_showScreenInformation
    //NLG_logDocumentInformation;                                        //DW_showDocumentInformation
    //NLG_logFormInformation;                                            //DW_showFormInformation
    //NLG_logFormElementsInformation;                                    //DW_showFormElementsInformation
    //NLG_logWindowInformation;                                          //DW_showWindowInformation
    //NLG_logFrameInformation;                                           //DW_showFrameInformation
    //NLG_logScriptInformation;                                          //LogWriter.logScriptInformation or DW_showScriptInformation
    //NLG_logScriptEngineInformation;                                    //DW_showScriptEngineInformation

    //Deprecated methods from either LogWriter and DebugWriter
//  this.logEventProperties            = NLG_logEventProperties            //LogWriter.logEventProperties         -- use log
//  this.disable                       = NLG_disable;                      //DW_disable or LogWriter.disable      -- use setEnabled(boolean)
//  this.write                         = NLG_write;                        //DW_write                             -- use log
//  this.writeBuffer                   = NLG_writeBuffer;                  //DW_writeBuffer                       -- buffering no longer supported
//  this.writeToBuffer                 = NLG_writeToBuffer;                //DW_writeToBuffer                     -- buffering no longer supported
//  this.writeArguments                = NLG_writeArguments;               //DW_writeArguments                    -- use log
//  this.showWindow                    = NLG_showWindow;                   //DW_showWindow                        -- use setAutoFocus
//  this.appendPre                     = NLG_appendPre;                    //LogWriter.appendPre or DW.appendPre  -- considered unusefull?
//  this.alert                         = NLG_alert;                        //LogWriter.alert                      -- considered unusefull?

    function NLG_setDisplayTimestamp(bDisplayTimestamp)
    {
        if (typeof bDisplayTimestamp != 'boolean') { return; }
	    m_bDisplayTimestamp = bDisplayTimestamp;
    }

    function NLG_setAutoFocus(bAutoFocus)
    {
        if (typeof bAutoFocus != 'boolean') { return; }
        m_bAutoFocus = bAutoFocus;
    }

    function NLG_setEnabled(bEnable)
    {
	    if (typeof bEnable != 'boolean' ) { return; }
    	m_bIsEnabled = bEnable;

    	// IHE 20050209: added
    	if ( m_bIsEnabled == false ) {
    	    //this.closeWindow();
    	    NLG_closeWindow();
    	}
    }

    function NLG_isEnabled()
    {
        return m_bIsEnabled;
    }

    function NLG_clearScreen()
    {
        if ((m_bIsEnabled == false) || (!m_oLogWindow)){ return; }

        m_oLogWindow.clearScreen.call(m_oLogWindow);
    }

    function NLG_closeWindow()
    {
        if ( m_bIsEnabled == false ) { return; }

        if ( (m_oLogWindow) && (m_oLogWindow.closed == false) )
        {
               m_oLogWindow.close();
               m_bIsWindowOpen = false;
        }
    }

    function NLG_openWindow()
    {
        if ( m_bIsEnabled == false ) { return; }

        if ( ( m_bIsWindowOpen == false )||(!m_oLogWindow ) || ( typeof m_oLogWindow.document == "unknown") )
	    {
            var iWidth = 600;
            m_oLogWindow = window.open('', 'NewLogWriter', 'top=0, left=' + (Math.max(screen.width - iWidth-10, 100)) + ', width=' + iWidth
	    	                               + ', height=screen.height, scrollbars, resizable');
            NLG_logStyle();
            m_bIsWindowOpen = true;      //after this line logging may be started, otherwise an infinate loop occurs that results in a stack overflow
            if (m_oLogWindow)
                NLG_logScriptEngineInformation();
        }

        if ( m_oLogWindow == null )
        {
            // somehow opening window failed... return to prevent js errors
            m_bIsWindowOpen = false;
            return;
        }
    }

    //Internal Utility function to setup the HTML-output formating
    function NLG_logStyle()
    {
        if ( ! m_oLogWindow ) { return; }

        // internal function: do not use writeln() here
        m_oLogWindow.document.writeln('<html>');
        m_oLogWindow.document.writeln('<head><title>LogWriter</title>');
        m_oLogWindow.document.writeln('<script language="JavaScript1.2">');
        m_oLogWindow.document.writeln('function clearScreen() {');
        m_oLogWindow.document.writeln('   var ePre = document.getElementById("content");');
        m_oLogWindow.document.writeln('   ePre.innerHTML="LogWindow cleared. Doubleclick in LogWindow to clear again<BR/>";');
        m_oLogWindow.document.writeln('}   ');
        m_oLogWindow.document.writeln('< /script>');    // SJN: script closing tag gives errors!
        m_oLogWindow.document.writeln('<style>BODY { ');
        m_oLogWindow.document.writeln('FONT-SIZE: 10px; ');
        m_oLogWindow.document.writeln('LINE-HEIGHT: 100%;');
        m_oLogWindow.document.writeln('FONT-FAMILY: Courier,Verdana, Arial;');
        m_oLogWindow.document.writeln('COLOR: black;');
        m_oLogWindow.document.writeln('BACKGROUND-COLOR: #DDDDDD; }');
        m_oLogWindow.document.writeln('</style>');
        m_oLogWindow.document.writeln('</head>');
        m_oLogWindow.document.writeln('<body id="LogBody" ondblclick="clearScreen()"><pre id="content">');
        m_oLogWindow.document.writeln('Doubleclick in LogWindow to clear<BR/>');
    }

    function NLG_log(sPrefix, object)
    {
    	if ( m_bIsEnabled == false ) { return; }
        //REMARKS: DebugWriter used a StringBuffer here (in DW_write). Why? To ensure logging was written even if window could not be opened?

    	NLG_openWindow();
	    if ( m_bIsWindowOpen == false ) { return; }

        var sText = "";
        if (m_bDisplayTimestamp == true)
        {
            sText = NLG_getTimestamp() + " ";
        }
	    if ( sPrefix ) { sText += sPrefix; }
    	if ( arguments.length > 1 )
    	{
		    sText += ": ";
    		sText  = NLG_appendObject(sText, object);
    	}
	    sText += "<br />";          //REMARKS: DebugWriter did not put a newline-mark - it used the separate method DW_writeln

    	m_oLogWindow.document.write(sText);
	    m_oLogWindow.scrollBy(0, 500);               // ? -> scrollIntoView

    	if ( m_bAutoFocus == true )
    	{
           	m_oLogWindow.focus();
        }
    }

    //Internal Utility function to return a formatted timestamp
    function NLG_getTimestamp()
    {
	    var sTimestamp = null;

        if ( m_bDisplayTimestamp == false ) { return ''; }

        var oDate = new Date();

        var iHH  = oDate.getHours();
        var iMM  = oDate.getMinutes();
        var iSS  = oDate.getSeconds();
        var imm  = oDate.getMilliseconds();

        var sHH  = new String( iHH <  10 ? "0"+iHH : iHH );
        var sMM  = new String( iMM <  10 ? "0"+iMM : iMM );
        var sSS  = new String( iSS <  10 ? "0"+iSS : iSS );
        var smm  = new String( imm <  10 ? "0"+imm : imm );

    	while ( smm.length < 3 ) { smm = "0" + smm; }

        sTimestamp = '['+sHH+":"+sMM+':'+sSS+':'+smm+']';

    	return sTimestamp;
    }

    //Internal Utility function to transform objects passed in the log-method into String-representations
    function NLG_appendObject(sText, object)
    {
        if ( typeof object == "undefined" ) {
    		sText += "undefined";
	    } else if ( typeof object == "boolean" ) {
    		sText += object;
	    } else if ( typeof object == "number" ) {
    		sText += object;
	    } else if ( typeof object == "string" ) {
    		sText += object;
	    } else if ( typeof object == "function" ) {
    		sText += object;
    	} else if ( typeof object == "object" ) {
	    	if ( object == null ) {
	    		sText += "null";
		    } else if ( object.constructor == Array ) {
    			sText = NLG_appendArray(sText, object);
	    	} else {
		    	if ( (object.valueOf) && (object.constructor != Object) ) {
			    	sText += object.valueOf();
    			} else {
	    			sText = NLG_appendMap(sText, object);
		    	}
    		}
	    }

    	return sText;
    }

    //Internal Utility function for log-method in order to output arrays
    function NLG_appendArray(sText, array)
    {
	    sText += "{";

        var separator = "";
        for ( var i = 0; i < array.length; i++ )
        {
		    var object = array[i];
		    sText += separator;
            sText = NLG_appendObject(sText, object);
    		separator = ", ";
        }
    	sText += "}";

	    return sText;
    }

    //Internal Utility function for log-method in order to output arrays
    function NLG_appendMap(sText, map)
    {
	    sText += "{";

    	var separator = "";
        for ( var oKey in map )
        {
	    	//var oVal = map.oKey; // IHE: ?? this is always undefined!!

	    	var oVal = null;
            if ( typeof map[oKey] == "unknown" ) {
				// SJN 20050816: unknown ??? -> According to documentation:
				// "There are six possible values that typeof returns: "number", "string", "boolean", "object"
				//                                                   , "function" and "undefined".
				// SJN 20050816: does this work under Firefox etc.?
    	    	oVal = "[unknown]";
            } else {
	        	oVal = map[oKey];
            }


//    		if ( !oVal )
//    		{
//  			try
//              {
//                  oVal = map[oKey];  // gives "Unspecified error with e.g. document.fileCreatedDate
//                  oVal = map[oKey];  // gives "Class doesn't support automation" with e.g. dataFld
//              } catch (Exception e) {
//              }
/*
                oVal = ( typeof oKey == "string" ? map[oKey] : null );
*/
//		    }

            sText += separator + oKey + "=";
            if ( typeof oVal == "undefined" ) {
                sText += "undefined";
            } else if ( typeof oVal == "function" ) {
                sText += "function";                     		// for now: skip functions -> later as optionally
            } else if ( typeof oVal == "object" ) {
                if ( oVal == null ) {
                    sText += "null";
                } else if ( (oVal.valueOf) && (oVal.constructor != Object) ) {
                    sText += oVal;
                }
            } else {
                sText  = NLG_appendObject(sText, oVal);
            }
            separator = ", ";
        }
        sText += "}";

        return sText;
    }

    function NLG_logSeparator()
    {
        NLG_log("****************************************");
    }

    function NLG_logScriptEngineInformation()
    {
        return;     //IE-specific. Disable for now (till universal method is implemented)
        if ( m_bIsEnabled == false ) { return; }

        NLG_log("ScriptEngine                      " , ScriptEngine());
        NLG_log("ScriptEngineMajorVersion          " , ScriptEngineMajorVersion());
        NLG_log("ScriptEngineMinorVersion          " , ScriptEngineMinorVersion());
        NLG_log("ScriptEngineBuildVersion          " , ScriptEngineBuildVersion());
    }

    function NLG_logWindowStructure()
    {
        if ( m_bIsEnabled == false ) { return; }

	    var sText  = null;

    	var top = window.top;
	    if ( ! top ) {
		    sText = "no top window exists";
    	} else {
	        sText = "";
            sText = NLG_appendWindow(sText, top);
        }
        sText += "<br />";

        NLG_log(sText);
        //NLG_openWindow();
        //m_oLogWindow.document.write(sText);
        //m_oLogWindow.scrollBy(0, 500);               // ? -> scrollIntoView
    }

    //Internal Utility function for logWindowStructure-method in order to dump childwindow info
    function NLG_appendWindow(sText, window, iIdent)
    {
        if ( arguments.length == 2 ) { iIdent = 0; }

        var sIndentation = "";
        for ( var i = 0; i < iIdent; i++ ) { sIndentation += " "; }

        if ( !window ) {
            sText += sIndentation + "no child windows <br />";
            return sText;
        }

        var sWindowID   = window.id;
        var sWindowName = window.name;
        var sFrameID    = ( window.frameElement ? window.frameElement.id  : "undefined" );
        var sFrameName  = ( window.frameElement ? window.frameElement.name: "undefined" );
        var sDocumentID = ( window.document ? window.document.id : "undefined" );

        sText += sIndentation + "window.id  : " + sWindowID   + "<br />";
        sText += sIndentation + "window.name: " + sWindowName + "<br />";
        sText += sIndentation + "frame.id   : " + sFrameID    + "<br />";
        sText += sIndentation + "frame.name : " + sFrameName  + "<br />";
        sText += sIndentation + "document.id: " + sDocumentID + "<br />";

        var childwindows = window.frames;
        if ( !childwindows ) { return sText; }

        iIdent += 4;

        //Recursively call child windows to append to output
        var iNumberOfChildWindows = childwindows.length;
        for ( var c = 0; c < iNumberOfChildWindows; c++ )
        {
            var child = childwindows[c];
            sText = NLG_appendWindow(sText, child, iIdent);
        }

        return sText;
    }

    function NLG_logDebugInformation(theWindow)
    {
        if (!theWindow) { return; }

        // from MSDN library -> Web Development -> HTML and Dynamic HTML -> SDK Documentation -> Reference -> Objects -> window
        //m_oLogWindow.document.clear();  // not currently supported
        NLG_log("<PRE>");
        NLG_logScriptEngineInformation();
        NLG_logWindowInformation      (theWindow);
        NLG_logClientInformation      (theWindow.clientInformation);
        NLG_logLocationInformation    (theWindow.location);
        NLG_logScreenInformation      (theWindow.screen);
        NLG_logDocumentInformation    (theWindow.document);
        NLG_log("</PRE>");
    }

    function NLG_logWindowInformation(theWindow)
    {
        NLG_log("");
        NLG_log("WINDOW INFORMATION");
        NLG_log("window.closed                      : " + theWindow.closed);
        NLG_log("window.defaultStatus               : " + theWindow.defaultStatus);
        NLG_log("window.frameElement                : " + theWindow.frameElement);
        NLG_log("window.screenLeft                  : " + theWindow.screenLeft);
        NLG_log("window.screenTop                   : " + theWindow.screenTop);
        NLG_log("window.status                      : " + theWindow.status);
        NLG_log("window.top                         : " + theWindow.top);
    }

    function NLG_logClientInformation(clientInformation)
    {
        NLG_log("");
        NLG_log("CLIENT INFORMATION");
        NLG_log("window.navigator.appCodeName       : " + clientInformation.appCodeName);
        NLG_log("window.navigator.appMinorVersion   : " + clientInformation.appMinorVersion);
        NLG_log("window.navigator.appName           : " + clientInformation.appName);
        NLG_log("window.navigator.appVersion        : " + clientInformation.appVersion);
        NLG_log("window.navigator.browserLanguage   : " + clientInformation.browserLanguage);
        NLG_log("window.navigator.cookieEnabled     : " + clientInformation.cookieEnabled);
        NLG_log("window.navigator.cpuClass          : " + clientInformation.cpuClass);
        NLG_log("window.navigator.onLine            : " + clientInformation.onLine);
        NLG_log("window.navigator.platform          : " + clientInformation.platform);
        NLG_log("window.navigator.systemLanguage    : " + clientInformation.systemLanguage);
        NLG_log("window.navigator.userAgent         : " + clientInformation.userAgent);
        NLG_log("window.navigator.userLanguage      : " + clientInformation.userLanguage);
    //	NLG_log("window.navigator.javaEnabled       : " + clientInformation.javaEnabled());
    //	NLG_log("window.navigator.taintEnabled      : " + clientInformation.taintEnabled());

        // TODO -> log collection of plugins
        // TODO -> log userProfile object
    }

    function NLG_logLocationInformation(location)
    {
        NLG_log("");
        NLG_log("LOCATION INFORMATION");
        NLG_log("window.location.hash              : " + location.hash);
        NLG_log("window.location.host              : " + location.host);
        NLG_log("window.location.hostname          : " + location.hostname);
        NLG_log("window.location.href              : " + location.href);
        NLG_log("window.location.pathname          : " + location.pathname);
        NLG_log("window.location.port              : " + location.port);
        NLG_log("window.location.protocol          : " + location.protocol);
        NLG_log("window.location.search            : " + location.search);
    }

    function NLG_logScreenInformation(screen)
    {
        NLG_log("");
        NLG_log("SCREEN INFORMATION");
        NLG_log("window.screen.availHeight         : " + screen.availHeight);
        NLG_log("window.screen.availWidth          : " + screen.availWidth);
        NLG_log("window.screen.bufferDepth         : " + screen.bufferDepth);
        NLG_log("window.screen.colorDepth          : " + screen.colorDepth);
        NLG_log("window.screen.deviceXDPI          : " + screen.deviceXDPI);
        NLG_log("window.screen.deviceYDPI          : " + screen.deviceYDPI);
        NLG_log("window.screen.fontSmoothingEnabled: " + screen.fontSmoothingEnabled);
        NLG_log("window.screen.height              : " + screen.height);
        NLG_log("window.screen.width               : " + screen.width);
        NLG_log("window.screen.logicalXDPI         : " + screen.logicalXDPI);
        NLG_log("window.screen.logicalYDPI         : " + screen.logicalYDPI);
        NLG_log("window.screen.updateInterval      : " + screen.updateInterval);
    }

    function NLG_logDocumentInformation(document)
    {
        NLG_log("");
        NLG_log("DOCUMENT INFORMATION");

        // attributes/properties
        NLG_log("document.activeElement            : " + document.activeElement);
        NLG_log("document.alinkColor               : " + document.alinkColor);
        NLG_log("document.bgColor                  : " + document.bgColor);
        NLG_log("document.charSet                  : " + document.charSet);
        NLG_log("document.cookie                   : " + document.cookie);
        NLG_log("document.defaultCharSet           : " + document.defaultCharSet);
        NLG_log("document.designMode               : " + document.designMode);
        NLG_log("document.dir                      : " + document.dir);
        NLG_log("document.doctype                  : " + document.doctype);
        NLG_log("document.documentElement          : " + document.documentElement);
        NLG_log("document.domain                   : " + document.domain);
        NLG_log("document.expando                  : " + document.expando);
        NLG_log("document.fgColor                  : " + document.fgColor);
        NLG_log("document.fileCreatedDate          : " + document.fileCreatedDate);
        NLG_log("document.fileModifiedDate         : " + document.fileModifiedDate);
        NLG_log("document.fileSize                 : " + document.fileSize);
        NLG_log("document.implementation           : " + document.implementation);
        NLG_log("document.lastModified             : " + document.lastModified);
        NLG_log("document.linkColor                : " + document.linkColor);
        NLG_log("document.vlinkColor               : " + document.vlinkColor);
        NLG_log("document.parentWindow             : " + self);
        NLG_log("document.protocol                 : " + document.protocol);
        NLG_log("document.readyState               : " + document.readyState);
        NLG_log("document.referrer                 : " + document.referrer);
        NLG_log("document.uniqueID                 : " + document.uniqueID);
        NLG_log("document.URL                      : " + document.URL);
        NLG_log("document.URLUnencoded             : " + document.URLUnencoded);
        NLG_log("document.XMLDocument              : " + document.XMLDocument);
        NLG_log("document.XSLDocument              : " + document.XSLDocument);

        // collections
        NLG_log("");
        NLG_log("DOCUMENT INFORMATION -> COLLECTIONS");

        // collections -> forms
        var forms = document.forms;
        NLG_log("# FORMS: " + forms.length);
        for (var i = 0; i < forms.length; i++)
        {
            var form = forms[i];
            NLG_logFormInformation(form);
            NLG_log("");

            // collections -> input etc.
        }

        // collections -> scripts
        var scripts = document.scripts;
        NLG_log("# SCRIPTS: " + scripts.length);
        for (var i = 0; i < scripts.length; i++)
        {
            var script = scripts[i];
            NLG_logScriptInformation(script);
            NLG_log("");
        }

        // collections -> frames
        var frames = document.frames;
        NLG_log("# FRAMES: " + frames.length);
        for (var i = 0; i < frames.length; i++)
        {
            var frame = frames[i];
            NLG_logFrameInformation(frame);
            NLG_log("");
        }

        // objects

        // objects
        //NLG_log("");
        //NLG_log("DOCUMENT INFORMATION -> OBJECTS");
        //NLG_log("document.location                 : " + document.location);
        //NLG_log("document.title                    : " + document.title);
    }

    function NLG_logFormInformation(form)
    {
        NLG_log("");
        NLG_log("FORM INFORMATION");
        NLG_log("document.form.name                 : " + form.name);
        NLG_log("document.form.action               : " + form.action);
        NLG_log("document.form.encoding             : " + form.encoding);
        NLG_log("document.form.enctype              : " + form.enctype);
        NLG_log("document.form.method               : " + form.method);

        var elements = form.elements;
        NLG_log("form.elements              : " + elements);
        NLG_log("form.elements.length       : " + elements.length);

        NLG_logFormElementsInformation(elements);
    }

    function NLG_logFormElementsInformation(elements)
    {
        for (var i = 0; i < elements.length; i++)
        {
            var element = elements[i];
            NLG_log("form.element              : " + element);
            NLG_log("form.element.className    : " + element.className);
            NLG_log("form.element.name         : " + element.name);
            NLG_log("form.element.type         : " + element.type);
            NLG_log("form.element.value        : " + element.value);

    /*
            if ( element instanceof input ) {
                NLG_log("form.element.name              : " + element.name);
                NLG_log("form.element.type              : " + element.type);
                NLG_log("form.element.value             : " + element.value);
            } else if ( element instanceof button ) {
                NLG_log("form.element.name              : " + element.name);
                NLG_log("form.element.type              : " + element.type);
                NLG_log("form.element.value             : " + element.value);
            } else if ( element instanceof select ) {
            } else if ( element instanceof textArea ) {
            }
    */
            NLG_log("");
        }
    }

    function NLG_logFrameInformation(frame)
    {
        // N.B. coming from document.frames collection -> A WINDOW!!!
        var frameElement = frame.frameElement;

        NLG_log("");
        NLG_log("FRAME INFORMATION");
        NLG_log("frame.id                           : " + frameElement.id);
        NLG_log("frame.name                         : " + frameElement.name);
        NLG_log("frame.nodeName                     : " + frameElement.nodeName);
        NLG_log("frame.ownerDocument                : " + frameElement.ownerDocument);
    }

    function NLG_logScriptInformation(script)
    {
        NLG_log("");
        NLG_log("SCRIPT INFORMATION");
        NLG_log("document.script.src                : " + script.src);
        NLG_log("document.script.text               : " + script.text);
        NLG_log("document.script.type               : " + script.type);
    }

    function NLG_logEval(sEval)
    {
    	NLG_log(sEval + ' : ' + eval(sEval) );
    }

	function NLG_logProperties(oObject, sObject, saProperties)
	{
	    if ((!saProperties) || (!oObject)) { return; }
	    if (typeof sObject != "string") { sObject = "unspecified"; }

		for ( var i = 0 ; i< saProperties.length; i++ ) {
			var sProperty = saProperties[i];
			var sValue    = eval( 'oObject.' + sProperty );
    		NLG_log(sObject + '.' + sProperty + ' : ' + sValue );
    	}
	}

    function NLG_logObjectProperties(s, obj, sPrefix)
    {
        var propertyList = new Array();
        for (property in obj) {
        	var sPropName = String(property);
        	if ( sPrefix && sPropName.startsWith(sPrefix) == false ) { continue; }
            propertyList[propertyList.length] = sPropName;
        }
        propertyList.sort();
        for (i = 0; i < propertyList.length; i++) {
            property = String(propertyList[i]);
            try {
                value = String(obj[propertyList[i]]);
            } catch (exception) {
                value = "<i>" + String(exception) + "</i>";
            }
            var iMaxLength = 100;
            if ( value.length < iMaxLength ) {
                NLG_log(s + '.' + property + " = " + value + '<br/>');
            } else {
                NLG_log(s + '.' + property + " = " + value.substring(0, Math.min(Math.max(0, value.indexOf('\n')), iMaxLength))+ " [More...]");
            }
        }
    }

    function NLG_logMap(s, map)
    {
		NLG_log(s);
		for (var key in map)
		{
			var value = map[key];
			if ( value.length ) {
				value = String(value) + " (" + value.length + ")";
			}
			NLG_log('\t' + key + " = " + value);
		}
    }
}
d=document;l=d.layers;op=navigator.userAgent.indexOf('Opera')!=-1;
function getElementNL(e,f)
{
    if(d.getElementById)return d.getElementById(e);
    if(l)
    {
        f=(f)?f:self;
        var V=f.document.layers;
        if(V[e])return V[e];
        for(var W=0;W<V.length;)t=getElement(e,V[W++]);
        return t;
    }
    if(d.all)return d.all[e];
    return d.getElementById(e);
}
//function showElement(e){l?e.visibility='show':e.style.visibility='visible';}
function showElement(e)
{
	e=id2Element(e);
if ( e.outerHTML ) {
	//alert("[showElement] e html: " + e.outerHTML);
} else if ( e.outerText ) {
	//alert("[showElement] e text: " + e.outerText);
} 
	( l ? e.visibility='show' : e.style.visibility='inherit' );
}
function blockElement(e){e=id2Element(e);l?e.display='block':e.style.display='block';}

function hideElement(e){e=id2Element(e);l?e.visibility='hide':e.style.visibility='hidden';}
function unblockElement(e){e=id2Element(e);l?e.display='none':e.style.display='none';}
function setZIndex(e,z){e=id2Element(e);l?e.zIndex=z:e.style.zIndex=z;}
function setX(e,x){e=id2Element(e);l?e.left=x:op?e.style.pixelLeft=x:e.style.left=x;}
function setY(e,y){e=id2Element(e);l?e.top=y:op?e.style.pixelTop=y:e.style.top=y;}
function setClass(e,c){e=id2Element(e);e.className=c;}
function setWidth(e,w){e=id2Element(e);l?e.clip.width=w:op?e.style.pixelWidth=w:e.style.width=w;}
function setHeight(e,h){e=id2Element(e);l?e.clip.height=h:op?e.style.pixelHeight=h:e.style.height=h;}
function setClip(e,t,r,b,x){e=id2Element(e);l?(X=e.clip,X.top=t,X.right=r,X.bottom=b,X.left=x):e.style.clip='rect('+t+' '+r+' '+b+' '+x+')';}
function writeHTML(e,h){e=id2Element(e);if(!e){return;}if(l){Y=e.document;Y.open();Y.write(h);Y.close();}else if(e.innerHTML)e.innerHTML=h;}
function createElement(i){if(l){d.layers[i]=new Layer(0);eval("document."+i+"=d.layers[i]");}else{if(typeof d.createElement!='undefined'){X="<div id='"+i+"' style=\"position:absolute\">&nbsp;</div>";Y=d.createElement("DIV");if(Y){Y.innerHTML=X;d.body.appendChild(Y);}else if(typeof d.body.insertAdjacentHTML!='undefined')d.body.insertAdjacentHTML("BeforeEnd",X);}}}
function id2Element(e)
{
    if(typeof e == "string") { return getElement(e); }
    return e;
}
function writeHtmlNL(e,h)
{
	e=id2Element(e);
	if ( ! e ) { return; }
	writeHTML(e,h);
}
function hideAndUnblockElement(e)
{
	e=id2Element(e);
	if ( ! e ) { return; }

    hideElement(e);
    unblockElement(e);
}
function showAndBlockElement(e)
{
	e=id2Element(e);
//alert("[showAndBlockElement] e: " + e);
	if ( ! e ) { return; }

    showElement(e);
    blockElement(e);
}
function getElement(sID)
{
	var e = getElementNL(sID);
	logIfNotFound(sID, e);
	return e;
}
function getParentElementRecursive(e, sTagName)
{
    var p = e;
    while( p.tagName.toLowerCase() != sTagName ) {
        p = p.parentNode;
    }
    return p;
}

function logIfNotFound(sID, e)
{
	if(e!=null) { return; }
    if(LogWriter) {
        LogWriter.log('not found:' + sID);
    } else {
        alert('not found:' + sID);
    }
}
function changeImage(e, sSrc)
{
	e=id2Element(e);
    if(LogWriter) {
        LogWriter.log('not found:' + e);
    } else {
        alert('not found:' + e);
    }
	e.src = sSrc;
}
function changeImageSize(e, iWidth, iHeight)
{
    e=id2Element(e);
    if ( e.style ) { e = e.style; }
    if ( iWidth ) {
        e.width = iWidth + 'px';
    }
    if ( iHeight ) {
        e.height = iHeight + 'px';
    }
}

/**
 * Reduces the with of an image to the specified maximum width. If the current with is smaller than the specified with
 * the widdth is not modified.
 */
function reduceImageWidth(e, iMaximumWidth)
{
    e=id2Element(e);

    var oaFormat = getDisplayedImageDimensions(e);
    var iActualWidth = oaFormat[0];
    if ( e.originalWidth ) {
        iActualWidth = e.originalWidth;
    }

    if ( iActualWidth > iMaximumWidth )
    {
        if ( ! e.originalWidth ) { e.originalWidth = iActualWidth; }

        changeImageSize(e, iMaximumWidth);
        //LogWriter.log(iCurrentWidth + '>' + iMaximumWidth);
        return true;
    }

    return false;
}

function writeImageDimension(eImage, eDimension, sTemplate, bPreloadedImage)
{
    var sDimsensionDescription = getImageDimensionDescription(eImage, sTemplate, bPreloadedImage);
    writeHTML(eDimension, sDimsensionDescription);
}

function getImageDimensionDescription(e, sTemplate, bPreloadedImage)
{
    var sDimension = '';

    var oaFormat = null;
    if ( bPreloadedImage ) {
        oaFormat = [ e.width, e.height ];
    } else {
        oaFormat = getDisplayedImageDimensions(e);
    }

    if ( oaFormat[0] && oaFormat[1] ) {
        var mf = new MessageFormat(sTemplate);
        sDimension = mf.format(oaFormat);
    }

    return sDimension;
}

function getDisplayedImageDimensions(e)
{
    var oaFormat = new Array();
    e=id2Element(e);

    // try with client... properties
    if ( typeof e.clientWidth  != 'undefined' ) { oaFormat[0] = e.clientWidth  }
    if ( typeof e.clientHeight != 'undefined' ) { oaFormat[1] = e.clientHeight }

    if ( ! oaFormat[0] && ! oaFormat[1] )
    {
        // try with style properties
        if ( e.style  ) { e = e.style; }
        if ( typeof e.width  != 'undefined' ) { oaFormat[0] = e.width  }
        if ( typeof e.height != 'undefined' ) { oaFormat[1] = e.height }
    }

    return oaFormat;
}

function changeTDBackground(sID, sUrl)
{
	var td = getElementNL(sID);

	if ( td.background ) {     	// IE 6
		td.background = sUrl;
		return;
	}

	var attrs = td.attributes;
	if ( attrs.background ) {  // NS 6.2
		attrs.background.value = sUrl;
		return;
	}

	if ( td.tagName != 'TD' ) { alert(sID + ' is not a TD'); }
}
function setVisibilityAndDisplay(e, bVisibleAndBlock)
{
	e=id2Element(e);
    if ( bVisibleAndBlock ) {
        showAndBlockElement(e);
    } else {
        hideAndUnblockElement(e);
    }
}
function toggleVisibility(e)
{
	e=id2Element(e);
	var style = e;
    if(style.style) { style = style.style; }
    if(style.visibility=='hide') {
        showElement(e);
        return true;
    } else if(style.visibility=='hidden') {
        showElement(e);
        return true;
    }
	hideElement(e);
	return false;
}
function toggleDisplay(e)
{
	e=id2Element(e);
	if ( e == null ) { return; }
	var style = e;
    if(style.style) { style = style.style; }
    if(style.display=='none') {
        blockElement(e);
        return;
    }
	unblockElement(e);
}
function setDisplay(e, bDisplay)
{
    if ( bDisplay ) {
        blockElement(e);
    } else {
        unblockElement(e);
    }
}
function updateBGColor(e, sColor)
{
    e=id2Element(e);
    if(e.style) { e = e.style; }
    e.backgroundColor = '#FFFFFF';
    if ( document.all ) {
        try {
            e.backgroundColor = sColor;
        } catch (err) {}
    } else {
        e.backgroundColor = sColor;
    }
}

//----------------------------
// Form elements
//----------------------------
function setTextElementValue(sName, sValue)
{
    var e = id2Element(sName);
    if ( e == null && LogWriter ) { LogWriter.log('[DHtml::setTextElementValue] not found : ' + sName) ; }
    if ( e == null ) { return; }

    if ( e.length ) {
        for ( var i=0; i<e.length; i++ ) {
            e[i].value = sValue;
        }
    } else {
        e.value = sValue;
    }
}
function setHiddenElementValue(sName, sValue)
{
    setTextElementValue(sName, sValue);
}
function getElementValue(sName)
{
    //var e = getElement(sName);
    var e = getFormElement(sName);
    if ( e && e.value ) { return e.value; }
    return '';
}
function getFormElement(sName, sFormName)
{
	var fForm = document.forms[0];
	if ( sFormName ) {
		fForm = document.forms[sFormName];
	}
	if ( ! fForm ) { return null; }

	var e = fForm.elements[sName];
	logIfNotFound(sName + "." + sFormName, e);
	return e;
}
function getFormElement(sName)
{
	var e = null;
	for ( var iForm = 0; iForm < document.forms.length; iForm++ )
	{
		var fForm = document.forms[iForm];
		e = fForm.elements[sName];
		if ( e ) { break; }
	}
	logIfNotFound(sName, e);
	return e;
}
function copyFormElement(sSource, sTarget)
{
	var eSource = getFormElement(sSource);
	if ( eSource == null ) { return; }
	var eTarget = getFormElement(sTarget);
	if ( eTarget == null ) { return; }

	if ( eTarget.innerHTML ) {
	    writeHTML(eTarget, eSource.innerHTML);
	}
	if ( eSource.value ) {
		eTarget.value = eSource.value;
	}
	if ( eSource.selectedIndex ) {
		eTarget.selectedIndex = eSource.selectedIndex;
	}
	if ( eSource.type == 'checkbox' ) {
		eTarget.checked = eSource.checked;
	}
}
function copyElementHTML(sSource, sTarget)
{
	var eSource = getElement(sSource);
	if ( eSource == null ) { return; }
	var eTarget = getElement(sTarget);
	if ( eTarget == null ) { return; }

    writeHTML(eTarget, eSource.innerHTML);
}
//----------------------------
// Events
//----------------------------
function addEvent(obj, sEventType, afunction, isCapture)
{
	if (obj.addEventListener) {
    	// W3C DOM
		obj.addEventListener(sEventType, afunction, isCapture);
		return true;
	} else if (obj.attachEvent) {
	    // Internet Explorer
		return obj.attachEvent("on"+sEventType, afunction);
	} else {
	    return false;
	}
}

function removeEvent(obj, sEventType, afunction, isCapture)
{
	if (obj.removeEventListener) {
		obj.removeEventListener(sEventType, afunction, isCapture);
		return true;
	}
	else if (obj.detachEvent) {
		return obj.detachEvent("on"+sEventType, afunction);
	}
	else return false;
}
function getEventSourceElement(event)
{
    if (!event) var event = window.event; // get last event if no object passed IE
    var eSource = event;
    if (event.srcElement)    { eSource = event.srcElement; }   // Internet Explorer
    if (event.currentTarget) { eSource = event.currentTarget; }// W3C DOM
    return eSource;
}
function processEventExample(event)
{
    if (!event) var event = window.event;
    var eSource = getEventSourceElement(event);
	if (event.type=="mouseover") { eSource.style.backgroundColor="#FFFF00"; };
	if (event.type=="mouseout")  { eSource.style.backgroundColor="#FFFFFF"; };
}

//--
//  TEST
//--
var m_loadTimerID    = null;
var m_downloadTarget = null;
function setURL(e,url)
{
    if (!url) return;

    if (document.all) {
        m_downloadTarget = e;
	    writeHTML(e, "<small>loading...<br/>" + url + "</small>");
        e.startDownload(url,downloadComplete);
        //e.startDownload(url, function(sContent) { e.innerHTML=sContent; } );
    } else {
        m_loadTimerID=setInterval('loadTimer('+this.obj+')',250);
        var loadElement=document.getElementById('lpIframe');
        loadElement.src=url;
    }
    e.scrollTop=0;
}
function downloadComplete(sContent)
{
	writeHTML(m_downloadTarget, sContent);
}
function loadTimer(e)
{
	var o=document.getElementById('lpIframe');
	if (o.contentDocument) {
		clearInterval(m_loadTimerID);
		document.body.removeChild(e);
		document.body.appendChild(e);
		e.innerHTML=o.contentDocument.body.innerHTML;
	}
}
function isVisible(e)
{
    e=id2Element(e);
    if ( e == null ) { return false; }

    var sVisibility = l?e.visibility:e.style.visibility;
    return (l?( sVisibility != 'hide'):( sVisibility != 'hidden'));
}
//<!-- Changes:  Sandeep V. Tamhankar (stamhankar@hotmail.com) -->

/* 1.1.2: Fixed a bug where trailing . in e-mail address was passing
            (the bug is actually in the weak regexp engine of the browser; I
            simplified the regexps to make it work).
   1.1.1: Removed restriction that countries must be preceded by a domain,
            so abc@host.uk is now legal.  However, there's still the
            restriction that an address must end in a two or three letter
            word.
     1.1: Rewrote most of the function to conform more closely to RFC 822.
     1.0: Original  */

//<!-- This script and many more are available free online at -->
//<!-- The JavaScript Source!! http://javascript.internet.com -->

//<!-- Begin
function emailCheck (emailStr) {
/* The following pattern is used to check if the entered e-mail address
   fits the user@domain format.  It also is used to separate the username
   from the domain. */
var emailPat=/^(.+)@(.+)$/
/* The following string represents the pattern for matching all special
   characters.  We don't want to allow special characters in the address.
   These characters include ( ) < > @ , ; : \ " . [ ]    */
var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
/* The following string represents the range of characters allowed in a
   username or domainname.  It really states which chars aren't allowed. */
var validChars="\[^\\s" + specialChars + "\]"
/* The following pattern applies if the "user" is a quoted string (in
   which case, there are no rules about which characters are allowed
   and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
   is a legal e-mail address. */
var quotedUser="(\"[^\"]*\")"
/* The following pattern applies for domains that are IP addresses,
   rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
   e-mail address. NOTE: The square brackets are required. */
var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
/* The following string represents an atom (basically a series of
   non-special characters.) */
var atom=validChars + '+'
/* The following string represents one word in the typical username.
   For example, in john.doe@somewhere.com, john and doe are words.
   Basically, a word is either an atom or quoted string. */
var word="(" + atom + "|" + quotedUser + ")"
// The following pattern describes the structure of the user
var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
/* The following pattern describes the structure of a normal symbolic
   domain, as opposed to ipDomainPat, shown above. */
var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")


/* Finally, let's start trying to figure out if the supplied address is
   valid. */

/* Begin with the coarse pattern to simply break up user@domain into
   different pieces that are easy to analyze. */
var matchArray=emailStr.match(emailPat)
if (matchArray==null) {
  /* Too many/few @'s or something; basically, this address doesn't
     even fit the general mould of a valid e-mail address. */
	//alert("Email address seems incorrect (check @ and .'s)")
	return false
}
var user=matchArray[1]
var domain=matchArray[2]

// See if "user" is valid
if (user.match(userPat)==null) {
    // user is not valid
    //alert("The username doesn't seem to be valid.")
    return false
}

/* if the e-mail address is at an IP address (as opposed to a symbolic
   host name) make sure the IP address is valid. */
var IPArray=domain.match(ipDomainPat)
if (IPArray!=null) {
    // this is an IP address
	  for (var i=1;i<=4;i++) {
	    if (IPArray[i]>255) {
	        //alert("Destination IP address is invalid!")
		return false
	    }
    }
    return true
}

// Domain is symbolic name
var domainArray=domain.match(domainPat)
if (domainArray==null) {
	//alert("The domain name doesn't seem to be valid.")
    return false
}

/* domain name seems valid, but now make sure that it ends in a
   three-letter word (like com, edu, gov) or a two-letter word,
   representing country (uk, nl), and that there's a hostname preceding
   the domain or country. */

/* Now we need to break up the domain to get a count of how many atoms
   it consists of. */
var atomPat=new RegExp(atom,"g")
var domArr=domain.match(atomPat)
var len=domArr.length
if (  domArr[domArr.length-1]!='info' &&
    ( ( domArr[domArr.length-1].length<2) || (domArr[domArr.length-1].length>3) ) ) {
   // the address must end in a two letter or three letter word or equal to 'info'.
   //alert("The address must end in a three-letter domain, or two letter country.")
   return false;
}

// Make sure there's a host name preceding the domain.
if (len<2) {
   var errStr="This address is missing a hostname!"
   //alert(errStr)
   return false
}

// If we've gotten this far, everything's valid!
return true;
}
//  End -->
/**
 * Manages a form. Allows
 * - creation of a form (if the specified form does not exist)
 * - adding additional hidden fields.
 * - remove fields.
 * - monitor if the form has been modified
 * - reset
 * - submit
 * - clear
 * - disable elements
 * - find elements
 * QuadroVision
 *
 * (EUG) Note: submitting a dynamically created form does not work in Netscape browsers
 * Add the form to the body, and everything works fine....
 */

/**
 * Constructor.
 */
function FormManager(sFormName, sAction, sVariableName)
{
    // public properties
    //this.constructor = FormManager;

    // private properties
    var m_userEventsAreMonitored      = false;
    var m_eventsAttachedToAllElements = false;
    var m_isSubmitted                 = false;
    var m_isModified                  = false;
    var m_bInputTypesAreAddedDynamicly= false;
    var m_arInputTypesAddedDynamicly  = new Array();
    var m_iFormChangedEventID         = -1;
    var m_iFormCanceledEventID        = -1;
    var m_iFormSubmittedEventID       = -1;
    var m_saFieldsToClear             = null;
    var m_sPrefixOfElementsToSkip     = null;
    var m_sVariableName               = sVariableName || 'unnamed';
    var m_sFormName                   = sFormName;
    var m_isDynamiclyCreated          = false;

    // public methods
    this.addFieldToClear             = FM_addFieldToClear;
    this.addHiddenSubmitImage        = FM_addHiddenSubmitImage;
    this.addInput                    = FM_addInput;
    this.checkUserEvent              = FM_checkUserEvent;
    this.clear                       = FM_clear;
    this.disable                     = FM_disable;
    this.disableElements             = FM_disableElements;
    this.disableElementsByType       = FM_disableElementsByType;
    this.findElement                 = FM_findElement;
    this.findElements                = FM_findElements;
    this.getElement                  = FM_getElement;
    this.getElementValue             = FM_getElementValue;
    this.getFirstTextElement         = FM_getFirstTextElement;
    this.getForm                     = FM_getForm;
    this.getFormName                 = FM_getFormName;
    this.hasNonEmptyInputField       = FM_hasNonEmptyInputField;
    this.isModified                  = FM_isModified;
    this.isSubmitted                 = FM_isSubmitted;
    this.removeDynamiclyAddedFields  = FM_removeDynamiclyAddedFields;
    this.removeInput                 = FM_removeInput;
    this.removeSelectListOption      = FM_removeSelectListOption;
    this.setSelectedOption           = FM_setSelectedOption;
    this.setEventTypesArray          = FM_setEventTypesArray;
    this.getInput                    = FM_getInput;                 // temp(?) added by SJN (20040209)
    this.setInput                    = FM_setInput;
    this.setOnSubmit                 = FM_setOnSubmit;
    this.setPrefixOfElementsToSkip   = FM_setPrefixOfElementsToSkip;
    this.setModified                 = FM_SetModified;
    this.setFocus                    = FM_setFocus;
    this.reset                       = FM_reset;
    this.removePrefix                = FM_removePrefix;
    this.setAction                   = FM_setAction;
    this.setActionField              = FM_setActionField;
    this.setEncType                  = FM_setEncType;
    this.setEventIDs                 = FM_setEventIDs;
    this.communicateEvent            = FM_communicateEvent;
    this.setSelectedRadioButton      = FM_setSelectedRadioButton;
    this.getSelectedRadioButton      = FM_getSelectedRadioButton;
    this.setTarget                   = FM_setTarget;
    this.submit                      = FM_submit;
    this.userEventsAreMonitored      = FM_userEventsAreMonitored;

    // private methods
    this._CreateForm                  = _FM_CreateForm;
    this._logDynamiclyAddedFieldNames = _FM_logDynamiclyAddedFieldNames;


    // initialization
    var m_form = null;
    if ( sFormName.tagName && ( sFormName.tagName.toUpperCase() == 'FORM' ) ) {
        m_form = sFormName;
    } else {
        m_form = document.forms[sFormName];
    }

    if ( !m_form ) {
        this._CreateForm(sFormName, sAction);
        m_isDynamiclyCreated = true;
    }

    /**********************************
     * method implementations
     **********************************/

    function FM_getForm()
    {
        return m_form;
    }

    function FM_getFormName()
    {
        return m_sFormName;
    }

    function FM_isModified()
    {
        return m_isModified;
    }
    function FM_userEventsAreMonitored()
    {
        return m_userEventsAreMonitored;
    }
    function FM_setEventIDs(iFormChangedEventID, iFormCanceledEventID, iFormSubmittedEventID)
    {
        if ( iFormChangedEventID ) {
            m_iFormChangedEventID = iFormChangedEventID;
        }
        if ( iFormCanceledEventID ) {
            m_iFormCanceledEventID = iFormCanceledEventID;
        }
        if ( iFormSubmittedEventID ) {
            m_iFormSubmittedEventID = iFormSubmittedEventID;
        }
    }

    function FM_communicateEvent(iEvent)
    {
        if ( ( typeof eventHandler != 'undefined' ) && ( iEvent != -1 ) ) {
            eventHandler.communicateToTop(iEvent);
        }
    }

    function FM_hasNonEmptyInputField(sName)
    {
        var e = this.getElement(sName);
        if ( !e )                            { return false; }
        if ( typeof e.value == 'undefined' ) { return false; }
        if ( e.value.length == 0 )           { return false; }
        return true;
    }

    function FM_getElementValue(sName)
    {
        var e = this.getElement(sName);
        if ( !e )                            { return null; }
        if ( typeof e.value == 'undefined' ) { return null; }
        return e.value.trim();
    }

    function FM_removeInput(sName)
    {
        var oInput = this.getElement(sName);
        if ( ! oInput ) {
            return false;
        }
        //oInput.removeNode(true);
        oInput.parentNode.removeChild(oInput);  //DSL 20050223: make browser independent
        return true;
    }

    function FM_addInput(sName, sValue, sType, bAdd)
    {
        sType  = sType  || 'hidden';
        bAdd   = bAdd   || false;
        sValue = sValue || '';

        var oInput = this.getElement(sName);

        if ( ( typeof oInput != 'undefined' ) && ( oInput != null ) && ( bAdd == false ) ) {
            var oOldValue = oInput.value;
            oInput.value  = sValue;
        } else {
            if ( ( typeof browser !='undefined' ) && ( browser.isIEonMac() ) ) {
                var m_macDiv = null;
                if ( !m_macDiv ) {
                    m_macDiv = document.getElementById('FORMMANAGER_DIV');
                    if ( !m_macDiv )
                    {
                        m_macDiv = document.createElement('DIV');
                    }
                }
                m_macDiv.innerHTML = '<input id="'+sName+'" name="'+sName+'" type="'+sType+'" value="'+sValue+'" />';
                oInput = m_macDiv.childNodes[0];
            } else {
                oInput = document.createElement('INPUT');
                oInput.name  = sName;
                oInput.type  = sType;
                oInput.value = sValue;
            }

			if ( ! m_form ) {
				alert("failed to set " + sName + " to " + sValue + ", because no form exists, stacktrace:\n" + getStackTrace());
				return null;
			}

            //m_form.insertAdjacentElement('afterBegin', oInput);
            var oInserted = m_form.insertBefore(oInput, m_form.firstChild);
			if ( ! oInserted ) {
				alert("failed to insert input field with " + sName + " and value " + sValue + ", stacktrace:\n" + getStackTrace());
				return null;
			}
            //m_form.appendChild(oInput, m_form.firstChild);

            m_bInputTypesAreAddedDynamicly = true;

            m_arInputTypesAddedDynamicly[m_arInputTypesAddedDynamicly.length] = sName;
            //m_arInputTypesAddedDynamicly.push(sName); // js 5.5

// this._logDynamiclyAddedFieldNames(' x ');
        }

        return oInput;
    }

    function FM_getInput(sName)
    {
        var oInput = this.getElement(sName);

        if ( typeof oInput == 'undefined' ) 
		{
alert("[FormManager::FM_getInput] element " + sName + " not found");
            var elms = m_form.elements;
            for(var i=0; i < elms.length; i++)
            {
                var e = elms[i];
alert("[FormManager::FM_getInput] element " + e);
            }
			return "undefined";
		}

		return oInput.value;
	}

    function FM_setInput(sName, sValue)
    {
        var elm = this.getElement(sName);
        if ( !elm ) {
            return;
        }

        var oOldValue = elm.value;
        if ( elm.type == 'select-one' ) {
            // set select list option
            this.setSelectedOption(elm, sValue);
        } else if ( elm.type == 'select-multiple' ) {
            // set select list options
        } else if ( elm.type == 'radio' ) {
            // set correct radio button
        } else if ( elm.type == 'checkbox' ) {
            // check/uncheck checkbox
            elm.checked = ( elm.defaultValue == sValue );
        } else if ( elm.type == 'text' ) {
            elm.value  = sValue;
        } else if ( elm.type == 'textarea' ) {
            elm.value  = sValue;
        } else if ( elm.type == 'hidden' ) {
            elm.value  = sValue;
        } else {
            elm.value  = sValue;
        }

        return elm;
    }

    function FM_setSelectedOption(sSelectlist,sValue)
    {
        var oSelectList = sSelectlist;
        if(!oSelectList.options) {
            // not a select list, assume a string describing the selectlist was passed in (like document.myformname.myselectlistname)
            oSelectList = this.getElement(sSelectlist);
        }

        // return if no options found: not a select list
        if(!oSelectList || !oSelectList.options) { return; }

        var oOptions = oSelectList.options;
        for ( i = 0; i < oOptions.length ; i++ )
        {
            var oOption = oOptions[i];
            if ( oOption.value == sValue ) {
                oOption.selected = true;
            }
        }
    }

    var m_EventTypeByElementType = null;
    function FM_setEventTypesArray()
    {
        m_EventTypeByElementType = new Array();
        m_EventTypeByElementType['checkbox'  ] = 'click';
        m_EventTypeByElementType['text'      ] = 'keyup'; // TODO: 'keyup' or 'keydown' but filter out keys like tab, shift etc
        m_EventTypeByElementType['textarea'  ] = 'keyup';
        m_EventTypeByElementType['radio'     ] = 'click';
        // m_EventTypeByElementType['select-one'] = 'change'; // not required onChange is added by default
        // m_EventTypeByElementType['select-multiple'] = 'change'; // not required onChange is added by default
    }

    //Elements that start with this prefix will not get the events attached FM_checkUserEvent.
    function FM_setPrefixOfElementsToSkip(sPrefix)
    {
        m_sPrefixOfElementsToSkip = sPrefix;
    }

    function FM_checkUserEvent(sEventType, iStartElement, iStopElement)
    {
        if ( typeof sEventType != 'boolean' ) { // if visible form fields are edited this method should be invoked with (true) as a paramater
            if ( m_eventsAttachedToAllElements ) { return; }
        }

        if ( !sEventType || ( typeof sEventType == 'boolean' ) ) {
            sEventType = 'change'; /* keydown , keyup */
        }

        var sJScheckForAdditionalFields = null;
        var iNumberOfEventsAdded = 0;
        var elms = m_form.elements;
        if ( ! iStartElement ) { iStartElement = 0; }
        if ( ! iStopElement )
        {
            iStopElement  = elms.length;
            if ( iStopElement - iStartElement > 100 )
            {
                iStopElement = Math.min(iStartElement + 100, elms.length);
                sJScheckForAdditionalFields = m_sVariableName + '.checkUserEvent("' + sEventType + '",' + iStopElement + ',' + elms.length + ')';

                m_eventsAttachedToAllElements = false;
//                var fm = this;
//                var sJScheckForAdditionalFields = 'fm.checkUserEvent("' + sEventType + '",' + iStopElement + ',' + elms.length + ')';
//                setTimeout(sJScheckForAdditionalFields, 500);

//                var fmc = this;
//                var sJScheckForAdditionalFields = 'fmc.checkUserEvent("' + sEventType + '",' + iStopElement + ',' + elms.length + ')';
//                fmc.fcue = new Function("/* a */" + sJScheckForAdditionalFields);
//                setTimeout(fmc.fcue, 500);
            }
        }

        var fm = this;
        var f = function() { fm.setModified(); };
        //var f = new Function(m_sVariableName + '.setModified();');
        for (var i = iStartElement; i < iStopElement; i++)
        {
            var elm = elms[i];
            if ( ! elm )        { continue; }
            if ( elm.disabled ) { continue; }

            var sElementName = elm.name;

            if ( m_sPrefixOfElementsToSkip && (sElementName.indexOf(m_sPrefixOfElementsToSkip) == 0) ) { continue; }
            if ( elm.type == 'hidden' ) { continue; }

            // determine event type by type (only happens when this.setEventTypesArray() is invoked before this method )
            if ( m_EventTypeByElementType ) {
                var sAdditionalEventType = m_EventTypeByElementType[elm.type];
                if ( sAdditionalEventType ) {
                    addEvent(elm, sAdditionalEventType, f, false);
                    //eval('elm.on' + sAdditionalEventType + '=f');
                    iNumberOfEventsAdded++;
                }
            }

            addEvent(elm, sEventType, f, false);
            //eval('elm.on' + sEventType + '=f');
            iNumberOfEventsAdded++;

            // save original value to compare with
            if ( ( elm.type == 'text' ) || ( elm.type == 'textarea') ) {
                elm.originalValue = elm.value;
            }
        }
        m_userEventsAreMonitored = true;
        if ( sJScheckForAdditionalFields ) {
            setTimeout(sJScheckForAdditionalFields, 1000);
        } else {
            m_eventsAttachedToAllElements = true;
        }
    }

    function FM_removeDynamiclyAddedFields()
    {
        // remove dynamicly added fields
        for ( var i = m_arInputTypesAddedDynamicly.length-1; i >= 0; i-- )
        {
            var sName = null
            if ( m_arInputTypesAddedDynamicly.pop ) {
                sName = m_arInputTypesAddedDynamicly.pop(); // js 5.5
            } else {
                sName = m_arInputTypesAddedDynamicly[m_arInputTypesAddedDynamicly.length-1];
                m_arInputTypesAddedDynamicly[m_arInputTypesAddedDynamicly.length-1] = null;
                m_arInputTypesAddedDynamicly.length--;
            }
            if ( sName ) {
                if ( this.removeInput(sName) ) {
//LogWriter.log('[' + m_sVariableName + '] removed : ' + sName);
                }
            }
        }
        // this._logDynamiclyAddedFieldNames(' after remove ');
    }

    function FM_reset()
    {
        this.removeDynamiclyAddedFields();

        if ( m_isModified && LogWriter ) { LogWriter.log('[' + m_sVariableName + '::reset] no longer modified'); }
        m_isModified = false;
        m_form.reset();

        if ( LogWriter ) { LogWriter.log('[' + m_sVariableName + '::reset]'); }

        this.communicateEvent(m_iFormCanceledEventID);
    }

    function FM_removePrefix(sFieldName, sPrefixToRemove)
    {
        var fld = document.getElementById(sFieldName);
        if ( !fld ) { return false; }

        var sValue = fld.value;
            sValue = sValue.trim();
        if ( sValue.startsWith(sPrefixToRemove) )
        {
            sValue = sValue.removePrefix(sPrefixToRemove);
            fld.value = sValue;
            return true;
        }
        return false;
    }

    function FM_addFieldToClear(sFieldName)
    {
        if ( m_saFieldsToClear == null) {
            m_saFieldsToClear = new Array();
        }
        m_saFieldsToClear[m_saFieldsToClear.length] = sFieldName;
    }

    function FM_clear()
    {
        var elms = m_form.elements;

        for (var i = 0; i < elms.length; i++)
        {
            var elm = elms[i];

//LogWriter.log(elm.name + ' ' + elm.type);
            if ( elm.type == 'select-one' ) {
                // set select list options to first if it represents an empty value
//LogWriter.log(elm.name + ' ' + elm.options[0].value);
                if ( elm.options[0].value == '' ) {
                    elm.selectedIndex = 0;
                }
                if ( elm.options[0].value == '*' ) {
                    elm.selectedIndex = 0;
                }
            } else if ( elm.type == 'select-multiple' ) {
                // TODO: deselect all
            } else if ( elm.type == 'text' ) {
                elm.value = '';
            } else if ( elm.type == 'textarea' ) {
                elm.value = '';
            } else if ( elm.type == 'hidden' ) {
                // if ( elm.name == 'ACTION' ) { continue; } // never clear the hidden action field
                // elm.value = '';
            }
        }

        if ( m_saFieldsToClear )
        {
            for (var i = 0; i < m_saFieldsToClear.length; i++ )
            {
                var sFieldName = m_saFieldsToClear[i];
                var eField = this.getElement(sFieldName);
                if ( eField ) { eField.value = ''; }
            }
        }

        this.communicateEvent(m_iFormCanceledEventID);
    }

    function FM_setOnSubmit(f) {
        m_form.onsubmit = f;
    }

    function FM_isSubmitted()
    {
        return m_isSubmitted;
    }

	/**
	 * Apparently ('bFromFormOnSubmit') called from form::onsubmit, or e.g. through a button handling code.
	 */
    function FM_submit(bFromFormOnSubmit)
    {
//alert("[FormManager::FM_submit] document  : " + document.id);
//alert("[FormManager::FM_submit] stacktrace: \n" + getStackTrace());
        //m_isSubmitted = true;    // SJN: NO IT'S NOT! -> pure nonsense!!!
        m_isSubmitted = false;     // SJN: should NOT be a global variable

        bFromFormOnSubmit = bFromFormOnSubmit || false;
//alert("[FormManager::FM_submit] bFromFormOnSubmit: " + bFromFormOnSubmit);

//var oForms = document.forms;
//var iNumberOfForms = ( oForms ? oForms.length : 0 );
//alert("[FormManager::FM_submit] iNumberOfForms: " + iNumberOfForms);

//for (var i = 0; i < iNumberOfForms; i++)
//{
//	var oForm = oForms[i];
//	if ( ! oForm ) { continue; }
//alert("[FormManager::FM_submit] oForm: " + oForm.outerHTML);
//}

		if ( bFromFormOnSubmit == false )
		{
			// called e.g. through button or menu handling code

        	// check for possible 'onsubmit' method. Is not automatically invoked when doing a submit via javascript
			var bFormHasOnsubmitHandler = ( m_form.onsubmit ? true : false );
//alert("[FormManager::FM_submit] bFormHasOnsubmitHandler: " + bFormHasOnsubmitHandler);

			var bCanSubmit = false;
			if ( bFormHasOnsubmitHandler )
			{
				// call the onsubmit handler (which can contain e.g. FormValidation) to see if form can be posted
				if ( m_form.onsubmit.call ) {
					bCanSubmit = m_form.onsubmit.call(); // js 5.5
				} else if ( m_form.fireEvent ) {
					bCanSubmit = m_form.fireEvent('onsubmit'); // works in IE 60, not in NS7
				} else {
					bCanSubmit = m_form.onsubmit(); // works in IE60,IE55, NS7, not ideal in IE
					// SJN: not ideal ???  => define "not ideal" 
				}
			} else {
				bCanSubmit = true;
			}
//alert("[FormManager::FM_submit]        bCanSubmit: " + (       bCanSubmit));
//alert("[FormManager::FM_submit] typeof bCanSubmit: " + (typeof bCanSubmit));

			if ( (typeof bCanSubmit == 'boolean') && (bCanSubmit == true) ) 
			{
				m_form.submit(); // IHE 20040326
				m_isSubmitted = true;
			}
		}

        this.communicateEvent(m_iFormSubmittedEventID);

        return true;
    }

    function FM_setTarget(sTarget)
    {
        m_form.target = sTarget;
    }

    function FM_setEncType(sEncType)
    {
        if ( m_form.enctype ) {
            m_form.enctype  = sEncType; // IE6 and later
        }
        if ( m_form.encoding ) {
            m_form.encoding = sEncType;
        }
    }

    function FM_setAction(sAction)
    {
        m_form.action = sAction;
    }

    function FM_setActionField(sAction)
    {
        this.addInput("ACTION", sAction);
    }

    function FM_setSelectedRadioButton(sRadioButtonGroupName, sButtonValue)
    {
        var buttonGroup = m_form.elements[sRadioButtonGroupName];
        if( !buttonGroup && LogWriter ) {
LogWriter.log('[' + m_sVariableName + '::setSelectedRadioButton] button group not found : ' + sRadioButtonGroupName);
        }
        var iLength = ( buttonGroup ? buttonGroup.length : 0 );
//alert("[FormManager::setSelectedRadioButton] iLength: " + iLength);

        //iLength is undefined in case only one radiobutton exists
        if ( !iLength || iLength == 'undefined' ) {
            buttonGroup.checked = true;
            return;
        }

        for( var i = 0; i < iLength; i++) 
		{
            if ( buttonGroup[i].value == sButtonValue ) {
//alert("[FormManager::setSelectedRadioButton] found!");
                buttonGroup[i].checked = true;
                break;
            }
        }
    }

    function FM_getSelectedRadioButton(sRadioButtonGroupName)
    {
        var buttonGroup = m_form.elements[sRadioButtonGroupName];
        if( !buttonGroup && LogWriter ) {
LogWriter.log('[' + m_sVariableName + '::getSelectedRadioButton] button group not found : ' + sRadioButtonGroupName);
        }
        var iLength = buttonGroup.length;

        //iLength is undefined in case only one radiobutton exists
        if ( !iLength || iLength == 'undefined' ) {
            return buttonGroup;
        }

        for( var i = 0; i < iLength; i++) {
            if ( buttonGroup[i].checked ) {
                return buttonGroup[i];
            }
        }
        return null;
    }

    function FM_removeSelectListOption(sSelectListName, sValueToRemove)
    {
        var oSelectList = this.getElement(sSelectListName);
        if ( ! oSelectList ) { return; }

        var oOptions = oSelectList.options;
        for (i=0;i<oOptions.length;i++)
        {
            var oOption = oOptions[i];
            if ( oOption.value==sValueToRemove ) {
                oOptions.remove(i);
            }
        }
    }

    function FM_getElement(sName)
    {
        var oElement = null;

		if ( ! m_form ) {
			alert("[FormManager::FM_getElement] Exception, m_form not OK: " + m_form);
			return null;
		}

        oElement = m_form.elements[sName];

/*
		if ( ! oElement )
		{
			var oaElements = m_form.elements;
			var iNumberOfElements = ( oaElements ? oaElements.length : 0 );
			alert("iNumberOfElements: " + iNumberOfElements);
			for (var i = 0; i < iNumberOfElements; i++)
			{
				var oElement = oaElements[i];
				alert("name: [" + oElement.name + "], same? " + (oElement.name == sName));

			}
		}
*/

        if ( ( ! oElement ) && m_bInputTypesAreAddedDynamicly )
        {
            // this._logDynamiclyAddedFieldNames(sName);

            // Generated form fields are unreachable by a traditional forms.elements[id] call:
            // Explorer simply doesn't enter them in the arrays. So check for them manually

            var elms = m_form.elements;
            for(var i=0; i < elms.length; i++)
            {
                e = elms[i];
                if ( e.name == sName ) { oElement = e; break; }
            }
        }

        return oElement;
    }

    function FM_findElement(sSuffix)
    {
        var oInput = null;

        var elms = m_form.elements;
        for(var i=0; i < elms.length; i++)
        {
            e = elms[i];
            var sName = e.name;
            var sEnd  = sName.substr(sName.length-sSuffix.length);
            if ( sEnd == sSuffix ) { oInput = e; break; }
        }
        return oInput;
    }

    function FM_findElements(sSuffix)
    {
        var oElements = new Array();

        var elms = m_form.elements;
        for(var i=0; i < elms.length; i++)
        {
            e = elms[i];
            var sName = e.name;
            var sEnd  = sName.substr(sName.length-sSuffix.length);
            if ( sEnd == sSuffix ) {
                oElements[oElements.length] = e;
            }
        }
        return oElements;
    }

    // disables/enables elements whit names ending with the specified suffix
    function FM_disableElements(bDisable, sSuffix)
    {
//alert("[FormManager::disableElements] stack: " + getStackTrace());
        var oElements = this.findElements(sSuffix);

		var iNumberOfElements = ( oElements ? oElements.length : 0 );

        for(var i=0; i < iNumberOfElements; i++)
        {
            e = oElements[i];
            e.disabled = bDisable;
        }
    }

    // disables/enables elements of a certain type
    function FM_disableElementsByType(bDisable, sType)
    {
//alert("[FormManager::disableElementsByType] stack: " + getStackTrace());
        var oElements = m_form.elements;

		var iNumberOfElements = ( oElements ? oElements.length : 0 );

        for(var i=0; i < iNumberOfElements; i++)
        {
            e = oElements[i];
            if ( e.type == sType ) {
                e.disabled = bDisable;
            }
        }
    }

    // disables/enables all elements, or one element if a name of an element is specified
    function FM_disable(bDisable, sName)
    {
//alert("[FormManager::disable] stack: " + getStackTrace());
        var oElements = m_form.elements;

		var iNumberOfElements = ( oElements ? oElements.length : 0 );
        for(var i=0; i < iNumberOfElements; i++)
        {
            var e = oElements[i];
            if ( ( ! sName ) || ( e.name == sName ) ) {
                e.disabled = bDisable;
            }
        }
    }

    function FM_getFirstTextElement()
    {
        var firstTextElement = null;

        var elms = m_form.elements;
        for ( var i = 0; i < elms.length; i++ )
        {
            var e = elms[i];
            if ( ! e.type ) { continue; }
            if ( ( e.type == 'text' ) || ( e.type == 'textarea' ) ) {
                firstTextElement = e;
                break;
            }
        }

        return firstTextElement;
    }

    function FM_setFocus(sFieldName)
    {
        var fField = null;
        if ( typeof sFieldName == 'undefined' ) {
            fField = this.getFirstTextElement();
        } else {
            fField = this.getElement(sFieldName);
        }
        if ( fField && fField.focus ) {
            try {
                fField.focus();
            } catch ( err ) {
                if ( LogWriter ) { LogWriter.log('[FormManager::setFocus] failed for : ' + fField.name); }
            }
        }
    }

    function FM_addHiddenSubmitImage(sImageSrc)
    {
        var img = document.createElement('input');
            img.type  = 'image';
            img.src   = sImageSrc;
            img.width = img.height = 0;
//            img.style.visibility = 'hidden'; img.style.display    = 'none'; // does not work: causes enter not to submit form
            img.style.height = img.style.width = 1;
            img.tabIndex = 9999;
//          img.style.border = '1px solid blue'; // just to make it visiblie temporarily for debugging

        var e = this.getFirstTextElement();
        if ( e ) {
            // insert the tiny image directly after first visible text element
            if ( e.nextSibling && ( e.nextSibling.nodeType == NodeTypes.ELEMENT ) ) {
                m_form.insertBefore(img, e.nextSibling );
            } else if ( e.parentNode ) {
                e.parentNode.appendChild(img);
            }
        } else {
            m_form.appendChild(img);
        }

        return img;
    }

    /**
     * e can be either a boolean, or an event. If it is a boolean the m_isModified is set to this value.
     * If it is an event (or null and window.event is defined),
     * the source element triggered the event is available and a possible setModifiedCustom(e) is triggered.
     */
    function FM_SetModified(e)
    {
        if ( typeof e == 'boolean' ) { m_isModified = e; return; }

		// NB: do not return immediatly if parameter is not a boolean, because of setModifiedCustom(e)

        e = window.event; // todo use EventHelper.getEvent(e) for NS (pms needs to be checked when this is done)
        if (!e) {
            m_isModified = true;
        } else {
            var eSource = e.srcElement;
            if ( ( eSource.type == 'text' ) || ( eSource.type == 'textarea') ) {
                if ( eSource.originalValue ) {
                    if ( eSource.originalValue != eSource.value ) {
                        m_isModified = true;
                    }
                } else {
                    m_isModified = true;
                }
            } else {
                m_isModified = true;
            }
        }

        if ( m_isModified ) {
            this.communicateEvent(m_iFormChangedEventID);
        }

        if (!e) { return; }
        if ( typeof setModifiedCustom == 'function' ) {
            setModifiedCustom(e);
        }
    }

    /*********************************
     * private method implementations
     *********************************/

    function _FM_CreateForm(sFormName, sAction)
    {
        m_form        = document.createElement('FORM');
        m_form.method = 'POST';
        m_form.name   = sFormName;
        m_form.action = sAction;
        document.body.insertBefore( m_form, document.body.firstChild );
    }

    function _FM_logDynamiclyAddedFieldNames(sName)
    {
        if ( !LogWriter ) { return; }

        sName = sName || '';
        LogWriter.log('[' + m_sVariableName + '::logDynamiclyAddedFieldNames] : ' + sName);
        LogWriter.log( m_arInputTypesAddedDynamicly.join(", ") );
    }

}
/**
 * Loops through all elements and filters on name and type to find all possible select lists with same name
 */
function setSelected2(sFormName, sSelectListName, sValue)
{
    fForm = document.forms[sFormName];
	var elms = fForm.elements;
	for(var i=0; i < elms.length; i++)
    {
		var elm = elms[i];
		if( ( elm.name==sSelectListName) && (elm.type=='select-one') )
        {
	        setSelected(elm, sValue);
		}
	}
}

function setSelected(sSelectlist,sValue)
{
	var oSelectList = sSelectlist;
	if(!oSelectList.options) {
		// not a select list, assume a string describing the selectlist was passed in (like document.myformname.myselectlistname)
		oSelectList = eval(sSelectlist);
	}

	if(!oSelectList || !oSelectList.options) {
		// return if no options found: not a select list
		return;
	}

	var oOptions = oSelectList.options;
	for (i=0;i<oOptions.length;i++)
	{
		var oOption = oOptions[i];
		if ( oOption.value==sValue ) {
			oOption.selected=true;
		}
	}
}

function addSelectListOptions(selectList, selectListOptions, bAddEmptyOption)
{
	if ( selectList.optionsAreCreated ) { return; }

	var oOptions = selectList.options;
	selectList.optionsAreCreated = true;
	var oPresentOption = null;
	if ( oOptions.length > 0 ) {
		oPresentOption = oOptions[0];
	}
	var iSelectedIndex = -1;

	if ( bAddEmptyOption ) {
		oOptions[oOptions.length] = new Option('', '');
	}

	for ( var i = 0; i < selectListOptions.length; i++ )
	{
		var opt = selectListOptions[i];
		if ( oPresentOption && ( oPresentOption.value == opt.value ) ) {
			iSelectedIndex = oOptions.length;
		}
		if ( oOptions.length ) {
			oOptions[oOptions.length] = new Option(opt.text + ' (' + opt.value + ')', opt.value);
		} else {
			oOptions[0] = opt;
		}
	}
	selectList.selectedIndex = iSelectedIndex;
	if ( oPresentOption ) {
		oOptions[0] = null;
	}
}

function insertOptionAt (select, option, index)
{
	for (var i = select.options.length; i > index; i--) {
		select.options[i] = select.options[i - 1];
	}
	select.options[index] = option;
}

function updateSelectListOptionTextSelectedValue(arraySelectListNameSelectListOptionsName)
{
    for( var i=0; i < arraySelectListNameSelectListOptionsName.length; i++ )
    {
        var oOption = arraySelectListNameSelectListOptionsName[i];
        var sSelectListName         = oOption.text;
        var oSelectList = getElementNL(sSelectListName);
        if ( oSelectList == null ) { continue; }

        var oCurrentOption = null;
        if ( oSelectList.selectedIndex > -1 ) {
            oCurrentOption = oSelectList.options[oSelectList.selectedIndex];
        }
        if ( !oCurrentOption ) { continue; }
        var sSelectListOptionsArray = eval(oOption.value);
        for( var j=0; j < sSelectListOptionsArray.length; j++ )
        {
            var oOption2 = sSelectListOptionsArray[j];
            if ( oOption2.value == oCurrentOption.value ) {
                oCurrentOption.text = oOption2.text + ' (' + oOption2.value + ')';
                break;
            }
        }
    }
}

function updateSelectListTextSelectedOption(sSelectListName, sText)
{
    var oSelectList = getElement(sSelectListName);
    var oCurrentOption = null;
    if ( oSelectList.selectedIndex > -1 ) {
        oCurrentOption = oSelectList.options[oSelectList.selectedIndex];
    }
    if ( !oCurrentOption ) { return; }
    oCurrentOption.text = sText + ' (' + oCurrentOption.value + ')';
}
/**
 * Note: if a email check is defined, the following file must be included: EmailCheck.js
 *       The same goes for VatNumberCheck. When defined (datatype = 10089) then the file VatNumberCheck.js must be included.
 *       These are the responsibilities of the programmer making the UI-windows
 */

function FormValidation()
{
    this.checkFields  = new Array();
    this.checkColumns = new Array();
    this.errors       = "";
    this.errorFields  = "";
    this.language     = new Array();
    this.clsLuhnValue               = new Array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 2, 4, 6, 8, 1, 3, 5, 7, 9 );
    this.stopValidationOnFirstError = false;
    this.validateHiddenFields       = false;

    // methods
    this.initMessageStringsEN   = FV_initMessageStringsEN;
    this.define                 = FV_define;
    this.defineColumn           = FV_defineColumn; // IHE 20040524
    this.undefine               = FV_undefine;
    this.isFormValid            = FV_isFormValid;
    this.passesExpiryDateCheck  = FV_passesExpiryDateCheck;
    this.passesLuhnCheck        = FV_passesLuhnCheck;
    this.isElevenProof          = FV_isElevenProof;
    this.getTotalValue          = FV_getTotalValue;
    this._checkFields           = FV__checkFields;
    this._findField             = FV__findField;

    //EUG: the following variables are not used in the switch part of the FV_isFormValid() function. You can not use
    //these variables, since this will not work in Netscape!
    //Define these values still in order to be able to use them as constants for other purposes!
    this.NODATATYPE        =     0;  // PF.DATATYPE_NODATATYPE
    this.num               =     3;  // PF.DATATYPE_DECIMAL
    this.string            =    12;  // PF.DATATYPE_VARCHAR
    this.timestamp         =    93;  // PF.DATATYPE_TIMESTAMP
    this.shortdateMMYY     = 10000;  // PF.DATATYPE_SHORTDATEMMYY
    this.cc                = 10001;  // PF.DATATYPE_CREDITCARD
    this.external          = 10002;  // PF.DATATYPE_EXTERNAL     (not used in validation)
    this.externalID        = 10002;  // PF.DATATYPE_EXTERNALID   (not used in validation)
    this.countrycode       = 10003;  // PF.DATATYPE_COUNTRYCODE  (only to determine value)
    this.currencycode      = 10004;  // PF.DATATYPE_CURRENCYCODE (only to determine value)
    this.languagecode      = 10005;  // PF.DATATYPE_LANGUAGECODE (only to determine value)
    this.expirydate        = 10006;  // PF.DATATYPE_EXPIRYDATE_MMYY
    this.email             = 10007;  // PF.DATATYPE_EMAILADDRESS
    this.posamount         = 10008;  // PF.DATATYPE_POSITIVEAMOUNT
    this.sex               = 10009;  // PF.DATATYPE_SEX          (only to determine value)
    this.dateyyyymmdd      = 10010;  // PF.DATATYPE_DATE_YYYYMMDD
    this.password          = 10055;  // PF.DATATYPE_PASSWORD
    this.vatnumber         = 10089;  // PF.DATATYPE_VATNUMBER
    this.elevenproof       = 20000;  // PF.DATATYPE_ELEVENPROOF

    this.dateyyyymmdd1     = 10067;  // PF.DATATYPE_DATE
    this.dateyyyymmdd2     = 10068;  // PF.DATATYPE_DATE_WITHDATEPICKERLAYER
    this.dateyyyymmdd3     = 10069;  // PF.DATATYPE_DATE_WITHDATEPICKERWINDOW
    this.editableindicator = 10071;
    this.fileupload        = 10080;  // PF.DATATYPE_FILE
}

/**
 * initializes the message strings with simple default english sentences
 */
function FV_initMessageStringsEN()
{
    // change strings used for error messages
    this.language["start"]     = ''; // "The following error has occurred:\n";
    this.language["header"]    = "Attention!";
    this.language["require"]   = "Field {0} is mandatory.";
    this.language["positions"] = "Field {0} must exist of a minimum of {1} and a maximum of {2} characters.";
    this.language["numeric"]   = "Field {0} must contain a number.";
    this.language["invalid"]   = "{0} is invalid!";
    this.language["minlength"] = "Field {0} has a minimum length of {1} characters.";
    this.language["maxlength"] = "Field {0} has a maximum length of {1} characters.";
    this.language["minvalue"]  = "Field {0} must be at least {1}.";
    this.language["maxvalue"]  = "Field {0} may not exceed {1}.";
}

/**
 * Call this function in the beginning of the page. I.e. onLoad.
 *
 * sInputFieldName : name of the input field (Required)
 * iInputFieldType : string, num, email (Required)
 * bRequired       : required?
 * iMinimumLength  : the value must have at least [iMinimumLength] characters (Optional)
 * iMaximumLength  : the value must have maximum [iMaximumLength] characters (Optional)
 * iMinimumValue   : the numeric value must be at least this amount (Optional)
 * iMaximumValue   : the numeric value may not be larger than this amount (Optional)
 * doc             : document (in case one usage several layers with several forms) (Optional)
 */
function FV_define(sInputFieldName, iInputFieldType, bRequired, sHtmlName, iMinimumLength, iMaximumLength, iMinimumValue, iMaximumValue, doc)
{
    var iQuestionMarkIndex = sInputFieldName.indexOf("?");
    //check for doc==null does not work in Netscape!
    if ( !doc ) { doc = document; }

    if ( (iQuestionMarkIndex > 0) && (parent.frames.length > 0) ) {
        doc             = parent.frames[sInputFieldName.substring(iQuestionMarkIndex+1)].document;
        sInputFieldName = sInputFieldName.substring(0, iQuestionMarkIndex);
    }

    var vField = this._findField(sInputFieldName, doc);

    this.checkFields[this.checkFields.length] = new CheckFieldObject( vField, sInputFieldName, iInputFieldType, bRequired
                                                                 , sHtmlName, iMinimumLength, iMaximumLength
                                                                 , iMinimumValue, iMaximumValue);

    return vField;
}

// find the field by searching all forms for the field name
function FV__findField(sInputFieldName, doc)
{
    if ( !doc ) { doc = document; }

    // find the field by searching all forms for the field name
    var vField;

    // look in forms
	for (var i = 0; !vField && i < doc.forms.length; i++)
	{
		vField = doc.forms[i][sInputFieldName];
	}

    // look in document.all
    if ( !vField && !(vField = doc[sInputFieldName]) && doc.all ) {
        // look in all
        vField = doc.all[sInputFieldName];
    }

    return vField;
}
function FV_defineColumn(sFieldPrefix, sInputFieldName, iInputFieldType, bRequired, sHtmlName, iMinimumLength, iMaximumLength, iMinimumValue, iMaximumValue)
{
    this.checkColumns[this.checkColumns.length] = new CheckColumnObject(sFieldPrefix, sInputFieldName, iInputFieldType, bRequired
                                                                   , sHtmlName, iMinimumLength, iMaximumLength
                                                                   , iMinimumValue, iMaximumValue);
}

function FV_undefine(sInputFieldName)
{
    for ( var i = 0; i < this.checkFields.length; i++ )
    {
        if ( !(this.checkFields[i]) ) { continue; }
        if ( this.checkFields[i].sInputFieldName == sInputFieldName ) {
            this.checkFields[i] = null;
        }
    }
}


/**
 */
function FV_isElevenProof(sValue)
{
    var bIsElevenProof = false;

    if ( isNaN(sValue) ) { return false; }

    var iValueLength = sValue.length;

    switch ( iValueLength )
    {
        case  8:
            return false;
        case  9:
        case 10:
            var iCheckSum   = 0;
            var iDigit      = 0;
            var iWeight     = iValueLength;

            for (i =0; i < iValueLength; i++)
            {
                iDigit = sValue.charCodeAt(i) - 48;
                iCheckSum += (iDigit * iWeight--);
            }
            bIsElevenProof = ((iCheckSum % 11) == 0);
            break;
        default:
            //if the length is not 8-10, then return true, no isElevenProofCheck!!
            return true;
    }

    return bIsElevenProof;
}

/**
 */
function FV_passesLuhnCheck(sNumber)
{
    var bPassesLuhnCheck = false;

    var m = 0;
    var j = sNumber.length - 1;

    for( var k = 0; j >= 0; k = (k != 0 ? 0 : 10) ) {
        c = sNumber.charCodeAt(j);
        m += this.clsLuhnValue[(c - 48) + k];
        j--;
    }

    bPassesLuhnCheck = ((m != 0) && ((m % 10) == 0));

    return bPassesLuhnCheck;
}

/**
 */
function FV_passesExpiryDateCheck(sValue)
{
    if (sValue.length!=4) {return false;}
    var month   = parseInt(sValue.substring(0,2),10);
    if (isNaN(month)) {return false;}
    if (month>12) {return false;}

    var year    = parseInt(sValue.substring(2,4),10);
    if (isNaN(year)) {return false;}

    //if (year.length=1) {year='0'+year}
    if (year<10) {year='0'+year}

    var date    = new Date('20'+year,month-1,'01','01','00','00');

    var today   = new Date();
    today.setHours(0);
    today.setMinutes(0);
    today.setSeconds(0);
    today.setDate(1);

    var maxdate = new Date();
    var currentyear = today.getFullYear();

    maxdate.setYear(currentyear+10);

    return  (date>=today && date<=maxdate);
}

/**
 */
function getMessage(sMessage, fields)
{
    for ( var i=0; i<fields.length; i++ ) {
        var sRegExp="{"+i+"}";
        sMessage = sMessage.replace(sRegExp, fields[i]);
    }

    return sMessage;
}

/**
 */
function FV_isFormValid()
{
    var bIsFormValid = false;

    // check normally defined fields
    this._checkFields(this.checkFields);

    // create fields for column definitions
    for( var c = 0; c < this.checkColumns.length; c++ )
    {
        var checkColumnFields = new Array();
        var checkColumn = this.checkColumns[c];
        for ( var r = 0; r < 30; r++ )
        {
            var sFieldName = checkColumn.sFormFieldPrefix + r + checkColumn.sInputFieldName;
            //var vField = this._findField(sFieldName); // slow....
            var vField = document.getElementById(sFieldName);
            if ( ! vField )             { continue; }
            if ( vField.type=="hidden") { continue; }
            checkColumnFields[checkColumnFields.length] = new CheckFieldObject( vField, checkColumn.sInputFieldName
                                                                , checkColumn.iInputFieldType
                                                                , checkColumn.bRequired
                                                                , checkColumn.sHtmlName
                                                                , checkColumn.iMinimumLength, checkColumn.iMaximumLength
                                                                , checkColumn.iMinimumValue, checkColumn.iMaximumValue);

            this._checkFields(checkColumnFields);
            if ( this.errors != "" ) {
                break; // for performance do not check all other columns
            }
        }
    }

    if ( this.errors != "" ) {
if ( LogWriter ) { LogWriter.log('[FormValidation::isFormValid] errorFields : ' + this.errorFields); }
        alert(this.language["header"].concat("\n" + this.errors));
        this.errors      = "";
        this.errorFields = "";
        bIsFormValid = false;
    } else {
        bIsFormValid = true;
    }

    // IHE 20040319
    if ( bIsFormValid == false ) { return false; }
    if ( typeof isFormValidCustom == "function" ) {
        bIsFormValid = isFormValidCustom();
    }

    return bIsFormValid;
}

function FV__checkFields(checkFields)
{
    var iNumberOfFieldsToCheck = checkFields.length;
    // if ( iNumberOfFieldsToCheck <= 0 ) { return true; } // IHE: 20040329: let it continue so it will pass isFormValidCustom()

    var bFocusHasBeenSet = false;
    for (var i = 0; i < iNumberOfFieldsToCheck; i++)
    {
        var bFieldIsValid = true;

        checkField = checkFields[i];
        if ( !checkField )         { continue; } // object might be 'undefined'

        var field       = checkField.field;
        if ( typeof field == 'undefined' ) { continue; }
        if ( !field )                      { continue; }

        //EUG 20031231: (!field.type) is a valid situation for datatype 10071 (multiple checkboxes
        if ( ( (field.type=="hidden") || (!field.type && checkField.iInputFieldType!=this.editableindicator) )
          && ( this.validateHiddenFields == false ) ) { continue; } // do not validate hidden fields

        var sFieldName     = checkField.sInputFieldName;
        var iFieldType     = checkField.iInputFieldType;
        var sHtmlName      = checkField.sHtmlName;
        var bRequired      = ( (checkField.bRequired == "y") || (checkField.bRequired == true) );
        var iMinimumLength = checkField.iMinimumLength;
        var iMaximumLength = checkField.iMaximumLength;
        var iMinimumValue  = checkField.iMinimumValue;
        var iMaximumValue  = checkField.iMaximumValue;
        var oFieldValue    = null;
        var iFieldLength     = 0;
        var iFieldLengthNotTrimmed = 0;

        // -> check
        if ( field.type == "select" ) {
             oFieldValue  = field.options[field.options.selectedIndex].value;
             iFieldLength = oFieldValue.length;
        } else if ( (iFieldType == this.countrycode) || (iFieldType == this.currencycode) || (iFieldType == this.languagecode) ) {
            if( field.options) {
                var iSelectedIndex = field.options.selectedIndex;
                if ( iSelectedIndex < 0 ) {
                    oFieldValue = "";
                } else {
                    oFieldValue = field.options[field.options.selectedIndex].value;
                }
                iFieldLength = oFieldValue.length;
            } else if ( field.type == "checkbox" ) {
                oFieldValue  = field.value;
                iFieldLength = oFieldValue.length;
            } else {
                oFieldValue  = field.value;
                iFieldLength = (oFieldValue ? oFieldValue.length : 0);
            }
        } else if ( iFieldType == this.sex) {
            oFieldValue  = ((field.value) ? field.value       :"M");
            iFieldLength = oFieldValue.length;
        } else if ( iFieldType == this.editableindicator) {
            oFieldValue  = this.getTotalValue(field);
            iFieldLength = ( oFieldValue == null )?0:1;
        } else {
            oFieldValue  = field.value.trim();
            iFieldLength = (oFieldValue ? oFieldValue.length : 0);
            iFieldLengthNotTrimmed = field.value.length;
        }
        if ( iFieldLengthNotTrimmed == 0 ) { iFieldLengthNotTrimmed = iFieldLength; }

        if ( bRequired && (iFieldLength <= 0) ) {
            this.errors += this.language['start'] + getMessage(this.language['require'],new Array(sHtmlName));
            this.errorFields += field.name;
            bFieldIsValid = false;
            iFieldType = this.NODATATYPE;  // to go in default branch of the switch that follows
        }

        if ( ( bRequired ) || ( iFieldLength > 0 ) ) {
        if ( iMinimumLength && (iFieldLength < iMinimumLength)) {
            this.errors += this.language['start'] + getMessage(this.language['minlength'],new Array(sHtmlName, iMinimumLength));
            this.errorFields += field.name;
            bFieldIsValid = false;
            iFieldType = this.NODATATYPE;  // to go in default branch of the switch that follows
        }
        if ( iMaximumLength && (iFieldLengthNotTrimmed > iMaximumLength) && (iFieldType != this.fileupload) ) {
            this.errors += this.language['start'] + getMessage(this.language['maxlength'],new Array(sHtmlName, iMaximumLength));
            this.errorFields += field.name;
            if ( field.type == 'textarea' ){
                this.errors += '\n(' + iFieldLengthNotTrimmed + ')';
            }

            bFieldIsValid = false;
            iFieldType = this.NODATATYPE;  // to go in default branch of the switch that follows
        }
        }

        if( ( iFieldType == this.num ) || ( iFieldType == this.posamount ) )
        {
            var iFieldValue = parseInt(oFieldValue);
            if ( iMinimumValue && ( iFieldValue < iMinimumValue ) ) {
                this.errors += this.language['start'] + getMessage(this.language['minvalue'],new Array(sHtmlName, iMinimumValue));
                this.errorFields += field.name;
                bFieldIsValid = false;
                iFieldType = this.NODATATYPE;  // to go in default branch of the switch that follows
            }
            if ( iMaximumValue && ( iFieldValue > iMaximumValue ) ) {
                this.errors += this.language['start'] + getMessage(this.language['maxvalue'],new Array(sHtmlName, iMaximumValue));
                this.errorFields += field.name;
                bFieldIsValid = false;
                iFieldType = this.NODATATYPE;  // to go in default branch of the switch that follows
            }
        }

        switch ( iFieldType )
        {
            //EUG: for example case this.num does not work in Netscape4.75!! Always use constants! No variables possible in NS.
            case 3:     // this.numeric
                if ( isNaN(oFieldValue) ) {
                    // an empty string is interpeted as a number: for isNaN('') returns false
                    this.errors += this.language['start'] + getMessage(this.language['numeric'],new Array(sHtmlName));
                    bFieldIsValid = false;
                }
                break;
            case 12:    // string
            case 10003: // countrycode
            case 10004: // currencycode
            case 10005: // languagecode
                break;
            case 10007: // this.email
                if ( (iFieldLength > 0) && (!emailCheck(oFieldValue)) ) {
                    this.errors += this.language['start'] + getMessage(this.language['invalid'],new Array(sHtmlName));
                    bFieldIsValid = false;
                }
                break;
            case 10008: // posamount
                if ( isNaN(oFieldValue) ) {
                    // an empty string is interpeted as a number: for isNaN('') returns false
                    this.errors += this.language['start'] + getMessage(this.language['numeric'],new Array(sHtmlName));
                    bFieldIsValid = false;
                }
                if ( oFieldValue < 0 ) {
                    this.errors += this.language['start'] + getMessage(this.language['invalid'],new Array(sHtmlName));
                    bFieldIsValid = false;
                }
                if ( iMinimumValue && iMaximumValue
                     && (checkField.valInt < checkField.minValue || checkField.valInt > iMaximumValue) ) {
                    this.errors += this.language['start'] + getMessage(this.language['minmax'],new Array(checkField.HTMLname,iMinimumValue,iMaximumValue));
                    bFieldIsValid = false;
                }
                break;
            case 20000: // this.elevenproof
                if ( !this.isElevenProof(oFieldValue) ) {
                    this.errors += this.language['start'] + getMessage(this.language['invalid'],new Array(sHtmlName));
                    bFieldIsValid = false;
                }
                break;
            case 10001:  // this.cc
                 if ( !this.passesLuhnCheck(oFieldValue) ) {
                    this.errors += this.language['start'] + getMessage(this.language['invalid'],new Array(sHtmlName));
                    bFieldIsValid = false;
                }
                break;
            case 10006: // this.expirydate
                if ( !this.passesExpiryDateCheck(oFieldValue) ) {
                    this.errors += this.language['start'] + getMessage(this.language['invalid'],new Array(sHtmlName));
                    bFieldIsValid = false;
                }
                break;
            case 50222: // this.dateyyyymmdd1 // todo currently only defined for PMT
            case 50223: // this.dateyyyymmdd2
            case 50224: // this.dateyyyymmdd3
                //alert('new date field');
            case 10010: // this.dateyyyymmdd
                if ( oFieldValue.length > 0 && iMinimumValue && ( iMinimumValue == '_SYSDATE' ) ) {
                    if ( Date.isYYYYMMDDinFuture(oFieldValue) == false ) {
                        this.errors += this.language['start'] + getMessage(this.language['invalid'],new Array(sHtmlName));
                        bFieldIsValid = false;
                    }
                }
                break;
            case 10071:
                break;
            case 10089:
/*                //Try to dynamically load script (24 Kb, only sparsely needed)
                //Does not properly and consequently work in shops
                if ( (typeof checkVATNumber == "function") == false ) {
                    //Load VAT-number validation only when required and when not already loaded
                    var head     = top.document.getElementsByTagName('head')[0];
		             var script   = top.document.createElement('script');
			            script.src   = ContextFinals.CONTEXTPATH+"javascript/qv/form/VatNumberCheck.js";
                    script.type  = 'text/javascript';
			            script.defer = false;
		             var scriptElement = head.appendChild( script );
                    alert("VatNumberCheck.js is dynamically loaded.");   //Works only when alert is included (then page is not reloaded)
                }*/
                
                if ( typeof checkVATNumber == "function" ) {
                    if ( iFieldLength > 0 ) {
                        bFieldIsValid = checkVATNumber(oFieldValue);
                    }
                } else {
                    if ( LogWriter ) {
                        LogWriter.log("Unable to validate VatNumber because validation function is not available");
                    }
                    window.status = "Unable to validate VatNumber because validation function is not available";
                }
                
                if ( bFieldIsValid == false ) {
                    this.errors += this.language['start'] + getMessage(this.language['invalid'],new Array(sHtmlName));
                }
                break;
            case 0:     // no datatype
                break;
            default:
                // TODO: error handling
                break;
        }

        if( bFieldIsValid == false )
        {
            if( this.errors != "" ) { this.errors += '\n'; }
            if( !bFocusHasBeenSet ) {
                // set focus to the element causing the error
                if( field && (field.focus) && (field.type!='hidden') && (field.disabled==false) )
                {
                    if ( document.all ) {
                        try { // only ie supports try catch statements in js
                            field.focus(); // this can still go wrong if the field is in e.g. a hidden div
                            bFocusHasBeenSet = true;
                        } catch (ex) {}
                    } else {
                        field.focus();
                        bFocusHasBeenSet = true;
                    }
                }
            }
        }

        if( (this.errors != "") && (this.stopValidationOnFirstError) ) { break; }
    }
}
function FV_getTotalValue(oField)
{
    var iLength = oField.length;

    //iLength is undefined in case only one field with this name exists
    if ( !iLength || iLength == 'undefined' ) {
        return oField.value;
    }

    bChecked   = false;
    var iValue = 0;
    for ( var i = 0; i < iLength; i++ )
    {
        if ( oField[i].checked ) {
            iValue += parseInt(oField.value);
            bChecked = true;
        }
    }

    if ( bChecked == false ) { return null; }
    return iValue;
}

formValidation = new FormValidation();
/**
 * internal object for holding the parameters passed to the define() method
 */
function CheckFieldObject(vField, sInputFieldName, iInputFieldType, bRequired, sHtmlName
                   , iMinimumLength, iMaximumLength
                   , iMinimumValue, iMaximumValue)
{
    this.field           = vField;
    this.sInputFieldName = sInputFieldName;
    this.iInputFieldType = iInputFieldType;
    this.bRequired       = bRequired;
    this.sHtmlName       = sHtmlName;
    this.iMinimumLength  = iMinimumLength;
    this.iMaximumLength  = iMaximumLength;
    this.iMinimumValue   = iMinimumValue;
    this.iMaximumValue   = iMaximumValue;
}
function CheckColumnObject(sFormFieldPrefix, sInputFieldName, iInputFieldType, bRequired, sHtmlName
                   , iMinimumLength, iMaximumLength
                   , iMinimumValue, iMaximumValue)
{
    this.sFormFieldPrefix= sFormFieldPrefix;
    this.sInputFieldName = sInputFieldName;
    this.iInputFieldType = iInputFieldType;
    this.bRequired       = bRequired;
    this.sHtmlName       = sHtmlName;
    this.iMinimumLength  = iMinimumLength;
    this.iMaximumLength  = iMaximumLength;
    this.iMinimumValue   = iMinimumValue;
    this.iMaximumValue   = iMaximumValue;
}

var TextFieldFilter = new Object();

/**
 * Removes all characters that are not digits from the field value.
 * a typecall example would be
 * ... onChange="TextFieldFilter.digitsOnly(this);" ...
 * @param oField a reference to a text field of a form
 */
TextFieldFilter.digitsOnly = function (oField)
{
	if ( oField.srcElement ) { oField = oField.srcElement; }
	TextFieldFilter.filterChars(oField, "0123456789", false);
}

TextFieldFilter.digitsAndDotOnly = function (oField)
{
	if ( oField.srcElement ) { oField = oField.srcElement; }
	TextFieldFilter.filterChars(oField, "0123456789.", false);
}

TextFieldFilter.percentageCharsOnly = function (oField)
{
	if ( oField.srcElement ) { oField = oField.srcElement; }
	TextFieldFilter.filterChars(oField, "0123456789.%", false);
}

/**
 * Removes all characters that are digits that are entered into a form field.
 * a typecall example would be
 * ... onChange="TextFieldFilter.noDigits(this);" ...
 * @param oField a reference to a text field of a form
 */
TextFieldFilter.noDigits = function(oField)
{
	if ( oField.srcElement ) { oField = oField.srcElement; }
	TextFieldFilter.filterChars(oField,"0123456789",true);
}


/**
 * Removes all characters contained in the sChar string from the specified form field.
 * a typecall example would be
 * ... onChange="TextFieldFilter.removeChars(this,"'&_");" ...
 * @param oField a reference to a text field of a form
 * @param sChars a String containing the characters to be removed from the form field
 */
TextFieldFilter.removeChars = function(oField, sChars)
{
	TextFieldFilter.filterChars(oField,sChars,true);
}

/**
 * Leaves only characters contained in the sChar string in the value of the specified form field.
 * All other characters are removed.
 * a typecall example would be
 * ... onChange="TextFieldFilter.filterOutChars(this,"0123");" ...
 * @param oField a reference to a text field of a form
 * @param sChars a String containing the characters not to be removed from the form field
 */
TextFieldFilter.filterOutChars = function(oField, sChars)
{
	TextFieldFilter.filterChars(oField, sChars, false);
}

TextFieldFilter.filterChars = function(oField, sChars, bRemove)
{
	var sValue                  = oField.value;
	var sValueRemovePassedChars = "";
	var sValueLeavePassedChars  = "";

	// split the value two strings.
	// One containing only the characters that where passed and
	// another containing all the characters BUT the ones passed.
	for ( var i = 0; i < sValue.length; i++ )
	{
		var sTmp = sValue.substring(i,i+1);
		if (sChars.indexOf(sTmp)==-1) {
			// character not in passed chars
			sValueRemovePassedChars += sTmp;
		} else {
			sValueLeavePassedChars  += sTmp;
		}
	}

	if ( bRemove ) {
	    if ( oField.value != sValueRemovePassedChars ) {
		    oField.value = sValueRemovePassedChars;
		}
	} else {
	    if ( oField.value != sValueLeavePassedChars ) {
    		oField.value = sValueLeavePassedChars;
    	}
	}
}

/**
 * Contains functions to communicate events from a top frame to each child frames.
 * QuadroVision
 */

/**
 * Invokes 'handleEvent' in the current document and recursivly passes the event
 * to the eventHandler object in child frame documents.
 * QuadroVision
 */

function EventHandler()
{
    this.communicateToChilds = EventHandler_communicateToChilds;
    this.blockEvents         = EventHandler_blockEvents;
//  this.handleEvents        = EventHandler_handleEvents;
    this.handleMenuAction    = EventHandler_handleMenuAction;
    this.handle              = EventHandler_handle;
    this.communicateToTop    = EventHandler_communicateToTop;
    this.communicateToParent = EventHandler_communicateToParent;
    this.getEventData        = EventHandler_getEventData;

    this.m_bPassOnEvents        = true;

    try {
        // DSL: 20050223
        this.name = parent.name;    //this.name = window.document.parentWindow.frameElement.name;
    } catch (exception) {
        this.name = 'unknown';
    }

    return this;
}

function EventHandler_blockEvents()
{
    this.m_bPassOnEvents = false;
}


function EventHandler_communicateToChilds(iEventID, eventData)
{
    if ( this.m_bPassOnEvents == false ) { return; }

    this.handle(iEventID, eventData);

    // communicate event further down if applicable
    if ( window.frames == null ) { return; }

    var frames = window.frames;

	var iNumberOfFrames = frames.length;

    for ( var i = 0; i < iNumberOfFrames; i++ )
    {
        var frame = frames[i];

        // pass event on to eventHandler of child frame
        if ( frame.eventHandler ) {
            frame.eventHandler.communicateToChilds(iEventID, eventData);
        }
    }
}

/**
 * Simply calls the method above for the top most frame.
 *
 * This method can be called with a variable argument list, but also 
 * with the arguments that were passed to another function.
 *
 * In the first case, oaArguments is the first parameter (menuid/eventid/actionid), and arguments (javascript keyword) the 'array' of all arguments (as in function arguments -> varargs).
 * In the second case, oaArguments is an array, of all the arguments passed to e.g. doAction function on a page, and arguments an array of length 1.
 */
function EventHandler_communicateToTop(oaArguments)   // first argument must be eventid
{
    // step 0: check input
    var iNumberOfArguments = ( arguments ? arguments.length : 0 );
//alert("[EventHandler::communicateToTop] iNumberOfArguments: " + iNumberOfArguments);
    if ( iNumberOfArguments <= 0 ) {
        alert("[EventHandler_communicateToTop] Exception, communicateToTop called without any arguments.");
        return;
    }

    // step 1: get eventid
    var iEventID = getFirstArgumentAsInt(oaArguments);
//alert("[EventHandler::communicateToTop] iEventID: " + getEventString(iEventID) + " (" + iEventID + ")");
    if ( isNaN(iEventID) ) {
        alert("[QvExplorerMenu_doAction] Exception, doAction not called with valid event: " + iEventID);
        return;
    }

//if ( iEventID==6131 )
//{
//alert("[qv/frames/EventHandler.js::communicateToTop]\n\ndocument: " + document.id + ", iEventID: " + getEventString(iEventID) + " (" + iEventID + ")\n\narguments: " + arguments + "\n\nstack:\n" + getStackTrace(false));
//}

    var eventDataNew = this.getEventData(oaArguments, arguments);

	// top is reached directly...
	var oTop = window.top;
	if ( ! oTop ) {
		alert("[EventHandler::communicateToTop] Exception, no topmost ancestor window");
		return;
	}

	var oEventHandler = oTop.eventHandler;
	if ( ! oEventHandler ) {
		alert("[EventHandler::communicateToTop] Exception, no EventHandler available in topmost ancestor window");
		return;
	}

    oEventHandler.communicateToChilds(iEventID, eventDataNew);
}

/**
 * Simply calls the method above for the parent frame.
 */
function EventHandler_communicateToParent(iEventID, eventData)
{
    //var eventDataNew = ( arguments && arguments.shift ? arguments.shift() : null );
    var eventDataNew = this.getEventData(arguments);

	var oParent = window.parent;
	if ( ! oParent ) {
		alert("[EventHandler::communicateToParent] Exception, no parent window");
		return;
	}

	var oEventHandler = oParent.eventHandler;
	if ( ! oEventHandler ) {
		alert("[EventHandler::communicateToParent] Exception, no EventHandler available in parent window (" + oParent.id + ")");
		return;
	}

    oEventHandler.communicateToChilds(iEventID, eventDataNew);
}

function EventHandler_handle(iEventID, eventData)
{
    if ( this.m_bPassOnEvents == false ) { return; }

    if ( typeof handleEvent != 'function' ) {   // handleEvent is elseWhere
		//alert("[EventHandler::handle] Exception, handleEvent unknown or not a function");
		return;
	}

    handleEvent(iEventID, eventData);
}

// function EventHandler_handleEvents() { this.m_bPassOnEvents = true; }   // SJN: NOT USED -> TO BE DELETED

function EventHandler_handleMenuAction(iNode, iMenuID, sAction) 
{
	var oTop = window.top;
	if ( ! oTop ) {
		alert("[EventHandler::communicateTop] Exception, no topmost ancestor window");
		return;
	}

	var oController = oTop.controller;
	if ( ! oController ) {
		alert("[EventHandler::communicateTop] Exception, no Controller available in topmost ancestor window");
		return;
	}

    oController.handleMenuAction(iNode, iMenuID, sAction);
}

/*
function EventHandler_getEventData(args)
{
    var eventDataNew = null;

    if ( args.length <= 1 ) { return null ; }

    eventDataNew = new Array(args.length-1);
    for ( var i=1; i<args.length; i++ ) { eventDataNew[i-1] = args[i]; }
	
	return eventDataNew;
}
*/

function EventHandler_getEventData(oArgs1, oArgs2)
{
    var eventDataNew = null;

	if ( ! oArgs1 ) { return null; }

	if ( typeof oArgs1 == "object" ) {
		// oArgs1 is an "arguments" object, the arguments passed to a function prior to communicateToTop
		// oArgs2 is an "arguments" object, the arguments passed to communicateToTop
		//eventDataNew = oArgs1.shift();   // "Unfortunately, the arguments array is not a true array"
		eventDataNew = new Array(oArgs1.length-1);
		for ( var i=1; i<oArgs1.length; i++ ) { eventDataNew[i-1] = oArgs1[i]; }
	} else {
		// oArgs1 is a standard argument (the first to be passed to communicateToTop)
		// oArgs2 is an "arguments" object, the arguments passed to communicateToTop
		//eventDataNew = oArgs2.shift();   // "Unfortunately, the arguments array is not a true array"
		eventDataNew = new Array(oArgs2.length-1);
		for ( var i=1; i<oArgs2.length; i++ ) { eventDataNew[i-1] = oArgs2[i]; }
	}
	
	return eventDataNew;
}

eventHandler = new EventHandler();

/**************************
 * GUI class
 * super class of the following GUI's
 * Popup.class.js
 * tree\AbstractTree.class.js
 * QuadroVision
 **************************/

function GUI(oThis)
{
	oThis = oThis || this;

	// private members
	var m_sClassName                 = String(oThis.constructor).split(' ')[1].split('(')[0];

	// public methods (VIEW)
	oThis.getClassName                = 	function () { return m_sClassName; };


	/**************************************
	 * OTHERS
	 **************************************/
}

/**************************************
 * STATIC MEMBERS
 **************************************/

GUI.m_nbsp                      = String.fromCharCode( 160 );

/**************************************
 * STATIC METHODS
 **************************************/

GUI._createTableBodyTr          = GUI__createTableBodyTr;
GUI._createTableBody            = GUI__createTableBody;
GUI._findPosX                   = GUI__findPosX;
GUI._findPosY                   = GUI__findPosY;
GUI.getXYWH                     = GUI__getXYWH;
GUI.getWH                       = GUI__getWH;
GUI.getScrollXY                 = GUI__getScrollXY;
GUI.getWindowXYWH               = getWindowXYWH;
GUI.setXYWH                     = GUI__setXYWH;
GUI.setXY                       = GUI__setXY;
GUI.setWH                       = GUI__setWH;
GUI.setW                        = GUI__setW;
GUI.setH                        = GUI__setH;
GUI.attachAnEvent               = GUI__attachEvent;
GUI.alignToTop                  = GUI__alignToTop;
GUI.alignToBottom               = GUI__alignToBottom;
GUI.setXNextTo                  = GUI__setXNextTo;

GUI.getParentFrame = function(oDocument)
{
    //start with top window and investigate all nested frames (from all levels) to find the frame
    //we are looking for, that is the frame that holds the document that matches oDocument
    if ( oDocument.parentWindow ) { return oDocument.parentWindow; }  //IE specific (shortcut)
    
    //use recursive calls to examine all levels of nested frames for a match
    return findFrame(top, oDocument);
    
    //Post-order strategy
    function findFrame(oFrame, oDocument)
    {
        var oTargetFrame = null;
        var oChildFrame = null;

        var iFrameCount = oFrame.frames.length;    // SJN: 0 in PMS ... 
        if ( iFrameCount == 0 ) {
            if ( window ) { return window; }
        }

        for (var i = 0; (i<iFrameCount) && (oTargetFrame == null); i++)
        {
            oChildFrame = oFrame.frames[i];
            if ( oChildFrame.document == oDocument ) { return oChildFrame; }
            if ( oChildFrame.frames.length > 0 ) { oTargetFrame = findFrame(oChildFrame, oDocument); }
        }
        return oTargetFrame;
    }
}

function GUI__setXNextTo(eMove, eStay, iMargin)
{
    iMargin = iMargin || 0;
    var xywhStay = GUI.getXYWH(eStay);
    var xyMove   = GUI.getXYWH(eMove);
    xyMove.x = xywhStay.x + xywhStay.w + iMargin;
    GUI.setXY(eMove, xyMove);
}

function GUI__alignToTop(e, iMargin)
{
	iMargin     = iMargin || 0;
	var xywh    = GUI.getXYWH(e);
	var wXYWH   = GUI.getWindowXYWH();
	var sXY     = GUI.getScrollXY();
	var iTop    = sXY.y + iMargin;
	e.style.top = iTop;
}

function GUI__alignToBottom(e, iMargin)
{
	iMargin     = iMargin || 0;
	var xywh    = GUI.getXYWH(e);
	var wXYWH   = GUI.getWindowXYWH();
	var sXY     = GUI.getScrollXY();
	var iTop    = wXYWH.h + sXY.y - xywh.h - iMargin;
	e.style.top = iTop;
}

function GUI__attachEvent(element, eventType, eventHandler)
{
    if ( element.attachEvent ) {
        // IE
        element.attachEvent(eventType, eventHandler);
    }
    if ( element.addEventListener ) {
        // remove 'on' prefix
        eventType = eventType.removePrefix('on');
        element.addEventListener(eventType, eventHandler, true);
    }
}

function GUI__createTableBodyTr(parentElement, oDocument)
{
    oDocument = oDocument || document;
    var tBody = GUI._createTableBody(parentElement, oDocument);
    var tr    = tBody.appendChild( oDocument.createElement( "tr" ) );
    return tr;
}

function GUI__createTableBody(parentElement, oDocument)
{
    oDocument = oDocument || document;
    var table = parentElement.appendChild( oDocument.createElement( "table" ) );
    var tBody = table        .appendChild( oDocument.createElement( "tbody" ) );
    table.cellSpacing = table.cellPadding = table.border      = 0;

    return tBody;
}

function GUI__setXY(e, XYWH, oDocument) {
    oDocument = oDocument || document;
    if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    e.style.top    = XYWH.y + 'px';
    e.style.left   = XYWH.x + 'px';
}
function GUI__setWH(e, XYWH, oDocument) {
    oDocument = oDocument || document;
    if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    e.style.width  = XYWH.w + 'px';
    e.style.height = XYWH.h + 'px';
}
function GUI__setW(e, XYWH, oDocument) {
    oDocument = oDocument || document;
    if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    if ( typeof XYWH == 'number' ) {
        e.style.width  = XYWH + 'px';
    } else {
        e.style.width  = XYWH.w + 'px';
    }
}
function GUI__setH(e, XYWH, oDocument) {
    oDocument = oDocument || document;
    if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    if ( typeof XYWH == 'number' ) {
        e.style.height = XYWH + 'px';
    } else {
        e.style.height = XYWH.h + 'px';
    }
}

function GUI__setXYWH(e, XYWH, oDocument)
{
    oDocument = oDocument || document;
    if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    GUI.setXY(e, XYWH);
    GUI.setWH(e, XYWH);
}

function GUI__getScrollXY(oDocument)
{
    oDocument = oDocument || document;
	var xywh = new XYWH();
	if ( typeof oDocument.body.scrollLeft != 'undefined' ) {
		xywh.x = oDocument.body.scrollLeft;
		xywh.y = oDocument.body.scrollTop;
	} else if ( typeof window.pageXOffset != 'undefined' ) {
		xywh.x = window.pageXOffset ;
		xywh.y = window.pageYOffset ;
	}
	return xywh;
}

function GUI__getXYWH(e, oDocument)
{
    oDocument = oDocument || document;
    if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    if ( ! e ) { return; }

    var xy = GUI.getXY(e);
    var w = 0;
    var h = 0;

    if (oDocument.defaultView) {
        // netscape
        var computedStyle = oDocument.defaultView.getComputedStyle(e,null);
        w = parseInt( computedStyle.getPropertyValue('width') .removeSuffix('px') );
        h = parseInt( computedStyle.getPropertyValue('height').removeSuffix('px') );
    } else {
        w = e.clientWidth;
        h = e.clientHeight;
    }

    return new XYWH( xy.x, xy.y, w, h );
}

function GUI__getWH(e, oDocument)
{
    oDocument = oDocument || document;
    if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    var w = 0;
    var h = 0;

    if (oDocument.defaultView) {
        // netscape
        var computedStyle = oDocument.defaultView.getComputedStyle(e,null);
        w = parseInt( computedStyle.getPropertyValue('width') .removeSuffix('px') );
        h = parseInt( computedStyle.getPropertyValue('height').removeSuffix('px') );
    } else {
        w = e.clientWidth;
        h = e.clientHeight;
    }

    return new XYWH(0,0,w,h);
}

GUI.getXY = function(e, bRelative, oDocument)
{
    oDocument = oDocument || document;
    if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    if ( bRelative ) {
        if (oDocument.defaultView) {
            // netscape
            //return [ parseInt( e.style.left.removeSuffix('px') ), parseInt( e.style.top.removeSuffix('px') ) ];
            return new XYWH( parseInt( e.style.left.removeSuffix('px') ), parseInt( e.style.top.removeSuffix('px') ) );
        } else {
            //return [ e.style.posLeft, e.style.posTop ];
            return new XYWH( e.style.posLeft, e.style.posTop );
        }
    }

    var iLeft = 0;
    var iTop  = 0;
    if (e.offsetParent)
    {
        while (e.offsetParent)
        {
//LogWriter.log(e.tagName + '.offsetLeft,offsetTop=' + e.offsetLeft + ',' + e.offsetTop + ' pos:' + e.style.position + ' id:' + e.id );
            iLeft += e.offsetLeft
            iTop  += e.offsetTop
            e = e.offsetParent;
        }
//LogWriter.log(e.tagName + ' (last) pos:' + e.style.position + ' id:' + e.id );
    } else if (e.x) {
        iLeft += e.x;
        iTop  += e.y;
    }
//LogWriter.log('iLeft,iTop=' + iLeft + ',' + iTop);
//  return [ iLeft, iTop ]; // IHE 20040401
    return new XYWH(iLeft, iTop);
}

function GUI__findPosX(e, bRelative, oDocument)
{
    oDocument = oDocument || document;
    if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    if ( bRelative ) {
        if (oDocument.defaultView) {
            // netscape
            return parseInt( e.style.left.removeSuffix('px') );
        } else {
            return e.style.posLeft;
        }
    }

    var iLeft = 0;
    if (e.offsetParent)
    {
        while (e.offsetParent)
        {
//LogWriter.log(e.tagName + '.offsetLeft=' + e.offsetLeft);
//LogWriter.log(e.id      + '.offsetLeft=' + e.offsetLeft);
            iLeft += e.offsetLeft
            e = e.offsetParent;
        }
    } else if (e.x) {
        iLeft += e.x;
    }
//LogWriter.log('iLeft=' + iLeft);
    return iLeft;
}

function GUI__findPosY(e, bRelative, oDocument)
{
    oDocument = oDocument || document;
    if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    if ( bRelative ) {
        if (oDocument.defaultView) {
            // netscape
            return parseInt( e.style.top.removeSuffix('px') );
        } else {
            return e.style.posTop;
        }
    }

    var iTop = 0;
    if (e.offsetParent)
    {
        while (e.offsetParent)
        {
//LogWriter.log(e.tagName + '.offsetTop=' + e.offsetTop);
//LogWriter.log(e.id      + '.offsetTop=' + e.offsetTop);
            iTop += e.offsetTop
            e = e.offsetParent;
        }
    } else if (e.y) {
        iTop += e.y;
    }
//LogWriter.log('iTop=' + iTop);
    return iTop;
}

function getWindowXYWH(oDocument)
{
    oDocument = oDocument || document;
    
    var oFrame = GUI.getParentFrame.call(this, oDocument);    
	if ( ! oFrame ) { return null; }

    var w = oDocument.body.clientWidth  ? oDocument.body.clientWidth  : window.innerWidth ;
    var h = oDocument.body.clientHeight ? oDocument.body.clientHeight : window.innerHeight;

    var oXYWH = new XYWH( oFrame.screenLeft, oFrame.screenTop, w, h);

    return oXYWH;
}

/**************************
 * XYWH class
 * QuadroVision
 **************************/

function XYWH(x,y,w,h)
{
    this.x = x || 0;
    this.y = y || 0;
    this.w = w || 0;
    this.h = h || 0;
}
XYWH.prototype.clone = function()
{
    var xywh = new XYWH(this.x, this.y, this.w, this.h);
    return xywh;
}
/** Return string is formatted in such a way that it can be used in javascript open() method to create window at a certain position */
XYWH.prototype.toCSVString = function()
{
    return 'width=' + this.w + ',height=' + this.h + ',left=' + this.x + ',top=' + this.y;
}
XYWH.prototype.asDialogFeatureString = function()
{
    return "dialogLeft:"   + this.x + "px;"
         + "dialogTop:"    + this.y + "px;"
         + "dialogWidth:"  + this.w + "px;"
         + "dialogHeight:" + this.h + "px;"
}
XYWH.prototype.valueOf = function() { return this.toCSVString(); }

GUI.appendOnlyChild = function(p,c)
{
	GUI.removeFirstChild(p);
	p.appendChild(c);
}
GUI.removeFirstChild = function(e, oDocument)
{
    oDocument = oDocument || document;
	if ( typeof e == 'string' ) { e = oDocument.getElementById(e); }
    if ( e && e.firstChild ) {
        e.removeChild(e.firstChild);
        return true;
    }
    return false;
}

GUI.addCSSElementToHead = function(sURL, oDocument)
{
    oDocument = oDocument || document;

	var head = oDocument.getElementsByTagName('head').item(0);

	// add new link to stylesheet entry in head section
	var link   = oDocument.createElement('link');
	link.href  = sURL;
	link.rel   = "StyleSheet";
	link.type  = 'text/css';
	//link.defer = true; //DSL: 20050223 - to test problem in Mozilla

	void( head.appendChild(link) );

	return link;
}

GUI.isCSSElementInPresent = function(sName, oDocument)
{
    oDocument = oDocument || document;

	// remove possible old dynamicly added javascript entry
	var links = oDocument.getElementsByTagName('link');
	for ( var c = 0; c < links.length; c ++ ) {
	    var link  = links[c];
	    var sHref = link.href;
	    if ( sHref.endsWith( sName ) ) { return true; }
	}

	return false;
}

// link IE's 'attachEvent' to dom version 'addEventListener' for netscape users
if ( typeof HTMLElement!="undefined" && !HTMLElement.prototype.attachEvent)
{
	HTMLElement.prototype.attachEvent = function(eventType, eventHandler)
	{
        if ( this.addEventListener ) {
            // remove 'on' prefix
            eventType = eventType.removePrefix('on');
            this.addEventListener(eventType, eventHandler, true);
        }
	}
}

/**************************
 * Popup class
 * super class of the following Popup's
 * 'date\DatePicker.class.js'
 * 'color\ColorPicker.class.js'
 * QuadroVision
 **************************/

function Popup(oThis)
{
	if ( GUI.call ) {
		GUI.call(this); // js 5.5
		oThis = this;
	} else {
		oThis = oThis || this;
		GUI(oThis); // js 5.1
	}

	// private members (VIEW)
	var m_popupDiv                    = null;
	var m_popupILayer                 = null; // IE5.5 and higher
	var m_popupWindow                 = null;
	oThis._popupTargetElement         = null;
	oThis._popupTargetElementHidden   = null;
	oThis._openerPopup                = null;
	oThis._languageCode               = 'en';

	// public methods (VIEW)
	oThis.createInPopupLayer          = Popup_createInPopupLayer;
	oThis.showPopupLayer              = Popup_showPopupLayer;
	oThis.getHiddenElement            = Popup_getHiddenElement;
	oThis.copyAndClosePopup           = Popup_copyAndClosePopup;       // window or layer
	oThis.setIcon                     = Popup_setIcon;

	oThis.showPopupWindow             = Popup_showPopupWindow;
	oThis.addPopupLink                = Popup_addPopupLink;

	// public methods (MODEL)
	oThis.initOpenerCommunication     = Popup_initOpenerCommunication;
	oThis.getOpenerValue              = Popup_getOpenerValue;

	// private methods (VIEW)
	oThis._closePopupLayer            = Popup__closePopupLayer;
	oThis._showPopupLayer             = Popup__showPopupLayer;
	oThis._copyAndClosePopupWindow    = Popup__copyAndClosePopupWindow;
	oThis._copyAndClosePopupLayer     = Popup__copyAndClosePopupLayer;

	var m_sIcon                       = null;

	// abstract methods for popup Popup's
	oThis.create                      = null;
	oThis.setValue                    = null;
	oThis.getValue                    = null;
	oThis.setLanguage                 = null;
	oThis._copyOpenerProperties       = null;
	oThis._copyFromElementValue       = null;
	oThis._copyToElementValue         = null;

	/**************************************
	 * POPUP SUPPORT
	 **************************************/

	function Popup_initOpenerCommunication()
	{
		this._openerPopup = opener.document._openerPopup;

		if ( this._copyOpenerProperties ) {
			this._copyOpenerProperties(this._openerPopup);
		}
	}

	function Popup_copyAndClosePopup() {
		if ( this._openerPopup ) {
			this._copyAndClosePopupWindow();
		} else {
			this._copyAndClosePopupLayer();
		}
	}

	/**************************************
	 * LAYER POPUP SUPPORT
	 **************************************/

    // check need for and support of iframe shim (EUG: what's this for?)
    function checkOverlaySupport()
    {
        if (    (navigator.userAgent.indexOf("Windows") != -1)              //is something of windows
             && (typeof document.body != "undefined")                       //has a body
             && (typeof document.body.insertAdjacentHTML != "undefined")    //supports insertAdjacentHTML
             && (!window.opera)                                             //not Opera
             && (navigator.appVersion.indexOf("MSIE 5.0") == -1)            //not IE 5.0
            ) { return true; }
        
        return false;
    }

	function Popup_createInPopupLayer (sPopupID, oDocument)
	{
	    oDocument = oDocument || document;

	    if ( m_popupDiv && (typeof m_popupDiv.document != "unknown") && (m_popupDiv.document == oDocument) ) { return; } // is already created...

	    sPopupID = sPopupID || ( this.getClassName() + 'POPUP') ;
		m_popupDiv = oDocument.getElementById(sPopupID);
		if ( ! m_popupDiv || (typeof m_popupDiv.document == "unknown") || (m_popupDiv.document != oDocument) ) {
			m_popupDiv           = oDocument.createElement('div');
			m_popupDiv.id        = sPopupID;
			oDocument.body.appendChild(m_popupDiv);

            //EUG 20050830: This causes trouble in FireFox. In the bottom of the window space is reserved, and the word 'false' is
            //shown. TODO. Now testing without. (maybe this is just for very old browsers)
            var bUseIFrameTrick = false; //checkOverlaySupport();
            if ( bUseIFrameTrick ) {
                m_popupILayer              = oDocument.createElement( 'iframe' );
                m_popupILayer.className    = DatePickerConfig.className_datePicker;
                m_popupILayer.src          = "javascript:false";
                m_popupILayer.frameBorder  = "0";
                m_popupILayer.scrolling    = "no";
                m_popupILayer.style.border = "0px solid white";
                m_popupILayer.style.zIndex = "4";

                m_popupDiv.style.zIndex    = "5"; //  must be on top of ILayer
    			oDocument.body.appendChild(m_popupILayer);
            }
		}

		m_popupDiv.style.position   = 'absolute';
		m_popupDiv.style.visibility = 'hidden';

		//m_popupDiv   .style.display    = 'none';
		var xy = new XYWH();
		GUI.setXY(m_popupDiv, xy);
		// m_popupDiv.style.-moz-user-focus = 'normal';

		if ( this.createInPopupCustom ) {
			this.createInPopupCustom(m_popupDiv);
		}

		if ( m_popupILayer && ( typeof m_popupILayer.document == "object" ) ) {
            m_popupILayer.style.position   = 'absolute';
            m_popupILayer.style.visibility = 'hidden';
    		GUI.setXY(m_popupILayer, xy);
		}

		m_popupDiv.appendChild(this.create(oDocument));

	    m_popupDiv.onmouseout = function() {
	    	PopupHandler.setHideAllTimer();
	    }
		m_popupDiv.onmouseover = function() {
			PopupHandler.clearHideAllTimer();
		};

		return m_popupDiv;
	}

    function Popup_getHiddenElement(element, bCreateIfNotPresent, oDocument)
    {
	    oDocument = oDocument || document;
	    if ( typeof element == 'string' ) { element = oDocument.getElementById(element); }

        var eHidden = null;
		var sElementName = element.name;
		if ( sElementName.endsWith('_PRESENTATION' ) ) {
		    var sElementNameHidden = sElementName.removeSuffix('_PRESENTATION');
		    eHidden = oDocument.getElementById(sElementNameHidden);
		    if ( ! eHidden && bCreateIfNotPresent )
		    {
		        eHidden = oDocument.createElement('input');
		        eHidden.type = 'hidden';
		        //eHidden.type = 'text'; eHidden.className = 'textboxnormal';
		        eHidden.name = eHidden.id = sElementNameHidden;
		        eHidden.dynamiclyAdded = true;
		        element.parentNode.appendChild(eHidden);
		    }
		}

        if ( ( element.value != '' ) && eHidden.dynamiclyAdded && ( eHidden.value == '' ) )
        {
            this.setValue( element.value );
            if ( this._copyToElementValue ) {
                this._copyToElementValue(element, eHidden);
            } else {
                element.value = this.getValue();
            }
        }

		return eHidden;
    }

	function Popup_showPopupLayer(element, bMandatory, oDocument)
	{
	    oDocument = oDocument || document;
	    if ( typeof element == 'string' ) { element = oDocument.getElementById(element); }

	    if ( ! m_popupDiv ) { this.createInPopupLayer(null, oDocument); }

	    // IHE: 20041221
	    if ( (typeof m_popupDiv.document == "unknown") || (m_popupDiv.document != oDocument) ) { this.createInPopupLayer(null, oDocument); }

		if ( ( m_popupDiv.style.visibility == "inherit" ) && ( this._popupTargetElement == element ) ) {
			this._closePopupLayer();
			return;
		}

		if ( this._copyFromElementValue ) {
			this._copyFromElementValue(element, bMandatory);
		} else {
			this.setValue(element.value);
		}

		this._popupTargetElement       = element;
		this._popupTargetElementHidden = this.getHiddenElement(element, true, oDocument);

		var XYWHelement = GUI.getXYWH(element);
		var XYWHpopup   = GUI.getXYWH(m_popupDiv);
    		XYWHpopup.x = XYWHelement.x;
	    	XYWHpopup.y = XYWHelement.y + XYWHelement.h + 5;

		if ( this.setPopupPositionCustom ) {
		    try {
			    this.setPopupPositionCustom(m_popupDiv, element, XYWHpopup, XYWHelement);
            } catch (err) {
LogWriter.log("[setPopupPositionCustom] err" , err);
                // asume code is no longer available
                this.setPopupPositionCustom = null;
            }
		}
        GUI.setXY(m_popupDiv, XYWHpopup);
		if ( m_popupILayer && ( typeof m_popupILayer.document == "object" ) )
		{
    		GUI.setXYWH(m_popupILayer, XYWHpopup); // may be off a bit...
    	}

		this._showPopupLayer();

		PopupHandler.setHideAllTimer(3000);
	}

	function Popup__closePopupLayer()
	{
		m_popupDiv.style.visibility = "hidden";
		if ( m_popupILayer && ( typeof m_popupILayer.document == "object" ) ) {
		    m_popupILayer.style.visibility = "hidden";
		}

		PopupHandler.removeFromVisiblePopups(this);
		PopupHandler.clearHideAllTimer();
	}

	function Popup__showPopupLayer()
	{
		m_popupDiv.style.visibility = "inherit";
		if ( m_popupILayer && ( typeof m_popupILayer.document == "object" ) ) {
		    m_popupILayer.style.visibility = "inherit";
		}

		PopupHandler.addToVisiblePopups(this);
	}

	function Popup__copyAndClosePopupLayer() {
		var element       = this._popupTargetElement;
		var elementHidden = this._popupTargetElementHidden;
		if ( this._copyToElementValue ) {
			this._copyToElementValue(element, elementHidden);
		} else {
			element.value = this.getValue();
		}
		this._closePopupLayer();
	}

	/**************************************
	 * WINDOW POPUP SUPPORT
	 **************************************/

	function Popup_showPopupWindow (element, bMandatory)
	{
		if ( this._copyFromElementValue ) {
			this._copyFromElementValue(element, bMandatory);
		} else {
			this.setValue(element.value);
		}

		var offsetLeft = 0;
		var offsetTop  = 0
		var currentElement = element;
		while ( currentElement != window.document.body )
		{
			offsetTop  += currentElement.offsetTop;
			offsetLeft += currentElement.offsetLeft;
			offsetTop  -= currentElement.scrollTop;
			offsetLeft -= currentElement.scrollLeft;
			currentElement = currentElement.offsetParent;
		}

		this._popupTargetElement = element;
		document._openerPopup = this;

		var popupHtml = ContextFinals.HTMPATH + this.getClassName() + 'Popup.html';
		if ( popupHtml ) { popupHtml = popupHtml.replace("javascript", "htm"); } //EUG: why?

		m_popupWindow = open(popupHtml,'myPopup','resizable=no,width=200,height=180,left=' + offsetLeft + ',top=' + ( offsetTop + element.clientHeight + 5) );
	}

	function Popup_getOpenerValue() {
		if ( this.setLanguage ) {
			this.setLanguage( this._openerPopup._languageCode);
		}
		this.setValue   ( this._openerPopup.getValue() );
	}

	function Popup__copyAndClosePopupWindow()
	{
		// copy to opener gui
		this._openerPopup.setValue(this.getValue());

		// copy to opener element
		var element = this._openerPopup._popupTargetElement;
		if ( this._openerPopup._copyToElementValue ) {
			this._openerPopup._copyToElementValue(element);
		} else {
			element.value = this.getValue();
		}

		window.close();
	}

	/**************************************
	 * OTHERS
	 **************************************/

	function Popup_addPopupLink(element, bUsePopupWindow, oDocument)
	{
	    oDocument = oDocument || document;

	    if ( typeof element == 'string' ) { element = oDocument.getElementById(element); }

		if ( ! element ) { return; }

        if ( m_sIcon == null ) { m_sIcon =  ContextFinals.IMAGEPATH + this.getClassName() + 'Icon.gif'; }

        var sLinkName = element.name.removeSuffix('_PRESENTATION') + '_PICKERLINK' + (bUsePopupWindow?'W':'L');
		var lnk = oDocument.getElementById(sLinkName);
		if ( ! lnk )
		{
            lnk         = oDocument.createElement('img');
            lnk.name    = sLinkName;
            lnk.id      = sLinkName;

            if ( element.nextSibling ) {
                element.parentNode.insertBefore(lnk, element.nextSibling);
            } else {
                element.parentNode.appendChild(lnk);
            }
        }

        lnk.src     = m_sIcon;
        lnk.element = element;

        var oThis = this;
        lnk.onclick = function(e)
        {
            if ( bUsePopupWindow ) {
                oThis.showPopupWindow(this.element);
            } else {
                oThis.showPopupLayer(this.element);
            }
            if ( e ) { e.cancelBubble = true; }
            return false;
        }

        // next call is simply to ensure hidden element with correct format exists as well
        this.getHiddenElement(element, true, oDocument);
	}

	function Popup_setIcon(sElementName, oDocument)
	{
	    oDocument = oDocument || document;

		var e = oDocument.getElementById(sElementName);
		if ( e ) {
        	if ( m_sIcon == null ) { m_sIcon =  ContextFinals.IMAGEPATH + this.getClassName() + 'Icon.gif'; }
		    e.src = m_sIcon;
		}
	}

	/**************************************
	 * PROTECTED METHODS
	 **************************************/
}

Popup.prototype = new GUI;
//Popup.prototype.constructor = Popup;

/**************************
 * PopupHandler class
 * holds track of visible popup layers
 * and takes care of hiding them after a certain amount of time
 **************************/
var PopupHandler = {
	visiblePopups     : [],
	hideAllTimer      : null,

	addToVisiblePopups: function(popup) {
		var sClassName = popup.getClassName();
		this.visiblePopups[sClassName] = popup;
	},

	removeFromVisiblePopups: function(popup) {
		var sClassName = popup.getClassName();
		this.visiblePopups[sClassName] = null;
	},

	hideAll           : function() {
		for( var p in this.visiblePopups )
		{
			var popup = this.visiblePopups[p];
			if ( popup && popup._closePopupLayer ) {
				popup._closePopupLayer();
				this.visiblePopups[p] = null;
			}
		}
	},

	clearHideAllTimer : function() {
		clearTimeout(this.hideAllTimer);
	},

	setHideAllTimer  : function(iTimeOut) {
		iTimeOut = iTimeOut || 1000;
		clearTimeout(this.hideAllTimer);
		this.hideAllTimer = setTimeout("PopupHandler.hideAll()", iTimeOut);
	}
};


/**************************
 * DatePicker class
 * QuadroVision
 * requires gui\GUI.class.js
 *          gui\Popup.class.js
 *          util\Date.js
 *          gui\ml\LanguageHelper.js
 *          other\DateFunctions.js
 *
 * in order for the FormValidation to work properly for mandatory dates the following statement as to be added
 * formValidation.validateHiddenFields = true;
 **************************/

DatePicker.styleSheetLoaded = false;
function DatePicker( oDate )
{
	if ( Popup.call ) {
		Popup.call(this); // js 5.5
	} else {
		Popup(this); // test js 5.1
	}


	// public properties (mostly public for communication with popup variant)
	this._showNone            = true;
	this._returnFormat        = 'yyyy-MM-dd';

	// private properties
	var m_dSelected           = null;
	var m_bShowToday          = true;
	var m_iFirstWeekDay       = 0;  // start week with monday
	var m_iRedWeekDay         = 6;  // sunday is the default red day
	var m_bCurrentValueIsNone = false;
	var m_bDontChangeNone     = false;
	var m_bShowWeekNumber     = false;
	var m_dMinimum            = null;
	var m_dMaximum            = null;

	// private references to divs
	var m_document            = null;
	var m_mainDiv             = null;
	var m_gridDiv             = null;
	var m_btnPrevMonth        = null;
	var m_btnNextMonth        = null;
	var m_btnToday            = null;
	var m_btnNone             = null;
	var m_lblTop              = null;
	var m_lblPopup            = null;

	// check arguments
	if ( arguments.length == 0 ) {
		m_dSelected = new Date();
	} else {
		m_dSelected = oDate || new Date();
		m_bCurrentValueIsNone = ( oDate == null );
	}

	// public implementing methods
	this.create                      = DP_create;
	this.setLanguage                 = DP_setLanguage;

	this.getValue                    = DP_getValue;
	this.setValue                    = DP_setValue;
	this._copyFromElementValue       = DP__copyFromElementValue;
	this._copyToElementValue         = DP__copyToElementValue;
	this.copyDate                    = DP_copyDate;
	this._copyOpenerProperties       = DP__copyOpenerProperties;

	// public methods
	this.goToNextMonth               = DP_goToNextMonth;
	this.goToPreviousMonth           = DP_goToPreviousMonth;
	this.goToToday                   = DP_goToToday;
	this.setMaximumDate              = function(date) { m_dMaximum = date.round(true); 	};
	this.setMinimumDate              = function(date) { m_dMinimum = date.round(false);	};
	this.setShowWeekNumber           = function(b)    { m_bShowWeekNumber = b;	};

	this.getFirstWeekDay             = function() { return m_iFirstWeekDay;  };
	this.getRedWeekDay               = function() { return m_iRedWeekDay;	 };
	this.getShowNone                 = function() { return this._showNone;   };
	this.getShowToday                = function() { return m_bShowToday;	 };
	this.setDateFormat               = function(s){ this._returnFormat = s;  };

	this.setFirstWeekDay             = DP_setFirstWeekDay;
	this.setRedWeekDay               = DP_setRedWeekDay;
	this.setShowToday                = DP_setShowToday;
	this.setShowNone                 = DP_setShowNone;

	// protected methods
	this._createTable                = DP__createTable;
	this._updateTable                = DP__updateTable;
	this._hideLabelPopup             = DP__hideLabelPopup;
	this._showLabelPopup             = DP__showLabelPopup;
	this._setTopLabel                = DP__setTopLabel;

	// specify when to close
	this.onclickdayofmonth           = this.copyAndClosePopup;
	this.onclicktoday                = this.copyAndClosePopup;
	this.onclicknone                 = this.copyAndClosePopup;

	/***********************************
	 * Public methods
	 ***********************************/

	function DP_setLanguage(sLanguageCode)
	{
    	LanguageHelper.setLanguage(DateConfig      ,'months'  , sLanguageCode);
    	LanguageHelper.setLanguage(DateConfig      ,'days'    , sLanguageCode);
    	LanguageHelper.setLanguage(DatePickerConfig,'captions', sLanguageCode);
	}

	// create the nodes inside the date picker
	function DP_create ( oDocument )
	{
		oDocument = oDocument || document;

		m_document = oDocument;

        DatePicker.loadStyleSheet(m_document);

		// create elements
		m_mainDiv = oDocument.createElement( 'div' );
		m_mainDiv.className = DatePickerConfig.className_datePicker;

		// header
		var headerDiv = m_mainDiv.appendChild( oDocument.createElement( 'div' ) );
			headerDiv.className = DatePickerConfig.className_headerDiv;

		var headerTable = headerDiv.appendChild( oDocument.createElement( 'table' ) );
			headerTable.className = DatePickerConfig.className_headerTable;
			headerTable.cellSpacing = 0;

		var tBody = headerTable.appendChild( oDocument.createElement( 'tbody' ) );

		var tr = tBody.appendChild( oDocument.createElement( 'tr' ) );

		var td = tr.appendChild( oDocument.createElement( 'td' ) );
		m_btnPrevMonth = td.appendChild( oDocument.createElement( 'button' ) );
		m_btnPrevMonth.className = DatePickerConfig.className_previousButton;
		m_btnPrevMonth.style.backgroundImage = 'url("' + ContextFinals.IMAGEPATH + 'qv/gui/date/arrow.left.png")';

		td = tr.appendChild( oDocument.createElement( 'td' ) );
		td.className = DatePickerConfig.className_labelTd;

		m_lblTop = td.appendChild( oDocument.createElement( 'span' ) );
		m_lblTop.className = DatePickerConfig.className_topLabel;
		m_lblTop.href = '#';
		m_lblTop.appendChild( oDocument.createTextNode( GUI.m_nbsp ) );

		m_lblPopup = oDocument.createElement( 'div' );
		m_lblPopup.className = DatePickerConfig.className_labelPopupDiv;
		// no insertion

		td = tr.appendChild( oDocument.createElement( 'td' ) );
		m_btnNextMonth = td.appendChild( oDocument.createElement( 'button' ) );
		m_btnNextMonth.className = DatePickerConfig.className_nextButton;
		m_btnNextMonth.style.backgroundImage = 'url("' + ContextFinals.IMAGEPATH + 'qv/gui/date/arrow.right.png")';

		// grid
		m_gridDiv = m_mainDiv.appendChild( oDocument.createElement( 'div' ) );
		m_gridDiv.className = DatePickerConfig.className_gridDiv;

		// footer
		var footerDiv = m_mainDiv.appendChild( oDocument.createElement( 'div' ) );
			footerDiv.className = DatePickerConfig.className_footerDiv;

		var footerTable = footerDiv.appendChild( oDocument.createElement( 'table' ) );
			footerTable.className = DatePickerConfig.className_footerTable;
			footerTable.cellSpacing = 0;

		tBody = footerTable.appendChild( oDocument.createElement( 'tbody' ) );
		tr = tBody.appendChild( oDocument.createElement( 'tr' ) );

		// today button
		td = tr.appendChild( oDocument.createElement( 'td' ) );
		m_btnToday = td.appendChild( oDocument.createElement( 'button' ) );
		m_btnToday.className = DatePickerConfig.className_todayButton;
		m_btnToday.title     = DatePickerConfig.captions[0];
		m_btnToday.appendChild( oDocument.createTextNode( DatePickerConfig.captions[0] ) );

		td = tr.appendChild( oDocument.createElement( 'td' ) );
		td.className = DatePickerConfig.className_filler;
		td.appendChild( oDocument.createTextNode( GUI.m_nbsp ) );

		// none button
		td = tr.appendChild( oDocument.createElement( 'td' ) );
		m_btnNone = td.appendChild( oDocument.createElement( 'button' ) );
		m_btnNone.className = DatePickerConfig.className_noneButton;
		m_btnNone.title     = DatePickerConfig.captions[1];
		m_btnNone.appendChild( oDocument.createTextNode( DatePickerConfig.captions[1] ) );

		this._createTable( oDocument );

		this._updateTable();
		this._setTopLabel();

		if ( !this._showNone ) {
			m_btnNone.style.visibility  = 'hidden';
		}
		if ( !m_bShowToday ) {
			m_btnToday.style.visibility = 'hidden';
		}

		// IE55+ extension
		m_btnPrevMonth.hideFocus = true;
		m_btnNextMonth.hideFocus = true;
		m_btnToday.hideFocus     = true;
		m_btnNone.hideFocus      = true;
		// end IE55+ extension

		// hook up events
		var dp = this;
		// buttons
		m_btnPrevMonth.onclick = function () {
			dp._dontChangeNone = true;
			dp.goToPreviousMonth();
			dp._dontChangeNone = false;
		};
		m_btnNextMonth.onclick = function () {
			dp._dontChangeNone = true;
			dp.goToNextMonth();
			dp._dontChangeNone = false;
		};
		m_btnToday.onclick = function () {
			dp.goToToday();
			if ( typeof dp.onclicktoday == 'function' ) {
				dp.onclicktoday();
			}
		};
		m_btnNone.onclick = function () {
			dp.setValue( null );
			if ( typeof dp.onclicknone == 'function' ) {
				dp.onclicknone();
			}
		};

		m_mainDiv.onselectstart = function () {
			return false;
		};

		m_gridDiv.onclick = function ( e ) {
			// find event
			if ( e == null ) { e = GUI.getParentFrame.call( this, oDocument ).event; }   //rewritten: event is a window-object
        
        
			// find td
			var elem = e.target != null ? e.target : e.srcElement;
			while ( elem.nodeType != NodeTypes.ELEMENT ) {
				elem = elem.parentNode;
			}
			while ( ( elem != null ) && elem.tagName && ( elem.tagName.toLowerCase() != 'td' ) ) {
				elem = elem.parentNode;
			}

			// if no td found, return
			if ( ( elem == null ) || ( elem.tagName == null ) || ( elem.tagName.toLowerCase() != 'td' ) ) { return; }

			var n = elem.day;
			if ( isNaN( n ) || ( n <= 0 ) || ( n == null ) ) { return; }

			var d = new Date( dp.getValue() );
			if ( elem.month ) {
				d.add( Date.MONTH, elem.month );
			}
			d.setDate( n );
			if ( dp._minDate && ( d < dp._minDate ) ) { return; }
			if ( dp._maxDate && ( d > dp._maxDate ) ) { return; }

			dp.setValue( d );
var iFirstWeekNr= d.getWeek();

			if ( typeof dp.onclickdayofmonth == 'function' ) {
				dp.onclickdayofmonth();
			}
		};

		// show month selector popup
		m_lblTop.onclick = function ( e ) {
			dp._showLabelPopup();
			return false;
		};

		m_mainDiv.onkeydown = function ( e ) {
			if ( e == null ) { e = GUI.getParentFrame.call( this, oDocument ).event; }        //rewritten: event is a window-object
        
			var kc = e.keyCode != null ? e.keyCode : e.charCode;

			if ( ( kc < 37 ) || ( kc > 40 ) ) return true;

			var d = new Date( dp.getValue() ).valueOf();
			if      ( kc == 37 ) // left
				d -= 24 * 60 * 60 * 1000;
			else if ( kc == 38 ) // up
				d -= 7 * 24 * 60 * 60 * 1000;
			else if ( kc == 39 ) // right
				d += 24 * 60 * 60 * 1000;
			else if ( kc == 40 ) // down
				d += 7 * 24 * 60 * 60 * 1000;

			dp.setValue( new Date( d ) );
			return false;
		}

		// ie6 extension
		m_mainDiv.onmousewheel = function ( e ) {
			if ( e == null ) { e = GUI.getParentFrame.call( this, oDocument ).event; }        //rewritten: event is a window-object

        if ( ! e ) { return false; }
        
			var n = - e.wheelDelta / 120;
			var d = new Date( dp.getValue() );
			var m = d.getMonth() + n;
			d.setMonth( m );


			dp._dontChangeNone = true;
			dp.setValue( d );
			dp._dontChangeNone = false;

			return false;
		}

		return m_mainDiv;
	};

	// updates date within the picker, not for hidden or visible form elements
	function DP_setValue ( oDate )
	{
		this._hideLabelPopup();

		// if null then set None
		if ( oDate == null ) {
			if ( !m_bCurrentValueIsNone ) {
				m_bCurrentValueIsNone = true;
				this._setTopLabel();
				this._updateTable();

				if ( typeof this.onchange == 'function' ) {
					this.onchange();
				}
			}
			return;
		}

		// if string or number create a Date object
	    if ( ( typeof oDate == 'string' ) && ( oDate.length == 8 ) ) {
	        oDate = Date.parseYYYYMMDD(oDate);
	    }
		if ( ( typeof oDate == 'number' ) || ( typeof oDate == 'string' ) ) {
			oDate = new Date( oDate );
		}
		if ( oDate == 'NaN' ) { return; }

		// do not update if not really changed
		if ( m_dSelected.getDate()     != oDate.getDate()     ||
			 m_dSelected.getMonth()    != oDate.getMonth()    ||
			 m_dSelected.getFullYear() != oDate.getFullYear() ||
			m_bCurrentValueIsNone )
		{

			if ( !m_bDontChangeNone )
				m_bCurrentValueIsNone = false;

			m_dSelected = new Date( oDate );

			this._setTopLabel();
			this._updateTable();

			if ( typeof this.onchange == 'function' ) {
				this.onchange();
			}
		}

		if ( !m_bDontChangeNone ) {
			m_bCurrentValueIsNone = false;
		}
	}

	function DP_getValue () {
		if ( m_bCurrentValueIsNone ) { return null; }
		return new Date( m_dSelected ); // create a new instance
	}

	function DP_goToNextMonth () {
		var d = new Date( m_dSelected );
		d.setDate( Math.min(d.getDate(), Date.getDaysInMonth( d.getFullYear(), d.getMonth() + 1 ) ) ); // no need to catch dec -> jan for the year
		d.setMonth( d.getMonth() + 1 );
		this.setValue( d );
	}

	function DP_goToPreviousMonth () {
		var d = new Date( m_dSelected );
		d.setDate( Math.min(d.getDate(), Date.getDaysInMonth(d.getFullYear(), d.getMonth() - 1)) ); // no need to catch jan -> dec for the year
		d.setMonth( d.getMonth() - 1 );
		this.setValue( d );
	}

	function DP_goToToday () {
		if ( m_bCurrentValueIsNone ) {
			// change the selectedDate to force update if none was true
			m_dSelected = new Date( m_dSelected + 10000000000 );
		}
		m_bCurrentValueIsNone = false;
		this.setValue( new Date() );
	}

	function DP_setShowToday ( bShowToday ) {
		if ( typeof bShowToday == 'string' ) {
			bShowToday = !/false|0|no/i.test( bShowToday );
		}

		if ( m_btnToday != null ) {
			m_btnToday.style.visibility = bShowToday ? 'inherit' : 'hidden';
		}
		m_bShowToday = bShowToday;
	}

	function DP_setShowNone ( bShowNone ) {
		if ( typeof bShowNone == 'string' ) {
			bShowNone = !/false|0|no/i.test( bShowNone );
		}

		if ( m_btnNone != null ) {
			m_btnNone.style.visibility = bShowNone ? 'inherit' : 'hidden';
		}
		this._showNone = bShowNone;
	}

	// 0 is monday and 6 is sunday as in the ISO standard
	function DP_setFirstWeekDay ( nFirstWeekDay ) {
		if ( m_iFirstWeekDay != nFirstWeekDay ) {
			m_iFirstWeekDay = nFirstWeekDay;
			this._updateTable();
		}
	}

	// 0 is monday and 6 is sunday as in the ISO standard
	function DP_setRedWeekDay ( nRedWeekDay ) {
		if ( m_iRedWeekDay != nRedWeekDay ) {
			m_iRedWeekDay = nRedWeekDay;
			this._updateTable();
		}
	}



	/***********************************
	 * Protected methods
	 ***********************************/

	/* creates the table elements and inserts them into the date picker */
	function DP__createTable ( oDocument )
	{
		var iRows     = 6;
		var iCols     = 7 + ( m_bShowWeekNumber ? 1 : 0 );

		var table             = oDocument.createElement( 'table' );
			table.className   = DatePickerConfig.className_gridTable;
			table.cellSpacing = 0;

		var tBody = table.appendChild( oDocument.createElement( 'tbody' ) );

		// days row
		var tr = tBody.appendChild( oDocument.createElement( 'tr' ) );
			tr.className = DatePickerConfig.className_daysRow;

		var td = null;
		for ( var i = 0; i < iCols; i++ ) {
			td = tr.appendChild( oDocument.createElement( 'td' ) );
			td.setAttribute('width', (100 / iCols) + '%');
			td.appendChild( oDocument.createTextNode( GUI.m_nbsp ) );
		}

		// upper line
		tr = tBody.appendChild( oDocument.createElement( 'tr' ) );
		td = tr.appendChild( oDocument.createElement( 'td' ) );
		td.className = DatePickerConfig.className_upperLine;
		td.colSpan = 7;

		// rest (filled with spaces for now )
		for ( var i = 0; i < iRows; i++ ) {
			tr = tBody.appendChild( oDocument.createElement( 'tr' ) );
			for ( var j = 0; j < iCols; j++ ) {
				td = tr.appendChild( oDocument.createElement( 'td' ) );
				td.appendChild( oDocument.createTextNode( GUI.m_nbsp ) );
			}
		}

		if ( m_gridDiv != null ) {
			m_gridDiv.appendChild( table )
		}
	};

	/** updates all the text nodes inside the table as well as all the classNames on the tds */
	function DP__updateTable ()
	{
		// if no element no need to continue
		if ( m_gridDiv == null ) { return; }

		var iRows     = 6;
		var iCols     = 7 + ( m_bShowWeekNumber ? 1 : 0 );
		var iColWeekStart = 0 + ( m_bShowWeekNumber ? 1 : 0 );
		var iWeek     = 0;

		var cells = new Array( iRows );
		for ( var i = 0; i < iRows; i++ ) {
			cells   [i] = new Array( iCols );
		}

		// Set the tmpDate to first of this month
		var dThisMonth  = new Date( m_dSelected.getFullYear(), m_dSelected.getMonth(), 1, 12 );
		var iWeekDay1st = ( dThisMonth.getDay() + 6 ) % 7;
		var iFirstWeekNr= dThisMonth.getWeek();

		if ( iWeekDay1st != 0 ) {
			dThisMonth.add( Date.DAY, -iWeekDay1st );
		}

		// go through all days this month and store the text
		// and the class name in the cells matrix
		dThisMonth.add( Date.DAY, -1 );
		for ( var i = 1 - iWeekDay1st; i < 43 - iWeekDay1st; i++ )
		{
			dThisMonth.add(Date.DAY, 1 );

			// convert to ISO, Monday is 0 and 6 is Sunday
			var iWeekDay = ( dThisMonth.getDay() + 6 ) % 7;
			var iColumn  = ( iWeekDay - m_iFirstWeekDay + 7 ) % 7 + ( m_bShowWeekNumber ? 1 : 0 );
			cells[iWeek][iColumn] = { day: '', className: '', day : 0 };

			var iMonthOffset = dThisMonth.getMonth() - m_dSelected.getMonth()
			                 + 12 * ( dThisMonth.getFullYear() - m_dSelected.getFullYear() );
			if ( iMonthOffset != 0 ) {
				cells[iWeek][iColumn].className += 'disabledDate';
				//continue;
			}

			if ( iMonthOffset == 0 ) {
				if ( m_dSelected.getDate() == dThisMonth.getDate() && !m_bCurrentValueIsNone ) {
					cells[iWeek][iColumn].className += 'selected ';
				}
				if ( Date.isToday( dThisMonth ) ) {
					cells[iWeek][iColumn].className += 'today ';
				}

				if ( m_dMinimum && dThisMonth < m_dMinimum ) {
					cells[iWeek][iColumn].className += 'disabledDate';
				} else if ( m_dMaximum && dThisMonth > m_dMaximum ) {
					cells[iWeek][iColumn].className += 'disabledDate';
				} else if ( iWeekDay == m_iRedWeekDay ) {
					cells[iWeek][iColumn].className += 'red';
				}
			}

			cells[iWeek][iColumn].day   = dThisMonth.getDate();
			cells[iWeek][iColumn].month = iMonthOffset;
			cells[iWeek][iColumn].week  = iWeek;

			if ( iColumn + 1 == iCols ) {
				if ( ( iMonthOffset != 0 ) && ( iWeek != 0 ) ) {
					break;
				} else {
					iWeek++;
				}
			}
		}

		// fix day letter order if not standard
		var weekDays = DateConfig.days;
		if ( m_iFirstWeekDay != 0 ) {
			weekDays = new Array(7);
			for ( var i = 0; i < 7; i++) {
				weekDays[i] = DateConfig.days[ (i + m_iFirstWeekDay) % 7];
			}
		}

		// update text in days row to contain weekday letters
		var tds = m_gridDiv.firstChild.tBodies[0].rows[0].cells;
		for ( var i = iColWeekStart; i < iCols; i++ ) {
			tds[i].firstChild.data = weekDays[i - iColWeekStart];
		}

		// update the text nodes and class names
		var trs = m_gridDiv.firstChild.tBodies[0].rows;
		var tmpCell = null;
		for ( var y = 0; y < iRows; y++ )
		{
			for ( var x = iColWeekStart; x < iCols; x++ )
			{
				if ( iColWeekStart != 0 ) {
				}

				tmpCell = trs[y + 2].cells[x];
				if ( typeof cells[y][x] != 'undefined' ) {
					tmpCell.className = cells[y][x].className;
					tmpCell.firstChild.data = cells[y][x].day;
					tmpCell.day   = cells[y][x].day;
					tmpCell.month = cells[y][x].month;
					tmpCell.week  = cells[y][x].week;
				} else {
					tmpCell.className = '';
					tmpCell.firstChild.data = GUI.m_nbsp;
					tmpCell.day   = null;
					tmpCell.month = 0;
					tmpCell.week  = null;
				}
			}
		}

		if ( m_bShowWeekNumber )
		{
			for ( var y = 0; y <= iWeek; y++ )
			{
				tmpCell = trs[y + 2].cells[0];
				tmpCell.className = DatePickerConfig.className_weeksCol;
				tmpCell.firstChild.data = iFirstWeekNr + y;
			}
			for ( var y = iWeek+1; y < iRows; y++ )
			{
				trs[y + 2].cells[0].firstChild.data = '';
			}
		}
	}

	/** sets the label showing the year and selected month */
	function DP__setTopLabel () {
		var str = m_dSelected.getFullYear() + ' ' + DateConfig.months[ m_dSelected.getMonth() ];
		//if ( m_lblTop != null ) {
		if ( m_lblTop && m_lblTop.lastChild ) {
			m_lblTop.lastChild.data = str;
		}
	}

	function DP__showLabelPopup () 
	{

		var dateContext = function ( dp, d ) {
			return function ( e ) {
				dp._dontChangeNone = true;
				dp._hideLabelPopup();
				dp.setValue( d );
				dp._dontChangeNone = false;
				return false;
			};
		};

		var dp = this;

		// clear all old elements in the popup
		while ( m_lblPopup.hasChildNodes() ) {
			m_lblPopup.removeChild( m_lblPopup.firstChild );
		}

		var a, tmp, tmp2;
		var iMonthSelectListLength = 5;
		for ( var i = (1-iMonthSelectListLength); i < iMonthSelectListLength; i++ )
		{
			tmp = new Date( m_dSelected );
			tmp2 = new Date( m_dSelected ); // need another tmp to catch year change when checking leap
			tmp2.setDate(1);
			tmp2.setMonth( tmp2.getMonth() + i );
			tmp.setDate( Math.min(tmp.getDate(), Date.getDaysInMonth(tmp2.getFullYear(), tmp.getMonth() + i)) );
			tmp.setMonth( tmp.getMonth() + i );

			a = m_lblPopup.appendChild( m_document.createElement( 'a' ) );
			a.href = 'javascript:void 0;';
			a.onclick = dateContext( dp, tmp );
			a.appendChild( m_document.createTextNode( tmp.getFullYear() + ' ' +
										DateConfig.months[ tmp.getMonth() ] ) );
			if ( i == 0 ) {
				a.className = DatePickerConfig.className_selectedMonth;
			}
		}

		m_lblTop.parentNode.insertBefore( m_lblPopup, m_lblTop.parentNode.firstChild );

	}

	function DP__hideLabelPopup () {
		//if ( typeof m_lblPopup.parentNode != 'undefined' ) {
		if ( m_lblPopup && (typeof m_lblPopup.parentNode != "unknown" ) && (m_lblPopup.parentNode != null) ) {
			m_lblPopup.parentNode.removeChild( m_lblPopup );
		}
	}

	function DP_copyDate(element, date, oDocument)
	{
	    oDocument = oDocument || document;
	    if ( typeof element == 'string' ) { element = oDocument.getElementById(element); }

	    if ( typeof date == 'string' ) {
	        date = Date.parseYYYYMMDD(date);
	    }
	    // set value of picker calendar
	    this.setValue(date);

		// set value on form elements
        var elementHidden = this.getHiddenElement(element, true, oDocument);
	    this._copyToElementValue(element, elementHidden);
	}

	function DP__copyToElementValue(element, elementHidden) 
	{
        if ( typeof element == 'string' ) { element = document.getElementById(element); }
        
        if ( element.disabled ) { return; } // TODO: configurable

		var d = this.getValue();

		var sYYYYMMDD  = '';
		var sFormatted = '';
		if ( d ) {
			sFormatted = DateFunctions.formatDate(d, this._returnFormat); // requires /qv/other/DateFunctions.js
			sYYYYMMDD =  d.toYYYYMMDD();
		}

		var bFireChangeEvent = false;
		bFireChangeEvent = bFireChangeEvent || (element.value != sFormatted);
		element.value = sFormatted;
		if ( elementHidden ) {
			bFireChangeEvent = bFireChangeEvent || (elementHidden.value != sYYYYMMDD);
//alert(bFireChangeEvent + "\n'" + elementHidden.value + "' != '" + sYYYYMMDD + "'");
		    elementHidden.value = sYYYYMMDD;
		}

		// trigger onchange manually: --> not triggered automaticly when setting value with javascript
		if ( element.onchange && bFireChangeEvent ) {
			if ( element.fireEvent ) {
    			element.fireEvent('onchange'); // works in IE 60 (not in NS7)
			} else {
				e = { type : 'change', srcElement : element }; // create dummy event object
    			element.onchange(e); // works in IE60,IE55, NS7, not ideal in IE
			}
		}
	}

	function DP__copyFromElementValue(element, bMandatory)
	{
	    if ( typeof element == 'string' ) { element = document.getElementById(element); }
	    
	    if ( typeof bMandatory != 'boolean' ) {
	        bMandatory = (this._showNone == false);
	    }
		var d = DateFunctions.getDateFromFormat(element.value, this._returnFormat); // requires /qv/other/DateFunctions.js
		if ( ( d == null ) || ( element.value.length==0 ) ) {
			this.goToToday();
		} else {
			this.setValue(d);
		}

		this.setShowNone(bMandatory==false);
	}

	function DP__copyOpenerProperties(openerPopup)
	{
		this.setDateFormat(openerPopup._returnFormat);
		this._showNone    = openerPopup._showNone;
	}
}

DatePicker.prototype = new Popup;
DatePicker.prototype.constructor = DatePicker;

DatePicker.prototype.onchange          = function () {};

DatePicker.prototype.changeColors      = function (sBgColorStyle, sTextColorStyle) {
    var ruleBgColor    = StyleSheetUtil.getRule(sBgColorStyle  , true);
    var ruleTextColor  = StyleSheetUtil.getRule(sTextColorStyle, true);
    var sMainColor     = ruleBgColor   ? ruleBgColor.style.backgroundColor : null;
    var sMainTextColor = ruleTextColor ? ruleTextColor.style.color         : null;

    var datePickerRule = StyleSheetUtil.getRule(DatePickerConfig.className_datePicker + ' .' + DatePickerConfig.className_headerDiv, true);
    if ( datePickerRule && sMainColor ) {
        datePickerRule.style['backgroundColor'] = sMainColor;
    }

    var datePickerRule = StyleSheetUtil.getRule(DatePickerConfig.className_datePicker + ' .' + DatePickerConfig.className_topLabel, true);
    if ( datePickerRule && sMainTextColor ) {
        datePickerRule.style['color'          ] = sMainTextColor;
    }
};

DatePicker.loadStyleSheet = function(oDocument)
{
    oDocument = oDocument || document;

//	if ( DatePicker.styleSheetLoaded == false ) {
		if ( GUI.isCSSElementInPresent('DatePicker.css', oDocument) == false ) {
			var sStyleSheet = ContextFinals.CSSPATH + 'qv/gui/date/DatePicker.css';

			GUI.addCSSElementToHead(sStyleSheet, oDocument);
		}
		//DatePicker.styleSheetLoaded = true;
//	}
}
/**************************
 * DatePickerConfig class
 **************************/
var DatePickerConfig = {
	className_datePicker     : 'datePicker',
	className_headerDiv      : 'header',
	className_headerTable    : 'headerTable',
	className_previousButton : 'previousButton',
	className_labelTd        : 'labelContainer',
	className_topLabel       : 'topLabel',
	className_labelPopupDiv  : 'labelPopup',
	className_nextButton     : 'nextButton',
	className_gridDiv        : 'grid',
	className_footerDiv      : 'footer',
	className_footerTable    : 'footerTable',
	className_todayButton    : 'todayButton',
	className_filler         : 'filler',
	className_noneButton     : 'noneButton',
	className_gridTable      : 'gridTable',
	className_daysRow        : 'daysRow',
	className_weeksCol       : 'weeksCol',
	className_upperLine      : 'upperLine',
	className_selectedMonth  : 'selected',

    captions    : ['Today'       , 'None'    ],
    captions_en : ['Today'       , 'None'    ],
    captions_nl : ['Vandaag'     , 'Geen'    ],
    captions_de : ['Heute'       , 'Keine'   ],
    captions_fr : ['Aujourd\'hui', 'Rien'    ],
    captions_it : ['Oggi'        , 'Vuoto'   ],
    captions_es : ['Hoy'         , 'Ninguno' ]
}

var datePicker = new DatePicker();
/**
 * Helper class to work with events in different browsers.
 * QuadroVision
 * when used within netscape include NodeTypes.js as well
 */
var EventHelper = {

	getEvent:	function (e, element)
	{
		if ( !e ) { // IE --> get handle to event the IE way
			if (element && element.document) { e = element.document.parentWindow.event; }
			else                             { e = window.event; }
		}
		if ( !e ) { return null; }
		// in some cases this seems can be the case,
		// e.g. when element.onchange() is triggered without passing an manually created event object e

		if ( !e.srcElement ) { //  NS --> fill .srcElement with NS property
			var element = e.target;
			while ( ( element != null ) && ( element.nodeType != NodeTypes.ELEMENT ) ) {
				element = element.parentNode;
			}
			if ( element ) { e.srcElement = element; }
		}
		if ( typeof e.offsetX == "undefined" ) { // NS --> fill .offset property with NS property .layer
			e.offsetX = e.layerX;
			e.offsetY = e.layerY;
		}

		//	simulate ie properties when running in ns
		if ( e.type.startsWith('key') && window.Event && e.modifiers) { // fill IE properties using NS properties
			e.altKey   = (e.modifiers & Event.ALT_MASK    ) ? true : false;
			e.ctrlKey  = (e.modifiers & Event.CONTROL_MASK) ? true : false;
			e.shiftKey = (e.modifiers & Event.SHIFT_MASK  ) ? true : false;
			e.keyCode  = e.which;
		}
//LogWriter.log('e.ctrlKey : ' + e.ctrlKey);
		return e;
	}
}
var LanguageHelper =
{
    languageCode : null,

    setLanguageCode : function(s) {        this.languageCode = s; },
    getLanguageCode : function()  {
        if ( this.languageCode == null ) {
            this.languageCode = this.getLanguageCodeFromOpener();
        }
        this.languageCode = this.languageCode || 'en';

        return this.languageCode;
    },

    /** set language properties correct for an object that serves as a resource object */
	setLanguage : function ( object, sProp, sLanguageCode ) {
	    sLanguageCode = sLanguageCode || this.getLanguageCode();
		var prop = object[sProp + '_' + sLanguageCode];
		if ( prop ) {
			object[sProp] = prop;
		} else {
			object[sProp] = object[sProp + '_en'];
		}
		this.spacesToNbsp(object[sProp]);

		return object[sProp];
	},

	spacesToNbsp : function(ar) {
	    for (var i = 0; i < ar.length; i++) {
	        var s = ar[i];
	        var split = s.split(' ');
	        s = split.join(String.fromCharCode( 160 ));
	        ar[i] = s;
	    }
	},

	getLanguageCodeFromOpener: function() {
        var sLanguageCode = null;
        if ( window.top.opener && window.top.opener.LanguageHelper ) {
            sLanguageCode = window.top.opener.LanguageHelper.getLanguageCode();
        } else if ( opener && opener.LanguageHelper ) {
            sLanguageCode = opener.LanguageHelper.getLanguageCode();
        }
        return sLanguageCode;
	}
}
// umlaut
// ae = \u00E4
// oe = \u00F6
// ue = \u00FC

// accent /
// e = \u00E9

// accent \

// dakje
// o = \u00FB
/**************************
 * Cookie class
 * requires Date.js
 * QuadroVision
 **************************/

function Cookie(sName, sValue, iMaxAge)
{
	var m_sName      = sName;
	var m_sValue     = null;
	var m_sDomain    = null;
	var m_sPort      = null;
	var m_sPath      = null;
	var m_bSecure    = false;
	var m_iMaxAge    = iMaxAge || (1000 * 60 * 15); // 15 minutes default

	var m_properties = [];

	this.getName     = function()   { return m_sName;              };
	this.getValue    = function()   { return m_sValue;             };
	this.setValue    = function(s)  {        m_sValue = s;        this.setPropertiesFromValue(); };
	this.setProperty = function(k,v){        m_properties[k] = v; this.setValueFromProperties()  };

	this.isEmpty     = function()  { for(var key in m_properties){return false;}return true;}

	this.getDomain   = function()  { return m_sDomain;     };
	this.setDomain   = function(d) {        m_sDomain = d; };
	this.getPort     = function()  { return m_sPort;       };
	this.setPort     = function(p) {        m_sPort   = p; };
	this.getPath     = function()  { return m_sPath;       };
	this.setPath     = function(p) {        m_sPath   = p; };
	this.getSecure   = function()  { return m_bSecure;     };
	this.setSecure   = function(s) {        m_bSecure = s; };
	this.getMaxAge   = function()  { return m_iMaxAge;     };
	this.setMaxAge              = Cookie_setMaxAge; // max age in milli-seconds
	this.load                   = Cookie_load;
	this.store                  = Cookie_store;
	this.remove                 = Cookie_remove;
	this.setPropertiesFromValue = Cookie_setPropertiesFromValue;
	this.setValueFromProperties = Cookie_setValueFromProperties;
	this.getIntValue            = Cookie_getIntValue;
	this.getIntProperty         = Cookie_getIntProperty;
	this.getProperty            = Cookie_getProperty;

	this.copyProperties2Form    = Cookie_copyProperties2Form;
	this.saveFormValues         = Cookie_saveFormValues;

	if ( sValue ) {
		this.setValue(sValue);
	} else {
		// try to load value from document
		this.load();
	}

	function Cookie_getIntValue(iDefault)
	{
	    var iValue = parseInt(m_sValue);
	    if ( isNaN(iValue) ) { iValue = iDefault; }
	    return iValue;
	}

	function Cookie_getProperty(k,d)
	{
	    var sReturn = m_properties[k];
	    if ( !sReturn && d ) { sReturn = d; }
	    return sReturn;
	}

	function Cookie_getIntProperty(key, iDefault)
	{
	    var iValue = parseInt(m_properties[key]);
	    if ( isNaN(iValue) ) { iValue = iDefault; }
	    return iValue;
	}

	function Cookie_load(_document)
	{
		_document = _document || document;

		var cookies = _document.cookie;
		var cookieValue  = cookies.match(new RegExp(m_sName + "\\s*=\\s*([^;]*)"));
		if( cookieValue == null ) { return; }
		m_sValue = cookieValue[1];

		this.setPropertiesFromValue();
	}

	/** Splits the cookie value into properties. Assumes the value of the cookie contains several entries <key>:<value> separated by a '~' */
	function Cookie_setPropertiesFromValue()
	{
		m_properties = [];
		if ( m_sValue == null ) { return; }

		var props = m_sValue.split(new RegExp("\\s*" + Cookie.ESC_AMP + "\\s*"));
		for( var i = 0; i < props.length ; i++ ) {
			var prop = props[i].split(/\s*:\s*/);
			var propKey = unescape(prop[0]);
			if ( prop.length == 1 ) { m_properties[propKey] = ""; }
			else                    { m_properties[propKey] = unescape(prop[1]); }
		}
	}

	function Cookie_setValueFromProperties()
	{
		m_sValue = "";
		for(var key in m_properties) {
			m_sValue+=escape(key)+":"+escape(this.getProperty(key))+Cookie.ESC_AMP;
		}
		if ( m_sValue.charAt(m_sValue.length-1)==Cookie.ESC_AMP ) {
			m_sValue=m_sValue.substring(0,m_sValue.length-1);
		}
		return m_sValue;
	}

	function Cookie_store(_document)
	{
		_document = _document || document;

		var cookie = m_sName + "=" + m_sValue;

		if ( m_sDomain != null ) { cookie+=";Domain=" + m_sDomain; }
		if ( m_sPath   != null ) { cookie+=";Path="   + m_sPath;   }
		if ( m_bSecure         ) { cookie+=";Secure";              }
		if ( m_iMaxAge != null ) {
			var date = new Date();
			date.setTime( date.getTime() + ( m_iMaxAge ) );
			cookie+=";expires="+date.toUTCString();
		}
		_document.cookie = cookie;
	}

	function Cookie_remove(_document)
	{
		_document = _document || document;
		_document.cookie = m_sName + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;";
	}

	// max age in milli-seconds
	function Cookie_setMaxAge(date)
	{
		if ( typeof date == 'date' ) {
			var now = new Date();
			var maxage= now.getTime()-date.getTime();
				maxage=Math.round(maxage);
			this.setMaxAge(maxage);
		} else {
			m_iMaxAge = date;
		}
	}

	function Cookie_copyProperties2Form(fForm)
	{
	    var formManager = new FormManager(fForm);
		for ( var key in m_properties )
		{
		    var element = fForm.elements[key];
		    if ( element ) {
			    var sValue = this.getProperty(key);
			    // element.value = sValue;
			    formManager.setInput(key, sValue)
			}
		}
	}

	function Cookie_saveFormValues(fForm)
	{
	    var elements = fForm.elements;
		for ( var i =0; i < elements.length; i++  )
		{
		    var element = elements[i];
            var sName  = element.name;
            var sValue = element.value;
            if ( sValue == 'undefined' ) { sValue = ''; }
            if ( element.type == 'checkbox' ) {
                sValue = element.checked?sValue:'';
            }
            m_properties[sName] = sValue;
		}
        this.setValueFromProperties();
		this.store();
	}
}

Cookie.ESC_AMP = "\x26";
Cookie.checkEnabled = function() {
    if ( document.cookie.length == 0 ) {
    	document.cookie = "COOKIEENABLED=true; expires=31 Dec 2007 23:59:59 GMT;";
    	var cookies = document.cookie;
	    return ( ( cookies != null ) && ( cookies.length != 0 ) );
    } else {
    	return true;
    }
}
Cookie.isEnabled = Cookie.checkEnabled();
/**
 * Array is an existing class in JavaScript and extended by Quadrovision
 */

/******************************************************************************
 * Life cycle methods
 *****************************************************************************/


/******************************************************************************
 * Public methods
 *****************************************************************************/

//for IE5.0 support (and others)
if (!Array.prototype.push) { Array.prototype.push = function(o) { this[this.length] = o; return this.length; }; }
if (!Array.prototype.pop) { Array.prototype.pop = function() { return this.splice(this.length - 1, 1)[0]; }; }
if (!Array.prototype.splice) {
    Array.prototype.splice = function(s, d) {
        var a = []; // The return value array
        var e;  // element
        var i = Math.max(arguments.length - 2, 0); // insert count
        var k = 0;
        var l = this.length;
        var n;  // new length
        var v;  // delta

        s = s || 0;
        if (s < 0) { s += l; }
        
        s = Math.max(Math.min(s, l), 0); // start point
        d = Math.max(Math.min((typeof d == 'number')? d : l, l - s), 0); // delete count
        v = i - d;
        n = l + v;
        
        while ( k < d ) 
        {
            e = this[s + k];
            if ( typeof e != 'undefined' ) { a[k] = e; }
            k += 1;
        }
        
        var x = l - s - d;
        if ( v < 0 ) {
            k = s + i;
            while (x) 
            {
                this[k] = this[k - v];
                k += 1;
                x -= 1;
            }
            this.length = n;
        } else if ( v > 0 ) {
            k = 1;
            while (x) 
            {
                this[n - k] = this[l - k];
                k += 1;
                x -= 1;
            }
        }
        
        for (k = 0; k < i; ++k) { this[s + k] = arguments[k + 2]; }
        
        return a;
    };
}

Array.prototype.indexOf     =function(o)   { for( var i=0; i<this.length; i++ ) { if ( this[i]==o ) return i; } return-1; };
Array.prototype.isArray     =function()    { return true; }
Array.prototype.lastIndexOf =function(o)   { for( var i=this.length-1; i>=0; i--){ if ( this[i]==o ) return i;} return-1; };
Array.prototype.contains    =function(o)   { return this.indexOf(o)!= -1; };
Array.prototype.copy        =function(o)   { return this.concat(); };
Array.prototype.insertAt    =function(o,i) { this.splice(i,0,o); };
Array.prototype.insertBefore=function(o,o2){ var i=this.indexOf(o2);if(i==-1)this.push(o);else this.splice(i  ,0,o); };
Array.prototype.insertAfter =function(o,o2){ var i=this.indexOf(o2);if(i==-1)this.push(o);else this.splice(i+1,0,o); };
Array.prototype.removeAt    =function(i)   { this.splice(i,1); };
Array.prototype.remove      =function(o)   { var i=this.indexOf(o);if(i!= -1)this.splice(i,1); };
Array.prototype.size        =function()    { return this.length; };


/* SJN 20041209 => END TEST  */
Object.prototype.clone = function () 
{
	var o = new Object(); 
	for (var property in this) 
	{
		var oVal = this[property];
		if ( ! oVal ) { continue; }
		o[property] = ( typeof oVal == 'object' ? oVal.clone() : oVal );
	} 
	return o;
}
Array.prototype.clone = function () 
{
	var a = new Array(); 
	for (var property in this) 
	{
		var oVal = this[property];
		if ( ! oVal ) { continue; }
		a[property] = ( typeof oVal == 'object' ? oVal.clone() : oVal );
	} 
	return a;
}
/* SJN 20041209 => START TEST  */

/** e.g. used when alert is invoked with an array as parameter */
Array.prototype.toString=function()    {
	var s = '';
	for (var i = 0; i < this.length; i++ ) {
		var o = this[i];
		if ( i != 0 ) {
			if ( o && ( o.constructor == Array ) ) { s += '\n'; }
			else                          {
				s += ',';
			}
		}
		//s += o.valueOf();
		s += String(o);
	}
	return s;
}
Array.prototype.valueOf=function()    { return this.toString(); }

/**
 * Creates a new array where the current array index numbers actually containing values
 * become part of the values by
 * - turning the values into an array (if the values are not yet arrays)
 * - adding the index as first element to the value ( if it is already an array)
 */
Array.prototype.addIndexAsFirstElement = function()
{
    var arReturn = new Array();
    for(var i = 0; i < this.length; i++ )
    {
        var oObject = this[i];
        if ( ! oObject ) { continue; }
        if ( oObject.constructor == Array ) {
            oObject.unshift(i); // js 5.5
        } else {
            oObject = [ i, oObject ];
        }
        arReturn.push(oObject); // js 5.5
    }
    return arReturn;
}

/**
 * Method that works on a 2-dimensional array and returns a html table representing data from this array.
 */
Array.prototype.toTable = function(iaColumns, iaWidths, iColorColumn, trOnClick, trClassName, iStart, iEnd)
{
	iStart = iStart || 0;
	iEnd   = iEnd   || this.length;

	var table = document.createElement('table');
	var tbody = table.appendChild( document.createElement('tbody') );

    for (var r = iStart; r < iEnd; r++)
    {
        var data = this[r];
        if ( ! data ) { continue; }

		var tr = tbody.appendChild( document.createElement('tr') );
        tr.data = data;
        if ( trOnClick   ) { tr.onclick   = trOnClick;   }
        if ( trClassName ) { tr.className = trClassName; }

        for (var c = 0; c < iaColumns.length; c++)
        {
            var iCol   = iaColumns[c];
            var sValue = data[iCol];

		    var td = tr.appendChild( document.createElement('td') );
			    td.style.width = iaWidths[c];
            if ( iColorColumn == c ) {
                td.bgColor     = sValue;
            } else {
                td.appendChild( document.createTextNode( sValue ) );
            }
		}
    }

    return table;
}

/**
 * Method that searches an array for a certain element and if found returns its index within the array.
 * If the array is 2-dimensional a 'column index' can be specified to compare the search value with.
 * ( i.e. simple version of finding a row in a rowset).
 * If the specified value is not found -1 is returned.
 */
Array.prototype.findIndex = function(sValue, iColumn)
{
	for( var r = 0; r < this.length; r++ )
	{
		var data = this[r];
		if ( ! data ) { continue; }

		if ( ( data.constructor == Array ) && ( typeof iColumn == 'number' ) ) {
			if ( data[ iColumn ] == sValue ) { return r; }
		} else {
			if ( data == sValue ) { return r; }
		}
	}
	return -1;
}

Array.prototype.getDimension = function()
{
    var iDimension = 1;
    var arSub = this;
    while ( true )
    {
        arSub = arSub[0];
        if ( !arSub ) { break; }
        
        if ( arSub.constructor == Array ) {
            iDimension++;
        } else {
            break;
        }
    }
    return iDimension;
}

/** compares two arrays by comparing there elements (recursivly) */
Array.prototype.equals = function(a)
{
	if ( a == null ) { return false; }
	if ( a.length != this.length ) { return false; }
	for (var i = 0; i < this.length; i++ ) {
		if ( a[i] && ( typeof a[i].equals == 'function' ) ) {
			if ( a[i].equals(this[i]) == false ) { return false; }
		} else if ( this[i] != a[i] ) {
			return false;
		}
	}
	return true;
}
/** replaces single values in a (more dimensional) array */
Array.prototype.replaceValues = function(oldValue, newValue)
{
	for (var i = 0; i < this.length; i++ ) {
		if ( this[i] == oldValue ) { this[i] = newValue; }
		if ( this[i].constructor == Array ) { this[i].replaceValues(oldValue, newValue); }
	}
}

/** wrappers for accessing 2-dimensional arrays by passing a 1 dimensional array with length 2 as a 'location'-parameter */
Array.prototype.get = function(i)
{
	if ( i.constructor == Array ) { return this[i[0]][i[1]]; }
	return this[i];
};
Array.prototype.set = function(i,v)
{
	if ( i.constructor == Array ) { this[i[0]][i[1]] = v; return; }
	this[i]=v;
};
Array.prototype.coordinateOf = function(v, co)
{
	co = co || new Array(1);
	var iDepth = co.length;
	for (var i=0; i < this.length; i++) {
		co[iDepth-1] = i;
		var a = this[i];
		if ( a.constructor == Array ) {
			if ( i==0) { co.push(-1); }
			var coFind = a.coordinateOf(v, co);
			if ( coFind ) { return coFind; }
		}
		else if ( a==v ) {
			return co;
		}
	}
	return null;
}

/******************************************************************************
 * Static methods
 *****************************************************************************/

/** returns a 2-dimensional array (x by x) with all values set to default d */
Array.createSquare = function(x,d)
{
	return Array.createRectangle(x,x,d);
}
/** returns a 2-dimensional array (x by y) with all values set to default d */
Array.createRectangle = function(x,y,d)
{
	var a = new Array(x);
	for (var i=0; i < x; i++) {
		a[i] = new Array(y);
		if ( typeof d != 'undefined' ) { for (var j = 0; j < y; j++ ) { a[i][j] = d; } }
	}
	return a;
}
Array.createLine = function(x,d)
{
	var a = new Array(x);
	if ( typeof d != 'undefined' ) {
		for (var i=0; i < x; i++) {a[i] = d;}
	}
	return a;
}

Number.prototype.toPercentage = function(decimals)
{
    var decimals = decimals || 0;
    var catalyst = 100 * Math.pow(10, decimals);

    var fixedNum = Math.round(parseFloat(this) * catalyst) / ( catalyst/100);
//LogWriter.log('[] fixedNum : ' + fixedNum);
    return fixedNum;
}

Number.prototype.toFixed = function(decimals, sDecimalSeparator)
{
    var decimals = decimals || 2; // defaults to two
    var sDecimalSeparator = sDecimalSeparator || ".";
    var catalyst = Math.pow(10, decimals);

    var fixedNum = Math.round(parseFloat(this) * catalyst) / catalyst;

    if ( fixedNum % 1 ) {
        var sValue    = fixedNum.toString();
        iIndexDot     = sValue.indexOf(".");
        var sDecimals = sValue.substring(iIndexDot+1);
        for ( i = sDecimals.length; i < decimals; i++ )
        {
            sValue    = sValue + "0";
        }
        return sValue;
    } else {
        var str = sDecimalSeparator;

        while(decimals--)
        {
          str += "0";
        }

        return fixedNum + str;
    }
}
Number.prototype.padLeft = function(iLength, cChar)
{
    if ( cChar.length != 1 ) { return; }

    var s = '' + this;
    while ( s.length < iLength ) {
        s = cChar + s;
    }
    return s;
}
Number.prototype.padRight = function(iLength, cChar)
{
    if ( cChar.length != 1 ) { return; }

    var s = '' + this;
    while ( s.length < iLength ) {
        s += cChar;
    }
    return s;
}
Number.hexValues = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];
Number.prototype.toHex = function() {
    var sReturn = '';
    if ( this >= 16 ) {
        var iModulo  = this % 16;
        var iRounded = ( this - iModulo ) / 16;
        return iRounded.toHex() + Number.hexValues[iModulo];
    } else {
        return Number.hexValues[this];
    }
}

Number.parseHex = function(s)
{
    s = s.toLowerCase();
    if ( s.startsWith('0x') == false ) { s = '0x' + s; }
    var i = parseInt(s,16);
    return i;
}
/**
 * Serialization
 *
 * INTEGER ::=  US INTEGER_VALUE US
 */
/* IHE 20041022: nog even niet: gooit communicatie van panelid request id etc overhoop.
Number.prototype.writeObject = function()
{
    var s = null;

    s  = ProtocolFinals.CLASS_INTEGER;
    s += ProtocolFinals.US;
    s += this;
    s += ProtocolFinals.US;

	return s;
}
*/
function formatNumber(elementID)
{
    var oElement       = document.getElementById(elementID);
    if (!oElement) { return; }

    var sValue         = oElement.innerText;
    if ( sValue.length==0 ) { return; }

    var fValue         = parseFloat(sValue);
    if ( isNaN(fValue) ) { return; }

    oElement.innerText = fValue.toLocaleString();
}

function formatNumberInput(sFormName, elementID, decimals)
{
    if ( ! decimals ) { decimals = 2; }
    var oForm          = document.forms[sFormName];
    var oElement       = oForm.elements[elementID];
    if (!oElement) { return; }
    var sValue         = oElement.value;
    var fValue         = parseFloat(sValue);
    fValue             = fValue.toFixed(decimals);
    if ( isNaN(fValue) ) { return; }
    oElement.value     = fValue;
}

String.prototype.equals = function(s)
{
    return (this == s);
}

String.prototype.startsWith = function(s)
{
    var sStart = this.substr(0,s.length);
    return (sStart == s);
}
String.prototype.padLeft = function(iLength, cChar)
{
    if ( cChar.length != 1 ) { return; }

    var s = String(this);
    while ( s.length < iLength ) {
        s = cChar + s;
    }
    return s;
}
String.prototype.padRight = function(iLength, cChar)
{
    if ( cChar.length != 1 ) { return; }

    var s = String(this);
    while ( s.length < iLength ) {
        s += cChar;
    }
    return s;
}
String.prototype.endsWith = function(s)
{
    var sEnd = this.substr(this.length-s.length);
    return (sEnd == s);
}

String.prototype.removeSuffix = function(s)
{
    var iSuffixLength = s.length;
    var sEnd = this.substr(this.length-iSuffixLength);
    if ( sEnd == s ) {
        return this.substr(0, this.length-iSuffixLength);
    } else {
        return this;
    }
}
String.prototype.removePrefix = function(s)
{
    var iPrefixLength = s.length;
    var sStart = this.substr(0, iPrefixLength);
    if ( sStart == s ) {
        return this.substr(iPrefixLength, this.length);
    } else {
        return this;
    }
}
String.prototype.isPercentage = function()
{
	return (this.asPercentage() != null);
}

String.prototype.asPercentage = function()
{
	var s = this.trim();
	if ( s.endsWith("%") == false ) { return null; }

	s = s.removeSuffix("%");
	var i = parseInt(s);
	if ( isNaN(i) ) { return null; }

	return "" + i + "%";
}

String.prototype.isInteger = function()
{
	return (this.asInteger() != null);
}

String.prototype.asInteger = function()
{
	var s = this.trim();

	var i = parseInt(s);
	if ( isNaN(i) ) { return null; }

	if ( i != Math.round(i) ) { return null; }

	return i;
}

String.prototype.isNumeric = function()
{
	return (this.asNumber() != null);
}
String.prototype.asNumber = function()
{
	var s = this.trim();

	var i = parseInt(s);
	if ( isNaN(i) ) { return null; }

	return i;
}

String.WHITESPACE = new String(" \t\n\r");
String.prototype.lTrim = function()
{
   var whitespace = String.WHITESPACE;
   var s = new String(this);

   if (whitespace.indexOf(s.charAt(0)) != -1) {
      // We have a string with leading blank(s)...
      var j=0, i = s.length;
      // Iterate from the far left of string until we
      // don't have any more whitespace...
      while (j < i && whitespace.indexOf(s.charAt(j)) != -1)
         j++;
      // Get the substring from the first non-whitespace character to the end of the string...
      s = s.substring(j, i);
   }
   return s;
}

String.prototype.rTrim = function()
{
   // We don't want to trip JUST spaces, but also tabs, line feeds, etc.  Add anything else you want to
   // "trim" here in Whitespace
   var whitespace = String.WHITESPACE;
   var s = new String(this);

   if (whitespace.indexOf(s.charAt(s.length-1)) != -1) {
      // We have a string with trailing blank(s)...
      var i = s.length - 1;       // Get length of string
      // Iterate from the far right of string until we don't have any more whitespace...
      while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)
         i--;
      // Get the substring from the front of the string to where the last non-whitespace character is...
      s = s.substring(0, i+1);
   }
   return s;
}

String.prototype.lrTrim = function()
{
   return this.rTrim().lTrim();
}

String.prototype.trim = function()
{
    // Use a regular expression to replace leading and trailing spaces with the empty string
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

/**
 * Serialization
 *
 * STRING ::=  LENGTH US STRING_VALUE US
 */
String.prototype.writeObject = function()
{
    var s = null;

    s  = ProtocolFinals.CLASS_STRING;
    s += ProtocolFinals.US
	s += this.length;
    s += ProtocolFinals.US
	s += this;   // String(this) ?
    s += ProtocolFinals.US

	return s;
}

/*
String.prototype.trim=function(){
	return this.replace(/(^\s+)|\s+$/g,"");
};
*/

/*******************************************************************************
 * Life cycle methods
 ******************************************************************************/

function StringBuffer()
{
	this.buffer = [];
	this.iParts = 0;
}

/*******************************************************************************
 * pu