(function($,$M){
	//Static Logger
	var log = $.Logging.getLogger('AlphabetCity.Models.Necklace');
	
	/**
	*   Necklace Domain Object
	*/
	$M.Necklace$Class = {
		$xmlns:"http://jillplatner.com/alphabetcity",
	    constructor : function(options){
	        $.extend(this, $M.Necklace$Class, $M.Necklace);
	        $.extend(true, this, options, {
	        		$sku				: window.location.pathname.slice(window.location.pathname.lastIndexOf('/')+1),
	            $collection	: COLLECTION.SILVER,
	            $length		: LENGTH.MEDIUM,
	            //$clasp	: CLASP.SMALL,
	            //$cord		: CORD.BLACK,
	            $block		: []
	        });
	    }
	};$M.Necklace = $M.Necklace$Class.constructor;
	
	//An enumeration of the valid metals
	var COLLECTION = {
		SILVER	: "SILVER",
		GOLD	: "GOLD"	
	};
	
	//An enumeration of the valid lengths
	var LENGTH = {
		MEDIUM	: "25",
		LONG	: "31"	
	};
	
	//An enumeration of the valid clasp types
	/*var CLASP = {
		SMALL	: "SMALL",
		LARGE	: "LARGE"	
	};*/
	
	//An enumeration of the valid clasp types
	/*var CORD = {
		BLACK	: "BLACK",
		BROWN	: "BROWN",
		WHITE	: "WHITE"	
	};*/
	
	var COST = {
		SILVER:{
			BASE : 195,
			EXTRA : 27.50,
			INCLUDED: 3
		},
		GOLD:{
			BASE	: 1760,
			EXTRA	: 850,
			INCLUDED: 1
		}
	};
	
	
	//Some Super-Simple Static Validation and Serialization
	$.extend($M.Necklace,{
		validate: function(necklace, property){
			var checkall = property ? false : true;
			var flash = [], i;
			var valid = true;
    		if((checkall || property=='collection')  && 
    			!(necklace.$collection == COLLECTION.SILVER
    			|| necklace.$collection == COLLECTION.GOLD )){
    			flash.push("The collection must be silver or gold.");
    			valid = false;
    		}
    		if((checkall || property=='length') && 
    			!( necklace.$length == LENGTH.MEDIUM 
    			|| necklace.$length == LENGTH.LONG )){
    			flash.push("The length must be 21\" or 35\".");
    			valid = false;
    		}
    		//The clasp and cold color are not configuratble at this time
    		/*if((checkall || property=='clasp') && 
    			!(necklace.$clasp == CLASP.SMALL
    			|| necklace.$clasp == CLASP.LARGE )){
    			flash.push("The clasp must be small or large.");
    			valid = false;
    		}
    		if((checkall || property=='cord') && 
    			!(necklace.$cord == CORD.BLACK
    			|| necklace.$cord == CORD.BROWN 
    			|| necklace.$cord == CORD.WHITE )){
    			flash.push("The cord color must be black, brown, or silver.");
    			valid = false;
    		}*/
    		if((checkall || property=='block')){
				//do some comple business logic on the model
				//to verify it's a sane configuration of letter codes
				//and metals
				if(necklace.$block.length < 1){
					flash.push("You must specify at least one block");
		    		valid = false;
				}
    			for(i=0;i<necklace.$block.length;i++){
    				if(false){
		    			flash.push("The block are not in a valid configuration.");
		    			valid = false;
    				}
    			}
    		}
    		return {
    			valid: valid,
    			flash: flash
    		};
	    },
	    cost:function(necklace){
	    	//calculates the cost of the given necklace
	    	var cost = 0, i, included = 0;
	    	//Caluclate the base cost
	    	if(necklace.$metal == COLLECTION.SILVER){
	    		cost = cost + COST.SILVER.BASE;
	    		for(i=0;i<necklace.$block.length;i++){
	    			if(necklace.$block[i].metal == COLLECTION.SILVER){
	    				if(included >= COST.SILVER.INCLUDED){
	    					cost = cost + COST.SILVER.EXTRA;
    					}else{
    						included++;
    					}
	    			}else if(necklace.$block[i].metal == COLLECTION.GOLD){
	    				cost = cost + COST.GOLD.EXTRA;
	    			}
	    		}
	    	}else{
	    		cost = cost + COST.GOLD.BASE;
	    		for(i=0;i<necklace.$block.length;i++){
	    			if(necklace.$block[i].metal == COLLECTION.SILVER){
	    				cost = cost + COST.SILVER.EXTRA;
	    			}else if(necklace.$block[i].metal == COLLECTION.GOLD){
	    				if(included >= COST.GOLD.INCLUDED){
	    					cost = cost + COST.GOLD.EXTRA;
    					}else{
    						included++;
    					}
	    			}
	    		}
	    	}
	    	return cost;
	    },
	    submit: function(necklace, url, callback){
	    	$.ajax({
	    		url: url,
	    		type:"POST",
	    		dataType:"html",
	    		data:$M.Necklace.fieldEncode(necklace),
	    		success:function(html){
	    			log.info("Successfully submitted to cart.");
	    			if(callback){callback(html);}
	    		},
	    		error: function(xhr, status, e){
	    			log.error("Failed to add to cart. %s", status).exception(e);
	    		}
	    	});
	    },
	    js: function(necklace){
	    	var js = {}, prop;
	    	for(prop in necklace){ if(!($.isFunction(prop)) && !(prop == 'prototype')){
	    		js[prop] = necklace[prop];		
	    	}};
	    	return js;
	    },
	    fieldEncode:function(necklace){
	    	var blockHash = "", j = 0;
	    	for(j=0;j<necklace.$block.length;j++){
	    		blockHash += necklace.$block[j].code.toUpperCase();
	    		blockHash += necklace.$block[j].metal==COLLECTION.SILVER?"S":"G";
	    		blockHash += ",";
	    	}
	    	return {
	    		sku 				: necklace.$sku,
	    		collection	: necklace.$collection,
	    		length			: necklace.$length,
	    		letters			: blockHash
	    	};
	    },
	    json: function(necklace){
	    	var prop, attr=[];
	    	for(prop in necklace){ if(!($.isFunction(prop))){
	    		attr.push(attr+" : "+necklace[prop]);		
	    	}};
	    	return "{ necklace: {\n"+
	    		attr.join(",\n")+"\n"+
	    	"}}";
	    },
	    xml: function(necklace){
	    	var prop, attr=[];
	    	for(prop in necklace){ if(!($.isFunction(prop))){
	    		attr.push(attr.replace('$','')+'="'+necklace[prop]+'"');		
	    	}};
	    	return "<necklace \n"+
	    		+"\t"+attr.join("\n\t")+
	    	"/>";
	    },
	    cvs: function(necklace){
	    	var prop, attr=[], val=[];
	    	for(prop in necklace){ if(!($.isFunction(prop))){
	    		attr.push(attr);
	    		value.push(necklace[prop]);		
	    	}};
	    	return attr.join(",")+"\n"+val.join(",");
	    }
    });

})(jQuery, AlphabetCity.Models);