
var _d = document;

// for onload event
function addEvent(elm, evType, fn, useCapture) {
    if (elm.addEventListener) {
        elm.addEventListener(evType, fn, useCapture);
        return true;
    }
    else if (elm.attachEvent) {
        var r = elm.attachEvent('on' + evType, fn);
        return r;
    }
    else {
        elm['on' + evType] = fn;
    }
}

// add class
function addClass(element,value) {
	if (!element.className) {
		element.className = value;
	} else {
		newClassName = element.className;
		newClassName += " ";
		newClassName += value;
		element.className = newClassName;
	}
}

// remove class
function removeClass(element,value) {
	if (element.className == value) {
		element.className = "";
	} else if (element.className.indexOf(value) != -1) {
		element.className = element.className.replace(value,"");
	}
}

// get Class
function getClass(classname, tagname, tarID) {
	if (tarID == undefined) tarID = document;
	var element = this.nodeType == 1 ? this : tarID;
	var elements = [], nodes = tagname ? element.getElementsByTagName(tagname) : element.getElementsByTagName('*');	
	for(var i=0; i<nodes.length; i++) {
		var elementClassName = nodes[i].className;
		if (elementClassName.length > 0 && (elementClassName == arguments[0] || new RegExp("(^|\\s)" + arguments[0] + "(\\s|$)").test(elementClassName))) {
			elements.push(nodes[i]);
		}
	}
	return elements;
}

// input value
function inputValue(classname) {
	inputEl = getClass(classname, 'input');
	for (var i=0; i<inputEl.length; i++ ) {
		if(this.value == true) removeClass(this,classname);
		inputEl[i].onfocus = function() {
			removeClass(this,classname);
		}
		inputEl[i].onblur = function() {
			if(this.value == false) {
				addClass(this,classname);
			} else {
				return false;
			}
		}
	}
}

// tab menu
function tabMenu(id,currentNum) {
	var objAnchor = [], objLink = [];
	var ID = document.getElementById(id);
	var objLI = ID.getElementsByTagName('li');

	var initialize = function() {
		for (var i=0; i<objLI.length; i++) {
			objLink[i] = objLI[i].getElementsByTagName('a')[0];
			objAnchor[i] = document.getElementById(objLink[i].getAttribute('href').split('#')[1]);

			if (i != 0)
				objAnchor[i].className += ' hidden';
			else
				objLink[i].parentNode.className += ' visible';

			objEvent(i);
		}
		if (currentNum) objLink[currentNum-1].onclick();
	};

	var objEvent = function(num) {
		objLink[num].onclick = function() {
			for (var i=0; i<objLI.length; i++) {
				var imgEl = objLink[i].getElementsByTagName('img')[0]
				if (i == num) {
					if (imgEl) imgEl.src = imgEl.src.replace('.gif', '_on.gif');
					if (objLink[i].parentNode.className.indexOf('visible') == -1)
						objLink[i].parentNode.className += ' visible';
					objAnchor[i].className = objAnchor[i].className.replace('hidden', '');
				} else {
					if (imgEl) imgEl.src = imgEl.src.replace('_on.gif', '.gif');
					objLink[i].parentNode.className = objLink[i].parentNode.className.replace('visible', '');
					if (objAnchor[i].className.indexOf('hidden') == -1)
						objAnchor[i].className += ' hidden';
				}
			}
			return false;
		}
	};

	initialize();
}



// NO script case
function scriptOn(element){
	var tarEl = _d.getElementById(element);
	// 스크립트에 의존하는 엘리면트에 class를 부여하여 display를 활성화 시킨다(css).
	addClass(tarEl,'script_on');
}
function scriptOnClass(classname){
	var tarEl = getClass(classname);
	for (var i=0; i<tarEl.length; i++){
		addClass(tarEl[i],'script_on');
	}
}

// Rolling
/* css class셀렉터
--------------------------------*/
var getElementsClass = function() { //className, tagName, parentNode
	var element = arguments[2] || document;
	var elements = [], nodes = arguments[1] ? element.getElementsByTagName(arguments[1]) : element.getElementsByTagName('*');

	for(var i=0; i<nodes.length; i++) {
		if(nodes[i].className.indexOf(arguments[0]) != -1)
			elements.push(nodes[i]);
	}
	return elements;
};

/* element의 위치, 사이즈알아내기
--------------------------------*/
var getOffset = function () {
	var objRoot = null;
	var currentObj = arguments[0];
	var bLoop = !!arguments[1];
	var data = {left:0, top:0, width:0, height:0}

	data.width = currentObj.offsetWidth;
	data.height = currentObj.offsetHeight;

	switch (bLoop) {
	case true:
		while (!!currentObj && currentObj.nodeName.toLowerCase() != 'body') {
			data.top += currentObj.offsetTop;
			data.left += currentObj.offsetLeft;
			currentObj = currentObj.offsetParent;
		}
		break;
	case false:
		data.top = currentObj.offsetTop;
		data.left = currentObj.offsetLeft;
		break;
	}

	return data;
};



function rollingContent(obj, list, elementNode, autoScroll, scrollTime, scrollType, wrapSize, cntSize) {
	var _d = document,
		objId = _d.getElementById(obj),
		currentBox = _d.getElementById(list),
		objWrap,
		objThis = this,
		boxSize = 0,
		currentNum = 0,
		currentNumber = 0,
		elements,
		oldNum = 0;

	var setTimes = scrollTime * 1000,
		scroll = {time:1, start:0, change:0, duration:25, timer:null},
		originaltime = scroll.time,
		goodsSetTime = null,
		scrollDirection = 'direction',
		autoScrolling = autoScroll;

	var initialize = function() {
		elements = getElementsClass(elementNode, '', currentBox);
		var elementsLength = elements.length;
		if(elementsLength <= 1) return false;

		objWrap = _d.createElement('div');
		if (objId.childNodes[1])
			objId.insertBefore(objWrap, objId.childNodes[1]);
		else
			objId.appendChild(objWrap);
		currentBox = objId.removeChild(currentBox);
		objWrap.appendChild(currentBox);

		with (objWrap.style) {
			position = 'relative';
			overflow = 'hidden';
			width = wrapSize.width + 'px';
			height = wrapSize.height + 'px';
		}

		for (var i=0; i<elementsLength; i++) {
			with (elements[i].style) {
				display = 'block';
				if (scrollType == 'horizontal') {
					if (_d.all) styleFloat = 'left';
					else cssFloat = 'left';
				}
			}
			if (cntSize == 'auto') {
				if (scrollType == 'horizontal') boxSize += getOffset(elements[i]).width;
				else boxSize += getOffset(elements[i]).height;
			} else {
				if (scrollType == 'horizontal') boxSize += parseInt(cntSize.width);
				else boxSize += parseInt(cntSize.height);
			}
		}

		with (currentBox.style) {
			position = 'relative';
			overflow = 'hidden';
			if (scrollType == 'horizontal') width = boxSize + 'px';
			else height = boxSize + 'px';
		}

		if (autoScrolling == 'none') {
			//do noting
		} else {
			if (scrollDirection == 'direction')
				goodsSetTime = setInterval(objThis.next, setTimes);
			else
				goodsSetTime = setInterval(objThis.prev, setTimes);
		}
	};

	var actionEvent = function(objNum) {
		clearInterval(goodsSetTime);

		elements = getElementsClass(elementNode, '', currentBox);
		var elementsLength = elements.length;

		if (scrollType == 'horizontal')
			startScroll(objWrap.scrollLeft, parseInt(wrapSize.width * objNum));
		else
			startScroll(objWrap.scrollTop, parseInt(wrapSize.height * objNum));

		oldNum = objNum;
		return false;
	};

	this.next = function() {
		elements = getElementsClass(elementNode, '', currentBox);
		var elementsLength = elements.length;
		if(elementsLength <= 1) return false;

		if (currentNumber == elementsLength - 1) {
			var lastNode = currentBox.removeChild(elements[0]);
			currentBox.appendChild(lastNode);

			switch (scrollType) {
				case 'vertical':
					objWrap.scrollTop -= wrapSize.height;
					break;
				default:
					objWrap.scrollLeft -= wrapSize.width;
					break;
			}
			currentNumber--;
		}

		var position = getActionPoint('direct');
		startScroll(position.start, position.end);

		currentNumber = currentNumber + 1;
		if (currentNumber < elementsLength - 1)
			currentNumber = elementsLength - 1;

		scrollDirection = 'direction';
		if (autoScrolling == 'none') {
			//do noting
		} else {
			clearInterval(goodsSetTime);
			goodsSetTime = setInterval(objThis.next, setTimes);
		}

		return false;
	};

	this.prev = function() {
		elements = getElementsClass(elementNode, '', currentBox);
		var elementsLength = elements.length;
		if(elementsLength <= 1) return false;

		if (currentNumber == 0) {
			var firstNode = currentBox.removeChild(elements[elementsLength - 1]);
			currentBox.insertBefore(firstNode, elements[0]);

			switch (scrollType) {
				case 'vertical':
					objWrap.scrollTop += wrapSize.height;
					break;
				default:
					objWrap.scrollLeft += wrapSize.width;
					break;
			}
			currentNumber++;
		}

		var position = getActionPoint('indirect');
		startScroll(position.start, position.end);

		currentNumber = currentNumber - 1;
		if (currentNumber > 0)
			currentNumber = 0;

		scrollDirection = 'indirection';
		if (autoScrolling == 'none') {
			//do noting
		} else {
			clearInterval(goodsSetTime);
			goodsSetTime = setInterval(objThis.prev, setTimes);
		}

		return false;
	};

	this.stop = function() {
		clearInterval(goodsSetTime);
	};

	this.play = function() {
		autoScrolling = 'auto';
		clearInterval(goodsSetTime);
		if (scrollDirection == 'direction')
			goodsSetTime = setInterval(objThis.next, setTimes);
		else
			goodsSetTime = setInterval(objThis.prev, setTimes);
	};

	var startScroll = function (start, end) {
		if (scroll.timer != null) {
			clearInterval(scroll.timer);
			scroll.timer = null;
		}

		scroll.start = start;
		scroll.change = end - start;

		scroll.timer = setInterval(scrollAction, 15);
	};

	var scrollAction = function () {
		if (scroll.time > scroll.duration) {
			clearInterval(scroll.timer);
			scroll.time = originaltime;
			scroll.timer = null;
		} else {
			switch (scrollType) {
				case 'vertical':
					objWrap.scrollTop = sineInOut(scroll.time, scroll.start, scroll.change, scroll.duration);
					break;
				default:
					objWrap.scrollLeft = sineInOut(scroll.time, scroll.start, scroll.change, scroll.duration);
					break;
			}
			scroll.time++;
		}
	};

	var sineInOut = function (t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	};

	var getActionPoint = function (dir) {
		elements = getElementsClass(elementNode, '', currentBox);
		var startDirectPosition;
		var startInDirectPosition;
		if (dir == 'direct') {
			var position = findElementPos(elements[currentNumber + 1]); // target image.
			var offsetPos = findElementPos(elements[currentNumber]); // first image.
			startPosition = 0;
			startInDirectPosition;
		} else {
			var position = findElementPos(elements[currentNumber - 1]); // target image.
			var offsetPos = findElementPos(elements[currentNumber]); // first image.
			startPosition = elements[currentNumber - 1].offsetWidth;
			startInDirectPosition = elements[currentNumber - 1].offsetHeight;
		}

		switch (scrollType) {
			case 'vertical':
				var start = objWrap.scrollTop;
				var end = position[1] - offsetPos[1];
				break;
			default:
				var start =  startPosition;
				var end = position[0] - offsetPos[0];
				break;
		}

		position.start = start;
		position.end = end;

		return position;
	};

	var findElementPos = function (elemFind) {
		var elemX = 0;
		var elemY = 0;
		do {
			elemX += elemFind.offsetLeft;
			elemY += elemFind.offsetTop;
		} while (elemFind = elemFind.offsetParent)

		return Array(elemX, elemY);
	};

	initialize();
}
