if(typeof window.$ != 'function'){
    $ = function(id){
            if (document.getElementById) {
                return document.getElementById(id);
            } else if (document.all) {
                return document.all[id];
            }
    }    
}

function cancelEvent( event ){
	event.cancelBubble=true;
	event.returnValue = false;
	if (event.preventDefault) 
		event.preventDefault();
}

function log(s) {
	$('out').innerHTML = s + '<br>' + $('out').innerHTML;
	$('out').innerHTML = $('out').innerHTML.split('<br>').splice(0, 100).join('<br>');
}

function print(s){
	$('out').innerHTML=s;
}

function printb(s){
	$('out').innerHTML=s+'<br>'+$('out').innerHTML;
}

function print_r(o) {
	var s = '';
	for(i in o){
	s += i + '=' + o[i] + '<br>';
	}
	return s;
}

function out(o){
	print(print_r(o));
}


function defPosition(event) { // Определяем координаты события
	if (document.attachEvent != null) {
		this.x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
		this.y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
	}
	if (!document.attachEvent && document.addEventListener) {
		this.x = event.clientX + window.scrollX;
		this.y = event.clientY + window.scrollY;
	}
	return {x:this.x,y:this.y};
}

function rm_Event () {
	this.eventListners = new Array();
}

rm_Event.prototype = {
	addListener : function( event, handler ) {
		if( !(handler instanceof Object) )
			return false;
		if( typeof( this.eventListners[event] ) == 'undefined' ) 
			this.eventListners[event] = new Array();
		this.eventListners[event].push( handler );
	},
	revomeListener : function( event, handler ) {
		if( typeof( this.eventListners[event] ) != 'undefined' && this.eventListners[event].indexOf(handler) != -1 )
			this.eventListners[event].splice( this.eventListners[event].indexOf(handler), this.eventListners[event].indexOf(handler), null );
	},
	send : function( event, param ) {
		if( !this.eventListners[event] )
			return true;
		var result = true;
		for( var i = 0; i < this.eventListners[event].length; i++ ) {
			if( this.eventListners[event][i] instanceof Function ) {
				r = this.eventListners[event][i]( param, event, this );
				if( typeof( r ) != 'undefined' && !r ) {
					result = false;
				}
			}
		}
		return result;
	}
};


function rm_DragNDrop ( obj/*, bound=null, direction_type=rm_DragNDrop.BOTH_DIR*/ ) {
	if( !obj ) {
		return;
	} else if( typeof(obj) == 'string' ) {
		this.subject = $( obj );
	} else {
		this.subject = obj;
	}
	if( !this.subject )
		return null;
	var bound = arguments[1] || null;
	if( !bound )
		this.boundary = false;
	else if( typeof(bound) == 'string' ) {
		this.boundary = $( bound );
	} else {
		this.boundary = bound;
	}
	this.direction_type = arguments[2] || rm_DragNDrop.BOTH_DIR;
	this.events = new rm_Event();
	var _this = this;
	//addHandler( document.body, 'mouseup', function(event){ _this.stopDrag(event); } );
	this.tmr = null;
	this.initSubject();
}

rm_DragNDrop.BOTH_DIR = 'both_direction';
rm_DragNDrop.VERT_DIR = 'vertical_direction';
rm_DragNDrop.HOR_DIR = 'horizontal_direction';

rm_DragNDrop.ON_MOVE = 'onMove';
rm_DragNDrop.ON_START_DRAG = 'onStartDrag';
rm_DragNDrop.ON_STOP_DRAG = 'onStopDrag';

rm_DragNDrop.mouseTrace = 0;
rm_DragNDrop.mouseX = false;
rm_DragNDrop.mouseY = false;

rm_DragNDrop.prototype = {
	cbOnDraging : {},
	cbOnMouseUp : {},
	addEventListener : function( event, handler ) {
		this.events.addListener( event, handler );
	},
	removeEventListener : function( event, handler ) {
		this.events.removeListener( event, handler );
	},
	initSubject : function() {
		var _this = this;
		this.cbOnDraging = function( ev ){ _this.onDraging( ev ) };
		this.cbOnMouseUp = function(event){ _this.stopDrag(event); }
		addHandler( this.subject, 'mousedown', function(event){ _this.startDrag(event); } );
	},
	stopDrag : function( ev ) {
		removeHandler( document.body, 'mousemove', this.cbOnDraging );
		removeHandler( document.body, 'mouseup', this.cbOnMouseUp );
		if( document.all && !window.opera ) {
			var doc = (document.compatMode && document.compatMode.toLowerCase() != "backcompat")? document.documentElement : (document.body || null);
			doc.onselectstart = null;
		}
		this.events.send( rm_DragNDrop.ON_STOP_DRAG, this.stateDigest );
	},
	onDraging : function( ev ) {
		var event = ev || window.event;
		event.cancelBubble=true;
		if (event.preventDefault) 
			event.preventDefault();
		var nx = parseInt(this.stateDigest.subject_left);
		var ny = parseInt(this.stateDigest.subject_top);
		var mx = defPosition( ev ).x;
		var my = defPosition( ev ).y;
		if( this.direction_type == rm_DragNDrop.BOTH_DIR || this.direction_type == rm_DragNDrop.HOR_DIR ) {
			nx = mx - this.stateDigest.delta_left;
			if( this.boundary )
				nx = nx < 0 ? 0 : nx + this.subject.offsetWidth > this.boundary.offsetWidth ? this.boundary.offsetWidth - this.subject.offsetWidth : nx;
		}
		if( this.direction_type == rm_DragNDrop.BOTH_DIR || this.direction_type == rm_DragNDrop.VERT_DIR ) {
			ny = my - this.stateDigest.delta_top;
			if( this.boundary )
				ny = ny < 0 ? 0 : ny + this.subject.offsetHeight > this.boundary.offsetHeight ? this.boundary.offsetHeight - this.subject.offsetHeight : ny;
		}
		if( this.stateDigest.subject_left == nx && this.stateDigest.subject_top == ny )
			return;
		this.stateDigest.subject_left = nx;
		this.stateDigest.subject_top = ny;
		this.stateDigest.mouse_x = mx - this.stateDigest.bound_left;
		this.stateDigest.mouse_y = my - this.stateDigest.bound_top;
		if( this.events.send( rm_DragNDrop.ON_MOVE, this.stateDigest ) ) {
			this.subject.style.top = ny + 'px';
			this.subject.style.left = nx + 'px';
		}
	},
	startDrag : function( ev ) {
		var event = ev || window.event;
		event.cancelBubble=true;
		if (event.preventDefault) 
			event.preventDefault();
		if( document.all && !window.opera ) {
			var doc = (document.compatMode && document.compatMode.toLowerCase() != "backcompat")? document.documentElement : (document.body || null);
			doc.onselectstart = function(){
				event.returnValue = false;
			};
		}
		var inx = parseInt(document.all || event.offsetX ? event.offsetX : event.layerX);
		var iny = parseInt(document.all || event.offsetY ? event.offsetY : event.layerY);
		var sx = this.subject.offsetLeft;
		var sy = this.subject.offsetTop;
		var lx = inx + sx;
		var ly = iny + sy;
		var pos = defPosition( ev );
		var bleft = pos.x - lx;
		var btop = pos.y - ly;
		var dox = bleft + inx;
		var doy = btop + iny;
		this.stateDigest = { target : this,
			start_left : sx,
			start_top : sy,
			inside_left : inx, 
			inside_top : iny,
			inbound_left : lx,
			inbound_top : ly,
			delta_left : dox,
			delta_top : doy,
			bound_left : bleft,
			bound_top : btop,
			mouse_x : pos.x - bleft,
			mouse_y : pos.y - btop,
			subject_width : this.subject.offsetWidth,
			subject_height : this.subject.offsetHeight,
			subject_left : this.subject.offsetLeft,
			subject_top : this.subject.offsetTop
		};
		this.events.send( rm_DragNDrop.ON_START_DRAG, this.stateDigest );
		var _this = this;
		addHandler( document.body, 'mousemove', this.cbOnDraging );
		addHandler( document.body, 'mouseup', this.cbOnMouseUp );
	}
};

function rm_Crop(obj)/*, crop_img=false, prefix = 'rm'*/
{
	this.crop_img = arguments[1] || false ;
	this.prefix = (arguments[2] || 'rm' ) + '_';
	if( !obj ) {
		this.subject = false;
	}else if( typeof(obj) == 'string' ) {
		this.subject = $( obj );
	} else {
		this.subject = obj;
	}
	if( !this.subject )
		return null;
	if( !this.crop_img ) {
		this.crop_img = this.subject.getElementsByTagName('img')[0];
	}else if( typeof(this.crop_img) == 'string' ) {
		this.crop_img = $( this.crop_img );
	}
	if( !this.crop_img )
		return null;
	this.visible = false;
	this.frame = {
		x1 : 0,
		x2 : 0,
		y1 : 0,
		y2 : 0,
		max_x : this.subject.offsetWidth,
		max_y : this.subject.offsetHeight,
		inited : false
	};
	this.events = new rm_Event();
	this.initLayout();
	this.initDragNDrop();
	this.initMechanics();
	this.updateLayout();
}

rm_Crop.ON_STATE_CHANGE = 'onStateChange';
rm_Crop.ON_START_CHANGE = 'onStartChange';
rm_Crop.ON_STOP_CHANGE = 'onStopChange';

rm_Crop.prototype = {
	addEventListener : function( event, handler ) {
		this.events.addListener( event, handler );
	},
	removeEventListener : function( event, handler ) {
		this.events.removeListener( event, handler );
	},
	layout : {},
	shade : {},
	dnd : {},
	main_image : {},
	crop_holder : {},
	frame: {},
	initLayout : function () {
		/* TODO: create Elements */
		this.layout.fld = $(this.prefix + 'fld');
		(this.layout.ctl = $(this.prefix + 'ctl')).ondragstart = function() { return false; };
		(this.layout.ctr = $(this.prefix + 'ctr')).ondragstart = function() { return false; };
		(this.layout.cbr = $(this.prefix + 'cbr')).ondragstart = function() { return false; };
		(this.layout.cbl = $(this.prefix + 'cbl')).ondragstart = function() { return false; };
		(this.layout.tb = $(this.prefix + 'tb')).ondragstart = function() { return false; };
		(this.layout.bb = $(this.prefix + 'bb')).ondragstart = function() { return false; };
		(this.layout.lb = $(this.prefix + 'lb')).ondragstart = function() { return false; };
		(this.layout.rb = $(this.prefix + 'rb')).ondragstart = function() { return false; };

		(this.crop_holder = $(this.prefix + 'crop')).ondragstart = function() { return false; };
		(this.shade = $(this.prefix + 'shade')).ondragstart = function() { return false; };

		this.reinitImage();
	},

	reinitImage: function( new_image ) {
		
		if( new_image ) {
			this.crop_img = new_image;
			this.crop_img.galleryimg = 'no';
			this.crop_img.ondragstart = function() { return false; };
		}
		
		$(this.prefix + 'crop').style.height = this.crop_img.offsetHeight + 'px';
		$(this.prefix + 'shade').style.height = this.crop_img.offsetHeight + 'px';
		this.frame.max_x = this.crop_img.offsetWidth ;
		this.frame.max_y = this.crop_img.offsetHeight ;
		
		var h = Math.abs( this.frame.y2 - this.frame.y1 );
		var b = 'y2';
		var t = 'y1';
		if( this.frame.y2 < this.frame.y1 ){
			b = 'y1';
			t = 'y2';
		}
		if( this.frame[b] > this.frame.max_y ) {
			var bp = this.frame[b] = this.frame.max_y;
			this.frame[t] = bp - h;
			if( this.frame[t] < 0 )
				this.frame[t] = 0;
		}
		
		var w = Math.abs( this.frame.x2 - this.frame.x1 );
		var r = 'x2';
		var l = 'x1';
		if( this.frame.x2 < this.frame.x1 ){
			r = 'x1';
			l = 'x2';
		}
		if( this.frame[r] > this.frame.max_x ) {
			var rp = this.frame[r] = this.frame.max_x;
			this.frame[l] = rp - h;
			if( this.frame[l] < 0 )
				this.frame[l] = 0;
		}
		
			

		if( this.main_image && this.main_image.parentNode )
			this.main_image.parentNode.removeChild( this.main_image );

		var ttt = this.layout.fld.childNodes[0] != undefined ? this.layout.fld.childNodes[0] : null;
		this.main_image = this.layout.fld.insertBefore( this.crop_img.cloneNode(1), ttt );
		//this.main_image = this.layout.fld.insertBefore( this.crop_img.cloneNode(1), this.layout.fld.childNodes[0] );
		this.main_image.id = '';
		this.main_image.style.position = 'absolute';
		this.main_image.galleryimg = 'no';
		this.main_image.ondragstart = function() { return false; };
		
		this.updateLayout();
	},
	initDragNDrop : function () {
		this.dnd.fld = new rm_DragNDrop(this.layout.fld, this.subject);
		this.dnd.ctl = new rm_DragNDrop(this.layout.ctl, this.subject);
		this.dnd.ctr = new rm_DragNDrop(this.layout.ctr, this.subject);
		this.dnd.cbr = new rm_DragNDrop(this.layout.cbr, this.subject);
		this.dnd.cbl = new rm_DragNDrop(this.layout.cbl, this.subject);
		this.dnd.tb = new rm_DragNDrop(this.layout.tb, this.subject, rm_DragNDrop.VERT_DIR);
		this.dnd.bb = new rm_DragNDrop(this.layout.bb, this.subject, rm_DragNDrop.VERT_DIR);
		this.dnd.lb = new rm_DragNDrop(this.layout.lb, this.subject, rm_DragNDrop.HOR_DIR);
		this.dnd.rb = new rm_DragNDrop(this.layout.rb, this.subject, rm_DragNDrop.HOR_DIR);
	},
	initMechanics : function () {
		var _this = this;
		var cbUpdateLayout = function() { 
			//_this.updateLayout(); 
			return false; /* false говорит чтобы объект драга и дропа не перемещал сам subject, за него это сделает updateLayout */
		};
		var cbStiker = function (param) {
			_this.frame.x1 = param.subject_left;
			_this.frame.x2 = param.subject_left + _this.frame.width;
			_this.frame.y1 = param.subject_top;
			_this.frame.y2 = param.subject_top + _this.frame.height;
		};
		var cbHorStiker = function(param) {
			_this.frame[param.target.subject.crop.x] = param.mouse_x;
		};
		var cbVertStiker = function(param) {
			_this.frame[param.target.subject.crop.y] = param.mouse_y;
		};
		var cbCheckPosition = function(param) {
			if( typeof( param.target.subject.crop ) == 'undefined' )
				param.target.subject.crop = { x:'x1', y:'y1' };
			if( _this.frame.x1 < _this.frame.x2 ) {
				var left = 'x1';
				var right = 'x2';
			} else {
				var left = 'x2';
				var right = 'x1';
			}
			if( param.subject_left < _this.layout.ctr.offsetLeft ) {
				param.target.subject.crop.x = left;
			} else {
				param.target.subject.crop.x = right;
			}

			if( _this.frame.y1 < _this.frame.y2 ) {
				var top = 'y1';
				var bottom = 'y2';
			} else {
				var top = 'y2';
				var bottom = 'y1';
			}
			if( param.subject_top < _this.layout.cbr.offsetTop ) {
				param.target.subject.crop.y = top;
			} else {
				param.target.subject.crop.y = bottom;
			}
		};
		var cbSetGlobalCursor = function(param) {
			document.body.className += ' cur_' + param.target.subject.id.replace(_this.prefix, '');
		};
		var cbClearGlobalCursor = function(param) {
			document.body.className = document.body.className.replace(/cur_[a-z]+/i, '');
		};

		var itr;
		for( i in this.dnd ){
			if(!this.dnd[i].addEventListener)	// fuckin ajax_json.js :(
				continue;
			this.dnd[i].addEventListener( rm_DragNDrop.ON_START_DRAG, cbCheckPosition);
			this.dnd[i].addEventListener( rm_DragNDrop.ON_START_DRAG, function() {
					_this.events.send( rm_Crop.ON_START_CHANGE, _this.getDigest() );
				});
			this.dnd[i].addEventListener( rm_DragNDrop.ON_START_DRAG, cbSetGlobalCursor);
			this.dnd[i].addEventListener( rm_DragNDrop.ON_STOP_DRAG, cbClearGlobalCursor);
			this.dnd[i].addEventListener( rm_DragNDrop.ON_STOP_DRAG, function() {
					_this.events.send( rm_Crop.ON_STOP_CHANGE, _this.getDigest() );
				});
			this.dnd[i].addEventListener( rm_DragNDrop.ON_START_DRAG, function() {
				itr = window.setInterval(function(){_this.updateLayout()}, 1);
			});
			this.dnd[i].addEventListener( rm_DragNDrop.ON_STOP_DRAG, function() {
				window.clearInterval(itr);
			});
		}
		this.dnd.fld.addEventListener( rm_DragNDrop.ON_START_DRAG, function(param) {
						_this.frame.width = Math.abs( _this.frame.x2 - _this.frame.x1 );
						_this.frame.height = Math.abs( _this.frame.y2 - _this.frame.y1 );
					});
		this.dnd.fld.addEventListener( rm_DragNDrop.ON_MOVE, cbStiker);
		this.dnd.fld.addEventListener( rm_DragNDrop.ON_MOVE, cbUpdateLayout);

		this.dnd.ctl.addEventListener( rm_DragNDrop.ON_MOVE, cbVertStiker);
		this.dnd.ctl.addEventListener( rm_DragNDrop.ON_MOVE, cbHorStiker);
		this.dnd.ctl.addEventListener( rm_DragNDrop.ON_MOVE, cbUpdateLayout);

		this.dnd.ctr.addEventListener( rm_DragNDrop.ON_MOVE, cbVertStiker);
		this.dnd.ctr.addEventListener( rm_DragNDrop.ON_MOVE, cbHorStiker);
		this.dnd.ctr.addEventListener( rm_DragNDrop.ON_MOVE, cbUpdateLayout);

		this.dnd.cbr.addEventListener( rm_DragNDrop.ON_MOVE, cbVertStiker);
		this.dnd.cbr.addEventListener( rm_DragNDrop.ON_MOVE, cbHorStiker);
		this.dnd.cbr.addEventListener( rm_DragNDrop.ON_MOVE, cbUpdateLayout);
		
		this.dnd.cbl.addEventListener( rm_DragNDrop.ON_MOVE, cbVertStiker);
		this.dnd.cbl.addEventListener( rm_DragNDrop.ON_MOVE, cbHorStiker);
		this.dnd.cbl.addEventListener( rm_DragNDrop.ON_MOVE, cbUpdateLayout);

		this.dnd.tb.addEventListener( rm_DragNDrop.ON_MOVE, cbVertStiker);
		this.dnd.tb.addEventListener( rm_DragNDrop.ON_MOVE, cbUpdateLayout);

		this.dnd.rb.addEventListener( rm_DragNDrop.ON_MOVE, cbHorStiker);
		this.dnd.rb.addEventListener( rm_DragNDrop.ON_MOVE, cbUpdateLayout);

		this.dnd.bb.addEventListener( rm_DragNDrop.ON_MOVE, cbVertStiker);
		this.dnd.bb.addEventListener( rm_DragNDrop.ON_MOVE, cbUpdateLayout);

		this.dnd.lb.addEventListener( rm_DragNDrop.ON_MOVE, cbHorStiker);
		this.dnd.lb.addEventListener( rm_DragNDrop.ON_MOVE, cbUpdateLayout);
	},
	getDigest : function() {
		return {
			l : Math.min( this.frame.x1, this.frame.x2 ), 
			t : Math.min( this.frame.y1, this.frame.y2 ), 
			w : Math.abs( this.frame.x2 - this.frame.x1 ), 
			h : Math.abs( this.frame.y2 - this.frame.y1 ),
			crop : this
		};
	},
	correctFrame : function () {
		this.frame.x1 = this.frame.x1 < 0 ? 0 : this.frame.x1 > this.frame.max_x ? this.frame.max_x : this.frame.x1;
		this.frame.x2 = this.frame.x2 < 0 ? 0 : this.frame.x2 > this.frame.max_x ? this.frame.max_x : this.frame.x2;
		this.frame.y1 = this.frame.y1 < 0 ? 0 : this.frame.y1 > this.frame.max_y ? this.frame.max_y : this.frame.y1;
		this.frame.y2 = this.frame.y2 < 0 ? 0 : this.frame.y2 > this.frame.max_y ? this.frame.max_y : this.frame.y2;
	},
	updateLayout : function (/* mi_cor=0 */) {		// mi_cor - main image correction
		var mi_cor = arguments[0] || {x:0, y:0};
		var la = this.layout;
		this.correctFrame();
		var x1 = Math.min( this.frame.x1, this.frame.x2 );
		var x2 = Math.max( this.frame.x1, this.frame.x2 );
		var y1 = Math.min( this.frame.y1, this.frame.y2 );
		var y2 = Math.max( this.frame.y1, this.frame.y2 );
		// Field
		var fld_width = x2 - x1;
		var fld_height = y2 - y1;
		fld_height = document.all && !window.opera && fld_height == 0 ? 1 : fld_height;
		la.fld.style.left = x1 + 'px';
		this.main_image.style.left = x1*-1 - mi_cor.x + 'px';
		la.fld.style.width = fld_width + 'px';
		la.fld.style.top = y1 + 'px';
		this.main_image.style.top = y1*-1 - mi_cor.y + 'px';
		la.fld.style.height = fld_height + 'px';
		// Corners
		la.ctl.style.left = x1 - 3 + 'px';
		la.ctl.style.top = y1 - 3 + 'px';
		la.ctr.style.left = x2 - 2 + 'px';
		la.ctr.style.top = y1 - 3 + 'px';
		la.cbl.style.left = x1 - 3 + 'px';
		la.cbl.style.top = y2 - 2 + 'px';
		la.cbr.style.left = x2 - 2 + 'px';
		la.cbr.style.top = y2 - 2 + 'px';
		// Sliders
		var width = x2 - x1 - 6;
		width = width < 0 ? 0 : width;
		var height = y2 - y1 - 6;
		height = height < 0 ? 0 : height;
		la.tb.style.top = y1 - 3 + 'px';
		la.tb.style.left = x1 + width/2 + 'px';
		la.lb.style.top = y1 + height/2 + 'px';
		la.lb.style.left = x1 - 3 + 'px';
		la.rb.style.top = y1 + height/2 + 'px';
		la.rb.style.left = x2 - 2 + 'px';
		la.bb.style.top = y2 - 2 + 'px';
		la.bb.style.left = x1 + width/2 + 'px';
		this.events.send( rm_Crop.ON_STATE_CHANGE, this.getDigest() );
	},
	display : function (/*display=false*/) {
		var display = arguments[0] || false;
		if( !display )
		{
			var display = 'block';
			if( this.crop_holder.style.display == 'block' ) var display = 'none';
		}
		this.crop_holder.style.display = display;
		this.visible = display == 'block' ? true : false;
		return this.visible;
	},
	displayLayout : function (disp) {
		for(var i in this.layout) {
			if(!this.dnd[i].addEventListener)	// fuckin ajax_json.js :(
				continue;
			this.layout[i].style.display = disp;
		}
	},
	initFromPoint : function() {
		var _this = this;
		if( !this.cb ) {
			this.cb = {
				cbSubjectOnMouseDown : function(ev) {
					var event = ev || window.event;
					event.cancelBubble=true;
					if (event.preventDefault) 
						event.preventDefault();
					if( document.all && !window.opera ) {
						var doc = (document.compatMode && document.compatMode.toLowerCase() != "backcompat")? document.documentElement : (document.body || null);
						doc.onselectstart = function(){
							event.returnValue = false;
						};
						_this.crop_img.onselectstart = function(){
							event.returnValue = false;
						};
					}
					_this.events.send( rm_Crop.ON_START_CHANGE, _this.getDigest() );
					var inx = parseInt(document.all || event.offsetX ? event.offsetX : event.layerX);
					var iny = parseInt(document.all || event.offsetY ? event.offsetY : event.layerY);
					_this.frame.x1 = inx;
					_this.frame.y1 = iny;
					_this.frame.x2 = inx;
					_this.frame.y2 = iny;
					pos = defPosition(ev);
					_this.frame.start_dx = pos.x - inx;
					_this.frame.start_dy = pos.y - iny;
					_this.layout.fld.style.border='1px dashed #cccccc';
					_this.updateLayout({x:1, y:1});
					_this.displayLayout('block');
					addHandler( document.body, 'mousemove', _this.cb.cbSubjectOnMouseMove );
					addHandler( document.body, 'mouseup', _this.cb.cbSubjectOnMouseUp );
				},
				cbSubjectOnMouseUp : function(ev) {
					if( _this.frame.x1 != _this.frame.x2 || _this.frame.y1 != _this.frame.y2 ) {
						removeHandler( document.body, 'mouseup', _this.cb.cbSubjectOnMouseUp );
						removeHandler( document.body, 'mousemove', _this.cb.cbSubjectOnMouseMove );
						if(_this.crop_holder.className)
							_this.crop_holder.className = _this.crop_holder.className.replace(/cur_crosshair/ig, '');
						_this.layout.fld.style.border = '';
						_this.shade.style.display = 'block';
						_this.frame.inited = true;
						_this.events.send( rm_Crop.ON_STOP_CHANGE, _this.getDigest() );
						_this.updateLayout();
					}
					_this.crop_holder.style.background = '';
					removeHandler( _this.crop_holder, 'mousedown', _this.cb.cbSubjectOnMouseDown );
				},
				cbSubjectOnMouseMove : function(ev) {
					var event = ev || window.event;
					event.cancelBubble=true;
					if (event.preventDefault) 
						event.preventDefault();
					if( document.all && !window.opera ) {
						if(document.selection && document.selection.empty) document.selection.empty();
					}
					pos = defPosition(ev);
					_this.frame.x2 = pos.x - _this.frame.start_dx;
					_this.frame.y2 = pos.y - _this.frame.start_dy;
					_this.updateLayout({x:1, y:1});
				}
			};
		}
		addHandler( this.crop_holder, 'mousedown', this.cb.cbSubjectOnMouseDown );
		if( document.all && !window.opera ) this.crop_holder.style.background = 'url(\'http://img.mail.ru/0.gif\')';
		this.crop_holder.className += ' cur_crosshair';
		this.frame.inited = false;
		this.shade.style.display = 'none';
		this.displayLayout('none');
	},
	initFromParams : function (param) {
		this.frame.x1 = param.l;
		this.frame.x2 = parseInt(param.l) + parseInt(param.w);
		this.frame.y1 = param.t;
		this.frame.y2 = parseInt(param.t) + parseInt(param.h);
			this.frame.inited = true;
		this.shade.style.display = 'block';
		this.updateLayout();
		this.events.send( rm_Crop.ON_STOP_CHANGE, this.getDigest() );
	}
};

