if(!window.markt){
	markt= {};
}
if(window.markt.widget){
	alert("markt widget is already in use");
}
markt.widget = function() {
  var me = this;

  var initValues = {
    'limit':15,
    'offset':0,
    'defaultKeyword':null,
    'idWidgetContainer':'markt_widget_container',
    'advertTemplateId':null,
    'advertTemplateName':null,
    'defaultImage':'http://www.markt.de/image/markt/thumbnails/dummy_1000000000.gif',
    'searchButtonText':'Suche',
    'defaultCategory':'1000000000',
    'defaultRegion':null,
    'defaultRadius':null,
    'defaultNickName':null,
    'widgetStylesheet':null,
    'serverUrl':'http://www.markt.de'
  };

  var searchPath = '/webservice/advertwidget/search';

  var widgetEntryTemplates = {
    'subjectOnly':
      '<div class="markt_widget_entry markt_widget_entryTemplate_subject">\r\n' +
      '<div class="markt_widget_entry_subject">\r\n<a href="[%exposeUrl%]" target="_blank">[%subject%]</a>\r\n' +
      '</div></div>',

    'subjectAndTeaser':
      '<div class="markt_widget_entry markt_widget_entryTemplate_subjectTeaser">\r\n' +
      '<div class="markt_widget_entry_subject">\r\n<a href="[%exposeUrl%]" target="_blank">[%subject%]</a>\r\n</div>\r\n' +
      '<div class="markt_widget_entry_teaser">[%teaser%]</div></div>',
        
    'completeAdvert':
      '<div class="markt_widget_entry markt_widget_entryTemplate_imageSubjectTeaser">\r\n<div class="markt_widget_entry_image">\r\n'+
      '<img src="[%thumbnail%]" alt="[%subject%]" height="87" width="116">\r\n</div>\r\n'+
      '<div class="markt_widget_entry_subject">\r\n<a href="[%exposeUrl%]" target="_blank">[%subject%]</a>\r\n\r\n</div>'+
      '<div class="markt_widget_entry_teaser">\r\n<p>[%teaser%]</p>\r\n</div>\r\n</div>'
  };
  
  var loadIndicator = "<div class='markt_widget_loadIndicator'><img src='http://www.markt.de/image/markt/ajax-loader-small.gif' /> Lade Anzeigen </div>"

  var widgetEntryTemplate = widgetEntryTemplates.completeAdvert;	
  var priceTypes = {'EXT':'Festpreis','BA':'Bestes Angebot', 'ZV':'Zu verschenken', 'VB':'Verhandlungsbasis', 'TA':'Tausch'};
  var widgetFooter = "";

  function init(thisInitValues) {
    if (thisInitValues) {
      for (valueName in thisInitValues) {
        if (thisInitValues[valueName]) {
          initValues[valueName] = thisInitValues[valueName];	
        }
      }
    }
    
    var templateObj = document.getElementById(initValues.advertTemplateId);
    if (templateObj) {
      widgetEntryTemplate = templateObj.innerHTML;
    } else if (widgetEntryTemplates[initValues.advertTemplateName]) {
      widgetEntryTemplate = widgetEntryTemplates[initValues.advertTemplateName];
    }

    if(!initValues.defaultKeyword){
      initValues.defaultKeyword ='';
    }
  }

  function transformAdvert(advert) {
    advert = prepareAdvert(advert);
    var returnValue = widgetEntryTemplate;
    returnValue = returnValue.replace(/%5D/gi,"]");
    returnValue = returnValue.replace(/%5B/gi,"[");
    for (fieldName in advert) {
      var regExp = new RegExp('\\[%'+fieldName+"%\\]",'gi');
      if (fieldName == 'priceType') {
        returnValue = returnValue.replace(regExp, formatPriceType(advert[fieldName]));
      } else if (fieldName == 'activatedOn' || fieldName == 'createdOn' || fieldName == 'expiresOn') {
        returnValue = returnValue.replace(regExp, formatDate(advert[fieldName]));
      } else {
        returnValue = returnValue.replace(regExp, advert[fieldName]);
      }
    }
    return returnValue;
  }

  function prepareAdvert(advert) {
    if (!advert) {
      return;
    }
    advert = prepareAdvertThumbnail(advert);
    return advert;
  }
  
  function prepareAdvertThumbnail(advert) {
    if (!advert.thumbnail) {
      advert.thumbnail = initValues.defaultImage;
    }
    return advert;
  }
	
  function formatPriceType(priceType){
    return priceTypes[priceType] ? priceTypes[priceType] : '';
  }
	
  function formatDate(theDate) {
    if ((!theDate) || isNaN(theDate)) {
      return theDate;
    }
    var diff = new Date().getTime() - theDate;
    if (diff < 3600000 && diff > 0) {
      return 'vor ' + (diff / 60000).toFixed(0) +' Minuten';
    } else if (diff < 86400000 && diff > 0) {
      return 'vor ' + (diff / 3600000).toFixed(0) +' Stunden';
    } else {
      var temp = new Date(theDate);
      return temp.getDate() + '.' + temp.getMonth() + '.' + temp.getFullYear();
    }
  }
  
  function doWidgetSearch() {
    var outArea = document.getElementById(initValues.idWidgetContainer);
    if (outArea) {
      if(outArea.innerHTML) {
        widgetFooter = outArea.innerHTML;
        outArea.innerHTML = loadIndicator + outArea.innerHTML;
      }
    }
    var searchScriptUrl = getWidgetSearchScriptUrl();
    loadScript(searchScriptUrl); //create script tag and wait for callback
  }
  
  function getWidgetSearchScriptUrl() {
    var searchCriteria = [];
    searchCriteria.push(initValues.serverUrl);
    searchCriteria.push(searchPath);
    searchCriteria.push('?offset=');
    searchCriteria.push(initValues.offset);
    searchCriteria.push('&limit=');
    searchCriteria.push(initValues.limit);
    if (initValues.defaultNickName) {
      searchCriteria.push('&vendorsNick=');
      searchCriteria.push(initValues.defaultNickName);        
    } else {
      if (initValues.defaultKeyword) {
        searchCriteria.push('&keywords=');
        searchCriteria.push(initValues.defaultKeyword);
      }
      if (initValues.defaultCategory && initValues.defaultCategory != "0") {
        searchCriteria.push('&categoryId=');
        searchCriteria.push(initValues.defaultCategory);
      }
      if (initValues.defaultRegion) {
        searchCriteria.push('&geoName=');
        searchCriteria.push(initValues.defaultRegion);
        if (initValues.defaultRadius) {
          searchCriteria.push('&radius=');
          searchCriteria.push(initValues.defaultRadius);
        }
      }
    }
    searchCriteria.push('&callbackfunction=markt.widget.drawWidgetEntriesCallback');
    
    return searchCriteria.join('');
  }
  
  function loadScript(src) {
    var header = document.getElementsByTagName('head')[0];
    var newScriptTag = document.createElement("script");
    newScriptTag.type = 'text/javascript';
    newScriptTag.src = src;
    header.appendChild(newScriptTag);
  }
  
  function loadStyles() {
    var header = document.getElementsByTagName('head')[0];
    var newLinkTag = document.createElement("link");
    newLinkTag.rel= 'stylesheet';
    newLinkTag.type = "text/css";
    newLinkTag.media = "screen,projection";
    newLinkTag.href = initValues['widgetStylesheet'];
    header.appendChild(newLinkTag);
  }

  return { 
    drawWidgetEntriesCallback: function(entries) {
      if (!entries) {
        entries = {};
      }
      if (!entries.adverts) {
        entries.adverts = [];
      }
    
      var out = [];
      for(var i = 0; i < entries.adverts.length; i++){
        var advert = entries.adverts[i];
        var advertOut = transformAdvert(advert);
        out.push(advertOut);
      }
      out.push(widgetFooter);
      var widgetContainer = document.getElementById(initValues['idWidgetContainer']);
      if (widgetContainer) {
        widgetContainer.innerHTML = out.join('');
      }
    },
		
    widgetOnload: function() {
      init(marktAdvertWidgetConfiguration);
      loadStyles();
      doWidgetSearch();
    },
    
    hookOnload: function() {
      var oldonload = window.onload;
      if (!oldonload) {
        window.onload = markt.widget.widgetOnload;
      } else {
        window.onload = function() {
          oldonload();
          markt.widget.widgetOnload();
        };
      }
    }
  };
}();
markt.widget.hookOnload();
