var avp = {

      browser: navigator.userAgent.toLowerCase(),

};

avp.tag = {

      elements: [],

      register: function(input, container, hidden, form)
      {
            var self = this;

            var id = this.elements.length;

            this.elements[id] = [input, container, []];

            //input.innerHTML = '&nbsp;';

            input.onkeydown = function(e)
            {
                  var char;
                  var evt = (e) ? e : window.event;       //IE reports window.event not arg
                  
                  if (evt.type == "keydown")
                  {
                        char = evt.keycode;
                  }
                  else
                  {
                        char = (evt.charCode) ? evt.charCode : evt.keyCode;
                  }
                  
                  if (char == 13 && this.value.length > 0)
                  {
                        self.addTag(id);

                        return false;
                  }
            };
            
            input.onkeypress = function(e)
            { 
                  var char;
                  var evt = (e) ? e : window.event;       //IE reports window.event not arg
                  
                  if (evt.type == "keydown")
                  {
                        char = evt.keycode;
                  }
                  else
                  {
                        char = (evt.charCode) ? evt.charCode : evt.keyCode;
                  }
                  
                  if (char == 13 && this.value.length > 0)
                  {
                        self.addTag(id);

                        return false;
                  }
            };

            if (typeof(form) != "undefined")
            {
                  form.onsubmit = function()
                  {
                        if (self.elements[id][2].length > 0) hidden.value = JSON.encode(self.elements[id][2]);
                  };
            }

            return id;
      },

      addTag: function(id, value)
      {
            var value = ((!this.elements[id][0].value && value) ? value : this.elements[id][0].value);

            if (!this.tagExists(id, value))
            {
                  var tag_element = document.createElement('span');
                  tag_element.setAttribute('class', 'tag');
                  tag_element.setAttribute('className', 'tag'); //IE
                  avpSetStyle(tag_element, 'margin-bottom: 15px;');
                  tag_element.innerHTML = value+"<a onclick='avp.tag.removeTag("+id+", \""+value+"\", this);' href='javascript:void(0);'>x</a>";

                  this.elements[id][2].push(value);
                  this.elements[id][1].appendChild(tag_element);
                  this.elements[id][0].value = "";
            }
      },

      removeTag: function(id, value, tag)
      {
            for (var i in this.elements[id][2])
            {
                  if (this.elements[id][2][i] == value)
                  {
                        this.elements[id][2].splice(i, 1);
                        tag.parentNode.destroy();

                        break;
                  }
            }
      },
      
      removeTags: function(id)
      {
            for (var i in this.elements[id][2]) this.elements[id][2].splice(i, 1);

            this.elements[id][1].empty();
      },

      tagExists: function(id, value)
      {
            for (var i in this.elements[id][2])
            {
                  if (this.elements[id][2][i] == value)
                  {
                        return true;

                        break;
                  }
            }

            return false;
      }

};

avp.data = {

      timeout: null,

      loading: false,

      init: function(input, title, description, tags)
      {
            var self = this;

            this.input = input;
            this.title = title;
            this.description = description;
            this.tags = tags;

            var button = document.createElement('button');
            button.innerHTML = 'Import Data';
            button.setAttribute('class', 'avp-import-data-button avp-hidden');
            button.setAttribute('className', 'avp-import-data-button avp-hidden'); //IE

            button.onclick = function(evt)
            {
                  self.get(input.value);
                  return false;
            };

            this.button = button;

            this.input.parentNode.insertBefore(button, this.input.nextSibling);

            input.oninput = function()
            {
                  self.buttonClass(this.value);
            };

            input.onkeyup = function()
            {
                  self.buttonClass(this.value);
            };

            input.onchange = function()
            {
                  self.buttonClass(this.value);
            };

            input.onmouseout = function()
            {
                  self.buttonClass(this.value);
            };

            document.body.onmousemove = function()
            {
                  self.buttonClass(input.value);
            };
      },

      buttonClass: function(value)
      {
            if (value && value != '' && !this.loading)
            {
                  this.button.setAttribute('class', 'avp-import-data-button');
                  this.button.setAttribute('className', 'avp-import-data-button'); //IE
            }
            else
            {
                  this.button.setAttribute('class', 'avp-import-data-button avp-hidden');
                  this.button.setAttribute('className', 'avp-import-data-button avp-hidden'); //IE
            }
      },

      get: function(url)
      {
            var self = this;

            if (url && url != '')
            {
                  var jsonReq = new Request.JSON(
                  {
                        url: en4.core.baseUrl+"avp/index/data/format/json",
                        method: 'post',
                        data: {'url': url},
                        onRequest: function()
                        {
                              self.makeLoading();
                        },
                        onSuccess: function(jsonObj)
                        {
                              if (jsonObj && jsonObj.status)
                              {
                                    self.title.value = jsonObj.data.title;
                                    self.description.value = jsonObj.data.description;
                                    
                                    avp.tag.removeTags(self.tags);
                                    
                                    if (jsonObj.data.tags !== null)
                                    {
                                          jsonObj.data.tags.each(function(tag)
                                          {
                                                avp.tag.addTag(self.tags, tag);
                                          });
                                    }
                                    
                                    self.destroyLoading();
                              }
                              else
                              {
                                    //alert(jsonObj.message);
                                    self.destroyLoading();
                              }
                        },
                        onFailure: function()
                        {
                              self.destroyLoading();
                        }
                  }).send();
            }
      },

      makeLoading: function()
      {
            this.loading = true;

            this.button.setAttribute('class', 'avp-import-data-button avp-hidden');
            this.button.setAttribute('className', 'avp-import-data-button avp-hidden'); //IE

            var loading_img = document.createElement('img');
            loading_img.setAttribute('src', 'application/modules/Core/externals/images/loading.gif');
            avpSetStyle(loading_img, 'margin-left: 10px;');

            this.loading_img = loading_img;

            this.input.parentNode.insertBefore(loading_img, this.input.nextSibling);
      },

      destroyLoading: function()
      {
            this.loading = false;

            this.button.setAttribute('class', 'avp-import-data-button');
            this.button.setAttribute('className', 'avp-import-data-button'); //IE

            this.loading_img.parentNode.removeChild(this.loading_img);
      }
}

avp.rate = {

      updateButton: function(html)
      {
            getById('avp_rate_btn').innerHTML = html;
      }

}

avpGetByClassName = function(element, classname)
{
      var a = [];
      var re = new RegExp('\\b' + classname + '\\b');
      var els = element.getElementsByTagName("*");

      for(var i=0,j=els.length; i<j; i++)
            if(re.test(els[i].className))a.push(els[i]);

      return a;
};

avpSetStyle = function(element, css)
{
      if (window.attachEvent && navigator.userAgent.toLowerCase().indexOf("opera") == -1)
      {
            var cssText = element.style.getAttribute('cssText');

            if (cssText == "" || cssText == null || cssText == "undefined")
            {
                  element.style.setAttribute('cssText', css);
            }
            else
            {
                  var semicolon = "";

                  if (cssText.substr(cssText.length-1, 1) != ';') semicolon = ";";

                  element.style.setAttribute('cssText', cssText+semicolon+css);
            }
      }
      else
      {
            if (element.getAttribute('style') == "" || element.getAttribute('style') == null || element.getAttribute('style') == "undefined")
            {
                  element.setAttribute('style', css);
            }
            else
            {
                  element.setAttribute('style', element.getAttribute('style')+css);
            }
      }
};

avpGetByAttribute = function(element, strTagName, strAttributeName, strAttributeValue)
{
      var arrElements = (strTagName == "*" && element.all)? element.all : element.getElementsByTagName(strTagName);
      var arrReturnElements = new Array();
      var oAttributeValue = (typeof strAttributeValue != "undefined")? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)") : null;
      var oCurrent;
      var oAttribute;

      for(var i=0; i<arrElements.length; i++)
      {
            oCurrent = arrElements[i];
            oAttribute = oCurrent.getAttribute && oCurrent.getAttribute(strAttributeName);

            if(typeof oAttribute == "string" && oAttribute.length > 0)
            {
                  if(typeof strAttributeValue == "undefined" || (oAttributeValue && oAttribute.match(strAttributeValue)))
                  {
                        arrReturnElements.push(oCurrent);
                  }
            }
      }

      return arrReturnElements;
};

avpGetCssRule = function(element, strCssRule)
{
      var strValue = "";

      if (document.defaultView && document.defaultView.getComputedStyle)
      {
            strValue = document.defaultView.getComputedStyle(element, "").getPropertyValue(strCssRule);
      }
      else if(element.currentStyle)
      {
            strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1)
            {
                  return p1.toUpperCase();
            });

            strValue = element.currentStyle[strCssRule];
      }

      return strValue;
};

avpGetById = function(id)
{
      return document.getElementById(id);
};
