/*
* Print Element Plugin 1.0
*
* Copyright (c) 2009 Erik Zaadi
*
* Inspired by PrintArea (http://plugins.jquery.com/project/PrintArea) and
* http://stackoverflow.com/questions/472951/how-do-i-print-an-iframe-from-javascript-in-safari-chrome
*
*  jQuery plugin page : http://plugins.jquery.com/project/printElement 
*  Wiki : http://wiki.github.com/erikzaadi/jQueryPlugins/jqueryprintelement 
*  Home Page : http://erikzaadi.github.com/jQueryPlugins/jQuery.printElement 
*  
*  Thanks to David B (http://github.com/ungenio) and icgJohn (http://www.blogger.com/profile/11881116857076484100)
*  For their great contributions!
* 
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*   
*   Note, Iframe Printing is not supported in Opera and Chrome 3.0, a popup window will be shown instead
*/
;
(function($){
    $.fn.printElement = function(options){
        var mainOptions = $.extend({onPrintWindowReady:null}, $.fn.printElement.defaults, options);
        //iframe mode is not supported for opera and chrome 3.0 (it prints the entire page).
        //http://www.google.com/support/forum/p/Webmasters/thread?tid=2cb0f08dce8821c3&hl=en
        if (mainOptions.printMode == 'iframe') {
            if ($.browser.opera || (/chrome/.test(navigator.userAgent.toLowerCase()))) 
                mainOptions.printMode = 'popup';
        }
        //Remove previously printed iframe if exists
        $("[id^='printElement_']").remove();
        
        return this.each(function(){
            //Support Metadata Plug-in if available
            var opts = $.meta ? $.extend({}, mainOptions, $this.data()) : mainOptions;
            pre_printElement($(this), opts);
        });
    };
    $.fn.printElement.defaults = {
        printtitle:'Напечатать'
        , deletetitle:'Удалить'
        , needEdit:false
        
        , topInfo: { // info to show in the top of printed content
            need:true
            , isdone: false //if you want to load contetn by ajax - need false
            , url:'printing/topper.html' // url to load by ajax
            , html:'' // html to show in the top of items
        }
        , bottomInfo: { // info to show in the bottom of printed content
            need:true
            , isdone: false //if you want to load contetn by ajax - need false
            , url:'printing/bottomer.html' // url to load by ajax
            , html:'' // html to show in the top of items
        }
        
        , isdone:true // all needed executions isdone - we can show print window
        
        , printMode: 'iframe', //Usage : iframe / popup
        pageTitle: '', //Print Page Title
        overrideElementCSS: null,
        
        printWindowOptions: {
            height: '800' //style attributes to add to the body of print document
            , width: '650' //css class to add to the body of print document
        },        
        
        /* Can be one of the following 3 options:
         * 1 : boolean (pass true for stripping all css linked)
         * 2 : array of $.fn.printElement.cssElement (s)
         * 3 : array of strings with paths to alternate css files (optimized for print)
         */
        printBodyOptions: {
            styleToAdd: 'padding:25px 10px 10px 10px;margin:10px;', //style attributes to add to the body of print document
            classNameToAdd: '' //css class to add to the body of print document
        },
        leaveOpen: false, // in case of popup, leave the print page open or not
        iframeElementOptions: {
            styleToAdd: 'border:none;position:absolute;width:0px;height:0px;bottom:0px;left:0px;', //style attributes to add to the iframe element
            classNameToAdd: '' //css class to add to the iframe element
        }
        , onPrintWindowReady: ''
    };
    $.fn.printElement.cssElement = {
        href: '',
        media: ''
    };
    
    function pre_printElement(element, opts){
        if (opts.topInfo && opts.topInfo.need && !opts.topInfo.isdone){
            opts.isdone = false;
            
            $.get('printing/topper.html', function(data) {
                opts.topInfo.isdone = true;
                opts.topInfo.html = data;
                opts.isdone = true;
                
                pre_printElement(element, opts)
            });
        }        
        if (opts.isdone && opts.bottomInfo && opts.bottomInfo.need && !opts.bottomInfo.isdone){
            opts.isdone = false;
            
            $.get('printing/bottomer.html', function(data) {
                opts.bottomInfo.isdone = true;
                opts.bottomInfo.html = data;
                opts.isdone = true;
                
                pre_printElement(element, opts)
            });
        }        
        
        if (opts.isdone)
            _printElement(element, opts);   
    }
    
    function _printElement(element, opts){
        //Create markup to be printed
        var html = _getMarkup(element, opts);
        var popupOrIframe = null;
        var documentToWriteTo = null;
        if (opts.printMode.toLowerCase() == 'popup') {            
            //popupOrIframe = window.open('about:blank', 'printElementWindow', 'width=650,height=440,scrollbars=yes');
            popupOrIframe = window.open('about:blank', 'printElementWindow', 'width='+opts.printWindowOptions.width+',height='+opts.printWindowOptions.height+',scrollbars=yes');
            documentToWriteTo = popupOrIframe.document;
        }
        else {
            //The random ID is to overcome a safari bug http://www.cjboco.com.sharedcopy.com/post.cfm/442dc92cd1c0ca10a5c35210b8166882.html
            var printElementID = "printElement_" + (Math.round(Math.random() * 99999)).toString();
            //Native creation of the element is faster..
            var iframe = document.createElement('IFRAME');
            $(iframe).attr({
                style: opts.iframeElementOptions.styleToAdd,
                id: printElementID,
                className: opts.iframeElementOptions.classNameToAdd,
                frameBorder: 0,
                scrolling: 'no',
                src: 'about:blank'
            });
            document.body.appendChild(iframe);
            documentToWriteTo = (iframe.contentWindow || iframe.contentDocument);
            if (documentToWriteTo.document) 
                documentToWriteTo = documentToWriteTo.document;
            iframe = document.frames ? document.frames[printElementID] : document.getElementById(printElementID);
            popupOrIframe = iframe.contentWindow || iframe;
        }
        focus();
        documentToWriteTo.open();
        
        documentToWriteTo.write(html);       

        //alert('2');
        documentToWriteTo.close();
        //alert('3');
        
        if (opts.onPrintWindowReady){
            opts.onPrintWindowReady();
        }        
        _callPrint(popupOrIframe);
        popupOrIframe.focus();
    };
    
    function _callPrint(element){
        if (element && element.printPage) 
            element.printPage();
        else 
            setTimeout(function(){
                _callPrint(element);
            }, 50);
    }
    
    function _getElementHTMLIncludingFormElements(element){        
        var $element = $(element).clone();
        //var $element = $(element);
        //Radiobuttons and checkboxes
        $("a", $element).each(function(){
            var txt = $(this).html();           
            if ( isBlank(txt) ){ 
                txt = $(this).attr('alt');               
            }
            if ( isBlank(txt) ){ 
                txt = $(this).attr('title');               
            }
            //alert(this);
            $(this).replaceWith(txt);
        });        
        
        $(":checked", $element).each(function(){
            this.setAttribute('checked', 'checked');
        });
        //simple text inputs
        $("input[type='text']", $element).each(function(){
            this.setAttribute('value', $(this).val());
        });
        $("select", $element).each(function(){
            var $select = $(this);
            $("option", $select).each(function(){
                if ($select.val() == $(this).val()) 
                    this.setAttribute('selected', 'selected');
            });
        });
        $("textarea", $element).each(function(){
            //Thanks http://blog.ekini.net/2009/02/24/jquery-getting-the-latest-textvalue-inside-a-textarea/
            var value = $(this).attr('value');
            if ($.browser.mozilla) 
                this.firstChild.textContent = value;
            else 
                this.innerHTML = value;
        });
        
        $(".noPrint, .gmnoprint, script", $element).remove();
        var elementHtml = $element.html();        
        
        //alert(elementHtml);
        
        /*
        element = $(elementHtml);        
        elementHtml = element.html();
                
        
        $(".noPrint, .gmnoprint", element).remove();
        //elementHtml = element.html();
        alert(elementHtml);
        */
        
        return elementHtml;
    }
    
    function _getBaseHref(){
        return window.location.protocol + window.location.hostname + window.location.pathname;
    }
    
    function _getMarkup(element, opts){
        var $element = $(element);
        
        var elementHtml = _getElementHTMLIncludingFormElements(element);               
        
        var html = new Array();
        html.push('<html><head><title>' + opts.pageTitle + '</title>');
        if (opts.overrideElementCSS) {
            if (opts.overrideElementCSS.length > 0) {
                for (var x = 0; x < opts.overrideElementCSS.length; x++) {
                    var current = opts.overrideElementCSS[x];
                    if (typeof(current) == 'string') 
                        html.push('<link type="text/css" rel="stylesheet" href="' + current + '" >');
                    else 
                        html.push('<link type="text/css" rel="stylesheet" href="' + current.href + '" media="' + current.media + '" >');
                }
            }
        } else {
            /*
            $(document).find("link").filter(function(){
                return $(this).attr("rel").toLowerCase() == "stylesheet";
            }).each(function(){
                html.push('<link type="text/css" rel="stylesheet" href="' + $(this).attr("href") + '" >');
            });
            */
        }
        
        html.push('<link type="text/css" rel="stylesheet" href="/printing/print.css" >');
        //Ensure that relative links work
        html.push('<script type="text/javascript" src="/printing/jquery-1.3.2.min.js"></script>');        
        html.push('<script type="text/javascript" src="/printing/print.js"></script>');        
         
        //html.push('<base href="' + _getBaseHref() + '" />');
        html.push('</head><body onbeforeprint="showText();" onafterprint="hideText();" style="' + opts.printBodyOptions.styleToAdd + '" class="' + opts.printBodyOptions.classNameToAdd + '">');
        
        // topper  
        if (opts.topInfo.need){
            html.push ('<div class="static top" >' + opts.topInfo.html + '</div>');
        }
        html.push('<div class="' + $element.attr('class') + ' editable">' + elementHtml + '</div>');
        // bottom
        if (opts.bottomInfo.need){
            html.push ('<div class="static bottom" >' + opts.bottomInfo.html + '</div>');
        }        
        
        //alert(elementHtml);
        
        html.push('<div id="printBtn" class="noPrint" ><a href="#" onClick="print(); return false;" class="noPrint" >'+opts.printtitle+'</a></div>');
        html.push('<div id="deleteBtn" class="noPrint" ><a href="#" onClick="deleteClicked(); return false;" class="noPrint" >'+opts.deletetitle+'</a></div>');
        //html.push('<a href="#" onClick="print(); return false;" class="noPrint" >'+opts.printtitle+'</a>');
        html.push('<script type="text/javascript">function printPage(){ focus(); return; print();' 
            + ((!$.browser.opera && !opts.leaveOpen && opts.printMode.toLowerCase() == 'popup') ?
                'close();' : '') 
            + '}</script>');
        html.push('</body></html>');
        
        return html.join('');
    };
    })(jQuery);

    function isBlank(str) {
        return (!str || /^\s*$/.test(str));
    }
    
    
// onClick="hideText(\'printBtn\'); print(); showText(\'printBtn\');
