(function(window, document,undefined){
	var ssPro = function(elm){
		// DOM
		if(elm !== undefined){
			ssPro.DOMElements = [];
			if (typeof elm === 'string') {
        		elm = document.getElementById(elm);
			}
			ssPro.DOMElements = [elm];
		}	
		//chaining
		return {
			setHtml:function(value){
				$.DOMElements[0].innerHTML = value;
				return this;
			},
			getHtml:function(value){
				return $.DOMElements[0].innerHTML;
				return this;
			},			
			setClass:function(value){
				$.DOMElements[0].className = value;
				return this;
			},
			getClass:function(value){
				return $.DOMElements[0].className;
				return this;
			},			
			setCss:function(what,value){
				if(what==="opacity"){
					$.DOMElements[0].style.opacity = value;
					$.DOMElements[0].style.filter = "alpha(opacity=" + value*100 + ")";
				} else {
					$.DOMElements[0].style[what] = value;
				}
				return this;
			},
			getCss:function(what){
				return $.DOMElements[0].style[what];
				return this;
			},
			removeCss:function(what){
				$.DOMElements[0].style.removeProperty(what);
				return this;
			},
			getAttribute: function(what){
				return $.DOMElements[0].getAttribute(what);
				return this;
			},
			setAttribute: function(what,value){
				return $.DOMElements[0].setAttribute(what,value);
				return this;
			},			
			setValue:function(val){
				$.DOMElements[0].value = val;
				return this;
			},
			getValue:function(){
				return $.DOMElements[0].value;
				return this;
			},
			valValue:function(type){
				var validation = false;
				if(type==="length"){
				} else if(type==="numeric"){
					//var expr = /^[0-9]+$/;
				    var expr =  /^[-]?[0-9]+$/;
					if($.DOMElements[0].value.match(expr)){
						validation = true;
					}
				} else if(type==="percentage"){
					if($.DOMElements[0].value<101){
						validation = true;
					} 
				}
				return validation;
				return this;
			},
			setFocus:function(){
				$.DOMElements[0].focus();
				$.DOMElements[0].select();
				return this;
			},
			getChildrenLength:function(){
				return $.DOMElements[0].children.length;
				return this;
			},			
			getFirstChild:function(){
				id = 0;
				if($.DOMElements[0].children.length>0){
				   id = $.DOMElements[0].children[0].id;
				   return id;
				}
				return this;
			},
			removeChild:function(id){
				$.DOMElements[0].removeChild(document.getElementById(id));
				return this;
			},
			appendChild:function(id){
				$.DOMElements[0].appendChild(id);
				return this;
			},
			eventAdd:function(evt,fn){
				if($.DOMElements[0].addEventListener){
					$.DOMElements[0].addEventListener(evt,fn,false);
				} else if ($.DOMElements[0].attachEvent){
					$.DOMElements[0].attachEvent('on'+evt,fn);
				}
				return this;
			},
			eventRemove:function(evt,fn){
				if($.DOMElements[0].removeEventListener){
					$.DOMElements[0].removeEventListener(evt,fn,false);
				} else if($.DOMElements[0].detachEvent){
					$.DOMElements[0].detachEvent('on'+evt,fn);
				}
				return this;
			},				
			toggle:function(){
				$.DOMElements[0].style.display = ($.DOMElements[0].style.display !== 'none' ? 'none' : '' );
				return $.DOMElements[0].style.display;
				return this;
			},
			message:function(value){
				alert(value);
				return this;
			},
			draggable:function(opts){
				var obj = $.DOMElements[0];
				var axis = opts.axis ? axis = opts.axis : axis = false;
				var handle = opts.handle ? handle = opts.handle : handle = false;
				var left = opts.left ? left = opts.left : left = -10000;
				var right = opts.right ? right = opts.right : right = 10000;
				var top = opts.top ? top = opts.top : top = -10000;
				var bottom = opts.bottom ? bottom = opts.bottom : bottom = 10000;
				var parent = opts.parent ? parent = opts.parent : parent = false;
				var revert = opts.revert ? revert = opts.revert : revert = false;
				var startaction = opts.startaction ? startaction = opts.startaction : startaction = false;
				var whileaction = opts.whileaction ? whileaction = opts.whileaction : whileaction = false;
				var endaction = opts.endaction ? endaction = opts.endaction : endaction = false;
				if(parent!==false){
					var parentDimensions = $.dimensions(document.getElementById(parent));
					left = parentDimensions.left;
					right = parentDimensions.left+parentDimensions.width;
					top = parentDimensions.top;
					bottom = parentDimensions.top+parentDimensions.height;
				}
				if(handle!==false){
					var dragHandle = document.createElement('div');
					dragHandle.setAttribute("id",obj.id+"_draghandle");
					dragHandle.className = 'draghandle';
					obj.appendChild(dragHandle);
					$.DOMElements[0] = document.getElementById(obj.id+"_draghandle");
				} else {
					var dragHelper = document.createElement('div');
					dragHelper.setAttribute("id",obj.id+"_draghelper");
					dragHelper.className = 'draghelper';
					obj.appendChild(dragHelper);
					$.DOMElements[0] = document.getElementById(obj.id+"_draghelper");
				}
				this.eventAdd("mouseover",function(){this.style.cursor='move';});
				this.eventAdd("mousedown",initDrag = function(e){
					obj.style.cursor = 'move';
					if(!e){ var e = window.event;}
					var mouse = $.mousePosition(e);
					var dimensions = $.dimensions(obj);
					var difX = mouse.x-dimensions.left;
					var difY = mouse.y-dimensions.top;
					if (startaction !== false){ startaction();};
					$(document).eventAdd("mousemove",startDrag = function(e){ 
						if(!e){ var e = window.event;}
						var mouse = $.mousePosition(e);
						if((axis==='x' || axis===false) && ((mouse.x-difX)>=left && (mouse.x-difX+obj.offsetWidth)<=right)){ obj.style.left = (mouse.x-difX)+'px';};
						if((axis==='y' || axis===false) && ((mouse.y-difY)>=top && (mouse.y-difY+obj.offsetHeight)<=bottom)){ obj.style.top = (mouse.y-difY)+'px';};
						if (window.getSelection){ window.getSelection().removeAllRanges();};
						if (whileaction !== false){ whileaction();};
						return false;
					});
					$(document).eventAdd("mouseup",stopDrag = function() {
						obj.style.cursor = 'default'; 
						$(document).eventRemove("mousemove",startDrag); 
						$(document).eventRemove("mouseup",stopDrag);
						if (endaction !== false){ endaction();};
						if(revert!==false){
							$(obj.id).animate('move',{endX:startX,endY:startY,speed:5,style:styleSin});
						}
						return false;
					});
					return false;
				});
				$.DOMElements[0] = obj;
				return this;
			},
			removeDraggable:function(opts){
				var obj = $.DOMElements[0];
				var handle = opts.handle ? handle = opts.handle : handle = false;
				if(handle==true){
					obj.removeChild(document.getElementById(obj.id+"_draghandle"));
				} else {
					obj.removeChild(document.getElementById(obj.id+"_draghelper"));
				}
				$(document).eventRemove("mousedown",initDrag);
			},
			scalable:function(opts){
				var axis = opts.axis ? axis = opts.axis : axis = false;
				var handle = opts.handle ? handle = opts.handle : handle = false;
				var minW = opts.minW ? minW = opts.minW : minW = 20;
				var minH = opts.minH ? minH = opts.minH : minH = 20;
				var maxW = opts.maxW ? maxW = opts.maxW : maxW = 10000;
				var maxH = opts.maxH ? maxH = opts.maxH : maxH = 10000;
				var revert = opts.revert ? revert = opts.revert : revert = false;
				var startaction = opts.startaction ? startaction = opts.startaction : startaction = false;
				var whileaction = opts.whileaction ? whileaction = opts.whileaction : whileaction = false;
				var endaction = opts.endaction ? endaction = opts.endaction : endaction = false;
				var obj = $.DOMElements[0];
				if(handle!==false){
					var scaleHandle = document.createElement('div');
					scaleHandle.setAttribute("id",obj.id+"_scalehandle");
					scaleHandle.className = 'scalehandle';
					obj.appendChild(scaleHandle);
					$.DOMElements[0] = document.getElementById(obj.id+"_scalehandle");
					this.eventAdd("mouseover",function(){scaleHandle.style.cursor='nw-resize';});
				}				
				this.eventAdd("mousedown",initScale = function(){ 
					obj.style.cursor = 'nw-resize';
					if (startaction !== false){ startaction();};
					$(document).eventAdd("mousemove",startScale = function(e){ 
						if(!e){ var e = window.event;}
						var mouse = $.mousePosition(e);
						var dimensions = $.dimensions(obj);
						if((axis==='x' || axis===false) && ((mouse.x-dimensions.left)>=minW && (mouse.x-dimensions.left)<=maxW)){ obj.style.width = (mouse.x-dimensions.left)+'px';};
						if((axis==='y' || axis===false) && ((mouse.y-dimensions.top)>=minH && (mouse.y-dimensions.top)<=maxH)){ obj.style.height = (mouse.y-dimensions.top)+'px';};
						if (whileaction !== false){ whileaction();};
						if (window.getSelection){ window.getSelection().removeAllRanges();};
						return false;
					});
					$(document).eventAdd("mouseup",stopScale = function() { 
						obj.style.cursor = 'default'; 
						$(document).eventRemove("mousemove",startScale);
						$(document).eventRemove("mouseup",stopScale);
						if (endaction !== false){ endaction();};
						if(revert!==false){
							$(obj.id).animate('scale',{endW:startW,endH:startH,speed:5,style:styleSin});
						}						
					});
					return false;
				});
				$.DOMElements[0] = obj;
				return this;
			},	
			freeTransform:function(opts){
				var snap = opts.snap ? snap = opts.snap : snap = false;
				var mask = opts.mask ? mask = opts.mask : mask = false;
				var startaction = opts.startaction ? startaction = opts.startaction : startaction = false;
				var whileaction = opts.whileaction ? whileaction = opts.whileaction : whileaction = false;
				var endaction = opts.endaction ? endaction = opts.endaction : endaction = false;
				var obj = $.DOMElements[0];
				var proportionalScale = false;
				if(mask!=false){
					var divId = document.getElementById(obj.parentNode.id);
					var maskPos = $.dimensions(divId);
					var mask = document.createElement('div');
					mask.id = "maskLeft";
					mask.style.borderLeft = '1px solid #FF0000';
					mask.style.position = 'absolute';
					mask.style.left = maskPos.left+'px';
					mask.style.top = maskPos.top+'px';
					mask.style.width = '1px';
					mask.style.height = maskPos.height+'px';
					mask.style.zIndex = '1000';
					document.getElementById(divId.parentNode.id).appendChild(mask);
					mask = document.createElement('div');
					mask.id = "maskTop";
					mask.style.borderTop = '1px solid #FF0000';
					mask.style.position = 'absolute';
					mask.style.left = maskPos.left+'px';
					mask.style.top = maskPos.top+'px';
					mask.style.width = maskPos.width+'px';
					mask.style.height = '1px';
					mask.style.zIndex = '1000';
					document.getElementById(divId.parentNode.id).appendChild(mask);
					mask = document.createElement('div');
					mask.id = "maskRight";
					mask.style.borderLeft = '1px solid #FF0000';
					mask.style.position = 'absolute';
					mask.style.left = (maskPos.left+maskPos.width)+'px';
					mask.style.top = maskPos.top+'px';
					mask.style.width = '1px';
					mask.style.height = maskPos.height+'px';
					mask.style.zIndex = '1000';
					document.getElementById(divId.parentNode.id).appendChild(mask);					
					mask = document.createElement('div');
					mask.id = "maskBottom";
					mask.style.borderTop = '1px solid #FF0000';
					mask.style.position = 'absolute';
					mask.style.left = maskPos.left+'px';
					mask.style.top = (maskPos.top+maskPos.height)+'px';
					mask.style.width = maskPos.width+'px';
					mask.style.height = '1px';
					mask.style.zIndex = '1000';
					document.getElementById(divId.parentNode.id).appendChild(mask);					
				}
				var directions = [];
				directions[0]=["MOVE",'top','0px','left','0px','transformdrag'];
				directions[1]=["N",'top','0px','left','50%','transformhandleNS'];
				directions[2]=["NE",'top','0px','right','0px','transformhandle'];
				directions[3]=["E",'top','50%','right','0px','transformhandleEW'];
				directions[4]=["SE",'bottom','0px','right','0px','transformhandle'];
				directions[5]=["S",'bottom','0px','left','50%','transformhandleNS'];
				directions[6]=["SW",'bottom','0px','left','0px','transformhandle'];
				directions[7]=["W",'top','50%','left','0px','transformhandleEW'];
				directions[8]=["NW",'top','0px','left','0px','transformhandle'];
				for(i=0;i<9;i++){
					var transformHandle = document.createElement('div');
					transformHandle.id = directions[i][0];
					transformHandle.className = directions[i][5];
					transformHandle.setAttribute('onmouseover',"this.style.cursor='"+directions[i][0]+"-resize'");
					transformHandle.style[directions[i][1]] = directions[i][2];
					transformHandle.style[directions[i][3]] = directions[i][4];
					if(directions[i][0]==="MOVE"){
						transformHandle.style['right'] = '0px';
						transformHandle.style['bottom'] = '0px';
						transformHandle.setAttribute('onmouseover',"this.style.cursor='move'");
					}
					obj.appendChild(transformHandle);
					$.DOMElements[0] = document.getElementById(directions[i][0]);
					this.eventAdd("mousedown",initFreeTransform = function(e){
						if(!e){ var e = window.event;}
						if (!e.target) { e.target = e.srcElement || document;}
						var dir = e.target.id;
						var mouse = $.mousePosition(e);
						var dimensions = $.dimensions(obj);
						var difX = mouse.x-dimensions.left;
						var difY = mouse.y-dimensions.top;
						var startX = dimensions.left;
						var startY = dimensions.top;
						var startW = dimensions.width;
						var startH = dimensions.height;
						var scaleFactor = (startW/startH);
						var history = $.history.add(['freeTransform',obj.id,startX,startY,startW,startH,whileaction]);
						if (startaction !== false){ startaction();};
						$(document).eventAdd("mousemove",startFreeTransform = function(e){ 
							if(!e){ var e = window.event;}
							var mouse = $.mousePosition(e);
							if(dir==='SE' || dir==='E' || dir==='NE'){
								var newWidth = (startW+((mouse.x-difX)-startX));
								if(newWidth>=10){
									if(proportionalScale==true){
										newHeight = (newWidth/scaleFactor);
										obj.style.height = newHeight.toFixed()+'px';
									}									
									obj.style.width = newWidth+'px';
								}
							}
							if(dir==='W' || dir==='SW' || dir==='NW'){
								var newWidth = (startW-((mouse.x-difX)-startX));
								if(newWidth>=10){
								if(proportionalScale==true){
										newHeight = (newWidth/scaleFactor);
										obj.style.height = newHeight.toFixed()+'px';
									}										
									obj.style.left = (mouse.x-difX)+'px';
									obj.style.width = newWidth+'px';
								}
							}							
							if(dir==='SE' || dir==='S' || dir==='SW'){
								var newHeight = (startH+((mouse.y-difY)-startY));
								if(newHeight>=10){
									if(proportionalScale==false || dir=='S'){
										obj.style.height = newHeight+'px';
									}
								}
							}
							if(dir==='N' || dir==='NE' || dir==='NW'){
								if(proportionalScale==false || dir=='N'){
									var newHeight = (startH-((mouse.y-difY)-startY));
									if(newHeight>=10){
										obj.style.top = (mouse.y-difY)+'px';
										obj.style.height = newHeight+'px';
									}
								} else {
									newTop = startY+(startH-newHeight.toFixed());
									obj.style.top = newTop.toFixed()+'px';										
								}
							}
							if(dir==='MOVE'){
								obj.style.left = (mouse.x-difX)+'px';
								obj.style.top = (mouse.y-difY)+'px';
							}
							if (whileaction !== false){ whileaction();};						
							if (window.getSelection){ window.getSelection().removeAllRanges();};
							if (e.preventDefault){
								e.preventDefault();
								return false;
							}
							return false;
						});
						$(document).eventAdd("mouseup",stopFreeTransform = function() { 
							obj.style.cursor = 'default'; 
							$(document).eventRemove("mousemove",startFreeTransform);
							$(document).eventRemove("mouseup",stopFreeTransform);
							if (endaction !== false){ endaction();};
						});	
					});
					
				}
				$.DOMElements[0] = obj;
				$(document).eventAdd("keydown", startKeyFreeTransform = function(e){ 
						if(!e){ var e = window.event;}
						switch (e.keyCode) {
							case 16:	// shift
								proportionalScale = true;
								break;
							case 37:	// left
								obj.style.left = ($.dimensions(obj).left-1)+'px';
								if (whileaction !== false){ whileaction();};
								break;
							case 39:	// right
								obj.style.left = ($.dimensions(obj).left+1)+'px';
								if (whileaction !== false){ whileaction();};
								break;
							case 38:	// up
								obj.style.top = ($.dimensions(obj).top-1)+'px';
								if (whileaction !== false){ whileaction();};
								break;
							case 40:	// down
								obj.style.top = ($.dimensions(obj).top+1)+'px';
								if (whileaction !== false){ whileaction();};
								break;
							default:
								return true;
						}
						if (e.preventDefault){
							e.preventDefault();
							return false;
						}
						return false;						
					});	
					$(document).eventAdd("keyup",stopKeyFreeTransform = function() { 
					 	proportionalScale = false;
						if (endaction !== false){ endaction();};
					});	
				return this;
			},	
			removeFreeTransform:function(opts){
				var mask = opts.mask ? mask = opts.mask : mask = false;
				var obj = $.DOMElements[0];
				obj.removeChild(document.getElementById("MOVE"));
				obj.removeChild(document.getElementById("N"));
				obj.removeChild(document.getElementById("NW"));
				obj.removeChild(document.getElementById("W"));
				obj.removeChild(document.getElementById("SW"));
				obj.removeChild(document.getElementById("S"));
				obj.removeChild(document.getElementById("SE"));
				obj.removeChild(document.getElementById("E"));
				obj.removeChild(document.getElementById("NE"));
				$(document).eventRemove("keyup",stopKeyFreeTransform);
				$(document).eventRemove("keydown",startKeyFreeTransform);
				if(mask!=false){
					var divId = document.getElementById(obj.parentNode.id);
					document.getElementById(divId.parentNode.id).removeChild(document.getElementById('maskLeft'));
					document.getElementById(divId.parentNode.id).removeChild(document.getElementById('maskTop'));
					document.getElementById(divId.parentNode.id).removeChild(document.getElementById('maskRight'));
					document.getElementById(divId.parentNode.id).removeChild(document.getElementById('maskBottom'));
				}				
				return this;
			},
			sortable:function(opts){
				var list = $.DOMElements[0];
				for(var i=0; i<list.children.length; i++){
					$.DOMElements[0] = document.getElementById(list.children[i].id);
					this.sortItem(list,opts);
				}	
				$.DOMElements[0] = list;
				return this;
			},
			removeSortable:function(opts){
				var list = $.DOMElements[0];
				var handle = opts.handle ? handle = opts.handle : handle = false;
				for(var i=0; i<list.children.length; i++){
					if(handle===true){
						if(list.children[i].lastChild.id===list.children[i].id+"_togglebtn"){
							list.children[i].removeChild(list.children[i].lastChild);
						}							
						if(list.children[i].lastChild.id===list.children[i].id+"_sorthandle"){
							list.children[i].removeChild(list.children[i].lastChild);
						}
					}
				}	
				$.DOMElements[0] = list;
				return this;
			},			
			sortItem:function(list,opts){
				var axis = opts.axis ? axis = opts.axis : axis = false;
				var handle = opts.handle ? handle = opts.handle : handle = false;
				var toggle = opts.toggle ? toggle = opts.toggle : toggle = false;
				var selectable = opts.selectable ? selectable = opts.selectable : selectable = false;
				var startaction = opts.startaction ? startaction = opts.startaction : startaction = false;
				var whileaction = opts.whileaction ? whileaction = opts.whileaction : whileaction = false;
				var endaction = opts.endaction ? endaction = opts.endaction : endaction = false;
				var obj = $.DOMElements[0];
				var sortList = list;
				if(selectable!==false){
					obj.setAttribute('onmouseover',"this.style.cursor='pointer'");
					this.eventAdd("click",function(){selectable(obj.id);});
				}
				if(toggle!==false){
					var toggleBtn = document.createElement('a');
					toggleBtn.setAttribute("id",obj.id+"_togglebtn");
					toggleBtn.setAttribute('onmouseover',"this.style.cursor='pointer'");
					toggleBtn.className = 'togglebtn';
					obj.insertBefore(toggleBtn,obj.firstChild.nextSibling);
					$.DOMElements[0] = document.getElementById(obj.id+"_togglebtn");
					this.eventAdd("click",function(){toggle(obj.id)});
					//obj.appendChild(sortHandle);
					//
				}				
				if(handle!==false){
					var sortHandle = document.createElement('a');
					sortHandle.setAttribute("id",obj.id+"_sorthandle");
					sortHandle.setAttribute('onmouseover',"this.style.cursor='n-resize'");
					sortHandle.className = 'sorthandle';
					obj.insertBefore(sortHandle,obj.firstChild.nextSibling);
					//obj.appendChild(sortHandle);
					$.DOMElements[0] = document.getElementById(obj.id+"_sorthandle");
				}
				this.eventAdd("mousedown",initSort = function(e){
					if(!e){ var e = window.event;}
					var mouse = $.mousePosition(e);
					var dimensions = $.dimensions(obj);
					obj.style.left = dimensions.left+"px";
					obj.style.top = dimensions.top+"px";
					obj.style.position = 'absolute';
					obj.style.zIndex = '10';
					obj.style.cursor = 'move';
					var placeHolder = document.createElement('div');
					placeHolder.setAttribute("id","placeHolder");
					placeHolder.style.height = dimensions.height+"px";
					placeHolder.style.width = dimensions.width+"px";
					placeHolder.style.backgroundColor = '#333333';
					sortList.insertBefore(placeHolder,document.getElementById(obj.id));
					var difX = mouse.x-dimensions.left;
					var difY = mouse.y-dimensions.top;	
					if (startaction !== false){ startaction();};
					$(document).eventAdd("mousemove",startSort = function(e){ 
						if(!e){ var e = window.event;}
						var mouse = $.mousePosition(e);
						if(axis==='x' || axis===false){ obj.style.left = (mouse.x-difX)+'px';};
						if(axis==='y' || axis===false){ obj.style.top = (mouse.y-difY)+'px';};
						for(var i=0; i<sortList.children.length; i++){
							var top = sortList.children[i].offsetTop;
							var bottom = sortList.children[i].offsetTop+sortList.children[i].offsetHeight;
							if((mouse.y-difY)>top && (mouse.y-difY)<bottom){
								sortList.removeChild(placeHolder);
								if(i<sortList.children.length){
									sortList.insertBefore(placeHolder,sortList.children[i]);
								} else {
									sortList.appendChild(placeHolder);
								}
							}
						}
						if (whileaction !== false){ whileaction();};
						if (window.getSelection){ window.getSelection().removeAllRanges();};
						return false;
					});
					$(document).eventAdd("mouseup",stopSort = function() {
						sortList.replaceChild(obj,placeHolder);
						obj.style.position = '';
						obj.style.cursor = 'default'; 
						$(document).eventRemove("mousemove",startSort); 
						$(document).eventRemove("mouseup",stopSort);
						if (endaction !== false){ endaction();};
						return false;
					});
					return false;
				});
				return this;
			},
			tooltip:function(value){
				var obj = $.DOMElements[0];
				var toolTip = document.createElement('div');
				toolTip.setAttribute("id",'tooltip');
				toolTip.className = 'tooltip';
				toolTip.style.opacity = 0.3;
				toolTip.style.filter = "alpha(opacity=" + 30 + ")";
				toolTip.innerHTML = '<div class="tooltipText">'+value+'</div>';
				obj.appendChild(toolTip);
				$.DOMElements[0] = toolTip;
				this.animate('fade',{startO:0.3,endO:1,speed:30});
				this.animate('move',{startX:0,startY:-100,endX:0,endY:-110,speed:30});
				$.DOMElements[0] = obj;
				return this;
			},
			animate:function(type, opts, endAction){	
				element = $.DOMElements[0];
				var speed = opts.speed ? speed = opts.speed : speed = 5;
				var delay = opts.delay ? delay = opts.delay : delay = 0;
				var style = opts.style ? style = opts.style : style = styleLinear;
				var loop = opts.loop ? loop = opts.loop : loop = 0;
				switch (type) {
    				case 'fade':
						var startO = opts.startO ? startO = opts.startO : startO = ($.DOMElements[0].style.opacity!=='' ? $.DOMElements[0].style.opacity : 1);
						var endO = opts.endO ? endO = opts.endO : endO = ($.DOMElements[0].style.opacity!=='' ? $.DOMElements[0].style.opacity : 0);					
						action = function(){		
							this.element.style.opacity = this.startO + this.style(this.now/100) * (this.endO-this.startO);
							this.element.style.filter = "alpha(opacity="+(this.element.style.opacity*100)+")";
						};
						effect = new $.animation.effectObject(element, delay, speed, action, style, loop, endAction);
						effect.element = element;
						effect.startO = startO;
						effect.endO = endO;					
					break;
					case 'move':
						var startY = opts.startY ? startY = opts.startY : startY = $.DOMElements[0].offsetTop;
						var endY = opts.endY ? endY = opts.endY : endY = $.DOMElements[0].offsetTop;
						var startX = opts.startX ? startX = opts.startX : startX = $.DOMElements[0].offsetLeft;
						var endX = opts.endX ? endX = opts.endX : endX = $.DOMElements[0].offsetLeft;					
						$.animation.changeNumber(element, "top", "px", startY, endY, speed, delay, style, loop, endAction);
						$.animation.changeNumber(element, "left", "px", startX, endX, speed, delay, style, loop);
						break;
					case 'scale':
						var startW = opts.startW ? startW = opts.startW : startW = $.DOMElements[0].offsetWidth;
						var endW = opts.endW ? endW = opts.endW : endW = $.DOMElements[0].offsetWidth;
						var startH = opts.startH ? startH = opts.startH : startH = $.DOMElements[0].offsetHeight;
						var endH = opts.endH ? endH = opts.endH : endH = $.DOMElements[0].offsetHeight;						
						$.animation.changeNumber(element, "width", "px", startW, endW, speed, delay, style, loop, endAction);
						$.animation.changeNumber(element, "height", "px", startH, endH, speed, delay, style, loop);
					break;
					case 'zoom':
						var startW = opts.startW ? startW = opts.startW : startW = $.DOMElements[0].offsetWidth;
						var endW = opts.endW ? endW = opts.endW : endW = $.DOMElements[0].offsetWidth;
						var startH = opts.startH ? startH = opts.startH : startH = $.DOMElements[0].offsetHeight;
						var endH = opts.endH ? endH = opts.endH : endH = $.DOMElements[0].offsetHeight;						
						$.animation.changeNumber(element, "height", "%", startH, endH, speed, delay, style, loop, endAction);
						//$.animation.changeNumber(element, "width", "px", startH, endH, speed, delay, style, loop);
					break;					
					default:
					break;
				}
				return this;
			}
		};
	};
	// AJAX
	ssPro.ajax = function(){
	  function handleReadyState(o, callback){
		if (o && o.readyState === 4 && o.status === 200) {
		  if (callback) { 
			callback(o);
		  }
		}
	  }
	  var getXHR = function(){
		var http;
		try{
		  http = new XMLHttpRequest;
			getXHR = function(){
			  return new XMLHttpRequest;
			};
		}
		catch(e){
		  var msxml = [
			'MSXML2.XMLHTTP.3.0',
			'MSXML2.XMLHTTP',
			'Microsoft.XMLHTTP'
		  ];
		  for (var i=0, len = msxml.length; i < len; ++i) {
			try {
			  http = new ActiveXObject(msxml[i]);
			  getXHR = function() {
				return new ActiveXObject(msxml[i]);
			  };
			  break;
			}
			catch(e) {}
		  }
		}
		return http;
	  };
	  return function(method, uri, callback, postData) {
		var http = getXHR();
		http.open(method, uri, true);
		//handleReadyState(http, callback);
		http.onreadystatechange = function(){handleReadyState(http, callback)};
		http.send(postData || null);
		return http;
	  };
	}();
	// UNDO LIST
	ssPro.history = new function()
	{
		this.undolist = [];
		this.redolist = [];
		this.add = function(val){
			this.undolist.push(val);
		};
		this.addRedo = function(val){
			this.redolist.push(val);
		};		
		this.remove = function(){
			this.undolist.pop();
		};
		this.undo = function(){
			if(this.undolist.length>0){
				undoAction = this.undolist[(this.undolist.length-1)];
				if(undoAction[0]==="freeTransform"){
					obj = document.getElementById(undoAction[1]);
					var dimensions = $.dimensions(obj);
					this.addRedo([undoAction[0],undoAction[1],dimensions.left,dimensions.top,dimensions.width,dimensions.height,undoAction[6]]);
					$(undoAction[1]).animate('scale',{endW:undoAction[4],endH:undoAction[5],speed:10,style:styleSin},undoAction[6]);
					$(undoAction[1]).animate('move',{endX:undoAction[2],endY:undoAction[3],speed:10,style:styleSin});
					this.undolist.pop();
				}
			}
		};
		this.redo = function(){
			if(this.redolist.length>0){
				redoAction = this.redolist[(this.redolist.length-1)];
				if(redoAction[0]==="freeTransform"){
					obj = document.getElementById(undoAction[1]);
					var dimensions = $.dimensions(obj);
					this.add([redoAction[0],redoAction[1],dimensions.left,dimensions.top,dimensions.width,dimensions.height,undoAction[6]]);					
					$(redoAction[1]).animate('scale',{endW:redoAction[4],endH:redoAction[5],speed:10,style:styleSin},undoAction[6]);
					$(redoAction[1]).animate('move',{endX:redoAction[2],endY:redoAction[3],speed:10,style:styleSin});
					this.redolist.pop();
				}
			}
		};		
	};
	// ANIMATION
	ssPro.animation = new function(){
		this.effects = [];
		this.interval;
		this.frequency = 30;
		this.remove = function(effect){
			var i = 0;
			while(i < this.effects.length){
				if (this.effects[i] === effect){
					this.effects.splice(i, 1);
				} else {
					i++;
				}
			}
			if(this.effects.length === 0){
				window.clearInterval(this.interval);
			}
		};
		this.tick = function(){
			for (var i=0; i<this.effects.length; i++){			
				this.effects[i].tick();
			}
		};
		this.add = function(effect){
			this.effects.push(effect);
			if (this.effects.length === 1){
				this.interval = window.setInterval(function() {$.animation.tick();}, this.frequency);	
			}
		}
	};
	ssPro.animation.changeNumber = function(element, what, suffix, value1, value2, speed, delay, style, loop, endAction)
	{
		action = function(){
			this.element.style[this.what] = Math.round(this.value1 + this.style(this.now/100)*(value2-value1)) + suffix;
		};
		effect = new $.animation.effectObject(element, delay, speed, action, style, loop, endAction);
		effect.element = (typeof element === 'string') ? document.getElementById(element) : element;
		effect.what = what;
		effect.value1 = value1;
		effect.value2 = value2;
	};
	ssPro.animation.effectObject = function(elementId, delay, speed, action, style, loop,  endAction) 
	{		
		this.elementId = elementId;
		this.delay = (delay === undefined) ? 0 : delay;
		this.speed = speed;
		this.now = 0;
		this.action = action;
		this.endAction = endAction;
		this.loop = (loop === undefined) ? false : loop;
		this.style = (style === undefined) ? styleSin : style;
		this.tick = function()
		{
			if (this.delay > 0){
				this.delay--;
				return;
			};
			if (this.now > 100){
				if (this.loop){
					this.now = 0;
				} else {
					$.animation.remove(this);				
					if (this.endAction !== undefined) { this.endAction();}
				}
			} else {
				if (typeof elementId === 'string' && document.getElementById(elementId) === null){
					$.animation.remove(this);
					return;
				}	
				this.action();
				this.now += this.speed;
				if (this.now > 100){ 
					this.now = 101;
				}
			};
		};
		$.animation.add(this);
	};
	ssPro.mousePosition = function(e)
	{
		var posX = 0;
		var posY = 0;
		if(!e){ var e = window.event;}
		if (e.pageX || e.pageY){
			posX = e.pageX;
			posY = e.pageY;
		}
		else if (e.clientX || e.clientY){
			posX = e.clientX+document.body.scrollLeft+ document.documentElement.scrollLeft;
			posY = e.clientY+document.body.scrollTop+ document.documentElement.scrollTop;
		}
		return {x:posX,y:posY};
	};
	ssPro.dimensions = function(obj)
	{
		var l = obj.offsetLeft;
		var t = obj.offsetTop;
		var w = obj.offsetWidth;
		var h = obj.offsetHeight;
		return {left:l,top:t,width:w,height:h};
	};
	window.ssPro = window.$ = ssPro;
})(this, document);

function styleLinear(x) { return x; }
function styleSin(x) { return Math.sin(x*Math.PI/2); }
function stylePulse(x) { return (Math.sin(x*2*Math.PI) + 1) / 2; }
function styleBounce(x) { return (x === 0) ? 0 : (((-Math.sin(x*25)/(x*25))+1)*(1-x))+x; }
function styleBounceLess(x) { return (x === 0) ? 0 : (((-Math.sin(x*15)/(x*15))+1)*(1-x))+x; }
function styleBounceMore(x) { return (x === 0) ? 0 : (((-Math.sin(x*35)/(x*35))+1)*(1-x))+x; }


//function findPos(obj) {
	//var curleft = curtop = 0;
	//if (obj.offsetParent) {
	//	do {
	//		curleft += obj.offsetLeft;
	//		curtop += obj.offsetTop;
	//	} while (obj = obj.offsetParent);
	//}
	//return [curleft,curtop];
//}	

