jQuery(document).ready(function(){
	
	
	//jQuery('#px').jparallax({xtravel:0.09,ytravel:0.1,width:300});
	
	jQuery('input,textarea').focus(function(){	
		jQuery(this).addClass('focused');
		if(jQuery(this).val() == jQuery(this).attr('rel')){
			jQuery(this).val('');
		} 
	}).blur(function(){
		jQuery(this).removeClass('focused');
		if(jQuery(this).val() == ''){
			jQuery(this).val(jQuery(this).attr('rel'));
		}
	});
	
	jQuery('#email').submit(function(){
		
		
		
		var email = jQuery('.mail-signup input:first').val().toString();
		var valid =  /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
		if(!email.match(valid)){
			alert('Please enter a valid email address...');
			return false;
		}
		jQuery('.mail-signup p:first').html('Signing you up...');
		RemoteCall.handlers = {
			onData:function(d){
				jQuery('.mail-signup p:first').html('You\'re all signed up!');
				jQuery('#email').fadeOut('fast');
			},
			onError:function(er){
				alert(er);
			}
		}
		RemoteCall.make('contact_forms','mail_signup','{"email":"'+email+'","mailing_list_id":"1550141825"}');
		return false;
	});

	if(typeof jQuery('form').validationEngine != 'undefined'){
		jQuery('form').validationEngine();
	}
	
	jQuery('.home .latest-posts .headline').click(function(e){
		return load_blog_summary(jQuery(this).attr('id'));		
	});
	
});

function load_blog_summary(id){
	RemoteViewLoader.handlers = {
		onData:function(html){
			jQuery('#latest-post').html(html);
		},
		onError:function(har){
			alert(har);
		}
	}
	
	RemoteViewLoader.load('website','load_blog_summary', new Array(id));
	return false;
}


/* 	
	a few core workers that make life nicer/mvc friendly
		
	Modal object - launches a nice looking modal window and writes to it via: 
	
	launch_text(string) - populates html(string) via jQuery
	launch(address) - address matches an Alleki web publisher page address and renders that content (great for CMS powered help/tooltips!)
	launch_uri(uri) - a uri pattern useful if you want to render out of a front end application. ie 'users/login' renders a login form

*/
var Modal = {
	launch:function(address, width, height, top, xoffset, yoffset){	
		if(!width) width = 450;
		if(!height) height = 300;
		if(!top) top = 150;
		jQuery('body').append('<div class="modal" id="m-div" style="z-index:2000;"><div><img src="'+WEB_HOME+'images/loader-trans.gif" /></div></div>');
		var scroll = jQuery(document).scrollTop();
		var left = (jQuery(window).width() - width) / 2;
		jQuery('#m-div').css({"top":top + scroll,"left":left});
		jQuery('#m-div div').css({"width":width, "height":height});
		RemoteViewLoader.handlers = {
			onData:function(string){
				jQuery('#m-div div').html('<a href="javascript:Modal.close();" class="m-close"><span>close</span></a>' + string);
			},
			onError:function(){
				jQuery('#m-div div').html('<h1>ERROR:</h1><p>' + err + '</p>');
			}
		}
		RemoteViewLoader.load("modal_content","by_address",new Array(address));
		return false;
	},
	launch_text:function(text, width, height, top, xoffset, yoffset){
		
		if(!width) width = 450;
		if(!height) height = 300;
		if(!top) top = 150;
		jQuery('body').append('<div class="modal" id="m-div"><div><a href="javascript:Modal.close();" class="m-close"><span>close</span></a>'+text+'</div>');
		var scroll = jQuery(document).scrollTop();
		var left = (jQuery(window).width() - width) / 2;
		jQuery('#m-div').css({"top":top + scroll,"left":left});
		jQuery('#m-div div').css({"width":width, "height":height});
		
	},
	launch_uri:function(uri, width, height, top){
		if(!width) width = 450;
		if(!height) height = 300;
		if(!top) top = 150;
		jQuery('body').append('<div class="modal" id="m-div" style="z-index:2000;"><div><img src="'+WEB_HOME+'images/loader-trans.gif" /></div></div>');
		var scroll = jQuery(document).scrollTop();
		var left = (jQuery(window).width() - width) / 2;
		jQuery('#m-div').css({"top":top + scroll,"left":left});
		jQuery('#m-div div').css({"width":width, "height":height});
		var handlers = {
			onData:function(string){
				jQuery('#m-div div').html('<a href="javascript:Modal.close();" class="m-close"><span>close</span></a>' + string);
			},
			onError:function(){
				jQuery('#m-div div').html('<h1>ERROR:</h1><p>' + err + '</p>');
			}
		}
		var req = new Request(handlers);
			req.send(uri);
		return false;
	},
	close:function(){
		jQuery('#m-div').fadeOut().remove();
	},
	destroy:function(){
		jQuery('.modal').remove();
	}	
}



/* 
	ajax call wraper takes, controller, action and json object.  
*/
var RemoteCall = {
	handlers:null,
	make:function(controller, action, object, string){
		if(!string) string = true;
		var req = new Request(RemoteCall.handlers, string);
			req.send(WEB_HOME + "remotecall/?remote=1&name="+controller+"&action="+action+"&obj=" + object);
	}
}

var RemoteViewLoader = {
	handlers:null,
	load:function(controller, action, args){
		if(!args) args = new Array();
		var req = new Request(RemoteViewLoader.handlers, false);
			req.send(WEB_HOME + controller + "/" + action + "/" + args.join("/"));
	}
}

/*
	AJAX 2004 style! 
*/
function Request(handlers, evaluate){
  this.onData = handlers.onData;
  this.onError = handlers.onError ? handlers.onError : false;
  this.onLoading = handlers.onLoading ? handlers.onLoading : false;
  this.evaluate = evaluate;
  this.lastRequest = ""; 
  var xmlhttp=false;
  var This = this; // < anyone else remember that scoping nightmare??
  try { 
  	xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 	} catch (e) {
 		 try {
  	 		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  		  } catch (E) {
   			xmlhttp = false;
  		 }
 	}
   if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  		xmlhttp = new XMLHttpRequest();
    }
   this.stateChange = function( ){
		if ( xmlhttp.readyState == 4) {	
        	if (xmlhttp.status == 200) {
		    	var response = (xmlhttp.responseText) ? xmlhttp.responseText : ""; 
				if(This.evaluate){
					var result;
					var str = 'result = ' + response + ';';
					try{
						eval(str);
					}catch(e){
						This.onError(response);		
					}
					response = result;					
				}
				This.onData(response, This);
       		} else {
            	var e = xmlhttp.statusText;
				if(This.onError) This.onError(e, This);
        	}
	   }
   } 
   this.send = function( url, requestHeaders ) {
	  if(xmlhttp){		
	    	if(This.onLoading) This.onLoading();
  			xmlhttp.open("POST", url , true);
			xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 			xmlhttp.onreadystatechange = This.stateChange;
			This.lastRequest = url;
			xmlhttp.send(null);
	   }else{
		   if(This.onError) This.onError("Sorry, your browser does not support remote requests.");
	   }
   }
}

/*
	
	simple keyboard event observer object (supports: 'shift','ctl','up','down','left','right','tab')
	
	KeyEventObservers.add('dn', function(){
		console.log('Down key pressed!');
	});
	
*/
var KeyEventObservers = {
	list:null,
	add:function(key, handler){ 
		if(KeyEventObservers.list == null){
			 KeyEventObservers.list = new Object();
			 addWindowEventListener('keydown',KeyEventObservers.onkeydown, false);
			 addWindowEventListener('keyup',KeyEventObservers.onkeyup, false);
		}
		if(!KeyEventObservers.list[key]) KeyEventObservers.list[key] = new Array();
		KeyEventObservers.list[key].push(handler);			
	},
	onkeydown:function(e){
		if( ! KeyEventObservers.list[KeyMap.lookup(e.keyCode)]) return true;
		var observers = KeyEventObservers.list[KeyMap.lookup(e.keyCode)];
	    for(var o = 0; o < observers.length; o++){
			if(observers[o].down) observers[o].down(e);
		}
		return true;
	},
   	onkeyup:function(e){ 
		if( ! KeyEventObservers.list[KeyMap.lookup(e.keyCode)]) return true;
		var observers = KeyEventObservers.list[KeyMap.lookup(e.keyCode)];
	    for(var o = 0; o < observers.length; o++){
			if(observers[o].up) observers[o].up(e);
		}
		return true;
	}
}

var KeyMap = {
	names:['shift','ctl','up','down','left','right','tab'],
	//note: safari shift, ctl, and alt don't fire events!
	safari:[16,17,38,40,37,39,9],
	moz:[16,17,38,40,37,39,9],
	ie:[16,17,38,40,37,39,9],
	mac:[16,224,38,40,37,39,9],
	lookup:function(test){	
		var code = internet_explorer ? KeyMap.ie : KeyMap.moz;
		if(macintosh) code = KeyMap.mac;
		if(safari) code = KeyMap.safari;
		for(var i = 0; i < code.length; i++){
			if(code[i] == test)
				return KeyMap.names[i];
		}
		return "all";
	}
}

function addWindowEventListener(eventName, callback, bubble){
	if(window.addEventListener){          
		window.addEventListener(eventName, callback, bubble);
	} else {
		document.attachEvent('on' + eventName, callback);
	}                                                  
}


/*
	simple cookies object... 
	
	Cookies.set('key','value');
	
*/

var Cookies = {
	set:function(name, value, expires, path, domain, secure) {
  		var xtime = new Date(expires);
  		var curCookie = name + "=" + escape(value) +
      		((expires) ? "; expires=" + xtime.getUTCDate() : "") +
      		((path) ? "; path=" + path : "") +
      		((domain) ? "; domain=" + domain : "") +
      		((secure) ? "; secure" : "");
 		 document.cookie = curCookie;
	},
	get:function(name) {
  		var dc = document.cookie;
  		var prefix = name + "=";
  		var begin = dc.indexOf("; " + prefix);
  		if (begin == -1) {
   		 begin = dc.indexOf(prefix);
   		 if (begin != 0) return null;
  		} else
    		begin += 2;
  		var end = document.cookie.indexOf(";", begin);
  		if (end == -1)
    		end = dc.length;
  		return unescape(dc.substring(begin + prefix.length, end));
	},
	remove:function(name, path, domain) {
  		if (this.get(name)) {
    		document.cookie = name + "=" +
    		((path) ? "; path=" + path : "") +
    		((domain) ? "; domain=" + domain : "") +
    		"; expires=Thu, 01-Jan-70 00:00:01 GMT";
  		}
	},
	fixDate:function(date) {
  		var base = new Date(0);
  		var skew = base.getTime();
  		if (skew > 0)
    		date.setTime(date.getTime() - skew);
	}
}



var loadAllekiScriptResource = function(resource){
	
	jQuery('body').append('<script type="text/javascript" src="//www.alleki.com/javascript/'+resource+'.js"> </script>');
	
}
