/**
 * @author Nivaria Innova team
 */
function FormEMail() {
	this.id = null;
	this.simplefields = new Array();	//Simple fields
	this.dialog = null;
	this.uploadIframe = null;
}

FormEMail.prototype = {
	initialize: function(objectId) {
		var Me = this;
		this.id = objectId;
		//Getting component simple fields values
		ncm.initSimpleFields(FormEMail,this);
		//Init events
		var selSub = "div#emailform"+this.id+" form div.form-action button.submit";
		var selRes = "div#emailform"+this.id+" form div.form-action button.reset";
		$jq(selSub).click(function(){
			Me.submitForm();
		}).keypress(function(){
			Me.submitForm();
		});
		$jq(selRes).click(function(){
			Me.reset();
		}).keypress(function(){
			Me.reset();
		});
		var selDatepick = "div#emailform"+this.id+" form fieldset span.datepicker_wrap";
		$jq(selDatepick).click(function(){
			var fieldId = $jq("input",this).attr("id");
			if(fieldId!=null && typeof(fieldId)!="undefined" && fieldId!="") {
				Me.openCalendar(fieldId);
			}
		}).keypress(function(){
			var fieldId = $jq("input",this).attr("id");
			if(fieldId!=null && typeof(fieldId)!="undefined" && fieldId!="") {
				Me.openCalendar(fieldId);
			}
		});
		var selDay = "div#emailform"+this.id+" form fieldset select.dayOfMonth";
		var selMonth = "div#emailform"+this.id+" form fieldset select.month";
		var selYear = "div#emailform"+this.id+" form fieldset input.year";
		$jq(selDay).change(function(){
			var fieldId = $jq(this).attr("id").replace(/-dayOfMonth/ig,"");
			Me.checkLinkedDays(fieldId);
		});
		$jq(selMonth).change(function(){
			var fieldId = $jq(this).attr("id").replace(/-month/ig,"");
			Me.checkLinkedDays(fieldId);
		});
		$jq(selYear).change(function(){
			var fieldId = $jq(this).attr("id").replace(/-year/ig,"");
			Me.checkLinkedDays(fieldId);
		});
		var selInputs = "div#emailform"+this.id+" form :input";
		$jq(selInputs).focus(function(){
			var inputId = this.getAttribute("id");
			if(inputId!=null) {
				var selLabel = "div#inner-label-";
				selLabel += inputId;
				$jq(selLabel).css("visibility","hidden");
			}
		}).blur(function(){
			if(!$jq(this).val()){
				var inputId = this.getAttribute("id");
				if(inputId!=null) {
					var selLabel = "div#inner-label-";
					selLabel += inputId;
					$jq(selLabel).css("visibility","visible");
				}	
			}
		}).each(function(i){
			var inputObj = this;
			var inputId = this.getAttribute("id");
			if(inputId!=null) {
				var selLabel = "div#inner-label-";
				selLabel += inputId;
				$jq(selLabel).click(function(){
					$jq(this).css("visibility","hidden");
					inputObj.focus();
				});
			}
		});
	},
	
	submitForm: function() {
		this.validateForm();
	},
	
	validateForm: function() {
		var jspfile = FormEMail.getProperty("jsp_default");
		if(jspfile=="") jspfile= "components/forms/form_email/FormEMail.jsp";
		var selector = "div#emailform"+this.id+" form";
		var params = "action=0&";
		params += $jq(selector).serialize();
		params += "&";
		params += this.getRequestParams();
		var Me = this;
		this.clearErrorMessage();
		$jq.ajax({
    		async: false,
       		type: "POST",
       		url: jspfile,
       		data: params,
       		dataType: "json",
       		error: function(request,msg,ex) {
       			ncm.showError(msg,ex,request);
       		},
       		success: function(json) {
				if(json!=null) {
					if(json.valid) {
						Me.uploadFiles();
					} else {
						Me.showErrorMessage(json);
					}			
				}
			}
   		});
	},
	
	uploadFiles: function() {
		var jspfile = FormEMail.getProperty("jsp_upload");
		if(jspfile=="") jspfile= "components/forms/uploadFiles.jsp";
		var selector = "div#emailform"+this.id+" form";
		if(this.uploadIframe==null) {
			this.createUploadIframe(false);
		}
		var targetName = this.uploadIframe.getAttribute("name");
		$jq(selector).each(function(i){
			this.setAttribute("action",jspfile);
			this.setAttribute("target",targetName);
			this.submit();
		});
		setTimeout("FormEMail.get("+this.id+").progressListener()",1000);
	},
	
	progressListener: function() {
		var jspfile = FormEMail.getProperty("jsp_default");
		if(jspfile=="") jspfile= "components/forms/form_email/FormEMail.jsp";
		var params = "action=2";
		var Me = this;
		$jq.ajax({
    		async: true,
       		type: "POST",
       		url: jspfile,
       		data: params,
       		dataType: "json",
       		error: function(request,msg,ex) {
       			ncm.showError(msg,ex,request);
       		},
       		success: function(json) {
				if(json!=null) {
					Me.showProgress(json);
					if(json.uploadFinished) {
						Me.sendEmail();
					} else {
						setTimeout("FormEMail.get("+Me.id+").progressListener()",200);
					}			
				}
			}
   		});
	},
	
	showProgress: function(json) {
		var html = "";
		try {
			var percent = json.percent;
			if(percent==null || typeof(percent)=="undefined") {
				percent = 100;
			}
			var total = json.bTotalStr;
			if(total==null || typeof(total)=="undefined") {
				total = "";
			}
			html += "<div style=\"position:relative; width:100%; height:16px;\">\n";
			html += FormEMail.getProperty("lang_uploading");
			html += "\n</div>\n";
			html += "<div style=\"position:relative; width:100%; height:16px;\">\n";
			html += "<div style=\"position:absolute; top:0px; left:0px; width:100%; height:16px; font-size:11px; z-index:5; text-align:center; vertical-align:center;\">"+percent+"%"+(total!=""?" / ":"")+total+"</div>\n";
			html += "<table width=\"100%\" height=\"16\" style=\"border:1px solid #7B9FAF;border-collapse:collapse;\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n";
			html +=	"<tr>\n";
			if(percent>0) { 			
				html += "<td width=\""+percent+"%\" style=\"border-right:1px solid #7B9FAF;\" background=\""+FormEMail.getProperty("img_progress")+"\"></td>\n";
 			}  
			if(json.percent<100) { 		
				html +=	"<td width=\""+(100-percent)+"%\"></td>\n";
			}   
			html += "</tr>\n";
			html += "</table>\n";
			html += "</div>\n";
			this.showDialog(html);	
		} catch(mErr) {
		}
	},
	
	sendEmail: function() {
		var jspfile = FormEMail.getProperty("jsp_default");
		if(jspfile=="") jspfile= "components/forms/form_email/FormEMail.jsp";
		var selector = "div#emailform"+this.id+" form";
		var params = "action=1&";
		params += this.getRequestParams();
		var Me = this;
		$jq.ajax({
    		async: true,
       		type: "POST",
       		url: jspfile,
       		data: params,
       		dataType: "json",
       		error: function(request,msg,ex) {
       			ncm.showError(msg,ex,request);
       		},
       		success: function(json) {
				if(json!=null) {
					var url = "";
					if(json.wasSent) {
						url = Me.getSimpleField("SUCCESS_PAGE");
					} else {
						url = Me.getSimpleField("ERROR_PAGE");
					}
					window.location.href = url;			
				}
			}
   		});
		this.showDialog(FormEMail.getProperty("lang_sending"),true);
	},
	
	getRequestParams: function() {
		var res = "objId=";
		res += this.id;
		res += "&issueId=";
		res += FormEMail.issueId;
		res += "&language=";
		res += FormEMail.language;
		res += "&channel=";
		res += FormEMail.channel;
		res += "&isPreview=";
		res += FormEMail.inPreview;
		res += "&whitelist=";
		res += FormEMail.getProperty("upload_whitelist");
		res += "&blacklist=";
		res += FormEMail.getProperty("upload_blacklist");
		res += "&subject=";
		res += this.getSimpleField("SUBJECT");
		res += "&projectTitle=";
		res += FormEMail.getProperty("lang_project_title");
		res += "&mailTitle=";
		res += FormEMail.getProperty("lang_mail_title");
		return res;
	},
	
	getSimpleField: function(fieldName) {
		var res = this.simplefields[fieldName];
		if(res==null) res="";
		if(typeof(res)=="undefined") res="";
		return res;
	},
	
	showErrorMessage: function(json) {
		var className = FormEMail.getProperty("class_label_incorrect");
		var message = "";
		if(!json.valid) {
			if(json.wrongObligFields.length) {
				message += FormEMail.getProperty("lang_inputoblig");
				message += "<br/>";
				for(var i=0;i<json.wrongObligFields.length;i++) {
					message += "&nbsp;&nbsp;* "+json.wrongObligFields[i].title;
					message += "<br/>";
					var sel = "#field"+json.wrongObligFields[i].id;
					$jq(sel).parent().addClass(className).prev().addClass(className);
				}
			}
			if(json.wrongConfirmFields.length) {
				for(var i=0;i<json.wrongConfirmFields.length;i++) {
					message += FormEMail.getProperty("lang_confirmed_message");
					message += " ";
					message += json.wrongConfirmFields[i].title;
					message += " ";
					message += FormEMail.getProperty("lang_and");
					message += " ";
					message += FormEMail.getProperty("lang_repeat");
					message += " ";
					message += json.wrongConfirmFields[i].title;
					message += "<br/>";
					var sel = "#field"+json.wrongConfirmFields[i].id;
					$jq(sel).parent().addClass(className).prev().addClass(className);
				}
			}
			if(json.wrongEmailFields.length) {
				message += FormEMail.getProperty("lang_wrongemail");
				message += "<br/>";
				for(var i=0;i<json.wrongEmailFields.length;i++) {
					message += "&nbsp;&nbsp;* "+json.wrongEmailFields[i].title;
					message += "<br/>";
					var sel = "#field"+json.wrongEmailFields[i].id;
					$jq(sel).parent().addClass(className).prev().addClass(className);
				}
			}
			if(json.wrongDateFields.length) {
				message += FormEMail.getProperty("lang_wrongdate");
				message += "<br/>";
				for(var i=0;i<json.wrongDateFields.length;i++) {
					message += "&nbsp;&nbsp;* "+json.wrongDateFields[i].title;
					message += "<br/>";
					var sel = "#field"+json.wrongDateFields[i].id;
					$jq(sel).parent().addClass(className).prev().addClass(className);
				}
			}
		}
		if(message!="") {
			var html = "<p>";
			html += message;
			html += "</p>";
			this.showDialog(html);
		}
	},
	
	clearErrorMessage: function() {
		this.hideDialog();
		var className = FormEMail.getProperty("class_label_incorrect");
		var selector = "div#emailform"+this.id+" form ."+className;
		$jq(selector).removeClass(className);
	},
	
	hideDialog: function() {
		var selector = "div#dialog"+this.id;
		$jq(selector).html("");
		if(this.dialog!=null) {
			this.dialog.hide();
		}
	},
	
	showDialog: function(html,append) {
		window.scrollTo(0,0);
		var selector = "div#dialog";
		selector += this.id;
		if(this.dialog==null) {
			this.dialog = $jq(selector).html(html).dialog().parent().parent();	
		} else {
			if(append) {
				$jq(selector).append(html);
			} else {
				$jq(selector).html(html);	
			}
			this.dialog.show();
		}
	},
	
	reset: function() {
   		var selector = "div#emailform"+this.id+" form";
		$jq(selector+" :text").each(function(i){
			this.value = "";
		});
		$jq(selector+" :file").each(function(i){
			this.value = "";
		});
		$jq(selector+" :radio").each(function(i){
			this.checked = false;
		});
		$jq(selector+" :checkbox").each(function(i){
			this.checked = false;
		});
		$jq(selector+" select").each(function(i){
			this.options[0].selected = true;
		});
		$jq(selector+" textarea").html("");
   	},
	
	openCalendar: function(elemId) {
		var Me = this;
		var elem = document.getElementById(elemId);
		var elemD = document.getElementById(elemId+"-dayOfMonth");
		var elemM = document.getElementById(elemId+"-month");
		var elemY = document.getElementById(elemId+"-year");
		$jq(elem).datepicker({
			beforeShow: function(input) {
				if(elemD!=null && elemM!=null && elemY!=null) {
					if($jq(elemD).val() && $jq(elemM).val() && $jq(elemY).val()) {
						$jq(elem).val($jq(elemD).val()+"/"+$jq(elemM).val()+"/"+$jq(elemY).val());	
					}
				}
			},
			onSelect: function(date) {
				if (elemD != null && elemM != null && elemY != null) {
					var arr = date.split("/");
					$jq(elemD).val(arr[0]);
					$jq(elemM).val(arr[1]);
					$jq(elemY).val(arr[2]);
				}
				var selector = "div#emailform";
				selector += Me.id;
				selector += " input[id$=";
				selector += elemId;
				selector += "]";
				$jq(selector).val(date); 
			}
		});
		$jq.datepicker.enableFor(elem);
		$jq.datepicker.showFor(elem);
	},
	
	checkLinkedDays: function (fieldId) {
		var elem = document.getElementById(fieldId);
		var elemD = document.getElementById(fieldId+"-dayOfMonth");
		var elemM = document.getElementById(fieldId+"-month");
		var elemY = document.getElementById(fieldId+"-year");
		if(elemD!=null && elemM!=null && elemY!=null) {
			if($jq(elemD).val()!="" && $jq(elemM).val()!="" && $jq(elemY).val().length==4) {
				var daysInMonth = 32 - new Date($jq(elemY).val(),$jq(elemM).val()-1,32).getDate(); 
        		$jq("option",elemD).attr('disabled',''); 
        		$jq("option:gt("+daysInMonth+")",elemD).attr('disabled', 'disabled'); 
    			if ($jq(elemD).val() > daysInMonth) { 
        			$jq(elemD).val(daysInMonth); 
    			}
				$jq(elem).val($jq(elemD).val()+"/"+$jq(elemM).val()+"/"+$jq(elemY).val());	
			} else {
				$jq(elem).val("");
			}
		}
	},
	
	createUploadIframe: function(uri) {
		//create frame
        var frameId = 'jUploadFrame' + this.id;
        if(window.ActiveXObject) {
            var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
            if(typeof(uri) == "boolean"){
            	io.src = 'javascript:false';
            } else if(typeof uri== "string") {
                io.src = uri;
            }
        } else {
            var io = document.createElement('iframe');
            io.id = frameId;
            io.name = frameId;
        }
        io.style.position = 'absolute';
        io.style.top = '-1000px';
        io.style.left = '-1000px';

        document.body.appendChild(io);
        this.uploadIframe = io;			
    }
};

FormEMail.instances = new Array();
FormEMail.properties = new Array();
FormEMail.datatype = null;
FormEMail.jsp_utils = null;
FormEMail.language = null;
FormEMail.pageUrl = null;
FormEMail.channel = null;
FormEMail.inPreview = false;
FormEMail.issueId = null;
FormEMail.skin = null;

FormEMail.register = function(objectId) {
	var frmObject = new FormEMail();
	frmObject.initialize(objectId);
	FormEMail.instances[""+objectId] = frmObject;
}

FormEMail.getRegistered = function(objectId) {
	return FormEMail.instances[""+objectId];
}

FormEMail.get = function(objectId) {
	return FormEMail.getRegistered(objectId);
}

FormEMail.initProperties = function(options) {
	ncm.initProperties(FormEMail,options);
}

FormEMail.getProperty = function(propName) {
	var res = FormEMail.properties[propName];
	if(res==null) res="";
	if(typeof(res)=="undefined") res="";
	return res;
}
