﻿function FlashProxy(){};

/************ CONSTANTS ************/
FlashProxy.RECURSIVE = "[recursive]";
FlashProxy.L_PAREN = "{";
FlashProxy.L_BRACET = "[";
FlashProxy.R_PAREN = "}";
FlashProxy.R_BRACET = "]";
FlashProxy.QUOTE = "\"";
FlashProxy.COLON = ":";
FlashProxy.SEMICOLON = ";";

/************ global variables ************/
FlashProxy._global = {};
FlashProxy._mixer = null;

/************ JSONParser class. ************/
FlashProxy.JSONParser = function(){};
FlashProxy.JSONParser.checkRegistered = function(o, n)
{
	if (n == undefined) return false;
	for (var i in FlashProxy._global) if (FlashProxy._global[i] === o) return true;
	return false;
}
FlashProxy.JSONParser.checkIsArray = function(o)
{
	for (var i in o) if (isNaN(i)) return false;
	return true;
}
FlashProxy.JSONParser.valueToArray = function(o)
{
	var s = "[";
	for (var i = 0; i < o.length; i++) s += "\"" + i + "\":" + FlashProxy.JSONParser.serialize(o[i], i);
	return s + "]";
}
FlashProxy.JSONParser.valueToObject = function(o)
{
	var s = "{";
	for (var i in o) s += "\"" + i + "\":" + FlashProxy.JSONParser.serialize(o[i], i);
	return s + "}";
}
FlashProxy.JSONParser.serialize = function(o, n)
{
	var to = typeof(o);
	if (o == FlashProxy.RECURSIVE) return FlashProxy.RECURSIVE + ";";
	if (n == undefined) 
	{
		FlashProxy._global = {};
		FlashProxy._global._this = o;
	}
	switch (to)
	{
		case "string":
			return escape(o) + ";";
		case "number":
			return (o/1).toString() + ";";
		case "date":
		case "regexp":
			return escape(o.toString()) + ";";
		case "undefined":
			return ";";
		case "object":
			if (o === null) return ";";
			if (FlashProxy.JSONParser.checkRegistered(o, n)) return FlashProxy.RECURSIVE + ";";
			while (FlashProxy._global[n]) n = "_" + n;
			FlashProxy._global[n] = o;
			if (FlashProxy.JSONParser.checkIsArray(o)) return FlashProxy.JSONParser.valueToArray(o) + ";";
			return FlashProxy.JSONParser.valueToObject(o) + ";";
	}
}
FlashProxy.JSONParser.getMatchingParen = function(s)
{
	var openIndex = s.indexOf(FlashProxy.L_PAREN);
	var closeIndex = s.indexOf(FlashProxy.R_PAREN);
	while (openIndex < closeIndex)
	{
		openIndex = s.indexOf(FlashProxy.L_PAREN, openIndex + 1);
		if (openIndex < 0) return closeIndex;
		if (openIndex < closeIndex) closeIndex = s.indexOf(FlashProxy.R_PAREN, closeIndex + 1);
	}
	if (closeIndex < 0) return s.length - 1;
	return closeIndex;
}
FlashProxy.JSONParser.getMatchingBracet = function(s)
{
	var openIndex = s.indexOf(FlashProxy.L_BRACET);
	var closeIndex = s.indexOf(FlashProxy.R_BRACET);
	while (openIndex < closeIndex)
	{
		openIndex = s.indexOf(FlashProxy.R_BRACET, openIndex + 1);
		if (openIndex < 0) return closeIndex;
		if (openIndex < closeIndex) closeIndex = s.indexOf(FlashProxy.R_BRACET, closeIndex + 1);
	}
	if (closeIndex < 0) return s.length - 1;
	return closeIndex;
}
FlashProxy.JSONParser.addJSONProperty = function(o, s)
{
	var i = 0;
	var lastIndex;
	var propName;
	var propValue;
	while (i < s.length)
	{
		lastIndex = s.indexOf(FlashProxy.QUOTE, ++i);
		propName = s.substring(i, lastIndex);
		lastIndex = s.indexOf(FlashProxy.COLON, lastIndex);
		if (s.charAt(lastIndex + 1) == FlashProxy.L_PAREN)
		{
			i = lastIndex + FlashProxy.JSONParser.getMatchingParen(s.substring(lastIndex + 1, s.length));
			i = s.indexOf(FlashProxy.SEMICOLON, i + 1) + 1;
		} else if (s.charAt(lastIndex + 1) == FlashProxy.L_BRACET)
		{
			i = lastIndex + FlashProxy.JSONParser.getMatchingBracet(s.substring(lastIndex + 1, s.length));
			i = s.indexOf(FlashProxy.SEMICOLON, i + 1) + 1;
		} else {
			i = s.indexOf(FlashProxy.SEMICOLON, lastIndex) + 1;
		}
		if (!propName) break;
		o[String(propName)] = FlashProxy.JSONParser.deserialize(s.substring(lastIndex + 1, i));
		if (i < 0) break;
	}
}
FlashProxy.JSONParser.addJSONMember = function(o, s)
{
	var i = 0;
	var lastIndex;
	var propName;
	var propValue;
	while (i < s.length)
	{
		lastIndex = s.indexOf(FlashProxy.QUOTE, ++i);
		propName = s.substring(i, lastIndex);
		lastIndex = s.indexOf(FlashProxy.COLON, lastIndex);
		if (s.charAt(lastIndex + 1) == FlashProxy.L_PAREN)
		{
			i = lastIndex + FlashProxy.JSONParser.getMatchingParen(s.substring(lastIndex + 1, s.length));
			i = s.indexOf(FlashProxy.SEMICOLON, i + 1) + 1;
		} else if (s.charAt(lastIndex + 1) == FlashProxy.L_BRACET)
		{
			i = lastIndex + FlashProxy.JSONParser.getMatchingBracet(s.substring(lastIndex + 1, s.length));
			i = s.indexOf(FlashProxy.SEMICOLON, i + 1) + 1;
		} else {
			i = s.indexOf(FlashProxy.SEMICOLON, lastIndex) + 1;
		}
		if (!propName) break;
		o[Number(propName)] = FlashProxy.JSONParser.deserialize(s.substring(lastIndex + 1, i));
		if (i < 0) break;
	}
}
FlashProxy.JSONParser.deserialize = function(s)
{
	if (s == "") return "";
	s = s.replace(/[\r|\t|\n|\s]/g, "");
	s = s.substring(0, s.lastIndexOf(FlashProxy.SEMICOLON));
	var i = 0;
	var j;
	var o = { };
	var arr = [];
	var unparsed;
	while (i < s.length)
	{
		switch(s.charAt(i))
		{
			case FlashProxy.L_PAREN:
				unparsed = s.substring(i + 1, s.length);
				j = s.lastIndexOf(FlashProxy.R_PAREN);
				if (j < 0) return null;
				FlashProxy.JSONParser.addJSONProperty(o, s.substring(i + 1, j));
				i += j;
				return o;
			case FlashProxy.L_BRACET:
				if (s == FlashProxy.RECURSIVE) return s;
				unparsed = s.substring(i + 1, s.length);
				j = s.lastIndexOf(FlashProxy.R_BRACET);
				if (j < 0) return null;
				FlashProxy.JSONParser.addJSONMember(arr, s.substring(i + 1, j));
				i += j;
				return arr;
			case FlashProxy.R_PAREN:
			case FlashProxy.R_BRACET:
			case FlashProxy.COLON:
			case FlashProxy.SEMICOLON:
			case FlashProxy.QUOTE:
				i++;
				break;
			default:
				if (s == "undefined") return undefined;
				if (s == "null") return null;
				if (!isNaN(s) && s === s / 1) return Number(s);
				if (s == "true") return true;
				if (s == "false") return false;
				if (s == FlashProxy.RECURSIVE) return FlashProxy.RECURSIVE;
				return unescape(s);
				break;
		}
	}
	return null;
}

/************ Utils class. ************/
FlashProxy.Utils = function(){};
FlashProxy.Utils.listClasses = function()
{
	var arr = [];
	for (var i in FlashProxy)
	{
		if (i == "_global") continue;
		if (typeof(FlashProxy[i]) != "function") continue;
		arr.push(i);
	}
	return FlashProxy.JSONParser.serialize(arr);
}
FlashProxy.Utils.listConstants = function()
{
	var arr = [];
	for (var i in FlashProxy)
	{
		if (i == "_global") continue;
		if (i == "_mixer") continue;
		if (typeof(FlashProxy[i]) == "function") continue;
		arr.push(i);
	}
	return FlashProxy.JSONParser.serialize(arr);
}
/************ Methods. ************/
FlashProxy.init = function()
{
	this._mixer = document.forms[0]["mixer"];
}
FlashProxy.openFootageFolder = function()
{
	this._mixer.openFootageFolder();
}
/************ Events. ************/
FlashProxy.onFootageRemoved = function(o){};
FlashProxy._onFootageRemoved = function(o)
{
	this.onFootageRemoved.apply(this, [FlashProxy.JSONParser.deserialize(o)]);
}
FlashProxy.onOpenGallery = function(s, args){};
FlashProxy._onOpenGallery = function(s, args)
{
	this.onOpenGallery.apply(this, [s, FlashProxy.JSONParser.deserialize(args)]);
}

/************ Custom Classes. ************/
FlashProxy.generateFilter = function(filterName, fAlpha, fBlurX, fBlurY, 
		fAngle, fDistance, fHighlightColor, fShadowColor, fColor, fType)
{
	var explicitType = "com.aditall.player.FilterObject";
	if (isNaN(fAlpha)) fAlpha = 100;
	if (isNaN(fBlurX)) fBlurX = 5;
	if (isNaN(fBlurY)) fBlurY = 5;
	if (isNaN(fAngle)) fAngle = 0;
	if (isNaN(fDistance)) fDistance = 5;
	if (fHighlightColor == undefined) fHighlightColor = "0xFFFFFF";
	if (fShadowColor == undefined) fShadowColor = "0x000000";
	if (fColor == undefined) fColor = "0xFF0000";
	if (fType == undefined) fType = "inner";
	var o = {	alpha: fAlpha,
				name: filterName,
				blurX: fBlurX,
				blurY: fBlurY,
				angle: fAngle,
				distance: fDistance,
				highlightColor: fHighlightColor,
				shadowColor: fShadowColor,
				color: fColor,
				type: fType};
	var s = explicitType + FlashProxy.JSONParser.serialize(o);
	return s;
}
if(!console) 
{
	var console={};
	console.log = function(){};
}
