var
  vk_members_data = {},
  lastCommentsResponse,
  lastCommentsPage = null,
  baseURL = window.location.protocol + '//' + window.location.hostname + '/';

function array_unique(ar){
  if (ar.length && typeof ar !== 'string') {
    var sorter = {};
    var out = [];
    for (var i=0, j=ar.length; i<j; i++) {
      if(!sorter[ar[i]+typeof ar[i]]){
        out.push(ar[i]);
        sorter[ar[i]+typeof ar[i]]=true;
      }
    }
  }
  return out || ar;
}

function doLogin() {
  VK.Auth.login(
    null,
    VK.access.FRIENDS | VK.access.WIKI | VK.access.PHOTOS | VK.access.VIDEO
  );
}
function doLogout() {
  VK.Auth.logout(logoutOpenAPI);
}
function loginOpenAPI() {
  getInitData();
}
function logoutOpenAPI() {
  /*window.location.reload();*/
  //window.location = baseURL;  
  window.location = window.location;
}

function getInitData() {
  var code;
  code = 'return {';
  code += 'me: API.getProfiles({uids: API.getVariable({key: 1280}), fields: "photo"})[0]';
  code += ',info: API.getGroupsFull({gids:1})[0]';
  //code += ',news: API.pages.get({gid: 520430, pid: 2173225, need_html: 1})';
  code += ',friends: API.getProfiles({uids: API.getAppFriends(), fields: "photo"})';
  code += '};';
  VK.Api.call('execute', {'code': code}, onGetInitData);
  
  code = 'return {photos: API.photos.get({uid: 2535450, aid: 105929214})};';
  VK.Api.call('execute', {'code': code}, getPhotos);
  
  code = 'return {videos: API.video.get({uid: 2535450, width: 130})};';
  //code = 'return {videos: API.video.search({q: "Gerz Clock"})};';
  VK.Api.call('execute', {'code': code}, getVideos);
}

function onGetInitData(data) {
  var r, i, j, html;
  if (data.response) {
    hide('gerzapi_vk_login');
	show('gerzapi_vk_userinfo');	
	
	r = data.response;
    /* Insert user info */
    if (r.me) {
      ge('gerzapi_vk_username').innerHTML = r.me.first_name + ' ' + r.me.last_name;
	  ge('gerzapi_vk_userlink').href = 'http://vkontakte.ru/id' + r.me.uid;      
      ge('gerzapi_vk_userphoto').src = r.me.photo;
	  ge('gerzapi_vk_userphotolink').href = 'http://vkontakte.ru/id' + r.me.uid;
    }
    /* Insert Group info */
    //if (r.info) {
      //ge('group_link').href = '/club' + r.info.gid;
      //ge('logo_img').src = r.info.photo;
    //}
	
    /* Insert news */
    //if (r.news) {
      //ge('news_title').innerHTML = r.news.title;
      //ge('news').innerHTML = r.news.html;
    //}
    
	/* Insert friends */	
    if (r.friends.length>0) {
		show('gerzapi_vk_friends');
		html = '<table width=140 border=0 cellpadding=2 cellspacing=0 class="center-text"><tr><td colspan="2" height="30" valign="middle">Ваши друзья на сайте</td></tr>';	
    	for (i = 0, j = r.friends.length; i < j; i++) {
      		if (i >= 11) {
				html += '<tr> <td></td> <td align="right"><a href="http://gerz-inc.com">Все ('+r.friends.length+')</a></td> </tr>';
				break;
			}
      		html += '<tr> <td width="50"><div class="gerzapi_vk_imagediv"><a href="http://vkontakte.ru/id'+r.friends[i]['uid']+'"><div class="gerzapi_vk_userimage"><img width="50" src="'+r.friends[i]['photo']+'"></div></a></div></td> <td width="80" valign="top"><a href="http://vkontakte.ru/id'+r.friends[i]['uid']+'">'+(r.friends[i]['first_name']+' '+r.friends[i]['last_name'])+'</a></td> </tr>';
    	}
		html += '</table>';
    	ge('gerzapi_vk_friends').innerHTML = html;
	}
	
	/* Insert users */
	//show('gerzapi_vk_users');    
    //getComments();
	
	/* Insert photos */	
	/*html = '';
	for (i = 0, j = r.photos.length; i < j; i++) {
      	//if (i >= 5) break;
      	html += '<table border="0" cellspacing="0" cellpadding="0" onmouseout="this.className=\'gerzapi_vk_photodiv\';" onmouseover="this.className=\'gerzapi_vk_photodiv_over\'" class="gerzapi_vk_photodiv"><tr><td width="50" height="119" align="center" valign="middle"><a href="http://vkontakte.ru/photo'+r.photos[i]['owner_id']+'_'+r.photos[i]['pid']+'"><div class="gerzapi_vk_photoimage"><img src="'+r.photos[i]['src']+'"></div></a></td></tr></table>';		 
    }
	ge('gerzapi_vk_photos').innerHTML = html;*/
	
	/* Insert videos */	
	/*html = '';
	for (i = 0, j = r.videos.length; i < j; i++) {
      	//if (i >= 5) break;
      	//html += '<table border="0" cellspacing="0" cellpadding="0" onmouseout="this.className=\'gerzapi_vk_photodiv\';" onmouseover="this.className=\'gerzapi_vk_photodiv_over\'" class="gerzapi_vk_photodiv"><tr><td width="50" height="119" align="center" valign="middle"><a href="http://vkontakte.ru/video'+r.videos[i]['owner_id']+'_'+r.videos[i]['id']+'"><div class="gerzapi_vk_photoimage"><img src="'+r.videos[i]['thumb']+'"></div></a></td></tr></table>';
		html += '<table border="0" cellspacing="0" cellpadding="0" onmouseout="this.className=\'gerzapi_vk_photodiv\';" onmouseover="this.className=\'gerzapi_vk_photodiv_over\'" class="gerzapi_vk_photodiv"><tr><td width="50" height="119" align="center" valign="middle"><a href="http://vkontakte.ru/video'+r.videos[i]['owner_id']+'_'+r.videos[i]['vid']+'"><div class="gerzapi_vk_photoimage"><img src="'+r.videos[i]['image']+'"></div></a></td></tr></table>';		 
    }
	ge('gerzapi_vk_videos').innerHTML = html;*/
  } else {
  
  }
}

function getPhotos(data) {
  var r, i, html, title;
  if (data.response) {
    hide('gerzapi_vk_loginpage');	
	r = data.response;
	
	html = '';
	for (i = r.photos.length-1; i >= 0; i--) {
      	//if (i >= 5) break;
		html += '<table border="0" cellspacing="0" cellpadding="0" onmouseout="this.className=\'gerzapi_vk_photodiv\';" onmouseover="this.className=\'gerzapi_vk_photodiv_over\'" class="gerzapi_vk_photodiv"><tr><td width="50" height="119" align="center" valign="middle"><a href="http://vkontakte.ru/photo'+r.photos[i]['owner_id']+'_'+r.photos[i]['pid']+'"><div class="gerzapi_vk_photoimage"><img src="'+r.photos[i]['src']+'"></div></a></td></tr></table>';		 
    }
	var elem = ge('gerzapi_vk_photos');
	if (!elem) return;
	ge('gerzapi_vk_photos').innerHTML = html;
  }
}

function getVideos(data) {
  var r, i, html, title;
  if (data.response) {
    hide('gerzapi_vk_loginpage');	
	r = data.response;
	
	html = '';
	for (i = r.videos.length-1; i > 0; i--) {
      	//if (i >= 5) break;
      	if (r.videos[i]['title']) {title = '<div class="gerzapi_vk_phototext">'+r.videos[i]['title']+'</div>'} else {title = ''};
		//html += '<table border="0" cellspacing="0" cellpadding="0" onmouseout="this.className=\'gerzapi_vk_photodiv\';" onmouseover="this.className=\'gerzapi_vk_photodiv_over\'" class="gerzapi_vk_photodiv"><tr><td width="50" height="119" align="center" valign="middle"><a href="http://vkontakte.ru/video'+r.videos[i]['owner_id']+'_'+r.videos[i]['id']+'"><div class="gerzapi_vk_photoimage"><img src="'+r.videos[i]['thumb']+'"></div></a></td></tr></table>';
		html += '<table border="0" cellspacing="0" cellpadding="0" onmouseout="this.className=\'gerzapi_vk_photodiv\';" onmouseover="this.className=\'gerzapi_vk_photodiv_over\'" class="gerzapi_vk_photodiv"><tr><td width="50" height="119" align="center" valign="middle"><a href="http://vkontakte.ru/video'+r.videos[i]['owner_id']+'_'+r.videos[i]['vid']+'"><div class="gerzapi_vk_photoimage"><img src="'+r.videos[i]['image']+'"></div>'+title+'</a></td></tr></table>';		 
    }
	var elem = ge('gerzapi_vk_videos');
	if (!elem) return;
	ge('gerzapi_vk_videos').innerHTML = html;
  }
}

function printCommentRow(id, uid, name, sex, photo, date, date_ts, comment) {
  return (
    '<div class="separator"></div>' +
    '<div id="comm'+id+'" class="comment">' +
    '<div class="notebody">' +
    '<a href="/id'+uid+'" class="userpic"><img src="'+photo+'"></a>' +
    '<div class="justComment">' +
    '<div class="header"><a class="memLink" href="/id'+uid+'">'+name+'</a> написал'+(sex == 1 ? 'a' : '')+'<br />'+date+'</div>' +
    '<div class="text">'+comment+'</div>' +
    '<div class="actions"><img id="action_progress'+id+'" src="images/upload.gif"/>'+
    ((VK._session.mid == uid && date_ts > (((new Date()).getTime() / 1000) - 15 * 60))
      ? '<a href="'+document.URL+'#" onclick="return deleteComment('+id+'); "><small>Удалить</small></a></div>'
      : ''
    )+
    '</div></div></div>'
  );
}

function renderPagination(current, total, progress) {
  var
    start,
    end,
    html = '';
  
  start = current - 4;
  if(start < 1) {
    start = 1;
  }
  end = current + 4;
  if (end > total) { 
    end = total;
  }
  //alert(start+','+end+','+total);
  
  html += '<div class="commentsPagesWrap standard"><ul class="commentsPages">';
  for (i = start; i <= end; i++) {
    if (i != current) {
      html += '<li onclick="getComments(' + i + ');" onmouseover="setStyle(this, \'textDecoration\', \'underline\')" onmouseout="setStyle(this, \'textDecoration\', \'none\')"><span>' + i + '</span></li>';
    } else {
      html += '<li class="current"><span>' + i + '</span></li>';
    }
  }
  html += '</ul><div class="progrWrap" style="height: 20px;"><img id="' + progress + '" src="images/upload.gif" style="vertical-align: -4px;"></div></div>';
  
  return html;
}

function renderCommentsPage(data) {
  var 
    cmm,
    count,
    pages,
    member,
    name,
    html,
    i, j;
  
  count = data.shift();
  pages = Math.ceil(count / 10);
  if (lastCommentsPage === null) {
    lastCommentsPage = pages;
  }
  html = renderPagination(lastCommentsPage, pages, 'progressTop');
  for (i = 0, j = data.length; i < j; i++) {
    cmm = data[i];
    member = vk_members_data[cmm.uid];
    name = member.first_name + ' ' + member.last_name;
    html += printCommentRow(cmm.id, cmm.uid, name, member.sex, member.photo, cmm.date, cmm.date_ts, cmm.comment);
  }
  html += renderPagination(lastCommentsPage, pages, 'progressBottom');
  
  return html;
}

function onCommentsResponse(response) {
  var
    uids  = [],
    i, j;
    
  //alert(responseText);
  lastCommentsResponse = response;
  for (i = 0, j = response.length; i < j; i++) {
    if(response[i]['uid']) {
      uids.push(response[i]['uid']);
    }
  }
  uids = array_unique(uids);
  VK.Api.call('getProfiles', {'uids': uids.join(','), 'fields': 'photo,sex'}, onGetProfilesData);
}

function getComments(s) {
  var
    onSuccess,
    onFail;
  
  onSuccess = function(ajaxObj, responseText) {
    var
      response = eval('(' + responseText + ')');
      
    onCommentsResponse(response);
  };
  onFail = function(ajaxObj, responseText) {
    responseText = responseText || 'Request error.';
    alert(responseText);
  }
  Ajax.Send(baseURL, {
    'op': 'a_get_comments', 
    's': s || 0
  }, {
    'onSuccess': onSuccess,
    'onFail': onFail    
  });
  lastCommentsPage = s || null;
  show('progressTop', 'progressBottom');
  return false;
}

function onGetProfilesData(r) {
  var 
    data,
    html,
    i, j;
  
  if (r.response) {
    data = r.response;
    for (i =0, j = data.length; i < j; i++) {
      if (!vk_members_data[data[i]['uid']]) {
        vk_members_data[data[i]['uid']] = data[i];
      }
    }
  }
  
  html = renderCommentsPage(lastCommentsResponse);
  ge('comments_list').innerHTML = html;
  hide('progressTop', 'progressBottom');
}

function postComment() {
  var
    comment = ge('comment').value,
    onSuccess,
    onFail;
    
  if(comment) {
    onSuccess = function(ajaxObj, responseText) {
    var
      response = eval('(' + responseText + ')');
    
    lastCommentsPage = null;
    ge('comment').value = '';
    onCommentsResponse(response);
    };
    onFail = function(ajaxObj, responseText) {
      responseText = responseText || 'Request error.';
      alert(responseText);
    }
    Ajax.Send(baseURL, {
      'op': 'a_add_comment', 
      'comment': comment
    }, {
      'onSuccess': onSuccess,
      'onFail': onFail    
    });
  } else {
    ge('comment').focus();
  }
  return false;
}

function deleteComment(cid) {
  var
    onSuccess,
    onFail;
  
  onSuccess = function(ajaxObj, responseText) {
    var
      response = eval('(' + responseText + ')');
    if(response.ok == 1) {
      commentBox = ge('comm' + response.cid);
      commentBox.innerHTML = '<div class="dld" style="font-weight:normal;">Комментарий удален.</div>';
    }
  };
  onFail = function(ajaxObj, responseText) {
    responseText = responseText || 'Request error.';
    alert(responseText);
  }
  Ajax.Send(baseURL, {
    'op': 'a_del_comment', 
    'cid': cid
  }, {
    'onSuccess': onSuccess,
    'onFail': onFail    
  });
  return false;
}