// *************************************
//  global AJAX call with popup script utilizing YUI
//  Author: Michael Smith
//	Created: 10/27/2008
//  Last Edited: 04/28/2009
//	Last Edited By: Michael Smith
//	Version: 0.4
//	Notes:
// *************************************

// load neccessary js files 
var loader = new YAHOO.util.YUILoader({

    	// identify the components you want to load.  Loader will automatically identify 
   	  // any additional dependencies required for the specified components. 
	    require: ["event", "animation", "dragdrop", "connection", "container", "calendar"], 
			
			// where do they live?
			base: '/inc/javascript/yui/',
	 
	    // pull in optional dependencies?
	    loadOptional: true, 
	 
	    onSuccess: function() { 
	        initAjax();
	    },
			
			onFailure: function(o) {
      	alert("error: " + YAHOO.lang.dump(o));
      },
	  
	    timeout: 10000, 
	 
	    // combine YUI files into a single request
	    combine: false 
});
loader.insert();

	

YUC = "";

//make sure external js files are ready before initializing
function initAjax(){
	YUC = YAHOO.util.Connect;
	//create local namespace
	YAHOO.namespace("popup.container");
}

//*************************************
function ajax(params){
//*************************************	
	//params {url: 'url', formName:'name', popup params}
	if (params.width != '') {
		params.width = '400px';
	}
	if (params.height != '') {
		params.width = '500px';
	}
	if (params.blackout == undefined) {
		params.blackout = true;
	}
	if (params.center == undefined) {
		params.center = true;
	}
	if (params.drag == undefined) {
		params.drag = true;
	}
	if (params.close == undefined) {
		params.close = true;
	}
	if (params.transition != '') {
		params.transition = 'FADE';
	}
	if (params.wysiwyg == undefined) {
		params.wysiwyg = false;
	}
	
	if(params.formName){
		var frm = document.forms[params.formName];
		//get all tinyMCE textareas
		var wysiwyg = YAHOO.util.Dom.getElementsByClassName('wysiwyg','textarea');
		for(i=0; i<wysiwyg.length; i++){
			document.getElementById(wysiwyg[i].id).value = tinyMCE.get(wysiwyg[i].id).getContent();	
		}
		YUC.setForm(params.formName);
		if(!params.url){
			params.url = frm.action;
		}
	}
	if(params.blackout){ //only use loading panel if using blackout
		//include neccessary YUI files on the fly
		if(!YAHOO.popup.container.loading){
			//set loading panel properties
			YAHOO.popup.container.loading = new YAHOO.widget.Panel("wait",  
				{ width: "240px", 
				  fixedcenter: true, 
				  close: false, 
				  draggable: false, 
				  zindex: 98,
				  modal: true,
				  visible: false
				} 
			);
			//create loading panel
			YAHOO.popup.container.loading.setHeader("Loading, please wait...");
			YAHOO.popup.container.loading.setBody("<img src=\"/images/loading_bar.gif\"/>");
			YAHOO.popup.container.loading.render(document.body);	
		}
		
		YAHOO.popup.container.loading.show();
	}
	
	//ajax call
	// bs20081008 changed to POST, should defaultt o form's method
	YUC.asyncRequest('POST', params.url,{success: ajaxSuccess, failure: ajaxFail, argument: params, timeout: 10000});
}

//*************************************
function ajaxSuccess(resp) {
//*************************************
	//make sure we're getting a json array
	if(resp.responseText.charAt(0) != "{" && resp.argument.action == undefined){
			alert("The response is NOT in the proper JSON format!");
	}
	
	if (resp.argument.action != undefined) {
		// what does this do? BS 2009-03-25
		var jsonObj = resp.argument;
		jsonObj.body = resp.responseText;
	}
	else {
		var jsonObj = eval('(' + resp.responseText + ')');
	}
	
	//object length (equiv of php sizeof)
	var count = 1;
	for (k in jsonObj) if (jsonObj.hasOwnProperty(k)) count++;
	
	if(jsonObj.result == 1){ //if no php failure, continue
		//check response type
		if(jsonObj.action == "html") { //rewrite innerHTML
			var obj = document.getElementById(jsonObj.objId);
			obj.innerHTML = jsonObj.content;
			
		} else if(jsonObj.action == "popup") { //inline popup
			//for(i=0; i<count; i++){
				resp.argument.header = jsonObj.header;
				resp.argument.footer = jsonObj.footer;
				resp.argument.body = jsonObj.body;
				resp.argument.center = jsonObj.center;
				resp.argument.callback = jsonObj.callback;
				resp.argument.callparams = jsonObj.callparams;
				resp.argument.closeCallback = jsonObj.closeCallback;
			//}
				//date object				
				if(jsonObj.date != undefined){
					var jsonDate = eval('(' + jsonObj.date + ')');
					resp.argument.field = jsonDate.field;
					resp.argument.mindate = jsonDate.mindate;
					resp.argument.maxdate = jsonDate.maxdate;
					resp.argument.title = jsonDate.title;
				}
			
			popUp(resp.argument);
			
		} else if(jsonObj.action == "eval") { //run javascript code
			eval(jsonObj.content);
			
		} else { //no action neccessary
			//do nothing
		}
		
	} else if(jsonObj.result == 0){ //some failure
		alert('error: '+resp.responseText);
		
	} else { //php failure
		alert('php failure: '+resp.responseText);
	}

	
	// check for blackout no matter what - bs20090326
	if(resp.argument.blackout){
		YAHOO.popup.container.loading.hide();
	}
}

//*************************************
function ajaxFail(resp){
//*************************************
	alert('Response was: '+resp.responseText);
}


//******************************************************
function popUp(params){
//******************************************************

	//**************************
	//sample: popUp({header:'This is a header',body:'<b>body html</b>',footer:'this is a footer',width:'550px',blackout:true,center:true,drag:true,close:true,transition:'FADE',wysiwyg:true, date:'date_field_name'});
	//**************************
	
	//set defaults (reset from ajax above in case popUp() called directly)
	if (params.width != '') {
		params.width = '700px';
	}
	if (params.height != '') {
		params.height = '500px';
	}
	if (params.blackout == undefined) {
		params.blackout = true;
	}
	if (params.center == undefined) {
		params.center = false;
		var manualPos = true;
	}
	if (params.drag == undefined) {
		params.drag = true;
	}
	if (params.closeCallback == undefined) {
		params.closeCallback = false;
	}
	if (params.close == undefined) {
		params.close = true;
	}
	if (params.transition != '') {
		params.transition = 'FADE';
	}
	if (params.wysiwyg == undefined) {
		params.wysiwyg = false;
	}
	if (params.callback == undefined) {
		params.callback = false;
	}
	if (params.callparams == undefined) {
		params.callparams = false;
	}
	
	if(!YAHOO.popup.container.popUp){

		//set popup properties
		YAHOO.popup.container.popUp = new YAHOO.widget.Panel("popUp",  
			{ width: params.width, 
			  fixedcenter: params.center, 
			  close: params.close, 
			  draggable: params.drag, 
			  zindex: 99,
				constraintoviewport: true,
			  modal: params.blackout,
			  visible: false,
			  effect:{effect:YAHOO.widget.ContainerEffect[params.transition],duration:0.25}
			} 
		);
		
		if(manualPos == true){
			var x = (YAHOO.util.Dom.getViewportWidth()/2) - (parseInt(params.width)/2);
			//alert(YAHOO.util.Dom.get("subscriberHeight"));
			var y = (YAHOO.util.Dom.getViewportHeight()/2) - 250;
			YAHOO.popup.container.popUp.cfg.queueProperty("xy", [x,y]); 
		}
	}
	
	YAHOO.popup.container.popUp.setHeader(params.header);
	YAHOO.popup.container.popUp.setBody(params.body);
	YAHOO.popup.container.popUp.setFooter(params.footer);
	YAHOO.popup.container.popUp.render(document.body);
	
	//if using wysiwyg initiate tinyMCE
	if(params.wysiwyg){ 
		tinyMCE.init({
			mode : "textareas",
			theme : "advanced",
			plugins : "safari,iespell,print,contextmenu,paste,fullscreen,visualchars",
			theme_advanced_buttons1 : "fontsizeselect,forecolor,bold,italic,underline,|,pastetext,pasteword,|,bullist,numlist,|,outdent,indent,|,undo,redo,|,sub,sup,|,charmap,iespell",
			theme_advanced_buttons2 : "",
			theme_advanced_buttons3 : "",
			theme_advanced_toolbar_location : "top",
			theme_advanced_toolbar_align : "left",
			theme_advanced_statusbar_location : "bottom",
			width : "99%",
			theme_advanced_resizing : true,
			theme_advanced_resize_horizontal : false
		});
	}
	/**
	 * @todo if we have callback, we shouldn't show a popup, or make it dependant on having header,body,footer ? callabck should be an action
	 * @date 2008-11-26
	 * @author Brenden Soares
	 */
	if(params.callback != false){
			if(params.callparams != false){
				eval(params.callback+"('"+params.callparams+"')");
			} else {
				eval(params.callback+"()");
			}
	}
	
	if(params.closeCallback != false){
			YAHOO.popup.container.popUp.hideEvent.subscribe(eval(params.closeCallback));
	}

	//if using a calendar, initiate YUI calendar objects
	if(params.field != undefined){ 
		//split date strings into array for evaluation
		var minDateArray = params.mindate.split("/");
		var maxDateArray = params.maxdate.split("/");
		//if the start and end months are not the same, we'll show a two panel cal
		if(minDateArray[0] != maxDateArray[0]){
			var panels = 2;
		} else {
			var panels = 1;
		}
		
		YAHOO.popup.container.cal = new YAHOO.widget.Calendar("cal","calendar", 
																{ pagedate: minDateArray[0]+"/"+minDateArray[2],
																mindate: params.mindate, 
																maxdate: params.maxdate,
																locale_months: "short",
																navigator:false,
																title: params.title,
																PAGES: panels,
																close:true}); 
	  YAHOO.popup.container.cal.render();
		YAHOO.util.Event.addListener(params.field, "click", YAHOO.popup.container.cal.show, YAHOO.popup.container.cal, true);
		function handleSelect(type,args,obj) { 
			var dates = args[0]; 
			var date = dates[0]; 
			var year = date[0], month = date[1], day = date[2]; 
		
			var dateField = document.getElementById(params.field); 
			dateField.value = month + "/" + day + "/" + year;
			YAHOO.popup.container.cal.hide();
		} 
		
		YAHOO.popup.container.cal.selectEvent.subscribe(handleSelect, YAHOO.popup.container.cal, true);
	}

	YAHOO.popup.container.popUp.show();
	if(params.blackout){
		YAHOO.popup.container.loading.hide();
	}
}


//*******************************
function closePopUp(){
//*******************************
	if (typeof YAHOO.popup.container.popUp != 'undefined')
		YAHOO.popup.container.popUp.hide();
}

//document.write("<link href='/inc/javascript/yui/container/assets/skins/sam/container.css' rel='stylesheet' type='text/css' />");