//Get DOM elements based on the given CSS Selector - V 1.00.A Beta
//http://www.openjs.com/scripts/dom/css_selector/
function getElementsBySelector(all_selectors) {
	var selected = new Array();
	if(!document.getElementsByTagName) return selected;
	all_selectors = all_selectors.replace(/\s*([^\w])\s*/g,"$1");//Remove the 'beutification' spaces
	var selectors = all_selectors.split(",");
	// Grab all of the tagName elements within current context
	var getElements = function(context,tag) {
		if (!tag) tag = '*';
		// Get elements matching tag, filter them for class selector
		var found = new Array;
		for (var a=0,len=context.length; con=context[a],a<len; a++) {
			var eles;
			if (tag == '*') eles = con.all ? con.all : con.getElementsByTagName("*");
			else eles = con.getElementsByTagName(tag);

			for(var b=0,leng=eles.length;b<leng; b++) found.push(eles[b]);
		}
		return found;
	}

	COMMA:
	for(var i=0,len1=selectors.length; selector=selectors[i],i<len1; i++) {
		var context = new Array(document);
		var inheriters = selector.split(" ");

		SPACE:
		for(var j=0,len2=inheriters.length; element=inheriters[j],j<len2;j++) {
			//This part is to make sure that it is not part of a CSS3 Selector
			var left_bracket = element.indexOf("[");
			var right_bracket = element.indexOf("]");
			var pos = element.indexOf("#");//ID
			if(pos+1 && !(pos>left_bracket&&pos<right_bracket)) {
				var parts = element.split("#");
				var tag = parts[0];
				var id = parts[1];
				var ele = document.getElementById(id);
				if(!ele || (tag && ele.nodeName.toLowerCase() != tag)) { //Specified element not found
					continue COMMA;
				}
				context = new Array(ele);
				continue SPACE;
			}

			pos = element.indexOf(".");//Class
			if(pos+1 && !(pos>left_bracket&&pos<right_bracket)) {
				var parts = element.split('.');
				var tag = parts[0];
				var class_name = parts[1];

				var found = getElements(context,tag);
				context = new Array;
 				for (var l=0,len=found.length; fnd=found[l],l<len; l++) {
 					if(fnd.className && fnd.className.match(new RegExp('(^|\s)'+class_name+'(\s|$)'))) context.push(fnd);
 				}
				continue SPACE;
			}

			if(element.indexOf('[')+1) {//If the char '[' appears, that means it needs CSS 3 parsing
				// Code to deal with attribute selectors
				if (element.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?['"]?([^\]'"]*)['"]?\]$/)) {
					var tag = RegExp.$1;
					var attr = RegExp.$2;
					var operator = RegExp.$3;
					var value = RegExp.$4;
				}
				var found = getElements(context,tag);
				context = new Array;
				for (var l=0,len=found.length; fnd=found[l],l<len; l++) {
 					if(operator=='=' && fnd.getAttribute(attr) != value) continue;
					if(operator=='~' && !fnd.getAttribute(attr).match(new RegExp('(^|\\s)'+value+'(\\s|$)'))) continue;
					if(operator=='|' && !fnd.getAttribute(attr).match(new RegExp('^'+value+'-?'))) continue;
					if(operator=='^' && fnd.getAttribute(attr).indexOf(value)!=0) continue;
					if(operator=='$' && fnd.getAttribute(attr).lastIndexOf(value)!=(fnd.getAttribute(attr).length-value.length)) continue;
					if(operator=='*' && !(fnd.getAttribute(attr).indexOf(value)+1)) continue;
					else if(!fnd.getAttribute(attr)) continue;
					context.push(fnd);
 				}

				continue SPACE;
			}

			//Tag selectors - no class or id specified.
			var found = getElements(context,element);
			context = found;
		}
		for (var o=0,len=context.length;o<len; o++) selected.push(context[o]);
	}
	return selected;
}

function tag_links(){

	// [Coremetrics Prefix,HTML Container Element ID]
	var sections = [['Pages','side_pages'],['Categories','side_categories'],['TopPosts','side_posts'],['Archives','side_archives'],['Flickr','flickr'],['FollowUs','social_network_icons'],['Explore','side_explore'],['Influencers','side_influencers']];

	for(var i=0;i<sections.length;i++){
		var links = getElementsBySelector('#' + sections[i][1] + ' a');
		for(var x=0;x<links.length;x++){
			var link = links[x];
			var link_name;
			switch(sections[i][0]){
				case 'Flickr':
					// FLICKR - GET LINK NAMES FROM IMAGES INSTEAD
					var child = link.childNodes[0];
					if(child.tagName=='IMG') link_name = child.title;
				break;
				case 'Categories':
					link_name = (link.textContent||link.innerText);
				break;
				default:
				link_name = (link.title||link.textContent||link.innerText);
			}
			link_name = cm_sanitize(link_name);
			tag_link(link,sections[i][0],link_name);
		}
	}


	var posts = getElementsBySelector('.post');
	for(var x=0;x<posts.length;x++){
		var h1 = (get_children(posts[x],'H1','title')[0]||'');
		var post_title = cm_sanitize(h1.textContent||h1.innerText||'Unidentified-Post');
		var entry = get_children(posts[x],'DIV','entry')[0];
		var entry_paragraphs = get_children(entry,'P');

		for(var i=0;i<entry_paragraphs.length;i++){
			var links = get_children(entry_paragraphs[i],'A');
			for(var n=0;n<links.length;n++){
				var link = links[n];
				tag_link(link,post_title,cm_sanitize(link.textContent||link.innerText));
			}
		}
	}

}

function get_children(context_element,tag_name,css_class){
	var ret = [];
	for(var i=0;i<context_element.childNodes.length;i++){
		var child = context_element.childNodes[i];
		var is_match = true;
		if(tag_name) is_match = (child.tagName==tag_name);
		if(css_class&&is_match) is_match = ((child.className+'').indexOf(css_class)>-1);
		if(is_match) ret.push(child);
	}
	return ret;
}

function tag_link(link,section_name,link_name){
	if(link_name){
		var cm_sp = 'Toughbloggers_Site_Promotions-_-' + section_name + '-_-' + link_name;
		link.cm_sp = cm_sp;
		link.onclick = function(){
			var cm_sp = this.cm_sp;
			cmCreateManualLinkClickTag(cm_sp);
		}
	}
}

function cm_sanitize(link_name){
	link_name = parse_alphabetic_characters(link_name);
	link_name = replace_all(link_name,' ','-');
	link_name = replace_all(link_name,'--','-');
	if(link_name.length>20) link_name = link_name.substr(0,20);
	return link_name;
}

function parse_alphabetic_characters(txt){
	var ret = '';
	for(var i=0;txt&&i<txt.length;i++){
		var char = txt.substr(i,1);
		if(char.match(/[a-zA-Z0-9 ]/)) ret += char;
	}
	return ret;
}

function replace_all(s_txt,s_find,s_replace){
	while(s_txt&&s_txt.indexOf(s_find)>-1){
		s_txt = s_txt.replace(s_find,s_replace);
	}
	return s_txt;
}

function observe(objElement,eventName,eventFunction){
	if(objElement.addEventListener){
		objElement.addEventListener (eventName,eventFunction,false);
	} else if(objElement.attachEvent) {
		objElement.attachEvent ('on' + eventName,eventFunction);
	}
}

observe(window,'load',tag_links);