var nextId = 0;
var counters = new Object();

var countdownCookie;
var interval = null;
var lastSeconds = -1;
var timeout;

var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var daysAfterMonth; 

var noCombobox = false;

function setup() {
    if (location.href.toLowerCase().indexOf("m.countdownr.com") >= 0) {      
      window.open("http://www.countdownr.com/mobile.html" + location.search, "_self");
    }
  
    if (navigator.userAgent.indexOf("MSIE") >= 0) {
      document.getElementById("IeMsg").style.display = "block";
      document.getElementById("PredefinedPopup").style.display = "none";
      document.getElementById("PredefinedCalPopup").style.display = "none";
    }
    
    fillPredefinedEvents();
    fillPredefinedCalendars();
    
    document.getElementById("AddButton").onclick = addNewCounter;
    
    countdownCookie = new Cookie("Countdown-IDs");
    var ids = null;
    try {
      ids = eval(countdownCookie.get());
      reloadCounters(ids);
    }
    catch (e) {
      ids = null;
      //load defaults
    }
    if (ids == null || ids.length <= 1) {      
      createDefaultCounters();
    }
    
    this.daysAfterMonth = new Array(12);
    var count = 0;
    for (var i = 0; i < 12; i++) {
  	  daysAfterMonth[i] = count;
  	  count += daysInMonth[i];
    }
    
    DWRUtil.addOptions("MonthSelect", ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]);
    $("MonthSelect").onchange = fillDaySelect;
  
    $("MonthSelect").selectedIndex = 0;

    fillYearSelect();
    $("YearSelect").onchange = fillDaySelect;

    fillDaySelect();
    fillWeekSelect();
    fillHourSelect();
    fillMinuteSelect();
  
    DWRUtil.addOptions("RepeatSelect", ["None", "Yearly", "Monthly", "Daily", "Weekly"]);
    $("RepeatSelect").onchange = repeatChanged;    
    
    $("SoundSelect").onchange = function() {
      var sound = $("SoundSelect").value;
      if (sound != null && sound.length > 0) {
        Countdown.playSound(sound);
      }
    }
    
    $("LogoUrl").onchange = logoSelected;
    $("TimeMethod").checked = true;
    
    parseParameters();
    
    if (interval) {
      clearInterval(interval);
    }
    interval = setInterval(update, 200);
    document.getElementById("MainLoading").style.visibility = "hidden"; 
}

function parseParameters() {
  try {
    var search = location.search;
    if (search != null && search.length > 0) {
      var url = getParameter(search, "calendar", null);
      if (url != null) {
        //Adding Google Calendar
        var logo = getParameter(search, "logo", "calendar.png");
        createNewCounter(null, null, null, url, logo);
        location.search = "";
        return;
      }
      //Adding Date Coundown
      var title = getParameter(search, "title", "Countdown");
      if (title != null) {
        var timeString = getParameter(search, "time", null);
        if (timeString != null) {
          var numbers = timeString.split("_");
          var time = new Date(parseInt(numbers[0]), parseInt(numbers[1], 10) - 1, parseInt(numbers[2], 10), parseInt(numbers[3], 10), parseInt(numbers[4], 10));
          var timeZone = parseInt(getParameter(search, "timeZone", 99));
          if (timeZone != 99) {
            var zone = time.getTimezoneOffset();
            time.setMinutes(time.getMinutes()-zone + 60*timeZone);
          }
          var repeat = parseInt(getParameter(search, "repeat", 0));
          var logo = getParameter(search, "logo", "clock.png");
          if (logo.length == 0) {
            logo = "clock.png";
          }
          var counter = createNewCounter(title, time, repeat, null, logo);
          var url = getParameter(search, "url", "");
          if (url.length > 0) {
            counter.time.url = url;
          }
          saveCounter(counter);
          location.search = "";
        }
      }
    }
  }
  catch (e) {
    alert("Failed to parse URL parameters: " + e);
  }
}

function getParameter(src, key, defaultValue) {
  if (src.indexOf("&amp;") >= 0) {
    src = src.replace(/\&amp\;/g, "&");
  }
  var index = src.indexOf("&" + key + "=");
  if (index < 0) {
    index = src.indexOf("?" + key + "=");
  }
  if (index >= 0) {
    var index2 = src.indexOf("&", index + 1);
    if (index2 >= 0) {
      return decode(src.substring(index + key.length + 2, index2));
    }
    return decode(src.substring(index + key.length + 2));
  }
  return defaultValue;   
}

function decode(value) {
  var result = decodeURIComponent(value);
  return result.replace(/(\+)/g, " ");
}

function getTimeString() {
  var repeat = $("RepeatSelect").selectedIndex;
  if (repeat < 4) {
    var date = new Date($("YearSelect").value, $("MonthSelect").selectedIndex, 
                        $("DaySelect").selectedIndex + 1, $("HourSelect").selectedIndex, $("MinuteSelect").selectedIndex);
  }
  else {
    var date = new Date();
    var diff = $("WeekSelect").selectedIndex - date.getDay();
    if (diff < 0) {
      diff += 7
    }
    date.setDate(date.getDate() + diff);
    date.setHours($("HourSelect").selectedIndex);
    date.setMinutes($("MinuteSelect").selectedIndex);
  }                      
  var month = date.getMonth() + 1;
  if (month < 10) {
    month = "0" + month;
  }
  var day = date.getDate();
  if (day < 10) {
    day = "0" + day;
  }
  var hour = date.getHours();
  if (hour < 10) {
    hour = "0" + hour;
  }
  var minute = date.getMinutes();
  if (minute < 10) {
    minute = "0" + minute;
  }
  return date.getFullYear() + "_" 
             + month + "_"
             + day + "_"
             + hour + "_"
             + minute;  
}

function createLink() {
  var logo = $("LogoUrl").value;
  var sound = $("SoundSelect").value;
  if ($("TimeMethod").checked) {
    var time = getTimeString();
    var repeat = $("RepeatSelect").selectedIndex;           
    var title = $("TitleInput").value;
    window.open("linking.html?time=" + time + "&repeat=" + repeat 
                + "&title=" + encodeURIComponent(title) + "&logo=" + logo + "&alert=" + sound, "_self");
  }              
  else {              
    var url = $("CalUrlInput").value;
    window.open('linking.html?calendar=' + encodeURIComponent(url) + "&logo=" + logo + "&alert=" + sound,
                "_self"); 
  }              
}  

function addToWidgetop() {
  var logo = $("LogoUrl").value;
  var sound = $("SoundSelect").value;
  if ($("TimeMethod").checked) {
    var time = getTimeString();
    var repeat = $("RepeatSelect").selectedIndex;           
    var title = $("TitleInput").value;
    window.open("http://www.widgetop.com?addCountdown=" + encodeURIComponent(title) + "&repeat=" + repeat 
                + "&time=" + time + "&logo=" + logo + "&alert=" + sound, "_blank");
  }              
  else {              
    var url = $("CalUrlInput").value;
    window.open('http://www.widgetop.com?addCalCountdown=' + encodeURIComponent(url) + "&logo=" + logo + "&alert=" + sound,
                "_blank"); 
  }              
}  

function createDefaultCounters() {
  clock = createNewCounter("Tomorrow", new Date(2007, 2, 9, 0, 0), 3, null, "clock.png");
  clock = createNewCounter("New Year", new Date(2008, 0, 1, 0, 0), 1, null, "logo.png");
  clock = createNewCounter("Weekend", new Date(2007, 2, 9, 17, 0), 4, null, "clock.png");
  clock = createNewCounter(null, null, null, "http://www.google.com/calendar/feeds/ht3jlfaac5lfd6263ulfh4tql8%40group.calendar.google.com/public/full", "calendar.png");
}

function reloadCounters(ids) {
  for (var i = 0; i < ids.length; i++) {
  	var cookie = new Cookie("Counter" + ids[i]);
  	try {
  	  var text = cookie.get();
    	var settings = eval("new Object(" + text + ")");
    	if (text != null) {
    	  if (settings.url) {
    	    var counter = createCounter(ids[i], null, null, null, settings.url, settings.logo);    	    
    	  }
    	  else {
    	    var counter = createCounter(ids[i], settings.title, new Date(settings.time), settings.repeat, null, settings.logo);
    	    counter.time.url = settings.link;
    	  }
    	  counter.alertSound = settings.sound;
    	  counter.cookie = cookie;
    	}
    	nextId = Math.max(nextId, ids[i]);
  	}
  	catch (e) {
  	  alert("Reloading counter " + ids[i] + " failed: " + e);
  	  cookie.remove();
  	}  
  }
  saveCounterIds();
  nextId++;
}

function saveCounterIds() {
  var text = "[";
  var container = document.getElementById("Countdowns");
  var divs = container.childNodes;
  for (var i = 0; i < divs.length; i++) {
  	if (divs[i].nodeType == 1) {
  	  text += divs[i].counter.id + ",";
  	}  
  }
  text += "null]";
  countdownCookie.store(text);
}

function saveCounter(counter) {
  var text = "{"
  if (counter.time.calUrl) {
    text += "url:'" + counter.time.calUrl + "',"
  }
  else {
    text += "title:'" + counter.time.title + "',";
    text += "time:" + counter.time.getTime().getTime() + ",";
    text += "repeat:" + counter.time.repeat + ",";
    if (counter.time.url) {
      text += "link:'" + counter.time.url + "',";
    }  
  }  
  text += "logo:'" + counter.logo + "',"
  text += "sound:'" + counter.alertSound + "',"
  text += "empty:null}";
  counter.cookie.store(text);
}

function update() {
  var date = new Date();
  if (lastSeconds == date.getSeconds()) {
    return;
  }
  lastSeconds = date.getSeconds();
  for (var id in counters) {  	
    counters[id].update(date);
  }
}      

function addNewCounter() {
  if ($("TimeMethod").checked) {
    var title = $("TitleInput").value;
    if (!title || title.length == 0) {
      alert("Please enter a title.");
      return;
    }
    var repeat = $("RepeatSelect").selectedIndex;
    if (repeat < 4) {
      var date = new Date($("YearSelect").value, $("MonthSelect").selectedIndex, 
                          $("DaySelect").selectedIndex + 1, $("HourSelect").selectedIndex, $("MinuteSelect").selectedIndex);
    }
    else {
      var date = new Date();
      var diff = $("WeekSelect").selectedIndex - date.getDay();
      if (diff < 0) {
        diff += 7
      }
      date.setDate(date.getDate() + diff);
      date.setHours($("HourSelect").selectedIndex);
      date.setMinutes($("MinuteSelect").selectedIndex);
    }                      
    createNewCounter(title, date, $("RepeatSelect").selectedIndex, null, $("LogoUrl").value);
  }
  else {
    var url = $("CalUrlInput").value;
    if (!url || url.length == 0) {
      alert("Please enter a public Google Calendar URL");
      return;
    }
    createNewCounter(null, null, null, url, $("LogoUrl").value);    
  }  
}

function createNewCounter(title, date, repeat, url, logo) {
  var id = nextId++;
  var counter = createCounter(id, title, date, repeat, url, logo);
  saveCounterIds();
  counter.cookie = new Cookie("Counter" + id);
  saveCounter(counter);
  return counter;
}  

function createCounter(id, title, date, repeat, url, logo) {
  var counter = document.createElement("div");
  counter.id = "Counter" + id;
  counter.className = "countdown";
  //counter.style.display = "block";
  counter.onmouseover = function() {
    counterMouseOver(this);
  }   
  counter.onmouseout = function() {
    counterMouseOut(this);
  }  
  var template = document.getElementById("CountdownTemplate").innerHTML;
  counter.innerHTML = template.replace(/\$ID\$/g, id);
  $("Countdowns").appendChild(counter);

  var counterObj = setupCounter(id, counter, title, date, repeat, url, logo);
  counter.counter = counterObj;
  counter.counter.onload = function() {
    addToCountdowns(this.element);
  }

  $("Header" + id).onclick = function() {
    var counter = this.parentNode.parentNode.counter;
    if (counter.time.url) {
      window.open(counter.time.url, "_blank");
    }
  }

  addToCountdowns(counter);
  return counterObj;
}

function addToCountdowns(countdown) {
  var container = $("Countdowns");
  container.removeChild(countdown);
  var children = container.childNodes;
  var time = countdown.object.time.getTime();
  if (time != null) {
    for (var i = 0; i < children.length; i++) {
    	var next = children[i];
    	if (next.object && countdown.object.time.getTime() < next.object.time.getTime()) {
    	  container.insertBefore(countdown, next);
    	  return;
    	}
    }
  }
  container.appendChild(countdown);
}

function setupCounter(id, element, title, date, repeat, url, logo) {
  if (!url) {
    var time = new Time(title, date, repeat);
  }
  else {
    var time = new GoogleCalendar(url, true, "CalScript" + id);
  }  
  var counter = new Countdown(time, element, id);
  if (url) {
    time.requestCalendar();
  }
  counter.setLogo(logo);
  counters["" + id] = counter;
  return counter;
}

function counterMouseOver(counterElement) {
  var closeBtn = document.getElementById("CloseButton" + counterElement.counter.id);
  closeBtn.style.display = "block";
}

function counterMouseOut(counterElement) {
  var closeBtn = document.getElementById("CloseButton" + counterElement.counter.id);
  closeBtn.style.display = "none";
}

function closeCounter(counterElement) {
  delete counters["" + counterElement.counter.id];
  var countersElement = document.getElementById("Countdowns");
  countersElement.removeChild(counterElement);
  counterElement.counter.cookie.remove();
  saveCounterIds();
}

function closeAlert(counterElement) {
  counterElement.counter.closeAlert();
}

var eventsArray = new Array();
function fillPredefinedEvents() {
  var select = document.getElementById("PredefinedList");
  select.innerHTML = "";
  if (noCombobox) { //Android
    var option = document.createElement("option");
    option.innerHTML = "Select Predefined";
    option.value = "0";
    select.appendChild(option);
  }  
  for (var i = 0; i < predefinedEvents.length; i++) {
  	var group = document.createElement("optgroup");
  	group.setAttribute("label", predefinedEvents[i].category);
  	select.appendChild(group);
  	var events = predefinedEvents[i].events;
  	for (var j = 0; j < events.length; j++) {
  		var option = document.createElement("option");
  		option.innerHTML = events[j].title;
  		option.value = eventsArray.length;
  		eventsArray.push(events[j]);
  		select.appendChild(option);
  	}
  }
}

function predefinedSelected() {
  var select = $("PredefinedList");
  if (select.value == "0") {
    return;
  }  
  var event = eventsArray[select.value];
  $("TitleInput").value = event.title;
  $("YearSelect").value = event.time.getFullYear();  
  $("MonthSelect").selectedIndex = event.time.getMonth();
  fillDaySelect();
  $("DaySelect").value = event.time.getDate();    
  $("HourSelect").value = event.time.getHours();    
  $("MinuteSelect").selectedIndex = event.time.getMinutes();
  $("RepeatSelect").selectedIndex = event.repeat; 
  $("LogoUrl").value = event.logo;
  logoSelected();
  repeatChanged();
  select.selectedIndex = 0;
}

var calsArray = new Array();
function fillPredefinedCalendars() {
  var select = document.getElementById("PredefinedCalList");
  select.innerHTML = "";
  if (noCombobox) { //Android
    var option = document.createElement("option");
    option.innerHTML = "Select Predefined";
    option.value = "0";
    select.appendChild(option);
  }  
  for (var i = 0; i < predefinedCalendars.length; i++) {
  	var group = document.createElement("optgroup");
  	group.setAttribute("label", predefinedCalendars[i].category);
  	select.appendChild(group);
  	var events = predefinedCalendars[i].events;
  	for (var j = 0; j < events.length; j++) {
  		var option = document.createElement("option");
  		option.innerHTML = events[j].title;
  		option.value = calsArray.length;
  		calsArray.push(events[j]);
  		select.appendChild(option);
  	}
  }
}

function predefinedCalSelected() {
  var select = $("PredefinedCalList");
  if (select.value == "0") {
    return;
  }  
  var event = calsArray[select.value];
  $("TitleInput").value = event.title;
  $("CalUrlInput").value = event.feed;
  $("LogoUrl").value = event.logo;
  logoSelected();
  select.selectedIndex = 0;
}

function logoSelected() {
  var logo = $("LogoUrl").value;
  if (logo != null && logo.length > 0) {
    $("LogoPreview").src = logo;
    $("LogoPreview").style.display = "block";
  }
  else {
    $("LogoPreview").style.display = "none";
  }
}

function fillYearSelect() {
  var date = new Date();
  var select = $("YearSelect");
  DWRUtil.removeAllOptions(select);
  for (var i = date.getFullYear(); i <= date.getFullYear() + 5; i++) {
  	var option = document.createElement("option");
  	option.value = i;
  	option.innerHTML = i;  	  
  	select.appendChild(option);  
  }
  select.selectedIndex = 1;
}
    
function fillDaySelect() {
  var month = $("MonthSelect").selectedIndex;
  var select = $("DaySelect");
  var day = select.selectedIndex;
  DWRUtil.removeAllOptions(select);
  var days = daysInMonth[month];
  if (month == 1 && $("YearSelect").value % 4 == 0) {
    days = 29;
  }
  for (var i = 1; i <= days; i++) {
  	var option = document.createElement("option");
  	option.value = i;
  	option.innerHTML = i;  	  
  	select.appendChild(option);  
  }
  if (day < select.length) {
    select.selectedIndex = Math.max(0, day);
  }
  else {
    select.selectedIndex = select.length - 1;
  }  
}

function fillWeekSelect() {
  var select = $("WeekSelect");
  DWRUtil.removeAllOptions(select);
  DWRUtil.addOptions(select, ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]);  
}
    
function fillHourSelect() {
  var select = $("HourSelect");
  DWRUtil.removeAllOptions(select);
  for (var i = 0; i <= 23; i++) {
  	var option = document.createElement("option");
  	option.value = i;
  	option.innerHTML = i;  	  
  	select.appendChild(option);  
  }
}
    
function fillMinuteSelect() {
  var select = $("MinuteSelect");
  DWRUtil.removeAllOptions(select);
  for (var i = 0; i <= 59; i++) {
  	var option = document.createElement("option");
  	option.value = i;
  	var text = i;
  	if (i < 10) {
  	  text = "0" + i;
  	}
  	option.innerHTML = text;  	  
  	select.appendChild(option);  
  }
}

function repeatChanged() {
  var repeat = $("RepeatSelect").selectedIndex;
  if (repeat < 4) {
    $("WeekSelector").style.display = "none";
    $("DateSelector").style.display = "inline";
    $("YearSelect").disabled = repeat > 0 && repeat < 4;
    $("MonthSelect").disabled = repeat > 1 && repeat < 4;
    $("DaySelect").disabled = repeat > 2 && repeat < 4;
  }
  else {
    $("WeekSelector").style.display = "inline";
    $("DateSelector").style.display = "none";    
  }  
}

function methodChanged() {
  if ($("TimeMethod").checked) {
    $("TimeSettings").style.display = "inline";
    $("GoogleSettings").style.display = "none";
  } 
  else {
    $("TimeSettings").style.display = "none";
    $("GoogleSettings").style.display = "inline";
  }
}

function testFeed() {
  var feed = $("CalUrlInput").value;
  $("CalTestLoading").style.visibility = "visible";
  if (!timeout) {
    timeout = setTimeout("feedTestResult()", 4000);
    GoogleCalendar.requestCalendarJson(feed, $("CalPreview"), "feedTestResult");
  }  
}

function feedTestResult(root) {
  $("CalTestLoading").style.visibility = "hidden";
  clearTimeout(timeout);
  timeout = null;
  if (!root) {
    $("CalPreview").style.display = "none";
    $("CalError").style.display = "block";
    return;
  }
  var result = GoogleCalendar.parseCalendarJson(root);
  var time = "";
  if (result.time) {
    time = result.time.toLocaleString();
  }
  $("CalError").style.display = "none";
  $("CalPreview").style.display = "block";
  $("CalPreview").innerHTML = result.title + "<br /> " + time;
}
  
