﻿/**
 * @author Kenneth.priisholm
 */
var DanBolig = DanBolig || {};

DanBolig.Transfer = function(){
	//private fields
	var fields = {
		m_searchType                : { type : "singlevalue" },
		m_districts                 : { type : "multivalue", service : "/Ajax/AjaxDistricts.aspx?district=", element: "District", attrId: "DistrictId", attrName: "Name" },
		m_zipCodes                  : { type : "multivalue", service : "/Ajax/AjaxZipCodes.aspx?zipcode=", element: "ZipCode", attrId: "ZipCodeId", attrName: "Name"  },
		m_cityAreas                 : { type : "multivalue", service : "/Ajax/AjaxCityAreas.aspx?cityarea=", element: "CityArea", attrId: "CityAreaId", attrName: "Name"  },
		m_propertyTypes             : { type : "multivalue", service : "/Ajax/AjaxPropertyTypes.aspx?propertytype=", element: "PropertyType", attrId: "PropertyTypeId", attrName: "PropertyTypeName" },
		m_propertySearchFilters     : { type : "multivalue", service : "/Ajax/AjaxPropertySearchFilters.aspx?searchfilter=", element: "PropertySearchFilter", attrId: "PropertySearchFilterId", attrName: "PropertySearchFilterName" },
		m_excludeProjectSales       : { type : "singlevalue" },
		m_polyCoordsHidden          : { type : "singlevalue" },
		m_priceRangeType            : { type : "singlevalue" },
		m_priceRangeMinimum         : { type : "singlevalue" },
		m_priceRangeMaximum         : { type : "singlevalue" },
		m_minimumPropertySize       : { type : "singlevalue" },
		m_minimumPropertyLotSize    : { type : "singlevalue" },
		m_minimumNumberOfRooms      : { type : "singlevalue" },
		m_address                   : { type : "singlevalue" },
		m_roadNumber                : { type : "singlevalue" },
		m_zipCode                   : { type : "singlevalue" },
		m_town                      : { type : "singlevalue" },
		m_distance                  : { type : "singlevalue" },
		m_distanceType              : { type : "singlevalue" }
	};
	var dataManager;
	var state = 0;
	//end of private fields
	return { //public functions
		init : function(){
		    /*if(window.ActiveXObject && typeof XMLHttpRequest == 'undefined'){ //IE
                setTimeout(DanBolig.Transfer.load, 500);
            }
            else {
                DanBolig.Transfer.load();
            }*/
             DanBolig.Transfer.load();
		},
		load : function () {
            for(var o in fields){
			    var cssClass = fields[o].type;
			    var elm = $(o);
				if(!elm){
					throw "Field '" + fields[o] + "' not found."
				}
				$D.addClass(elm, cssClass);
			}
			
			dataManager = DanBolig.Global.dataManager || null;
			if(!dataManager){
				throw "DanBolig.Transfer.init: No global DataManager.";
			}
			
			var data = {};
			for(var o in fields){
			
			    if(fields[o]["service"]){
			        DanBolig.Transfer.getData(o);
			        continue;
			    }
			    
			    var elm = $(o);
			    if($D.hasClass(elm, "multivalue")){ //multivalue field
				    data[o] = [];
				    if(elm.value && elm.value.length > 0){
				        if(elm.value.match(/,/)){ //more than one value
					        data[o] = elm.value.split(',');
					        for(var i = 0, l = data[o].length; i < l; i++){
						        var obj = {};
						        obj.value = data[o][i].trim();
						        obj.text = null;
						        data[o][i] = obj;
					        }
					    }
					    else {
					        var obj = {};
					        obj.value = elm.value;
					        obj.text = null;
					        data[o].push(obj);
					    }
					}
					
				}
				else if($D.hasClass(elm, "singlevalue")){ //singlevalue field
				    var obj = {};
				    if(o == "m_distance"){
			            obj.value = Math.round(parseInt(elm.value.trim())/1000).toString();
			        }
			        else {
			            obj.value = elm.value.trim();
			        }
					obj.text = null;
					data[o] = obj;
				}
			}
			dataManager.update("DanBolig.Transfer", data);
			state = 1;
		},
		getData : function(type){
		    var field = fields[type];
		    var createObject = function(element) {
		        var obj = {};
            	obj.value = element.getAttribute(field.attrId);
            	
                obj.text = element.getAttribute(field.attrName);
                if(element.tagName == "ZipCode"){ //exception to general rule
                    obj.text = element.getAttribute(field.attrId) + " " + obj.text;
                }
                return obj;
		    };
            var elm = $(type);
            if(!elm){
                return;
            }
		    var url = field["service"] + elm.value; 
		    
		    if(type == "m_propertySearchFilters" && url == field["service"]){
		        //console.log("bail out: " + url);
		        return;
		    }
		    var data = {};
		    var handlers = { 
                success: function(o){
		            var root = o.responseXML;
		            var elements = root.getElementsByTagName(field.element);
		            if($D.hasClass(elm, "multivalue")){ //multivalue field
				        data[type] = [];
				        for(var i = 0, l = elements.length; i < l; i++){
		                    data[type].push(createObject(elements[i]));
		                }
				    }
		            else if($D.hasClass(elm, "singlevalue")){ //singlevalue field
					    data[type] = createObject(elements[0]);
				    }
			        dataManager.update("DanBolig.Transfer", data );
		        }, 
                failure: function(o){
                    if(o.responseText){
		                alert("Der opstod en fejl: " + o.responseText);
		            }
		            else {
		                alert("Der opstod en uventet fejl.");
		            }
		        }
            };
            request = $CN.asyncRequest('GET', url, handlers);
		},
		update : function (type, args){
		    if(state !== 1){
		        return;
		    }
		    var _this = DanBolig.Transfer;
			if(args[0]["provider"] && args[0]["provider"] != "DanBolig.Transfer"){
				var data = args[0]["data"];
				if(data){
					for(var key in data){
					    if(!$(key)){//ignore field
					        continue;
					    }
						else if(data[key] instanceof Array){
						    $(key).value = data[key].map(
							    function(el, i, ar) {
                                    return el.value;
                                }
							).join(',');
						}
						else {
						    var val = data[key].value || "";
						    if(key == "m_distance" && val != ""){
						        val = (parseInt(val)*1000).toString();
						    }
						    
						    $(key).value = val;
						}
					}
				}
			}				
		}
	}
}();