// base code by http://code.google.com/p/curved-corner/
// (which isn't updated and doesn't support gradient backgrounds)

if (window.ActiveXObject) {
	(function() {
		var isIE6 = /msie|MSIE 6/.test(navigator.userAgent);
		var vmlSupported;

		// supportsVml() borrowed from http://stackoverflow.com/questions/654112/how-do-you-detect-support-for-vml-or-svg-in-a-browser
		function supportsVml() {
			if (typeof vmlSupported == "undefined") {
				var a = document.body.appendChild(document.createElement('div'));
				a.innerHTML = '<v:shape id="vml_flag1" adj="1" />';
				var b = a.firstChild;
				b.style.behavior = "url(#default#VML)";
				vmlSupported = b ? typeof b.adj == "object" : true;
				a.parentNode.removeChild(a);
			}
			return vmlSupported;
		}


		// findPos() borrowed from http://www.quirksmode.org/js/findpos.html
		function findPos(obj) {
			var curleft = 0;
			var curtop = 0;

			if (obj.offsetParent) {
				do {
					curleft += obj.offsetLeft;
					curtop += obj.offsetTop;
					obj = obj.offsetParent
				} while (obj);
			}

			return({
				x: curleft,
				y: curtop
			});
		}
		
		var ieCss3 = function(elementOrElements) {
			if (!supportsVml()) {
				return;
			}
			if (elementOrElements.item) {
				for (var i = 0; i < elementOrElements.length; i++) { 
					var element = elementOrElements.item(i);
					new IeCss3(element);
				}
			} else {
				new IeCss3(elementOrElements);
			}
		}

		var treatedElements = [];

		var IeCss3 = function(element) {
			var borderRadius, arcSize, fillColor, fillSrc;
			var strokeColor, strokeWeight, stroked;
			var opacity, textShadow;
			var zIndex;
			var pos;
			var gradientType, fillColor2, gradientAngle;

			var vmlParent;
			var vml = [];

			var init = function() {
				//-- already done ? --//
				// the element property is the XML Node
				if (typeof element.ieCss3 !== "undefined") {
					return;
				}
				element.ieCss3 = true;
				
				//--------------------------------------------------------------------//
				//------------------ properties reading from CSS ---------------------//
				//--------------------------------------------------------------------//
				var style = element.currentStyle;
				if (!style['-ie-border-radius'] && !style['-ie-background-gradient'] && !style['-ie-box-shadow'] && !style['-ie-text-shadow']) {
					return;
				}
				borderRadius = parseInt(style['-ie-border-radius']);
				arcSize      = Math.min(borderRadius / Math.min(element.offsetWidth, element.offsetHeight), 1);
				fillColor    = style.backgroundColor;
				fillSrc      = style.backgroundImage.replace(/^url\("(.+)"\)$/, '$1');

				//-- gradient --//
				var gradientStr = style['-ie-background-gradient'];
				if (gradientStr) {
					var gradientParts = gradientStr.split(" ");
					if (gradientParts[0] === "linear") {
						gradientType = "linear";
						fillColor = gradientParts[1];
						fillColor2 = gradientParts[2];
						gradientAngle = gradientParts[3];
					}
				}

				//-- stroke --//
				strokeColor  = style.borderColor;
				strokeWeight = parseInt(style.borderWidth);
				stroked = 'true';
				if (isNaN(strokeWeight) || strokeWeight == 0) {
					strokeWeight = 0;
					strokeColor = fillColor;
					stroked = 'false';
				}
				opacity = parseFloat(style.opacity || 1);
				textShadow = style['-ie-text-shadow'];

				zIndex = parseInt(style.zIndex);
				if (isNaN(this.zIndex)) {
					zIndex = 0;
				}

				//--------------------- vml parent ---------------------//
				// Find which element provides position:relative for the target element (default to BODY)
				vmlParent = element;
				var limit = 100, i = 0;
				do {
					vmlParent = vmlParent.parentElement;
					i++;
					if (i >= limit) {
						return;
					}
				} while (typeof(vml_parent) != 'undefined' && vmlParent.currentStyle.position != 'relative' && vmlParent.tagName != 'BODY');

				vmlParent.pos_ieCSS3 = findPos(vmlParent);
				pos = findPos(element);


				//-- VML namespace (IE8 requires it) --//
				if (!document.namespaces.v) {
					document.namespaces.add("v", "urn:schemas-microsoft-com:vml");
				}
				
				createBoxShadow();
				createBorderRect();
				createTextShadow();
				
				if (vml.length > 0) {
					treatedElements.push(element);

					if (typeof(vmlParent.document.ieCSS3_stylesheet) == 'undefined') {
						//-- stylesheet --//
						vmlParent.document.ieCSS3_stylesheet = vmlParent.document.createStyleSheet();
						vmlParent.document.ieCSS3_stylesheet.addRule("v\\:roundrect", "behavior: url(#default#VML)");
						vmlParent.document.ieCSS3_stylesheet.addRule("v\\:fill", "behavior: url(#default#VML)");
					}
				}
			}

			var createBorderRect = function() {
				if (isNaN(borderRadius)) {
					return(false);
				}

				element.style.background = 'transparent';
				element.style.borderColor = 'transparent';

				var rect = document.createElement('v:roundrect');
				rect.position_offset = {
					'y': (0.5 * strokeWeight) - vmlParent.pos_ieCSS3.y,
					'x': (0.5 * strokeWeight) - vmlParent.pos_ieCSS3.x
				};
				rect.size_offset = {
					'width': 0 - strokeWeight,
					'height': 0 - strokeWeight
				};
				rect.arcsize = arcSize + 'px';
				rect.strokeColor = strokeColor;
				rect.strokeWeight = strokeWeight + 'px';
				rect.stroked = stroked;
				rect.className = 'vml_border_radius';
				rect.style.display = 'block';
				rect.style.position = 'absolute';
				rect.style.top = (pos.y + rect.position_offset.y) + 'px';
				rect.style.left = (pos.x + rect.position_offset.x) + 'px';
				rect.style.width = (element.offsetWidth + rect.size_offset.width) + 'px';
				rect.style.height = (element.offsetHeight + rect.size_offset.height) + 'px';
				rect.style.antialias = true;
				rect.style.zIndex = zIndex - 1;

				if (opacity < 1) {
					rect.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(Opacity=' + parseFloat(opacity * 100) + ')';
				}

				var fill = document.createElement('v:fill');
				fill.color = fillColor;

				if (gradientType === "linear") {
					fill.type = "gradient";
					fill.color2 = fillColor2;
					fill.angle = gradientAngle;
				} else {
					fill.type =  "tile";
				}

				fill.src = fillSrc;
				
				// Hack: IE6 doesn't support transparent borders, use padding to offset original element
				if (isIE6 && (strokeWeight > 0)) {
					element.style.borderStyle = 'none';
					element.style.paddingTop = parseInt(element.currentStyle.paddingTop || 0) + strokeWeight;
					element.style.paddingBottom = parseInt(element.currentStyle.paddingBottom || 0) + strokeWeight;
				}

				rect.appendChild(fill);
				element.parentNode.appendChild(rect);

				// For window resizing
				vml.push(rect);

				return true;
			}

			var createBoxShadow = function() {
				var style = element.currentStyle['-ie-box-shadow'] || '';
				var match = style.match(/^(\d+)px (\d+)px (\d+)px/);
				if (!match) {
					return(false);
				}

				var shadow = document.createElement('v:roundrect');
				shadow.userAttrs = {
					'x': parseInt(RegExp.$1 || 0),
					'y': parseInt(RegExp.$2 || 0),
					'radius': parseInt(RegExp.$3 || 0) / 2
				};
				shadow.position_offset = {
					'y': (0 - vmlParent.pos_ieCSS3.y - shadow.userAttrs.radius + shadow.userAttrs.y),
					'x': (0 - vmlParent.pos_ieCSS3.x - shadow.userAttrs.radius + shadow.userAttrs.x)
				};
				shadow.size_offset = {
					'width': 0,
					'height': 0
				};
				shadow.arcsize = arcSize + 'px';
				shadow.style.display = 'block';
				shadow.style.position = 'absolute';
				shadow.style.top = (pos.y + shadow.position_offset.y) +'px';
				shadow.style.left = (pos.x + shadow.position_offset.x) +'px';
				shadow.style.width = element.offsetWidth +'px';
				shadow.style.height = element.offsetHeight +'px';
				shadow.style.antialias = true;
				shadow.className = 'vml_box_shadow';
				shadow.style.zIndex = zIndex - 1;

				// for the opacity, the box shadow seems already affected by the opacity style
				var filter = 'progid:DXImageTransform.Microsoft.Blur(pixelRadius=' + shadow.userAttrs.radius + ',makeShadow=true,shadowOpacity=' + opacity + ')';
				shadow.style.filter = filter;

				element.parentNode.appendChild(shadow);

				// For window resizing
				vml.push(shadow);

				return true;
			}

			var createTextShadow = function() {
				if (!textShadow) {
					return false;
				}

				var match = textShadow.match(/^(\d+)px (\d+)px (\d+)px (#?\w+)/);
				if (!match) {
					return false;
				}


				var shadow = element.cloneNode(true);
				var radius = parseInt(RegExp.$3 || 0);
				shadow.userAttrs = {
					'x': parseInt(RegExp.$1 || 0) - (radius),
					'y': parseInt(RegExp.$2 || 0) - (radius),
					'radius': radius / 2,
					'color': (RegExp.$4 || '#000')
				};
				shadow.position_offset = {
					'y': (0 - vmlParent.pos_ieCSS3.y + shadow.userAttrs.y),
					'x': (0 - vmlParent.pos_ieCSS3.x + shadow.userAttrs.x)
				};
				shadow.size_offset = {
					'width': 0,
					'height': 0
				};
				shadow.style.color = shadow.userAttrs.color;
				shadow.style.position = 'absolute';
				shadow.style.top = (pos.y + shadow.position_offset.y) + 'px';
				shadow.style.left = (pos.x + shadow.position_offset.x) + 'px';
				shadow.style.antialias = true;
				shadow.style.behavior = null;
				shadow.className = 'ieCSS3_text_shadow';
				shadow.innerHTML = element.innerHTML;
				// For some reason it only looks right with opacity at 75%
				shadow.style.filter = '\
					progid:DXImageTransform.Microsoft.Alpha(Opacity=75)\
					progid:DXImageTransform.Microsoft.Blur(pixelRadius=' + shadow.userAttrs.radius + ',makeShadow=false,shadowOpacity=100)\
				';

				var clone = element.cloneNode(true);
				clone.position_offset = {
					'y': (0 - vml_parent.pos_ieCSS3.y),
					'x': (0 - vml_parent.pos_ieCSS3.x)
				};
				clone.size_offset = {
					'width': 0,
					'height': 0
				};
				clone.style.behavior = null;
				clone.style.position = 'absolute';
				clone.style.top = (pos.y + clone.position_offset.y) +'px';
				clone.style.left = (pos.x + clone.position_offset.x) +'px';
				clone.className = 'ieCSS3_text_shadow';


				element.parentNode.appendChild(shadow);
				element.parentNode.appendChild(clone);

				element.style.visibility = 'hidden';

				// For window resizing
				element.vml.push(clone);
				element.vml.push(shadow);

				return(true);
			}

			init();
		}

		/*function updatePositionAndSize() {
			if (typeof(window.ieCSS3.vmlified_elements) != 'object') {
				return(false);
			}

			for (var i in window.ieCSS3.vmlified_elements) {
				var el = window.ieCSS3.vmlified_elements[i];

				if (typeof(el.vml) != 'object') {
					continue;
				}

				for (var z in el.vml) {
					//var parent_pos = findPos(el.vml[z].parentNode);
					var new_pos = findPos(el);
					new_pos.x = (new_pos.x + el.vml[z].position_offset.x) + 'px';
					new_pos.y = (new_pos.y + el.vml[z].position_offset.y) + 'px';
					if (el.vml[z].style.left != new_pos.x) {
						el.vml[z].style.left = new_pos.x;
					}
					if (el.vml[z].style.top != new_pos.y) {
						el.vml[z].style.top = new_pos.y;
					}

					var new_size = {
						'width': parseInt(el.offsetWidth + el.vml[z].size_offset.width),
						'height': parseInt(el.offsetHeight + el.vml[z].size_offset.height)
					}
					if (el.vml[z].offsetWidth != new_size.width) {
						el.vml[z].style.width = new_size.width +'px';
					}
					if (el.vml[z].offsetHeight != new_size.height) {
						el.vml[z].style.height = new_size.height +'px';
					}
				}
			}

			if (event && (event.type == 'resize') && typeof(window.ieCSS3.previous_onresize) == 'function') {
				window.ieCSS3.previous_onresize();
			}
		}*/

		window.it_ieCss3 = ieCss3;
	})();
} else {
	it_ieCss3 = function() {};
}
