Ext.BLANK_IMAGE_URL = "Images/Empty.gif";
Ext.namespace('WarlockDPS');

function getNodeValue(obj,tag)
{
	return obj.getElementsByTagName(tag)[0].firstChild.nodeValue;
}

WarlockDPS.DD = {
	mCookie:null,
	init: function() {	
		// Accordion
		var acc = new Ext.ux.Accordion('acc-ct', {
			fitHeight: false,
			animate: false,
			resizable: false,
			draggable: false
		})
		var panel1 = acc.add(new Ext.ux.InfoPanel('panel-1', {}));
		var panel2 = acc.add(new Ext.ux.InfoPanel('panel-2', {}));
		var panel3 = acc.add(new Ext.ux.InfoPanel('panel-3', {}));	
	
		// Target container for spells
		new Ext.dd.DDTarget(Ext.get('ID_TIME'));

		// Initial spell list
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_SHADOWBOLT'));
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_IMMOLATION'));		
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_INCINERATE'));
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_CORRUPTION'));
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_CURSESHADOW'));
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_DRAINLIFE'));		
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_CURSEELEMENTS'));		
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_CURSEAGONY'));	
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_SIPHONLIFE'));
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_UNSTABLEAFFLICTION'));
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_CONFLAGRATE'));
		new WarlockDPS.DDList(Ext.get('ID_LEGEND_LIFETAP'));		
		
		var layout = new Ext.BorderLayout(document.body, {
											north: {
												initialSize: 20,
	                      minSize: 20,
	                      maxSize: 20,												
	                      titlebar: false,
	                      collapsible: false
											},
	                    west: {
		                    split:true,
	                      initialSize: 250,
	                      minSize: 250,
	                      maxSize: 250,
	                      titlebar: true,
	                      collapsible: true,
                        animate: true
	                    },											
	                    east: {
		                    split:true,
	                      initialSize: 250,
	                      minSize: 250,
	                      maxSize: 250,
	                      titlebar: true,
	                      collapsible: true,
                        animate: true
	                    },
	                    center: {
	                      titlebar: true,
	                      autoScroll:true,
                        closeOnTab: true																			
											}});
		
		layout.beginUpdate();
		layout.add('north', new Ext.ContentPanel('Header', {title: 'Title'}));		
		layout.add('west', new Ext.ContentPanel('Equipment', {title: 'Equipment'}));
		layout.add('east', new Ext.ContentPanel('Talents', {title: 'Talents'}));
		
		/*
		var innerLayout = new Ext.BorderLayout('InnerContent', {
				south: {
						initialSize: 65,
						minSize: 65,
						maxSize: 65,
						autoScroll:false,
						collapsible:false,
						titlebar: false
				},
				center: {
						autoScroll:true
				}
		});		
		
		innerLayout.add('center', new Ext.ContentPanel('Main', {title: 'Spells & Damage'}));
		innerLayout.add('south', new Ext.ContentPanel('Banner'));		
		*/
		
		layout.add('center', new Ext.ContentPanel('Main', {title: 'Spells & Damage'}));
		//layout.add('center', new Ext.NestedLayoutPanel(innerLayout));
		layout.endUpdate();
			
		// Setup Event Listeners
		Ext.get('CALC_BUTTON').on('click', WarlockDPS.DD.send);
		Ext.get('RESET_BUTTON').on('click', WarlockDPS.DD.clearspells);
		
		Ext.get('IMP_SB_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('IMP_SB_MORE').on('click', WarlockDPS.DD.TalentMore);
		
		Ext.get('BANE_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('BANE_MORE').on('click', WarlockDPS.DD.TalentMore);		

		Ext.get('SUPPRESSION_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('SUPPRESSION_MORE').on('click', WarlockDPS.DD.TalentMore);		

		Ext.get('IMPCORR_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('IMPCORR_MORE').on('click', WarlockDPS.DD.TalentMore);		
		
		Ext.get('SM_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('SM_MORE').on('click', WarlockDPS.DD.TalentMore);
		
		Ext.get('IMPAGONY_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('IMPAGONY_MORE').on('click', WarlockDPS.DD.TalentMore);				
		
		Ext.get('CONTAGION_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('CONTAGION_MORE').on('click', WarlockDPS.DD.TalentMore);			
		
		Ext.get('MALEDICTION_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('MALEDICTION_MORE').on('click', WarlockDPS.DD.TalentMore);			

		Ext.get('EMPCORR_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('EMPCORR_MORE').on('click', WarlockDPS.DD.TalentMore);					
		
		Ext.get('SNF_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('SNF_MORE').on('click', WarlockDPS.DD.TalentMore);		

		Ext.get('IMP_IMMO_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('IMP_IMMO_MORE').on('click', WarlockDPS.DD.TalentMore);				
		
		Ext.get('EMBERSTORM_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('EMBERSTORM_MORE').on('click', WarlockDPS.DD.TalentMore);						
		
		Ext.get('SOUL_LINK_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('SOUL_LINK_MORE').on('click', WarlockDPS.DD.TalentMore);
		
		Ext.get('RUIN_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('RUIN_MORE').on('click', WarlockDPS.DD.TalentMore);		
		
		Ext.get('SOULSIPHON_LESS').on('click', WarlockDPS.DD.TalentLess);
		Ext.get('SOULSIPHON_MORE').on('click', WarlockDPS.DD.TalentMore);				
		
		Ext.get('DEMO_SAC_ID').on('click', WarlockDPS.DD.CheckPetBonus);
		Ext.get('MASTER_DEMO_ID').on('click', WarlockDPS.DD.CheckPetBonus);
		Ext.get('NO_PET_ID').on('click', WarlockDPS.DD.CheckPetBonus);
		
		Ext.get('SAVE_ID').on('click', WarlockDPS.DD.Save);
		
		// Set cookie
		mCookie = new Ext.state.CookieProvider({
       expires: new Date(new Date().getTime()+(1000*60*60*24*90)) //90 days
   	});		
		this.Load();
		/*
		// Create empty graph
		var so = new SWFObject("../ofc/open-flash-chart.swf", "ofc", "600", "150", "9", "#FFFFFF");
		
		so.addVariable("variables","true");
		//so.addVariable("title","Allo,{font-size: 20;}");
		so.addVariable("y_legendx","Open Flash Chart,12,0x736AFF");
		so.addVariable("y_label_size","15");
		so.addVariable("y_ticks","5,10,4");
		so.addVariable("line","3,0x9933CC,Damage Done,10");
		so.addVariable("values","10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310");
		so.addVariable("x_labels","0,,,,,5,,,,,10,,,,,15,,,,,20,,,,,25,,,,,30");
		so.addVariable("x_axis_steps","30");
		so.addVariable("y_max","500");		
		
		so.addParam("allowScriptAccess", "always" );
		so.write("DPSChart");*/
	},
	
	Save: function(iEvent, iObject) {		
		// Dom Values		
		var lValue = "SHADOW_DMG_ID="+Ext.get('SHADOW_DMG_ID').dom.value+"|";
		lValue += "FIRE_DMG_ID="+Ext.get('FIRE_DMG_ID').dom.value+"|";
		lValue += "CRIT_RATE_ID="+Ext.get('CRIT_RATE_ID').dom.value+"|";
		lValue += "HIT_RATE_ID="+Ext.get('HIT_RATE_ID').dom.value;
		mCookie.set( "FIELDS", lValue );
		
		// Inner HTML
		lValue = "IMPCORR_VALUE="+Ext.get('IMPCORR_VALUE').dom.innerHTML+"|";
		lValue += "SUPPRESSION_VALUE="+Ext.get('SUPPRESSION_VALUE').dom.innerHTML+"|";
		lValue += "SOULSIPHON_VALUE="+Ext.get('SOULSIPHON_VALUE').dom.innerHTML+"|";
		lValue += "IMPAGONY_VALUE="+Ext.get('IMPAGONY_VALUE').dom.innerHTML+"|";
		lValue += "EMPCORR_VALUE="+Ext.get('EMPCORR_VALUE').dom.innerHTML+"|";
		lValue += "SM_VALUE="+Ext.get('SM_VALUE').dom.innerHTML+"|";
		lValue += "CONTAGION_VALUE="+Ext.get('CONTAGION_VALUE').dom.innerHTML+"|";
		lValue += "MALEDICTION_VALUE="+Ext.get('MALEDICTION_VALUE').dom.innerHTML+"|";		

		lValue += "SOUL_LINK_VALUE="+Ext.get('SOUL_LINK_VALUE').dom.innerHTML+"|";		
		
		lValue += "IMP_SB_VALUE="+Ext.get('IMP_SB_VALUE').dom.innerHTML+"|";		
		lValue += "BANE_VALUE="+Ext.get('BANE_VALUE').dom.innerHTML+"|";		
		lValue += "RUIN_VALUE="+Ext.get('RUIN_VALUE').dom.innerHTML+"|";		
		lValue += "IMP_IMMO_VALUE="+Ext.get('IMP_IMMO_VALUE').dom.innerHTML+"|";		
		lValue += "EMBERSTORM_VALUE="+Ext.get('EMBERSTORM_VALUE').dom.innerHTML+"|";		
		lValue += "SNF_VALUE="+Ext.get('SNF_VALUE').dom.innerHTML;				

		mCookie.set( "INNER", lValue );
		
		// Radio Buttons
		lValue = "NO_PET_ID=TRUE";
		if( Ext.get('DEMO_SAC_ID').dom.checked ) {
			for (var i=0; i < document.DemonologyForm.SACPET.length; i++) {
				if (document.DemonologyForm.SACPET[i].checked) {
					lValue = "DEMO_SAC_ID=TRUE|SACPET="+document.DemonologyForm.SACPET[i].value;
				}
			}
		}	else if( Ext.get('MASTER_DEMO_ID').dom.checked ) {
			for (var i=0; i < document.DemonologyForm.MASTERPET.length; i++) {
				if (document.DemonologyForm.MASTERPET[i].checked) {
					lValue = "MASTER_DEMO_ID=TRUE|MASTERPET="+document.DemonologyForm.MASTERPET[i].value;
				}
			}			
		}
		mCookie.set( "RADIO", lValue );
		
		// Show a dialog using config options:
		Ext.Msg.show({
			title:SaveTitle,
			msg: '<font color="black">' + SaveMessage + '</font>',
			buttons: Ext.Msg.OK
		});
	},

	Load: function(iEvent, iObject) {
		if( mCookie.get("FIELDS") ) {
			var lFields = mCookie.get( "FIELDS" ).split('|');
			for( i=0; i < lFields.length; i++ ) {
				var lKeyValue = lFields[i].split('=');
				Ext.get(lKeyValue[0]).dom.value = lKeyValue[1];
			}
		}
		if( mCookie.get("INNER") ) {
			var lInner = mCookie.get( "INNER" ).split('|');
			for( i=0; i < lInner.length; i++ ) {
				var lKeyValue = lInner[i].split('=');
				Ext.get(lKeyValue[0]).dom.innerHTML = lKeyValue[1];
			}		
		}
		if( mCookie.get("RADIO") ) {
			var lRadio = mCookie.get( "RADIO" ).split('|');
			if( lRadio[0] == 'NO_PET_ID=TRUE' ) {
				this.CheckPetBonus(null, Ext.get('NO_PET_ID'));
			} else {
				var lKeyValue = lRadio[0].split('=');
				Ext.get(lKeyValue[0]).dom.checked = true;
				this.CheckPetBonus(null, Ext.get(lKeyValue[0]));
				lKeyValue = lRadio[1].split('=');
				Ext.get(lKeyValue[0]+"_"+lKeyValue[1]).dom.checked = true;
			}
		}		
	},
	
	CheckPetBonus: function(iEvent, iObject) {
		if( iObject.id == 'DEMO_SAC_ID' ) {
			Ext.get('DEMO_SAC_LIST').dom.style.display = '';
			Ext.get('MASTER_DEMO_LIST').dom.style.display = 'none';
		} else if( iObject.id == 'MASTER_DEMO_ID' ) {
			Ext.get('DEMO_SAC_LIST').dom.style.display = 'none';
			Ext.get('MASTER_DEMO_LIST').dom.style.display = '';			
		} else {
			Ext.get('DEMO_SAC_LIST').dom.style.display = 'none';
			Ext.get('MASTER_DEMO_LIST').dom.style.display = 'none';						
		}
	},
	
	TalentLess: function(iEvent, iObject) {
		var lItem = iObject.id.substr(0, iObject.id.length-5);
		var lItemValue = Ext.get( lItem + '_VALUE');		
		var lNumericValue = parseInt(lItemValue.dom.innerHTML, 10);
		if( lNumericValue > 0 ) {
			lNumericValue--;
			lItemValue.dom.innerHTML = lNumericValue;
			// Update Spells if Bane ?
			if( lItem == 'BANE' ) {WarlockDPS.DD.ProcessBane(lNumericValue);}
			if( lItem == 'IMPCORR' ) {WarlockDPS.DD.ProcessImpCorr(lNumericValue);}
		}			
	},
	
	TalentMore: function(iEvent, iObject) {
		var lItem = iObject.id.substr(0, iObject.id.length-5);
		var lItemValue = Ext.get( lItem + '_VALUE');
		var lItemMax = Ext.get( lItem + '_MAX');
		var lNumericValue = parseInt(lItemValue.dom.innerHTML, 10);
		var lNumericMax = parseInt(lItemMax.dom.innerHTML, 10);
		if( lNumericValue < lNumericMax ) {
			lNumericValue++;
			lItemValue.dom.innerHTML = lNumericValue;
			// Update Spells if Bane ?
			if( lItem == 'BANE' ) {WarlockDPS.DD.ProcessBane(lNumericValue);}
			if( lItem == 'IMPCORR' ) {WarlockDPS.DD.ProcessImpCorr(lNumericValue);}			
		}	
	},	
	
	clearspells: function() {
		var lSpellListItems = Ext.getDom('ID_TIME').getElementsByTagName("li");
		if( lSpellListItems[0] )
		{
			do
			{				
				Ext.get(lSpellListItems[0]).remove();
				lSpellListItems = Ext.getDom('ID_TIME').getElementsByTagName("li");			
			} while(lSpellListItems[0]);
		}
	},
	
	sendCheck: function(iID) {
		if( iID == 'yes' ) {
			CommBox.showDialog();
		}
	},
	
	send: function() {
		// Check if Timeline is empty
		var lSpellListItems = Ext.getDom('ID_TIME').getElementsByTagName("li");
		if( lSpellListItems.length == 0 ) {
			// Show a dialog using config options:
			Ext.Msg.show({
				title:QuickStartTitle,
				msg: '<font color="black">' + QuickStartMessage + '</font>',
				buttons: Ext.Msg.YESNO,
				fn: WarlockDPS.DD.sendCheck
			});
		} else {
		
			// Setup waiting image
			Ext.get('WaitingImageID').dom.style.visibility = "";
			Ext.get('CALC_BUTTON').dom.disabled = true;		
			
			// Retrieve Spells
			var lSpellList = 'spells=';
			for (i=0; i<lSpellListItems.length; i++) {
				lSpellList += lSpellListItems[i].className + "|";
			}		
			
			// Retrieve Equipment	
			var lEquipment = "shadow_dmg=" + Ext.get('SHADOW_DMG_ID').dom.value;
			lEquipment += "&fire_dmg=" + Ext.get('FIRE_DMG_ID').dom.value;
			lEquipment += "&crit_rate=" + Ext.get('CRIT_RATE_ID').dom.value;	
			lEquipment += "&hit_rate=" + Ext.get('HIT_RATE_ID').dom.value;	
			
			// Retrieve Talents
			var lTalents = "sm=" + Ext.get('SM_VALUE').dom.innerHTML;
			if( Ext.get('DEMO_SAC_ID').dom.checked ) {
				for (var i=0; i < document.DemonologyForm.SACPET.length; i++) {
					if (document.DemonologyForm.SACPET[i].checked) {
						lTalents += "&demo_sac=" + document.DemonologyForm.SACPET[i].value;
					}
				}
			}	else if( Ext.get('MASTER_DEMO_ID').dom.checked ) {
				for (var i=0; i < document.DemonologyForm.MASTERPET.length; i++) {
					if (document.DemonologyForm.MASTERPET[i].checked) {
						lTalents += "&master_demo=" + document.DemonologyForm.MASTERPET[i].value;
					}
				}			
			}
			lTalents += "&imp_sb=" + Ext.get('IMP_SB_VALUE').dom.innerHTML;
			lTalents += "&suppression=" + Ext.get('SUPPRESSION_VALUE').dom.innerHTML;
			lTalents += "&soul_link=" + Ext.get('SOUL_LINK_VALUE').dom.innerHTML;
			lTalents += "&emp_corr=" + Ext.get('EMPCORR_VALUE').dom.innerHTML;
			lTalents += "&imp_agony=" + Ext.get('IMPAGONY_VALUE').dom.innerHTML;
			lTalents += "&contagion=" + Ext.get('CONTAGION_VALUE').dom.innerHTML;
			lTalents += "&malediction=" + Ext.get('MALEDICTION_VALUE').dom.innerHTML;		
			lTalents += "&snf=" + Ext.get('SNF_VALUE').dom.innerHTML;
			lTalents += "&imp_immo=" + Ext.get('IMP_IMMO_VALUE').dom.innerHTML;
			lTalents += "&emberstorm=" + Ext.get('EMBERSTORM_VALUE').dom.innerHTML;
			lTalents += "&ruin=" + Ext.get('RUIN_VALUE').dom.innerHTML;
			lTalents += "&soulsiphon=" + Ext.get('SOULSIPHON_VALUE').dom.innerHTML;		
			
			var lOptions = "sim_type=" + Ext.get('SIM_TYPE').dom.value;
			lOptions += "&mob_level=" + Ext.get('MOB_LEVEL').dom.value; 
			
			Ext.Ajax.request({
				url:"Calc.php",
				params: lSpellList+'&'+lEquipment+'&'+lTalents+'&'+lOptions,
				callback: WarlockDPS.DD.ProcessAJAX,		
				scope:WarlockDPS.DD
			});
		}
	},
	
	ProcessAJAX: function(option, success, response) {			
		Ext.get('WaitingImageID').dom.style.visibility = "hidden";
		Ext.get('CALC_BUTTON').dom.disabled = false;
		
		var lData = response.responseXML.getElementsByTagName('result')
		Ext.get('DAMAGE_DONE').dom.innerHTML = getNodeValue(lData[0],'damage');
		Ext.get('SIMULATION_TIME').dom.innerHTML = getNodeValue(lData[0],'simulation_time');
		Ext.get('DPS_DONE').dom.innerHTML = getNodeValue(lData[0],'dps');
	},

	ProcessImpCorr: function(iValue) {
		// Here, we must resize all spells affected by Bane
		var lItem = parseInt(Ext.get('IMPCORR_VALUE').dom.innerHTML, 10);
		var lSpellListItems = Ext.getDom('ID_TIME').getElementsByTagName("li");
		for (i=0; i<lSpellListItems.length; i++) {
			if (lSpellListItems[i].className.indexOf("TIME_CORRUPTION") != -1) {
				lSpellListItems[i].className = "TIME_CORRUPTION" + (20-(lItem*4));
			}	
		}
	},

	ProcessBane: function(iValue) {
		// Here, we must resize all spells affected by Bane
		var lItem = parseInt(Ext.get('BANE_VALUE').dom.innerHTML, 10);
		var lSpellListItems = Ext.getDom('ID_TIME').getElementsByTagName("li");
		for (i=0; i<lSpellListItems.length; i++) {
			if (lSpellListItems[i].className.indexOf("TIME_SHADOWBOLT") != -1) {
				lSpellListItems[i].className = "TIME_SHADOWBOLT" + (30-lItem);
			}
			if (lSpellListItems[i].className.indexOf("TIME_IMMOLATION") != -1) {
				lSpellListItems[i].className = "TIME_IMMOLATION" + (20-lItem);
			}			
		}
	}
};

WarlockDPS.DDList = function(id, sGroup, config) {
	WarlockDPS.DDList.superclass.constructor.call(this, id, sGroup, config);

	var lDragEl = this.getDragEl();

	// The proxy is slightly transparent
	Ext.get(this.getDragEl()).setStyle('opacity', 0.67);
	this.goingLeft = false;
	this.lastX = 0;
	this.elementToInsert = null;
};

Ext.extend(WarlockDPS.DDList, Ext.dd.DDProxy, {		   
	startDrag: function(x, y) {		
		var lSrcEl = Ext.get(this.getEl());			
		var lDragEl = Ext.get(this.getDragEl());		
		
		// Generic Case
		this.ProxyClass = "PROXY_" + lSrcEl.id.substr(10);
		this.NewElementClass = "TIME_" + lSrcEl.id.substr(10);
	
		// Special Cases
		if( lSrcEl.id == 'ID_LEGEND_SHADOWBOLT' ) {
			var lItem = parseInt(Ext.get('BANE_VALUE').dom.innerHTML, 10);			
			this.NewElementClass = "TIME_SHADOWBOLT" + (30-lItem);
		} else if( lSrcEl.id == 'ID_LEGEND_IMMOLATION' ) {
			var lItem = parseInt(Ext.get('BANE_VALUE').dom.innerHTML, 10);			
			this.NewElementClass = "TIME_IMMOLATION" + (20-lItem);
		} else if( lSrcEl.id == 'ID_LEGEND_CORRUPTION' ) {
			var lItem = parseInt(Ext.get('IMPCORR_VALUE').dom.innerHTML, 10);			
			this.NewElementClass = "TIME_CORRUPTION" + (20-(lItem*4));
		}
		
		lDragEl.addClass(this.ProxyClass);
	},

	endDrag: function(e) {
		var lDragEl = Ext.get(this.getDragEl());
		lDragEl.removeClass(this.ProxyClass);
	},

	onDragDrop: function(e, id) {
		var lSrcEl = Ext.get(this.getEl());		
		
		if( id == 'ID_TIME' ) {
			var lElement = document.createElement("li");
			lElement.className = this.NewElementClass;
			Ext.get('ID_TIME').appendChild(lElement);
		}

	},

	onDrag: function(e) {
		// Keep track of the direction of the drag for use during onDragOver
		var x = e.getPageY();
		this.goingLeft = (x < this.lastX);
		this.lastX = x;
	},

	onDragOver: function(e, id) {
	}
});

Ext.onReady(WarlockDPS.DD.init, WarlockDPS.DD, true);