Blame view

assets/pages/scripts/incomereportFile/jprint.js 9.61 KB
10646c94   Andy   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
  /* @license
   * jQuery.print, version 1.3.2
   *  (c) Sathvik Ponangi, Doers' Guild
   * Licence: CC-By (http://creativecommons.org/licenses/by/3.0/)
   *--------------------------------------------------------------------------*/
  (function ($) {
      "use strict";
      // A nice closure for our definitions
      function getjQueryObject(string) {
          // Make string a vaild jQuery thing
          var jqObj = $("");
          try {
              jqObj = $(string)
                  .clone();
          } catch (e) {
              jqObj = $("<span />")
                  .html(string);
          }
          return jqObj;
      }
  
      function printFrame(frameWindow) {
          // Print the selected window/iframe
          var def = $.Deferred();
          try {
              setTimeout(function () {
                  // Fix for IE : Allow it to render the iframe
                  frameWindow.focus();
                  try {
                      // Fix for IE11 - printng the whole page instead of the iframe content
                      if (!frameWindow.document.execCommand('print', false, null)) {
                          // document.execCommand returns false if it failed -http://stackoverflow.com/a/21336448/937891
                          frameWindow.print();
                      }
                  } catch (e) {
                      frameWindow.print();
                  }
                  frameWindow.close();
                  def.resolve();
              }, 250);
          } catch (err) {
              def.reject(err);
          }
          return def;
      }
  
      function printContentInNewWindow(content) {
          // Open a new window and print selected content
          var w = window.open();
          w.document.write(content);
          w.document.close();
          return printFrame(w);
      }
  
      function isNode(o) {
          /* http://stackoverflow.com/a/384380/937891 */
          return !!(typeof Node === "object" ? o instanceof Node : o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName === "string");
      }
      $.print = $.fn.print = function (chartsObj, chartClass, tabOption) {
          // Print a given set of elements
          var options, $this, self = this;
          var _tabOption = tabOption || "";
          // console.log("Printing", this, arguments);
          if (self instanceof $) {
              // Get the node if it is a jQuery object
              self = self.get(0);
          }
          if (isNode(self)) {
              // If `this` is a HTML element, i.e. for
              // $(selector).print()
              $this = $(self);
              if (arguments.length > 0) {
                  options = arguments[0];
              }
          } else {
              if (arguments.length > 0) {
                  // $.print(selector,options)
                  $this = $(arguments[0]);
                  if (isNode($this[0])) {
                      if (arguments.length > 1) {
                          options = arguments[1];
                      }
                  } else {
                      // $.print(options)
                      options = arguments[0];
                      $this = $("html");
                  }
              } else {
                  // $.print()
                  $this = $("html");
              }
          }
          // Default options
          var defaults = {
              globalStyles: true,
              mediaPrint: false,
              stylesheet: null,
              noPrintSelector: ".no-print",
              iframe: true,
              append: null,
              prepend: null,
              manuallyCopyFormValues: true,
              deferred: $.Deferred()
          };
          // Merge with user-options
          options = $.extend({}, defaults, (options || {}));
          var $styles = $("");
          if (options.globalStyles) {
              // Apply the stlyes from the current sheet to the printed page
              $styles = $("style, link, meta, title");
          } else if (options.mediaPrint) {
              // Apply the media-print stylesheet
              $styles = $("link[media=print]");
          }
          if (options.stylesheet) {
              // Add a custom stylesheet if given
              $styles = $.merge($styles, $('<link rel="stylesheet" href="' + options.stylesheet + '">'));
          }
          // Create a copy of the element to print
          var copy = $this.clone();
          // Wrap it in a span to get the HTML markup string
          copy = $("<span/>")
              .append(copy);
          // Remove unwanted elements
          copy.find(options.noPrintSelector)
              .remove();
          // Add in the styles
          copy.append($styles.clone());
          // Appedned content
          copy.append(getjQueryObject(options.append));
          // Prepended content
          copy.prepend(getjQueryObject(options.prepend));
          if (options.manuallyCopyFormValues) {
              // Manually copy form values into the HTML for printing user-modified input fields
              // http://stackoverflow.com/a/26707753
              copy.find("input")
                  .each(function () {
                      var $field = $(this);
                      if ($field.is("[type='radio']") || $field.is("[type='checkbox']")) {
                          if ($field.prop("checked")) {
                              $field.attr("checked", "checked");
                          }
                      } else {
                          $field.attr("value", $field.val());
                      }
                  });
              copy.find("select").each(function () {
                  var $field = $(this);
                  $field.find(":selected").attr("selected", "selected");
              });
              copy.find("textarea").each(function () {
                  // Fix for https://github.com/DoersGuild/jQuery.print/issues/18#issuecomment-96451589
                  var $field = $(this);
                  $field.text($field.val());
              });
              //Echarts
              var echarts = chartsObj || null;
              var echartsClass = chartClass || "";
              if (echarts != null && echartsClass != "") {
                  var picBase64Info = echarts.getDataURL();
                  var echartsDom = copy.find("." + echartsClass);
                  //empty
                  echartsDom.empty();
                  //replace
                  echartsDom.append("<img src='" + picBase64Info + "' style='width:100%;height:100%;'/>");
              };
              //Table
              if (_tabOption != "") {
                  var tabObj = copy.find("." + _tabOption.panelClass);
                  tabObj.empty();
                  tabObj.append(_tabOption.panelContent);
              }
          }
          // Get the HTML markup string
          var content = copy.html();
          // Notify with generated markup & cloned elements - useful for logging, etc
          try {
              options.deferred.notify('generated_markup', content, copy);
          } catch (err) {
              console.warn('Error notifying deferred', err);
          }
          // Destroy the copy
          copy.remove();
          if (options.iframe) {
              // Use an iframe for printing
              try {
                  var $iframe = $(options.iframe + "");
                  var iframeCount = $iframe.length;
                  if (iframeCount === 0) {
                      // Create a new iFrame if none is given
                      $iframe = $('<iframe height="0" width="0" border="0" wmode="Opaque"/>')
                          .prependTo('body')
                          .css({
                              "position": "absolute",
                              "top": -999,
                              "left": -999
                          });
                  }
                  var w, wdoc;
                  w = $iframe.get(0);
                  w = w.contentWindow || w.contentDocument || w;
                  wdoc = w.document || w.contentDocument || w;
                  wdoc.open();
                  wdoc.write(content);
                  wdoc.close();
                  printFrame(w)
                      .done(function () {
                          // Success
                          setTimeout(function () {
                              // Wait for IE
                              if (iframeCount === 0) {
                                  // Destroy the iframe if created here
                                  $iframe.remove();
                              }
                          }, 100);
                      })
                      .fail(function (err) {
                          // Use the pop-up method if iframe fails for some reason
                          console.error("Failed to print from iframe", err);
                          printContentInNewWindow(content);
                      })
                      .always(function () {
                          try {
                              options.deferred.resolve();
                          } catch (err) {
                              console.warn('Error notifying deferred', err);
                          }
                      });
              } catch (e) {
                  // Use the pop-up method if iframe fails for some reason
                  console.error("Failed to print from iframe", e.stack, e.message);
                  printContentInNewWindow(content)
                      .always(function () {
                          try {
                              options.deferred.resolve();
                          } catch (err) {
                              console.warn('Error notifying deferred', err);
                          }
                      });
              }
          } else {
              // Use a new window for printing
              printContentInNewWindow(content)
                  .always(function () {
                      try {
                          options.deferred.resolve();
                      } catch (err) {
                          console.warn('Error notifying deferred', err);
                      }
                  });
          }
          return this;
      };
  })(jQuery);