/*
jquery.navActives
version 0.1.1.1 alpha
10/17/2008

stephen rushing
copyright 2008

"each" is alterElements.element keyword for each item in the object's selector

*/


jQuery.fn.navActives = function(options, callback){
    
	var settings = {
        matchUrl: "http://url/",
		defaultPages: ["default.aspx", "default.htm", "default.html", "index.html"],
		ignorePageAnchors:true,
		ignoreQueryStrings:true,
		alterElements: [{element:"each", className:"className"}],
		rigidity:[1,2],
		callback:null
    };
    if (options) {
        jQuery.extend(settings, options);
    }	
    var jQueryParent = jQuery(this);
	
	var activeLinks = [];
	var highestMatch=0;
    var objIdx = 0;	
    this.each(function(){
        jQueryChild = jQuery(this);
		
		var tmpLinkRef = {
            link:this,
            rigidity: -1,
            alterElements:[]
		};	
		//get link and highest rigidity match

		for(r=0;r<settings.rigidity.length && (jQueryChild.attr("href")!="#");r++){
			
			if(linkMatch(this.href, settings.matchUrl, settings.rigidity[r])){
	            tmpLinkRef.rigidity = settings.rigidity[r];
				if(tmpLinkRef.rigidity >= highestMatch){
					highestMatch = tmpLinkRef.rigidity;
				}
				//console.log(this);
				//console.log(tmpLinkRef.rigidity + " : " +highestMatch);
				
			}else{
				break;
			}
		}
		
		if(tmpLinkRef.rigidity>-1){
			
			activeLinks.push(tmpLinkRef);
			//set elements that need to be altered
			var tmpAlterEl;
			for(var ae=0; ae<settings.alterElements.length; ae++){						
				tmpAlterEl = eval(settings.alterElements[ae].element.replace("each","jQueryChild"));
				if(tmpAlterEl){
					activeLinks[activeLinks.length-1].alterElements.push({
						element: tmpAlterEl[0],
						idx: ae
					});	
					//console.log(tmpAlterEl[0]);	
					//console.log(jQuery(activeLinks[ae].alterElements[activeLinks[ae].alterElements.length-1].link).attr("href"));		
				}		
			}
		}
		
		
		//execute the callbacks
        if (settings.callback != null) {
            settings.callback(this, activeLinks, highestMatch);
        }
        objIdx++;
    });
	
	var levelsMarked = [];
	
	//read through activeLinks and set classes to alterable elements
	for(var al=0; al<activeLinks.length; al++){				
	//console.log(activeLinks[al].link +"\nrigidity: "+activeLinks[al].rigidity +"\nalterElements: "+activeLinks[al].alterElements.length);
		
		if(levelsMarked.indexOf(activeLinks[al].rigidity)<0){
			for(var ae=0; ae<activeLinks[al].alterElements.length; ae++){			
				//console.log(activeLinks[al].alterElements[ae].element);				
				if(activeLinks[al].rigidity==highestMatch){					
					jQuery(activeLinks[al].alterElements[ae].element).addClass(settings.alterElements[activeLinks[al].alterElements[ae].idx].className);
					levelsMarked.push(activeLinks[al].rigidity);
				}					
			}		
		}
				
	}
	
	//callback!
	if(callback != null){
    	callback(jQueryParent, activeLinks, highestMatch);
	}
	
	
	
	
	
	function linkMatch(url1, url2, rigidity){
		
		//remove default pages
		for(var dp=0;dp<settings.defaultPages.length;dp++){
			if(url1.indexOf(settings.defaultPages[dp])>-1) url1 = url1.replace(settings.defaultPages[dp],"");
			if(url2.indexOf(settings.defaultPages[dp])>-1) url2 = url2.replace(settings.defaultPages[dp],"");
		}
		//remove anchors if specified
		if(settings.ignorePageAnchors){
			var pathRemoveAnchors = /\#.*$/;		
			url1 = url1.replace(pathRemoveAnchors, "");
			url2 = url2.replace(pathRemoveAnchors, "");
		}
		//remove query strings if specified
		if(settings.ignoreQueryStrings){
			var pathRemoveQueryStrings = /\?.*$/;		
			url1 = url1.replace(pathRemoveQueryStrings, "");
			url2 = url2.replace(pathRemoveQueryStrings, "");
		}
		//split the urls into an array for comparison
		var pathSplitter = /\/|\?|\#|http:|https:|www/;		
		url1 = url1.split(pathSplitter);
		url2 = url2.split(pathSplitter);
		
		//remove empty items from urls
		while(url1.indexOf("")>-1){
			url1.remove(url1.indexOf(""));
		}
		while(url2.indexOf("")>-1){
			url2.remove(url2.indexOf(""));
		}
		
		//console.log(url1 + " : " + url2);
		
		//url1 = url1.splice(0, rigidity);
		//url2 = url2.splice(0, rigidity);
		if(url1.length<=rigidity || url2<=rigidity){
			return false;
		}
		
		//compare and return
		//console.log((url1[rigidity]==url2[rigidity]) + "\nurl1: " + url1 + "\nurl2: " + url2 + "\nRigidity: "+ rigidity + "\n---------------------------------");
		if(url1[rigidity]==url2[rigidity]){
			return true;	
		}else{
			return false;	
		}
	}
	
	return(this);

}
	

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};



