(function() {

  if(window.BonaPrint == null) {
    window.BonaPrint = new Object();
  }
  
  var isIE = BonaPage.Browser.isIE;

  var iconWidth = 30;
  var iconLeftPosition;
  var startTimeout = 20;
  var counter = 1;
  var printLinkContainer;
  var timeout;
  var outTimeout;
  var initTimeout;
  var isIconShown = false;
  
  BonaPrint.enabled = true;
  BonaPrint.printMode = '0';
  BonaPrint.visibilityDefault = true;
  BonaPrint.iconVisibility = {  };
  BonaPrint.wizardReceiptPrintMessage = '';

  BonaPrint.iconPosition =
  {
    id : 'idContentContainer',
    horizontalAlign : 'right', // left, center, right
    verticalAlign : 'top', // top, middle, bottom
    horizontalOffset : 45,
    verticalOffset : 0
  };
  
  BonaPrint.textTitle = '';

  BonaPrint.initPrintMessage = function()
  {
    if(BonaPrint.enabled)
    {
      var container = document.getElementById('idWizardReceiptMessage');
      
      if (container)
      {
        container.innerHTML = BonaPrint.wizardReceiptPrintMessage;
      }
    }
  }
  
  BonaPrint.initPrintIcon = function()
  {
    if (window.EmulateMode)
    {
        return;
    }
    
    CheckVisibility();
    
    if(!BonaPrint.enabled)
      return;
    
    if(BonaPrint.iconPosition.id)
    {
      BonaPage.addPageStateHandler(BonaPage.PAGE_LOADED, showPrintIcon);
      initTimeout = setTimeout(showPrintIcon, 15000);
    }
    else
    {
      showPrintIcon();
    }
  }

  BonaPrint.printPreview = function()
  {
    if(!BonaPrint.enabled)
      return;
    
    var i;
    var content;
    
    if(window.contentarea && window.contentarea.document)
    {
      content = window.contentarea.document;
    }
    else
    {
      content = document;
    }
    
    var title = content.title;
    var sts = content.styleSheets;
    var obj = window.open("", "", "resizable=yes, menubar=yes, scrollbars=yes, toolbar=yes, directories=no");
    obj.document.open();
    obj.document.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n\r');
    obj.document.write('<html xmlns="http://www.w3.org/1999/xhtml" >\n\r');
    obj.document.write('<head>\n\r');
    obj.document.write('<title>\n\r');
    obj.document.write(title + '\n\r');
    obj.document.write('</title>\n\r');
    
    for (i = 0; i < sts.length; i++)
    {
      obj.document.write('<link href="' + sts[i].href + '" type="text/css" rel="stylesheet" />\n\r');
    }
    
    obj.document.write('<style type="text/css" media="print">\n\r');
    obj.document.write('.nonPrintableShading,\n\r');
    obj.document.write('#idWizardReceiptMessage\n\r');
    obj.document.write('{\n\r');
    obj.document.write('display: none;\n\r');
    obj.document.write('}\n\r');
    obj.document.write('DIV, A\n\r');
    obj.document.write('{\n\r');
    obj.document.write('overflow: visible; !important\n\r');
    obj.document.write('}\n\r');
    obj.document.write('</style>\n\r');

    obj.document.write('<style type="text/css" media="screen">\n\r');
    obj.document.write('#idPrintPreviewContentContainer\n\r');
    obj.document.write('{\n\r');
    obj.document.write('padding: 5px;\n\r');
    obj.document.write('}\n\r');
    obj.document.write('</style>\n\r');
    
    obj.document.write('<style type="text/css">\n\r');
    obj.document.write('.nonPrintable\n\r');
    obj.document.write('{\n\r');
    obj.document.write('display: none;\n\r');
    obj.document.write('}\n\r');
    obj.document.write('</style>\n\r');
    
    obj.document.write('</head>\n\r');
    
    obj.document.write('<body class="printContentView" style="height: auto; float: none; visibility: visible;">\n\r');

    obj.document.write('<table id="pleaseWait" style="width: 100%; height: 300px;">\n\r');
    obj.document.write('<tr>\n\r');
    obj.document.write('<td style="text-align: center; vertical-align: middle;"><img src="http://www.americansocietyofbermuda.com/admin/html_res/images/async-load-progress-01.gif"><br/><br/><strong>Please wait...</strong></td>\n\r');
    obj.document.write('</tr>\n\r');
    obj.document.write('</table>\n\r');
    
    obj.document.write('<table cellspacing="0" cellpadding="0">\n\r');
    obj.document.write('<tr>\n\r');
    obj.document.write('<td id="idPrintPreviewContentContainer" style="float: none;">\n\r');

    var mainContainerId = content.getElementById('idMainContainer') ? 'idMainContainer' : 'contentDiv';
    
    obj.document.write('<div id="' + mainContainerId + '" style="display: none;">\n\r');
    obj.document.write('</div>\n\r');

    obj.document.write('</td>\n\r');
    obj.document.write('</tr>\n\r');
    obj.document.write('</table>\n\r');
    
    obj.document.write('</body>\n\r');
    obj.document.write('</html>\n\r');
    obj.document.close();
   
    setTimeout(result, 1000);
    
    function result()
    {
      if(!obj || !obj.document || !obj.document.body || !obj.document.body.innerHTML)
      {
        setTimeout(result, 100);
        return;
      }
      
      var pleaseWait = obj.document.getElementById('pleaseWait');
      
      var classes = {
      
        'publicWizardContainer' : true,
        'publicWizardNameContainer' : true,
        'introOuterContainer' : true,
        'introContainer' : true,
        'infoOuterContainer' : true,
        'infoContainer' : true,
        'infoSection' : true,
        'generalFormOuterContainer' : true,
        'generalFormContainer' : true,
        'formOuterContainer' : true,
        'formContainer' : true,
        'formTitleOuterContainer' : true,
        'formTitleContainer' : true,
        'generalFieldsOuterContainer' : true,
        'generalFieldsContainer' : true,
        'stepOuterContainer' : true,
        'stepContainer' : true,
        'captionOuterContainer' : true,
        'captionContainer' : true,
        'sectionOuterContainer' : true,
        'sectionContainer' : true,
        'fieldContainer' : true,
        'fieldSubContainer' : true,
        'groupContainer' : true,
        'fieldItem' : true,
        'navigationOuterContainer' : true,
        'navigationContainer' : true
      
      };
      
      var img = '<img id="nonPrintableShading" class="nonPrintableShading" src="/Admin/html_res/images/z.gif" style="position: absolute; top: 0; left: 0; z-index: 30000;" />';
      
      var mainContainer = obj.document.getElementById(mainContainerId);
      
      var cleanHtml;
      var contentNode = content.getElementById('idPrimaryContentBlock1ContentHolder') ? content.getElementById('idPrimaryContentBlock1ContentHolder') : content.getElementById('contentDiv');

      cleanHtml = contentNode.innerHTML + img;
      
      cleanHtml = cleanHtml.replace(/<script[^>]*>(?:.|\s)*?<\/script>/ig, '');
      
      if(contentNode.id != 'contentDiv')
      {
        var node = contentNode.parentNode;
        var needRemoveBg = false;
        
        while(node.id != mainContainerId)
        {
          cleanHtml = '<' + node.tagName + ' id="' + node.id + '" class="' + node.className + '" style="top: 0; left: 0;'  + (needRemoveBg ? ' margin: 0; padding: 0; background: none;' : '') + '">' + cleanHtml + '</' + node.tagName + '>';
          
          if(node.id == 'idPrimaryContentContainer')
          {
            needRemoveBg = true;
          }
          
          node = node.parentNode;
        }
      }
            
      mainContainer.innerHTML = cleanHtml;
      
      if(isIE)
      {
        var elements = obj.document.getElementsByTagName('*');
        for(i = 0; i < elements.length; i++)
        {
          var firstClassName = elements[i].className.replace(/^(\S*).*/, "$1");
          if(classes[firstClassName])
          {
            elements[i].style.styleFloat = 'none';
          }
        }
      }
      
      pleaseWait.style.display = 'none';
      mainContainer.style.display = 'block';
      
      var shading = obj.document.getElementById('nonPrintableShading');
      shading.style.width = obj.document.body.scrollWidth + "px";
      shading.style.height = obj.document.body.scrollHeight + "px";
      obj.print();
    }
  }

  function CheckVisibility()
  {
    ProcessPrintWarning();
    
    if(!BonaPrint.enabled)
    {
      return;
    }
  
    if(BonaPrint.printMode == '1') // admin mode
    {
      BonaPrint.enabled = false;
      return;
    }
  
    if(BonaPrint.iconVisibility[document.body.id] != null)
    {
      BonaPrint.enabled = BonaPrint.iconVisibility[document.body.id];
    }
    else
    {
      BonaPrint.enabled = BonaPrint.visibilityDefault;
    }
  }

  function ProcessPrintWarning()
  {
    var printWarning = document.getElementById('idPrintWarningJS');
    var printWarningNoJS = document.getElementById('idPrintWarningNoJS');
    var printWarningContainer = document.getElementById('idPrintWarning');
    
    if(!BonaPrint.enabled)
    {
      if(BonaPrint.printMode == '0' && printWarningContainer)
      {
        printWarningContainer.style.display = 'none';
      }
      return;
    }

    if(printWarning && printWarningNoJS)
    {
      printWarning.style.display = 'inline';
      printWarningNoJS.style.display = 'none';
    }
  }

  function moveToPosition(obj)
  {
	    if(BonaPrint.iconPosition.id && document.getElementById(BonaPrint.iconPosition.id))
	    {
	      moveToRelativePosition(obj);
	    }
	    else
	    {
	      moveToFixedPosition(obj);
	    }
			
			obj.style.visibility = 'visible';
  }
  
  function moveToRelativePosition(obj)
  {
    var docForPosition = document.getElementById(BonaPrint.iconPosition.id);
    
    BonaPage.getElementXY(docForPosition);
    
    switch(BonaPrint.iconPosition.horizontalAlign)
    {
      default:
      case 'right':
      {
        obj.style.right = '';
        obj.style.left = ((( docForPosition.X + docForPosition.offsetWidth ) - printLinkContainer.offsetWidth) + BonaPrint.iconPosition.horizontalOffset) + 'px';
        break;
      }
      case 'center':
      {
        obj.style.right = '';
        obj.style.left = ((( docForPosition.X + (docForPosition.offsetWidth / 2) - (printLinkContainer.offsetWidth / 2) )) + BonaPrint.iconPosition.horizontalOffset) + 'px';
        break;
      }
      case 'left':
      {
        obj.style.left = (docForPosition.X + BonaPrint.iconPosition.horizontalOffset) + 'px';
        break;
      }
    }
    switch(BonaPrint.iconPosition.verticalAlign)
    {
      default:
      case 'top':
      {
        obj.style.top = (docForPosition.Y + BonaPrint.iconPosition.verticalOffset) + 'px';
        break;
      }
      case 'middle':
      {
        obj.style.top = (docForPosition.Y + ((docForPosition.offsetHeight / 2) - (printLinkContainer.offsetHeight / 2)) + BonaPrint.iconPosition.verticalOffset) + 'px';
        break;
      }
      case 'bottom':
      {
        obj.style.top = (docForPosition.Y + docForPosition.offsetHeight - printLinkContainer.offsetHeight + BonaPrint.iconPosition.verticalOffset) + 'px';
        break;
      }
    }
  }
  
  function moveToFixedPosition(obj)
  {
    if(!(isIE && isIE <= 6))
    {
      obj.style.position = 'fixed';
    }
    
    switch(BonaPrint.iconPosition.horizontalAlign)
    {
      default:
      case 'right':
      {
        obj.style.left = '';
        obj.style.right = (0 - BonaPrint.iconPosition.horizontalOffset) + 'px';
        break;
      }
      case 'center':
      {
        obj.style.left = '';
        obj.style.right = (BonaPage.getInnerWidth() - ( (BonaPage.getInnerWidth() / 2) + (printLinkContainer.offsetWidth / 2) ) - BonaPrint.iconPosition.horizontalOffset) + 'px';
        break;
      }
      case 'left':
      {
        obj.style.left = (0 + BonaPrint.iconPosition.horizontalOffset) + 'px';
        obj.style.right = '';
        break;
      }
    }

    switch(BonaPrint.iconPosition.verticalAlign)
    {
      default:
      case 'top':
      {
        obj.style.top = (BonaPrint.iconPosition.verticalOffset + ((isIE && isIE <= 6) ? BonaPage.getScrollTop() : 0)) + 'px';
        break;
      }
      case 'middle':
      {
        obj.style.top = ((BonaPage.getInnerHeight() / 2) + ((isIE && isIE <= 6) ? BonaPage.getScrollTop() : 0) - (printLinkContainer.offsetHeight / 2) + BonaPrint.iconPosition.verticalOffset) + 'px';
        break;
      }
      case 'bottom':
      {
        obj.style.top = (BonaPage.getInnerHeight() + ((isIE && isIE <= 6) ? BonaPage.getScrollTop() : 0) - printLinkContainer.offsetHeight + BonaPrint.iconPosition.verticalOffset + (!isIE ? -17 : 0)) + 'px';
        break;
      }
    }
  }
  
  function showPrintIcon()
  {
    if(initTimeout)
      clearTimeout(initTimeout);
      
    if(isIconShown)
      return;
    else
      isIconShown = true;
    
    printLinkContainer = document.getElementById('idPrintLinkContainer');
    
    if(printLinkContainer)
    {
      printLinkContainer.style.display = 'block';
      
      printLinkContainer.title = BonaPrint.textTitle;

      moveToPosition(printLinkContainer);
      BonaPage.addHandler(window, 'resize', onResize);
      if(isIE && isIE <= 6)
      {
        BonaPage.addHandler(window, 'scroll', onScroll);
      }
    }
  }
  
  function onResize()
  {
    printLinkContainer.style.visibility = 'hidden';
    setTimeout( function() { moveToPosition(printLinkContainer); }, 5);
  }
  
  function onScroll()
  {
    printLinkContainer.style.visibility = 'hidden';
    setTimeout( function() { moveToPosition(printLinkContainer); }, 5);
  }
  
  if(BonaPrint.enabled)
  {
    BonaPage.addPageStateHandler(BonaPage.PAGE_PARSED, BonaPrint.initPrintIcon);
  }
  
}) ();
