	var gtime = 0;
	var lastCoord = [0,0];

	$(document).ready(function(){
		$(".magnet").each(function(i) { 
			initMagnet(this);
			if (this.tagName == 'IMG') {
				$(this).bind("load", function(e) { initMagnet(this); });
			} 
		});
	});


	function animateMag(mag,x,y) {
		var time = (new Date()).getTime();
		
		if (gtime+50 < time) {
		
			gtime = time;
			if (x > lastCoord[0]+8) {

				if (y > lastCoord[1]+8) {
					end = 0;
				} else if (y < lastCoord[1]-8) {
					end = 4;
				} else {
					end = 4;
				}
				
			} else if (x < lastCoord[0]-8) {
				if (y > lastCoord[1]+8) {
					end = 4;
				} else if (y < lastCoord[1]-8) {
					end = 0;
				} else {
					end = 0;
				}
			} else {
				if (y > lastCoord[1]+8) {
					end = 2;
				} else if (y < lastCoord[1]-8) {
					end = 2;
				} else {
					end = null;
				}
			}
			
			if (end != null && $(mag).attr('src')) {
				var cPos = parseInt($(mag).attr('pos'));
				if (cPos < end) {
					$(mag).attr('pos',cPos+1);
					var str = cPos + '.png';
					$(mag).attr('src',$(mag).attr('src').replace(str,(cPos+1)+'.png'));
				} else if (cPos > end) {
					$(mag).attr('pos',cPos-1);
					var str = cPos + '.png';
					$(mag).attr('src',$(mag).attr('src').replace(str,(cPos-1)+'.png'));
				} //end if-else
			}
			
			lastCoord = [x,y];		
		} //end if
	} //end func

	function initMagnet(mag) {
		//alert(mag);
		$(mag).unbind("load");
		$(mag).draggable({
			//containment: [150,120,914,659],			
			stack: { group: $(".magnet"), min:500 },
			start: function(e, ui) {
				//$('#myMags').after($(mag));
				gtime = (new Date()).getTime();
				lastCoord = [parseInt(e.target.style.left),parseInt(e.target.style.top)];
			},
			drag: function(e, ui) {
				animateMag(e.target,ui.absolutePosition.left,ui.absolutePosition.top);
			},
			stop: function(e, ui) { 
				if ($('#reset').css('display') == 'none') { $('#reset').fadeIn(700); }

				if (checkPoint(ui.absolutePosition.left,ui.absolutePosition.top,$(e.target).width(),$(e.target).height()) || $(e.target).attr('restrict')) {
  
					if ($(e.target).parent().attr('id') == 'myMags') {
						$('#container').append($(mag));
						$(mag).css('position','absolute');
						$(mag).css('left',ui.absolutePosition.left).css('top',ui.absolutePosition.top);
						if ($('#myMagsContainer img').length == 0 && $('#myMagsContainer').css('display') == 'block') {
							$('#myMagsContainer').fadeOut(700);
						}
					}
					
					// Ajax call back					
					recordPos(e.target);
					
				} else {
					$(e.target).animate({ top:'900px' }, (900-ui.position.top)*0.66, null, function() { 
						
						if ($('#myMags img').length > 0) { 
							var order = parseInt($('#myMags img:last').attr('zindex'))+1;
						} else {
							var order = 1;
						}

						if (f7id == -1) {
							$(this).remove();
						} else {
							droppedMags(this);
							$(this).attr('zindex',order);
						}
						$.post('/callback.cfm',{ action:'position', canvas: canvasId, sessionId: f7id, instance: e.target.id.split('_')[1], frame: $(e.target).attr('pos'), posX: '', posY: '', zIndex: order });
					});
				} //end if
			}
		}); //end draggable
		
		if ($(mag).attr('restrict')) { $(mag).draggable('option', 'containment',  [(186-parseInt($(mag).width())/5),(130-parseInt($(mag).height())/5),(914-parseInt($(mag).width())/5*4),(659-parseInt($(mag).height())/5*4)]); }
		
	} //end func


	function recordPos(target) {
		var position = { 'instance': new Array(), 'frame': new Array(), 'xPos': new Array(), 'yPos': new Array(), 'zIndex': new Array()};

		$(".magnet").each(function(i) { 						
			if (($(this).attr('zindex') != $(this).css('z-index') || $(this).attr('id') == target.id) && $(this).css('z-index') && $(this).css('position') != 'relative') {
				position.instance.push($(this).attr('id').split('_')[1]);
				position.frame.push($(this).attr('pos'));
				position.xPos.push(parseInt($(this).css('left')));
				position.yPos.push(parseInt($(this).css('top')));
				position.zIndex.push($(this).css('z-index'));
				$(this).attr('zindex',$(this).css('z-index'));
			}
		});
		
		$.post('/callback.cfm',{ action: 'position', canvas: canvasId, sessionId: f7id, instance: position.instance, frame: position.frame, posX: position.xPos, posY: position.yPos, zIndex: position.zIndex });
	} //end func

	function checkPoint(x,y,width,height) {
		// Set magnet dims
		var dims = [parseInt(width/5),parseInt(height/6)];
		var center = [parseInt(width/2),parseInt(height/2)];
		
		if (
			inpoly(xVals.length,xVals,yVals,(x+center[0]-dims[0]),(y+center[1]-dims[1])) &&
			inpoly(xVals.length,xVals,yVals,(x+center[0]+dims[0]),(y+center[1]-dims[1])) &&
			inpoly(xVals.length,xVals,yVals,(x+center[0]+dims[0]),(y+center[1]+dims[1])) &&
			inpoly(xVals.length,xVals,yVals,(x+center[0]-dims[0]),(y+center[1]+dims[1])) 
			|| 
			inpoly(xVals2.length,xVals2,yVals2,(x+center[0]-dims[0]),(y+center[1]-dims[1])) &&
			inpoly(xVals2.length,xVals2,yVals2,(x+center[0]+dims[0]),(y+center[1]-dims[1])) &&
			inpoly(xVals2.length,xVals2,yVals2,(x+center[0]+dims[0]),(y+center[1]+dims[1])) &&
			inpoly(xVals2.length,xVals2,yVals2,(x+center[0]-dims[0]),(y+center[1]+dims[1])) 
			) { 
	   		return true;
		}
		return false;
	} //end func

	
	// Find point in complex polygon
	function inpoly(nvert, vertx, verty, testx, testy) {
		  var i, j, c = 0;
		  for (i = 0, j = nvert-1; i < nvert; j = i++) {
			if ( ((verty[i]>testy) != (verty[j]>testy)) && (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) ) {
			   c = !c;
			} //end if
		  } // end for
		  return c;
		} //end func

	// Top Polygon
	var xVals = [193,340,490,630,775,910,915,914,775,630,490,340,182,186];
	var yVals = [140,123,119,122,132,153,179,659,641,632,630,634,650,173];

	// Bottom Polygon
	var xVals2 = [183,340,490,630,775,915,915,183];
	var yVals2 = [726,742,750,751,744,732,865,865];



	function droppedMags(mag) {	
		$('#myMags').append($(mag));
		$(mag).css('position','relative').css('top','0px').css('left','0px');
		if ($('#myMagsContainer').css('display') == 'none') {
			$('#myMagsContainer').fadeIn(700);
		}
	} //end func


	function resetMags() {
		$('#reset').fadeOut(700);
		
		$(".magnet").each(function(i) {
			if ($(this).css('position') == 'relative') {
				offset = $(this).offset();
				$('#container').append($(this));
				$(this).css('position','absolute').css('left',offset.left).css('top',offset.top);
			}

			$(this).animate({ left:$(this).attr('origX')+'px',top:$(this).attr('origY')+'px' },500, function() { }).css('z-index',$(this).attr('origZ')).attr('zindex',$(this).attr('origZ'));
			if ($(this)[0].tagName == 'IMG') { $(this).attr('src',$(this).attr('src').replace('_'+$(this).attr('pos')+'.png','_'+$(this).attr('origPos')+'.png')); }
			
		});
		
		$('#myMagsContainer').fadeOut(700);

		var position = { 'instance': new Array(), 'frame': new Array(), 'xPos': new Array(), 'yPos': new Array(), 'zIndex': new Array()};

		$(".magnet").each(function(i) { 						
			position.instance.push($(this).attr('id').split('_')[1]);
			position.frame.push($(this).attr('origPos'));
			position.xPos.push(parseInt($(this).attr('origX')));
			position.yPos.push(parseInt($(this).attr('origY')));
			position.zIndex.push($(this).attr('origZ'));
		});
		
		$.post('/callback.cfm',{ action: 'position', canvas: canvasId, sessionId: f7id, instance: position.instance, frame: position.frame, posX: position.xPos, posY: position.yPos, zIndex: position.zIndex });
		
	} //end func


	function dialog() {

		var viewportWidth = $(window).width(); 
		var viewportHeight = window.innerHeight ? window.innerHeight : $(window).height();
		var top = parseInt((viewportHeight-$('#dialog').height())/2);
		if (top < 30) { top = 30; }
		var left = parseInt((viewportWidth-$('#dialog').width())/2);
		if (left < 30) { left = 30; }		

		$('#modal').css({
			zIndex: 10000,
			width: 0,
			height: 0
		}).css({
			width: screenWidth(),
			height: screenHeight(),
			opacity: 0.5,
			filter: 'alpha(opacity=50)'
		}).fadeIn(700,function() {
	
		});

		$('#dialog').css('z-index','10001').css('top',top+'px').css('left',left+'px');
		$('#dialog').fadeIn(700);

		$(window).resize(function(e) {
			$('#modal').css({
				width: 0,
				height: 0
			}).css({
				width: screenWidth(),
				height: screenHeight()
			});	

			//var viewportWidth = $(window).width(); 
			//var viewportHeight = window.innerHeight ? window.innerHeight : $(window).height();
			//var top = parseInt((viewportHeight-$('#dialog').height())/2);
			//if (top < 30) { top = 30; }
			//var left = parseInt((viewportWidth-$('#dialog').width())/2);
			//if (left < 30) { left = 30; }			
	
			//$('#dialog').css('z-index','10001').css('top',top+'px').css('left',left+'px');

		});
	} //end function

	function mapPoints() {
		for (i=0;i<xVals.length;i++) {
			$("#footer").after('<div style="position:absolute;background-color:red;width:5px;height:5px;left:' + (xVals[i]-2) + 'px;top:' + (yVals[i]-2) + 'px"></div>');
		}	

		for (i=0;i<xVals2.length;i++) {
			$("#footer").after('<div style="position:absolute;background-color:green;width:5px;height:5px;left:' + (xVals2[i]-2) + 'px;top:' + (yVals2[i]-2) + 'px"></div>');
		}	
	}
	//mapPoints();
	
	
	$('#container').bind("mousedown", function(event) {
	   event.preventDefault();
	 } );
	
	
	function screenHeight() {
		// handle IE 6
		if ($.browser.msie && $.browser.version < 7) {
			var scrollHeight = Math.max(
				document.documentElement.scrollHeight,
				document.body.scrollHeight
			);
			var offsetHeight = Math.max(
				document.documentElement.offsetHeight,
				document.body.offsetHeight
			);

			if (scrollHeight < offsetHeight) {
				return $(window).height() + 'px';
			} else {
				return scrollHeight + 'px';
			}
		// handle "good" browsers
		} else {
			return $(document).height() + 'px';
		}
	}

	function screenWidth() {
		// handle IE 6
		if ($.browser.msie && $.browser.version < 7) {
			var scrollWidth = Math.max(
				document.documentElement.scrollWidth,
				document.body.scrollWidth
			);
			var offsetWidth = Math.max(
				document.documentElement.offsetWidth,
				document.body.offsetWidth
			);

			if (scrollWidth < offsetWidth) {
				return $(window).width() + 'px';
			} else {
				return scrollWidth + 'px';
			}
		// handle "good" browsers
		} else {
			return $(document).width() + 'px';
		}
	}
	
	
	function openPortfolio(portItem,portId) {

		$('#portfolioContent').html('').css('display','none');
		$.post('/callback.cfm',{ action: 'portfolio', portId: portId }, function (data, textStatus) { $('#portfolioContent').html(data).fadeIn(500); });
		

		var viewportWidth = $(window).width(); 
		var viewportHeight = window.innerHeight ? window.innerHeight : $(window).height();
		var top = parseInt((viewportHeight-$('#dialog').height())/2)+32;
		if (top < 62) { top = 62; }
		var left = parseInt((viewportWidth-$('#dialog').width())/2)+25;
		if (left < 55) { left = 55; }	

		$('#dialogImg').css({ 
			zIndex: 10002,
			top:parseInt($(portItem).css('top'))+'px',
			left:parseInt($(portItem).css('left'))+'px',
			//border: 'solid 1px #cccccc',
			width: $(portItem).width()+'px'
		})
		.bind('load', function(e) { 
			$(e.target).css({ border:'solid 1px #cccccc',left:left+'px',top:top+'px',width:'750px'});
			$(e.target).fadeIn(700, function() { $(e.target).unbind('load'); });
			dialog(); 
			//$(e.target).css('display','block').css('border','solid 1px #cccccc').animate({width:'750px',left:left+'px',top:top+'px'}, function() { dialog(); $(e.target).unbind('load'); });
		})
		.attr('origX',parseInt($(portItem).css('left'))+'px').attr('origY',parseInt($(portItem).css('top'))+'px')
		//.attr('src',$(portItem).attr("src").replace("_thumb.png",".jpg"))
		//.attr('src',$(portItem).attr("src").replace("/magnets/","/portfolio/"))
		.attr('src',$(portItem).attr("src").replace(/magnets\/(.+)\/(.+)_\d.png/i,"portfolio/$2_1.jpg"));
		
	} //end func
	
	function closePortfolio() {

		$('#modal').fadeOut(700);
		$('#dialogImg').fadeOut(700);
		$('#dialog').fadeOut(700, function() {
			//$('#dialogImg').animate({width:'184px',left:$('#dialogImg').attr('origX'),top:$('#dialogImg').attr('origY')}, function() { $('#dialogImg').hide() });											   
		});		

	} //end func
	
	
	function contactForm(form) {
		//alert($(form).serialize());	
		$.post('/callback.cfm', $(form).serialize(), function (data, textStatus) { eval(data); });
	}
	
	
	function autoGrow(minHeight,maxHeight) {
		var minHgt = minHeight ? minHeight:15;
		var maxHgt = maxHeight ? maxHeight:150;
	
		if ($('#textarea_holder')) {
			$('#textarea_holder').css('width',($('#comments').width()-5) + 'px');
			var html = $('#comments').val(); /*.replace(/(<|>)/g, '');*/
			html = html.replace(/\n/g, '<br>');
			$('#textarea_holder').html(html);
			if (html == '') {
				$('#comments').css('height',minHgt+ 'px');
			} else {
				
				var textHeight = $('#textarea_holder').height()+15;
				if (textHeight < minHgt) { textHeight = minHgt; }
				if (textHeight > maxHgt) { textHeight = maxHgt; $('#comments').css('overflow','auto'); } else { $('#comments').css('overflow','hidden'); }
				if (textHeight != $('#comments').height()) { $('#comments').animate({ height:(textHeight)+ 'px' }, 300 ); }
			}
		}
	}
	
	function postComment(type) {
		var errors = false;
		var errorList = '';
				
		if ($('#email').val() != '' && valEmail($('#email').val()) == false) {
			$('#email').css('border-color','#cc0000');
			errors = true;
			errorList = errorList + '<li>Please enter a valid email address.</li>';
		} else { $('#email').css('border-color',''); }
	
		if (trim($('#username').val()) == '') {
			$('#username').css('border-color','#cc0000');
			errors = true;
			errorList = errorList + '<li>Please enter your name.</li>';
		} else { $('#username').css('border-color',''); }
		
		if (trim($('#comments').val()) == '') {
			$('#comments').css('border-color','#cc0000');
			errors = true;
			errorList = errorList + '<li>Please enter a comment.</li>';
		} else { $('#comments').css('border-color','');}
	
		// Return errors
		if (errors == true) {
			$('#errorBox').html(errorList);
		} else {
			$('#postingComment').css('height',$('#commentInput').height() + 'px');
			$('#commentInput').css('display','none');
			$('#postingComment').css('display','');
			$('#errorBox').html('');
			
			// Post comment to server.
			$.post('/blog/default.cfm?' + Math.random() * 999999, { comments: 'add', aid: $('#aid').val(), name: $('#username').val(), email: $('#email').val(), comment: $('#comments').val()	}, function (data, textStatus) { 
				$('#postingComment').before(data);
				$('#postingComment').css('display','none');
				$('#commentInput').css('display','');
				$('#comments').val('');
				autoGrow(30,300);
			});
/*			new Ajax.Request('/includes/blog.cfm?' + Math.random() * 999999, {
				method:'post',
				postBody:'comments=add&aid=' + $('aid').value + '&name=' + $('username').value + '&email=' + $('email').value + '&comment=' + $('comments').value,  //'&notify=' + $('notify').checked +
				onSuccess: function(transport) { 
					$('postingComment').insert({ before:transport.responseText });
					$('postingComment').style.display='none';$('commentInput').style.display=''; $('comments').value=''; autoGrow(30,300); },
				onException: function(req,exception) { alert('Error: ' + exception.description); $('postingComment').style.display='none';$('commentInput').style.display=''; return true; },
				onFailure: function(transport) { alert('Error'); $('postingComment').style.display='none';$('commentInput').style.display=''; } 
			});			
*/	
		} //end if else
	}
	
	
	function showAllComments() {
		$('#showMoreComments').animate('opacity:0,filter:alpha(opacity=0)', 0.3, function() { 
				$('#showMoreComments').style.overflow = 'hidden';
				$('#showMoreComments').animate('height:1px', 0.2 ,function() { $('#showMoreComments').style.display ='none'; });
			}
		);
		$('#hiddenCommentsWrapper').animate('height:' + $('#hiddenComments').height() + 'px', 0.5, 
			function() { 
				$('#hiddenCommentsWrapper').style.height=''; 		
			}
		);
	}
	
	
	function valEmail(email) {
		invalidChars = " /:,;"
		if (email == "Required") {
			return false
		}
		for (i=0; i<invalidChars.length; i++) {
			badChar = invalidChars.charAt(i)
			if (email.indexOf(badChar,0) != -1) {
				return false
			}
		}
		atPos = email.indexOf("@",1)
		if (atPos == -1) {
			return false
		}
		if (email.indexOf("@",atPos+1) != -1) {
			return false
		}
		periodPos = email.indexOf(".",atPos)
		if (periodPos == -1) {
			return false
		}
		if (periodPos+3 > email.length)	{
			return false
		}
	
		return true
	}
	
	
	function ltrim(str) {
		while (1) {
			if (str.substring(0, 1) != " " && str.substring(0, 1) != "\n" && str.substring(0, 1) != "\r")
			break;
			str = str.substring(1, str.length);
		} //end while
		
		return str;
	} //end function
	
	
	function rtrim(str) {
		while (1) {
			if (str.substring(str.length - 1, str.length) != " " && str.substring(str.length - 1, str.length) != "\n" && str.substring(str.length - 1, str.length) != "\r")
			break;
			str = str.substring(0, str.length - 1);
		} //end while
		
		return str;
	} //end function
	
	
	function trim(str) {
		return ltrim(rtrim(str));
	} //end function	
	
	