// Supporting client-side code for MaxCast client web services
var MC = { // MaxCast
	baseURL : '/cms/nsmaxcast/services/',
	// error codes - needs to match services.py:Err class
	Err : {SUCCESS:0, FAILURE:1, AJAX_FAILURE:2, NO_SESSION:3, NOT_OWNER:4, NOT_FOUND:5, BAD_ARG:6, BAD_LOGIN:7, NEED_CONFIRM:8},
	ChannelStatus : {OFF:0, ON:1, NEED_MORE_MINUTES:-1},
	PlayState : {Unloaded:-1, Loaded:0, Unstarted:1, Buffering:2, Playing:3, Paused:4, Ended:5},
	Init : function(){ // called on page load
		if (params.debug)
			MC.Log.ShowPane(5000);
	},
	Call : function(api, cb){ // wrapper for MC.AJAX.Post that evals the result into a JSON object first
		var wrappedCB = function(resp){
			var res = {};
			if (resp.status >= 400) res.error = MC.Err.AJAX_FAILURE;
			else res = MC.EvalJSON(resp.responseText);
			res._api = api;
			// special case: if there is no session or it expired, call OnNoSession
			if (res.error == MC.Err.NO_SESSION) return MC.OnNoSession();
			if (cb != null) return cb(res);
		}
		var args = MC.ToArray(arguments).slice(2);
		if (args.length == 0){ // need to send *something* since we're doing a POST
			args.unshift(0);
			args.unshift('__ignoreme');
		}
		args.unshift(wrappedCB);
		args.unshift(MC.baseURL + api);
		MC.AJAX.Post.apply(this, args);
	},
	Call2 : function(api, cb){ // wrapper for MC.AJAX.Post that evals the result into a JSON object first
		var wrappedCB = function(resp){
			var res = {};
			if (resp.status >= 400) res.error = MC.Err.AJAX_FAILURE;
			else res = MC.EvalJSON(resp.responseText);
			res._api = api;
			// special case: if there is no session or it expired, call OnNoSession
			if (res.error == MC.Err.NO_SESSION) return MC.OnNoSession();
			if (cb != null) return cb(res);
		}
		var args = MC.ToArray(arguments).slice(2);
		if (args.length == 0){ // need to send *something* since we're doing a POST
			args.unshift(0);
			args.unshift('__ignoreme');
		}
		args.unshift(wrappedCB);
		args.unshift('/cms/nsmaxcast/ingest/' + api);
		MC.AJAX.Post.apply(this, args);
	},
	OnNoSession : function(){ // called when the user has no session defined
		alert('You are not logged in or your session expired')
	},
	GetPageParams:function(){
		return MC.GetParams(window.location.search);
	},
	GetParams:function(url){
		var ret={},startIndex=-1,paramsArray=[],i=0,len=0,thisParamArray=[];
		startIndex=url.indexOf("?");
		if(startIndex==-1){
			return ret;
		}
		paramsArray=url.substr(startIndex+1).split("&");
		len=paramsArray.length;
		for(i=0;i<len;i++){
			thisParamArray=paramsArray[i].split("=",2);
			if(thisParamArray.length==1){
				ret[thisParamArray[0]]=true;
			}else{
				if(thisParamArray.length==2){
					ret[thisParamArray[0]]=decodeURIComponent(thisParamArray[1]);
				}
			}
		}
		return ret;
	},
	SetParams:function(url,_70){
		var q=url.indexOf("?");
		if(q!=-1){
			url=url.substr(0,q);
		}
		var _72=[];
		for(var i in (_70||{})){
			_72.push(encodeURIComponent(i)+"="+encodeURIComponent(_70[i]));
		}
		if(_72.length===0){
			return url;
		}
		return url+"?"+_72.join("&");
	},
	URL:{
		Root: function (url) {
			if (!url) {
				return "";
			}
			var i = url.indexOf("://");
			if (i == -1) {
				return "";
			}
			i += 3;
			i = url.indexOf("/", i);
			if (i == -1) {
				return url + "/";
			}
			return url.substr(0, i + 1);
		},
		Base: function (url) {
			if (!url) {
				return "";
			}
			var i = url.indexOf("://");
			if (i == -1) {
				return "";
			}
			i += 2;
			var _66 = url.lastIndexOf("/");
			if (i == _66) {
				return url + "/";
			}
			return url.substr(0, _66 + 1);
		},
		Join: function (_67, rel) {
			if (!_67) {
				_67 = window.location.href;
				_67 = _67.substring(0, _67.lastIndexOf("/") + 1);
			}
			if (!rel) {
				return _67;
			}
			if (rel.indexOf("://") != -1) {
				return rel;
			}
			if (rel.charAt(0) == "/") {
				return MC.URL.Root(_67) + rel.substr(1);
			}
			return MC.URL.Base(_67) + rel;
		}
	},
	ToArray:function(newArray){
		var tempArray=[],i=0,len=newArray.length;
		for(i=0;i<len;i++){
			tempArray.push(newArray[i]);
		}
		return tempArray;
	},
	AJAX:{
		Create:function(){
			try{return new XMLHttpRequest();}
			catch(e1){}
			try{return new ActiveXObject("Msxml2.XMLHTTP");}
			catch(e2){}
			try{return new ActiveXObject("Microsoft.XMLHTTP");}
			catch(e3){}
			return null;
		},
		Get:function(url,cb){
			var _a9=MC.ToArray(arguments).slice(2);
			var _aa={};
			for(var i=0,al=_a9.length/2;i<al;i++){
				_aa[_a9[i*2]]=_a9[i*2+1];
			}
			return MC.AJAX.Call({method:"GET",url:url,callback:cb,params:_aa});
		},
		Post:function(url,cb){
			var _ae=MC.ToArray(arguments).slice(2);
			var _af={};
			for(var i=0,al=_ae.length/2;i<al;i++){
				_af[_ae[i*2]]=_ae[i*2+1];
			}
			return MC.AJAX.Call({method:"POST",url:url,callback:cb,params:_af});
		},
		Submit:function(_b1,cb){
			_b1=$(_b1);
			var opt={
				method:"POST",url:_b1.action,cache:false,callback:cb
			};
			var _b4=[];
			var _b5=function(_b6,_b7){_b4.push(encodeURIComponent(_b6)+"="+encodeURIComponent(_b7));};
			for(var i=0,fl=_b1.length;i<fl;i++){
				var el=_b1.elements[i];
				if(!el.name){continue;}
				switch(el.type.toLowerCase()){
					case "hidden":
					case "textarea":
					case "text":
					case "password":
						_b5(el.name,el.value);
						break;
					case "radio":
					case "checkbox":
						if(el.checked){
							_b5(el.name,el.value);
						}
						break;
					case "button":
					case "submit":
						break;
					case "select-one":
						var _ba=el.selectedIndex;
						if(_ba>=0){
							var _bb=el.options[_ba];
							var _bc=_bb.value;
							if(!_bc){
								_bc=_bb.text;
							}
							_b5(el.name,_bc);
						}
						break;
					case "select-multiple":
						for(var j=0,elen=el.length;j<elen;j++){
							var _be=el.options[j];
							if(_be.selected){
								var _bf=_be.value;
								if(!_bf){
									_bf=_be.text;
								}
								_b5(el.name,_bf);
							}
						}
						break;
					default:
						logError("MC.AJAX.Submit not handling",el.name,el.type,el.value);
						break;
				}
			}
			var _c0=MC.ToArray(arguments).slice(2);
			for(var k=0,al=_c0.length/2;k<al;k++){
				_b5(_c0[k*2],_c0[k*2+1]);
			}
			opt.body=_b4.join("&");
			return MC.AJAX.Call(opt);
		},
		Call:function(_c2){
			var _c3=null;
			var _c4=_c2.method||"GET";
			var url=_c2.url;
			if(!url){_c3="Missing AJAX URL";}
			if(!_c2.callback){_c3="Missing AJAX callback";}
			var req=MC.AJAX.Create();
			if(!req){_c3="AJAX not supported";}
			if(_c3){
				if(_c2.callback){
					return _c2.callback({status:400,statusText:_c3,responseText:""});
				}else{
					return logError("No AJAX callback given");
				}
			}
			var _c7=_c2.params||{};
			MC.Update(_c7,MC.GetParams(url));
			url=MC.SetParams(url,{});
			var _c8=_c2.headers||{};
			if(MC.AJAX.forceNoCache||!_c2.cache){
				_c8["Cache-control"]="no-cache";
				if(_c4=="GET"){_c7.__bah=(new Date()).getTime();}
			}
			if(_c4=="POST"){_c8["Content-type"]="application/x-www-form-urlencoded";}
			var _c9=_c2.body||"";
			if(_c4=="POST"){
				var _ca=MC.SetParams("",_c7).substr(1);
				if(_ca){
					if(_c9){_c9=_c9+"&"+_ca;}
					else{_c9=_ca;}
				}
				_c8["Content-length"]=_c9.length;
			}else{
				_c9=null;
				url=MC.SetParams(url,_c7);
			}
			var tag=_c2.tag;
			var cb=_c2.callback;
			req.open(_c4,url);
			for(var h in _c8){
				if(_c8.hasOwnProperty(h)){req.setRequestHeader(h,_c8[h]);}
			}
			req.onreadystatechange=function(){
				if(req.readyState==4&&cb){
					var _ce={status:req.status,statusText:req.statusText,responseText:req.responseText,tag:tag};
					cb(_ce);
				}
			};
			if(_c9){req.send(_c9);}//TODO: REMOVE &&_c9!="__ignoreme=0"
			else{req.send(null);}
		},
		forceNoCache:false
	},
	Log:{
		_pane : null,
		_paneVisible : false,
		MAX_ROWS : 0,
		IsVisible : function() { return MC.Log._paneVisible; },
		MakePane : function(){
			if (MC.Log._pane) return;
			MC.Log._pane=document.createElement('div');
			MC.Update(MC.Log._pane.style, {'display':'block', 'width':'100%', 'overflow':'auto','position':'absolute', 'left':'0px', 'bottom':'0px','font':'8pt Verdana,sans-serif', 'height':'100px', 'color':'black', 'backgroundColor':'white','borderTop':'2px solid black', 'z-index':'1000'});
			var s = document.createElement('span');
			//s.innerHTML = '::: Release %s :::<br>'.format(MN.RELEASE_VERSION);
			MC.Log._pane.appendChild(s);
		},
		ShowPane : function(maxRows){
			MC.Log.MakePane();
			if (maxRows == null) maxRows = 500;
			if (maxRows > 0 && !MC.Log._paneVisible){
				MC.Log.MAX_ROWS = maxRows;
				document.body.appendChild(MC.Log._pane);
				MC.Log._paneVisible = true;
			}else if (maxRows <= 0 && MC.Log._paneVisible){
				MC.Log._pane.parentNode.removeChild(MC.Log._pane);
				MC.Log._paneVisible = false;
			}
		},
		log : function(){
			var params = [];
			for (var i = 0; i < arguments.length; i++)
			{
				var arg = arguments[i];
				if (arg == null) arg = 'null';
				else arg = arg.toString();
				params.push(arg);
			}
			var msg = params.join(' ');
			var MAX_ROWS = MC.Log.MAX_ROWS;
			if (MAX_ROWS <= 0) return;
			if (!MC.Log._pane) MC.Log.MakePane();
			var pane = MC.Log._pane;
			if (pane.childNodes.length >= MAX_ROWS){
				var kids = pane.childNodes;
				var ax = kids.length - MAX_ROWS;
				for (var i=0; i < ax; i++)
					pane.removeChild(kids[i]);
			}
			var s = document.createElement('span');
			s.innerHTML = MC.GetTimestamp() + ' : ' + msg + '<br>';
			pane.appendChild(s);
			pane.scrollTop = pane.scrollHeight;
		},
		logError : function(){
			var params = MC.ToArray(arguments);
			params.unshift('<font color="red">ERROR</font>:');
			log.apply(this, params);
		}
	},
	GetTimestamp:function(_30){
		var now=new Date();
		var _32="%s:%s:%s".format(MC.PadDigits(now.getHours(),2),MC.PadDigits(now.getMinutes(),2),MC.PadDigits(now.getSeconds(),2));
		if(_30){
			_32+=":"+MC.PadDigits(now.getMilliseconds(),2);
		}
		return _32;
	},
	ConvertToTimestamp:function(s,_34,_35){
		if(s<0){
			s=0;
		}
		var h=Math.floor(s/3600);
		s-=h*3600;
		var m=Math.floor(s/60);
		s-=m*60;
		var _38;
		if(!_35){
			_38=String(Math.floor(s));
		}
		else{
			_38=s.toFixed(_35);
		}
		var ret="";
		if(h>0||_34){
			ret=MC.PadDigits(h,2)+":";
		}
		ret+=MC.PadDigits(m,2)+":";
		if(_38.length<2){
			ret+="0";
		}
		return ret+_38;
	},
	ConvertToTimestamp2:function(arg,_3b){
		var ret="";
		var _3d=false;
		var _3e="";
		var obj=null;
		if(typeof arg=="number"){
			obj=MC.SecToObj(arg);
		}
		else{
			if(typeof arg=="object"){
				obj=arg;
			}
			else{
				logError("MC.ConvertToTimestamp: Invalid argument: ",arg);
				return ret;
			}
		}
		if(_3b.charAt(0)>="a"&&_3b.charAt(0)<="z"){
			_3d=true;
		}
		_3b=_3b.toLowerCase();
		var _40=_3b.split(":");
		for(var i=0;i<_40.length;i++){
			if(_40[i].charAt(0)=="h"){
				if(_3d){
					ret+=MC.HourTo12Time(obj.hour).hour+":";
					_3e=MC.HourTo12Time(obj.hour).am_pm;
				}
				else{
					if(_40[i].indexOf("?")==-1||obj.hour>0){
						ret+=_40[i].charAt(1)=="h"?MC.PadDigits(obj.hour,2):obj.hour;
						ret+=":";
					}
				}
			}
			else{
				if(_40[i].charAt(0)=="m"){
					if(_40[i].charAt(1)=="m"||_3b.indexOf("h")!=-1){
						ret+=MC.PadDigits(obj.minute,2);
					}
					else{
						ret+=obj.minute;
					}
					ret+=":";
				}
				else{
					if(_40[i].charAt(0)=="s"&&_40[i].charAt(1)=="s"){
						var _42=_40[i].split(".")[1];
						if(_42){
							ret+=MC.PadDigits(obj.second.toFixed(_42.length),_42.length+2);
						}
						else{
							ret+=MC.PadDigits(String(Math.floor(obj.second)),2);
						}
						ret+=":";
					}
				}
			}
		}
		ret=ret.slice(0,-1);
		ret+=_3e;
		return ret;
	},
	ConvertFromTimestamp:function(s){
		s=s||"0";
		if(typeof(s)!="string"){
			return s;
		}
		var _44=s.split(":");
		while(_44.length<3){
			_44.unshift("0");
		}
		return(parseInt(_44[0],10)*60+parseInt(_44[1],10))*60+parseFloat(_44[2]);
	},
	SecToObj:function(s){
		if(s<0){
			s=0;
		}
		var h=Math.floor(s/3600);
		s-=h*3600;
		var m=Math.floor(s/60);
		s-=m*60;
		return{
			"hour":h,"minute":m,"second":s
		};
	},
	HourTo12Time:function(h){
		var _49="am";
		if(h>=12){
			if(h!=12){
				h=h-12;
			}
			_49="pm";
		}
		else{
			if(h===0){
				h=12;
			}
		}
		return{
			"hour":h,"am_pm":_49
		};
	},
	PadDigits:function(n,_2b,_2c){
		if(!_2c){
			_2c="0";
		}
		n=n.toString();
		var pad="";
		for(var i=0,len=_2b-n.length;i<len;i++){
			pad+=_2c;
		}
		return pad+n;
	},
	Update:function(_4d,src){
		for(var _4f in src){
			_4d[_4f]=src[_4f];
		}
		return _4d;
	},
	JSON:{
		f:function(n) {
			return n < 10 ? "0" + n: n;
		},
	//	Date.prototype.toJSON = function() {
	//		return this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z";
	//	};
		stringify:function(_3, _4) {
		var m = {
			"\b": "\\b",
			"\t": "\\t",
			"\n": "\\n",
			"\f": "\\f",
			"\r": "\\r",
			"\"": "\\\"",
			"\\": "\\\\"
		};
			var a,
			i,
			k,
			l,
			v;
			switch (typeof _3) {
			case "string":
				return (/["\\\x00-\x1f]/).test(_3) ? "\"" + _3.replace(/[\x00-\x1f\\"]/g, function(a) {
					var c = m[a];
					if (c) {
						return c;
					}
					c = a.charCodeAt();
					return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
				}) + "\"": "\"" + _3 + "\"";
			case "number":
				return isFinite(_3) ? String(_3) : "null";
			case "boolean":
				return String(_3);
			case "null":
				return "null";
			case "object":
				if (!_3) {
					return "null";
				}
				if (typeof _3.toJSON === "function") {
					return stringify(_3.toJSON());
				}
				a = [];
				if (_3.constructor === Array) {
					l = _3.length;
					for (i = 0; i < l; i += 1) {
						a.push(stringify(_3[i], _4) || "null");
					}
					return "[" + a.join(",") + "]";
				}
				if (_4) {
					l = _4.length;
					for (i = 0; i < l; i += 1) {
						k = _4[i];
						if (typeof k === "string") {
							v = stringify(_3[k], _4);
							if (v) {
								a.push(stringify(k) + ":" + v);
							}
						}
					}
				} else {
					for (k in _3) {
						if (typeof k === "string") {
							v = stringify(_3[k], _4);
							if (v) {
								a.push(stringify(k) + ":" + v);
							}
						}
					}
				}
				return "{" + a.join(",") + "}";
			}
		},
                parse:function(_8,_9) {
                                var j;
                                if (!_8) {
                                        return {};
                                }
                                function walk(k, v) {
                                        var i,
                                        n;
                                        if (v && typeof v === "object") {
                                                for (i in v) {
                                                        if (Object.prototype.hasOwnProperty.apply(v, [i])) {
                                                                n = walk(i, v[i]);
                                                                if (n !== undefined) {
                                                                        v[i] = n;
                                                                }
                                                        }
                                                }
                                        }
                                        return _9(k, v);
                                }
                                if (/^[\],:{}\s]*$/.test(_8.replace(/\\./g, "@").replace(/['"][^"\\\n\r]*["']|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
                                        j = eval("(" + _8 + ")");
                                        return typeof _9 === "function" ? walk("", j) : j;
                                }
                                throw new SyntaxError("parseJSON");
                        }

		},
	EvalJSON:function(raw){
		var obj=MC.JSON.parse(raw);
		return obj;
	}
};
function $(){
	var ret=[],i=0,e="",a="";
	for(i=0,a=arguments.length;i<a;i++){
		e=arguments[i];
		if(typeof (e)=="string"){e=document.getElementById(e);}
		if(arguments.length==1){return e;}
		ret.push(e);
	}
	return ret;
}
var log=MC.Log.log;
var logError=MC.Log.logError;
//MN.Event.Observe(window, 'load', MC.Init);
var params = MC.GetPageParams();
if (!String.prototype.format) {
	String.prototype.format = function () {
		var _11 = arguments;
		var i = 0;
		var x = function () {
			return _11[i++];
		};
		return this.replace(/(%s)/g, x);
	};
}
MC.Init();
