/*
* Script : doScroll plugin for DOMAssistant
* Auteur:  Samuel desnoes - http://www.ifacta.fr
* Création : 30 05 2008
* Version : 0.6 - 22 02 2010 ( for DOMAssistant v2.7 )
* Licence : X11 - MIT
* Documentation : http://www.ifacta.fr/labo/scripts/domassistant.boxit/using.html
* Requires DOMAssistant library - http://www.domassistant.com
*/

/*global DOMAssistant, $, $$, window, document, self*/

DOMAssistant.doScroll = function () {
	return {
	
		currentEl : [],
		params : [],
		defaultMinPartWidth : 33, //minimum width of an element (% of parent's width)
		defaultMarginLeftandRight : 15, //right and left margins of an element (px)
		defaultSpeed : 40, //scrolling speed (px per iteration)
		objToMove : null,
		stillMoving : false,
	
		publicMethods : [
			"doScroll",
			"ready",
			"scrollToPart"
		],
		
		doScroll: function (params) {
			if ($$(this).nodeType === 1) {
				return DOMAssistant.doScroll.doIt($$(this), params);
			}
			return $(this);
		},
		
		checkOpt: function (optV) {
			if (typeof optV === "undefined") {
				optV = {};
			}
			var params = {};
			params.minPartWidth = (optV.minPartWidth) ? optV.minPartWidth : DOMAssistant.doScroll.defaultMinPartWidth;
			params.marginLeftandRight = (optV.marginLeftandRight) ? optV.marginLeftandRight : DOMAssistant.doScroll.defaultMarginLeftandRight;
			params.speed = (optV.speed) ? optV.speed : DOMAssistant.doScroll.defaultSpeed;
			params.numParts = 0;
			return params;
		},
		
		doIt: function (obj, params) {
			var content, objId, containerDiv, moveLeft, contentDiv, contentInnerDiv, moveRight;
			content = $$(obj).cssSelect("*");
			if (content.length > 1) {
				DOMAssistant.doScroll.currentEl.push($$(obj));
				objId = "daScroll" + DOMAssistant.doScroll.currentEl.length;
				DOMAssistant.doScroll.params[objId] = DOMAssistant.doScroll.checkOpt(params);
				/*Global container*/
				containerDiv = $$(obj).create("div", {
					className : "doScrollContainer"
				}, 1).setStyle({
					width : "100%"
				});
				/*left link*/
				moveLeft = $$(containerDiv).create("a", {
					className : "doScrollLeftLink",
					href : "#"
				}, 1, "&nbsp;");
				$$(moveLeft).setStyle({
					"float" : "left",
					"display" : "block",
					"height" : "100%;",
					"visibility" : "hidden"
				});
				/*mid container*/
				contentDiv = $$(containerDiv).create("div", {
					className : "doScrollContent"
				}, 1);
				$$(contentDiv).setStyle({
					"float" : "left",
					"overflow" : "hidden",
					"position" : "relative"
				});
				/*scrolling content*/
				contentInnerDiv = $$(contentDiv).create("div", {
					className : "doScrollInnerContent",
					id : objId
				}, 1);
				$$(contentInnerDiv).setStyle({
					"position" : "absolute",
					"margin-left" : "0"
				});
				/*right link*/
				moveRight = $$(containerDiv).create("a", {
					className : "doScrollRightLink",
					href : "#"
				}, 1, "&nbsp;");
				$$(moveRight).setStyle({
					"float" : "left",
					"display" : "block",
					"height" : "100%;"
				});
				$(content).each(function () {
					if ($$(this).parentNode === $$(obj)) {
						if (DOMAssistant.doScroll.params[objId].numParts !== 0) {
							$$(this).setAttributes({
								id : objId + "_" + DOMAssistant.doScroll.params[objId].numParts
							});
						}
						$$(this).setStyle({
							"margin" : 0,
							"padding" : 0,
							"overflow" : "hidden",
							"display" : "inline"
						});
						DOMAssistant.doScroll.params[objId].numParts += 1;
						$$(contentInnerDiv).addContent($$(this).addClass("scrollPart"));
					}
				});
				DOMAssistant.doScroll.sizeIt(DOMAssistant.doScroll.currentEl[DOMAssistant.doScroll.currentEl.length - 1]);
			}
			DOMAssistant.doScroll.ready();
			return $(obj);
		},
		
		ready : function () {
			var els, ll, lr;
			els = $(".doScrollContainer").parentNode;
			ll = $(".doScrollLeftLink");
			lr = $(".doScrollRightLink");
			$(els).each(function () {
				DOMAssistant.doScroll.sizeIt(this);
			});
			$(window).addEvent("resize", function () {
				$(els).each(function () {
					DOMAssistant.doScroll.sizeIt(this);
				});
			});
			$(ll).each(function () {
				$$(this).addEvent("click", function (e) {
					DOMAssistant.preventDefault(e);
					DOMAssistant.doScroll.moveItLeft(this);
				});
			});
			$(lr).each(function () {
				$$(this).addEvent("click", function (e) {
					DOMAssistant.preventDefault(e);
					DOMAssistant.doScroll.moveItRight(this);
				});
			});
			
		},
		
		sizeIt: function (obj) {
			var refId, lLink, rLink, maxNumParts, partWidth, minPartWidth, posit, goTo;
			refId = $$(obj).cssSelect(".doScrollInnerContent").first().id;
			DOMAssistant.doScroll.params[refId].containerWidth = ($$(obj).parentNode.offsetWidth && $$(obj).parentNode.offsetWidth >= $$(obj).offsetWidth) ? $$(obj).offsetWidth : $$(obj).parentNode.offsetWidth;
			DOMAssistant.doScroll.params[refId].containerHeight = 0;
			lLink = $$(obj).cssSelect(".doScrollLeftLink").first();
			rLink = $$(obj).cssSelect(".doScrollRightLink").first();
			if (isNaN(DOMAssistant.doScroll.params[refId].minPartWidth) === false) {
				posit = false;
				minPartWidth = Math.ceil(((DOMAssistant.doScroll.params[refId].containerWidth - $$(lLink).offsetWidth - $$(rLink).offsetWidth) * (DOMAssistant.doScroll.params[refId].minPartWidth) - (2 * DOMAssistant.doScroll.params[refId].marginLeftandRight)) / 100);
				/*width and height of each part*/
				DOMAssistant.doScroll.params[refId].partWidth = Math.floor((DOMAssistant.doScroll.params[refId].containerWidth - $$(lLink).offsetWidth - $$(rLink).offsetWidth) / DOMAssistant.doScroll.params[refId].numParts) - (2 * DOMAssistant.doScroll.params[refId].marginLeftandRight);
			}
			else {
				posit = DOMAssistant.doScroll.params[refId].minPartWidth.indexOf("px");
				minPartWidth = parseInt(DOMAssistant.doScroll.params[refId].minPartWidth.substring(0, posit), 10);
				/*width and height of each part*/
				DOMAssistant.doScroll.params[refId].partWidth = minPartWidth;
			}
			if (DOMAssistant.doScroll.params[refId].partWidth < minPartWidth) {
				maxNumParts = Math.ceil((DOMAssistant.doScroll.params[refId].containerWidth - $$(lLink).offsetWidth - $$(rLink).offsetWidth) / (minPartWidth + (2 * DOMAssistant.doScroll.params[refId].marginLeftandRight)));
				partWidth = Math.floor((DOMAssistant.doScroll.params[refId].containerWidth - $$(lLink).offsetWidth - $$(rLink).offsetWidth) / maxNumParts);
				DOMAssistant.doScroll.params[refId].partWidth = partWidth - (2 * DOMAssistant.doScroll.params[refId].marginLeftandRight);
			}
			DOMAssistant.doScroll.params[refId].numDisplay = Math.floor((DOMAssistant.doScroll.params[refId].containerWidth - $$(lLink).offsetWidth - $$(rLink).offsetWidth) / (DOMAssistant.doScroll.params[refId].partWidth + (2 * DOMAssistant.doScroll.params[refId].marginLeftandRight)));
			$$(obj).cssSelect(".scrollPart").each(function () {
				$$(this).setStyle({
					"margin" : "0 " + DOMAssistant.doScroll.params[refId].marginLeftandRight + "px",
					"width" : DOMAssistant.doScroll.params[refId].partWidth + "px",
					"float" : "left"
				});
				if ($$(this).offsetHeight > DOMAssistant.doScroll.params[refId].containerHeight) {
					DOMAssistant.doScroll.params[refId].containerHeight = $$(this).offsetHeight;
				}
			});
			/*width and height of scrolling div*/
			DOMAssistant.doScroll.params[refId].scrollingWidth = (DOMAssistant.doScroll.params[refId].partWidth + (2 * DOMAssistant.doScroll.params[refId].marginLeftandRight)) * DOMAssistant.doScroll.params[refId].numParts;
			$$(obj).cssSelect(".doScrollInnerContent").first().setStyle({
				"height" : DOMAssistant.doScroll.params[refId].containerHeight + "px",
				"width" : DOMAssistant.doScroll.params[refId].scrollingWidth + "px"
			});
			/*fixing div sizes*/
			DOMAssistant.doScroll.params[refId].scrollContWidth = DOMAssistant.doScroll.params[refId].containerWidth - lLink.offsetWidth - rLink.offsetWidth;
			$$(obj).cssSelect(".doScrollContent").first().setStyle({
				"height" : DOMAssistant.doScroll.params[refId].containerHeight + "px",
				"width" : DOMAssistant.doScroll.params[refId].scrollContWidth + "px"
			});
			DOMAssistant.doScroll.params[refId].maxMarginLeft = -1 * (DOMAssistant.doScroll.params[refId].scrollingWidth - DOMAssistant.doScroll.params[refId].scrollContWidth);
			$$(obj).cssSelect(".doScrollContainer").setStyle({
				"height" : DOMAssistant.doScroll.params[refId].containerHeight + "px",
				"width" : DOMAssistant.doScroll.params[refId].containerWidth + "px"
			});
			/*in case of nothing to scroll*/
			//alert("compare : " + DOMAssistant.doScroll.params[refId].scrollingWidth + " - " + DOMAssistant.doScroll.params[refId].scrollContWidth);//debug
			if (DOMAssistant.doScroll.params[refId].scrollingWidth <= DOMAssistant.doScroll.params[refId].scrollContWidth) {
				$$(rLink).setStyle({
					visibility : "hidden"
				});
			}
			goTo = window.document.location.href.split("#");
			if (typeof goTo[1] !== "undefined") {
				goTo = goTo[1].split("_");
				if ((typeof goTo[0] !== "undefined" && goTo[0].substring(0,8) === "daScroll") && typeof goTo[1] !== "undefined" && goTo[0] === refId && $("#" + goTo[0] + "_" + (goTo[1] - 1)).length > 0){
					DOMAssistant.doScroll.moveItTo(goTo[0], (goTo[1] - 1));
				}
			}
		},

		moveItLeft : function (obj) {
			var pN = $$(obj).parentNode.parentNode;
			if (DOMAssistant.doScroll.stillMoving === true) {
				window.setTimeout("DOMAssistant.doScroll.movItLeft(" + obj + ")", 300);
				return false;
			}
			DOMAssistant.doScroll.objToMove = $$(pN).cssSelect(".doScrollInnerContent").first();
			obj = $$(DOMAssistant.doScroll.objToMove).id;
			$$(pN).cssSelect("a.doScrollRightLink").first().setStyle("visibility", "visible");
			DOMAssistant.doScroll.params[obj].sens = 1 * DOMAssistant.doScroll.params[obj].speed;
			DOMAssistant.doScroll.params[obj].margeActu = parseInt($$(obj).style.marginLeft, 10);
			
			DOMAssistant.doScroll.params[obj].max = DOMAssistant.doScroll.params[obj].margeActu + DOMAssistant.doScroll.params[obj].numDisplay * (DOMAssistant.doScroll.params[obj].partWidth + (2 * DOMAssistant.doScroll.params[obj].marginLeftandRight));
			DOMAssistant.doScroll.params[obj].movingInterval = window.setInterval("DOMAssistant.doScroll.moving()", 30);
			return false;
		},
		
		moveItRight : function (obj) {
			var pN = $$(obj).parentNode.parentNode;
			if (DOMAssistant.doScroll.stillMoving === true) {
				window.setTimeout("DOMAssistant.doScroll.movItRight(" + obj + ")", 300);
				return false;
			}
			DOMAssistant.doScroll.objToMove = $$(pN).cssSelect(".doScrollInnerContent").first();
			obj = $$(DOMAssistant.doScroll.objToMove).id;
			$$(pN).cssSelect("a.doScrollLeftLink").first().setStyle("visibility", "visible");
			DOMAssistant.doScroll.params[obj].sens = -1 * DOMAssistant.doScroll.params[obj].speed;
			DOMAssistant.doScroll.params[obj].margeActu = parseInt($$(obj).style.marginLeft, 10);
			DOMAssistant.doScroll.params[obj].max = (-1 * DOMAssistant.doScroll.params[obj].margeActu) + DOMAssistant.doScroll.params[obj].numDisplay * (DOMAssistant.doScroll.params[obj].partWidth + (2 * DOMAssistant.doScroll.params[obj].marginLeftandRight));
			DOMAssistant.doScroll.params[obj].movingInterval = window.setInterval("DOMAssistant.doScroll.moving()", 30);
			return false;
		},
		
		moveItTo : function (obj, partNum) {
			var newMargin, sens;
			DOMAssistant.doScroll.objToMove = $$(obj);
			$$(DOMAssistant.doScroll.objToMove).parentNode.parentNode.cssSelect("a.doScrollLeftLink").first().setStyle("visibility", "visible");
			$$(DOMAssistant.doScroll.objToMove).parentNode.parentNode.cssSelect("a.doScrollRightLink").first().setStyle("visibility", "visible");
			newMargin = parseInt(partNum, 10) * (DOMAssistant.doScroll.params[obj].partWidth + (2 * DOMAssistant.doScroll.params[obj].marginLeftandRight));
			DOMAssistant.doScroll.params[obj].margeActu = parseInt($$(obj).style.marginLeft, 10);
			if (Math.abs(DOMAssistant.doScroll.params[obj].margeActu) === Math.abs(newMargin)){
				return;
			}
			sens = ((DOMAssistant.doScroll.params[obj].margeActu - newMargin > 0 && newMargin > DOMAssistant.doScroll.params[obj].margeActu) || (DOMAssistant.doScroll.params[obj].margeActu - newMargin < 0 && (-1 * newMargin) < DOMAssistant.doScroll.params[obj].margeActu)) ? -1 : 1;
			DOMAssistant.doScroll.params[obj].sens = sens * DOMAssistant.doScroll.params[obj].speed;
			DOMAssistant.doScroll.params[obj].max = (sens * DOMAssistant.doScroll.params[obj].margeActu) + newMargin;
			DOMAssistant.doScroll.params[obj].movingInterval = window.setInterval("DOMAssistant.doScroll.moving()", 30);
		},
		
		scrollToPart : function (partNum) {
			var obj = $(this).cssSelect(".doScrollInnerContent").first();
			//alert(obj);//debug
			if (typeof obj !== "undefined") {
				obj = $$(obj).id;
				if ($("#" + obj + "_" + (partNum - 1)).length > 0){
					DOMAssistant.doScroll.moveItTo(obj, (partNum - 1));
				}
			}
			return $(this);
		},
		
		moving : function () {
			var obj, parentObj, depl, max, resetMax;
			obj = $$(DOMAssistant.doScroll.objToMove).id;
			parentObj = $$(obj).parentNode.parentNode;
			depl = DOMAssistant.doScroll.params[obj].sens;
			max = DOMAssistant.doScroll.params[obj].max;
			if ((depl > 0 && (DOMAssistant.doScroll.params[obj].margeActu + depl) < max && DOMAssistant.doScroll.params[obj].margeActu < 0) || (depl < 0 && (DOMAssistant.doScroll.params[obj].margeActu + depl) > (-1 * max) && (DOMAssistant.doScroll.params[obj].margeActu + depl) > DOMAssistant.doScroll.params[obj].maxMarginLeft)) {
				DOMAssistant.doScroll.stillMoving = true;
				DOMAssistant.doScroll.params[obj].margeActu += depl;
				$$(obj).style.marginLeft = DOMAssistant.doScroll.params[obj].margeActu + "px";
			}
			else {
				if (depl > 0 && ((DOMAssistant.doScroll.params[obj].margeActu + depl) >= max || (DOMAssistant.doScroll.params[obj].margeActu + depl) >= 0)) {
					if ((DOMAssistant.doScroll.params[obj].margeActu + depl) >= 0) {
						resetMax = 0;
						//alert($$(obj).parentNode.parentNode.className);//debug
						$$(parentObj).cssSelect("a.doScrollLeftLink").first().setStyle("visibility", "hidden");
					}
					else {
						resetMax = max;
					}
					$$(obj).style.marginLeft = resetMax + "px";
				}
				else if (depl < 0 && ((DOMAssistant.doScroll.params[obj].margeActu + depl) <= (-1 * max) || (DOMAssistant.doScroll.params[obj].margeActu + depl) <= DOMAssistant.doScroll.params[obj].maxMarginLeft)) {
					if ((DOMAssistant.doScroll.params[obj].margeActu + depl) <= DOMAssistant.doScroll.params[obj].maxMarginLeft) {
						resetMax = DOMAssistant.doScroll.params[obj].maxMarginLeft;
						$$(parentObj).cssSelect("a.doScrollRightLink").first().setStyle("visibility", "hidden");
					}
					else {
						resetMax = (-1 * max);
					}
					$$(obj).style.marginLeft = resetMax + "px";
				}
				return DOMAssistant.doScroll.stop(obj);
			}
			return void(0);
		},
		
		stop : function (obj) {
			//alert(typeof DOMAssistant.doScroll.params[obj].movingInterval);//debug
			DOMAssistant.doScroll.stillMoving = false;
			if (typeof DOMAssistant.doScroll.params[obj].movingInterval !== "undefined" && DOMAssistant.doScroll.params[obj].movingInterval !== false) {
				window.clearInterval(DOMAssistant.doScroll.params[obj].movingInterval);
				return false;
			}
			return void(0);
		}
		
	};
	
}();

DOMAssistant.attach(DOMAssistant.doScroll);