/***
 * loadScript
 * Carregar um ficheiro Javascript e definir um callback quando o ficheiro estiver totalmente carregado
 * @param {Object} source
 * @param {Object} callbackfunction
 */
function loadScript(source, callbackfunction){
  // first check is the file has allready been loaded
  if ( ! js_file_exists(source)) {
    // pegar no head do documento
    var docHead = document.getElementsByTagName('head')[0];
    if (docHead) {
      // cria uma nova tag do tipo Script
      var scriptTag = document.createElement('script');
      // adicionar os atributos à tag
      scriptTag.setAttribute('src', source);
      scriptTag.setAttribute('type', 'text/javascript');
      // chamar uma função depois de o js ser carregado (no IE)
      var loadFunction = function(){
        if (this.readyState == 'complete' || this.readyState == 'loaded') {
          callbackfunction();
        }
      };
      scriptTag.onreadystatechange = loadFunction;
      // chamar uma função depois de o js ser carregado (Firefox)
      scriptTag.onload = callbackfunction;
      // finalmente adicionar a tag ao head do documento
      docHead.appendChild(scriptTag);
    }
  } else {
    callbackfunction();
  }
}

/**
 * carregar scripts js dinamicamente
 **/
function js_file_exists(filename){
 var targetelement = "script"
 var targetattr= "src"
 var allsuspects=document.getElementsByTagName(targetelement)
 for (var i=allsuspects.length; i>=0; i--) {
  if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(filename)!=-1)
   return true;
 }
 return false;
}
function load_js_file(filename){
  var fileref = document.createElement("script")
  fileref.setAttribute("type", "text/javascript")
  fileref.setAttribute("src", filename)
  if ((typeof fileref != "undefined") && (!js_file_exists(filename)))
    document.getElementsByTagName("head")[0].appendChild(fileref)
}
function remove_js_file(filename, filetype){
 var targetelement = "script"
 var targetattr = "src"
 var allsuspects=document.getElementsByTagName(targetelement)
 for (var i=allsuspects.length; i>=0; i--) {
  if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(filename)!=-1)
   allsuspects[i].parentNode.removeChild(allsuspects[i])
 }
}

/**
 * carregar css's dinamicamente
 **/
function css_file_exists(filename){
 var targetelement = "link"
 var targetattr= "href"
 var allsuspects=document.getElementsByTagName(targetelement)
 for (var i=allsuspects.length; i>=0; i--) {
  if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(filename)!=-1)
   return true;
 }
 return false;
}

function load_css_file(filename){
  var fileref = document.createElement("link")
  fileref.setAttribute("rel", "stylesheet")
  fileref.setAttribute("type", "text/css")
  fileref.setAttribute("href", filename)
  if ((typeof fileref != "undefined") && (!css_file_exists(filename)))
    document.getElementsByTagName("head")[0].appendChild(fileref)
}

function remove_css_file(filename, filetype){
 var targetelement = "link"
 var targetattr = "href"
 var allsuspects=document.getElementsByTagName(targetelement)
 for (var i=allsuspects.length; i>=0; i--) {
  if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(filename)!=-1)
   allsuspects[i].parentNode.removeChild(allsuspects[i])
 }
}

/**
 * TV Helpers for Google Picasa API
 **/
function validPicasaUrl(url){
  var valid = true;
  if (url.length==0) return false;
  var params = url.split('/');
  if (params.length < 8) return false
  var aux = params[2].split('.');
  return (params[0]=='http:') && (aux[1]=='ggpht') && (aux[2]=='com')
}

function validPicasaSize(size){
  var valid_sizes = 's32-c s32 s48-c s48 s64-c s64 s72-c s72 s94 s104-c s104 s110 s128 s144-c s144 s150-c s150 s160-c s160 s200 s220 s288 s320 s400 s512 s576 s640 s720 s800';
  return valid_sizes.indexOf(size);
}

function getPicasaThumb(url, new_size) {
  var final_url = url;

  if (validPicasaUrl(url) && validPicasaSize(new_size)) {

      // separar o url em todos os parametros
      params = url.split('/');
      var length = params.length;
      console.log ('length:'+length);

      var url_is_full_image = (params.length == 8);
      if (url_is_full_image) {
          var image_size_index = length-1;
          console.log ('image_size_index:'+image_size_index);
          // inserir no array o tamanho pretendido para a imagem
          params.splice(image_size_index,0,new_size);
      } else {
          var image_size_index = length-2;
          console.log ('image_size_index:'+image_size_index);
          var image_size = params[image_size_index];
          console.log ('image size:'+image_size);

          // depois verificiar se o novo tamanho pretendido é válido
          var valid_size = validPicasaSize(new_size);
          console.log ('picasa valid url:'+valid_url);
          console.log ('picasa valid size:'+valid_size);

          // já podemos deitar fora a primeira parte
          url = url.substring(21);
          console.log (url);

          // alterar o tamanho da imagem
          params[image_size_index] = new_size;


          image_size = (valid_sizes.indexOf(image_size) == -1) ? 'full' : image_size;

          console.log (valid_sizes.indexOf(image_size));
          console.log ('valid image_size:'+image_size);
          // de seguida extrair a informação contida no url (que tipo é? fullwidth? thumb? size?)


      }
  }
  final_url = params.join('/');
  console.log ('final url:'+final_url);
  return final_url;
}

var TVPIC = function() {
    return {
        get: function(url_path, callbackName, params) {
            if (typeof params == 'undefined' ) params = '';
            load_js_file(url_path + "?alt=json"+params+"&callback=" + callbackName);
        },

        ImageData: function(url, width, height) {
            this.url = url;
            this.width = width;
            this.height = height;
        },

        PhotoInfo: function(image, thumbnail, position, time) {
            this.image = image;
            this.thumbnail = thumbnail;
            this.position = position;
            this.time = time;
        },

        thumbnailData: function(photoEntry) {
            var mediaGroup = photoEntry.media$group;
            if (mediaGroup) {
                var ts = mediaGroup.media$thumbnail;
                if (ts) {
                    if (! (ts instanceof Array))
                        ts = [ts];
                    return new TVPIC.ImageData(ts[0].url, ts[0].width, ts[0].height);
                }
            }
            return false;
        },

        imageData: function(photoEntry) {
            var mediaGroup = photoEntry.media$group;
            if (mediaGroup) {
                var cs = mediaGroup.media$content;
                if (cs) {
                    return new TVPIC.ImageData(cs[0].url, cs[0].width, cs[0].height);
                }
            }
            return false;
        }
    };
}();

/**
 * clearElements
 * limpa todos os inputs que estiverem dentro de um determinado elemento html,
 * normalmente um form, mas pode ser um div por exemplo.
 **/
function clearFormElements(el){
  var object = new Array();
  object[0] = document.getElementById(el).getElementsByTagName('input');
  object[1] = document.getElementById(el).getElementsByTagName('textarea');
  object[2] = document.getElementById(el).getElementsByTagName('select');
  var type = null;
  for (var x=0; x<object.length; x++){
    for (var y=0; y<object[x].length; y++){
      type = object[x][y].type
      switch(type){
        case "text":
        case "textarea":
        case "password":
          object[x][y].value = "";
          break;
        case "radio":
        case "checkbox":
          object[x][y].checked = "";
          break;
        case "select-one":
          object[x][y].options[0].selected = true;
          break;
        case "select-multiple":
          for (z=0; z<object[x][y].options.length; z++){
            object[x][y].options[z].selected = false;
          }
        break;
      }
    }
  }
}

/**
 * outros
 */
function spin_div(div_id) {
  container = $(div_id);
  positioning = 'top: '+container.offsetTop+'px; width: '+container.offsetWidth+'px; height: '+container.offsetHeight+'px; ';
  container.innerHTML += '<div id="'+div_id+'_spin" class="spin_div" style="position: absolute; ' + positioning + '"></div>';
}

function remove_spin_div(div_id) {
  container = $(div_id);
  container.removeChild( $(div_id+'_spin'));
}
