function showImage(a) {

	jQuery('<div id="quickImageShow"><img src="'+jQuery(a).attr('href')+'"/></div>')
		.click( function () { jQuery(this).remove() } )
		.appendTo(document.body);
	return false;
}


//window.onerror = function () { return false }

function open_window (url) {
	newwindow=window.open(url,'name','height=700,width=1000,menubar=none,resizable=no,scrollbars=yes,location=no');
	if (window.focus) {newwindow.focus()}
}

function openOrderWindow (url) {
	newwindow=window.open(url,'orderView','height=600,width=1000,menubar=none,resizable=no,scrollbars=yes,location=no');
	if (window.focus) {newwindow.focus()}
}

function openSearchPopup (url) {
	newwindow=window.open(url,'popupSearch','height=500,width=400,menubar=none,resizable=no,scrollbars=yes,location=no');
	if (window.focus) {newwindow.focus()}
}

/** Excel tuonti nakymia **/

function excelImportView (url) {
    self.name='mainWindow';
    newwindow=window.open(url,'popupExcelImport','height=200,width=400,menubar=none,resizable=no,scrollbars=no,location=no');
	if (window.focus) {newwindow.focus()}
}
/** Tuoteryhma haku **/

function open_window_prdGroup (url) {
	newwindow=window.open(url,'prdGroup','height=500,width=400,menubar=none,resizable=no,scrollbars=no,location=no');
	if (window.focus) {newwindow.focus()}
}
/** Tuoteluokka haku **/

function open_window_prdClass (url) {
	newwindow=window.open(url,'prdClass','height=500,width=400,menubar=none,resizable=no,scrollbars=no,location=no');
	if (window.focus) {newwindow.focus()}
}
/** Tuotemerkki haku **/

function open_window_prdMark (url) {
	newwindow=window.open(url,'prdMark','height=500,width=400,menubar=none,resizable=no,scrollbars=no,location=no');
	if (window.focus) {newwindow.focus()}
}
/* nimi1 uuden nimen lisays **/

function openWindowNewName (url) {
	newwindow=window.open(url,'newName','height=150,width=300,menubar=none,resizable=no,scrollbars=no,location=no');
	if (window.focus) {newwindow.focus()}
}

/* n�yt� sivu */
swap = vaihdateksti = function (id)
   {
      var edel = document.getElementById("previous").innerHTML;
      if (edel != "") document.getElementById(edel).style.display= 'none';
      document.getElementById("previous").innerHTML = id;
      var obj = document.getElementById(id)
       if (obj.style.display == 'inline')  obj.style.display = 'none';
       else obj.style.display = 'inline';
   }


function render(url, inputElementId, resultDivId) {
    var productId = null;
    if ($('productId') != null) {
        productId = $('productId').value;
    }
    if (!$(resultDivId)) {
        return false;
    }

    var inputElement = $(inputElementId);

    var requestUrl = url + "?" + inputElement.name + "=" + inputElement.value;

    if (productId != null) {
        requestUrl += "&productId=" + productId;
    }

    requestUrl += "&timeStamp=" + new Date().getTime();

    new Ajax.Request(requestUrl,
      {
        method:'get',
        onSuccess: function(transport) {
            var response = transport.responseText || messages.javascript.ajax.noResponseText();
            var divElement = $(resultDivId);
            jQuery(divElement).html(response);

            if ( resultDivId == 'applicationProductNameDiv' ) {
                registerDynamicProductNameDialogEventHandlers();
            } else if ( resultDivId == 'applicationProductSeriesDiv' ) {
                registerDynamicProductSeriesDialogEventHandlers();
            } else if ( resultDivId == 'applicationProductClassDiv' ) {
                observe('applicationProductClass', 'change', applicationProductClassChanged);
            } else if ( resultDivId == 'productClassDiv' ) {
                observe('productClass', 'change',  productClassChanged);
            } else if ( resultDivId == 'foreignNumbersDiv') {
                registerDynamicForeignNumbersDialogEventHandlers();
            }
        },
        onFailure: function(){ alert(messages.javascript.ajax.renderingError()) }
      });
}

function resetPagination(form) {
    // reset offset, sort and order in case it was changed by pagination
    if ($(form) != null && $(form).getInputs('hidden', 'offset') != null)
        $(form).getInputs('hidden', 'offset')[0].value = '0';
    if ($(form) != null && $(form).getInputs('hidden', 'sort') != null)
        $(form).getInputs('hidden', 'sort')[0].value = '';
    if ($(form) != null && $(form).getInputs('hidden', 'order') != null)
        $(form).getInputs('hidden', 'order')[0].value = '';
}

function changeOffset(event) {
    var offsetInfo = Event.element(event).name;

    var form = offsetInfo.split(':')[0];
    $(form).getInputs('hidden', 'offset')[0].value = offsetInfo.split(':')[1];

    searchRequest(form);
}

function search(event) {
    if ($('productSearch')) {
        if(checkIfSelectionsMade())
        {
            $('productSearch').action = root + "/remote/searchProducts";
            resetPagination('productSearch');
            searchRequest('productSearch');
        }
    } else if ($('activeBasketForm')) {
        resetPagination('activeBasketForm');
        searchRequest('activeBasketForm');
    } else if ($('acceptedBasketForm')) {
        resetPagination('acceptedBasketForm');
        searchRequest('acceptedBasketForm');
    } else if ($('collectionForm')) {
        resetPagination('collectionForm');
        searchRequest('collectionForm');
    } else if ($('numberSpaceForm')) {
        resetPagination('numberSpaceForm');
        searchRequest('numberSpaceForm');
    }
}

function changeOrder(event) {
    var orderInfo = Event.element(event).name;

    var form = orderInfo.split(':')[0];

    $(form).getInputs('hidden', 'sort')[0].value  = orderInfo.split(':')[1];
    $(form).getInputs('hidden', 'order')[0].value = orderInfo.split(':')[2];

    searchRequest(form);
}

function searchRequest(form) {
    $('overlaySearchIndicator').show();
    new Ajax.Request($(form).action, {
      method: 'post',
      parameters: Form.serialize($(form), true),
      onSuccess: function(transport) {
          var response = transport.responseText || messages.javascript.ajax.noResponseText();
          var resultDiv = $(form).getInputs('hidden', 'resultDiv')[0].value;
          var nresults = (jQuery("#"+resultDiv).html(response).find('tr').size());

          if (nresults > 1)
              jQuery('#exportExcelFromList').show();
          else
              jQuery('#exportExcelFromList').hide();

          $('overlaySearchIndicator').hide();

          observe('selectAll', 'click', selectAll);
          addEventToClass('changeOffset', 'click', changeOffset);
          addEventToClass('changeOrder',  'click', changeOrder);
          addEventToClass('openProduct', 'click', productPageDialogOpen);
          addEventToClass('openNumberSpace', 'click', openNumberSpace);
        },
        onFailure: function(){
            $('overlaySearchIndicator').hide();
            alert(messages.javascript.ajax.renderingError());
        }
    });
}

function searchReferenceProducts(event)
{
    if ($('query').value.length == 0 &&
            $('numberType').value == 0 &&
            $('referenceSearchCustomerSelection').value == -1) {
        alert(messages.javascript.productPortfolio.alert.allProductsSearchDenied());
    }
    else {
        resetPagination('referenceProductSearchForm');
        new Ajax.Request(root + '/remote/searchReferenceProducts', {
          method: 'post',
          parameters: Form.serialize($('referenceProductSearchForm'), true),
          onCreate: function(transport) {
              // Hide container and show loader
              $('overlaySearchIndicator').show();
              $('referenceProductList').hide();
              $('referenceProduct').hide();
              $('referenceProduct').innerHTML = '';
          },
          onSuccess: function(transport) {

                var response = transport.responseText || messages.javascript.ajax.noResponseText();
                var divElement = $('referenceProductList');
                divElement.innerHTML = response;
              addEventToClass('changeOffset', 'click', changeOffset);
              addEventToClass('changeOrder',  'click', changeOrder);
                $('overlaySearchIndicator').hide();
                $('referenceProductList').show();
                $('referenceProduct').show();

                try {
                    activateAccordion(referenceAccordion);
                } catch(e) {
                    // ignore
                }



            },
            onFailure: function(){ alert(messages.javascript.ajax.renderingError()) }
        });
    }
}

function openReferenceProduct(id, basket_id, showErrors)
{

    new Ajax.Request(root + "/remote/openReferenceProduct",
      {
        parameters: { 'id' : id, 'basket_id' : basket_id, 'showErrors': showErrors },
        method:'post',
        onSuccess: function(transport) {
            var response = transport.responseText || messages.javascript.ajax.noResponseText();
            var divElement = $('referenceProduct');
            divElement.innerHTML = response;

            $('referenceProductList').hide();

			setTimeout( function () {
				jQuery('#referenceProductList').html('');

               //redraw because IE breaks iy
							jQuery('h2.accordion_toggle').each(

								function() {
									var h = jQuery(this).html();
									jQuery(this).html(h);
								}

							);
            	},200);

        },
        onFailure: function(){ alert(messages.javascript.ajax.renderingError()) }
      });

    try {
        activateAccordion(referenceAccordion);
    } catch(e) {
        // ignore
    }
}

function copyReferenceProductToForm(id, basket_id)
{
    new Ajax.Updater('addProduct', root + "/remote/copyReferenceProductToForm", {
        parameters: { 'id' : id, 'basket_id' : basket_id, referred: true },
        method:'post',
        evalScripts: true,
        onComplete: function(transport) {
            try {
                activateAccordion(formAccordion);
            } catch(e) {
                // ignore
            }
            initApplicationEventHandlers(true);
            $('referenceProductList').style.display = 'none';
        }
    });

    try {
        deactivateAccordion(referenceAccordion);
    } catch(e) {
        // ignore
    }
}

function copyProductEditedToForm(id, basket_id)
{
    $('overlaySearchIndicator').show();

    try {
        activateAccordion(formAccordion);
    } catch(e) {
        // ignore
    }

    new Ajax.Updater('addProduct', root + "/remote/copyProductEditedToForm", {
        parameters: { 'id' : id, 'basket_id' : basket_id },
        method:'post',
        evalScripts: true,
        onComplete: function(transport) {
            initApplicationEventHandlers(true);
            $('overlaySearchIndicator').hide();
        }
    });
}

function resetForm(basket_id)
{
    new Ajax.Updater('addProduct', root + "/remote/resetForm", {
        parameters: { 'basket_id' : basket_id },
        method:'post',
        evalScripts: true,
        onComplete: function(transport) {
            try {
                openAccordion(formAccordion);
            } catch(e) {
                // ignore
            }
            initApplicationEventHandlers(true);
        }
    });
}

function deletePackage(product_id, pack_id, basket_id)
{
    new Ajax.Updater('addProduct', root + '/product/removePackageFromProduct', {
        parameters: { 'product_id' : product_id, 'pack_id' : pack_id, 'basket_id' : basket_id },
        method:'post',
        evalScripts: true,
        onComplete: function(transport) {
            initApplicationEventHandlers(true);
        }
    });
}

/**
 *
 * @param product_id
 * @param attachment_id
 * @param basket_id
 * @deprecated - use markAttachmentToBeDeleted and markAttachmentNotToBeDeleted instead
 */
function deleteAttachment(product_id, attachment_id, basket_id)
{
    new Ajax.Updater('addProduct', root + '/product/removeAttachmentFromProduct', {
        parameters: { 'product_id' : product_id, 'attachment_id' : attachment_id, 'basket_id' : basket_id },
        method:'post',
        evalScripts: true,
        onComplete: function(transport) {
            initApplicationEventHandlers(true);
        }
    });
}

/**
 * Marks a given attachment to be deleted and runs the callback with
 * other given params (product_id, attachment_id, basket_id, elemClicked).
 *
 * @param product_id
 * @param attachment_id
 * @param basket_id
 * @param elemClicked
 * @param callback
 */
function markAttachmentToBeDeleted(product_id, attachment_id, basket_id, elemClicked, callback)
{
    var name_ = 'removeAttachment';
    var value = 'prid-' + product_id + '_atid-' + attachment_id + '_baid-' + basket_id;
    var identifier = name_ + '_' + value;

    var atts = jQuery('#attachmentsToBeDeleted');
    var fld = atts.find('input#' + identifier);
    fld = jQuery(fld);

    if(fld.length == 0)
    {
        fld = jQuery('<input type="hidden" name="'+name_+'" id="'+identifier+'" value="'+value+'" />');
        atts.append(fld);
    }

    fld.attr('value', value);

    if(callback && typeof callback == 'function')
    {
        callback(product_id, attachment_id, basket_id, elemClicked);
    }

    return false;
}

/**
 * Marks a given attachment NOT to be deleted and runs the callback with
 * other given params (product_id, attachment_id, basket_id, elemClicked).
 *
 * @param product_id
 * @param attachment_id
 * @param basket_id
 * @param elemClicked
 * @param callback
 */
function markAttachmentNotToBeDeleted(product_id, attachment_id, basket_id, elemClicked, callback)
{
    var name_ = 'removeAttachment';
    var value = 'prid-' + product_id + '_atid-' + attachment_id + '_baid-' + basket_id;
    var identifier = name_ + '_' + value;

    var atts = jQuery('#attachmentsToBeDeleted');
    var fld = atts.find('input#' + identifier);
    fld = jQuery(fld);

    if(fld.length == 0)
    {
        fld = jQuery('<input type="hidden" name="'+name_+'" id="'+identifier+'" value="0" />');
        atts.append(fld);
    }

    fld.attr('value', '0');

     if(callback && typeof callback == 'function')
    {
        callback(product_id, attachment_id, basket_id, elemClicked);
    }

    return false;
}

// TODO MINNE OHJAUS?
function updateForeignNames(event)
{
    var prod_name_id = $('productNames').value;

    new Ajax.Updater('productForeignNames', root + '/productName/get', {
      parameters: { product_name_id: prod_name_id },
      method: 'post'
    });
}

function addProductToBasket(form_id)
{
    var form = $(form_id);
    form.action = root + "/basket/addProductToBasket";
    form.submit();
}

function addProductToCommonNumberBasket(form_id)
{
    var form = $(form_id);
    form.action = root + "/basket/addProductToCommonNumberBasket";
    form.submit();
}

function checkPackages() {
    var packageTypeSelectors = jQuery("#packageTable tr td select");
    for (var i=0;i<packageTypeSelectors.length;i++) {
        var elem = jQuery(packageTypeSelectors[i]);
        var elemId = elem.parent().parent().attr("id");
        if (elemId != "emptyPkgRow") {
            if (elem.val() == 0) {
                alert(messages.javascript.packageTypeSelect.missingValue());
                return false;
            }
        }
    }
    return true;
}

function saveProductToBasket() {
    if (!checkPackages()) {
        jQuery("a.saveAsNew").click(saveProductToBasket);
        return false;
    }
    $('overlaySearchIndicator').show();
	jQuery('#addProduct').hide();
    $('form1').action = root + "/basket/saveProductToBasketAjax"
    $('form1').submit();
}

function editProduct(basketId) {
    if (checkPackages() == false) {
        jQuery("a.saveAsNew").click(editProduct);
        return false;
    }

     var ok = true;

     jQuery('select.fileTypeSelect').each(
        function() {
            if (this.selectedIndex == 0) {
                alert(messages.javascript.fileTypeSelect.missingValue());
                ok = false;
            }
        }
     );

    if (!ok) return;

    $('overlaySearchIndicator').show();
    jQuery('#addProduct').hide();
    $('form1').action = root + "/product/editAjax"
    $('form1').submit();

    if ( basketId != null )
        resetForm(basketId);
}

function registerCommonNumberProductToCustomer() {
      new Ajax.Updater('basket', root + "/basket/registerCommonNumberProductToCustomer", {
        parameters:Form.serialize($('form1')),
        method:'post',
        onComplete: function(transport) {
            initEventHandlers(false);
        }
      });
}

function openProduct(event, id) {
    var elem = Event.element(event);

    if (!Element.hasClassName(elem, 'select') && !Element.hasClassName(elem, 'preventOpenProduct')) {
        if (id == null) {
            id = Event.findElement(event, 'tr').id;
            id = id.replace('productRow', '');
        }

        document.location = root + "/productPortfolio/productPage/" + id;
    }
}

function openUser(event, id) {
    var elem = Event.element(event);

    if (!Element.hasClassName(elem, 'select')) {
        if (id == null) {
            id = Event.findElement(event, 'tr').id;
            id = id.replace('userRow', '');
        }

        document.location = root + "/user/show/" + id;
    }
}

function openNumberSpace(event, id) {
    var elem = Event.element(event);

    if (!Element.hasClassName(elem, 'preventOpen')) {
        if (id == null) {
            id = Event.findElement(event, 'tr').id;
            id = id.replace('numberSpaceRow', '');
        }

        document.location = root + "/numberSpace/show/" + id;
    }
}

function exportExcelFromList(event) {
    var form = $('productForm');
    if (form == null) {
         alert(messages.javascript.application.alert.noProducts());
         throw $break;
    }

    // if products selected, export only selected.
    // otherwise export all.
    if(getNumberOfSelectedProducts('productForm') > 0) {
        if (confirm('Haluatko viedä valitut tuotteet Exceliin?')) {
            form.action = root + '/productPortfolio/exportExcelFromList';
            form.submit();
        }
    } else if (confirm('Haluatko viedä kaikki tuotteet Exceliin?')) {
        var form = $('productSearch');
        form.action = root + '/productPortfolio/exportSearchResultToExcel';
        form.submit();
    }
}

function exportCollectionToExcel() {
    var form = $('productForm');
    if (form == null) {
         alert(messages.javascript.application.alert.noProducts());
         throw $break;
    }

    // if products selected, export only selected.
    // otherwise export all.
    if(getNumberOfSelectedProducts('productForm') > 0) {
        if (confirm('Haluatko viedä valitut tuotteet Exceliin?')) {
            form.action = root + '/productPortfolio/exportExcelFromList';
            form.submit();
        }
    } else if (confirm('Haluatko viedä kaikki tuotteet Exceliin?')) {
        window.location = root + '/productPortfolio/exportExcelFromCollection/' + $("collectionId").value;
    }
}

function exportBillingSearchResultToExcel() {
   var form = $('customerSearch');
   form.action = root + '/billingInformation/exportSearchResultToExcel';
   form.submit();
}

/*function numberTypeChanged(event){
    new Ajax.Updater('commonNumberBasketButtons', root + '/productPortfolio/commonNumberButtons', {
      parameters: { numberType: $('numberType').value }
    });
} */

function removeFromCollection(collectionId, productId) {

    if(confirm('Oletko varma?'))
    {
        window.location = root + "/productPortfolio/removeFromCollection?collection=" + collectionId + "&product=" + productId;
    }

}


function getNumberOfSelectedProducts(formName) {
    var count = 0;
    var productForm = $(formName);

    if (productForm != null) {
      for (var j = 0; j < productForm.length; j++) {
        if (productForm.elements[j].name == "product" && productForm.elements[j].checked) {
          count++;
        }
      }
    }

    return count;
}


function removeListFromBasket() {
    var count = getNumberOfSelectedProducts('productForm');

    if (count == 0) {
        alert(messages.javascript.application.alert.noProducts());
    } else {
        var message = '';

        if (count == 1) {
            message = messages.javascript.application.confirm.removeProduct();
        } else {
            message = messages.javascript.application.confirm.removeProducts(count);
        }

        if (confirm(message)) {
            var form = $('productForm');
            form.action = root + '/application/removeFromBasket';
            form.submit();
        }
    }
}


function sendBasket(id) {
    new Ajax.Request(root + '/remote/sendBasket', {
        parameters: {'id': id},
        method:'post',
        onSuccess: function(transport) {
            var response = transport.responseText || messages.javascript.ajax.noResponseText();
            alert(response);
        },
        onFailure: function(){ alert(messages.javascript.ajax.sendFailed()) }
    });
}


function removeBasket(id) {
    new Ajax.Request(root + '/remote/removeBasket',
     {
        parameters: {'id': id},
        method:'post',
        onSuccess: function(transport) {

        },
        onFailure: function(){ alert(messages.javascript.ajax.renderingError()) }
      });
}


function openURL(url) {
    document.location = url;
}

function openURLByElementValue(event) {
    var url = Event.element(event).getAttribute("target");
    var add = '';

    if ($('addProduct') && $('addProduct').getStyle('display') != 'none') {
        if (url.indexOf('?') < 0) {
            add = '?accordion=1';
        } else {
            add = '&accordion=1';
        }
    }

    url += add
    document.location = url;
}

function openURLwithConfirmation(url, cmsg) {
    if (cmsg == null) {
        cmsg = "Oletko varma?";
    }

    if (confirm(cmsg)) {
        document.location = url;
    }
}

function openURLToNewWindow(event) {
    var url = Event.element(event).getAttribute("target");
    window.open(url);
}

function printPage(event) {
    var url = Event.element(event).getAttribute("target");

    if(url.indexOf('printBasket')) {
        // This is basket printing.
        // Try to get some information about what are we printing..
        var val = null;

        try {
            var sel = $('basketMax');
            val = sel.options[sel.selectedIndex].value;

            val = parseInt(_trim(val), 10);

            if(val && val > 0) {
                url = _addUrlParam(url,'max',val);
            }
        } catch(e) {
            //alert(e.message)
        }

        val = null;

        try {
            var loc = window.location.href;
            var patt = new RegExp(".*offset=([0-9]+).*");
            val = patt.exec(loc);

            if(!val) {
                val = '0';
            }

            val = parseInt(_trim(val[1]),10);

            if(val) {
                url = _addUrlParam(url,'offset',val);
            }
        } catch(e) {
            //alert(e.message)
        }
    }

    newwindow = window.open(url, 'print', 'height=700,width=985,menubar=yes,resizable=yes,scrollbars=yes,location=no');
    /*newwindow.onload = function() {
        newwindow.print();
        newwindow.close();
    }*/
}

function _trim(str) {
    if(str) {
        str.replace(new RegExp("^[\\s]+"),"").replace(new RegExp("[\\s]+$"),"")
    }

    return str;
}

/**
 * Used by: printPage
 * @param url
 * @param param
 * @param val
 */
function _addUrlParam(url, param, val) {
    try {
        var urlHasQMark = url.indexOf('?') > -1;

        if(val) {
            url += urlHasQMark ? '&' : '?';

            if(val.constructor == Array) {
                var first = true;

                for(var i = 0; i < val.length; i++) {
                    if(first) {
                        first = false;
                    } else {
                        url += '&';
                    }

                    url += param + '=' + val[i];
                }
            } else {
                url += param + '=' + val;
            }
        } else {
            url += urlHasQMark ? '&' : '?';
            url += param + '=';
        }
    } catch(e) {
        //alert('addUrlParam: ' + e.message)
    }

    return url;
}

function multiEdit(event) {
     var count = getNumberOfSelectedProducts('productForm');

    if (count == 0) {
        alert(messages.javascript.application.alert.noProducts());
    } else {
        var id = Event.element(event).getAttribute("target");
        var form = $('productForm');
        form.action = root + "/application/multiEdit/" + id;
        form.submit();
    }
}

function multiAttach(event) {
     var count = getNumberOfSelectedProducts('productForm');

    if (count == 0) {
        alert(messages.javascript.application.alert.noProducts());
    } else {
        var id = Event.element(event).getAttribute("target");
        var form = $('productForm');
        form.action = root + "/application/multiAttach/" + id;
        form.submit();
    }
}

function setQuarantineTimeToSelected(cal) {
    if ( cal.dateClicked )
    {
        var form = $('productForm');
        form.action = $('setQuarantineTimeAction').value;
        form.action.value = $('setQuarantineTimeAction').value;
        form.submit();
    }
    else
        cal.hide();
}

function setQuarantineTime(cal) {
    var product = cal.params.product;
    var quarantineTime = cal.params.inputField.value;

    new Ajax.Request(root + '/application/setQuarantineTime',
     {
        parameters: {'product': 0, 'product': product, 'quarantineTime': quarantineTime},
        method:'post',
        onSuccess: function(transport) {
          $("visibleQuarantineTime" + product).value = quarantineTime;
        },
        onFailure: function(){ alert(messages.javascript.ajax.renderingError()) }
      });
}


function removeApplication(event) {
    if (confirm(messages.javascript.application.confirm.removeApplication())) {
        var id = jQuery('#removeApplicationButton').attr('applicationId');
        document.location = root + "/application/removeApplication/" + id;
    }
}

function sendApplication(event) {
    if (confirm(messages.javascript.application.confirm.sendApplication())) {
        document.location = root + "/application/sendApplication/" + Event.element(event).value;
    }
}

function sendApplicationToBeCorrected(event) {
    if (confirm(messages.javascript.application.confirm.sendApplicationToBeCorrected())) {
        document.location = root + "/application/sendApplicationToBeCorrected/" + Event.element(event).value;
    }
}

function acceptApplication(event) {
    var e = Event.element(event);

    if (Element.hasClassName(e, 'containsErrors')) {
        alert(messages.javascript.application.confirm.containsErrors());
    } else if (confirm(messages.javascript.application.confirm.acceptApplication())) {
        document.location = root + "/application/acceptApplication/" + Event.element(event).value;
    }
}

function acceptHandledApplication(event) {
    if (confirm(messages.javascript.application.confirm.acceptHandledApplication())) {
        document.location = root + "/application/acceptHandledApplication/" + Event.element(event).value;
    }
}


function denyApplication(event) {
    if (confirm(messages.javascript.application.confirm.denyApplication())) {
        document.location = root + "/application/denyApplication/" + Event.element(event).value;
    }
}



function hideAllSelects(action) {
    if (action!='visible') {
        action='hidden';
    }

    if (navigator.appName.indexOf("MSIE")) {
        for (var i = 0; i < document.forms.length; i++){
            for (var j = 0; j < document.forms[i].length; j++) {
                if (document.forms[i].elements[j].options) {
                    document.forms[i].elements[j].style.visibility = action;
                }
            }
        }
    }
}

function proposeUsername(event) {
    if ($('customerSelect'))
      var cid = $('customerSelect')[$('customerSelect').selectedIndex].value;
    else if ($('customerHidden'))
      var cid = $('customerHidden').value;
    var fn = $('firstName').value;
    var ln = $('lastName').value;
    if (cid == null || fn == '' || ln == '') {
        return;
    }
    new Ajax.Request(root + '/remote/proposeUsername',
     {
        method:'post',
        parameters: {customer:cid, firstName:fn, lastName:ln},
        onSuccess: function(transport) {
            var response = transport.responseText || messages.javascript.ajax.noResponseText();
            jQuery('#username').attr('value' ,response.replace(/^\s\s*/, '').replace(/\s\s*$/, ''));
        },
        onFailure: function(){ alert(messages.javascript.ajax.renderingError()) }
      });
}

 /*
activateActiveX
---------------
Purpose:  Dynamically replace any elements that will be affected by the new security feature in IE6/IE7 that requires a user to click certain types of elements to activate them before use.

Usage:  Include this file in the <head></head> section of your html document using the following...
	<script language="JScript" type="text/jscript" src="activateActiveX_onload.js"></script>


Since this script is in response to a software patent lawsuit, I feel it necessary to state the following...

License:
activateActiveX is Copyright (C) 2006 Jason Baker (therippa AT gmail.com). It is available as open source code from:
http://therippa.blogspot.com

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details http://www.gnu.org/licenses/gpl.html
*/

//trap onload event
document.observe('dom:loaded', function () {
	//Determine browser, we only need this for Internet Explorer
	if (navigator.appName == "Microsoft Internet Explorer") {

		//Array of elements to be replaced
		var arrElements = new Array(3);
		arrElements[0] = "object";
		arrElements[1] = "embed";
		arrElements[2] = "applet";


		//Loop over element types
		for (n = 0; n < arrElements.length; n++) {

			//set object for brevity
			replaceObj = document.getElementsByTagName(arrElements[n]);

			//loop over element objects returned
			for (i = 0; i < replaceObj.length; i++ ) {

				//set parent object for brevity
				parentObj = replaceObj[i].parentNode;

				//grab the html inside of the element before removing it from the DOM
				newHTML = parentObj.innerHTML;

				//remove element from the DOM
				parentObj.removeChild(replaceObj[i]);

				//stick the element right back in, but as a new object
				parentObj.innerHTML = newHTML;

				}
			}
		}

        initEventHandlers();
    });

    function observe(id, eventName, eventCallback) {
        if ($(id))
        {
            $(id).stopObserving(eventName, eventCallback)
            $(id).observe(eventName, eventCallback);
        }
    }

    function initEventHandlers() {

        if (typeof Prototype != 'undefined' && ($('products') || $('productsTotal') || $('selectAll') )) {
            observe('selectAll', 'click', selectAll);

		}



        observe('searchReferenceProductsButton', 'click', searchReferenceProducts);

        observe('multiEditButton', 'click', multiEdit);

        observe('multiAttachButton', 'click', multiAttach);

        observe('removeApplicationButton', 'click', removeApplication);
        //observe('sendApplicationButton', 'click', sendApplication);
        //observe('sendApplicationToBeCorrectedButton', 'click', sendApplicationToBeCorrected);
        //observe('acceptApplicationButton', 'click', acceptApplication);
        //observe('acceptHandledApplicationButton', 'click', acceptHandledApplication);
        observe('denyApplicationButton', 'click', denyApplication);
        observe('multiGetNumbersButton', 'click', multiGetNumbers);

        addEventToClass('openURLButton', 'click', openURLByElementValue);
        addEventToClass('openURLWindowButton', 'click', openURLToNewWindow);
        addEventToClass('printButton', 'click', printPage);
        addEventToClass('removeListFromBasketButton', 'click', removeListFromBasket);

        addEventToClass('openProduct', 'click', openProduct);
        addEventToClass('openNumberSpace', 'click', openNumberSpace);

        addEventToClass('changeOffset', 'click', changeOffset);
        addEventToClass('changeOrder',  'click', changeOrder);

        // Product search conditions:
        observe('productGroup',  'change', productGroupChanged);
        observe('productClass',  'change', productClassChanged);
        observe('productBrand',  'change', productBrandChanged);
        observe('customer',      'change', customerChanged);
        observe('searchProductsButton', 'click', search);

        observe('exportExcelFromList', 'click', exportExcelFromList);

        observe('exportCollectionToExcel', 'click', exportCollectionToExcel);
        //observe('exportSearchResultToExcel', 'click', exportSearchResultToExcel);

        //observe('numberType', 'change', numberTypeChanged);

        observe('proposeUsernameButton', 'click', proposeUsername);
        addEventToClass('openUser', 'click', openUser);
        
        initApplicationEventHandlers(false);
    }

    function initApplicationEventHandlers(registerDynamicEventHandlers)
    {
        if (registerDynamicEventHandlers)
        {
            registerDynamicProductNameDialogEventHandlers();
            registerDynamicProductSeriesDialogEventHandlers();
            registerDynamicProductBrandDialogEventHandlers();
            registerDynamicForeignNumbersDialogEventHandlers();
        }

        // products in application
        observe('applicationProductGroup', 'change', applicationProductGroupChanged);
        observe('applicationProductClass', 'change', applicationProductClassChanged);
        observe('applicationProductBrand', 'change', applicationProductBrandChanged);
    }

    function addEventToClass(clazz, eventtype, eventFunction) {
        var buttons = $$('.' + clazz);
        if (buttons != null) {
            for (i = 0; i < buttons.length; i++) {
                buttons[i].stopObserving(eventtype, eventFunction);
                buttons[i].observe(eventtype, eventFunction);
            }
        }
    }

    function selectAll(event) {
        var mode;
		var target = Event.element(event);
        (target.checked)?mode=true:mode=false;
		var checkboxes = $$('input.select');
		for(var i=0;i<checkboxes.length;i++) {
			checkboxes[i].checked = mode;
		}
	}

    function hasSelection(select) {
		for(i=0;i<select.options.length;i++) {
			if (select.options[i].selected == true) return true;
		}
		return false;
	}

	function productGroupChanged(event) {
        render(root + '/remote/productClasses', 'productGroup', 'productClassDiv');

        if ($('productName')) {
            $('productName').selectedIndex = 0;
            $('productName').disabled = true;
        }

        updateGroupNumber();
    }

    function productClassChanged(event) {
        render(root + '/remote/productNames', 'productClass', 'productNameDiv');
	}

    function productBrandChanged(event) {
        render(root + '/remote/productSeries', 'productBrand', 'productSeriesDiv');
	}

     function applicationProductGroupChanged(event) {

        render(root + '/remote/productClassesForm', 'applicationProductGroup', 'applicationProductClassDiv');

         var productGroup = $('applicationProductGroup').value;
         var basketId = $('basketId').value;

        // Jos tyhjä lomake, eikä vertailutuotteen kautta
        if ( $('productId') == null)
        {
            new Ajax.Request(root + "/remote/productGroupNumber",
              {
                parameters: {'productGroup': productGroup, 'basket_id': basketId },
                method:'post',
                onSuccess: function(transport) {
                    var response = transport.responseText || messages.javascript.ajax.noResponseText();
                    var divElement = $('productGroupNumber');
                    divElement.innerHTML = response;
                    registerDynamicForeignNumbersDialogEventHandlers();
                },
                onFailure: function(){ alert(messages.javascript.ajax.renderingError()) }
              });
                //render(root + '/remote/productGroupNumber', 'applicationProductGroup', 'productGroupNumber');
        }
        else
        {
            new Ajax.Updater('productGroupNumber', root + '/remote/productGroupNumber', {
              parameters: { product_id: $('productId').value, productGroup: $('applicationProductGroup').value, basket_id: $('basketId').value },
              method: 'post'
            });
        }
    }

    function applicationProductClassChanged(event) {
        render(root + '/remote/productNameSelect', 'applicationProductClass', 'applicationProductNameDiv');
    }

    function applicationProductBrandChanged(event) {
        render(root + '/remote/applicationProductSeries', 'applicationProductBrand', 'applicationProductSeriesDiv');
    }

    function customerChanged(event) {
        if ($('acceptedBasketForm') || $('activeBasketForm')) {
            if ($('acceptedBasketForm')) {
                $('acceptedBasketFormCustomer').value = $('customer').value;
                searchRequest('acceptedBasketForm');
            }

            if ($('activeBasketForm')) {
                $('activeBasketFormCustomer').value = $('customer').value;
                searchRequest('activeBasketForm');
            }
        }
    }


    function addOptionToSelectBox(select,place,name,value) {
		var found = false;
		var prev = null;
		for (i=0;i<select.options.length;i++) {
			if (place == i) {
				found = true;
			}
			if (found) {
				if (place == i) {
					prev = select.options[i];
					select.options[i] = new Option(name,value);
				}
				else {
					back = prev;
					prev = select.options[i];
					select.options[i] = back;
				}
			}
		}
		select.options[select.options.length] = prev;
	}

	function handleEANButton() {
		var field = $('EAN');
		var button = $('hae_EAN');
        var lviEan = $('lviEanMarked');

        if (field.disabled) {
			field.disabled = false;
			field.value = '';
			button.value = 'LVI EAN';
            lviEan.value = "false";
        }
		else {
			field.disabled = true;
			field.value = 'LVI EAN';
			button.value = 'EAN';
            lviEan.value = "true";
        }
    }

    // used to filter options from multiple select-fields.
    // selected option in one field must not be shown on other select fields.
    // parameter selectId is the id of the select field.
    function filterSelectOptions () {
        try{
        var selectId = arguments[0];
        var ignoredValue = null;
        if (arguments.length==2){
            ignoredValue = arguments[1];
        }
        var msg = "";
        // first enable all options in all select fields
        var s = 1;

        var select = $(selectId+s);

        while(select != null) {
            for (var o = 0; o<select.options.length; o++) {
                var option = $(select.options[o]);
                $(option).show();
            }
            s++;
            select = $(selectId+s);
        }
        // then disable all selected options from other fields
        s=1;

        select = $(selectId+s);

        while (select != null) {
            // selectedOption in current select field
            var selectedOption = $(select.options[select.selectedIndex]);
            var s2 = 1;
            // loop through all other select fields
            var otherSelect = $(selectId+s2);
            while (otherSelect != null) {

                if (select.id != otherSelect.id) {
                    // iterate all options in otherSelect
                    // and hide the option that is selected in selectedOption
                    for (var o = 0; o<otherSelect.options.length; o++) {
                        var otherOption = $(otherSelect.options[o]);
                        if (otherOption.value == selectedOption.value) {
                            if (ignoredValue == null || otherOption.value != ignoredValue )
                                $(otherOption).hide();
                        }
                    }
                }
                s2++;
                otherSelect = $(selectId+s2);
            }
            s++;
            select = $(selectId+s);
        }

        } catch (error) {
            alert(messages.javascript.ajax.renderingError()+": " +error.message);
        }

    }

    function checkFieldType(selectNode) {
        var urlInput = $(selectNode).ancestors()[1].getElementsBySelector("input[name=\"attachment_url\"]")[0];
        var fileInput = $(selectNode).ancestors()[1].getElementsBySelector("input[type=\"file\"]")[0];

        if ($F(selectNode) == "LINK")
        {
            urlInput.show();
            fileInput.hide();
        }
        else
        {
            urlInput.hide();
            fileInput.show();
        }
    }

    function showPackageRow() {
        var oldPackageRowsCount = 0;
        var packageTableRowsArray = $$('#packageTable tr');

        for ( var i = 0; i < packageTableRowsArray.length; i++)
        {
              if ( packageTableRowsArray[i].id.indexOf("packageRow") > -1 )
                  oldPackageRowsCount++;
        }
        var newPackageRowsCount = oldPackageRowsCount + 1;
        var packageRowId = 'packageRow' + newPackageRowsCount;
        var packageSelectId = 'packageTypeSelect' + newPackageRowsCount;

        if ( oldPackageRowsCount < 4 )
        {
            var newElem = $('emptyPkgRow').cloneNode(true);

            if ( newPackageRowsCount % 2 == 0)
                newElem.setAttribute('class', 'even');
            else
                newElem.setAttribute('class', 'odd');

            newElem.setAttribute('id', 'packageRow' + newPackageRowsCount);
            newElem.getElementsByTagName('select')[0].setAttribute('id', 'packageTypeSelect' + newPackageRowsCount)

            $('packageTable').appendChild(newElem);
        }

        new Ajax.Updater(packageSelectId, root + '/packageType/getPackageTypes', {
            method:'post',
            insertion: Insertion.Bottom,
            onComplete: function () {
                $(packageSelectId).selectedIndex = 0;
                filterSelectOptions('packageTypeSelect', '014');
                $(packageRowId).show();
            }
         });

        if ( newPackageRowsCount == 4)
            $('packageRowAddButton').hide();

        return false;
	}

    function removeNewRow(toBeDeleted)
    {
        var doc = toBeDeleted.parentNode;
        doc.removeChild(toBeDeleted);

        // always when deleting, show the add button again
        var deletedId = toBeDeleted.id;
        deletedId = deletedId.substring(0, deletedId.length-1);
        if($(deletedId+'AddButton'))
        {
            $(deletedId+'AddButton').show();
        }

        // All remaining rows
        var tableRowsArray = doc.getElementsByTagName('tr');

        // update the remaining indexes for rows and selects (skip the empty template row)
        var idx = 1;
        for (var i = 0; i < tableRowsArray.length; i++) {
            var row = tableRowsArray[i];
            if (row.id.match(deletedId+".")) {
                // update row
                var rowId = row.id.substring(0, row.id.length-1)+(idx);
                row.id = rowId;

                // find and update select id
                var selectArray = row.getElementsByTagName('select');
                if (selectArray != null && selectArray.length > 0) {
                    var select = selectArray[0];
                    var selectId = select.id.substring(0, select.id.length-1)+(idx);
                    select.id = selectId;
                }
                idx++;
            }
        }
    }

    function showAttachmentRow() {
        // Oletusvalinta
        var oldAttachmentRowsCount = 0;
        var attachmentTableRowsArray = $$('#attachmentTable tr');

        for ( var i = 0; i < attachmentTableRowsArray.length; i++)
        {
              if ( attachmentTableRowsArray[i].id.indexOf("attachmentRow") > -1 )
                  oldAttachmentRowsCount++;
        }

        var newAttachmentRowsCount = oldAttachmentRowsCount + 1;
        var attachmentRowId = 'attachmentRow' + newAttachmentRowsCount;
        var attachmentSelectId = 'fileTypeSelect' + newAttachmentRowsCount;

        var newElem = $('emptyAttRow').cloneNode(true);
        newElem.setAttribute('id', attachmentRowId);

        if ( newAttachmentRowsCount % 2 == 0 )
            newElem.setAttribute('class', 'even');
        else
            newElem.setAttribute('class', 'odd');

        newElem.getElementsByTagName('select')[0].setAttribute('id', attachmentSelectId);
        newElem.getElementsByTagName('select')[0].setAttribute('name', 'attachment_type');
        newElem.getElementsByTagName('select')[0].setAttribute('className', 'fileTypeSelect');
        newElem.getElementsByTagName('select')[0].setAttribute('class', 'fileTypeSelect');
        newElem.getElementsByTagName('input')[0].setAttribute('id', 'attachment_file' + newAttachmentRowsCount);
        newElem.getElementsByTagName('input')[0].setAttribute('name', 'attachment_file' + newAttachmentRowsCount);
        newElem.getElementsByTagName('input')[1].setAttribute('name', 'attachment_url');
        //newElem.getElementsByTagName('input')[2].setAttribute('name', 'attachment_file_new');

        $('attachmentTable').appendChild(newElem);

        new Ajax.Updater(attachmentSelectId, root + '/attachment/getFileTypes', {
            method:'post',
            insertion: Insertion.Bottom,
            onComplete: function() {
                $(attachmentSelectId).selectedIndex = 0;
                filterSelectOptions('fileTypeSelect');
                $(attachmentRowId).show()
            }
         });

        if ( newAttachmentRowsCount >= 8)
            $('attachmentRowAddButton').hide();

        return false;
    }

    function checkFileTypeSelectionValue(id)
    {
        if(id != null && $(id).selectedIndex == 0)
        {
            alert(messages.javascript.fileTypeSelect.missingValue());
            $(id).focus();
        }
        return false;
    }

    function hideSaveAsNew()
    {
        $('newProuctSave').hide();
    }

    function getLviNumber(productId, basketId)
    {
        var index = $('applicationProductGroup').selectedIndex;
        var pGroup = $('applicationProductGroup')[index].value;

        var pcindex = $('applicationProductClass').selectedIndex;
        var pClass = $('applicationProductClass')[pcindex].value;

        var numberTail = $('LVI_number').value;

        if ( pGroup > -1 )
        {
            new Ajax.Updater($('productGroupNumber'), root + '/application/getNumber', {
                parameters: { 'productId': productId, 'basketId' : basketId, 'pGroupId' : pGroup, 'pClassId' : pClass, 'numberTail': numberTail },
                method: 'post',
                onComplete: function() {
                    registerDynamicForeignNumbersDialogEventHandlers();
                }
             });
        }
    }

    function proposeLviNumber(basketId)
    {
        var index = $('applicationProductGroup').selectedIndex;
        var pGroup = $('applicationProductGroup')[index].value;

        var pcIndex = $('applicationProductClass').selectedIndex;
        var pClass = $('applicationProductClass')[pcIndex].value;

        var numberTail = $('LVI_number').value;

        if ( pGroup > -1 )
        {
            new Ajax.Updater($('productGroupNumber'), root + '/application/proposeNumber', {
                parameters: { 'basketId' : basketId, 'pGroupId' : pGroup, 'pClassId' : pClass, 'numberTail': numberTail },
                method: 'post',
                onComplete: function() {
                    registerDynamicForeignNumbersDialogEventHandlers();
                }
            });
        }
    }

    function multiGetNumbers(event) {
        //var id = Event.element(event).value;
        var id = jQuery('#multiGetNumbersButton').attr('applicationId');
        var form = $('productForm');
        form.action = root + "/application/multiGetNumbers/" + id;
        form.submit();
    }

    function updateGroupNumber()
    {
        if ($('beginNumberGroup'))
        {
            new Ajax.Request(root + '/remote/plainProductGroupNumber/' + $('productGroup').value,
            {
                method:'post',
                onSuccess: function(transport) {
                    var response = transport.responseText || "00";
                    $('beginNumberGroup').innerHTML = response;
                    $('endNumberGroup').innerHTML   = response;
                },
                onFailure: function(){ alert(messages.javascript.ajax.renderingError()) }
            });
        }
    }

    function removeErrorFromProduct(productId, errorId, basketId) {
        new Ajax.Updater($('applicationErrorsContainer'), root + '/remote/removeErrorFromProduct', {
            parameters: { 'productId' : productId, 'errorId' : errorId },
            method: 'post',
            onSuccess: function(transport) {
                if($('errorImage'+errorId))
                {
                    $('errorImage'+errorId).hide();
                }
                $('removeFieldError'+errorId).hide();
                var response = transport.responseText || messages.javascript.ajax.noResponseText();
                if(response.indexOf('<li>') == -1)
                {
                   $('applicationErrorsContainer').hide();
                }
                new Ajax.Updater($('productForm'), root + '/remote/updateProductList', {
                    parameters: { 'basketId': basketId },
                    method: 'post'
                });
            },
            onFailure: function(){ alert(messages.javascript.ajax.removeFailed()) }
        });
    }

