// utils.js
function gebid(i)
{
	try
	{
		return document.getElementById(i);
	}
	catch(err)
	{
		return null;
	}
}

function ce(e, obj)
{
	var a = document.createElement(e);
	for(prop in obj)
	{
		a[prop] = obj[prop];
	}
	return a;
}

function ac()
{
	if(ac.arguments.length > 1)
	{
		var a = ac.arguments[0];
		for(i=1; i<ac.arguments.length; i++)
		{
			if(arguments[i])
			{
				a.appendChild(ac.arguments[i]);
			}
		}
		return a;
	}
	else
	{
		return null;
	}
}

function rc(node)
{
	if(node != null)
	{
		node.parentNode.removeChild(node);
	}
}

// jsonparser.js
(function () {

    var m = {

            '\b': '\\b',

            '\t': '\\t',

            '\n': '\\n',

            '\f': '\\f',

            '\r': '\\r',

            '"' : '\\"',

            '\\': '\\\\'

        },

        s = {

            array: function (x) {

                var a = ['['], b, f, i, l = x.length, v;

                for (i = 0; i < l; i += 1) {

                    v = x[i];

                    f = s[typeof v];

                    if (f) {

                        v = f(v);

                        if (typeof v == 'string') {

                            if (b) {

                                a[a.length] = ',';

                            }

                            a[a.length] = v;

                            b = true;

                        }

                    }

                }

                a[a.length] = ']';

                return a.join('');

            },

            'boolean': function (x) {

                return String(x);

            },

            'null': function (x) {

                return "null";

            },

            number: function (x) {

                return isFinite(x) ? String(x) : 'null';

            },

            object: function (x) {

                if (x) {

                    if (x instanceof Array) {

                        return s.array(x);

                    }

                    var a = ['{'], b, f, i, v;

                    for (i in x) {

                        v = x[i];

                        f = s[typeof v];

                        if (f) {

                            v = f(v);

                            if (typeof v == 'string') {

                                if (b) {

                                    a[a.length] = ',';

                                }

                                a.push(s.string(i), ':', v);

                                b = true;

                            }

                        }

                    }

                    a[a.length] = '}';

                    return a.join('');

                }

                return 'null';

            },

            string: function (x) {

                if (/["\\\x00-\x1f]/.test(x)) {

                    x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {

                        var c = m[b];

                        if (c) {

                            return c;

                        }

                        c = b.charCodeAt();

                        return '\\u00' +

                            Math.floor(c / 16).toString(16) +

                            (c % 16).toString(16);

                    });

                }

                return '"' + x + '"';

            }

        };



    Object.prototype.toJSONString = function () {

        return s.object(this);

    };



    Array.prototype.toJSONString = function () {

        return s.array(this);

    };

})();



String.prototype.parseJSON = function () {

    try {

        return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(

                this.replace(/"(\\.|[^"\\])*"/g, ''))) &&

            eval('(' + this + ')');

    } catch (e) {

        return false;

    }

};

// Ajax.js
var Ajax = new Object();
Ajax.isUpdating = true;

Ajax.Request = function(method, url, callback)
{
	this.isUpdating = true;
	this.callbackMethod = callback;
	this.request = (window.XMLHttpRequest)? new XMLHttpRequest(): new ActiveXObject("MSXML2.XMLHTTP"); 
	this.request.onreadystatechange = function() { Ajax.checkReadyState(); };
	this.request.open(method, url, true);
	this.request.send(url);
}
	
Ajax.checkReadyState = function()
{
	switch(this.request.readyState)
	{
		case 1: break;
		case 2: break;
		case 3: break;
		case 4:
			this.isUpdating = false;
			this.callbackMethod(this.request);
	}
}

// Tween.js
function Delegate() {}
Delegate.create = function (o, f) {
	var a = new Array() ;
	var l = arguments.length ;
	for(var i = 2 ; i < l ; i++) a[i - 2] = arguments[i] ;
	return function() {
		var aP = [].concat(arguments, a) ;
		f.apply(o, aP);
	}
}

Tween = function(obj, prop, func, begin, finish, duration, suffixe){
	this.init(obj, prop, func, begin, finish, duration, suffixe)
}
var t = Tween.prototype;

t.obj = new Object();
t.prop='';
t.func = function (t, b, c, d) { return c*t/d + b; };
t.begin = 0;
t.change = 0;
t.prevTime = 0;
t.prevPos = 0;
t.looping = false;
t._duration = 0;
t._time = 0;
t._pos = 0;
t._position = 0;
t._startTime = 0;
t._finish = 0;
t.name = '';
t.suffixe = '';
t._listeners = new Array();	
t.setTime = function(t){
	this.prevTime = this._time;
	if (t > this.getDuration()) {
		if (this.looping) {
			this.rewind (t - this._duration);
			this.update();
			this.broadcastMessage('onMotionLooped',{target:this,type:'onMotionLooped'});
		} else {
			this._time = this._duration;
			this.update();
			this.stop();
			this.broadcastMessage('onMotionFinished',{target:this,type:'onMotionFinished'});
		}
	} else if (t < 0) {
		this.rewind();
		this.update();
	} else {
		this._time = t;
		this.update();
	}
}
t.getTime = function(){
	return this._time;
}
t.setDuration = function(d){
	this._duration = (d == null || d <= 0) ? 100000 : d;
}
t.getDuration = function(){
	return this._duration;
}
t.setPosition = function(p){
	this.prevPos = this._pos;
	var a = this.suffixe != '' ? this.suffixe : '';
	this.obj[this.prop] = Math.round(p) + a;
	this._pos = p;
	this.broadcastMessage('onMotionChanged',{target:this,type:'onMotionChanged'});
}
t.getPosition = function(t){
	if (t == undefined) t = this._time;
	return this.func(t, this.begin, this.change, this._duration);
};
t.setFinish = function(f){
	this.change = f - this.begin;
};
t.geFinish = function(){
	return this.begin + this.change;
};
t.init = function(obj, prop, func, begin, finish, duration, suffixe){
	if (!arguments.length) return;
	this._listeners = new Array();
	this.addListener(this);
	if(suffixe) this.suffixe = suffixe;
	this.obj = obj;
	this.prop = prop;
	this.begin = begin;
	this._pos = begin;
	this.setDuration(duration);
	if (func!=null && func!='') {
		this.func = func;
	}
	this.setFinish(finish);
}
t.start = function(){
	this.rewind();
	this.startEnterFrame();
	this.broadcastMessage('onMotionStarted',{target:this,type:'onMotionStarted'});
	//alert('in');
}
t.rewind = function(t){
	this.stop();
	this._time = (t == undefined) ? 0 : t;
	this.fixTime();
	this.update();
}
t.fforward = function(){
	this._time = this._duration;
	this.fixTime();
	this.update();
}
t.update = function(){
	this.setPosition(this.getPosition(this._time));
	}
t.startEnterFrame = function(){
	this.stopEnterFrame();
	this.isPlaying = true;
	this.onEnterFrame();
}
t.onEnterFrame = function(){
	if(this.isPlaying) {
		this.nextFrame();
		setTimeout(Delegate.create(this, this.onEnterFrame), 0);
	}
}
t.nextFrame = function(){
	this.setTime((this.getTimer() - this._startTime) / 1000);
	}
t.stop = function(){
	this.stopEnterFrame();
	this.broadcastMessage('onMotionStopped',{target:this,type:'onMotionStopped'});
}
t.stopEnterFrame = function(){
	this.isPlaying = false;
}

t.continueTo = function(finish, duration){
	this.begin = this._pos;
	this.setFinish(finish);
	if (this._duration != undefined)
		this.setDuration(duration);
	this.start();
}
t.resume = function(){
	this.fixTime();
	this.startEnterFrame();
	this.broadcastMessage('onMotionResumed',{target:this,type:'onMotionResumed'});
}
t.yoyo = function (){
	this.continueTo(this.begin,this._time);
}

t.addListener = function(o){
	this.removeListener (o);
	return this._listeners.push(o);
}
t.removeListener = function(o){
	var a = this._listeners;	
	var i = a.length;
	while (i--) {
		if (a[i] == o) {
			a.splice (i, 1);
			return true;
		}
	}
	return false;
}
t.broadcastMessage = function(){
	var arr = new Array();
	for(var i = 0; i < arguments.length; i++){
		arr.push(arguments[i])
	}
	var e = arr.shift();
	var a = this._listeners;
	var l = a.length;
	for (var i=0; i<l; i++){
		if(a[i][e])
		a[i][e].apply(a[i], arr);
	}
}
t.fixTime = function(){
	this._startTime = this.getTimer() - this._time * 1000;
}
t.getTimer = function(){
	return new Date().getTime() - this._time;
}
Tween.backEaseIn = function(t,b,c,d,a,p){
	if (s == undefined) var s = 1.70158;
	return c*(t/=d)*t*((s+1)*t - s) + b;
}
Tween.backEaseOut = function(t,b,c,d,a,p){
	if (s == undefined) var s = 1.70158;
	return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
}
Tween.backEaseInOut = function(t,b,c,d,a,p){
	if (s == undefined) var s = 1.70158; 
	if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
	return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
}
Tween.elasticEaseIn = function(t,b,c,d,a,p){
		if (t==0) return b;  
		if ((t/=d)==1) return b+c;  
		if (!p) p=d*.3;
		if (!a || a < Math.abs(c)) {
			a=c; var s=p/4;
		}
		else 
			var s = p/(2*Math.PI) * Math.asin (c/a);
		
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	
}
Tween.elasticEaseOut = function (t,b,c,d,a,p){
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return (a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b);
	}
Tween.elasticEaseInOut = function (t,b,c,d,a,p){
	if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) var p=d*(.3*1.5);
	if (!a || a < Math.abs(c)) {var a=c; var s=p/4; }
	else var s = p/(2*Math.PI) * Math.asin (c/a);
	if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
}

Tween.bounceEaseOut = function(t,b,c,d){
	if ((t/=d) < (1/2.75)) {
		return c*(7.5625*t*t) + b;
	} else if (t < (2/2.75)) {
		return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
	} else if (t < (2.5/2.75)) {
		return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
	} else {
		return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
	}
}
Tween.bounceEaseIn = function(t,b,c,d){
	return c - Tween.bounceEaseOut (d-t, 0, c, d) + b;
	}
Tween.bounceEaseInOut = function(t,b,c,d){
	if (t < d/2) return Tween.bounceEaseIn (t*2, 0, c, d) * .5 + b;
	else return Tween.bounceEaseOut (t*2-d, 0, c, d) * .5 + c*.5 + b;
	}

Tween.strongEaseInOut = function(t,b,c,d){
	return c*(t/=d)*t*t*t*t + b;
	}

Tween.regularEaseIn = function(t,b,c,d){
	return c*(t/=d)*t + b;
	}
Tween.regularEaseOut = function(t,b,c,d){
	return -c *(t/=d)*(t-2) + b;
	}

Tween.regularEaseInOut = function(t,b,c,d){
	if ((t/=d/2) < 1) return c/2*t*t + b;
	return -c/2 * ((--t)*(t-2) - 1) + b;
	}
Tween.strongEaseIn = function(t,b,c,d){
	return c*(t/=d)*t*t*t*t + b;
	}
Tween.strongEaseOut = function(t,b,c,d){
	return c*((t=t/d-1)*t*t*t*t + 1) + b;
	}

Tween.strongEaseInOut = function(t,b,c,d){
	if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
	return c/2*((t-=2)*t*t*t*t + 2) + b;
	}
Tween.linearTween = function (t, b, c, d) {
    return c*t/d + b;
};
Tween.easeInQuad = function (t, b, c, d) {
    return c*(t/=d)*t + b;
};
Tween.easeOutQuad = function (t, b, c, d) {
    return -c *(t/=d)*(t-2) + b;
};
Tween.easeInOutQuad = function (t, b, c, d) {
    if ((t/=d/2) < 1) return c/2*t*t + b;
    return -c/2 * ((--t)*(t-2) - 1) + b;
};
Tween.easeInCubic = function (t, b, c, d) {
    return c*(t/=d)*t*t + b;
};
Tween.easeOutCubic = function (t, b, c, d) {
    return c*((t=t/d-1)*t*t + 1) + b;
};
Tween.easeInOutCubic = function (t, b, c, d) {
    if ((t/=d/2) < 1) return c/2*t*t*t + b;
    return c/2*((t-=2)*t*t + 2) + b;
};
Tween.easeInQuart = function (t, b, c, d) {
    return c*(t/=d)*t*t*t + b;
};
Tween.easeOutQuart = function (t, b, c, d) {
    return -c * ((t=t/d-1)*t*t*t - 1) + b;
};
Tween.easeInOutQuart = function (t, b, c, d) {
    if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
    return -c/2 * ((t-=2)*t*t*t - 2) + b;
};
Tween.easeInQuint = function (t, b, c, d) {
    return c*(t/=d)*t*t*t*t + b;
};
Tween.easeOutQuint = function (t, b, c, d) {
    return c*((t=t/d-1)*t*t*t*t + 1) + b;
};
Tween.easeInOutQuint = function (t, b, c, d) {
    if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
    return c/2*((t-=2)*t*t*t*t + 2) + b;
}; 

// OpacityTween.js
OpacityTween.prototype = new Tween();
OpacityTween.prototype.constructor = Tween;
OpacityTween.superclass = Tween.prototype;

function OpacityTween(obj,func,fromOpacity,toOpacity,duration){
	this.targetObject = obj;
	this.init(new Object(),'x',func,fromOpacity,toOpacity,duration);
}
var o = OpacityTween.prototype;
o.targetObject = {};
o.onMotionChanged = function(evt){
	var v = evt.target.getPosition();
	var t = this.targetObject;
	t.style['opacity'] = v / 100;
	t.style['-moz-opacity'] = v / 100;
	if(t.filters) t.filters.alpha['opacity'] = v;
}

// FeatureManager.js
var FeatureManager = new Object();

FeatureManager.Initialize = function(filename)
{
	Ajax.Request('GET', filename, FeatureManager.Display);
}

FeatureManager.Display = function(ajax)
{
	Feature = ajax.responseText.parseJSON();
	if(Feature.widget.delay == 'no-delay')
	{
		var index = Math.floor((Math.random()*Feature.widget.features.length));
		FeatureManager.create(Feature.widget.features[index]);
	}
	else
	{
		FeatureManager.setDelay();
		FeatureManager.create(Feature.widget.features[0]);
	}
}

FeatureManager.LoadJSON = function(json)
{
	Feature = json;
	if(Feature.widget.delay == 'no-delay')
	{
		var index = Math.floor((Math.random()*Feature.widget.features.length));
		FeatureManager.create(Feature.widget.features[index]);
	}
	else
	{
		FeatureManager.setDelay();
		FeatureManager.create(Feature.widget.features[0]);
	}
}

FeatureManager.index = 0;
FeatureManager.next = function()
{
	if(FeatureManager.index == (Feature.widget.features.length-1))
	{
		FeatureManager.index = 0;
	}
	else FeatureManager.index++;
	FeatureManager.clearDelay();
	FeatureManager.setDelay();
	FeatureManager.create( Feature.widget.features[FeatureManager.index] );
}

FeatureManager.previous = function()
{
	if(FeatureManager.index == 0)
	{
		FeatureManager.index = (Feature.widget.features.length-1);
	}
	else FeatureManager.index--;
	FeatureManager.clearDelay();
	FeatureManager.setDelay();
	FeatureManager.create( Feature.widget.features[FeatureManager.index] );
}

FeatureManager.goto = function()
{
	FeatureManager.create( Feature.widget.features[FeatureManager.index] );
	FeatureManager.clearDelay();
	FeatureManager.setDelay();
}

FeatureManager.create = function(feature)
{
	var featureFileContainer = ce("div", {id: "featureFileContainer"});
	switch(feature.type)
	{
		case 'jpg':
			var featureFile = ce("img", {id: "feature", src: feature.filepath});
			var featureImage = ac(featureFileContainer, featureFile);
			break;
		case 'swf':
			var featureFile = ce("img", {id: "feature", src: feature.filepath});
			var featureImage = ac(featureFileContainer, featureFile);
			break;
		case 'custom':
			/*
				console.log(feature.title);
				console.log(feature.subtitle);
				console.log(feature.description);
			*/
			var featureTitle = ce("h2", {id: "featureTitle", innerHTML: ((feature.title != undefined) ? feature.title : "")});
			var featureSubtitle = ce("h3", {id: "featureSubtitle", innerHTML: ((feature.subtitle != undefined) ? feature.subtitle : "")});
			var featureDescription = ce("div", {id: "featureDescription", innerHTML: ((feature.description != undefined) ? feature.description : "")});
			var featureLink = ce("div", {id: "featureLink", innerHTML: ((feature.link != undefined) ? feature.link : "")});
			var featureFile = ce("img", {id: "featureCustom", src: feature.filepath});
			var featureImage = ac(featureFileContainer, featureTitle, featureSubtitle, featureDescription, featureLink, featureFile);
			
			if(feature.href)
			{
				featureFile.style.cursor = "pointer";
				featureFile.onclick = function() { document.location=feature.href; }
			}
			break;
		default:
	}
	
	rc(gebid("featureDisplay"));
	var featureDisplay = ce("div", {id: "featureDisplay"});
	var featureNumbersEl = ce("div", {id: "featureNumbers"});
	
	if(Feature.widget.delay != 'no-delay')
	{
	var featureArrows = ce("div", {id: "featureArrows"});
	if(FeatureManager.index == 0)
	{
		var prevArrow = ce('img', {src: 'http://www.phoenixchildrens.com/assets/images/widget/previous_disabled.gif'});
		var nextArrow = ce('img', {src: 'http://www.phoenixchildrens.com/assets/images/widget/next.gif', onclick: function() { FeatureManager.next() }});
	}
	else if(FeatureManager.index == (Feature.widget.features.length-1))
	{
		var prevArrow = ce('img', {src: 'http://www.phoenixchildrens.com/assets/images/widget/previous.gif', onclick: function() { FeatureManager.previous() }});
		var nextArrow = ce('img', {src: 'http://www.phoenixchildrens.com/assets/images/widget/next_disabled.gif'});
	}
	else
	{
		var prevArrow = ce('img', {src: 'http://www.phoenixchildrens.com/assets/images/widget/previous.gif', onclick: function() { FeatureManager.previous() }});
		var nextArrow = ce('img', {src: 'http://www.phoenixchildrens.com/assets/images/widget/next.gif', onclick: function() { FeatureManager.next() }});
	}
	//ac(featureNumbersEl, ac(featureArrows, prevArrow, nextArrow))
	ac(gebid('featureContainer'), ac(featureDisplay, featureImage, featureNumbersEl));
	
	for(var i=0; i<Feature.widget.features.length; i++)
	{
		var featureNumber = ce("div", {innerHTML: (i+1), onclick: FeatureManager.createNumberAction(i)});
		if(FeatureManager.index == i)
		{
			featureNumber.className = 'featureNumberSelected';
		}
		else
		{
			featureNumber.className = 'featureNumber';
		}
		ac(featureNumbersEl, featureNumber);
	}
	}
	else
	{
		ac(gebid('featureContainer'), ac(featureDisplay, featureImage));
	}
	
	//var t1 = new Tween(gebid("featureDisplay").style, 'left', Tween.elasticEaseOut, 500, 0, 10, 'px');
	//t1.start();
	var opacityTween = new OpacityTween(gebid("featureDisplay"), Tween.regularEaseOut, 0, 100, 1);
	opacityTween.start();
	/*opacityTween.onMotionFinished = function()
	{
	  //
	}*/
}

FeatureManager.createNumberAction = function(featureNumber)
{
	return function()
	{
		FeatureManager.index = featureNumber;
		FeatureManager.goto();
	}
}

FeatureManager.setDelay = function()
{
	FeatureManager.__delayInterval = setInterval("FeatureManager.next()", (Feature.widget.delay*1000));
}

FeatureManager.clearDelay = function()
{
	clearInterval(FeatureManager.__delayInterval);
}


