/**
* @Author: Xanthos Innovative Solutions
* @Version: 1.5
* @XISDateTimePicker.js -> Facorty controller for several calendars.
**/
var instance_array = new Array();

function dateTimePicker(calendar_name) { // The factroy class
 	
	var STRsetDisplayAreaDIVElement;
	var STRsetResultTextField;
	var STRsetHoursResultField;
	var STRsetMinutesResultField;
	var STRsetSecondsResultField;
	var STRsetDayResultField;
	var STRsetMonthResultField;
	var STRsetYearResultField;
	var STRsetDayNameResultField;
	var cal_instance;
	var language;
	var resFieldInd ="";
	var error = false;
	var STR_se;
	var STR_me;
	var STR_he;
	var STR_Me;
	var STR_De;
	var STR_Ye;
	var STR_Dn;
	var STR_RESform;
	var ttp_status = true;
	
	dateTimePicker.searchInstance = function (name) {
	
		var buf;
		
	for (var i=0; i<instance_array.length;i++) {

		if (instance_array[i].Name == name) buf = i;
		
	}

	return instance_array[buf];
}

	this.setDisplayAreaDIVElement = function(a) {
		this.STRsetDisplayAreaDIVElement = a;
	}
	
	this.setResultTextField = function(b,format) {
		if (resFieldInd == "" || resFieldInd == "RES")	{
			this.STRsetResultTextField = b;
			this.STR_RESform = format;
			resFieldInd = "RES";
		}
		else alert("Splitted result fields have been set.\nPlease remove the 'setResultTextField' method from configuration.");
	}
	
	this.setHoursResultField = function (fieldname, format) {
		if (resFieldInd == "" || resFieldInd == "SPL")	{
					this.STRsetHoursResultField = fieldname;
					this.STR_he = format;
					resFieldInd = "SPL";
		}
		else this.error = true;
	}
	this.setMinutesResultField = function (fieldname, format) {
			if (resFieldInd == "" || resFieldInd == "SPL")	{
					this.STRsetMinutesResultField = fieldname;
					this.STR_me = format;
					resFieldInd = "SPL";
			}
			else this.error = true;
	}
	this.setSecondsResultField = function (fieldname, format) {
			if (resFieldInd == "" || resFieldInd == "SPL")	{
					this.STRsetSecondsResultField = fieldname;
					this.STR_se = format;
					resFieldInd = "SPL";
			}
			else this.error = true;
	}
	this.setDayResultField = function (fieldname, format) {
			if (resFieldInd == "" || resFieldInd == "SPL")	{
					this.STRsetDayResultField = fieldname;
					this.STR_De = format;
					resFieldInd = "SPL";
			}
			else this.error = true;
	}
	this.setYearResultField = function (fieldname, format) {
			if (resFieldInd == "" || resFieldInd == "SPL")	{
					this.STRsetYearResultField = fieldname;
					this.STR_Ye = format;
					resFieldInd = "SPL";
			}
			else this.error = true;
	}
	
	this.setDayNameResultField = function (fieldname, format) {
			if (resFieldInd == "" || resFieldInd == "SPL")	{
					this.STRsetDayNameResultField = fieldname;
					this.STR_Dn = format;
					resFieldInd = "SPL";
			}
			else this.error = true;
			
	}
	this.setMonthResultField = function (fieldname, format) {
			if (resFieldInd == "" || resFieldInd == "SPL")	{
					this.STRsetMonthResultField = fieldname;
					this.STR_Me = format;
					resFieldInd = "SPL";
			}
			else this.error = true;
	}
	
	this.setTooltipDisabled = function () {
		this.ttp_status = false;
	}
	
	this.setLanguage = function (lang) {
		this.language = lang;
	}
	
// ---------------------------------------------------------------------------------	
	this.init = function () {
		if (this.error) {
			alert("General result field has been set.\nPlease remove the 'set....ResultField' methods from configuration.");
			
		}
		if (resFieldInd =="") {
			alert("Errorneus configuration. No result field/s has/have been set.");
	
			}
			
		//cal_instance = new dtp();
		
		var len;
		if (instance_array.length==null) len = 0;
		else len = instance_array.length;
		

		instance_array[len] = new dtp();


		
		instance_array[len].setLanguage(this.language);
		instance_array[len].cal_target_year = this.STRsetYearResultField;
		instance_array[len].cal_target_month = this.STRsetMonthResultField;
		instance_array[len].cal_target_day = this.STRsetDayResultField;
		instance_array[len].cal_target_dayname = this.STRsetDayNameResultField;
		instance_array[len].cal_target_hours = this.STRsetHoursResultField;
		instance_array[len].cal_target_minutes = this.STRsetMinutesResultField;
		instance_array[len].cal_target_seconds = this.STRsetSecondsResultField;
		
		instance_array[len].setConfig("date_format_seconds_external",this.STR_se);
		instance_array[len].setConfig("date_format_minutes_external",this.STR_me);
		instance_array[len].setConfig("date_format_hours_external",this.STR_he);
		instance_array[len].setConfig("date_format_year_external",this.STR_Ye);
		instance_array[len].setConfig("date_format_month_external",this.STR_Me);
		instance_array[len].setConfig("date_format_day_external",this.STR_De);
		instance_array[len].setConfig("date_format_dayname_external",this.STR_Dn);
		instance_array[len].setTooltipDisabled(this.ttp_status);
		instance_array[len].setResultTextField(this.STRsetResultTextField, this.STR_RESform);
		instance_array[len].setDisplayAreaDIVElement(this.STRsetDisplayAreaDIVElement);
		
		instance_array[len].Name = calendar_name;
		
				
	
		
		instance_array[len].cal_initDate = new Date();
		instance_array[len].init();
	}
	
	
	dateTimePicker.editTime = function (name) { dateTimePicker.searchInstance(name).editTime(name);}
	
	dateTimePicker.resetTimer = function (name) { dateTimePicker.searchInstance(name).resetTimer(name); }
	
	/**
		* Going to an upcomming period which is stored in the parameters
		**/
		dateTimePicker.nextPeriod = function(name,month,year) {
		
			ndate = new Date();
			
			if (month<=13) {
				
				if (month==13) {
					ndate.setMonth(0);
					ndate.setFullYear(year+1);
				}
				else{
				ndate.setMonth(month-1);
				ndate.setFullYear(year);
				}		
			}
			else {
				ndate.setMonth(0);
				ndate.setFullYear((year+1));
			}
			// refresh calendar
			dateTimePicker.searchInstance(name).cal_initDate = ndate;
			dateTimePicker.searchInstance(name).getCalendar();
			
			
		}
		
		/**
		* Going to an preceeding period which is stored in the parameters
		**/
		dateTimePicker.previousPeriod = function(name,month,year) {
			
			ndate = new Date();
			if (month>=1) {
				ndate.setMonth(month-1);
				ndate.setFullYear(year);
			}
			else
			{
				ndate.setMonth(11);
				ndate.setFullYear(year-1);
			}
			// refresh calendar
			dateTimePicker.searchInstance(name).cal_initDate = ndate;
			dateTimePicker.searchInstance(name).getCalendar();
			
		}
		
		
		dateTimePicker.close = function (name) {
  	dateTimePicker.searchInstance(name).close();
		delete dateTimePicker.searchInstance(name);
		
		}
		
		dateTimePicker.pickDate =function(name,str) {
			dateTimePicker.searchInstance(name).pickDate(str);
		}
		
		dateTimePicker.getTooltip = function(name,id,date) {
			//var P =dateTimePicker.searchInstance(name);
			dateTimePicker.searchInstance(name).getTooltip(id,date);
		}
		
		dateTimePicker.unsetTooltip = function(name) {
			//var P =dateTimePicker.searchInstance(name);
			dateTimePicker.searchInstance(name).unsetTooltip();
		}
		
		dateTimePicker.getElementX = function(element) {
			var SCROLL_LEFT = 0, SCROLL_TOP = 0;
			var is_div = /^div$/i.test(element.tagName);
			if (is_div && element.scrollLeft)
				SCROLL_LEFT = element.scrollLeft;
			if (is_div && element.scrollTop)
				SCROLL_TOP = element.scrollTop;
			var range = { x: element.offsetLeft - SCROLL_LEFT, y: element.offsetTop - SCROLL_TOP };
			if (element.offsetParent) {
				var tmpx = this.getElementX(element.offsetParent);
				var tmpy = this.getElementY(element.offsetParent);
				range.x += tmpx;
				range.y += tmpy;
			}
			return range.x;
		}
		
		dateTimePicker.getElementY = function(element) {
			var SCROLL_LEFT = 0, SCROLL_TOP = 0;
			var is_div = /^div$/i.test(element.tagName);
			if (is_div && element.scrollLeft)
				SCROLL_LEFT = element.scrollLeft;
			if (is_div && element.scrollTop)
				SCROLL_TOP = element.scrollTop;
			var range = { x: element.offsetLeft - SCROLL_LEFT, y: element.offsetTop - SCROLL_TOP };
			if (element.offsetParent) {
				var tmpx = this.getElementX(element.offsetParent);
				var tmpy = this.getElementY(element.offsetParent);
				range.x += tmpx;
				range.y += tmpy;
			}
			return range.y;
		}
		
		this.setPositionNearElement = function(element,plusx,plusy) {
			
			var x = dateTimePicker.getElementX(document.getElementById(element));
			var y = dateTimePicker.getElementY(document.getElementById(element));

			document.getElementById(this.STRsetDisplayAreaDIVElement).style.top = (y+plusy);
			document.getElementById(this.STRsetDisplayAreaDIVElement).style.left = (x+plusx);
			document.getElementById("dtp_tooltip").style.top = (y+plusy);
			document.getElementById("dtp_tooltip").style.left = (x+plusy);
		}

		dateTimePicker.CopyRight = function(name) {
			var textGPL="<strong>XISDateTimePicker</strong><br/>&copy; 2007, Xanthos Innovative Solutions, Steinbrecher u. Stadtfeld GbR"+
			"<br/><a href=\"http://www.xanthos-solutions.com\">http://www.xanthos-solutions.com</a><br/>" +
			"This tool is licensed under the GNU General Public License.<br/>" +
			"Commercial use is not permitted.<br/>For commercial use (BSD license) please visit our website.<br/><p align=\"right\"><a href=\"javascript:dateTimePicker.close_copyright('"+name+"')\">Close window</a></p>";

			
			var x = dateTimePicker.getElementX(document.getElementById("xis_c_mark"+name));
			var y = dateTimePicker.getElementY(document.getElementById("xis_c_mark"+name));
			document.getElementById("xis_copyright"+name).style.top = y;
			document.getElementById("xis_copyright"+name).style.left = x;
			document.getElementById("xis_copyright"+name).innerHTML = textGPL;
			document.getElementById("xis_copyright"+name).style.display = "block";
			

		}
		
		dateTimePicker.close_copyright = function(name) {
			document.getElementById("xis_copyright"+name).innerHTML = "";
			document.getElementById("xis_copyright"+name).style.display = "none";
		}
	
}
