Develop and Download Open Source Software

Browse Subversion Repository

Contents of /js/common.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 43 - (show annotations) (download) (as text)
Mon Mar 22 18:14:07 2010 UTC (14 years, 2 months ago) by berupon
File MIME type: application/x-javascript
File size: 17566 byte(s)
indent変更
1
2 // Copyright (c) 2009 Katsuhisa Yuasa <berupon [at] gmail.com>
3 // License http://www.opensource.org/licenses/mit-license.html
4
5 if (!Object.defineProperty) {
6 if (Object.__defineGetter__ && Object.__defineSetter__) {
7 Object.defineProperty = function (obj, propName, desc) {
8 if (desc.get) {
9 obj.__defineGetter__(propName, desc.get);
10 }
11 if (desc.set) {
12 obj.__defineSetter__(propName, desc.set);
13 }
14 }
15 }
16 }
17
18 function clearFormElementsValues(form, id) {
19 var idlen = id.length;
20 if (form && form.elements.length) {
21 var elems = form.elements;
22 var len = elems.length;
23 for (var i=0; i<len; ++i) {
24 var ele = elems[i];
25 if (ele.name.length < idlen) {
26 continue;
27 }
28 if (ele.name.substring(0, idlen) == id) {
29 if (ele.nodeName == "INPUT" && ele.type == "checkbox") {
30 ele.checked = false;
31 }else {
32 ele.value = '';
33 }
34 }
35 }
36 }
37 }
38
39 function findCheckedElement(elems) {
40 if (elems) {
41 return $A(elems).find( function (val, idx) { return val.checked; });
42 }else {
43 return false;
44 }
45 }
46
47 function searchAncestor(elem, func) {
48 do {
49 if (func(elem.parentNode)) {
50 return elem.parentNode;
51 }
52 }while (elem = elem.parentNode);
53 return false;
54 }
55
56 function zip2addr(relativePath, zipInput, prefInputName, addrInputName) {
57 var zipCode = zipInput.value.strip();
58 if (zipCode == '') {
59 return;
60 }
61
62 new Ajax.Request(
63 relativePath + "zip/zip.php",
64 {
65 onSuccess : function(request) {
66 var data = request.responseText.evalJSON();
67 if (data[0]) {
68 var frm = zipInput.form;
69 var prefInput = frm[prefInputName];
70 if (prefInput.type == 'select-one') {
71 selectOptionByText(prefInput, data[6]);
72 }else {
73 }
74 var addrInput = frm[addrInputName];
75 if (addrInput.value.strip() == '') {
76 var str = '';
77 for (var i=6; i<9; ++i) {
78 str += data[i];
79 }
80 addrInput.value = str;
81 }
82 }
83 },
84 onFailure : function() {
85 alert("failed");
86 },
87 "method": "get",
88 "parameters" : "zipcode=" + zipCode
89 }
90 );
91
92 }
93
94 // http://daisuke-watanabe.com/12/
95 function addFigure(str) {
96 var num = new String(str).replace(/,/g, "");
97 while (num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
98 return num;
99 }
100
101 // DOM operation is slow ...
102 function mergeRepeativeValueRows(table, rowRange, columnIndexs) {
103 columnIndexs.sort(function(a,b) {
104 return a <= b ? 1 : -1;
105 });
106 var beginRowIndex = rowRange[0];
107 var endRowIndex = rowRange[1];
108 if (endRowIndex == -1) {
109 endRowIndex = table.rows.length;
110 }
111
112 for (i=0; i<columnIndexs.length; ++i) {
113 var ci = columnIndexs[i];
114 // count
115 var spanCounts = [];
116 var spanCount = 1;
117 if (beginRowIndex >= table.rows.length) {
118 continue;
119 }
120 var prevRow = table.rows[beginRowIndex];
121 var prevRowCellsLength = prevRow.cells.length;
122 if (ci < prevRowCellsLength) {
123 var prevCell = prevRow.cells[ci];
124 var prevCellTagName = prevCell.tagName;
125 var prevCellInnerHTML = prevCell.innerHTML;
126 }
127 for (k=beginRowIndex+1; k<endRowIndex; ++k) {
128 var curRow = table.rows[k];
129 var bContinue = false;
130 var curRowCellsLength = curRow.cells.length;
131 if (ci < curRowCellsLength) {
132 var curCell = curRow.cells[ci];
133 var curCellTagName = curCell.tagName;
134 var curCellInnerHTML = curCell.innerHTML;
135 if (ci < prevRowCellsLength) {
136 if (prevCellTagName == curCellTagName && prevCellInnerHTML == curCellInnerHTML) {
137 ++spanCount;
138 bContinue = true;
139 }
140 }
141 prevCellTagName = curCellTagName;
142 prevCellInnerHTML = curCellInnerHTML;
143 }
144 prevRowCellsLength = curRowCellsLength;
145 if (bContinue) {
146 continue;
147 }
148 spanCounts.push(spanCount);
149 spanCount = 1;
150 }
151 spanCounts.push(spanCount);
152 // merge
153 var rowIdx = beginRowIndex;
154 for (k=0; k<spanCounts.length; ++k) {
155 var spanCount = spanCounts[k];
156 if (spanCount == 1) {
157 ++rowIdx;
158 }else {
159 for (l=rowIdx+1; l<rowIdx+spanCount; ++l) {
160 table.rows[l].deleteCell(ci);
161 }
162 table.rows[rowIdx].cells[ci].rowSpan = spanCount;
163 rowIdx += spanCount;
164 }
165 }
166 }
167 }
168
169 function copyTableRow(from, to) {
170 if (Prototype.Browser.IE) {
171 for (var i=0; i<from.cells.length; ++i) {
172 var td = to.insertCell(-1);
173 td.innerHTML = from.cells[i].innerHTML;
174 }
175 }else {
176 to.innerHTML = from.innerHTML;
177 }
178 }
179
180 // from : http://mr-goofy.blogspot.com/2009/06/getelementsbyclassname_16.html
181 /***********************************************
182 * ������������������������������������������Element���������
183 ***********************************************/
184 var getElementsByClassName = (function(classname, tagname){
185
186 //������������������������function���������
187 var regClass = function(element, classname){
188 var classElements = new Array();
189 var regexe = new RegExp("\\b" + classname + "\\b");
190 for( i = 0; i < element.length; i++ ) {
191 if( regexe.exec(element[i].className) ) {
192 classElements.push(element[i]);
193 }
194 }
195 return classElements;
196 }
197 //IE���������
198 if( document.all ){
199 return function(classname, tagname){
200 if (arguments.length == 1) {
201 element = document.all;
202 }
203 else{
204 element = document.getElementsByTagName(tagname);
205 }
206 return regClass(element,classname);
207 };
208 }
209 //IE���������������
210 else{
211 return function(classname, tagname){
212 if (arguments.length == 1) {
213 tagname = "*";
214 }
215 var element = document.getElementsByTagName(tagname);
216 return regClass(element,classname);
217 };
218 }
219
220 })();
221
222 function radioInputTag($name, $value, $checked) {
223 var txt = "<input type='radio' name='" + $name + "' value='" + $value + "' ";
224 if ($checked) {
225 txt += "checked";
226 }
227 txt += " />";
228 return txt;
229 }
230
231 function findByMember(arr, name, value) {
232 for (var i=0; i<arr.length; ++i) {
233 if (arr[i][name] == value) {
234 return arr[i];
235 }
236 }
237 return null;
238 }
239
240 function sortHash(hash, cmp) {
241 var arr = [];
242 var keys = hash.keys();
243 for (var i=0; i<keys.length; ++i) {
244 var key = keys[i];
245 var value = hash.get(key);
246 var obj = {"key":key, "value":value};
247 arr.push(obj);
248 }
249 arr.sort(function (a,b) { return cmp(a.value, b.value); });
250 var ret = new Hash();
251 for (var i=0; i<arr.length; ++i) {
252 ret.set(arr[i].key, arr[i].value);
253 }
254 return ret;
255 }
256
257 // http://doc.infosnel.nl/javascript_trim.html
258 function trim(s) {
259 var l=0; var r=s.length -1;
260 while(l < s.length && s[l] == ' ')
261 { l++; }
262 while(r > l && s[r] == ' ')
263 { r-=1; }
264 return s.substring(l, r+1);
265 }
266
267
268 function splitTrim(str, separator) {
269 var arr = str.split(separator);
270 for (var i=0; i<arr.length; ++i) {
271 arr[i] = trim(arr[i]);
272 }
273 return arr;
274 }
275
276 // original : http://blog.mikuriya.biz/archives/286
277 // SELECT������������������������OPTION���������SELECT ������������������
278 function moveSelectedOptions(fromSelect, toSelect) {
279 var from_options = fromSelect.options;
280 var to_options = toSelect.options;
281 for (var i=0; i<from_options.length; ++i) {
282 if (!from_options[i].selected || !from_options[i].value) {
283 continue;
284 }
285 var addFlag = true;
286 for (var j=0; j<to_options.length; ++j) {
287 if (to_options[j].value == from_options[i].value) {
288 addFlag = false;
289 break;
290 }
291 }
292
293 if (addFlag) {
294 toSelect.appendChild(from_options[i])
295 }
296 --i;
297 }
298 }
299
300 // SELECT������������������������OPTION������������������
301 function relocateSelectedOptions(select, dir) {
302 var options = select.options;
303 if (dir == 0) {
304 return;
305 }
306 if (dir < 0) {
307 for (var i=0, len=options.length; i<len; ++i) {
308 if (options[i].selected) {
309 if (i+dir < 0) {
310 break;
311 }
312 select.insertBefore(options[i], options[i+dir]);
313 }
314 }
315 }else {
316 for (var len=options.length,i=len-1; i>=0; --i) {
317 if (options[i].selected) {
318 if (i+dir >= len) {
319 break;
320 }
321 select.insertBefore(options[i], options[i+dir].nextSibling);
322 }
323 }
324 }
325
326 }
327
328 function getSelectedOptionValue(select) {
329 var selValue = null;
330 if (select.selectedIndex != -1) {
331 selValue = select.options[select.selectedIndex].value;
332 }
333 return selValue;
334 }
335
336 function selectOptionByText(select, text) {
337 var options = select.options;
338 for (var i=0; i<select.length; ++i) {
339 if (options[i].text == text) {
340 select.selectedIndex = i;
341 break;
342 }
343 }
344 }
345
346 function createSelectOptionTags(arr, selectedKey) {
347 var str = '';
348 str += "<option value=''></option>";
349 for (var i in arr) {
350 var selected = '';
351 if (i == selectedKey) {
352 selected = 'selected';
353 }
354 var value = arr[i];
355 str += "<option value='" + String(i).htmlspecialchars() + "' " + selected + ">" + String(value).escapeHTML() + "</option>";
356 }
357 return str;
358 }
359
360 function setSelectOptions(select, arr) {
361 var selValue = getSelectedOptionValue(select);
362 var options = select.options;
363 options.length = 0;
364 options[options.length] = new Option();
365 if (arr.length == 0) {
366 return;
367 }
368
369 for (var i in arr) {
370 var value = arr[i]
371 var option = new Option(value, i);
372 option.selected = (value == selValue);
373 options[options.length] = option;
374 }
375 }
376
377 function createCheckboxTag(name, value, label, checked) {
378 var str = "<input type='checkbox' name='" + name + "' value='" + String(value).htmlspecialchars() + "'";
379 if (checked) {
380 str += " checked";
381 }
382 str += ">";
383 if (label) {
384 str = "<label>" + str + String(label).escapeHTML() + "</label>";
385 }
386 return str;
387 }
388
389 function createCheckboxTags(name, arr, selectedKeys, separator) {
390 if (arr.length == 0) {
391 return '';
392 }
393 str = '';
394
395 if (separator == undefined) {
396 separator = "\n";
397 }
398 for (var i in arr) {
399 checked = '';
400 if (Object.isArray(selectedKeys)) {
401 if (selectedKeys.indexOf(i) != -1) {
402 checked = 'checked';
403 }
404 }
405 str += "<label><input type='checkbox' name='" + name + "[]' value='" + i.htmlspecialchars() + "' " + checked + ">" + arr[i].escapeHTML() + "</label>";
406 str += separator;
407 }
408 return str;
409 }
410
411 function toggleVisibility(elem) {
412 if (elem.style.visibility == 'hidden') {
413 elem.style.visibility = 'visible';
414 // setAutoFocus();
415 }else {
416 elem.style.visibility = 'hidden';
417 }
418
419 }
420
421 function collectMember(arr, name) {
422 var values = [];
423 for (var i=0; i<arr.length; ++i) {
424 values.push(arr[i][name]);
425 }
426 return values;
427 }
428
429 // http://p2b.jp/1149066600
430 function windowEvent() {
431 if (window.event) return window.event;
432 var caller = arguments.callee.caller;
433 while (caller) {
434 var ob = caller.arguments[0];
435 if (ob && ob.constructor == MouseEvent) return ob;
436 caller = caller.caller;
437 }
438 return null;
439 }
440
441 // ���������������������������������������������DOM��������������� template������������������������������������������
442 //
443 // ������������
444 // # ���������������������������������������������������
445 // #hoge{ ���hoge������������������
446 // ������������������#key1 ������������������������������#key2 ��������������������������� key1 ������������������
447 // #} ������������������������
448 // ��������� data ������ hoge ���������������������������key���������������������������������
449 //
450 function modifyTemplate(src, data) {
451 var r = /^#/gm;
452 var r2 = /^[^\s]+/g;
453 var indexes = [];
454
455 while (r.test(src)) {
456 indexes.push(r.lastIndex);
457 }
458
459 if (indexes.length == 0) {
460 return src;
461 }
462
463 function attachParts(pieces, parts, setting) {
464 if (!setting) {
465 for (var j=0; j<parts.length; ++j) {
466 var part = parts[j];
467 pieces.push(part.text);
468 }
469 }else {
470 for (var i=0; i<setting.length; ++i) {
471 var name = setting[i];
472 for (var j=0; j<parts.length; ++j) {
473 var part = parts[j];
474 if (part.name == name) {
475 pieces.push(part.text);
476 break;
477 }
478 }
479 }
480 }
481 }
482
483 var defName = null;
484 var pos = 0;
485 var pieces = [];
486 var piece = src.substr(0, indexes[0] - 1);
487 pieces.push(piece);
488 var parts = [];
489 for (var i=0; i<indexes.length-1; ++i) {
490 var start = indexes[i];
491 var end = indexes[i+1] - 1;
492 piece = src.substr(start, end-start);
493 r2.lastIndex = 0;
494 var ret = r2.exec(piece);
495 if (!ret || !ret.length) {
496 return false;
497 }
498 var key = ret[0];
499 if (!defName) {
500 if (key.charAt(key.length-1) != '{') {
501 return false;
502 }
503 defName = key.substr(0, key.length-1);
504 }else {
505 if (key != '}') {
506 var part = piece.substr(r2.lastIndex, piece.length-1);
507 parts.push({name:key, text:part});
508 }else {
509 attachParts(pieces, parts, data[defName]);
510 parts.clear();
511 defName = null;
512 pieces.push(piece.substr(1,piece.length));
513 }
514 }
515 }
516 if (parts.length) {
517 attachParts(pieces, parts, data[defName]);
518 }
519 var start = indexes[indexes.length-1] + 1;
520 var piece = src.substr(start, src.length-start);
521 pieces.push(piece);
522 return pieces.join("");
523 }
524
525 function recordsToArray(recs, keyName, valueName) {
526 var ret = {};
527 for (var i=0; i<recs.length; ++i) {
528 var rec = recs[i];
529 var key = rec[keyName];
530 var value = rec[valueName];
531 ret[key] = value;
532 }
533 return ret;
534 }
535
536 // maybe re-inventing wheel?
537 function searchDOM(elem, func) {
538 var elems = elem.childNodes;
539 for (var i=0,len=elems.length; i<len; ++i) {
540 var e = elems[i];
541 if (func(e)) {
542 return e;
543 }
544 var ret = searchDOM(e, func);
545 if (ret) {
546 return ret;
547 }
548 }
549 return null;
550 }
551
552 // ���������node���key���������object tree������������
553 function distributeElements(elements, keys) {
554 var arr = {};
555 for (var i=0; i<elements.length; ++i) {
556 var e = elements[i];
557 var tmp = arr;
558 for (var j=0; j<keys.length-1; ++j) {
559 var key = e.getAttribute(keys[j]);
560 if (!(key in tmp)) {
561 tmp[key] = {};
562 }
563 tmp = tmp[key];
564 }
565 var key = e.getAttribute(keys[keys.length-1]);
566 tmp[key] = e;
567 }
568 return arr;
569 }
570
571 // http://bytes.com/topic/javascript/answers/715567-deep-cloning-object
572 function clone_obj(obj) {
573 var c = obj instanceof Array ? [] : {};
574 for (var i in obj) {
575 var prop = obj[i];
576 if (typeof prop == 'object') {
577 if (prop instanceof Array) {
578 c[i] = [];
579 for (var j = 0; j < prop.length; j++) {
580 if (typeof prop[j] != 'object') {
581 c[i].push(prop[j]);
582 } else {
583 c[i].push(clone_obj(prop[j]));
584 }
585 }
586 }else {
587 c[i] = clone_obj(prop);
588 }
589 }else {
590 c[i] = prop;
591 }
592 }
593 return c;
594 }
595
596 // http://serennz.sakura.ne.jp/sb/log/eid73.html
597 String.prototype.htmlspecialchars = function() {
598 ch = this + "";
599 ch = ch.replace(/&/g,"&amp;") ;
600 ch = ch.replace(/"/g,"&quot;") ; // "
601 ch = ch.replace(/'/g,"&#039;") ; // '
602 ch = ch.replace(/</g,"&lt;") ;
603 ch = ch.replace(/>/g,"&gt;") ;
604 return ch ;
605 }
606
607 function escapeHTML(str) {
608 if (typeof str == String) {
609 return str.escapeHTML();
610 }else {
611 return "";
612 }
613 }
614
615 function htmlspecialchars(str) {
616 if (typeof str == String) {
617 return str.htmlspecialchars();
618 }else {
619 return "";
620 }
621 }
622
623 // innerHTML������������������������������������������Firefox������������������������������������������������������������������
624 // ������������������Node���������Node���������
625 function createNodeWithScript(html) {
626 var div = document.createElement("div");
627
628 // http://msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx
629 // http://social.msdn.microsoft.com/forums/en-US/iewebdevelopment/thread/33fd33f7-e857-4f6f-978e-fd486eba7174/
630 html = "<input type='hidden' />\n" + html;
631
632 div.innerHTML = html;
633 if (Prototype.Browser.IE || Prototype.Browser.WebKit || Prototype.Browser.Opera) {
634 var texts = new Array();
635 var scripts = div.getElementsByTagName("script");
636 for (var i=0; i<scripts.length; ++i) {
637 var script = scripts[i];
638 texts.push(script.text);
639 }
640 var script = document.createElement("script");
641 script.text = texts.join("\r");
642 div.appendChild(script);
643 }
644 return div;
645 }
646
647 function getElementsByCssSelector(root, expr) {
648 return (new Selector(expr)).findElements(root);
649 }
650
651 function getParentElementByCssSelector(elem, expr) {
652 var s = new Selector(expr);
653 while (elem = elem.parentNode) {
654 if (s.match(elem)) {
655 return elem;
656 }
657 }
658 return null;
659 }
660
661
662 // http://phpjs.org/functions/compact:371
663 function compact ( ) {
664 // http://kevin.vanzonneveld.net
665 // + original by: Waldo Malqui Silva
666 // + tweaked by: Jack
667 // + input by: Brett Zamir (http://brett-zamir.me)
668 // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
669 // * example 1: var1 = 'Kevin'; var2 = 'van'; var3 = 'Zonneveld';
670 // * example 1: compact('var1', 'var2', 'var3');
671 // * returns 1: {'var1': 'Kevin', 'var2': 'van', 'var3': 'Zonneveld'}
672
673 var matrix = {}, that = this;
674
675 var process = function ( value ) {
676 var i = 0, l = value.length, key_value = '';
677 for (i = 0; i < l; i++) {
678 key_value = value [ i ];
679 if (key_value instanceof Array) {
680 process( key_value );
681 } else {
682 if (typeof that.window[key_value] !== 'undefined') {
683 matrix[key_value] = that.window[key_value];
684 }
685 }
686 }
687 return true;
688 };
689
690 process(arguments);
691 return matrix;
692 }
693
694
695
696

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26