/**
* @fileOverview
* Wysiwyg 영역의 DOM 조작을 하기전에 선택된 영역의 시작과 끝에 marker를 삽입하여
* DOM 조작을 보다 용이하게 하는 객체로 Processor#execWithMarker 에서 사용된다.
*/
Trex.I.Marker = {};
Trex.I.Marker.Standard = /** @lends Trex.Canvas.Marker.prototype */{
/**
* 선택된 영역의 시작과 끝에 marker를 삽입한다.
* @example
* marker.paste();
*/
paste: function() {
var _rng = this.processor.getRange();
var _endContainer = _rng.endContainer;
var _startContainer = _rng.startContainer;
if (_endContainer.nodeType == 9) { //NOTE: #FTDUEDTR-919
_endContainer = this.processor.doc.body;
_startContainer = this.processor.doc.body;
}
var _endMarker = this.endMarker = this.processor.create('span', { id: "tx_end_marker" });
var _endOffset = _rng.endOffset;
if (_endContainer.nodeType == 3) {
_endContainer.splitText(_endOffset);
_endContainer.parentNode.insertBefore(_endMarker, _endContainer.nextSibling);
} else {
_endContainer.insertBefore(_endMarker, _endContainer.childNodes[_endOffset]);
}
var _startMarker = this.startMarker = this.processor.create('span', { id: "tx_start_marker" });
var _startOffset = _rng.startOffset;
if(_startContainer.nodeType == 3) {
_startContainer.splitText(_startOffset);
_startContainer.parentNode.insertBefore(_startMarker, _startContainer.nextSibling);
} else {
_startContainer.insertBefore(_startMarker, _startContainer.childNodes[_startOffset]);
}
},
/**
* 삽입된 마커를 제거한다.
* @example
* marker.remove();
*/
remove: function() {
$tom.remove(this.startMarker);
$tom.remove(this.endMarker);
}
};
Trex.I.Marker.Trident = /** @lends Trex.Canvas.Marker.prototype */{
/**
* 선택된 영역의 시작과 끝에 marker를 삽입한다.
* @example
* marker.paste();
*/
paste: function() {
this.clear();
var _rng = this.processor.getRange();
var _cnxt = this.processor.doc.body;
var _rng1 = _rng.duplicate();
_rng1.collapse(_TRUE);
_rng1.pasteHTML('');
this.startMarker = $tom.collect(_cnxt, '#tx_start_marker');
var _rng2 = _rng.duplicate();
_rng2.collapse(_FALSE);
_rng2.pasteHTML('');
this.endMarker = $tom.collect(_cnxt, '#tx_end_marker');
},
/**
* @private
* 기존에 삽입된 마커를 모두 제거한다.
* @example
* marker.remove();
*/
clear: function() {
var _cnxt = this.processor.doc.body;
$tom.remove($tom.collect(_cnxt, '#tx_start_marker'));
$tom.remove($tom.collect(_cnxt, '#tx_end_marker'));
},
/**
* 삽입된 마커를 제거한다.
* @example
* marker.remove();
*/
remove: function() {
$tom.remove(this.startMarker);
$tom.remove(this.endMarker);
}
};
/**
* Wysiwyg 영역의 DOM 조작을 하기전에 선택된 영역의 시작과 끝에 marker를 삽입하여
* DOM 조작을 보다 용이하게 하는 객체로
* browser에 따라 필요한 함수들을 mixin한다.
* Processor#execWithMarker 에서만 사용된다.
*
* @example
* var _marker = new Trex.Canvas.Marker(processor);
* processor.bookmarkTo();
* try {
* _marker.paste();
* _marker.backup();
* handler(_marker);
* } catch(e) {
* } finally {
* _marker.remove();
* }
* @class
* @param {Object} processor - Processor 객체
*/
Trex.Canvas.Marker = Trex.Class.create(/** @lends Trex.Canvas.Marker.prototype */{
/** @ignore */
$mixins: [
(($tx.msie_nonstd)? Trex.I.Marker.Trident: Trex.I.Marker.Standard)
],
initialize: function(processor) {
this.processor = processor;
},
/**
* 마커를 삽입한 후 북마크를 수정한다.
* @example
* marker.backup();
*/
backup: function() {
this.processor.bookmarkWithMarker(this);
},
/**
* @private
* 선택된 영역이 collapse인지 여부를 리턴한다.
* @returns {Boolean} - 선택된 영역이 collapse인지 여부
* @example
* marker.checkCollapsed();
*/
checkCollapsed: function() {
return ($tom.next(this.startMarker) == this.endMarker); //collapsed
}
});