/* ----------------------------------------------------------------------
	hfm.js
		@author			Weston Houghton <whoughton@hfmus.com>
		@version		0.9 (2010-03-25)
		@description	A base library for utility function and ads for
						the HFM environment. This library should NOT
						require any external libraries.
   ---------------------------------------------------------------------- */
$(document).ready(function(){
	hfm.iframeAds.debugstart();
		});

hfm = new function () {
	var self = this;

	self.isIE = /*@cc_on!@*/false;
	self.debug = false;
	self.urlInfo = false;
	self.version = {
		major: 1,
		minor: 0
	};
 
	self.init = function () {
		self.urlInfo = hfm.utils.parseURL();
	};
	
	self.log = function () {
		if (hfm.debug) {
			for (var i = 0; i < arguments.length; i++) { console.log(arguments[i]); }
		}
	}
};

//iframe refreshing logic
hfm.iframeAds = new function () {

	this.registeredList = [];

	this.baseRandomNum  = 90000000 ;

	this.registerIframeAdForRefresh = function(key , adurl){
		//if (!this.isAdRegistered(iframename)) 
			this.registeredList.push({
				'key': key,
				'url': adurl
			});
	};

	this.getFrameByName = function(name){
		for (var i = 0; i < parent.frames.length; i++) {
			try {
				if (parent.frames[i].name == name) {
					return parent.frames[i];
				}
			} 
			catch (err) {
				//ignore. Iframe is outside of our domain.
			}
		}
		return null;
	};

	this.isAdRegistered = function(name){
		for (var i = 0; i < this.registeredList.length; i++) {
			if (this.registeredList[i].name === name) {
				return true;
			}
		}
		return false;
	};

	this.refreshAll = function(bs,ms){
		
		var randomNum2 = Math.random() * this.baseRandomNum ;

		this.baseRandomNum += 1111111;

		randomNum2 = Math.round(randomNum2);
		//alert(this.registeredList[1].url);
		for (var i = 0; i < this.registeredList.length; i++) {
			var newVal = this.registeredList[i].url;
			//newVal = newVal.replace(/[o][r][d][=]+[0-9]+/, "ord=" + randomNum2);
			if(i===0)
			$('.AdTag').eq(i).html('<iframe src="/tools_iframe.php?r=' + escape(newVal) +'" width="738px" height="90px" frameborder="0" scrolling="no"></script>');
			else if(i===1)
			$('.AdTag').eq(i).html('<iframe src="/tools_iframe.php?r=' + escape(newVal) +'" width="300px" height="600px" frameborder="0" scrolling="no"></script>');
			else if(i===2)
			$('.AdTag').eq(i).html('<iframe src="/tools_iframe.php?r=' + escape(newVal) +'" width="300px" height="200px" frameborder="0" scrolling="no"></script>');
			else 
			$('.AdTag').eq(i).html('<iframe src="/tools_iframe.php?r=' + escape(newVal) +'" width="300px" height="250px" frameborder="0" scrolling="no"></script>');
		}

	};

    this.buildFrame = function(key,url){
            this.registerIframeAdForRefresh(key,url);        
    };

};
//iframe refreshing logic End 
// ads code debug logic start by Zhichang
/*hfm.utils = new Object();*/
hfm.iframeAds.querystring = function (qval) 
{
	var qsParm = new Array();
	var query = window.location.search.substring(1);
	var parms = query.split('&');
	for (var i=0; i<parms.length; i++) {
		var pos = parms[i].indexOf('=');
			if (pos > 0) {
			var key = parms[i].substring(0,pos);
			var val = parms[i].substring(pos+1);
			qsParm[key] = val;
			}
	}
	if (qsParm[qval]){
		return decodeURIComponent(qsParm[qval]);
	}
	else{
		return "";
	}
}
hfm.iframeAds.builddebugui = function()
{
	var output = '';
	
	for(i=0;i<hfm.iframeAds.registeredList.length;i++) {
		output += ("<li>call:" +(i + 1)+ " url:" +this.registeredList[i].url + "</li>");
	}
	
	if( output != '')
		output = '<ol>' + output + '</ol>';
	else
		output = '<p>there are no ads registered on this page.</p>';
	
	var finaloutput = jQuery('<div class="addebug"><div class="debugheader"><b>Ads Debug :</b> </div>' +output+ '</div>');
	
	jQuery('body').prepend(finaloutput);
	
}

hfm.iframeAds.debugstart = function()
{
	if(hfm.iframeAds.querystring('debugads') == 'true')
		hfm.iframeAds.builddebugui();
}
// ads code debug logic start by Zhichang 

hfm.ads = new function () {
	var self = this;
	
	var core = {
		//'host': 'ad.doubleclick.net',
		'host':'a.collective-media.net',
		'type': 'adj',
		'zone': [],
		'attr': {}
	};
	var cm8 = {
		'server': '',
		'cat': '',
		'profile': ''
	};
	var channel = 'hfmus.';
	var compState = false;
	/*
	 * 2010-06-12
	 * Reset tile to 1 from 0 , and in 'min files' is ' m=1 '
	 * By Zhichang
	 *
	 */
	var tile = 1;
	var loc = 1;
	var ordinal = false;
	var debug = false;
	
	self.setup = function (params) {
		if (ordinal !== false) { return false; }
		if (hfm.utils.hasKey('host', params) && hfm.utils.isEmpty(params.host)) {
			core.host = params.host;
		}
		if (hfm.utils.hasKey('type', params) && hfm.utils.isEmpty(params.type)) {
			core.type = params.type;
		}
		if (hfm.utils.hasKey('zones', params) && (hfm.utils.isArray(params.zones))) {
			core.zone = params.zones;
		}
		if (hfm.utils.hasKey('cm8', params) && (typeof(params.zones) === 'object')) {
			for (var label in params.cm8) { cm8[label] = params.cm8[label]; }
		}
		if (hfm.utils.hasKey('attributes', params) && (typeof(params.attributes) === 'object')) {
			for (var key in params.attributes) { core.attr[key] = params.attributes[key]; }
		}
		if (hfm.utils.hasKey('companion', params)) { compState = params.companion; }
		if (hfm.utils.hasKey('channel', params)) {
			channel = params.channel;
		} else {
			var dom = hfm.urlInfo.domain.split('.');
			var tld = dom.pop();
			var site = dom.pop();
			channel += '.'+ site +'.'+ hfm.urlInfo.channel;
		}

		ordinal = Math.floor(Math.random()*100000000000);
	};
	
	self.place = function (size, params) {
		if (size === undefined) { return false; }
		if (ordinal === false) { hfm.ads.setup({}); }
		if (hfm.utils.hasKey('companion', params)) {
			if (params.companion === true) {
				document.write('<div id="companion-'+ ordinal +'" class="video-companion"></div>');
				return;
			}
		}
		base = build();
		base.keys = prependKeys({'sz': size}, base.keys);
		base.keys = prependKeys({'cmn': 'hfm'}, base.keys);
	/*
	 * 2010-06-12
	 * set dcopt = ist for the first AD
	 * By Zhichang
	 *
	 */
		if (tile === 1) { base.keys = prependKeys({'dcopt': 'ist'}, base.keys); }

		if (hfm.utils.hasKey('useLoc', params)) {
			if (params.useLoc === true) {
				base.keys = appendKeys({'loc': loc}, base.keys);
				loc++;
			}
		}
		base.keys = appendKeys({
			'tile': tile,
			'ord': ordinal +'?'
		}, base.keys);
		tile++;
		hfm.iframeAds.buildFrame(tile,base.path+base.keys);
		document.write('<script language="javascript" src="'+ base.path + base.keys +'"></script>');
	};
	
	self.companion = function (source) {
		hfm.log('compState [t]', compState);
		if (compState === true) { return; }
		var adXML = false;
		if (source !== false) {
			adXML = hfm.utils.parseXML(source);
		}
		var adCall = false;
		try {
			var companion = adXML.getElementsByTagName('Companion')[0];
			adCall = companion.getElementsByTagName('URL')[0].firstChild.nodeValue;
		} catch (err) { hfm.log(err); }
		if (hfm.utils.isEmpty(adCall)) {
			self.setType('adi');
			var base = build();

			base.keys = prependKeys({'sz': '300x250'}, base.keys);
	/*
	 * 2010-06-12
	 * set dcopt = ist for the first AD
	 * By Zhichang
	 *
	 */
			if (tile === 1) { base.keys = prependKeys({'dcopt': 'ist'}, base.keys); }
			base.keys = appendKeys({
				'tile': tile,
				'ord': ordinal +'?'
			}, base.keys);
			tile++;

			document.getElementById('companion-'+ ordinal).innerHTML = '<iframe src="'+ base.path + base.keys +'" id="ifr_companion" width="100%" height="100%" marginwidth=0 marginheight=0 hspace=0 vspace=0 frameborder=0 scrolling=no>'+'</iframe>';
			compState = true;
		} else {
			hfm.log('adCall', adCall);
			if (adCall.search(/%zone%/i) > 0) {
				adCall = adCall.replace(/%zone%/i, buildZones());
			}
			document.getElementById('companion-'+ ordinal).innerHTML = '<iframe src="'+ adCall +'" id="ifr_companion" width="100%" height="100%" marginwidth=0 marginheight=0 hspace=0 vspace=0 frameborder=0 scrolling=no>'+'</iframe>';
			compState = true;
		}
		hfm.log('compState [b]', compState);
	}
	
	self.mediaEvent = function (event) {
		switch (event.type) {
			case "mediaBegin":
				if (compState === false) {
					hfm.ads.companion(false);
				}
				break;
		}
	}
	
	self.setKey = function (key, val) {
		if (hfm.utils.hasKey(key, core.attr)) {
			if (hfm.utils.isArray(core.attr[key])) {
				core.attr[key].push(val);
			} else {
				core.attr[key] = val;
			}
		} else {
			core.attr[key] = val;
		}
	};
	
	self.clearKey = function (key) {
		if (hfm.utils.hasKey(key, core.attr)) {
			delete core.attr.key;
			return true;
		}
		return false;
	};
	
	self.setType = function (type) {
		core.type = type;
	}
	
	self.setHost = function (host) {
		core.host = host;
	}
	
	self.getZone = function (depth) {
		var level = (depth > 0) ? (depth - 1) : 0;
		if (core.zone.length >= level && depth <= core.zone.length) {
			return core.zone[level];
		}
		return false;
	}
	
	self.debug = function () {
		if (debug) {
			console.log("core", core);
			console.log("cm8", cm8);
			console.log("tile, loc, ordinal", tile, loc, ordinal);
		}
	}
	
	function build () {
		var call = {};
		var base = 'http://'+ core.host +'/'+ core.type +'/'+ channel +'/'+ buildZones();
		var keys = "";
		for (var key in core.attr) {
			if (typeof(core.attr[key]) === 'array') {
				for (var j = 0; j < core.attr[key].length; j++) {
					keys += ';'+ key +'='+ core.attr[key][j];
				}
			} else {
				keys += ';'+ key +'='+ core.attr[key];
			}
		}
		call.path = base;
		call.keys = keys;
		return call;
	};
	
	function buildZones () {
		base = '';
		for (var i = 0; i < core.zone.length; i++) {
			if (i > 0) { base += '/'; }
			base += core.zone[i].replace(/[^a-zA-Z0-9]+/g,'');
		}
		return base;
	}
	
	function appendKeys (data, source) {
		for (var k in data) { source += ';'+ k +'='+ data[k]; }
		return source;
	}
	
	function prependKeys (data, source) {
		var p = '';
		for (var k in data) { p += ';'+ k +'='+ data[k]; }
		return p + source;
	}
}

hfm.utils = new function () {
	var self = this;
	
	/* Public Functions */
	self.parseURL = function () {
		var urlArray = window.location.href.split("/");
		var data = {
			'domain': urlArray[2].replace('www.',''),
			'channel': urlArray[3],
			'subchannel': urlArray[4]
		}
		return data;
	};

	self.isEmpty = function (ele) {
		if (ele === "" || ele === 0 || ele === "0" || ele === null || ele === undefined || ele === false) {
			return true;
		}
		if (typeof(ele) === 'object') {
			var i = 0;
			for (key in ele) {
				i++;
			}
			if (i === 0) { return true; }
		}
		return false;
	};

	self.isArray = function (ele) {
		var b = typeof(ele);
		if (b === 'object') {
			if (ele instanceof Array) { return true; }
		}
		return false;
	}

	self.count = function (item) {
		switch (typeof(item)) {
			case 'array':
				return item.length;
			case 'object':
				var i = 0;
				for (var prop in item) { i++; }
				return i;
			default:
				return false;
		}
	};

	self.hasKey = function (key, array, sensitive) {
		for (var k in array) {
			k = (sensitive === true) ? k : k.toLowerCase();
			key = (sensitive === true) ? key : key.toLowerCase();
			if (k === key) { return true; }
		}
		return false;
	};

	self.contains = function (key, array, sensitive) {
		for (var i = 0; i < array.length; i++) {
			var k = array[i];
			k = (sensitive === true) ? k : k.toLowerCase();
			key = (sensitive === true) ? key : key.toLowerCase();
			if (k === key) { return true; }
		}
		return false;
	};

	self.parseXML = function (xml) {
		var output;
		if (window.ActiveXObject) {
			output = new ActiveXObject("Microsoft.XMLDOM");
			output.async = false;
			output.loadXML(xml);
		} else if (window.XMLHttpRequest) {
			 output = (new DOMParser()).parseFromString(xml, "text/xml");
		}
		return output;
	};
};

hfm.init();
