/**
 * Срезеает углы у указанной картинки
 * @param {Element} img Картинка, у которой нужно срезать угол
 * @param {Number} mask Битовая маска, которая указывает, какие углы нужно 
 * срезать.<br>
 * 1 — левый верхний<br>
 * 2 — правый верхний<br>
 * 4 — правый нижний<br>
 * 8 — левый нижний
 * @param {Object} [draw_params] Параметры рисования (если не указаны, будет использована константа <code>ictinus.cutCorners.DRAW_PARAMS</code>)
 * @example
 * // срежем левый верхний и правый нижний уголы
 * var mask = 1 | 4;
 * var img = document.getElementsByTagName('img')[0];
 * ictinus.cutCorners(img, mask) 
 * @author Sergey Chikuyonok (sc@design.ru)
 * @author Alexander Samilyak (aleksam@design.ru)
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 * @requires ictinus
 * @include "/ictinus/src/ictinus.js"
 */
ictinus.cutCorners = function(){
	/** Кэш форм рисования */
	var shape_cache = {};
	
	/** Параметры рисования по умолчанию */
	var DRAW_PARAMS = {
		strokeWidth : 1, // толщина обводки скругления, пиксели
		//strokeColor : '#303d49', // цвет обводки скругления
		strokeColor : '#26303a', // цвет обводки скругления
		radius : 3, // радиус скругления углов, пиксели
		cutoffOffset : 4, // высота среза
		cutoffLength : 28, // длина среза
		mask : 1 // битовая маска, которая указывает, какие углы нужно срезать (остальные скругляются указанным радиусом)
	};
	
	/** Атрибуты, характеризующие форму скругленного блока */
	var SHAPE = {
		/** Нужно срезать левый верхний угол */
		CUTOFF_LT: 1,
		
		/** Нужно срезать правый верхний угол */
		CUTOFF_RT: 2,
		
		/** Нужно срезать правый нижний угол */
		CUTOFF_RB: 4,
		
		/** Нужно срезать левый нижний угол */
		CUTOFF_LB: 8
	};
	
	/**
	 * Проверяет, содержится ли в указанном значении определенный бит
	 * @param {Number} value Значение
	 * @param {Number} bit Бит, наличие которого нужно проверить
	 * @return {Boolean}
	 */
	function hasBit(value, bit) {
		return (value & bit) == bit;
	}
	
	/**
	 * Создает форму рисования для ictinus
	 * @param {Number} mask Биты, описывающие форму
	 * @return {Array}
	 */
	function createShape(draw_params){
		
		/*
		 * делаем форму размером 100х100 пикселей
		 * потом ей присвоится сетка масштабирования, чтобы подгонять ее под
		 * любую форму
		 */
		var path_data = '', width = 100, height = 100, corner;
		
		var
			mask = draw_params.mask,
			radius = draw_params.radius,
			cutoff_offset = draw_params.cutoffOffset,
			cutoff_length = draw_params.cutoffLength
		
		/*
		 * r — радиус
		 * c — высота среза
		 * l — длина среза
		 * r2 — полрадиуса
		 */
		
		// строю левый верхний угол
		corner = 'c 0, -%r2, %r2, -%r, %r, -%r ';
		if (hasBit(mask, SHAPE.CUTOFF_LT)) {
			path_data += 'm 0, ' + (radius + cutoff_offset) +
					corner +
					'l %l, -%c ';
		} else {
			path_data += 'm 0, %r ' + corner;
		}
		
		// строю правый верхний угол
		if (hasBit(mask, SHAPE.CUTOFF_RT)) {
			path_data += 'L ' + (width - radius - cutoff_length) + ', 0 ' +
					'l %l, %c ';
		} else {
			path_data += 'L ' + (width - radius) + ', 0 ';
		}
		path_data += 'c %r2, 0, %r, %r2, %r, %r ';
		
		// строю правый нижний угол
		corner = 'c 0, %r2, -%r2, %r, -%r, %r ';
		if (hasBit(mask, SHAPE.CUTOFF_RB)) {
			path_data += 'L '+ width +', ' + (height - cutoff_offset - radius)
					+ corner +
					'l -%l %c ';
		} else {
			path_data += 'L '+ width +', ' + (height - radius)
					+ corner;
		}
		
		// строю левый нижний угол
		if (hasBit(mask, SHAPE.CUTOFF_LB)) {
			path_data += ' L ' + (cutoff_length + radius) + ', ' + height +
					' l -%l -%c ';
		} else {
			 path_data += 'L ' + radius + ', ' + height;
		}
		path_data += 'c -%r2, 0, -%r, -%r2, -%r, -%r ';
		
		// замыкаю контур
		if (hasBit(mask, SHAPE.CUTOFF_LT)) {
			path_data += 'L 0, ' + (radius + cutoff_offset);
		} else {
			path_data += 'L 0, %r ';
		}
		
		var props = {
			r: radius,
			r2: radius / 2,
			c: cutoff_offset,
			l: cutoff_length
		};
		
		var real_path = path_data.replace(/(%(\w{1,2}))/g, function(str, p1, p2){
			return props[p2];
		});
		
		var shape =  new ictinus.Shape(real_path);
	
		shape.scaleGrid = {
			x1: radius + cutoff_length,
			y1: radius + cutoff_offset,
			x2: width - radius - cutoff_length,
			y2: height - radius - cutoff_offset
		};
		
		shape_cache[String(mask)] = shape;
		
		return shape;
	}
	
	function getDrawParams(custom_params){
		var result_params = {};
		/*
			создаём объект параметров рисования,
			состоящий из суммы параметров пришедших снаружи (custom_params)
			и параметров по умолчанию (DRAW_PARAMS)
		*/
		for(var param in DRAW_PARAMS){
			if(
				DRAW_PARAMS.hasOwnProperty(param)
			){
				var mValue = (custom_params && custom_params[param]) || DRAW_PARAMS[param];
				result_params[param] = (param === "strokeColor" ? mValue : new Number(mValue));
			}
		}
		return result_params;
	}
	
	
	/**
	 * Сделать скругленные уголки у картинки
	 * @param {Element} img Картинка, для которой нужно сделать скругленные уголки
	 * @param {Object} [draw_params] Параметры рисования (если не указаны, будет использована константа <code>DRAW_PARAMS</code>)
	 */
	function draw(img, draw_params){
		draw_params = getDrawParams(draw_params);
		
		var shape = createShape(draw_params);
		shape.updateSizeBy(img);
		
		for(var p in draw_params){
			if(shape.hasOwnProperty(p)){
				shape[p] = draw_params[p];
			}
		}
		
		shape.decorate(img);
	}
	
	return draw;
}();