bgneal@1
|
1 // Core javascript helper functions
|
bgneal@1
|
2
|
bgneal@1
|
3 // basic browser identification & version
|
bgneal@1
|
4 var isOpera = (navigator.userAgent.indexOf("Opera")>=0) && parseFloat(navigator.appVersion);
|
bgneal@1
|
5 var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]);
|
bgneal@1
|
6
|
bgneal@1
|
7 // Cross-browser event handlers.
|
bgneal@1
|
8 function addEvent(obj, evType, fn) {
|
bgneal@1
|
9 if (obj.addEventListener) {
|
bgneal@1
|
10 obj.addEventListener(evType, fn, false);
|
bgneal@1
|
11 return true;
|
bgneal@1
|
12 } else if (obj.attachEvent) {
|
bgneal@1
|
13 var r = obj.attachEvent("on" + evType, fn);
|
bgneal@1
|
14 return r;
|
bgneal@1
|
15 } else {
|
bgneal@1
|
16 return false;
|
bgneal@1
|
17 }
|
bgneal@1
|
18 }
|
bgneal@1
|
19
|
bgneal@1
|
20 function removeEvent(obj, evType, fn) {
|
bgneal@1
|
21 if (obj.removeEventListener) {
|
bgneal@1
|
22 obj.removeEventListener(evType, fn, false);
|
bgneal@1
|
23 return true;
|
bgneal@1
|
24 } else if (obj.detachEvent) {
|
bgneal@1
|
25 obj.detachEvent("on" + evType, fn);
|
bgneal@1
|
26 return true;
|
bgneal@1
|
27 } else {
|
bgneal@1
|
28 return false;
|
bgneal@1
|
29 }
|
bgneal@1
|
30 }
|
bgneal@1
|
31
|
bgneal@1
|
32 // quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
|
bgneal@1
|
33 function quickElement() {
|
bgneal@1
|
34 var obj = document.createElement(arguments[0]);
|
bgneal@1
|
35 if (arguments[2] != '' && arguments[2] != null) {
|
bgneal@1
|
36 var textNode = document.createTextNode(arguments[2]);
|
bgneal@1
|
37 obj.appendChild(textNode);
|
bgneal@1
|
38 }
|
bgneal@1
|
39 var len = arguments.length;
|
bgneal@1
|
40 for (var i = 3; i < len; i += 2) {
|
bgneal@1
|
41 obj.setAttribute(arguments[i], arguments[i+1]);
|
bgneal@1
|
42 }
|
bgneal@1
|
43 arguments[1].appendChild(obj);
|
bgneal@1
|
44 return obj;
|
bgneal@1
|
45 }
|
bgneal@1
|
46
|
bgneal@1
|
47 // ----------------------------------------------------------------------------
|
bgneal@1
|
48 // Cross-browser xmlhttp object
|
bgneal@1
|
49 // from http://jibbering.com/2002/4/httprequest.html
|
bgneal@1
|
50 // ----------------------------------------------------------------------------
|
bgneal@1
|
51 var xmlhttp;
|
bgneal@1
|
52 /*@cc_on @*/
|
bgneal@1
|
53 /*@if (@_jscript_version >= 5)
|
bgneal@1
|
54 try {
|
bgneal@1
|
55 xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
|
bgneal@1
|
56 } catch (e) {
|
bgneal@1
|
57 try {
|
bgneal@1
|
58 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
|
bgneal@1
|
59 } catch (E) {
|
bgneal@1
|
60 xmlhttp = false;
|
bgneal@1
|
61 }
|
bgneal@1
|
62 }
|
bgneal@1
|
63 @else
|
bgneal@1
|
64 xmlhttp = false;
|
bgneal@1
|
65 @end @*/
|
bgneal@1
|
66 if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
|
bgneal@1
|
67 xmlhttp = new XMLHttpRequest();
|
bgneal@1
|
68 }
|
bgneal@1
|
69
|
bgneal@1
|
70 // ----------------------------------------------------------------------------
|
bgneal@1
|
71 // Find-position functions by PPK
|
bgneal@1
|
72 // See http://www.quirksmode.org/js/findpos.html
|
bgneal@1
|
73 // ----------------------------------------------------------------------------
|
bgneal@1
|
74 function findPosX(obj) {
|
bgneal@1
|
75 var curleft = 0;
|
bgneal@1
|
76 if (obj.offsetParent) {
|
bgneal@1
|
77 while (obj.offsetParent) {
|
bgneal@1
|
78 curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft);
|
bgneal@1
|
79 obj = obj.offsetParent;
|
bgneal@1
|
80 }
|
bgneal@1
|
81 // IE offsetParent does not include the top-level
|
bgneal@1
|
82 if (isIE && obj.parentElement){
|
bgneal@1
|
83 curleft += obj.offsetLeft - obj.scrollLeft;
|
bgneal@1
|
84 }
|
bgneal@1
|
85 } else if (obj.x) {
|
bgneal@1
|
86 curleft += obj.x;
|
bgneal@1
|
87 }
|
bgneal@1
|
88 return curleft;
|
bgneal@1
|
89 }
|
bgneal@1
|
90
|
bgneal@1
|
91 function findPosY(obj) {
|
bgneal@1
|
92 var curtop = 0;
|
bgneal@1
|
93 if (obj.offsetParent) {
|
bgneal@1
|
94 while (obj.offsetParent) {
|
bgneal@1
|
95 curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop);
|
bgneal@1
|
96 obj = obj.offsetParent;
|
bgneal@1
|
97 }
|
bgneal@1
|
98 // IE offsetParent does not include the top-level
|
bgneal@1
|
99 if (isIE && obj.parentElement){
|
bgneal@1
|
100 curtop += obj.offsetTop - obj.scrollTop;
|
bgneal@1
|
101 }
|
bgneal@1
|
102 } else if (obj.y) {
|
bgneal@1
|
103 curtop += obj.y;
|
bgneal@1
|
104 }
|
bgneal@1
|
105 return curtop;
|
bgneal@1
|
106 }
|
bgneal@1
|
107
|
bgneal@1
|
108 //-----------------------------------------------------------------------------
|
bgneal@1
|
109 // Date object extensions
|
bgneal@1
|
110 // ----------------------------------------------------------------------------
|
bgneal@1
|
111 Date.prototype.getCorrectYear = function() {
|
bgneal@1
|
112 // Date.getYear() is unreliable --
|
bgneal@1
|
113 // see http://www.quirksmode.org/js/introdate.html#year
|
bgneal@1
|
114 var y = this.getYear() % 100;
|
bgneal@1
|
115 return (y < 38) ? y + 2000 : y + 1900;
|
bgneal@1
|
116 }
|
bgneal@1
|
117
|
bgneal@1
|
118 Date.prototype.getTwoDigitMonth = function() {
|
bgneal@1
|
119 return (this.getMonth() < 9) ? '0' + (this.getMonth()+1) : (this.getMonth()+1);
|
bgneal@1
|
120 }
|
bgneal@1
|
121
|
bgneal@1
|
122 Date.prototype.getTwoDigitDate = function() {
|
bgneal@1
|
123 return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
|
bgneal@1
|
124 }
|
bgneal@1
|
125
|
bgneal@1
|
126 Date.prototype.getTwoDigitHour = function() {
|
bgneal@1
|
127 return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
|
bgneal@1
|
128 }
|
bgneal@1
|
129
|
bgneal@1
|
130 Date.prototype.getTwoDigitMinute = function() {
|
bgneal@1
|
131 return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
|
bgneal@1
|
132 }
|
bgneal@1
|
133
|
bgneal@1
|
134 Date.prototype.getTwoDigitSecond = function() {
|
bgneal@1
|
135 return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
|
bgneal@1
|
136 }
|
bgneal@1
|
137
|
bgneal@1
|
138 Date.prototype.getISODate = function() {
|
bgneal@1
|
139 return this.getCorrectYear() + '-' + this.getTwoDigitMonth() + '-' + this.getTwoDigitDate();
|
bgneal@1
|
140 }
|
bgneal@1
|
141
|
bgneal@1
|
142 Date.prototype.getHourMinute = function() {
|
bgneal@1
|
143 return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
|
bgneal@1
|
144 }
|
bgneal@1
|
145
|
bgneal@1
|
146 Date.prototype.getHourMinuteSecond = function() {
|
bgneal@1
|
147 return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond();
|
bgneal@1
|
148 }
|
bgneal@1
|
149
|
bgneal@1
|
150 // ----------------------------------------------------------------------------
|
bgneal@1
|
151 // String object extensions
|
bgneal@1
|
152 // ----------------------------------------------------------------------------
|
bgneal@1
|
153 String.prototype.pad_left = function(pad_length, pad_string) {
|
bgneal@1
|
154 var new_string = this;
|
bgneal@1
|
155 for (var i = 0; new_string.length < pad_length; i++) {
|
bgneal@1
|
156 new_string = pad_string + new_string;
|
bgneal@1
|
157 }
|
bgneal@1
|
158 return new_string;
|
bgneal@1
|
159 }
|
bgneal@1
|
160
|
bgneal@1
|
161 // ----------------------------------------------------------------------------
|
bgneal@1
|
162 // Get the computed style for and element
|
bgneal@1
|
163 // ----------------------------------------------------------------------------
|
bgneal@1
|
164 function getStyle(oElm, strCssRule){
|
bgneal@1
|
165 var strValue = "";
|
bgneal@1
|
166 if(document.defaultView && document.defaultView.getComputedStyle){
|
bgneal@1
|
167 strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
|
bgneal@1
|
168 }
|
bgneal@1
|
169 else if(oElm.currentStyle){
|
bgneal@1
|
170 strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
|
bgneal@1
|
171 return p1.toUpperCase();
|
bgneal@1
|
172 });
|
bgneal@1
|
173 strValue = oElm.currentStyle[strCssRule];
|
bgneal@1
|
174 }
|
bgneal@1
|
175 return strValue;
|
bgneal@1
|
176 }
|